Abo-Modul

Mit dem Abo-Modul stellt WEBSALE eine Funktion zur Verfügung, mit der Händler ihre Kunden noch enger an den Shop binden können.

Damit bieten Sie einzelne Produkte als Abonnement mit unbegrenzter Laufzeit an, die in vorab definierten Intervallen regelmäßig und wiederholt an Kunden ausgeliefert werden.

Die Abrechnung der Bestellung erfolgt ebenfalls in Intervallen. Das Abo muss also nicht etwa komplett im Voraus bezahlt werden, sondern wird zusammenhängend mit den definierten Lieferterminen abgerechnet.

Insbesondere für Händler, die Konsumprodukte anbieten, kann eine Abo-Funktion für viele Produkte eine interessante Möglichkeit sein, die Kundenzufriedenheit und -loyalität zu steigern. Außerdem können alle in WEBSALE V8s zur Verfügung stehende Rabattfunktionen optional genutzt werden, um Kunden direkt zu belohnen.

Inhalt

Funktionsweise

Bestellablauf im Shop

Integration

Rabatt für Abo-Bestellungen

 

Funktionsweise

Die Funktion steht nur Käufern zur Verfügung, die bereits über ein Kundenkonto besitzen und eingeloggt sind.

Pro Abo kann immer nur ein Produkt bestellt werden. Der Käufer kann jedoch beliebig viele Abos abschließen, um unterschiedliche Produkte zu bestellen. Die Menge des Produktes pro Abo kann dabei größer als 1 sein. Der Käufer kann die Lieferintervalle der einzelnen Produkte im Kundenkonto anpassen, um "Sammel-Lieferungen" seiner Abo-Produkte zusammenzustellen.

Die Zahlung der Produkte wird in Intervallen fällig. Der Käufer muss also seine Abo-Produkte, die in seiner Abo-Verwaltung hinterlegt sind, nicht mit einem Mal und auch nicht im Voraus bezahlen, denn erst mit Versand wird die Zahlung fällig. Das Zahlungsintervall ist immer identisch mit dem Lieferungsintervall. Er wird somit automatisch geändert, wenn der Kunde sein Lieferungsintervall ändert.

Um die Bezahlung muss sich die Warenwirtschaft oder der Händler kümmern. Es erfolgt keine automatische Reservierung oder Abbuchung durch das Abo-Modul.

Als Zahlungsart kann dem Käufer entweder "Lastschrift" oder "Rechnung" angeboten werden.

Die Lieferung erfolgt ausschließlich an die Rechnungsadresse. Abweichende Lieferadressen werden nicht unterstützt.

Der Shop versendet E-Mail-Benachrichtigungen an den Käufer bei jeder Abo-Bestellung und informiert ihn über eine anstehende Lieferung.
Der Händler wird ebenfalls informiert über anstehende Lieferungen oder wenn eine Bestellung nicht ausgeführt werden kann.

Alle Abos werden ohne Laufzeiten angeboten, d. h. es gibt weder eine Mindest- noch eine Maximal-Laufzeit für ein Abonnement. Der Käufer kann somit zu jedem Zeitpunkt sein Abonnement kündigen oder ändern.

Der Käufer kann seine Abonnements unbegrenzt pausieren. Das Pausieren muss aktiv durch den Käufer beendet werden, in dem er in der Abo-Verwaltung den "Pause beenden"-Button klickt. Nach dem Beenden des Pausierens wird als Beginn des neuen Lieferintervalls automatisch der aktuelle Tag gesetzt, d. h. der Tag, an dem das Pausieren beendet wurde. Dies kann durch den Käufer geändert werden.

Da es für Abonnements kein Mindestlaufzeit gibt, kann der Kunde sein Abonnement zu jedem Zeitpunkt kündigen. Das Löschen eines Kundenkontos ist gleichzusetzen mit der Kündigung des Abonnements, d. h. ab dem Moment, in dem der Kunde sein Kundenkonto aktiv löscht, gilt auch das Abo nicht mehr.

 

Bestellablauf im Shop

 

Produktdetailansicht (ws_product.htm)

 

 
Die Funktion steht nur Käufern zur Verfügung, die bereits über ein Kundenkonto besitzen und eingeloggt sind. Nicht-angemeldeten Käufern wird beim Produkt ein Hinweis angezeigt.

 
Ist der Käufer eingeloggt, können ihm beim Abo-Produkt folgende Informationen und Aktionen angeboten werden:

Produktinformationen, z. B. Name des Produktes, Preis etc.

Auswahl: Bestellung im Abo oder normaler Einzelkauf

Auswahl und Anzeige des Lieferintervalls

Auswahl und Anzeige des ersten Liefertages

Lieferadresse (=Rechnungsadresse)

Anzeige der Zahlungsart (Rechnung oder Lastschrift)

Hinweis auf mögliche anfallende Versandkosten, d. h. Liste der Versandkosten, die im Shop hinterlegt sind

Button "Aktivieren & zahlungspflichtig bestellen"

Button "Übersicht Ihrer Abos"

Erfolgsmeldung, dass das Produkt zu seiner Abo-Liste hinzugefügt wurde

Abschluss eines Abonnements

 

 
Nach Klick auf "Aktivieren" wird dem Käufer folgende Bestätigung angezeigt. Das Produkt ist nun abonniert und wird ab dem angegebenen Tag im festgelegten Intervall geliefert, bis der Käufer das Abo ändert, pausiert oder beendet.

Es findet somit nicht der übliche Bestellablauf im Shop statt (Produkte in den Warenkorb legen, Warenkorb anzeigen, Zahlungs- und Versandarten auswählen, Kauf abschließen).

Abo-Liste

 

Im Kundenkonto hat der Käufer die Möglichkeit, die Einstellungen seiner Abo-Produkte zu ändern. Folgende Änderungen sind möglich:

Änderung der Stückzahl

Änderung des Lieferintervall

Änderung des Liefertages

Pausieren des Abos (zu jeder Zeit)

Löschen des Abonnements (zu jeder Zeit)

 

 

Integration

Voraussetzung

Produkte, die im Abo verkauft werden, müssen im Warenwirtschaftssystem speziell gekennzeichnet werden. Die Kennzeichnung erfolgt über das technische Produktdatenfeld "SubscriptionProduct", welches vom Warenwirtschaftssystem unterstützt werden muss. Erfolgt keine Unterstützung durch das Warenwirtschaftssystem, kann alternativ beim Import ein Mapping eines freien Datenfeldes auf das benötigte technische Feld erfolgen.

Produkte können so gekennzeichnet werden, dass sie

im Abo (SubscriptionProduct yes = y) oder

nicht im Abo (SubscriptionProduct no = n) oder

sowohl im Abo, als auch als "normales" Kaufprodukt (SubscriptionProduct both = b)

erhältlich sind.

Dem Abo-Produkt kann - wie allen anderen Produkten im Shop auch - ein Rabatt zugewiesen werden. Die Angabe eines Rabattes beim Produkt ist keine Pflicht für das Abo-Modul, sondern nur eine Option.

Beim Produkt können alle produktspezifischen Rabatte genutzt werden, die in der WEBSALE V8s zur Verfügung stehen.

Wegweiser: Rabatte festlegen

Weitere Hinweise zum Anlegen/Flaggen eines Abo-Produkts entnehmen Sie bitte der separaten Schnittstellen-Dokumentation unter https://doku.websale.de/schnittstellen.


Hinweis:

Die folgenden Schritte und Code-Beispiele zeigen die grundlegende Integration des Abo-Moduls.
Ausführlichere Code-Beispiel mit CSS, Bootstrap-Modal und JS usw. finden Sie unter Materialien: Materialien Abo-Modul

 

Schritt 1: Freischaltung/Aktivierung

Das Abo-Modul muss technisch freigeschaltet/aktiviert werden. Bitte wenden Sie sich an Ihren WEBSALE-Ansprechpartner und teilen Sie diesem mit, welche Zahlungsart für das Abo-Modul genutzt werden soll. Möglich sind Rechnung oder Lastschrift.

Schritt 2: Fehlermeldung ergänzen

Ergänzen Sie in Ihrer Shopkonfiguration shop.config im Abschnitt NotifyMessages-Txt die folgende Fehlermeldung:

<NotifyMessages-Txt>
   ...
   ProductSubscriptionProductNotOrderable = Um das Abo-Produkt ~PR-Name~ bestellen zu können, müssen Sie sich anmelden. Klicken Sie <a href="~WS-LoginLink~&type=LoginUser">hier</a>.
   ...
</NotifyMessages-Txt>

Referenz: NotifyMessages-Txt

Schritt 3: Konfigurieren des Abo-Moduls in der Shopkonfiguration shop.config

Ergänzen Sie in Ihrer Shopkonfiguration shop.config den Abschnitt Subscription und fügen Sie die jeweiligen Parameter und Unterabschnitte ein:

Lieferintervalle (Cycles)

Legen Sie hier die gewünschten Intervalle fest, die dann bei allen Produkten verwendet werden, z. B.:

1 Woche

14 Tage

1 Monat

3 Monate

1 Jahr etc.

Bis zu 15 Lieferintervalle können definiert werden. Die Intervalle sind jederzeit änderbar.

Ändert/löscht ein Händler ein Lieferintervall, welches bereits für Abos genutzt wird, wird der Käufer darüber nicht informiert. Das Lieferintervall beim Käufer wird erst verändert, wenn der Käufer in seiner Abo-Verwaltung davon Kenntnis genommen hat, d. h. der Kunde öffnet die Abo-Verwaltung über sei Kundenkonto aktiv im Shop und erhält dann eine Meldung.

Lieferintervall-Einträge sollten also nach Liveschaltung des Abo-Moduls nicht gelöscht oder geändert werden, da dies nachteilig für den Käufer sein kann.

<Subscription>
   ...  
   <Cycles>
      <+Entry>
         Description = einmal pro Woche
         count = 1
         unit = week
      </+Entry>
      <+Entry>
         Description = alle 14 Tage
         count = 14
         unit = day
      </+Entry>
      <+Entry>
         Description = einmal pro Monat
         count = 1
         unit = month
      </+Entry>
      <+Entry>
         Description = alle 3 Monate
         count = 3
         unit = month
      </+Entry>
      <+Entry>
         Description = einmal im Jahr
         count = 1
         unit = year
      </+Entry>
   </Cycles>
   ...
</Subscription>

Referenz: Subscription

Mehrere Abos für eine Lieferung zusammenfassen (ConsiderNextDays)

Hat ein Kunde mehrere Abos abgeschlossen und liegen die Lieferintervalle zeitlich sehr nah beieinander, kann die Lieferung zusammengefasst werden.

Die Zeitspanne, in welcher Bestellungen zusammengefasst werden sollen, kann mit diesem Parameter konfiguriert werden:

<Subscription>
   ...
   ConsiderNextDays     = 3
   ...
</Subscription>

Referenz: Subscription

Erneuter Bestellversuch für Abos nach aufgetretenen Fehlern (DaysRetry)

Tritt bei einer Bestellung ein Fehler auf, wird die Bestellung nicht ausgeführt und der Händler wird per E-Mail informiert.

Der XML-Bestellgenerator versucht nach x Tagen einen weiteren Bestellversuch. Dieser Zeitraum wird mit diesem Parameter konfiguriert.

Wird der Fehler nicht innerhalb von x Tagen behoben, erfolgt danach kein weiterer Bestellversuch durch den XML-Bestellgenerator. Stattdessen erhält der Händler per E-Mail eine Übersicht aller Abo-Produkte, bei denen ein Fehler vorliegt, der die Bestellung verhindert.

<Subscription>
   ...
   DaysRetry            = 2
   ...
</Subscription>

Referenz: Subscription

Informations-E-Mail an den Käufer über seine bevorstehenden Abos (SubscriberNotificationMail)

Diese E-Mail wird an den Käufer verschickt, um seine nächste Abo-Bestellung anzukündigen. Der Versand der E-Mail erfolgt so viele Tage im Voraus der Bestellung wie unter Days angegeben.

Fügen Sie den Unterabschnitt <SubscriberNotificationMail> innerhalb von <Subscription> ein und konfigurieren Sie die folgenden Parameter:

<Subscription>
   ...
   <SubscriberNotificationMail> # E-Mail an Kunden mit Übersicht seiner Abo-Produkte, die in n Tagen versendet werden
      Allow         = yes
      SenderAddress = versender@adresse.de
      SenderName    = Versendername
      Subject-Txt   = Demnächst wird mindestens ein Aboprodukt bestellt
      ReplyTo       = antwort@adresse.de
      Template      = mail_subscription_customer_notification.htm
      Days          = 4
   </SubscriberNotificationMail>
   ...
</Subscription>

Referenz: Subscription

Informations-E-Mail an den Händler mit einer Übersicht der bevorstehenden Abos (MerchantNotificationMail)

Diese E-Mail wird an den Händler verschickt, um die nächste Abo-Bestellung anzukündigen. Der Versand der E-Mail erfolgt so viele Tage im Voraus der Bestellung wie unter Days angegeben.

Fügen Sie den Unterabschnitt <MerchantNotificationMail> innerhalb von <Subscription> ein und konfigurieren Sie die folgenden Parameter:

<Subscription>
   ...
   <MerchantNotificationMail> # E-Mail an den Händler mit Übersicht aller Abo-Produkte, die in n Tagen anstehen
      Allow         = yes
      SenderAddress = versender@adresse.de
      SenderName    = Versendername
      Subject-Txt   = Demnächst wird mindestens ein Aboprodukt bestellt
      ReplyTo       = antwort@adresse.de
      Template      = mail_subscription_merchant_notification.htm
      Days          = 4
   </MerchantNotificationMail>
   ...
</Subscription>

Referenz: Subscription

Informations-E-Mail an den Händler bei fehlerhaften Abo-Bestellungen (OrderErrorMail)

Kann eine Bestellung durch den WEBSALE XML-Bestellgenerator nicht ausgeführt werden, wird der Händler per E-Mail informiert und kann dann mit dem Käufer in Kontakt treten.

Die E-Mail enthält eine Auflistung aller Abo-Produkte, die auf Grund eines Fehlers aktuell nicht bestellbar sind.

Fügen Sie den Unterabschnitt <OrderErrorMail> innerhalb von <Subscription> ein und konfigurieren Sie die folgenden Parameter:

<Subscription>
   ...
   <OrderErrorMail> # E-Mail an Shopbetreiber, wenn eine Bestellung nicht generiert werden konnte.
      Allow           = yes
      ReceiverAddress = empfaenger@adresse.de
      SenderAddress   = versender@adresse.de
      SenderName      = Versendername
      Subject-Txt     = Abobestellung konnte nicht erstellt werden
      ReplyTo         = antwort@adresse.de
      Template        = mail_subscription_order_error.htm
   </OrderErrorMail>
   ...
</Subscription>

Referenz: Subscription

Informations-E-Mail an den Händler nach 2 fehlerhaften Bestellversuchen (DisabledNotificationMail)

Tritt auch nach dem zweiten Bestellversuch ein Fehler auf, erhält der Händler eine E-Mail mit allen Abos, die nicht mehr bestellt werden konnten.

Fügen Sie den Unterabschnitt <DisabledNotificationMail> innerhalb von <Subscription> ein und konfigurieren Sie die folgenden Parameter:

<Subscription>
   ...
   <DisabledNotificationMail> # E-Mail mit allen Abos, die nicht mehr bestellt werden konnten.
      Allow           = yes
      SenderAddress   = versender@adresse.de
      ReceiverAddress = empfaenger@adresse.de
      SenderName      = Versendername
      Subject-Txt     = Es gibt Abos, die nicht mehr bestellt werden konnten.
      ReplyTo         = antwort@adresse.de
      Template        = mail_subscription_disabled_notification.htm
   </DisabledNotificationMail>
   ...
</Subscription>

Referenz: Subscription

Schritt 4: Verfügbarkeit einer Versandart für Abo-Bestellungen (optional)

Legen Sie optional bei Ihren Versandarten fest, ob diese für Abo-Bestellungen zur Verfügung stehen sollen. Fügen Sie den Parameter AllowForSubscriptionOrder-Qualification in die <+Deliverer>-Abschnitte der Shopkonfiguration shop.config ein. Im Standard erhalten Versandarten den Wert use-for-all und sind somit sowohl für Abo-Bestellungen als auch für "normale" Bestellungen zulässig. Ändern Sie bei Bedarf den Wert auf not-for-subscriptionorder, um Versandarten für Abo-Bestellungen auszuschließen, oder auf only-for-subscriptionorder für Versandarten

<+Deliverer>
   ...
   AllowForSubscriptionOrder-Qualification =        # [use-for-all|only-for-subscriptionorder|not-for-subscriptionorder]
   ...
</+Deliverer>

Referenz: +Deliverer

WEBSALE empfiehlt kostenlosen Versand, um bestmögliche Preistransparenz für den Käufer zu gewährleisten.

Ablehnungsgründe für Versandarten ergänzen (optional)

Sie können dem Käufer bei der Auswahl der Versandarten optional auch die ausgeschlossenen Versandarten anzeigen lassen mit einem Hinweis, warum diese für das gewünschte Abo nicht zur Verfügung stehen.

Erstellen Sie dafür eine entsprechende Regel in der Shopkonfiguration. Weitere Informationen hierzu finden Sie unter Wegweiser: Versandarten anlegen: Nicht verfügbare Versandarten ausgegraut darstellen.

Verwenden Sie dabei die folgenden ShowDisabled-Txt-Meldungen:

<DelivererShowDisabled-Definitions>
   <+ShowDisabled-Rule>
      ShowDisabled-GroupID                = # z. B. VersandartNichtVerfuegbar
      <ShowDisabled-Txt>
         29 = Versandart ist nur für Abobestellungen verfügbar (aktuelle Bestellung ist keine Abobestellung)
         30 = Versandart nur für Nicht-Abobestellungen verfügbar (aktuelle Bestellung ist eine Abobestellung)
      </ShowDisabled-Txt>
      ...
   </+ShowDisabled-Rule>
</DelivererShowDisabled-Definitions>

Referenz: Abschnitt DelivererShowDisabled-Definitions


Hinweis:

Achten Sie darauf, bei jedem +Deliverer-Abschnitt die UseShowDisabled-GroupID zu hinterlegen.

Schritt 5: Neues Template anlegen: Abo-Verwaltung/Abo-Übersicht im Kundenkonto

Geben Sie in Ihrer Shopkonfiguration shop.config im Abschnitt Templates bei dem Parameter Subscription den Namen des neuen Templates an:

<Templates>
   ...
   Subscription = ws_subscription_manage.htm
   ...
</Templates>

Referenz: Templates

Legen Sie ein neues Template an und speichern Sie dieses unter dem soeben gewählten Namen in Ihrem Template-Verzeichnis, z. B. benutzer/templates/translation.

Fügen Sie folgenden Inhalt auf dem Template ein:

<head>
   ...
   <script src="/$WS/ws_sysdata/js/ws-module-ajaxgeneric-1.8.5.js"></script>
   ...
</head>
<body>
   <div id="subscriptionContent">
   {ST-Ajax}<WS-Ajax-subscriptionContent>{/ST-Ajax}
      Abonnements
      <!-- Notifications -->
      {MSG-Subscription_success}
         {MSG-Subscription_success(1)}Ihr Abonnement wurde erfolgreich abgeschlossen.{/MSG-Subscription_success(1)}
         {MSG-Subscription_success(2)}Ihr Abonnement wurde pausiert. Sie können das Abo jederzeit reaktivieren.{/MSG-Subscription_success(2)}
         {MSG-Subscription_success(3)}Ihr Abonnement ist wieder aktiv. Das nächste Lieferdatum entnehmen Sie bitte der Übersicht.{/MSG-Subscription_success(3)}
         {MSG-Subscription_success(4)}Ihr Abonnement wurde erfolgreich an Ihre Wünsche angepasst.{/MSG-Subscription_success(4)} 
         {MSG-Subscription_success(5)}Sie haben Ihr Abonnement gelöscht.{/MSG-Subscription_success(5)}
         {MSG-Subscription_success(6)}Ihre erste Abo - Bestellung wird bald durchgeführt.{/MSG-Subscription_success(6)}
         {MSG-Subscription_success(7)}Es wurde eine neue Bankverbindung für Ihre Abonnements festgelegt.{/MSG-Subscription_success(7)}
      {/MSG-Subscription_success}
  
      {MSG-Subscription_error}
         {MSG-Subscription_error(1)}Sie sind nicht angemeldet. Um ein Abo abschließen zu können, müssen Sie angmeldet sein. Bitte loggen Sie sich mit Ihren Zugangsdaten ein. Sollten Sie noch keinen Kundenaccount haben, registrieren Sie sich bitte.{/MSG-Subscription_error(1)}
         {MSG-Subscription_error(2)}Bitte prüfen Sie Ihre Eingaben. Die eingegebene Menge oder der Zeitraum Ihres Abos könnten fehlerhaft sein.{/MSG-Subscription_error(2)}  
         {MSG-Subscription_error(3)}Bitte reaktivieren Sie Ihr Abonnement, bevor Sie Änderungen daran vornehmen.{/MSG-Subscription_error(3)}  
         {MSG-Subscription_error(4)}Das ausgewählte Produkt ist kein Aboprodukt.{/MSG-Subscription_error(4)}  
         {MSG-Subscription_error(5)}Das ausgewählte Produkt ist kein Aboprodukt, da es aus einem Set von Produkten besteht.{/MSG-Subscription_error(5)}  
         {MSG-Subscription_error(6)}Bitte wählen Sie eine spezifische Produktvariante um das Abo abzuschließen.{/MSG-Subscription_error(6)}  
         {MSG-Subscription_error(7)}Das ausgewählte Produkt kann nicht gefunden werden.{/MSG-Subscription_error(7)}  
         {MSG-Subscription_error(8)}Ihre Abobestellung konnte nicht ausgeführt werden.{/MSG-Subscription_error(8)}  
      {/MSG-Subscription_error}
  
      Sie haben ~SUBS-Data~ Abonnements. Hier können Sie Ihre Abonnements ändern, pausieren und löschen.
      <!-- Button "Zurück zum Abo-Produkt" navigieren -->
      {WS-OTPSubscriptionProdIndex}
         <a href="~PR-Link($WS-OTPSubscriptionProdIndex$)~{WS-OtpSubscriptionVarIndex}?depvar_index=~WS-OtpSubscriptionVarIndex~{/WS-OtpSubscriptionVarIndex}">Zurück zum Abo-Produkt</a>
      {/WS-OTPSubscriptionProdIndex}
        
      Lieferadresse
      Die Lieferung Ihrer Abonnements erfolgt an Ihre Rechnungsadresse:
      {A-FirstName}
         {A-Salutation}~A-Salutation~{/A-Salutation}
         ~A-FirstName~ {A-LastName}~A-LastName~{/A-LastName}
         {A-Street1}~A-Street1~{/A-Street1}
         {A-Zip}~A-Zip~{/A-Zip}{A-City} ~A-City~{/A-City}
         {A-Country}~A-Country~{/A-Country} 
      {/A-FirstName}

      <a href="~WS-AddrManageLink~&otpeditfromsubscription=yes">Rechnungsadresse bearbeiten</a> 

      Ihre Bankverbindung
      {SUBS-FixedPaymentCodeUsed(4)}
         {SUBS-Bankdata}
            Ihre Abonnements werden mit folgender Bankverbindung bezahlt:
            ~WS-Fast_Include(Incl-Banks)~
         {/SUBS-Bankdata}
  
         ~SUBS-BankSelection~
         {BANK-BankSelection}
            {SUBS-Bankdata}
               Andere Bankverbindung wählen
            {/SUBS-Bankdata}
            {!SUBS-BankData}
               {DC-FPFromNewBANK(true)}
                  Bitte wählen Sie Ihre soeben angelegte Bankverbindung nun als Haupt-Bankverbindung für zukünftige Abo-Zahlungen aus.
               {/DC-FPFromNewBANK(true)}
               {!DC-FPFromNewBANK(true)}
                  Sie haben noch keine Bankverbindung ausgewählt. Bitte wählen Sie eine Bankverbindung aus, damit sie Abonnements abschließen können.
               {/!DC-FPFromNewBANK(true)}
            {/!SUBS-Bankdata}
            <form action="~FORM-Subscription~" id="subscriptionBank" method="POST">
               <!-- Versteckte OTP-Parameter setzen für korrekte Zurück-Buttons -->
               {WS-OTPSubscriptionProdIndex}<input type="hidden" name="otpsubscriptionprodindex" value="~WS-OTPSubscriptionProdIndex~">{/WS-OTPSubscriptionProdIndex}
               {WS-OTPSubscriptionVarIndex}<input type="hidden" name="otpsubscriptionvarindex" value="~WS-OTPSubscriptionVarIndex~">{/WS-OTPSubscriptionVarIndex}
               <select class="form-control" onchange="return ws_AJAXsendForm('subscriptionBank','~WS-Charset~',ws_AJAXSubscriptionStart(), ws_AJAXSubscriptionError(), 'ws_AJAXSubscriptionResponseSuccess()', 'ws_AJAXSubscriptionResponseError()')" name="~SUBS-BankIndex_input~">
                  <option value="empty">Bitte wählen</option>
                  {@BANK-Data}
                     <option value="~BANK-BankSelection_code~" {DC-CompareDigitIBE($BANK-BankSelection_code$,$SUBS-BankIndex$,$BANK-BankSelection_code$)}selected{/DC-CompareDigitIBE($BANK-BankSelection_code$,$SUBS-BankIndex$,$BANK-BankSelection_code$)}>{BANK-UserDescr}~BANK-UserDescr~{/BANK-UserDescr} (~BANK-IBAN~, ~BANK-Bank~)</option>
                  {/@BANK-Data}
               </select>
            </form>
         {/BANK-BankSelection}
         {!BANK-BankSelection}
            Sie haben in Ihrem Kundenkonto noch keine Bankverbindungen hinterlegt. Bitte hinterlegen Sie mindestens eine Bankverbindung, um ein Abonnement abzuschließen.
            <a href="~WS-BankManageLink~{WS-OTPSubscriptionProdIndex}&otpsubscriptionprodindex=~WS-OTPSubscriptionProdIndex~{/WS-OTPSubscriptionProdIndex}{WS-OTPSubscriptionVarIndex}&otpsubscriptionvarindex=~WS-OTPSubscriptionVarIndex~{/WS-OTPSubscriptionVarIndex}&otpeditfromsubscription=yes">Bankverbindung(en) bearbeiten</a>
         {/!BANK-BankSelection}
      {/SUBS-FixedPaymentCodeUsed(4)}

      {SUBS-Bankdata}
         <a href="~WS-BankManageLink~{WS-OTPSubscriptionProdIndex}&otpsubscriptionprodindex=~WS-OTPSubscriptionProdIndex~{/WS-OTPSubscriptionProdIndex}{WS-OTPSubscriptionVarIndex}&otpsubscriptionvarindex=~WS-OTPSubscriptionVarIndex~{/WS-OTPSubscriptionVarIndex}&otpeditfromsubscription=yes">Bankverbindung(en) bearbeiten</a>
      {/SUBS-Bankdata}
  
      <!-- Abonnierte Produkte - Übersicht -->  
      {!SUBS-Data}
         Es befinden sich derzeit noch keine Produkte auf Ihrer Aboliste.
      {/!SUBS-Data}
      {SUBS-Data}
         Hier finden Sie eine Übersicht Ihrer Abonnements. Sie können Ihr Abo jederzeit beenden, pausieren und wieder aktivieren.
         Status
         <form action="~FORM-Subscription~" id="subscription" method="POST">
            {@SUBS-Data}
               {SUBS-Data_state_ispaused}Abonnement pausiert{/SUBS-Data_state_ispaused}
               Produkt
               {PR-LoadData($SUBS-Data_PR_Number$,1)}                    
                  {PR-LargeImage}
                     <a href="~PR-DepVarLink~"><img src="~PR-LargeImage~" alt="~PR-Name_StripHtml~" /></a>
                  {/PR-LargeImage}
               {/PR-LoadData($SUBS-Data_PR_Number$,1)}
               ~SUBS-Data_PR_Name~
  
               Lieferintervall
               <label for="~SUBS-CycleSelection_input~">Lieferintervall</label>
               <select class="form-control" name="~SUBS-CycleSelection_input~" onchange="return ws_AJAXsendForm('subscription','~WS-Charset~',ws_AJAXSubscriptionStart(), ws_AJAXSubscriptionError(), 'ws_AJAXSubscriptionResponseSuccess()', 'ws_AJAXSubscriptionResponseError()')">
                  {@SUBS-CycleSelection_data}
                     <option value="~SUBS-CycleSelection_data_value~" ~SUBS-CycleSelection_data_selected~>~SUBS-CycleSelection_data_descr~</option>
                  {/@SUBS-CycleSelection_data}
               </select>

               Erste Lieferung
               ~DC-DateTime_setunixtimestamp($SUBS-Data_nextorder_unixtimestamp$)~ ~DC-DateTime_day~. ~DC-DateTime_month~. ~DC-DateTime_year~
  
               Menge
               <label for="~SUBS-Data_PR_Quantity_input~">Menge</label>
               <input name="~SUBS-Data_PR_Quantity_input~" value="~SUBS-Data_PR_Quantity~" onblur="return ws_AJAXsendForm('subscription','~WS-Charset~',ws_AJAXSubscriptionStart(), ws_AJAXSubscriptionError(), 'ws_AJAXSubscriptionResponseSuccess()', 'ws_AJAXSubscriptionResponseError()')">

  
               Gesamtpreis
               ~SUBS-Data_PR_Price~ ~WS-CurrencySymbol~ * ~SUBS-Data_PR_Quantity~
               {PR-LoadData($SUBS-Data_PR_Number$,1)}
                  ~DC-FPCurrentPrice_set($PR-Price$)~
               {/PR-LoadData($SUBS-Data_PR_Number$,1)}
               {!DC-FPCurrentPrice($SUBS-Data_PR_Price$)}
                  Preisänderung
                  Aktueller Preis: ~DC-FPCurrentPrice~ ~WS-CurrencySymbol~
               {/!DC-FPCurrentPrice($SUBS-Data_PR_Price$)}                      
  
               {SUBS-Data_state_isactive}aktiv{/SUBS-Data_state_isactive}
               {SUBS-Data_state_isnew}aktiv{/SUBS-Data_state_isnew}
               {SUBS-Data_state_ispaused}pausiert{/SUBS-Data_state_ispaused}
               {SUBS-Data_state_istriggered}aktiv{/SUBS-Data_state_istriggered}
  
               <button type="submit" name="~SUBS-Data_Buttonname~" value="~SUBS-Data_Buttonvalue_delete~" onClick="return ws_AJAXsendForm('subscription','~WS-Charset~',ws_AJAXSubscriptionStart(), ws_AJAXSubscriptionError(), 'ws_AJAXSubscriptionResponseSuccess()', 'ws_AJAXSubscriptionResponseError()', '~SUBS-Data_Buttonname~=~SUBS-Data_Buttonvalue_delete~')">löschen</button>
               {SUBS-Data_Buttonvalue_pause}<button type="submit" name="~SUBS-Data_Buttonname~" value="~SUBS-Data_Buttonvalue_pause~" onClick="return ws_AJAXsendForm('subscription','~WS-Charset~',ws_AJAXSubscriptionStart(), ws_AJAXSubscriptionError(), 'ws_AJAXSubscriptionResponseSuccess()', 'ws_AJAXSubscriptionResponseError()', '~SUBS-Data_Buttonname~=~SUBS-Data_Buttonvalue_pause~')">pausieren</button>{/SUBS-Data_Buttonvalue_pause}
               {SUBS-Data_Buttonvalue_resume}<button type="submit" name="~SUBS-Data_Buttonname~" value="~SUBS-Data_Buttonvalue_resume~" onClick="return ws_AJAXsendForm('subscription','~WS-Charset~',ws_AJAXSubscriptionStart(), ws_AJAXSubscriptionError(), 'ws_AJAXSubscriptionResponseSuccess()', 'ws_AJAXSubscriptionResponseError()', '~SUBS-Data_Buttonname~=~SUBS-Data_Buttonvalue_resume~')">aktivieren</button>{/SUBS-Data_Buttonvalue_resume}
            {/@SUBS-Data}
         </form>
      {/SUBS-Data}  
   {ST-Ajax}</WS-Ajax-subscriptionContent>{/ST-Ajax}
   </div>

   <!-- AJAX Funktionen -->
   {DC-FPFromNewBANK(true)}
      <script>
         function ws_AJAXSubscriptionResponseSuccess() {
            window.location.href = "~WS-EnsureNextLinkContainsURLParams~~PR-Link($WS-OTPSubscriptionProdIndex$)~{WS-OTPSubscriptionVarIndex}&depvar_index=~WS-OtpSubscriptionVarIndex~{/WS-OTPSubscriptionVarIndex}&otpdetailview=yes";
         }
      </script>
   {/DC-FPFromNewBANK(true)}

   {!DC-FPFromNewBANK(true)}
      <script>
         function ws_AJAXSubscriptionResponseSuccess(){}
      </script>
   {/!DC-FPFromNewBANK(true)}

   <script>
      function ws_AJAXSubscriptionStart(){}
      function ws_AJAXSubscriptionError(){}
      function ws_AJAXSubscriptionResponseError(){}
   </script>

</body>

Referenz: SUBS-Tags

Der Käufer kommt auf diese Abo-Übersicht, wenn auf der Produktseite ein Abonnement abgeschlossen oder wenn die Seite direkt vom Kundenkonto aufgerufen wurde. Man kann Abonnements bearbeiten und mittels Weiterleitungen seine Adressen auf ws_address_manage.htm und Bankdaten auf ws_bank_manage.htm für die Abo-Bestellung bearbeiten.

Schritt 6: E-Mail-Templates anlegen

Legen Sie für die gewünschten E-Mail-Benachrichtigungen neue Templates an und speichern Sie diese in Ihrem Template-Verzeichnis, z. B. benutzer/templates/translation.

Der jeweilige Dateiname muss mit den Angaben in der Shopkonfiguration shop.config, Abschnitt Subscription, Unterabschnitt der entsprechenden E-Mail, Parameter Template übereinstimmen (siehe Schritt 3).

Informations-E-Mail an den Händler bei fehlerhaften Abo-Bestellungen (OrderErrorMail)

Kann eine Bestellung durch den WEBSALE XML-Bestellgenerator nicht ausgeführt werden, wird der Händler per E-Mail informiert und kann dann mit dem Käufer in Kontakt treten.

Fügen Sie folgenden Inhalt ein:

{E-SUBS_ErrorMsg}~E-SUBS_ErrorMsg~{/E-SUBS_ErrorMsg}
{E-SUBS_ErrorCode}~E-SUBS_ErrorCode~{/E-SUBS_ErrorCode}
{@E-SUBS_Data}
   Abo-Index: ~E-SUBS_DATA_Index~
   UserIndex: ~E-SUBS_DATA_UserIndex~
   Abo-Preis: ~E-SUBS_DATA_PR_Price~ ~E-SUBS_DATA_PR_CurrencyCode~
   Produktindex: ~E-SUBS_DATA_PR_Index~
   Produktnummer: ~E-SUBS_DATA_PR_number~
   Produktname: ~E-SUBS_DATA_PR_Name~
   Menge: ~E-SUBS_DATA_PR_Quantity~
   Abo erstellt: ~E-SUBS_DATA_Created~
   Abo zuletzt bearbeitet: ~E-SUBS_DATA_LastChange~
   Datum der letzten Bestellung: ~E-SUBS_DATA_LastOrder~
   Datum der nächsten Bestellung: ~E-SUBS_DATA_NextOrder~
   Laden der aktuellen Produktdaten:
   {PR-LoadData({NO_PARSING}~E-SUBS_DATA_PR_Index~,0)}
      ~PR-Name~
      ~PR-Price~ ~WS-Currency~
   {/PR-LoadData({/NO_PARSING}~E-SUBS_DATA_PR_Index~,0)}
{/@E-SUBS_Data}

Referenz: E-SUBS-Tags

Informations-E-Mail an den Käufer über seine bevorstehenden Abos (SubscriberNotificationMail)

Diese E-Mail wird an den Käufer verschickt, um seine nächste Abo-Bestellung anzukündigen.

Fügen Sie folgenden Inhalt ein:

Auflistung aller anstehenden Abos:
{@E-SUBS_Data}
   ID: ~E-SUBS_DATA_Index~
   UserIndex: ~E-SUBS_DATA_UserIndex~
   Price: ~E-SUBS_DATA_PR_Price~
   Currency: ~E-SUBS_DATA_PR_CurrencyCode~
   Produktindex: ~E-SUBS_DATA_PR_Index~
   Produktnummer: ~E-SUBS_DATA_PR_number~
   Produktname: ~E-SUBS_DATA_PR_Name~
   Quantity: ~E-SUBS_DATA_PR_Quantity~
   Abo erstellt: ~E-SUBS_DATA_Created~
   Abo zuletzt bearbeitet: ~E-SUBS_DATA_LastChange~
   Datum der letzten Bestellung: ~E-SUBS_DATA_LastOrder~
   Datum der nächsten Bestellung: ~E-SUBS_DATA_NextOrder~
{/@E-SUBS_Data}

Referenz: E-SUBS-Tags

Informations-E-Mail an den Händler mit einer Übersicht der bevorstehenden Abos (MerchantNotificationMail)

Diese E-Mail wird an den Händler verschickt, um die nächste Abo-Bestellung anzukündigen.

Fügen Sie folgenden Inhalt ein:

Auflistung aller anstehenden Abos:
{@E-SUBS_Data}
   ID: ~E-SUBS_DATA_Index~
   UserIndex: ~E-SUBS_DATA_UserIndex~
   Price: ~E-SUBS_DATA_PR_Price~
   Currency: ~E-SUBS_DATA_PR_CurrencyCode~
   Produktindex: ~E-SUBS_DATA_PR_Index~
   Produktnummer: ~E-SUBS_DATA_PR_number~
   Produktname: ~E-SUBS_DATA_PR_Name~
   Quantity: ~E-SUBS_DATA_PR_Quantity~
   Abo erstellt: ~E-SUBS_DATA_Created~
   Abo zuletzt bearbeitet: ~E-SUBS_DATA_LastChange~
   Datum der letzten Bestellung: ~E-SUBS_DATA_LastOrder~
   Datum der nächsten Bestellung: ~E-SUBS_DATA_NextOrder~
{/@E-SUBS_Data}
 
Auflistung aller Abos gruppiert nach Produkt:
{@E-SUBS_DataByProduct}
   Price: ~E-SUBS_DATA_PR_Price~
   Currency: ~E-SUBS_DATA_PR_CurrencyCode~
   Produktindex: ~E-SUBS_DATA_PR_Index~
   Produktnummer: ~E-SUBS_DATA_PR_number~
   Produktname: ~E-SUBS_DATA_PR_Name~
   Quantity: ~E-SUBS_DATA_PR_Quantity~
{/@E-SUBS_DataByProduct}

Referenz: E-SUBS-Tags

Informations-E-Mail an den Händler nach 2 fehlerhaften Bestellversuchen (DisabledNotificationMail)

Tritt auch nach dem zweiten Bestellversuch ein Fehler auf, erhält der Händler eine E-Mail mit allen Abos, die nicht mehr bestellt werden konnten.

Fügen Sie folgenden Inhalt ein:

{@E-SUBS_Data}
   ID: ~E-SUBS_DATA_Index~
   UserIndex: ~E-SUBS_DATA_UserIndex~
   Price: ~E-SUBS_DATA_PR_Price~
   Currency: ~E-SUBS_DATA_PR_CurrencyCode~
   Produktindex: ~E-SUBS_DATA_PR_Index~
   Produktnummer: ~E-SUBS_DATA_PR_number~
   Produktname: ~E-SUBS_DATA_PR_Name~
   Quantity: ~E-SUBS_DATA_PR_Quantity~
   Abo erstellt: ~E-SUBS_DATA_Created~
   Abo zuletzt bearbeitet: ~E-SUBS_DATA_LastChange~
   Datum der letzten Bestellung: ~E-SUBS_DATA_LastOrder~
   Datum der nächsten Bestellung: ~E-SUBS_DATA_NextOrder~
{/@E-SUBS_Data}

Referenz: E-SUBS-Tags

Schritt 7: Template Produktdetailansicht (ws_product.htm) anpassen

Das Abo-Modul wird auf dem Template ws_product.htm integriert.

Nehmen Sie folgende Erweiterungen vor:

Um die Anzeige für abonnementfähige und nicht abonnementfähige Produkte zu unterscheiden wird das Tag PR-SubscriptionProduct verwendet.

{!PR-SubscriptionProduct}
   ...
   Dieses Produkt ist nicht abonnementfähig
   ...
{/!PR-SubscriptionProduct}
 
{PR-SubscriptionProduct}
   ...
   Dieses Produkt ist abonnementfähig
   <!-- Hier werden die Einstellungen und Links des Abo-Moduls integriert -->
   ...
{/PR-SubscriptionProduct}

Referenz: PR-SubscriptionProduct

Um ein Abonnement abschließen zu können, muss man ein Kundenkonto besitzen und eingeloggt sein. Dazu bieten Sie auf der Produktdetailansicht eine Weiterleitung auf die Seite ws_login.htm an. Dort kann sich der Bestandskunde anmelden oder der Neukunde eine neues Kundenkonto eröffnen.

Um nach der Anmeldung von der Seite ws_login.htm zurück zum Produkt navigieren zu können, werden OTP-Parameter in der URL mitgegeben.

{!ST-LoggedIn}
   Sie benötigen ein Kundenkonto, um ein Abonnement abschließen zu können. Melden Sie sich an oder eröffnen Sie ein neues Kundenkonto<br>
   <a href='~WS-LoginLink~&type=loginUser&otplogintype=newuser&act=subscription&otpsubscriptionprodindex=~PR-ProdIndex~'>Anmelden</a>
{/!ST-LoggedIn}

Referenz: ST-LoggedIn

Auf der Seite ws_product.htm wird man benachrichtigt, dass eine Bankverbindung und Rechnungsadresse hinterlegt sein müssen.

Wenn diese Infos hinterlegt sind, dann hat man die Option, diese zu bearbeiten.

...
{PR-SubscriptionProduct}
   ...
   {!ST-LoggedIn}
      ...
   {/!ST-LoggedIn}
 
   {ST-LoggedIn}
      <!-- Zurücksetzen zurück-zum-product-sessionlink für ws_bank_manage.htm -->
      ~DC-SPSubscriptionProdIndex_reset~
 
      <!-- Dropdownliste für die verfügbaren Lieferintervalle des Abo-Produkts -->
      {SUBS-CycleSelection}
         Lieferintervall<br>
         <select name="~SUBS-CycleSelection_input~" onchange="SubmitSelection(); return false;">
            {@SUBS-CycleSelection_data}
               <option value="~SUBS-CycleSelection_data_value~" ~SUBS-CycleSelection_data_selected~>~SUBS-CycleSelection_data_descr~</option>
            {/@SUBS-CycleSelection_data}
         </select>
      {/SUBS-CycleSelection}
 
      {!A-FirstName}
         Bitte hinterlegen Sie eine Rechnungsadresse, um ein Abonnement abzuschließen.<br>
         <a href="~WS-EnsureNextLinkContainsURLParams~~WS-AddrManageLink~&otpsubscriptionprodindex=~PR-ProdIndex~">Rechnungsadresse anlegen</a><br>
      {/!A-FirstName}
 
      {A-FirstName}
         Lieferadresse<br>
         <a href="~WS-EnsureNextLinkContainsURLParams~~WS-AddrManageLink~&otpsubscriptionprodindex=~PR-ProdIndex~">Lieferadresse ändern</a><br>
         {A-Salutation}~A-Salutation~ ~A-FirstName~{A-LastName} ~A-LastName~{/A-LastName}<br>{/A-Salutation}
         {A-Street1}~A-Street1~<br>{/A-Street1}
         {A-Zip}~A-Zip~{/A-Zip}{A-City} ~A-City~{/A-City}<br>
      {/A-FirstName}
 
      Bankverbindung<br>
      <a href="~WS-Link~&act=subscription&otpsubscriptionprodindex=~PR-ProdIndex~">Bankverbindung ändern</a><br>
      {!SUBS-BankData}
         Um Ihr Abonnement abzuschließen, wählen Sie bitte eine Bankverbindung aus, über die Ihr Abonnement zukünftig bezahlt werden soll.<br>
         <a href="~WS-Link~&act=subscription&otpsubscriptionprodindex=~PR-ProdIndex~">Bankverbindung auswählen</a><br>
      {/!SUBS-BankData}
 
      {A-FirstName}                     
         {SUBS-BankData}                                    
            {Bank-UserDescr}~Bank-UserDescr~{/Bank-UserDescr}
            {BANK-Owner}~BANK-Owner~{/BANK-Owner}
            {BANK-IBAN}~BANK-IBAN~{/BANK-IBAN}
            {BANK-BIC}~BANK-BIC~{/BANK-BIC}
            {BANK-Bank}~BANK-Bank~{/BANK-Bank}
            <!-- wenn vorher durch einen Funnel ein Bankkonto bzw dessen Index bekannt ist kann dieser bei Legen auf die Aboliste mitgegeben werden -->
            {SUBS-BankIndex_input}<input type="hidden" name="~SUBS-BankIndex_input~" value="...">{/SUBS-BankIndex_input}                 
         {/SUBS-BankData}
      {/A-FirstName}
   {/ST-LoggedIn}
 
   <!-- Aktivierung des Abos nur wenn Adresse & Bank-Daten vorhanden sind -->
   {!A-FirstName}~DC-FPAboOrderOk_set(false)~{/!A-FirstName}
   {!SUBS-BankData}~DC-FPAboOrderOk_set(false)~{/!SUBS-BankData}
   {!SUBS-CycleSelection}~DC-FPAboOrderOk_set(false)~{/!SUBS-CycleSelection}
 
   <input {DC-FPAboOrderOk(false)}disabled{/DC-FPAboOrderOk(false)} name="~BT-Subscription~" value="zahlungspflichtig Abonnement aktivieren" type="submit">
{/PR-SubscriptionProduct}
...

Referenz: SUBS-Data

Wenn man eine Rechnungsadresse bearbeiten / hinterlegen möchte, muss eine Verlinkung auf dem Template ws_address_manage.htm stehen, damit man zurück zum Abo-Produkt navigieren kann.

 

Schritt 8: Template der Anmeldeseite (ws_login.htm) anpassen

Fügen Sie zunächst vor den "Zurück zum Produkt"- Button den Code zum Setzen des URL-Parameters ein.

...
<!-- Parameter zur Anzeige des 'Zurück zum Produkt' Buttons -->
{WS-OTPSubscriptionProdIndex}~DC-SPSubscriptionProdIndex_set($WS-OTPSubscriptionProdIndex$)~ ~DC-FPSubReferal_set(true)~{/WS-OTPSubscriptionProdIndex}
...

Ergänzen Sie dann die Anmeldeseite innerhalb der Klammerung {Type-LoginUser} mit folgenden Anmelde-Formularen für Bestands- und Neukunden.

...
...
{!WS-OTP1(NewUser)}
   {!DC-FPSubReferal}
      ...
   {/!DC-FPSubReferal}

   {WS-OTP1(NewUserSubscription)}
      <form action="~FORM-CombinedLogin~" id="ws_knownuser_content_subscription" method="Post" autocomplete="%%GlobalInputAutocompleteTxt%%" class="ws_login" data-ws-ajax="NewUserLogin">
         <input type="hidden" name="otp1" value="KnownUserSubscription">
         {WS-OTPSubscriptionProdIndex}<input type="hidden" name="otpsubscriptionprodindex" value="~WS-OTPSubscriptionProdIndex~">{/WS-OTPSubscriptionProdIndex}   
         <div class="form-group{WS-Email_error} is-invalid{/WS-Email_error}">
            <div class="inputLabelFocus" data-placeholder="E-Mail-Adresse *">
               <label for="~WS-Email_input~" class="control-label">E-Mail-Adresse *</label>
               <input type="email" name="~WS-Email_input~" value="~WS-Email~" maxlength="80" class="form-control{WS-Email_error} is-invalid{/WS-Email_error}">
            </div>
         </div>                        
         <div class="form-group{WS-PW_error} is-invalid{/WS-PW_error}">
            <div class="inputLabelFocus" data-placeholder="Passwort *">
               <label for="~WS-PW_input~" class="control-label">Passwort *</label>
               <div class="input-group">
                  <input type="password" maxlength="128" name="~WS-PW_input~" value="~WS-PW~" class="form-control{WS-PW_error} is-invalid{/WS-PW_error}" data-container="body" data-toggle="popover" data-placement="top" data-trigger="focus" data-content="Nicht vergessen! Ihr Passwort ist mindestens 8 Zeichen lang und besteht aus einer Buchstaben-Zahlen-Kombination.">
                  <div class="input-group-append">
                     <button type="submit" name="submit">Anmelden & weiter</button>
                  </div>
               </div>
            </div>
         </div>
      </form>

      <form action="~FORM-LoginNewUser~" id="ws_newuser_content_subscription" method="Post" autocomplete="nono" class="ws_login" data-ws-ajax="NewUserLoginSubscription">
         {WS-OTPSubscriptionProdIndex}<input type="hidden" name="otpsubscriptionprodindex" value="~WS-OTPSubscriptionProdIndex~">{/WS-OTPSubscriptionProdIndex}
         ~DC-FPQuickloginID_set(quicklogin_subProduct_input)~
         <input type="hidden" name="otp1" value="NewUserSubscription">               
         <div class="form-group{WS-NewEmail_error} is-invalid{/WS-NewEmail_error}">
            <div class="inputLabelFocus" data-placeholder="E-Mail-Adresse *">
               <label for="~WS-NewEmail_input~" class="control-label">E-Mail-Adresse *</label>
               <input type="email" name="~WS-NewEmail_input~" value="~WS-NewEmail~" maxlength="80" class="form-control{WS-NewEmail_error} is-invalid{/WS-NewEmail_error}">
            </div>
         </div>
         <div class="form-group{WS-NewPW_error} is-invalid{/WS-NewPW_error}">
            <div class="inputLabelFocus" data-placeholder="Passwort *">
               <label for="~WS-NewPW_input~" class="control-label">Passwort *</label>
               <input type="password" maxlength="128" name="~WS-NewPW_input~" value="~WS-NewPW~" class="form-control{WS-NewPW_error} is-invalid{/WS-NewPW_error}" data-container="body" data-toggle="popover" data-placement="top" data-trigger="focus" data-content="Nicht vergessen! Ihr Passwort ist mindestens 8 Zeichen lang und besteht aus einer Buchstaben-Zahlen-Kombination.">
            </div>
            ~WS-Fast_Include(Incl-WSLoginPasswordChecker)~
         </div>
         <div class="form-group{WS-PWAgain_error} is-invalid{/WS-PWAgain_error}">
            <div class="inputLabelFocus" data-placeholder="Passwort wiederholen">
               <label for="~WS-PWAgain_input~" class="control-label">Passwort wiederholen</label>
               <div class="input-group">
                  <input type="password" maxlength="128" name="~WS-PWAgain_input~" value="~WS-PWAgain~" class="form-control{WS-PWAgain_error} is-invalid{/WS-PWAgain_error}" data-container="body" data-toggle="popover" data-placement="top" data-trigger="focus" data-content="Ihr Passwort sollte mindestens 8 Zeichen lang sein und aus einer Buchstaben-Zahlen-Kombination bestehen.">
                  <div class="input-group-append">
                     <button type="submit" onclick="return ws_AJAXsendFormTemplate('~DC-FPQuickloginID~', '~WS-CharSet~', ws_AJAXSendLoginForSubProductStart, ws_AJAXSendLoginForSubProductError, 'ws_AJAXSendLoginForSubProductResponseSuccess()', 'ws_AJAXSendLoginForSubProductResponseError()');"><b>Submit</b></button>
                  </div>
               </div>
            </div>
         </div>
      </form>
   {/WS-OTP1(NewUserSubscription)}

   {!WS-OTP1(NewUserSubscription)}
      {DC-FPSubReferal}
         {DC-SPSubscriptionProdIndex}
            <form action="~FORM-CombinedLogin~" id="ws_knownuser_content_subscription" method="Post" autocomplete="%%GlobalInputAutocompleteTxt%%" class="ws_login" data-ws-ajax="NewUserLogin">
               {WS-OTPSubscriptionProdIndex}<input type="hidden" name="otpsubscriptionprodindex" value="~WS-OTPSubscriptionProdIndex~">{/WS-OTPSubscriptionProdIndex}
               <input type="hidden" name="otp1" value="KnownUserSubscription">
               <div class="form-group{WS-Email_error} is-invalid{/WS-Email_error}">
                  <div class="inputLabelFocus" data-placeholder="E-Mail-Adresse *">
                     <label for="~WS-Email_input~" class="control-label">E-Mail-Adresse *</label>
                     <input type="email" name="~WS-Email_input~" value="~WS-Email~" maxlength="80" class="form-control{WS-Email_error} is-invalid{/WS-Email_error}">
                  </div>
               </div>                        
               <div class="form-group{WS-PW_error} is-invalid{/WS-PW_error}">
                  <div class="inputLabelFocus" data-placeholder="Passwort *">
                     <label for="~WS-PW_input~" class="control-label">Passwort *</label>
                     <div class="input-group">
                        <input type="password" maxlength="128" name="~WS-PW_input~" value="~WS-PW~" class="form-control{WS-PW_error} is-invalid{/WS-PW_error}" data-container="body" data-toggle="popover" data-placement="top" data-trigger="focus" data-content="Nicht vergessen! Ihr Passwort ist mindestens 8 Zeichen lang und besteht aus einer Buchstaben-Zahlen-Kombination.">
                        <div class="input-group-append">
                           <button type="submit" name="submit">Anmelden & weiter</button>
                        </div>
                     </div>
                  </div>
               </div>
            </form>
      
            <form action="~FORM-LoginNewUser~" id="ws_newuser_content_subscription" method="Post" autocomplete="nono" class="ws_login" data-ws-ajax="NewUserLoginSubscription">
               {WS-OTPSubscriptionProdIndex}<input type="hidden" name="otpsubscriptionprodindex" value="~WS-OTPSubscriptionProdIndex~">{/WS-OTPSubscriptionProdIndex}
               ~DC-FPQuickloginID_set(quicklogin_subProduct_input)~
               <input type="hidden" name="otp1" value="NewUserSubscription">                     
               <div class="form-group{WS-NewEmail_error} is-invalid{/WS-NewEmail_error}">
                  <div class="inputLabelFocus" data-placeholder="E-Mail-Adresse *">
                     <label for="~WS-NewEmail_input~" class="control-label">E-Mail-Adresse *</label>
                     <input type="email" name="~WS-NewEmail_input~" value="~WS-NewEmail~" maxlength="80" class="form-control{WS-NewEmail_error} is-invalid{/WS-NewEmail_error}">
                  </div>
               </div>
               <div class="form-group{WS-NewPW_error} is-invalid{/WS-NewPW_error}">
                  <div class="inputLabelFocus" data-placeholder="Passwort *">
                     <label for="~WS-NewPW_input~" class="control-label">Passwort *</label>
                     <input type="password"  maxlength="128" name="~WS-NewPW_input~" value="~WS-NewPW~" class="form-control{WS-NewPW_error} is-invalid{/WS-NewPW_error}" data-container="body" data-toggle="popover" data-placement="top" data-trigger="focus" data-content="Nicht vergessen! Ihr Passwort ist mindestens 8 Zeichen lang und besteht aus einer Buchstaben-Zahlen-Kombination.">
                  </div>
                  ~WS-Fast_Include(Incl-WSLoginPasswordChecker)~
               </div>
               <div class="form-group{WS-PWAgain_error} is-invalid{/WS-PWAgain_error}">
                  <div class="inputLabelFocus" data-placeholder="Passwort wiederholen">
                     <label for="~WS-PWAgain_input~" class="control-label">Passwort wiederholen</label>
                     <div class="input-group">
                        <input type="password" maxlength="128" name="~WS-PWAgain_input~" value="~WS-PWAgain~" class="form-control{WS-PWAgain_error} is-invalid{/WS-PWAgain_error}" data-container="body" data-toggle="popover" data-placement="top" data-trigger="focus" data-content="Ihr Passwort sollte mindestens 8 Zeichen lang sein und aus einer Buchstaben-Zahlen-Kombination bestehen.">
                        <div class="input-group-append">
                           <button type="submit" onclick="return ws_AJAXsendFormTemplate('~DC-FPQuickloginID~', '~WS-CharSet~', ws_AJAXSendLoginForSubProductStart, ws_AJAXSendLoginForSubProductError, 'ws_AJAXSendLoginForSubProductResponseSuccess()', 'ws_AJAXSendLoginForSubProductResponseError()');"><b>Submit</b></button>
                        </div>
                     </div>
                  </div>
               </div>
            </form>
         {/DC-SPSubscriptionProdIndex}
      {/DC-FPSubReferal}
   {/!WS-OTP1(NewUserSubscription)}
{/!WS-OTP1(NewUser)}					
...

Referenz: FORM-CombinedLogin

Referenz: FORM-LoginNewUser

Nach erfolgreichem Login oder Neu-Registrierung wird der Käufer automatisch auf die Seite ws_user_account.htm weiterleitet.

Schritt 9: Template der Kundenkontoübersichtsseite (ws_user_account.htm) anpassen

Auf dieser Seite wird eine Verlinkung auf die Abo-Produkt-Seite angezeigt. Ebenso kann ein Neukunde hier seine Rechnungsadresse eingeben, die zum Abschluss des Abonnements benötigt wird.

Fügen Sie auf der Seite des Kundenkontos einen Link ein, um auf die Detailansicht des Abo-Produkts zurückzukehren.

<!-- OTP-Parameter, um zum Abo-Produkt zurückzunavigieren -->
{WS-OTPSubscriptionProdIndex}~DC-SPSubscriptionProdIndex_set($WS-OTPSubscriptionProdIndex$)~ ~DC-FPSubReferal_set(true)~{/WS-OTPSubscriptionProdIndex}
 
{DC-FPSubReferal}
   {DC-SPSubscriptionProdIndex}
      <a href="~PR-Link($WS-OTPSubscriptionProdIndex$)~">Zurück zum Abo-Produkt</a>
   {/DC-SPSubscriptionProdIndex}
{/DC-FPSubReferal}

 

Schritt 10: Template der Verwaltungsseite der Rechnungsadresse im Kundenkonto (ws_address_manage.htm) anpassen

Ergänzen Sie das Template ws_address_manage.htm innerhalb des {A-Edit}-Bereichs mit den versteckten OTP-Parametern und den Links zurück auf die Abo-Übersicht und die Abo-Produktseite.

{A-Edit}
   ...
   {WS-OTPEditFromSubscription(yes)}<input type="hidden" name="otpeditfromsubscription" value="yes">{/WS-OTPEditFromSubscription(yes)}
   {WS-OTPSubscriptionProdIndex}<input type="hidden" name="otpsubscriptionprodindex" value="~WS-OTPSubscriptionProdIndex~">{/WS-OTPSubscriptionProdIndex}
 
   <!-- Zurück-Verlinkungen -->
   {WS-OTPEditFromSubscription(yes)}
      <a href="~WS-Link~&act=subscription">zurück zur Abonnement-Übersicht</a>
   {/WS-OTPEditFromSubscription(yes)}
   {WS-OTPSubscriptionProdIndex}
      <a href="~PR-Link($WS-OTPSubscriptionProdIndex$)~&otpdetailview=yes">zurück zum Abo-Produkt</a>
   {/WS-OTPSubscriptionProdIndex}
   ...
{/A-Edit}

 

Schritt 11: Template für die Verwaltung der Bankdaten (ws_bank_manage.htm) anpassen

Ergänzen Sie folgenden Code auf dem Template für die Verwaltung der Bankdaten (ws_bank_manage.htm):

...
~DC-FPSubReferal_reset~
{WS-OTPSubscriptionProdIndex}~DC-SPSubscriptionProdIndex_set($WS-OTPSubscriptionProdIndex$)~ ~DC-FPSubReferal_set(true)~{/WS-OTPSubscriptionProdIndex}
   
{WS-OTPEditFromSubscription(yes)}
   <a href="~WS-Link~&act=subscription&otpbankdata=yes">Zurück zum Abo-Produkt</a>
   {!DC-FPSubReferal}
      {!BANK-Edit}
         {Bank-NewBankLink}
            <a href="~Bank-NewBankLink~&otpeditfromsubscription=yes">Neue Bankverbindung anlegen</a>
         {/Bank-NewBankLink}
      {/!BANK-Edit}
   {/!DC-FPSubReferal}        
{/WS-OTPEditFromSubscription(yes)}  

<!-- Wenn man von der Produktseite via Abo-Übersicht navigiert hat, nicht direkt von ws_subscription_manage.htm -->
{DC-FPSubReferal}
   {DC-SPSubscriptionProdIndex}
      <a href="~PR-Link($WS-OTPSubscriptionProdIndex$)~&otpdetailview=yes">Zurück zum Abo-Produkt</a>
   {/DC-SPSubscriptionProdIndex}
   {!BANK-Edit}
      {Bank-NewBankLink}
         <a href="~Bank-NewBankLink~{WS-OTPSubscriptionProdIndex}&otpsubscriptionprodindex=~WS-OTPSubscriptionProdIndex~{/WS-OTPSubscriptionProdIndex}&otpeditfromsubscription=yes">Neue Bankverbindung anlegen</a>
      {/Bank-NewBankLink}
   {/!BANK-Edit}                    
{/DC-FPSubReferal}

...
{ST-Ajax}<WS-Ajax-bankManageContent>{/ST-Ajax}
   {Bank-Overview}
      {!WS-OTPEditFromSubscription(yes)}
         {!DC-FPSubReferal}
            {Bank-NewBankLink}
               <a href="~Bank-NewBankLink~">Neue Bankverbindung anlegen</a>
            {/Bank-NewBankLink}
         {/!DC-FPSubReferal}
      {/!WS-OTPEditFromSubscription(yes)}

      ...
      {Bank-Data}
         {@Bank-Data}
            {Bank-UserDescr}~Bank-UserDescr~{/Bank-UserDescr}
            {!Bank-UserDescr}
               {BANK-SEPAMode}~Bank-IBAN~{/BANK-SEPAMode}
            {/!Bank-UserDescr}

            ~WS-Fast_Include(Incl-Banks)~
            {!WS-OTPEditFromSubscription(yes)}
               {!DC-FPSubReferal}
                  <a href="~BANK-EditLink~">bearbeiten</a>
                  <a href="~Bank-DeleteBankConfirm~" data-modal-target="#modal-info" data-modal-target-body="#modal-info">löschen</a>
               {/!DC-FPSubReferal}
            {/!WS-OTPEditFromSubscription(yes)}
            {WS-OTPEditFromSubscription(yes)}
               {DC-FPSubReferal}
                  {DC-SPSubscriptionProdIndex}
                     <a href="~BANK-EditLink~{WS-OTPSubscriptionProdIndex}&otpsubscriptionprodindex=~WS-OTPSubscriptionProdIndex~{/WS-OTPSubscriptionProdIndex}&otpeditfromsubscription=yes">bearbeiten</a>
                     <a href="~Bank-DeleteBankConfirm~{WS-OTPSubscriptionProdIndex}&otpsubscriptionprodindex=~WS-OTPSubscriptionProdIndex~{/WS-OTPSubscriptionProdIndex}&otpeditfromsubscription=yes" data-modal-target="#modal-info" data-modal-target-body="#modal-info">löschen</a>
                  {/DC-SPSubscriptionProdIndex}
               {/DC-FPSubReferal}
               {!DC-FPSubReferal}
                  <a href="~BANK-EditLink~&otpeditfromsubscription=yes">bearbeiten</a>
                  <a href="~Bank-DeleteBankConfirm~&otpeditfromsubscription=yes" data-modal-target="#modal-info" data-modal-target-body="#modal-info">löschen</a>
               {/!DC-FPSubReferal}
            {/WS-OTPEditFromSubscription(yes)}
         {/@Bank-Data}
      {/Bank-Data}
   {/Bank-Overview}
   
   {BANK-Edit}
      <form action="~FORM-BankManage~" method="POST">
         {MSG-Bank_Notify}
            ~MSG-Bank_Notify~
            
            <!-- beim Speichern einer Bankverbindung wird eine Weiterleitung zur Abo-Übersicht oder Produktseite ausgeführt -->
            {BANK-SavedIndex}
               {WS-OTPSubscriptionProdIndex}
                  <meta http-equiv="refresh" content="0; url='~WS-LoadTpl(ws_subscription_manage.htm)~~WS-EnsureNextLinkContainsURLParams~&otpnewbankdata=true{WS-OTPSubscriptionProdIndex}&otpsubscriptionprodindex=~WS-OTPSubscriptionProdIndex~{/WS-OTPSubscriptionProdIndex}">
               {/WS-OTPSubscriptionProdIndex}               
               {!WS-OTPSubscriptionProdIndex}
                  {WS-OTPEditFromSubscription(yes)}
                     <meta http-equiv="refresh" content="0; url='~WS-LoadTpl(ws_subscription_manage.htm)~~WS-EnsureNextLinkContainsURLParams~&otpnewbankdata=true{WS-OTPSubscriptionProdIndex}&otpsubscriptionprodindex=~WS-OTPSubscriptionProdIndex~{/WS-OTPSubscriptionProdIndex}">
                  {/WS-OTPEditFromSubscription(yes)}
               {/!WS-OTPSubscriptionProdIndex}
            {/BANK-SavedIndex}
         {/MSG-Bank_Notify}

         {WS-OTPEditFromSubscription(yes)}<input type="hidden" name="otpeditfromsubscription" value="yes">{/WS-OTPEditFromSubscription(yes)}
         {WS-OTPSubscriptionProdIndex}<input type="hidden" name="otpsubscriptionprodindex" value="~WS-OTPSubscriptionProdIndex~">{/WS-OTPSubscriptionProdIndex}

         {BANK-SEPADirectMandateType(2)}
            ...
         {/BANK-SEPADirectMandateType(2)}
         {!BANK-SEPADirectMandateType(2)}
            ...
         {/!BANK-SEPADirectMandateType(2)}

         ~WS-Fast_Include(Incl-BankFieldsInputSEPA)~
         
         <div class="inputLabelFocus{BANK-UserDescr_error} is-invalid{/BANK-UserDescr_error}" data-placeholder="~BANK-UserDescr_text~">
            <label for="~BANK-UserDescr_input~" class="control-label">~BANK-UserDescr_text~</label>
            <input type="text" name="~BANK-UserDescr_input~" maxlength="30" value="~BANK-UserDescr~" class="form-control">
            {BANK-UserDescr_error}<span class="invalid-feedback">~BANK-UserDescr_errortext~</span>{/BANK-UserDescr_error}
         </div>

         {BANK-Mode_Manage}
            {!BANK-SEPADirectMandateType(2)}
               {BT-BankSubmit}
                  <button type="submit" name="~BT-BankSubmit~">speichern</button>
               {/BT-BankSubmit}
            {/!BANK-SEPADirectMandateType(2)}

            {!WS-OTPEditFromSubscription(yes)}
               {!DC-FPSubReferal}
                  <a href="~BANK-OverviewLink~">zurück zur Übersicht der Bankdaten</a>
               {/!DC-FPSubReferal}
            {/!WS-OTPEditFromSubscription(yes)}

            {WS-OTPEditFromSubscription(yes)}
               {DC-FPSubReferal}
                  {DC-SPSubscriptionProdIndex}
                     <a href="~BANK-OverviewLink~{WS-OTPSubscriptionProdIndex}&otpsubscriptionprodindex=~WS-OTPSubscriptionProdIndex~{/WS-OTPSubscriptionProdIndex}&otpeditfromsubscription=yes">zurück zur Übersicht der Bankdaten</a>
                     {/DC-SPSubscriptionProdIndex}
               {/DC-FPSubReferal}
               {!DC-FPSubReferal}
                  <a href="~BANK-OverviewLink~&otpeditfromsubscription=yes">zurück zur Übersicht der Bankdaten</a>
               {/!DC-FPSubReferal}
            {/WS-OTPEditFromSubscription(yes)}
         {/BANK-Mode_Manage}

         {BANK-Mode_Order}
            ...
         {/BANK-Mode_Order}

      </form>
   {/BANK-Edit}
   {BANK-ConfirmDelete}
      {!WS-OTPEditFromSubscription(yes)}
         <a href="~BANK-DeleteBankNoConfirm~">Ja, löschen</a>
      {/!WS-OTPEditFromSubscription(yes)}

      {WS-OTPEditFromSubscription(yes)}
         <a href="~BANK-DeleteBankNoConfirm~&otpeditfromsubscription=yes">Ja, löschen</a>
      {/WS-OTPEditFromSubscription(yes)}
   {/BANK-ConfirmDelete}
{ST-Ajax}</WS-Ajax-bankManageContent>{/ST-Ajax}
...

Referenz: BANK-Tags

 

Haben Sie alle Schritte durchgeführt, ist die Funktion "Abo-Modul" vollständig integriert und kann getestet/eingesetzt werden.

 

Rabatt gewähren auf Abo-Bestellung (optional)

Optional können Sie jedem Produkt einen Rabatt zuordnen, wenn es im Abonnement bestellt wird.

Voraussetzung

Der Rabattsatz in Prozent muss im Produktdatenfeld SubscriptionDiscount des Abo-Produkts hinterlegt sein.

Rabatt im Shop anzeigen

Die Klammerung PR-SubscriptionProductType() prüft, ob das Produkt im Abo bestellbar ist. Dabei steht im Argument y für abo-fähig, n für nicht abo-fähig und das b für sowohl als auch.

{PR-SubscriptionProductType(b)}
   Dieses Produkt ist auch im Abonnement bestellbar.
 
   {PR-SubscriptionDiscount}
      Bei Bestellung per Abonnement gewähren wir ~PR-SubscriptionDiscount~ % Rabatt.
      Der Rabatt beträgt absolut: ~PR-SubscriptionDiscountPrice~ ~WS-Currency~
      Der reduzierte Produktpreis im Abo beträgt: ~PR-SubscriptionPrice~ ~WS-Currency~
 
      {PR-SubscriptionDiscountPrice_prec}
         ~WS-SetPrecTagOutput(3)~
         ~PR-SubscriptionDiscountPrice_prec~   <!-- der reduzierte Preis wird mit höherer Präzision ausgegeben -->
      {/PR-SubscriptionDiscountPrice_prec}
 
   {/PR-SubscriptionDiscount}
 
{/PR-SubscriptionProductType(b)}

Referenz: PR-SubscriptionProductType()

Referenz: PR-SubscriptionDiscount

Referenz: PR-SubscriptionDiscountPrice

Referenz: PR-SubscriptionPrice

Referenz: PR-SubscriptionDiscountPrice_prec