4

私の Magento モジュールの 1 つで、「すべての注文が支払い済として定義されています」というイベントをキャッチする必要があります。そのため、関連付けられているイベントは sales_order_payment_pay であることがわかりました。わかりました、私のニーズに完全に合っているようです。

私はマーチャントではなく Magento の開発者であり、今のところ、Magento インスタンスをオンラインで本番環境に置いたことはありません。そのため、支払いワークフローは私にとってかなり暗いです。テスト中、支払い方法として「小切手/マネーオーダー」を選択していました。

問題は次のとおりです。このイベント (sales_order_payment_pay) をキャッチする必要がありますが、それをトリガーできず、オブザーバー関数に入力できないようです。現在、小切手/マネーオーダーとクレジットカードの2つの支払い方法があります。最初のものについては、マーチャントはバックエンドで支払いを検証する必要があり、それは彼が請求書を作成する瞬間です. だから私はそれを試しましたが、イベントは決してトリガーされません。2 番目の場合は、より困難です。私は開発モードにいるため、クレジット カードによる支払いを検証する方法がわかりません。Magento でのテストを許可している MasterCard オンラインの番号を見つけましたが、バックエンドでは、支払われた合計金額はまだゼロです。そのため、注文を送信した後、イベントはトリガーされず (非常に論理的なようです)、請求書を作成してもイベントはトリガーされません。

支払いプロセスをもう少し理解し、支払い済みの注文を把握するのを手伝ってもらえますか? それに関する情報やドキュメントが見つかりません。

PS : 私のモジュールの目的は、イベントの注文または支払いの支払いをキャッチし、データ エクスポート用の XML ファイルを生成することです。場所順の最初のものはすでに開発されています。

4

2 に答える 2

0

私は次のように使用します:

1 - アプリ/コード/場所/パッケージ名/モジュール名/etc/config.xml

<config>
<global>
    <models>
        <sales>
            <rewrite>
                <order>Packagename_Modulename_Model_Rewrite_Order</order>
            </rewrite>
        </sales>
        <sales_resource>
            <rewrite>
                <quote>Packagename_Modulename_Model_Rewrite_Resource_Sales_Quote</quote>
            </rewrite>
        </sales_resource>
        <modelrewrite>
            <class>Packagename_Modulename_Model_Rewrite</class>
        </modelrewrite>
    </models>        
    <events>
        <packagename_modulename_order_status_change>
            <observers>
                <packagename_modulename_model_rewrite>
                    <type>singleton</type>
                    <class>modelrewrite/observer</class>
                    <method>changeStateOrder</method>
                </packagename_modulename_model_rewrite>
            </observers>
        </packagename_modulename_order_status_change>
    </events>        
     <resources>
        <modulename_setup>
            <setup>
                <module>Packagename_Modulename</module>
                 <class>Mage_Sales_Model_Resource_Setup</class>
            </setup>
            <connection>
            <use>core_setup</use>
            </connection>
        </modulename_setup>
    </resources>        
</global>
  <crontab>
    <!-- here I am listing only major routines  -->
    <jobs>        
        <Packagename_Modulename_Model_Rewrite_SendOrderToERP>
            <schedule>
                <cron_expr>12 * * * *</cron_expr>
            </schedule>
            <run>
                <model>modelrewrite/observer::runSendOrderToERP</model>
            </run>
        </Packagename_Modulename_Model_Rewrite_SendOrderToERP>            
        <Packagename_Modulename_Model_Rewrite_ReceiveERPStatusOrder>
            <schedule>
                <cron_expr>*/5 * * * *</cron_expr>
            </schedule>
            <run>
                <model>modelrewrite/observer::runReceiveERPStatusOrder</model>
            </run>
        </Packagename_Modulename_Model_Rewrite_ReceiveERPStatusOrder>            
    </jobs>        
</crontab>

2 - アプリ/コード/場所/パッケージ名/モジュール名/モデル/書き換え/Order.php

class Packagename_Modulename_Model_Rewrite_Order extends Mage_Sales_Model_Order{

public function _setState($state, $status = false, $comment = '', $isCustomerNotified = null, $shouldProtectState = false){
    // attempt to set the specified state
    // tenta definir o status especificado
    if ($shouldProtectState) {
        if ($this->isStateProtected($state)) {
            Mage::throwException(
                Mage::helper('sales')->__('The Order State "%s" must not be set manually.', $state)
            );
        }
    }
    $this->setData('state', $state);

    // add status history
    if ($status) {
        if ($status === true) {
            $status = $this->getConfig()->getStateDefaultStatus($state);
        }
        $this->setStatus($status);
        $history = $this->addStatusHistoryComment($comment, false); // no sense to set $status again
        $history->setIsCustomerNotified($isCustomerNotified); // for backwards compatibility
    }

    Mage::dispatchEvent('packagename_modulename_order_status_change', array('order' => $this, 'state' => $state, 'status' => $status, 'comment' => $comment, 'isCustomerNotified' => $isCustomerNotified));              
    Mage::log("Packagename_Modulename_Model_Rewrite_Order Changing order to STATE ".$state." STATUS ".$status);
    return $this;
}

}

3 - アプリ/コード/場所/パッケージ名/モジュール名/モデル/書き換え/Observer.php

class Packagename_modulename_Model_Rewrite_Observer{

public function implementOrderStatus($event){
    $order = $event->getOrder();
    $state = $event->getState();
    $status = $event->getStatus();
    return $this;
} 

public function changeStateOrder($observer){
    Mage::log('changeStateOrder');
    $order = $observer->getEvent()->getOrder();       

    if($order->getStatus() == "processing_paid"){
        $this->autoInvoicing($order);
    }
    else if($order->getStatus() == "processing_shipped"){
        $this->autoShipment($order);
    }

    // use your necessary ifs
    $this->sendTransactionalEmail($order);

    return $this;
}


public function autoShipment(Mage_Sales_Model_Order $order){ 
    //...    
}

public function autoInvoicing(Mage_Sales_Model_Order $order){ 
    //...    
    //return $this;
}

public function sendTransactionalEmail(Mage_Sales_Model_Order $order){

    switch ($order->getStatus()) {            
        case "processing":
            $templateId = 1;                        
            break;
        case "pending_payment":
            $templateId = 0;                        
            break;            
    //...                    
        default:
            $templateId = 0;
            break;
    }        

//...
}


public function runSendOrderToERP($schedule){
     //...
}


public function runReceiveERPStatusOrder($schedule){        
    //...
}

//And much more another methods can be used after change state / status order: refund, calcel, etc
于 2015-02-03T11:11:37.870 に答える