Где создаются кассовые счета с нулевой промежуточной суммой?

magento.stackexchange https://magento.stackexchange.com//questions/64738

  •  12-12-2019
  •  | 
  •  

Вопрос

Основная проблема заключается в следующем: Мы включили создание счетов для бесплатных заказов (нулевой промежуточный итог).Это работает нормально, и счет создается, за исключением того, что электронное письмо со счетом не отправляется.

Я ожидал, что мне просто нужно будет переопределить метод, где бы он ни был создан, возможно, просто для того, чтобы добавить $invoice->sendEmail(), но мне трудно найти, где именно это будет.

Это было полезно?

Решение

Предполагая, что вы правильно настроили адреса исходящей электронной почты в Menu > System > Configuration :Адреса электронной почты магазинов:

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

Перейдите в раздел «Продажи»:Вкладка «Письма о продажах» в том же интерфейсе, что и выше, и разверните меню «Счет-аккордеон»:Sales : Sales Emails tab Invoice Email Settings

Вам необходимо убедиться:

  1. Электронная рассылка счетов включена
  2. Что вы выбрали адрес отправителя на основе того, который вы настроили выше.В этом примере используется торговый представитель, но вы можете выбрать любой правильно настроенный адрес электронной почты.
  3. Что шаблон выбран для зарегистрированных пользователей (если вы тестируете зарегистрированных пользователей)
  4. Что шаблон выбран для гостевых пользователей (если вы тестируете гостевых пользователей).

Эти скриншоты я сделал на CE 1.9.1, но в EE настройки должны быть аналогичны.Версия Magento EE, которую вы используете, не использует новую систему очередей, поэтому, если вы правильно настроили эти параметры и реализовали собственный наблюдатель. аналогично коду в этом сообщении блога, ваши электронные письма со счетами должны быть отправлены.

Ключевым моментом является то, чтобы ваш пользовательский модуль прикреплял наблюдателя к sales_order_invoice_save_after событие — после сохранения счета вы можете запросить его содержимое и отправить электронное письмо.

* ВАЖНЫЕ ЗАМЕТКИ *

Если ваша цель состоит в том, чтобы обеспечить применение этой функции к загружаемым продуктам в счетах-фактурах с нулевым промежуточным итогом, как это могло бы быть для более обычных продуктов, как @xinqiu отметил в комментариях, вам, вероятно, следует прикрепить своего наблюдателя к sales_order_invoice_save_commit_after вместо этого событие.

Когда sales_order_invoice_save_after запускается, операция записи, содержащая подробную информацию о приобретенном загружаемом продукте, еще не была сохранена в базе данных, даже если другая информация о заказе/счете и другой позиции была сохранена.

Хотя это область, в которой у меня нет прямого опыта, я понимаю, что если произойдет какой-то сбой на уровне базы данных и MySQL откатит транзакцию, URL-адрес, который изначально был создан для уникальной ссылки на загружаемый продукт, будет восстановлен. Magento, когда он повторяет операцию сохранения/фиксации

Проще говоря, нельзя знать, что уникальный URL-адрес был безопасно сохранен в базе данных и успешно зафиксирован в транзакции БД до тех пор, пока sales_order_invoice_save_commit_after событие запускается (даже если в MySQL уже были зафиксированы другие детали заказа высокого уровня, такие как итоговые суммы, номер заказа/счета и т. д.)

Хотя у меня еще не было возможности попробовать это самостоятельно, я, кажется, не могу найти изъян в логике этой стратегии (хотя, возможно, это одна из областей, в которых я гораздо менее опытен, чем Я бы предпочел).Я предполагаю, что вы сможете подтвердить это, немного покопавшись и поэкспериментировав - если кратко экспериментировать самостоятельно, я должен признаться, что считаю, что было бы более разумно использовать sales_order_invoice_save_commit_after...

...независимо от того, с какими продуктами вы имеете дело в своем магазине Magento... Учитывая (более позднюю) последовательность в общем рабочем процессе заказа/выставления счетов Magento, как минимум на этом этапе вы должны знать, что все соответствующие Сведения о заказе и позиции были сохранены и либо сгенерировали какое-то исключение и были соответствующим образом отброшены и повторены, либо вели себя так, как обычно ожидалось.

Предполагая, что вы хотите включить ссылку на свой загружаемый продукт в шаблон, который вы используете для создания электронного счета-фактуры, вам следует изменить код, который я привожу ниже, чтобы прикрепить к sales_order_invoice_save_commit_after который гарантирует, что вся соответствующая информация о заказе и любых загружаемых продуктах будет сохранена в базе данных и зафиксирована в транзакции (если это возможно).

Я не понимаю, зачем использовать sales_order_invoice_save_commit_after может вызвать какие-либо другие проблемы, однако обратите внимание на оговорку: я никогда не делал этого сам, и код, который я привожу ниже, я несколько раз успешно использовал, поэтому я могу ошибаться и «Ваш пробег может отличаться».

* ВАЖНЫЕ ЗАМЕТКИ *

Код модуля в этом примере довольно прост.По умолчанию функция отправки счета по электронной почте активируется только для счета в размере 0,00 долларов США, когда вы нажимаете кнопку в интерфейсе администратора, чтобы вручную отправить счет по электронной почте клиенту (он отправляется автоматически, если общая сумма < 0).

Приведенный выше код запускает ту же логику, что и кнопка, но срабатывает, когда событие запускает наблюдателя.Решение состоит из 3 основных компонентов:

Конфигурация модуля.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>

Код наблюдателя:

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

}

Конфигурация активации модуля:

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

ПРИМЕЧАНИЕ:Если у вас включена компиляция, вам придется отключить/перекомпилировать после развертывания вашей настройки, чтобы она была выполнена, или вы можете получить ошибку нравиться:

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top