Question

Le problème de base est le suivant : Nous avons activé la création de factures pour les commandes gratuites (zéro sous-total).Cela fonctionne bien et la facture est créée, sauf que l'e-mail de facture n'est pas envoyé.

Je m'attendais à devoir simplement remplacer la méthode partout où elle est créée, probablement juste pour ajouter un $invoice->sendEmail(), mais j'ai du mal à trouver où cela se trouverait exactement.

Était-ce utile?

La solution

En supposant que vous ayez correctement configuré les adresses e-mail sortantes dans Menu > System > Configuration :Adresses e-mail du magasin :

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

Accédez aux ventes :Onglet E-mails de vente dans la même interface que ci-dessus et développez le menu accordéon Facture :Sales : Sales Emails tab Invoice Email Settings

Vous devrez vous assurer :

  1. Que les e-mails de facturation sont activés
  2. Que vous avez sélectionné une adresse De basée sur celle que vous avez configurée ci-dessus.Cet exemple utilise Sales Representative, mais vous pouvez sélectionner n'importe quelle adresse e-mail correctement configurée.
  3. Qu'un modèle est sélectionné pour les utilisateurs enregistrés (si vous testez les utilisateurs enregistrés)
  4. Qu'un modèle est sélectionné pour les utilisateurs invités (si vous testez les utilisateurs invités)

J'ai pris ces captures d'écran sur CE 1.9.1, mais les paramètres devraient être similaires dans EE.La version de Magento EE que vous utilisez n'utilise pas le nouveau système de file d'attente, donc tant que vous avez correctement configuré ces paramètres et que vous implémentez un observateur personnalisé similaire au code dans ce billet de blog, vos emails de factures doivent être envoyés.

La clé est que votre module personnalisé attache un observateur au sales_order_invoice_save_after événement - une fois la facture enregistrée, vous pouvez interroger le contenu de la facture et envoyer un e-mail.

* NOTES IMPORTANTES *

Si votre objectif est de garantir que cette fonctionnalité est appliquée aux produits téléchargeables dans les factures de paiement sans sous-total, comme elle pourrait l'être pour les produits plus courants, comme @xinqiu noté dans les commentaires, vous devriez probablement attacher votre observateur au sales_order_invoice_save_commit_after événement à la place.

Quand sales_order_invoice_save_after est déclenchée, l'opération d'écriture contenant les détails du lien du produit téléchargeable acheté n'a pas encore été enregistrée dans la base de données, même si d'autres informations sur la commande/facture et d'autres éléments de ligne peuvent l'être.

Bien qu'il s'agisse d'un domaine dans lequel je n'ai aucune expérience directe, je crois comprendre que s'il y a une défaillance au niveau de la base de données et que la transaction est annulée par MySQL, l'URL initialement créée pour le lien unique du produit téléchargeable serait régénérée. par Magento lorsqu'il réessaye l'opération de sauvegarde/validation

En termes plus succincts, on ne peut pas savoir si une URL unique a été conservée en toute sécurité dans la base de données et validée avec succès dans une transaction de base de données jusqu'à ce que sales_order_invoice_save_commit_after l'événement est déclenché (même si d'autres détails de commande de haut niveau ont déjà été validés dans MySQL comme les totaux, le numéro de commande/facture, etc...)

Même si je n'ai pas encore eu l'occasion de l'essayer par moi-même, je n'arrive pas à trouver de faille dans la logique de cette stratégie (même si c'est peut-être l'un des domaines dans lesquels je suis beaucoup moins expérimenté que Je préférerais).Je suppose que vous devriez être en mesure de le confirmer après avoir un peu creusé et expérimenté - en expérimentant brièvement par moi-même, je dois avouer que je pense qu'il pourrait être plus prudent d'utiliser sales_order_invoice_save_commit_after...

... quel que soit le type de produits que vous traitez sur votre boutique Magento... Compte tenu de sa séquence (ultérieure) dans le flux de travail global de commande/facturation de Magento, au minimum, vous sauriez au moins à ce stade que tous les produits pertinents Les détails de la commande et de l'élément de campagne ont été stockés et ont généré une exception quelconque et ont été annulés et réessayés de manière appropriée/ou se comportent comme normalement prévu.

En supposant que vous souhaitiez inclure le lien vers votre produit téléchargeable dans le modèle que vous utilisez pour générer votre e-mail de facture, vous devez modifier le code que j'inclus ci-dessous pour le joindre à sales_order_invoice_save_commit_after ce qui garantira que toutes les informations pertinentes sur la commande et les produits téléchargeables sont enregistrées dans la base de données et engagées dans une transaction (si possible).

Je ne vois pas pourquoi utiliser sales_order_invoice_save_commit_after pourrait introduire d'autres problèmes, mais veuillez noter que je ne l'ai jamais fait moi-même et que le code que je fournis ci-dessous que j'ai utilisé plusieurs fois avec succès, je peux donc me tromper et "Votre kilométrage peut varier".

* NOTES IMPORTANTES *

Le code du module dans cet exemple est assez simple.Par défaut, la fonction d'envoi par e-mail de la facture n'est déclenchée que pour une facture de 0,00 $ lorsque vous cliquez sur le bouton dans l'interface d'administration pour envoyer manuellement un e-mail de la facture au client (elle est automatiquement envoyée si le total < 0).

Le code ci-dessus déclenche la même logique que le bouton, mais est déclenché lorsque l'événement déclenche l'observateur.La solution se compose de 3 éléments de base :

Module config.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>

Code observateur :

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;
}

}

Configuration d'activation du module :

<?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>

NOTE:Si la compilation est activée, vous devrez la désactiver/recompiler après avoir déployé votre personnalisation pour qu'elle soit exécutée, ou vous pourriez avoir une erreur comme:

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top