Einführung

Dass Opportunity-, Angebots- und Buchungsprozesse in MediaVelox so reibungslos ineinandergreifen, liegt nicht zuletzt an einigen Automatisierungen und Triggern, die im Paket enthalten sind.

Neben den “statischen” Objekten wie die Publikation mit ihren Ausgaben, Formaten und Platzierungen kommt dem eher “dynamischen” Objekt Verfügbarkeit/Platzierungsmöglichkeit f42_dispo__AdPosCatalog__c hier eine zentrale Rolle zu.

f42_dispo__AdPosCatalog__c ist sog. Master in einer Master-Detail-Relation zu den Objekten

  • Buchung - f42_dispo__DispoBook__c (Detail)

  • Sperreintrag - f42_dispo__DispoBlockedItems__c (Detail)

    • gleichzeitig Detail zu f42_dispo__DispoBook__c

Im Salesforce Schema-Builder wird dies anschaulich:

Die Verfügbarkeit einer Platzierungsmöglichkeit

Zentrales Feld an der Platzierungsmöglichkeit ist das Formelfeld Verfügbarkeit f42_dispo__countAvailable__c

API-Feldname

Formel

Inhalt der Formel

f42_dispo__countAvailable__c

if( f42_dispo__Publication__r.f42_dispo__isDigital__c = TRUE,
(f42_dispo__physicalLimit__c - ( f42_dispo__blockedSumReserved__c + f42_dispo__blockedSumBooked__c + f42_dispo__DispoBookSumVolumeConfirmed__c + f42_dispo__DispoBookSumVolumeReserved__c )),
(f42_dispo__physicalLimit__c - ( f42_dispo__blockedCount__c + f42_dispo__blockedCountBooked__c + f42_dispo__confirmedCountRollup__c + f42_dispo__reservedCountRollup__c )))

Physikalisches Limit einer Verfügbarkeit

  • minus Sperreinträge im Status reserviert/gebucht

  • minus Dispobucheinträge im Status reserviert/gebucht

jeweils unterscheiden nach Anzahl (Count) für zeitpunktbasierte und Volumen (Sum) für zeitraumbasierte Buchungen

Die gebuchten/reservierten/gesperrten Buchungen werden über Rollup Summaries am Objekt Verfügbarkeit erfasst

  • bei digitalen Publikationen wird die Verfügbarkeit über das reservierte/gebuchte/gesperrte Volumen innerhalb eines Dispobuch-/Sperreintrags erfasst

  • bei gewöhnlichen Print-Publikationen allein über die Anzahl an Dispobuch-/Sperreinträgen

Wie werden Buchungen erzeugt?

  • Reservierungen in MVX werden im Angebotsprozess über die Produkteigenschaft zur Verfügbarkeitsprüfung vorgenommen.

  • Der Wert einer Produkteigenschaft, in diesem Falle die Buchungsinformation, wird am Objekt Angebotsposition (SF42_GenLineItem__c) als JSON String in das Feld Spezifikation Export (SF42_QuoLI_Specification_Export__c) geschrieben.
    → hierin enthalten die ID der zugehörigen Verfügbarkeit, Anzahl Reservierungen, zugehörige Sperreinträge

  • Beim Synchronisieren der Angebotspositionen in die Opportunity (Erzeugen von Opportunity Produkten) wird der JSON String 1:1 auf das Opportunity Line Item ins Feld sf42_quotefx__SF42_QuoLI_Specification_Export__c geschrieben

Beim Synchronisieren der Anbebotspositionen in die Opportunity werden mittels eines Triggers neben den Opportunity Produkten im Bereich AdSales auch Dispobucheinträge erzeugt.

Buchungsrelevante Trigger

OpportunityLineItem.trigger

  • Der zentrale Trigger für MVX

  • Reagiert auf OpportunityLineItem-Erstellen aus appero quote heraus und erzeugt für MediaVelox neue Dispobucheinträge anhand der JSON-Spezifikation sf42_quotefx__SF42_QuoLI_Specification_Export__c

  • Sofern es bereits Dispobucheinträge an der Opportunity gibt, werden diese nicht geupdated, sondern gelöscht und neu geschrieben.

  • Erzeugt neue Sperreinträge, wenn die Buchung eine solche Regel auslöst.

Dispobook.trigger

Zeitliche Gültigkeit von Dispobucheinträgen

Wenn eine Buchung/Dispobucheintrag (f42_dispo__DispoBook__c) nicht mehr gültig ist, wird der Datensatz über eine Checkbox auf “archiviert” gesetzt. Archivierte Buchungen werden nicht mehr auf die Verfügbarkeit angerechnet.

Auch hier steht ein Formelfeld im Zentrum

API-Feldname

Formel

Inhalt der Formel

f42_dispo__Calculated_Archive__c

if(
OR(TEXT(f42_dispo__Order_Processing__c) = 'canceled' || TEXT(f42_dispo__Order_Processing__c) = 'rescheduled',
AND(
OR(
IF(RecordType.DeveloperName = 'FixedPublicationDate', f42_dispo__Issue__r.f42_dispo__ClosingDate__c < TODAY(),f42_dispo__Issue__r.f42_dispo__PublicationDateUntil__c < TODAY() ),
f42_dispo__Quote__r.sf42_quotefx__SF42_QuoValidThruDate__c < TODAY()
),
f42_dispo__Opportunity__r.IsClosed != true
)
),
true,false)

Eine Buchung wird auf archiviert gesetzt, wenn

  • Buchung gecancelt (Status am Dispobucheintrag)

  • Buchung verschoben (Status “rescheduled”)

  • der Veröffentlichungszeitraum in der Vergangenheit liegt und die Reservierung nicht bestätigt ist

    • bei Print: f42_dispo__Issue__r.f42_dispo__ClosingDate__c

    • bei Digital: f42_dispo__Issue__r.f42_dispo__PublicationDateUntil__c

  • Angebotsgültigkeit abgelaufen

Archivierte Buchungen werden nicht mehr auf die Verfügbarkeit angerechnet. Da Rollup-Summaries aber nicht auf Formelfelder angewandt werden können, wird der Wert des Feldes f42_dispo__Calculated_Archive__c mittels Trigger in eine einfache Checkbox geschrieben:

Dieser Dispobook.trigger wird ausgelöst durch OpportunityLineItem.trigger

  • Schreibt den Wert des Feldes f42_dispo__Calculated_Archive__c in das Checkbox-Feld
    f42_dispo__archive__c

  • Aktualisiert zugehörige Sperreinträge,

  • Aktualisiert den zu einer Buchung gehörenden Belegversand (zu stornierten Buchungen wird kein Belegex. erstellt), betr. f42_dispo__MVX_ProofOfDeliveryRule__c, Record Type Based on Dispo Books

Dispobucheinträge werden, wenn sich ihr Status oder Inhalt ändert, nicht geupdated, sondern gelöscht und neu geschrieben.
Nur bei der Archivierung wird ein Dispobucheintrag nicht neu geschrieben, sondern über die Kennzeichnung “archiviert” geupdated.

quote.trigger

Sobald ein Angebot abgelehnt wird, wird die zugehörige Buchung auf archiviert gesetzt (archive__c). Der zugehörige Trigger ist der quote.trigger.

quotelineitems.trigger

Für den Fall, dass ein Angebot mit Reservierungen erneut bearbeitet wird und einzelne Positionen darin gelöscht werden, mußt der entsprechende Dispobucheintrag archiviert werden.
Der quotelineitems.trigger prüft, ob eine Angebotsposition gelöscht wird und setzt vor dem Löschen den entsprechenden Dispobucheintrag auf archiviert (archive__c).

DispoBlockedItems.trigger

Auch Sperreinträge f42_dispo__DispoBlockedItems__c werden über ein Formelfeld auf archiviert gesetzt:

API-Feldname

Formel

Inhalt der Formel

f42_dispo__Calculated_Archive__c

am Sperreintrag

f42_dispo__DispoBookEntry__r.f42_dispo__Calculated_Archive__c

Das Feld f42_dispo__Calculated_Archive__c am Sperreintrag übernimmt per Formel den Wert aus dem auslösenden Dispobucheintrag.

Der DispoBlockedItems.trigger schreibt den Wert des Formelfelds in das Checkboxfeld f42_dispo__archive__c am Sperreintrag

Opportunity.trigger

Auch wenn sich der Opportunity-Status ändert, hat das Einfluss auf die Buchungen. Hier greift der Opportunity.trigger

  • schreibt neue Dispobücher und löscht bisherige, wenn die Opportunity gewonnen ist und der Buchungsstatus auf bestätigt wechselt

  • dieselben Vorgänge auch für die zugehörigen Sperreinträge

Trigger für den Versand von Belegexemplaren

Issues.trigger

  • betr. Belegversandregeln (f42_dispo__MVX_ProofOfDeliveryRule__c) vom Record Type Based On Issues.

Belegexemplare, die aus ausgabenbasierten Regeln entstehen, werden manuell über eine Action an der Ausgabe erzeugt. Genaugenommen setzt die Schaltfläche nur einen Status an der Ausgabe - mittels Checkbox f42_dispo__ProofOfDeliveriesCreated__c.

Erst die gesetzte Checkbox löst den Issues.trigger aus, der wiederum die einzelnen Belegexemplare erzeugt (f42_dispo__MVX_ProofOfDelivery__c)

ProofofDeliveryRules.trigger

  • Validierung der Zustelladresse, wenn Angaben zur Lieferanschrift etc. unvollständig.

Proofsofdelivery.trigger

  • wenn Ausgaben-basierte Belegexemplare erstellt wurden, wird der zugehörige Status auf der Ausgabe geupdated.

Damit die verschiedenen Trigger in MediaVelox fehlerfrei durchlaufen, benötigt der Anwender ausreichende Berechtigungen für die verschiedenen Objekte.