In diesem Schritt wird es etwas knifflig, aber es bleibt spannend. Der Anfang mag zunächst verwirrend erscheinen (und vielleicht ein wenig herausfordernd), aber Geduld zahlt sich aus - versprochen. Sobald du den Dreh raus hast, wirst du sehen, wie einfach es ist.
Das Wichtigste zuerst: Klicke auf den App Launcher und gib "Quote Template" ein. Klicke darauf, um zur Listenansicht der Angebotsvorlagen (Quote Template) zu gelangen. Klicke dort auf die Schaltfläche „Neu“ und gib der Vorlage den Namen „Bikes Unlimited Template“. Lege die Vorlage als Standard fest und setze sie in den Deployment-Status „Deployed“, wie folgt:
Fertig! Du hast jetzt eine Basis für das Quote Template eingerichtet, das sofort einsatzbereit ist. Du traust dem Ganzen nicht? Überprüfe den Tab „related“. Du wirst wahrscheinlich folgendes sehen:
Sollen wir es testen? Gehe zu einem Angebot (Quote), das Du für ein Fahrrad mit Zubehör erstellt hast. Du solltest die Optionen „Dokument anzeigen“ (Preview Document) und „Dokument generieren“ (Generate Document) sehen. Gehe vorerst aber nur auf Vorschau (Preview) und dann erneut auf Vorschau.
Ta-da!
„Ähm, warte, das sieht nicht richtig aus...“, denkst du vielleicht. Aber wir haben auch noch nicht viele Informationen hinzugefügt. Zumindest hast du erst einmal eine Struktur.
Jetzt beginnt die eigentliche Arbeit. Also, Ärmel hochkrempeln und das Template fertigstellen!
Dieses Template hat uns der Kunde gegeben und er soll mit dem Ergebnis zufrieden sein. Nehmen wir also sein Logo und gehen wie folgt vor:
Klicke in der oberen rechten Ecke auf dein Profilsymbol und klicke im Drop-down-Menü auf „Zu Salesforce Classic wechseln“.
Klicke auf das „+“ -Zeichen ganz rechts, um alle Tabs anzuzeigen
und suche nach „Dokumente“ (Documents)
Fügen wir unser Logo zum Quotes-Ordner hinzu.
Klicke auf „Neu“, um das Dokument selbst hinzuzufügen.
WICHTIG: Vergiss nicht, eine Beschreibung für die Datei hinzuzufügen und die Datei als „Extern verfügbares Bild“ (externally available image) zu markieren. Füge das Logo außerdem in einem öffentlichen Ordner hinzu, zum Beispiel im Quotes-Ordner.
Gehe zu „Datei auswählen“ auf wähle von deinem lokalen Computer die entsprechende Datei aus. Klicke auf Speichern.
Das sollte das Ergebnis für dich sein:
Hinweis zur Datei: Unterstützte Bilddateitypen für Angebotsdokumente sind JPG, PNG, BMP und GIF. Die Größe der Datei sollte so klein wie möglich sein und darf die maximale Dateigröße von 5 MB für Angebotsdokumente nicht überschreiten.
https://help.salesforce.com/s/articleView?id=000382224&type=1
Verlasse die Seite nicht und schaue dir nun die URL an. Sie sollte ungefähr so aussehen:
Siehst du nach dem letzten „/“ die ID? — Eine gute alte 15-stellige Salesforce-ID, in meinem Fall ist das „0152o0000078GJN“, das ist die eindeutige ID meines Logos. Kopiere diese ID und kehre zu Lightning zurück, indem du auf „Zu Lightning Experience wechseln“ (switch to Lightning Experience) klickst.
Füge in unserer Angebotsvorlage die ID des Logos in das Feld „Logo-Dokument-ID“ ein
Jetzt weiß CPQ, wo genau unser Logo ist und wie man es findet. Du traust dem nicht? Kehre zur Test-Quote zurück und schaue dir das Dokument erneut in der Vorschau an
Und? Zufrieden? ☺
Während wir schonmal hier sind, setzen wir im Abschnitt „Seiteninformationen“ den „oberen Rand“ auf 0, da wir ihn in unserer Vorlage nicht benötigen
Entferne außerdem im Tab „related“ alle "Line Fields" wie folgt:
Soweit so gut. Trotzdem sind wir noch weit von unserem Zielergebnis entfernt. Um etwas in unserer Vorlage zu haben und nicht das Standardmaterial zu verwenden, das von Salesforce stammt, erstellen wir einige Inhaltsdatensätze.
WICHTIG: Denke daran, dass die gesamte Einrichtung und das Styling von HTML-Markup und CSS der Größe meines Logo entsprechen und du möglicherweise zusätzliche Anpassungen vornehmen musst.
Klicke auf den App Launcher und suche nach „Template Content“
Klicke auf "Neu". Lass uns mit der Erstellung unseres Headers beginnen. Markiere „HTML“ und „Weiter“.
Nennen wir unseren Content „BU Template Header“ (BU — Bikes Unlimited) und setzen die Schriftart zum Beispiel auf Helvetica.
Klicke auf das Tabellensymbol
und füge eine Tabelle mit 2 Spalten hinzu, Ausrichtung "Right":
Jetzt verwenden wir das "Merge Feld" für das Firmenlogo wie folgt: „{! CompanyLogo}“ (Informationen zum Zusammenführen von Feldern in Angebotsvorlagen findest du hier https://help.salesforce.com/s/articleView?id=sf.cpq_merge_fields.htm&type=5 ). Nun wollen wir den Stil der Tabelle ein wenig ändern, also schreibe dein HTML-Markup, kombiniert mit Inline-CSS wie meins. Klicke auf die Schaltfläche "Source" (Quelle) und gib dasselbe Markup ein:
Das ist das Ergebnis:
Schauen wir uns an, was mit unserer Vorlage passiert ist, wenn wir versuchen, eine Vorschau anzuzeigen. Gehen zurück zum Angebot und klicke auf Dokumentvorschau
Gar nicht cool... Denke daran, wenn etwas mit der Vorlage schief geht, wirst du höchstwahrscheinlich diesen Fehler sehen... was nicht so hilfreich ist, also ist es eine gute Idee, die Vorschau öfter zu testen und herauszufinden, was beim Erstellen kaputt gegangen ist, sonst ist es schwierig, das zu debuggen (ich spreche hier aus eigener Erfahrung).
Für den aktuellen Fehler könnten wir sagen, dass der Grund die leere Vorlage ist. Das System erlaubt uns nicht, ein leeres Dokument zu generieren (oder sogar in der Vorschau anzuzeigen) — wir haben die Zeilenfelder gelöscht, denke daran.
Ok, lass uns das reparieren! Gehe erneut zur Template Content Liste und erstelle eine neue Liste, wieder HTML, und gib ihr den Namen „BU-Cover Page Content“. Füge vorerst nur das Zusammenführungsfeld (merge field) „Angebotsname“ auf der Arbeitsfläche „{! quote.Name}“ hinzu und klicke auf Speichern.
Gehe zum Tab related auf die Angebotsvorlage und klicke in der Abschnittszeile auf Neu
Gib für den neuen Abschnitt den Namen „BU Cover Page“ ein und setze den Top Margin auf 5, Display Order auf 10 und klicke auf den Inhalt, den wir im vorherigen Schritt erstellt haben. Speichere das Dokument und schaue dir nun das Dokument erneut an!
Dieses Mal haben wir keinen Fehler. Wir sehen, dass das Logo in die obere rechte Ecke des Dokuments verschoben wurde, der Name unseres Unternehmens in der oberen linken Ecke steht und der Name des Angebots automatisch darunter angezeigt wird.
Wir machen Fortschritte, machen wir weiter so!
Wir möchten den Namen und die Adresse unseres Unternehmens drucken. Gehe also zur Angebotsvorlage zum Abschnitt „Unternehmensinformationen“ und füge dort die entsprechenden Daten hinzu. Klicke auf Speichern, wenn du fertig bist.
Gehe nun zum BU Cover Page Content und direkt vor dem {! Quote.Name} Merge-Feld, füge eine neue Tabelle mit 2 Spalten und 3 Zeilen hinzu, die nach links ausgerichtet ist
und fülle die Tabelle so
Vielleicht erinnerst du dich an dieOptionen zur Verwendung von Zusammenführungsfeldern. Wir haben die !template option, bei der Daten aus der Vorlage selbst übernommen werden. Jedes dieser SBQQ-Felder ist das Feld, das wir mit den Informationen unseres Unternehmens gefüllt haben. Es gibt zwei Möglichkeiten zu den "field names" zu kommen:
1. Gehe im Setup in den Objektmanager und suche nach dem Objekt Quote Template. Dort findest du alle Objekt-Felder.
2. Solltest du Google Chrome verwenden, würde ich empfehlen, Salesforce Inspector Reloaded zu installieren ( https://chromewebstore.google.com/detail/salesforce-inspector-relo/hpijlohoihegkfehhibggnkbjhoemldh ) - es ist ein fantastisches kostenloses Tool, das meiner Meinung nach jeder Salesforce-Spezialist haben sollte. Damit kannst du, während du dich noch auf unserem Template Details Tab befindest, auf den Pfeil rechts auf deinem Bildschirm klicken (er ist nach der Installation der Erweiterung sichtbar) und auf „API-Namen für Felder anzeigen“ (show fields API names) klicken.
Also wirklich, wie cool ist das! Ein großes Lob für diese Erweiterung geht an Thomas Prouvot ( https://www.linkedin.com/in/thomasprouvot/ )! Danke, Thomas! ☺
Zurück zu unserer Arbeit — gehe zur Quote und klicke... rate mal — Vorschau!
Los geht's, wir haben jetzt unsere Unternehmensinformationen dort und wissen, wie wir sie bei Bedarf aktualisieren können. Aber der Abstand zwischen dem Logo und den Unternehmensinformationen ist ein bisschen zu groß, nicht wahr?
Klicke in der Angebotsvorlage unter „related“ im Abschnitt „BU-Cover Page“ auf Bearbeiten und stelle den oberen Rand auf 2. Speichere das Ergebnis und schaue dir das Ergebnis erneut an:
Viel besser!
Aber... (was, du dachtest, wir sind schon fertig?! ) wir wollen, dass unser Firmenname größer und auffälliger ist — mit der Firmenfarbe #538587.
Gehe zum „BU-Cover Page Content", klick auf Bearbeiten und markiere die Zeile mit dem Firmennamen und klicke auf das Textfarbensymbol
Füge im Popup-Fenster den Farbcode in die entsprechende Zelle ein und klicke auf OK
Wenn der Text noch markiert ist, klicke auf das Schriftgröße-Symbol und ändere die Größe auf 16, speichere und sieh dir das Ergebnis in der Vorschau an... inzwischen solltest du nur zu gut wissen, wie das geht ☺
Perfekt! Bisher tolle Arbeit!
Fügen wir dem Angebot weitere Daten hinzu. Gehe dafür zum Abschnitt Adressinformationen und fülle die Felder aus
Füge nun im Content Template eine weitere Tabelle unter der Tabelle mit den Unternehmensinformationen hinzu: 7 Zeilen, 3 Spalten, links ausgerichtet
Setze den Quote Namen in die erste Zelle und fülle den Rest wie folgt aus:
Richtig geraten - wir nehmen wieder Daten aus dem Angebot auf und das ist das Ergebnis
Dieser Abschnitt ist nun fertig. Lass uns einen neuen Template Content für die Produkte erstellen, die dem Angebot hinzugefügt wurden.
Wähle den Typ „Einzelposten“. Ich nenne meinen „BU Products Content“, der Tabellenstil wird Standard sein.
Erstellen Sie einen neuen Abschnitt, nennen wir ihn „BU Products Table“ und nutze folgendes Set-up:
Top Margin – 0
Display Order – 20
Content – BU Products Content
Keep With Previous – Auto
Keep Together – Auto
Klicke nun in der Angebotsvorlage in den Zeilenspalten auf Neu und lege diese Werte fest
Column Heading – Description
Display Order – 10
Field Name – SBQQ__ProductName__c ( Salesforce Inspector Realoaded -> Show all data on the Quote Line ;) )
Klicke auf Speichern und zeige eine Vorschau des Dokuments an
Sieht immer besser aus! Lass uns einige weitere Felder für Angebotspositionen hinzufügen
Menge (Quantity)
Preis pro Einheit (Unit Price)
Rabatt (Discount)
Gesamt (Total)
Und das Ergebnis
Ok, füge zum Inhalt der Vorlage eine Firmenfarbe für die Tabelle hinzu (ohne das Symbol '#'), indem du den Wert in die Zelle „Textfarbe“ eingibst
Perfekt!
Jetzt kommt der knifflige Teil. Ich möchte bedingten Text drucken, basierend auf der Kombination des Basisprodukts (in unserem Fall: Fahrräder) und den ausgewählten zusätzlichen Produktoptionen. Das ist der Teil, in dem ich Salesforce wirklich liebe, weil es so viele Optionen zur Implementierung einer Lösung bietet und das Endziel auf viele verschiedene Arten erreicht werden kann.
Unser Ziel ist:
Wenn das Basisprodukt
Road Bike ODER Racing Bike ist
UND
Zubehör Flaschenhalter ist
drucke diesen Text: Unsere Flaschenhalter sind so konzipiert, dass sie problemlos auf City-Bikes und Rennräder passen. Das verstellbare Design sorgt für eine sichere Passform an verschiedenen Rahmenformen und -größen und bietet so die perfekte Lösung für Radfahrer verschiedener Disziplinen.
Wenn das Basisprodukt
E-Mountain-Bike
UND
Zubehör Flaschenhalter ist
drucke diesen Text: Unsere Flaschenhalter wurden speziell für die besonderen Anforderungen von E-Mountainbikes entwickelt. Die Form ist für E-Mountainbike-Rahmen optimiert und bietet eine sichere und integrierte Lösung für den Transport Ihrer Trinkflaschen.
Unabhängig vom Basisprodukt: Wenn Zubehör gleich
Erste-Hilfe-Set ist
drucke diesen Text: Unser Erste-Hilfe-Set besteht aus hochwertigen und wasserfesten Materialien und ist so gebaut, dass es den Anforderungen verschiedener Fahrrad-Disziplinen standhält. Egal, ob Sie mit einem E-Mountainbike abseits der Straße unterwegs sind oder auf glatten Straßen cruisen, unser Set ist so konzipiert, dass Ihre wichtigsten medizinischen Geräte sicher und trocken aufbewahrt werden.
Wenn das Basisprodukt
E-Mountain-Bike ist
UND
Motor ist
Nabenmotor: Erleben Sie eine sanfte und reaktionsschnelle Fahrt mit unseren Nabenmotoren, die nahtlos in die Radnabe integriert sind. Nabenmotoren sind für ihre Einfachheit und Wartungsfreundlichkeit bekannt und eignen sich daher hervorragend für verschiedene Fahrbedingungen.
Mittelmotor: Unsere Mittelantriebsmotoren sind strategisch am Tretlager des Fahrrads positioniert und sorgen für ein ausgewogenes und natürliches Fahrgefühl. Diese Motoren eignen sich hervorragend für anspruchsvolles Gelände und sorgen für eine effiziente Kraftübertragung direkt auf die Kette, was zu einer besseren Steigfähigkeit und einer besseren Gesamtleistung führt.
Performance Line: Verbessern Sie Ihr Fahrerlebnis mit dem Performance Line CX-Motor. Dieser Mittelmotor ist für seine leistungsstarke Unterstützung bekannt und verfügt über eine reaktionsschnelle Drehmomentmessung, die für optimale Unterstützung auf jedem Trail sorgt.
Wenn das Basisprodukt
E-Mountain-bike
UND
Batterie ist
Li-Ionen-Akku: Unsere Standard-Lithium-Ionen-Batterien sind eine bewährte Wahl für E-Mountainbikes. Li-Ionen-Batterien sind für ihre hervorragende Energiedichte bekannt und bieten eine zuverlässige und effiziente Energiequelle, die für ein gleichbleibendes und angenehmes Fahrerlebnis sorgt. Sie bieten ein ausgewogenes Verhältnis zwischen Gewicht, Kapazität und Langlebigkeit, was sie zu einer beliebten Wahl unter Fahrern macht.
Li-Po-Batterie: Für diejenigen, die eine kompakte und leichte Lösung suchen, sind unsere Lithium-Polymer-Batterien eine ausgezeichnete Wahl. Li-Po-Batterien bieten mit ihrem Polymerelektrolyten ein hohes Verhältnis von Energie zu Gewicht. Dieses Design macht sie für Fahrer geeignet, die maximale Leistung in einem schlanken und leichten Paket suchen, um ein aufregendes Fahrgefühl zu gewährleisten, ohne Kompromisse bei der Leistung einzugehen.
21700-Batterie: Verbessern Sie Ihr E-Mountainbike-Erlebnis mit dem 21700-Batterie. Dieser für seine höhere Energiedichte bekannte Batterietyp bietet eine höhere Kapazität und Effizienz, was sich in längeren Fahrzeiten und einer verbesserten Gesamtleistung niederschlägt. Die 21700-Zellen sind an der Spitze der Batterietechnologie und bieten eine leistungsstarke und zuverlässige Energiequelle für deine Abenteuer.
NCR18650GA-Batterie: Unsere E-Mountainbike-Akkus verfügen auch über die bewährten NCR18650GA-Zellen. Diese 18650-Lithium-Ionen-Zellen sind bekannt für ihre hohe Kapazität und stabile Leistung. Fahrer können eine robuste und konsistente Stromversorgung erwarten, die sicherstellt, dass sie anspruchsvolles Gelände mit Zuversicht und Zuverlässigkeit bewältigen können.
Wie ich bereits erwähnt habe, gibt es verschiedene Möglichkeiten, dies zu erreichen, und ja, es ist schwierig, aber wir können es schaffen. Wir haben die Macht von Salesforce in unseren Händen!
Lass uns über das Problem nachdenken und schauen, welche Optionen wir haben:
Ansatz A)
Erstelle 10 verschiedene Kontrollkästchen auf der Angebotsebene, von denen jedes die andere Kombination darstellt, die wir in das Template einfügen möchten.
Erstelle 10 verschiedene Template Content Records und 10 verschiedene Template Sections, die jeweils den eindeutigen Text enthalten, den wir drucken möchten.
In jeder Template Section gibt es ein Feld namens „Conditional Print Field“. Dieses Feld können wir für jeden Abschnitt verwenden, um das entsprechende Kästchen im Angebot anzukreuzen. Mit anderen Worten — überprüfe, ob „Print_Bottle_Holder_Road_Racing_Bike__C“ (Muster-Kontrollkästchen auf Quote) wahr ist und wenn ja, drucke den Text für diese Kombination aus, der im aktuellen Template-Content enthalten ist.
Um diese 10 Checkboxen dynamisch auszufüllen, können wir einen durch Datensätze ausgelösten Flow erstellen, der beim Erstellen oder Aktualisieren der Angebotszeile ausgelöst wird, und beispielsweise überprüfen, ob diese Formel als Eingabebedingung zutrifft.
Verrückt, oder? Wenn diese Formel „Wahr“ zurückgibt und alle Optionen enthält, die wir haben, können wir ein Entscheidungselement mit 10 verschiedenen Pfaden für jede einzelne Option hinzufügen. Basierend auf dem Ergebnis aktualisiert der Flow das Kontrollkästchen auf dem Zitat und bla bla, den Rest kennst du.
Sieht nach einer Menge Arbeit aus, oder?
Nun, das ist es auf jeden Fall, wir haben eine komplexe Anforderung und die Lösung wird nicht einfach sein. Ich bin ein großer Fan des Clicks-not-Code-Ansatzes und ich fange immer an, in den folgenden Schritten über die Lösung nachzudenken:
Ich versuche immer darüber nachzudenken, wie schwierig es sein wird, es in Zukunft zu aktualisieren und wie schwer es sein wird, wenn jemand anderes es tun muss, nicht ich.
Und als ich darüber nachdachte, kam ich auf
Ansatz B)
Erstelle einen benutzerdefinierten Metadatentyp, der meine Texte zum Drucken enthält, sodass jeder den Text selbst einfach aktualisieren kann, ohne den Rest meiner Logik zu beeinträchtigen.
Erstelle einen Apex-Controller, der die benötigten Daten sammelt, eine gewisse Logik daraus macht und Daten weiterleitet.
Erstelle eine Visualforce-Seite mit einem speziellen Markup namens XSL-FO (https://w3schools.sinsixx.com/xslfo/xslfo_reference.asp.htm), das die von meinem Controller übergebenen Daten visualisieren wird.
Dafür scheinen wesentlich weniger Schritte nötig zu sein, wenn nur ich 10 Datensätze erstellen muss und die nächste Person nach mir, egal ob Admin oder Entwickler, den Text an einer Stelle aktualisieren kann.
Die Entscheidung ist gefallen, lasst uns anfangen zu bauen!
WICHTIG: Ich werde die Developer Console verwenden, da ich im Moment niemanden zwingen möchte, Visual Studio Code oder Code Builder zu installieren. Solltest du ein anderes Tool zum Schreiben von Code haben, verwende es gerne.
Gehe zu Setup und suche nach dem „Custom Metadata Type“, erstelle einen neuen Typ, ich nenne meinen, „Quote Dynamic Text“
Ich werde zwei benutzerdefinierte Felder erstellen, eines für die Kombination zwischen übergeordnetem Produkt und Produktoption und eines für den Text selbst, etwa so
Das sind meine Daten
Und so sieht eine dieser Daten aus:
Wir sind hier fertig! Wenn nun jemand die Beschreibung einer der Options aktualisieren möchte, kann er dies für diesen Datensatz tun ODER einen neuen erstellen.
Gehen wir zum Apex-Controller. Öffne die Developer Console und erstelle eine neue Apex-Klasse:
Ich nenne meinen „QuoteTemplate_DynamicText_Controller“ und das ist mein Controller
Erstelle eine Visualforce-Seite, ich nenne meine „BU_Dynamic_Text_Content“ und das ist mein Markup (denke an XSL-FO-Markup)
Ok, wir sind fertig. Jetzt muss ich meinen Template Content erstellen. Ich möchte, dass es vom Typ „Benutzerdefiniert“ ist und ich nenne es „BU Dynamic Content“.
Im Feld „Custom Source Field“ muss ich auf den API-Namen meiner Visualforce-Seite verweisen.
Das findest du in Setup — Visualforce Pages - suche nach dem Namen, den wir ihm gegeben haben
So wird der Inhalt aussehen
SEHR WICHTIG: Das Format der benutzerdefinierten Quelle ist
„/apex/c__“ + API-Name der Visualforce-Seite, also in meinem Fall
„/apex/C__BU_Dynamischer_Textinhalt“
Ok, lass uns eine Template Section für unsere Inhalte erstellen. Das ist meins:
Auch hier beziehen sich die Ränder und alles Weitere auf mein Dokumentbeispiel. Du musst deine wahrscheinlich je nach den Anforderungen anpassen.
Ein letzter Teil — Footer Content
Lass uns unseren letzten Template-Inhalt erstellen, HTML eingeben und ich nenne ihn „BU Template Footer“.
Füge eine Tabelle hinzu: 3 Zeilen, 1 Spalte, linksbündig. Fülle den Text aus dem Beispiel aus und klicke auf die Schaltfläche "Source" (Quelle)
Ich habe zusätzlich eine Farbe und den unteren Rand für die erste Zelle hinzugefügt. Das ist das Ergebnis:
Applaus bitte!!! Wir sind fertig! Wir haben die volle Struktur und alles Nötige! Lass es uns testen
Ich weiß, wir haben das gebaut... aber es sieht wirklich gut aus, nicht wahr!
Ich hoffe euch hat alles gefallen, was wir bis jetzt gemacht haben! Ich weiß, dass ich glücklich bin, jetzt kann Bikes Unlimited seinen Kunden Angebote schicken und ihre Vorlagen sehen professionell gestylt aus! Sie haben auch die Kontrolle, den Text zu aktualisieren und zusätzliche Datensätze hinzuzufügen, die auf der Kombination Fahrrad — Zubehör basieren ☺