2013-09-17 2 views
2

Я наблюдал за событием «sales_order_invoice_save_after», чтобы экспортировать данные счета и заказа каждый раз, когда администратор создает счет-фактуру в БД на SQL Server. Соединение выполнено успешно. Но неважно, что я делаю, событие всегда срабатывает дважды. У меня два раза сохранены данные в БД. Я пробовал со всем:Событие sales_order_invoice_save_after всегда дважды запускается

1.- Я создал флаг в наблюдателе, используя реестр, и он не работает.

public function exportInvoice(Varien_Event_Observer $observer){ 

    try{ 


    if(Mage::registry('sql_salvado')){ 
     return $this; 
    } 


//My code 


Mage::register('sql_salvado',true,true); 

    }catch(Mage_Core_Exception $e){ 
     Mage::log("No fue posible exportar pedidos a SQL Server " . $e->getMessage()); 
    } 

    return $this; 

2.- Я также создал метод в классе, проверить SQL Server DB, чтобы проверить, если счет-фактура уже зарегистрироваться и если нет, то продолжается с регистрацией или остановить его, но он оленья кожа» т работы. Magento просто запускает это событие два раза.

if($this->_verifyInsertion($order['invoice']) == true){ 
     Mage::log('Invoice ya existe no se va a repetir', null, 'escritura_sql.log'); 
     return $this; 
    }else{ 

Это пример метода:

protected function _verifyInsertion($invoice){ 

    $_servidor = $this->_mssqlhost.':'.$this->_mssqlpuerto.$this->_mssqlinstancia; 
    $link = mssql_connect($_servidor,$this->_mssqlusr,$this->_mssqlpsswd); 

    if (!$link || !mssql_select_db($this->_mssqlbd, $link)) { 
     die('No me pude conectar o seleccionar la BD!'); 
    } 

    $query = mssql_query("SELECT id_order, invoice FROM [order] WHERE invoice LIKE '$invoice'"); 
    $fila = mssql_fetch_object($query); 
    if($fila->invoice == $invoice){ 

     Mage::log("$invoice ya existe no debes repetirte", null, 'escritura_sql.log'); 
     return true; 
    }else{ 
     Mage::log("$invoice no existe, escribelo...", null, 'escritura_sql.log'); 
     return false; 
    } 

3.- Я также попробовать с «sales_order_invoice_save_before» и «sales_order_invoice_register» без успеха. Ничего не работает, Мадженто все еще увольняет это событие два раза.

Я хочу знать, есть ли способ узнать, было ли событие уже запущено, а затем остановить его во второй раз. Может ли кто-нибудь указать мне в правильном направлении?


Кристофер, прежде всего, за вашу любезную помощь.

Вот Config.xml,

<?xml version="1.0"?> 
<config> 
<modules> 
    <Cmm_Qad> 
     <version>0.1.0</version> 
    </Cmm_Qad> 
</modules> 

<global> 
    <models> 
     <qad> 
      <class>Cmm_Qad_Model</class> 
      <resourceModel>qad_mysql4</resourceModel> 
     </qad> 
     <qad_mysql4> 
      <class>Cmm_Qad_Model_Mysql4</class> 
     </qad_mysql4> 
    </models> 
    <events> 
     <sales_order_invoice_save_after> 
      <observers> 
       <cmm_qad_pedidos_exporta> 
        <type>singleton</type> 
        <class>Cmm_Qad_Model_Pedidos_Exporta</class> 
        <method>exportInvoice</method> 
       </cmm_qad_pedidos_exporta> 
      </observers> 
     </sales_order_invoice_save_after> 
    </events> 
    <blocks> 
     <qad> 
      <class>Cmm_Qad_Block</class> 
     </qad> 
    </blocks> 
    <helpers> 
     <qad> 
      <class>Cmm_Qad_Helper</class> 
     </qad> 
    </helpers> 
</global> 

<crontab> 
    <jobs> 
     <cmm_qad_stock> 
      <run> 
       <schedule><cron_expr>*/5 * * * *</cron_expr></schedule> 
       <model>cmm/qad::sincronizaInventario</model> 
      </run> 
     </cmm_qad_stock> 
     <cmm_qad_precios> 
      <run> 
       <schedule><cron_expr>*/5 * * * *</cron_expr></schedule> 
       <model>cmm/qad::sincronizaPrecios</model> 
      </run> 
     </cmm_qad_precios> 
    </jobs> 
</crontab> 

<admin> 
    <routers> 
     <qad> 
      <use>admin</use> 
      <args> 
       <module>Cmm_Qad</module> 
       <frontName>qad</frontName> 
      </args> 
     </qad> 
    </routers> 
</admin> 

<adminhtml> 
    <translate> 
     <modules> 
      <mage_adminhtml> 
       <files> 
        <qad>Cmm_Qad.csv</qad> 
       </files> 
      </mage_adminhtml> 
     </modules> 
    </translate> 

    <menu> 
     <catalog> 
      <children> 
       <qad_adminform translate="title" module="qad"> 
        <title>Sincronizar con QAD</title> 
        <action>qad/adminhtml_qad</action> 
       </qad_adminform> 
      </children> 
     </catalog> 
    </menu> 

    <acl> 
     <resources> 
      <admin> 
       <children> 
        <catalog> 
         <children> 
          <qad_adminform> 
           <title>QAD ERP</title> 
          </qad_adminform> 
         </children> 
        </catalog> 
       </children> 
      </admin> 
     </resources> 
    </acl> 
    <!-- Segunda inserción por configuracion--> 
    <acl> 
     <resources> 
      <all> 
       <title>Allow Everything</title> 
      </all> 
      <admin> 
       <children> 
        <system> 
         <children> 
          <config> 
           <children> 
            <qad> 
             <title>QAD - All</title> 
            </qad> 
           </children> 
          </config> 
         </children> 
        </system> 
       </children> 
      </admin> 
     </resources> 
    </acl> 
    <!-- /Segunda inserción por configuración --> 

    <layout> 
     <updates> 
      <qad> 
       <file>qad.xml</file> 
      </qad> 
     </updates> 
    </layout> 
</adminhtml> 

А вот код выше вставки:

require_once(Mage::getBaseDir('lib'). '/cmm/mssql.php'); 


/** 
* Clase de escritura de Datos a SQL Server para CMM 
*/ 
class Cmm_Qad_Model_Pedidos_Exporta{ 

private static $_conexion; 
private static $_dateCreated; 
private static $_dateUpdated; 
private static $_mssqlhost; 
private static $_mssqlpuerto;  
private static $_mssqlinstancia; 
private static $_mssqlusr; 
private static $_mssqlpsswd; 
private static $_mssqlbd; 

//Variables para valores identitys 
private static $_id_client; 
private static $_id_address; 
private static $_id_order; 
private static $_id_detail; 


/* 
* We open the connection to SQL Server in the constructor 
* 
*/ 
public function __construct(){ 

    ini_set("display_errors",1); 

    $this->_mssqlhost     = Mage::getStoreConfig('qad/qad_group/mssql_host', Mage::app()->getStore()); 
    $this->_mssqlpuerto    = Mage::getStoreConfig('qad/qad_group/mssql_puerto', Mage::app()->getStore()); 
    $this->_mssqlinstancia   = Mage::getStoreConfig('qad/qad_group/mssql_instancia', Mage::app()->getStore()); 
    $this->_mssqlusr     = Mage::getStoreConfig('qad/qad_group/mssql_usr', Mage::app()->getStore()); 
    $this->_mssqlpsswd    = Mage::getStoreConfig('qad/qad_group/mssql_pass', Mage::app()->getStore()); 
    $this->_mssqlbd     = Mage::getStoreConfig('qad/qad_group/mssql_bd', Mage::app()->getStore()); 
    $this->_dateCreated    = Varien_Date::now(); 
    $this->_dateUpdated    = Varien_Date::now(); 

    /* 
    * Open the connection with SQL Server 
    * */ 
    $_servidor      = $this->_mssqlhost.':'.$this->_mssqlpuerto.$this->_mssqlinstancia; 
    $this->_conexion     = new mssqlClass(); 
    $this->_conexion->connect($_servidor,$this->_mssqlusr,$this->_mssqlpsswd); 
    $this->_conexion->select($this->_mssqlbd); 


} 

/** 
* Mage::dispatchEvent($this->_eventPrefix.'_save_after', $this->_getEventData()); 
* protected $_eventPrefix = 'sales_order'; 
* protected $_eventObject = 'order'; 
* event: sales_order_save_after 
*/ 
public function exportInvoice(Varien_Event_Observer $observer){ 

    if(Mage::registry('sql_salvado') == 1){ 

     Mage::unregister('sql_salvado'); 
     return NULL; 
    } 

    $invoice       = $observer->getInvoice(); 
    $pedido       = $invoice->getOrder(); 
    $client       = array(); 
    $client_del_address    = array(); 
    $order       = array(); 
    $order_detail      = array(); 

    /* 
    * Recopilamos los datos 
    */ 

    //Client 
    $client['name']     = $pedido->getCustomerFirstname()." ".$pedido->getCustomerLastname(); 
    $client['type']     = 1; 
    $client['rfc']     = "UWXU8609121O6"; 
    $client['curp']     = "CMM"; 
    $client['email']     = $pedido->getCustomerEmail(); 
    $client['phone']     = $pedido->getCustomerTelephone(); 
    $client['phone2']     = $pedido->getCustomerTelephone(); 
    $client['clave_qad']    = "CLAVEQ"; 
    $client['address']    = $pedido->getBillingAddress()->getStreet(); //Es otro array 
    $client['zipcode']    = $pedido->getBillingAddress()->getPostcode(); 
    $client['colony']     = "Colonia"; 
    $client['country']    = $pedido->getBillingAddress()->getCountry(); 
    $client['id_state']    = 1; 
    $client['id_country']    = 2; 


    //Client_del_address 
    $client_del_address['address'] = $pedido->getShippingAddress()->getStreet(); //Es un array() 
    $client_del_address['zipcode'] = $pedido->getShippingAddress()->getPostcode(); 
    $client_del_address['colony']  = "Colonia"; 
    $client_del_address['country'] = $pedido->getShippingAddress()->getCountry(); 
    $client_del_address['is_state'] = 1; 
    $client_del_address['id_country'] = 2; 


    //Order 
    $order['invoice']     = (int) $invoice->getIncrementId(); 
    $order['status']     = 1; 
    $order['subtotal_notax']   = $invoice->getSubtotal(); 
    $order['subtotal_tax']   = $invoice->getSubtotal() + $invoice->getTaxAmount(); 
    $order['total_tax']    = $invoice->getTaxAmount(); 
    $order['total']     = $invoice->getGrandTotal(); 


    //Se abre la validación del semáforo 
    if($this->_verifyInsertion($order['invoice']) == true){ 
     Mage::log('Invoice ya existe no se va a repetir', null, 'escritura_sql.log'); 
     return NULL; 
    }else{ 
     Mage::log('Invoice es nuevo', null, 'escritura_sql.log'); 

    //Validamos que el cliente exista o no exista. 
    if($this->_existeCliente($client['email']) == true){ 
     Mage::log('El cliente existe', null, 'escritura_sql.log'); 
     if($this->_insertaDirEnvio($client_del_address, $client) == true){ 
//The rest of the code... 

И что я вижу в журнале является то, что этот процесс только работает один раз, на самом деле моя проверка работает, но реестр всегда записывается дважды. Вот пример одного из методов, который делает вставки на DB

/* 
* Inserta clientes 
*/ 

protected function _insertaCliente(array $client){ 
    $sql_client="INSERT INTO [client] (name, type, rfc, curp, email, phone1, phone2, clave_qad, address, zipcode, colony, county, id_state, id_country, date_created, date_updated) VALUES ('".$client['name']."', '".$client['type']."', '".$client['rfc']."', '".$client['curp']."', '".$client['email']."', '".$client['phone1']."', '".$client['phone2']."', '".$client['clave_qad']."', '".$client['address'][0]."', '".$client['zipcode']."', '".$client['colony']."', '".$client['country']."', '".$client['id_state']."', '".$client['id_country']."', '".$this->_dateCreated."', '".$this->_dateUpdated."') SELECT [email protected]@IDENTITY"; 

    if($this->_conexion->query($sql_client)){ 
     $_identity = mssql_fetch_assoc($this->_conexion->query($sql_client)); 
     $this->_id_client = $_identity['LAST_INSERT_ID']; 
     return true; 
    }else{ 
     echo $this->_conexion->getLastErrorMessage()." Inserta Cliente"; 
     return false; 
    } 


} 

Во всех моих вставках я сделать еще один выбор «SELECT LAST_INSERT_ID = @@ IDENTITY», потому что SQL сервер имеет идентификационные данные для автоматического приращения его идентификаторы. Затем я сохраняю эти идентификаторы в других vars (которые я создал в конструкторе) и повторно использовал для последующих вложений, таких счетов-фактур или order_details и т. Д.

СПАСИБО В РАМКАХ ЗА ЛЮБОЙ ВИД ПОМОЩИ !!

ответ

0

Я проверил подпись Мага :: регистр (потому что я не знаю, третий параметр):

public static function register($key, $value, $graceful = false) 

Когда $ изящная устанавливается истина, метод не выбрасывает никаких исключений на всех.

Так попробуйте это (непроверенные):

public function exportInvoice(Varien_Event_Observer $observer){ 

    if(Mage::registry('sql_salvado')){ 
    return $this; 
    } 

    // your code here 

    try{ 
    Mage::register('sql_salvado',true); 
    } catch(Mage_Core_Exception $e){ 
    Mage::log("No fue posible exportar pedidos a SQL Server " . $e->getMessage()); 
    } 

    return $this; 
} 

затем проверить, если этот кусок кода запускается на выполнение, то есть, если config.xml модуля является правильным.

+0

Кристофер, спасибо за помощь. Я стараюсь с вашим решением, но он не работает. Событие все еще стреляет дважды. На данный момент я не знаю, что еще делать = (Я не могу понять, почему в моем собственном журнале я вижу выполнение всего один раз, но в БД я вижу запись, зарегистрированную дважды. –

+0

Важно уточнить, что я есть функция public __construct() {} в моем наблюдателе? –

+0

Хорошо, что уже очищает вещи. Если я правильно понимаю, что exportInvoice выполняется только один раз (согласно Mage :: log()), но у вас все еще есть две записи в db? Возможно, покажите ваш config.xml и остальную часть наблюдателя (прежде всего код вставки sqlserver). –

Смежные вопросы