Где создаются кассовые счета с нулевой промежуточной суммой?
-
12-12-2019 - |
Вопрос
Основная проблема заключается в следующем: Мы включили создание счетов для бесплатных заказов (нулевой промежуточный итог).Это работает нормально, и счет создается, за исключением того, что электронное письмо со счетом не отправляется.
Я ожидал, что мне просто нужно будет переопределить метод, где бы он ни был создан, возможно, просто для того, чтобы добавить $invoice->sendEmail()
, но мне трудно найти, где именно это будет.
Решение
Предполагая, что вы правильно настроили адреса исходящей электронной почты в Menu > System > Configuration
:Адреса электронной почты магазинов:
System > Configuration : Store Email Addresses Configuration">
Перейдите в раздел «Продажи»:Вкладка «Письма о продажах» в том же интерфейсе, что и выше, и разверните меню «Счет-аккордеон»:
Вам необходимо убедиться:
- Электронная рассылка счетов включена
- Что вы выбрали адрес отправителя на основе того, который вы настроили выше.В этом примере используется торговый представитель, но вы можете выбрать любой правильно настроенный адрес электронной почты.
- Что шаблон выбран для зарегистрированных пользователей (если вы тестируете зарегистрированных пользователей)
- Что шаблон выбран для гостевых пользователей (если вы тестируете гостевых пользователей).
Эти скриншоты я сделал на 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