Pergunta

O problema básico é este: Habilitamos a criação de faturas para pedidos gratuitos (subtotal zero).Isso funciona bem e a fatura é criada, exceto que o email da fatura não é enviado.

Eu esperava que só precisasse substituir o método onde quer que ele fosse criado, provavelmente apenas para adicionar um $invoice->sendEmail(), mas estou tendo problemas para descobrir onde exatamente isso estaria.

Foi útil?

Solução

Supondo que você tenha configurado os endereços de e-mail de saída corretamente em Menu > System > Configuration :Endereços de e-mail da loja:

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

Navegue até Vendas:Aba Emails de Vendas na mesma interface acima e expanda o menu sanfonado Fatura:Sales : Sales Emails tab Invoice Email Settings

Você precisará garantir:

  1. Que os e-mails de fatura estão ativados
  2. Que você selecionou um endereço De com base naquele configurado acima.Este exemplo usa Representante de Vendas, mas você pode selecionar qualquer endereço de e-mail configurado corretamente.
  3. Que um modelo seja selecionado para usuários registrados (se você estiver testando usuários registrados)
  4. Que um modelo seja selecionado para usuários convidados (se você estiver testando usuários convidados)

Tirei essas capturas de tela no CE 1.9.1, mas as configurações devem ser semelhantes no EE.A versão do Magento EE que você está usando não utiliza o novo sistema de filas, desde que você tenha configurado essas configurações corretamente e implemente um observador personalizado semelhante ao código nesta postagem do blog, seus e-mails de fatura deverão ser enviados.

A chave é fazer com que seu módulo personalizado anexe um observador ao sales_order_invoice_save_after evento - após a fatura ser salva, você pode consultar o conteúdo da fatura e enviar um e-mail.

* ANOTAÇÕES IMPORTANTES *

Se o seu objetivo é garantir que essa funcionalidade seja aplicada a produtos para download nas faturas de checkout com subtotal zero, como seria para produtos mais regulares, como @xinqiu anotado nos comentários, você provavelmente deve anexar seu observador ao sales_order_invoice_save_commit_after evento em vez disso.

Quando sales_order_invoice_save_after for acionado, a operação de gravação contendo os detalhes do link do produto adquirido para download ainda não foi salva no banco de dados, mesmo que outras informações de pedido/fatura e outros itens de linha possam ter sido.

Embora esta seja uma área na qual não tenho nenhuma experiência direta, meu entendimento é que se houver alguma falha no nível do banco de dados e a transação for revertida pelo MySQL, o URL que foi originalmente criado para o link exclusivo do produto para download seria regenerado pelo Magento quando ele tenta novamente a operação salvar/confirmar

Dito de forma mais sucinta, não se pode saber se o URL exclusivo foi persistido com segurança no banco de dados e confirmado com sucesso em uma transação de banco de dados até que o sales_order_invoice_save_commit_after é acionado (mesmo que outros detalhes de alto nível do pedido já tenham sido confirmados no MySQL, como totais, número do pedido/fatura, etc...)

Embora ainda não tenha tido a oportunidade de experimentar sozinho, não consigo encontrar uma falha na lógica dessa estratégia (embora esta possa ser uma das áreas em que tenho muito menos experiência do que Eu preferiria).Suponho que você deve ser capaz de confirmar isso depois de pesquisar um pouco e experimentar - ao experimentar brevemente por conta própria, devo confessar que acho que pode ser mais prudente usar sales_order_invoice_save_commit_after...

... não importa com que tipo de produtos você está lidando em sua Loja Magento ... Dada a sua sequência (posterior) no fluxo de trabalho geral de pedidos/faturamento do Magento, no mínimo você saberia neste ponto que todos relevantes os detalhes do pedido e do item de linha foram armazenados e geraram algum tipo de exceção e foram adequadamente revertidos e tentados novamente/ou se comportaram normalmente como esperado.

Supondo que você queira incluir o link para seu produto para download no modelo que está usando para gerar seu e-mail de fatura, você deve modificar o código que incluo abaixo para anexar ao sales_order_invoice_save_commit_after o que garantirá que todas as informações relevantes sobre o pedido e quaisquer produtos para download sejam salvas no banco de dados e confirmadas em uma transação (se possível).

Não consigo ver por que usar sales_order_invoice_save_commit_after pode apresentar quaisquer outros problemas, mas observe a ressalva de que eu nunca fiz isso e o código que forneço abaixo, usei vários com sucesso algumas vezes, então posso estar errado e "Sua milhagem pode variar".

* ANOTAÇÕES IMPORTANTES *

O código do módulo nesse exemplo é bastante simples.Por padrão, a função de envio de e-mail de fatura só é acionada para fatura de $ 0,00 quando você clica no botão na interface Admin para enviar manualmente um e-mail da fatura ao cliente (é enviado automaticamente se o total for < 0).

O código acima aciona a mesma lógica do botão, mas é acionado quando o evento aciona o observador.A solução consiste em 3 componentes básicos:

Módulo 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>

Código do observador:

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

}

Configuração de ativação do módulo:

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

OBSERVAÇÃO:Se você tiver a compilação habilitada, você terá que desabilitar/recompilar depois de implantar sua customização para que ela seja executada, ou você pode receber um erro como:

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a magento.stackexchange
scroll top