Программно отправлять электронную почту, когда установлен номер отслеживания доставки - PullRequest
5 голосов
/ 09 января 2012

Я ищу способ программно отправить электронное письмо пользователю, когда для заказа назначен номер для отслеживания. Мне нужно сделать это программно, потому что я использую внешний источник для заполнения информации отслеживания.

Полагаю, что я действительно ищу здесь, это конкретный триггер или событие, которое я мог бы использовать для отключения электронной почты, которая обычно отправлялась, когда администратор нажимал кнопку «Отправить информацию отслеживания». Я пролистал основной код и не смог понять, какое действие в действительности происходит при нажатии этой кнопки.

Мы используем стороннюю компанию (eBridge) для связи с нашими инструментами продаж. После того, как заказ был помечен как отгруженный и введен номер отслеживания в инструмент eBridge, он свяжется с magento и введет номер отслеживания в заказ. Проблема в том, что он не сообщает magento, чтобы он отправлял клиенту этот недавно введенный номер отслеживания. Что я пытаюсь сделать, так это, как только информация помещается в magento, отправляет электронное письмо со стороны magentos Это возможно? Короче говоря, мы хотим, чтобы magento отправлял электронное письмо с информацией об отслеживании без необходимости вручную переходить к каждому заказу и нажимать кнопку «Отправить информацию об отслеживании».

Ответы [ 3 ]

10 голосов
/ 09 января 2012

Когда вы добавляете новую отправку к заказу через панель управления, вы можете поставить галочку для отправки электронного письма.Если вам нужно отправить это программно, контроллер для области администрирования просто вызывает метод sendEmail для Mage_Sales_Model_Order_Shipment.

ОБНОВЛЕНИЕ: Если номер отслеживания добавляется котгрузка через «стандартный» метод, то есть метод addTrack API отгрузки, тогда вы сможете подключиться к событию sales_order_shipment_track_save_after.Добавление наблюдателя, который делает что-то вроде ...

public function sendTrackEmail($observer)
{
    $track = $observer->getEvent()->getTrack();
    $shipment = $track->getShipment(true);
    $shipment->sendEmail();
}
6 голосов
/ 09 июля 2014

Между прочим, существует недействительный API-вызов *1001*, который делает именно это, sendInfo (). Я не знаю, в какой версии это было добавлено, насколько я могу сказать, что ему больше года, мне просто нужно было решить эту проблему самому, и это один из первых результатов в Google.

Примечание : если вы реализуете это, вы, вероятно, не не хотите отправлять флаг электронной почты на вызов API sales_order_shipment.create (), так как это приведет к двум электронные письма, отправляемые по тому же заказу, один без номера для отслеживания, затем один с ним.

addTrack (), вероятно, уже реализован, вам просто нужно немедленно выполнить sendInfo ().

sales_order_shipment.addTrack(sessionId, shipmentIncrementId, carrier, title, trackNumber)
sales_order_shipment.sendInfo(sessionId, comment)

Отправленное электронное письмо совпадает с тем, которое вы получите, нажав кнопку «Отправить информацию отслеживания» в бэкенде Magento вручную. Обратитесь к Magento API для получения более подробной информации о addTrack и об использовании SOAP API в целом.

Что касается sendInfo (), обратитесь за помощью к исходному коду из magento / app / code / core / Mage / Sales / Model / Order / Shipment / Api.php:

/**
 * Send email with shipment data to customer
 *
 * @param string $shipmentIncrementId
 * @param string $comment
 * @return bool
 */
public function sendInfo($shipmentIncrementId, $comment = '')
{
    /* @var $shipment Mage_Sales_Model_Order_Shipment */
    $shipment = Mage::getModel('sales/order_shipment')->loadByIncrementId($shipmentIncrementId);

    if (!$shipment->getId()) {
        $this->_fault('not_exists');
    }

    try {
        $shipment->sendEmail(true, $comment)
            ->setEmailSent(true)
            ->save();
        $historyItem = Mage::getResourceModel('sales/order_status_history_collection')
            ->getUnnotifiedForInstance($shipment, Mage_Sales_Model_Order_Shipment::HISTORY_ENTITY_NAME);
        if ($historyItem) {
            $historyItem->setIsCustomerNotified(1);
            $historyItem->save();
        }
    } catch (Mage_Core_Exception $e) {
        $this->_fault('data_invalid', $e->getMessage());
    }

    return true;
}
0 голосов
/ 19 декабря 2012

Если вы хотите, чтобы электронное письмо, содержащее информацию об отслеживании, отправлялось, когда какая-либо программа, например, eBridge, вызывает API-интерфейс salesOrderShipmentAddTrack V2, вы также можете расширить Mage_Sales_Model_Order_Shipment_Api

, например,

class PKS_Sales_Model_Order_Shipment_Api extends Mage_Sales_Model_Order_Shipment_Api
public function addTrack

, добавив вызовчтобы отправить электронное письмо в блоке try, например,

try {
        $shipment->save();
        $track->save();
        $shipment->sendEmail(true, '')
            ->setEmailSent(true)
            ->save();  /* added email with null comment */
 }

Вы также должны предоставить расширение для SOAP V2, например

class PKS_Sales_Model_Order_Shipment_Api_V2 extends PKS_Sales_Model_Order_Shipment_Api

, даже если у него нет методов:)

(в примере есть мой app / code / local / PKS / Sales module, подставьте название вашей компании для PKS, извините за форматирование)

app / code / local / PKS / Sales / etc / config.xml

<?xml version="1.0" encoding="UTF-8"?>   
<config>
<modules>
<PKS_Sales>
    <version>4.0.0.0</version>
    <depends>
        <Mage_Sales />
    </depends>
</PKS_Sales>
</modules>
<global>
<models>
<sales>
    <rewrite>
             <order_shipment_api>PKS_Sales_Model_Order_Shipment_Api</order_shipment_api>       
     <order_shipment_api_v2>PKS_Sales_Model_Order_Shipment_Api_V2</order_shipment_api_v2>
          </rewrite>
</sales>
</models>
</global>
</config>

Потребовалось больше времени, чтобы понять, как написать требуемый файл PKS / Sales / etc / api.xml (например, в моем модуле app / code / local / PKS подставьте название вашей компании для PKS)

<config>
<api>
    <resources>
        <sales_order_shipment translate="title" module="PKS_Sales">
            <title>Modified Shipment API</title>
            <model>sales/order_shipment_api</model>
            <acl>sales/order/shipment</acl>
            <methods>
                <addTrack translate="title" module="PKS_Sales">
                    <title>Add new tracking number</title>
                    <acl>sales/order/shipment/track</acl>
                </addTrack>
            </methods>
            <faults module="PKS_Sales">
                <not_exists>
                    <code>100</code>
                    <message>Requested shipment does not exist.</message>
                </not_exists>
                <filters_invalid>
                    <code>101</code>
                    <message>Invalid filters given. Details in error message.</message>
                </filters_invalid>
                <data_invalid>
                    <code>102</code>
                    <message>Invalid data given. Details in error message.</message>
                </data_invalid>
                <order_not_exists>
                    <code>103</code>
                    <message>Requested order does not exist.</message>
                </order_not_exists>
                <track_not_exists>
                    <code>104</code>
                    <message>Requested tracking does not exist.</message>
                </track_not_exists>
                <track_not_deleted>
                    <code>105</code>
                    <message>Tracking not deleted. Details in error message.</message>
                </track_not_deleted>
            </faults>
        </sales_order_shipment>
    </resources>
    <resources_alias>
        <order>sales_order</order>
  <order_shipment>sales_order_shipment</order_shipment>
    </resources_alias>
    <v2>
        <resources_function_prefix>
            <order>salesOrder</order>
      <order_shipment>salesOrderShipment</order_shipment>
        </resources_function_prefix>
    </v2>
    </acl>
</api>
</config>

Обратите внимание, что при таком подходе и с включенной Системой> Конфигурация> Продажи> Электронные письма о продажах> Электронные письма с заказами и отгрузками ваш клиент получит - одно электронное письмо, подтверждающее новый заказ - второе электронное письмо fили отправка без номера отслеживания - третье электронное письмо для отправления с номером отслеживания от вашего расширения API.

Я пытался закомментировать функцию создания Api.php

$shipment->sendEmail($email, ($includeComment ? $comment : ''));

но второе письмо продолжает отправляться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...