2012-01-09 19 views
5

Estoy buscando una forma de enviar programáticamente un correo electrónico al usuario cuando se asigna un número de seguimiento a un pedido. Necesito poder hacer esto programáticamente porque estoy usando una fuente externa para completar la información de seguimiento.Envío de correo electrónico programáticamente cuando se establece el número de seguimiento de envío

Creo que lo que realmente estoy buscando aquí es un desencadenante o evento específico que podría utilizar para activar el correo electrónico que normalmente se enviaría cuando el administrador haga clic en el botón "Enviar información de seguimiento". He revisado el código central y no he podido saber qué acción se está desencadenando realmente cuando se presiona ese botón.

Estamos utilizando un tercero (eBridge) para conectar con nuestras herramientas de ventas. Una vez que una orden ha sido marcada como enviada y se ingresa un número de seguimiento en la herramienta eBridge, se comunicará con magento e ingresará el número de rastreo en la orden. El problema es que no le dice a magento que envíe un correo electrónico para proporcionarle al cliente este número de rastreo recién ingresado. Lo que estoy tratando de hacer es, una vez que la información se pone en funcionamiento, se envía desde un correo electrónico desde el lado de magentos. es posible? Lo que queremos, en pocas palabras, es poder enviar un mensaje de correo electrónico con la información de seguimiento sin tener que entrar manualmente en cada pedido y hacer clic en el botón "Enviar información de seguimiento".

¡Cualquier ayuda o sugerencia sería muy apreciada!

Respuesta

10

Cuando agrega un nuevo envío a un pedido a través del panel de control, puede marcar una casilla para enviar el correo electrónico. Si necesita enviar esto programáticamente, el controlador para el área de administración simplemente llama al método sendEmail en el Mage_Sales_Model_Order_Shipment.

ACTUALIZACIÓN: Si el número de seguimiento está siendo añadiendo al envío a través del método 'estándar', es decir, el método de la API addTrack envío, entonces sería capaz de enganchar en el caso sales_order_shipment_track_save_after. La adición de un observador que hace algo en la línea de ...

public function sendTrackEmail($observer) 
{ 
    $track = $observer->getEvent()->getTrack(); 
    $shipment = $track->getShipment(true); 
    $shipment->sendEmail(); 
} 
+0

Es Hay un oyente/observador específico para cuando se agrega el código de seguimiento a un envío? – Jen

+0

Eso dependería mucho de cómo se agrega el código de seguimiento. –

+0

¿Ayuda decir que el código de seguimiento está en el campo de código de seguimiento real en la información de envío que se acaba de agregar como comentario? – Jen

0

Si quieres un correo electrónico que contiene el seguimiento informationto son enviadas cuando algún programa, por ejemplo, eBridge llama a la API salesOrderShipmentAddTrack V2, también puede ampliar Mage_Sales_Model_Order_Shipment_Api

p.

class PKS_Sales_Model_Order_Shipment_Api extends Mage_Sales_Model_Order_Shipment_Api 
public function addTrack 

al agregar la llamada para enviar el correo electrónico en el bloque de prueba, p.

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

También debe proporcionar una extensión a SOAP V2, p.

class PKS_Sales_Model_Order_Shipment_Api_V2 extends PKS_Sales_Model_Order_Shipment_Api 

incluso si no tiene métodos :)

(ejemplo tiene mi aplicación/código/módulo local/PKS/Ventas, sustituir el nombre de la empresa para la PKS, disculpas re formatear)

aplicación /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> 

Se tardó más tiempo en averiguar cómo escribir la PKS/Ventas/etc/API requerida.xml (ejemplo tiene mi aplicación/código/módulo local/PKS, sustituir el nombre de la empresa para la 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> 

Tenga en cuenta que con este enfoque, y teniendo Sistema> Configuración> Ventas> Los correos electrónicos de venta> Orden y envío correos electrónicos habilitados, su cliente recibirá - un correo electrónico confirmando un nuevo pedido - un segundo correo electrónico para el envío sin número de seguimiento - un tercer correo electrónico para el envío con el número de seguimiento, desde su extensión de API.

He intentado comentando la api.php crear de

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

función, pero ese segundo correo electrónico se pone cada vez enviado.

6

FYI hay una llamada indocumentada API que hace exactamente esto, sendInfo(). No sé en qué versión se agregó esto, por lo que puedo decir que tiene más de un año, tuve que resolver el problema yo mismo y este es uno de los primeros resultados en Google.

Nota: Si va a implementar esto, lo más probable es no desea enviar el correo electrónico a la bandera de la llamada a la API sales_order_shipment.create(), ya que esto dará lugar a dos correos electrónicos de salir por el mismo orden , uno sin un número de seguimiento, y luego uno con él.

addTrack() probablemente ya esté implementado, solo necesita seguirlo inmediatamente con sendInfo().

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

el correo electrónico enviado a cabo es la misma que se podrían obtener haciendo clic en el botón "Enviar información de seguimiento" en el backend de Magento manualmente. Consulte el Magento API para obtener más información sobre addTrack y el uso de la API SOAP en general.

En cuanto a sendInfo(), específicamente, echar un vistazo al código fuente de Magento/app/código/core/Mago/Ventas/modelo/Pedido/Envío/api.php ayuda:

/** 
* 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

Esto es lo que necesito. Muchas gracias! – chuangbo

+0

Eres increíble. – star18bit

Cuestiones relacionadas