Die Produkteigenschaft an der Angebotsposition

Allgemein

Die Verfügbarkeitsprüfung und Reservierung von Platzierungen im Angebotsprozess erfolgt über eine Produkteigenschaft ohne Berechnung vom Typ Tabelle. Obwohl die Produkteigenschaft ein Objekt aus appero quote ist, findet genau hier die Verbindung der beiden Produkte - appero quote und MediaVelox - statt. Daher ist der Aufbau der Produkteigenschaft auch so genau vorgegeben.

Auf der Angebotsposition selbst wird die Eigenschaft wie jede andere behandelt: Der Inhalt und Wert der Produkteigenschaft wird in Form eines JSON-Strings in das Feld “Spezifikation” sf42_quotefx__SF42_QuoLI_Specification__c geschrieben.

Bei der Synchronisation des Angebots mit der Opportunity wird dieser String 1:1 in das Feld “Spezifikation JSON” sf42_quotefx__SF42_QuoLI_Specification_Export__c auf dem OpportunityLineItem übertragen.

Damit OpportunityLineItem.trigger und Opportunity.trigger greifen können, und die zugehörigen Dispobücher erzeugt werden, ist der korrekte Aufbau des JSON-Strings wichtig.

Normalerweise wird der JSON-String natürlich automatisch durch appero quote geschrieben. Die folgende Darstellung dient zum einen dem besseren Verständnis und zum anderen als Anleitung, wenn die Opportunity-Produkte außerhalb von appero quote erzeugt werden und daraus Buchungen abgeleitet werden sollen.

Aufbau des JSON-Strings

Buchungen zu einem bestimmten Zeitpunkt

Bei zeitpunktbasierten Buchungen enthält der String neben den reinen Buchungsinformationen auch Angaben zur Darstellung der Tabelle im Angebotseditor. Hier ein Beispiel:

[ { "type": "Table", "propertyId": "a080E000006tLrXQAU", "name": "Print AdSales Table Developer Magazine", "value": "a0M0E000008imhsUAA", "dispoValue": [ { "adPosCatalogId": "a0M0E000008imhsUAA", "reserved": "1", "rotation": "1", "blockValues": [ { "adPosCatalogId": "a0M0E000008imhtUAA", "blocked": "2" }, ] } ], "dataToDisplay": { "columnLabels": [ "Ausgabe", "Thema", "Datum", "Anzeigenschluss", "Annahmeschluss", "Platzierung" ], "displayedRowList": [ { "Ausgabe": { "columnValue": "Developer Magazine.01.", "columnType": "String", "fieldName": "f42_dispo__IssueName__c" }, "Thema": { "columnValue": null, "columnType": "String", "fieldName": "f42_dispo__TeaserText__c" }, "Datum": { "columnValue": "2023-01-03", "columnType": "Date", "fieldName": "f42_dispo__PublicationDate__c" }, "Anzeigenschluss": { "columnValue": "2023-12-30", "columnType": "Date", "fieldName": "f42_dispo__ClosingDate__c" }, "Annahmeschluss": { "columnValue": "2023-12-28", "columnType": "Date", "fieldName": "f42_dispo__SubmissionDeadline__c" }, "Platzierung": { "columnValue": "1/1 page", "columnType": "String", "fieldName": "Name" } } ] }, "fieldNames": [ "f42_dispo__Issue__r.f42_dispo__IssueName__c", "f42_dispo__Issue__r.f42_dispo__TeaserText__c", "f42_dispo__Issue__r.f42_dispo__PublicationDate__c", "f42_dispo__Issue__r.f42_dispo__ClosingDate__c", "f42_dispo__Issue__r.f42_dispo__SubmissionDeadline__c", "f42_dispo__AdPosition__r.Name" ] } ]

 

Abschnitt für Abschnitt setzt sich der String aus folgenden Informationen zusammen:

JSON

Bedeutung

Anmerkung

JSON

Bedeutung

Anmerkung

[

jede Produkteigenschaft wird als Ganzes mit einer eckigen Klammer umschlossen

 

{ "type": "Table",

Eigenschaftstyp: Tabelle

Bezieht sich auf das Feld sf42_quotefx__SF42_PropertyType__c an der Produkteigenschaft

"propertyId": "a080E000006tLrXQAU",

ID der jeweiligen Produkteigenschaft

 

"name": "Print AdSales Table Developer Magazine",

Name der Produkteigenschaft, wie er auch im Angebot angezeigt wird

Bezieht sich auf das Feld Name an der Produkteigenschaft

"value": "a0M0E000008imhsUAA",

Die ID der Verfügbarkeit, die in der Eigenschaft ausgewählt wurde und auf die die Reservierung angerechnet wird.

Bezieht sich auf das Objekt f42_dispo__AdPosCatalog__c, das auch in der Object Query der Produkteigenschaft abgefragt wird.

Werden mehrere Ausgaben reserviert, so werden die weiteren IDs Komma-getrennt aufgeführt.

"dispoValue": [

Im folgenden Abschnitt sind die genauen Buchungsinformationen enthalten.

 

{
"adPosCatalogId": "a0M0E000008imhsUAA",

Die ID der Verfügbarkeit, die in der Eigenschaft ausgewählt wurde und auf die die Reservierung angerechnet wird.
Identisch zum Eintrag unter “value”

Bezieht sich auf das Objekt f42_dispo__AdPosCatalog__c

Sofern in der Eigenschaft mehrere Ausgaben ausgewählt werden wird dieser folgende Abschnitt je Ausgabe/Verfügbarkeit wiederholt.

"reserved": "1"

Mengenangabe, wie viel reserviert wurde - je Ausgabe

Zeitpunktbasierte Dispobücher haben nur die Menge 1, d.h. die Anzahl zu erstellender Dispobücher entspricht der unter “reserved” eingetragenen Menge.

"rotation": "1",

standardmäßig ist hier “1” eingetragen; falls Rotation verwendet wird, wäre dieser Wert bereits am Produkt vorbelegt und hier übertragen

s. Buchungen nach dem Rotationsprinzip

"blockValues": [
{
"adPosCatalogId": "a0M0E000008imhtUAA",

Sofern mit der reservierten Platzierung Sperr-Regeln verknüpft sind, wird die zu sperrende Verfügbarkeit in diesem Abschnitt angezeigt

Bezieht sich auf das Objekt f42_dispo__BlockPositions__c

"blocked": "2"}

]

Eine Reservierung kann mehr als einen Sperreintrag auslösen. Die Anzahl wird in diesem Abschnitt hinterlegt.

Eintrag richtet sich nach dem Feld f42_dispo__LimitMultiplier__c in der Sperr-Regel.

}
],

Mit diesen Informationen sind die relevanten Buchungsinformationen zum Erstellen der Dispobücher abgeschlossen

 

"dataToDisplay": {

Der folgende Abschnitt behandelt die Darstellung der Tabelle im Produkt-Detail-Dialog

 

columnLabels": [
"Ausgabe",
"Thema",
"Datum",
"Anzeigenschluss",
"Annahmeschluss",
"Platzierung"
],

Darstellung der Spaltenüberschriften

Die Labels können Sie in der Produkteigenschaft selbst definieren

"displayedRowList": [
{
"Ausgabe": {
"columnValue": "Developer Magazine.01.",
"columnType": "String",
"fieldName": "f42_dispo__IssueName__c"
},
"Thema": {
"columnValue": null,
"columnType": "String",
"fieldName": "f42_dispo__TeaserText__c"
},
"Datum": {
"columnValue": "2023-01-03",
"columnType": "Date",
"fieldName": "f42_dispo__PublicationDate__c"
},
"Anzeigenschluss": {
"columnValue": "2023-12-30",
"columnType": "Date",
"fieldName": "f42_dispo__ClosingDate__c"
},
"Annahmeschluss": {
"columnValue": "2023-12-28",
"columnType": "Date",
"fieldName": "f42_dispo__SubmissionDeadline__c"
},
"Platzierung": {
"columnValue": "1/1 page",
"columnType": "String",
"fieldName": "Name"
}
}
]
},

Darstellung der Ausgabe, auf die die Reservierung erfolgt, Spalte für Spalte, nach dem Schema:
- Spaltenlabel
- Spaltenwert
- Feldtyp
- API-Name des referierten Feldes

Welche Spalten in der Tabelle angezeigt werden, legen Sie in der Produkteigenschaft fest.
Wir empfehlen bei MediaVelox jedoch, sich an die vorgegebene Muster-Query zu halten.

Werden mehr als eine Ausgabe reserviert, so ist der Eintrag an dieser Stelle natürlich länger.

"fieldNames": [
"f42_dispo__Issue__r.f42_dispo__IssueName__c",
"f42_dispo__Issue__r.f42_dispo__TeaserText__c",
"f42_dispo__Issue__r.f42_dispo__PublicationDate__c",
"f42_dispo__Issue__r.f42_dispo__ClosingDate__c",
"f42_dispo__Issue__r.f42_dispo__SubmissionDeadline__c",
"f42_dispo__AdPosition__r.Name"
]
}

Im letzten Abschnitt werden nochmal alle API-Namen der in der Object Query verwendeten Felder aufgelistet.

 

]

Die letzte eckige Klammer schließt das JSON

 

Zeitraumbasierte Buchungen

Zeitraumbasierte Buchungen unterscheiden sich von zeitpunktbasierten insofern, als sie die weitere Dimension “Volumen” je Ausgabe enthalten. Außerdem deckt sich das Buchungsdatum nicht mit dem Erscheinungsdatum der Ausgabe, sondern es kann ein freier Zeitraum definiert werden.

Da die Darstellung der Eigenschaft - der Zeitstrahl - nicht vom User konfiguriert werden kann, sondern aus dem MediaVelox-Paket stammt, fällt das JSON dementsprechend kürzer aus:

[ { "type": "Table", "propertyId": "a080E000006tLrWQAU", "name": "Digital AdSales Developer Community", "value": "a0M0E000008imigUAA,100,2023-04-02,2023-04-12", "dispoValue": [ { "adPosCatalogId": "a0M0E000008imigUAA", "startDate": "2023-04-02", "endDate": "2023-04-12", "volume": "100", "reserved": "1", "rotation": "0", "VolumeType": "", "blockValues": [ { "adPosCatalogId": "a0M0E000008imieUAA", "blocked": "100" } ] } ] } ]

Abschnitt für Abschnitt setzt sich das Beispiel aus folgenden Informationen zusammen:

JSON

Bedeutung

Anmerkung

JSON

Bedeutung

Anmerkung

[

jede Produkteigenschaft wird als Ganzes mit einer eckigen Klammer umschlossen

 

{
"type": "Table",

Eigenschaftstyp: Tabelle

Bezieht sich auf das Feld sf42_quotefx__SF42_PropertyType__c an der Produkteigenschaft

"propertyId": "a080E000006tLrWQAU",

ID der jeweiligen Produkteigenschaft

 

"name": "Digital AdSales Developer Community",

Name der Produkteigenschaft, wie er auch im Angebot angezeigt wird

Bezieht sich auf das Feld Name an der Produkteigenschaft

"value": "a0M0E000008imigUAA,100,2023-04-02,2023-04-12",

Neben der ID der Verfügbarkeit, auf die sich die Reservierung bezieht, werden unter “Value” kommagetrennt auch das reservierte Volumen (100) sowie der im Angebot eingetragene Buchungszeitraum (02.04.23-12.04.23) angegeben.

Bezieht sich auf das Objekt f42_dispo__AdPosCatalog__c, das auch in der Object Query der Produkteigenschaft abgefragt wird.

Werden mehrere Ausgaben reserviert, so werden die einzelnen Abschnitte mit Pipe getrennt aufgeführt.

"dispoValue": [

Im folgenden Abschnitt sind die genauen Buchungsinformationen einzeln enthalten.

 

{
"adPosCatalogId": "a0M0E000008imigUAA",

Die ID der Verfügbarkeit, die in der Eigenschaft ausgewählt wurde und auf die die Reservierung angerechnet wird.
Identisch zum Eintrag unter “value”

Bezieht sich auf das Objekt f42_dispo__AdPosCatalog__c,

Wenn sich die Buchung über mehrere Ausgaben erstreckt, wird dieser folgende Teil des JSON je zugehörigem AdPosCatalog wiederholt.

startDate": "2023-04-02",
"endDate": "2023-04-12",

Das Start- und Enddatum wie der User es in der Produkteigenschaft festlegt.

Wenn sich die Buchung über mehrere Ausgaben erstreckt, wird hier nur der zur jeweiligen Verfügbarkeit passende Zeitraum eingetragen.

"volume": "100",

Das im Angebot eingetragene Volumen

Wenn sich die Buchung über mehrere Ausgaben erstreckt, wird hier das anteilige Volumen je Verfügbarkeit eingetragen.

"reserved": "1",

Der Eintrag unter “reserved” ist bei zeitraumbasierten Platzierungen immer 1.

 

"rotation": "0",



Rotation spielt bei zeitraumbasierten Buchungen keine Rolle, daher ist der Eintrag immer 0

 

"VolumeType": "",

aktuell nicht in Verwendung

 

"blockValues": [
{
"adPosCatalogId": "a0M0E000008imieUAA",

Sofern mit der reservierten Platzierung Sperr-Regeln verknüpft sind, wird die zu sperrende Verfügbarkeit in diesem Abschnitt angezeigt

 

"blocked": "100"
}
]

das zu sperrende Volumen

errechnet sich nach der prozentualen Angabe im Feld f42_dispo__LockedVolume__c an der Sperr-Regel.

}
]
}
]

abschließende Klammern

 

.