Frage

Das Grundproblem ist Folgendes: Wir haben die Erstellung von Rechnungen für kostenlose Bestellungen (keine Zwischensumme) aktiviert.Dies funktioniert einwandfrei und die Rechnung wird erstellt, außer dass die Rechnungs-E-Mail nicht gesendet wird.

Ich habe erwartet, dass ich die Methode nur überschreiben muss, wo immer sie erstellt wird, wahrscheinlich nur, um eine hinzuzufügen $invoice->sendEmail(), aber ich habe Probleme zu finden, wo genau das wäre.

War es hilfreich?

Lösung

Angenommen, Sie haben die ausgehenden E-Mail-Adressen ordnungsgemäß in eingerichtet Menu > System > Configuration :E-Mail-Adressen speichern :

Menu  loading= System > Configuration : Store Email Addresses Configuration">

Zu den Verkäufen blättern :Registerkarte Verkaufs-E-Mails in derselben Benutzeroberfläche wie oben und erweitern Sie das Rechnungsakkordeon-Menü:Sales : Sales Emails tab Invoice Email Settings

Sie müssen sicherstellen :

  1. Dass Rechnungs-E-Mails aktiviert sind
  2. Dass Sie eine Absenderadresse ausgewählt haben, die auf der oben konfigurierten basiert.In diesem Beispiel wird ein Vertriebsmitarbeiter verwendet, Sie können jedoch eine beliebige ordnungsgemäß konfigurierte E-Mail-Adresse auswählen.
  3. Dass eine Vorlage für registrierte Benutzer ausgewählt ist (wenn Sie registrierte Benutzer testen)
  4. Dass eine Vorlage für Gastbenutzer ausgewählt ist (wenn Sie Gastbenutzer testen)

Ich habe diese Screenshots auf CE 1.9.1 gemacht, aber die Einstellungen sollten in EE ähnlich sein.Die von Ihnen verwendete Version von Magento EE verwendet das neue Warteschlangensystem nicht, sofern Sie diese Einstellungen ordnungsgemäß konfiguriert haben und einen benutzerdefinierten Beobachter implementieren ähnlich dem Code in diesem Blog-Beitrag, sollten Ihre Rechnungs-E-Mails gesendet werden.

Der Schlüssel ist, dass Ihr benutzerdefiniertes Modul einen Beobachter an das anhängt sales_order_invoice_save_after ereignis - Nachdem die Rechnung gespeichert wurde, können Sie den Inhalt der Rechnung abfragen und eine E-Mail auslösen.

* WICHTIGE HINWEISE *

Wenn Sie sicherstellen möchten, dass diese Funktionalität auf herunterladbare Produkte in den Null-Zwischensummen-Checkout-Rechnungen angewendet wird, wie dies bei reguläreren Produkten der Fall sein könnte, wie @xinqiu in den Kommentaren vermerkt, sollten Sie wahrscheinlich Ihren Beobachter an die anhängen sales_order_invoice_save_commit_after ereignis statt.

Wenn sales_order_invoice_save_after ausgelöst wird, wurde der Schreibvorgang mit den Details des gekauften herunterladbaren Produktlinks noch nicht in der Datenbank gespeichert, obwohl möglicherweise andere Bestell-/Rechnungs- und andere Werbebuchungsinformationen vorhanden waren.

Obwohl dies ein Bereich ist, in dem ich keine direkte Erfahrung habe, verstehe ich, dass bei einem Fehler auf Datenbankebene und einem Rollback der Transaktion durch MySQL die URL, die ursprünglich für den eindeutigen Link zum herunterladbaren Produkt erstellt wurde, neu generiert wird von Magento, wenn der Speicher- / Festschreibungsvorgang wiederholt wird

Kurz gesagt, man kann nicht wissen, dass eindeutige URLs sicher in der Datenbank gespeichert und erfolgreich in einer DB-Transaktion festgeschrieben wurden, bis die sales_order_invoice_save_commit_after ereignis wird ausgelöst (auch wenn in MySQL bereits andere übergeordnete Bestelldetails wie Summen, Bestell- / Rechnungsnummer usw. festgeschrieben wurden...)

Obwohl ich noch keine Gelegenheit hatte, es selbst auszuprobieren, kann ich anscheinend keinen Fehler in der Logik dieser Strategie finden (obwohl dies möglicherweise einer der Bereiche ist, in denen ich viel weniger erfahren bin als ich würde es vorziehen).Ich vermute, Sie sollten das nach einigem Stöbern und Experimentieren bestätigen können - wenn Sie kurz alleine experimentieren, muss ich gestehen, dass ich der Meinung bin, dass es klüger sein könnte, es zu verwenden sales_order_invoice_save_commit_after...

...egal mit welchen Produkten Sie es in Ihrem Magento-Shop zu tun haben...In Anbetracht der (späteren) Reihenfolge im gesamten Magento-Bestell- / Rechnungsworkflow würden Sie zumindest zu diesem Zeitpunkt wissen, dass alle relevanten Bestell- und Werbebuchungsdetails gespeichert und entweder eine Ausnahme generiert und entsprechend zurückgesetzt wurden und erneut versucht / oder es verhält sich wie erwartet.

Angenommen, Sie möchten den Link zu Ihrem herunterladbaren Produkt in die Vorlage aufnehmen, die Sie zum Generieren Ihrer Rechnungs-E-Mail verwenden, sollten Sie den unten angegebenen Code ändern, um ihn anzuhängen sales_order_invoice_save_commit_after dadurch wird sichergestellt, dass alle relevanten Informationen über die Bestellung und alle herunterladbaren Produkte in der Datenbank gespeichert und (wenn möglich) in einer Transaktion festgeschrieben werden.

Ich kann nicht verstehen, warum ich benutze sales_order_invoice_save_commit_after könnte andere Probleme mit sich bringen, bitte beachten Sie jedoch die Einschränkung, dass ich dies selbst noch nie getan habe, und den unten angegebenen Code, den ich einige Male erfolgreich verwendet habe, sodass ich mich möglicherweise irre und "Ihr Kilometerstand kann variieren."

* WICHTIGE HINWEISE *

Der Modulcode in diesem Beispiel ist ziemlich einfach.Standardmäßig wird die Funktion Rechnungs-E-Mail senden nur für eine Rechnung im Wert von 0,00 USD ausgelöst, wenn Sie auf die Schaltfläche in der Administrationsoberfläche klicken, um manuell eine E-Mail mit der Rechnung an den Kunden zu senden (sie wird automatisch gesendet, wenn der Gesamtbetrag < 0).

Der obige Code löst dieselbe Logik wie die Schaltfläche aus, wird jedoch ausgelöst, wenn das Ereignis den Beobachter auslöst.Die Lösung besteht aus 3 Grundkomponenten :

Modulkonfiguration.XML :

<config>
  <modules>
    <Havsund_Autoorder>
      <version>1.0.0</version>
    </Havsund_Autoorder>
  </modules>
  <global>
  <events>
    <sales_order_invoice_save_after>
      <observers>
        <havsund_autoorder_observer>
          <type>singleton</type>
          <class>Havsund_Autoorder_Model_Observer</class>
          <method>automaticallyInvoiceShipCompleteOrder</method>
        </havsund_autoorder_observer>
       </observers>
     </sales_order_invoice_save_after>
    </events>
  </global>
</config>

Beobachtercode :

class Havsund_Autoorder_Model_Observer
{

/* @var Magento_Sales_Model_Order_Invoice */
var $_invoice;

/**
* Mage::dispatchEvent($this->_eventPrefix.'_save_after', $this->_getEventData());
* protected $_eventPrefix = 'sales_order';
* protected $_eventObject = 'order';
* event: sales_order_save_after
*/
public function automaticallyInvoiceShipCompleteOrder($observer)
{
   try {
      /* @var $order Magento_Sales_Model_Order_Invoice */
      $this->_invoice = $observer->getEvent()->getInvoice();
      $this->_invoice->sendEmail();

   } catch (Mage_Core_Exception $e) {
       Mage::log("HAVSUND AUTOORDER: Fehler #58 " . $e->getMessage());
   }

   return $this;
}

}

Modulaktivierungskonfiguration :

<?xml version="1.0"?>
  <config>
    <modules>
      <Havsund_Autoorder>
        <active>true</active>
        <version>1.0.0</version>
        <codePool>local</codePool>
        <depends>
        </depends>
      </Havsund_Autoorder>
    </modules>
   </config>

BEACHTEN:Wenn Sie die Kompilierung aktiviert haben, müssen Sie sie nach der Bereitstellung Ihrer Anpassung deaktivieren / neu kompilieren, damit sie ausgeführt werden kann, oder möglicherweise wird eine Fehlermeldung angezeigt wie:

Warning: get_class() expects parameter 1 to be object, boolean given in /app/code/core/Mage/Core/Model/App.php on line 1340

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange
scroll top