事件 - 未在挂单状态上调用观察者

时间:2016-01-06 10:21:53

标签: php magento magento-1.9

config.xml代码

<events>
            <checkout_type_onepage_save_order_after>
                <observers>
                    <checkout_deduct_credit_amount>
                        <type>singleton</type>
                        <class>creditpoint/observer</class>
                        <method>deductCreditAmount</method>
                    </checkout_deduct_credit_amount>
                </observers>
            </checkout_type_onepage_save_order_after>
            <sales_order_save_after>
                <observers>
                    <deposit_creditamount>
                        <type>singleton</type>
                        <class>creditpoint/observer</class>
                        <method>revertCreditPoints</method>
                    </deposit_creditamount>
                </observers>
            </sales_order_save_after>
        </events>

此处设置方法deductCreditAmount,以便在调用revertCreditPoints时扣除用户从其帐户中花费的点数 退款时将这些消费积分退回客户的账户。管理员可以将信用点设置为帐户余额 订单状态为Processing/Complete/Closed时。管理员还可以在退回设置为Yes/No

的订单时恢复已兑换的积分
public function toOptionArray()
    {
        return array(
            array('value' => 'processing', 'label'=>Mage::helper('adminhtml')->__('Processing')),
            array('value' => 'complete', 'label'=>Mage::helper('adminhtml')->__('Complete')),
            array('value' => 'closed', 'label'=>Mage::helper('adminhtml')->__('Closed')),
        );
    }

现在上述情况很有效,但是为了扣除所花费的积分和获得的积分,我为管理员添加了Pending状态。因此,无论何时下订单 点debit/credit无需创建发票或等待订单状态更改为processing即可生效。

但是,在设置为Pending状态后,它只会扣除积分,但不予以记入。

public function toOptionArray()
    {
        return array(
            array('value' => 'new', 'label'=>Mage::helper('adminhtml')->__('Pending')),
            array('value' => 'processing', 'label'=>Mage::helper('adminhtml')->__('Processing')),
            array('value' => 'complete', 'label'=>Mage::helper('adminhtml')->__('Complete')),
            array('value' => 'closed', 'label'=>Mage::helper('adminhtml')->__('Closed')),
        );
    }

Observer.php

<?php

class Namespace_Creditpoint_Model_Observer {

    //this function is used to deduct credit points from customer's account after order is placed
    public function deductCreditAmount(Varien_Event_Observer $observer) {


        $order = $observer->getEvent()->getOrder();
        $orderId = $order->getId();
        $customerId = $order->getCustomerId();
        $datetime = $order->getCreatedAt();

        $pointsRedeem = Mage::getSingleton('core/session')->getData('points_redeem');
        $pointsPrice = Mage::getSingleton('core/session')->getData('points_price');
        $customerCreditPoints = Mage::getSingleton('customer/session')->getCustomer()->getCreditPoint();


        if ($pointsRedeem && $pointsPrice != NULL) {

            //init our model, set data and save
            //deduct redeemed credit points from customer account and revise
            try {

                $revisedCreditPoints = $customerCreditPoints - $pointsRedeem;
                $creditModel = Mage::getSingleton('creditpoint/creditpoint')
                        ->setCustomerId($customerId)
                        ->setOrderId($orderId)
                        ->setAppliedCreditPoint($pointsRedeem)
                        ->setAppliedCreditPointPrice($pointsPrice)
                        ->setCreatedTime($datetime)
                        ->save();

                $customerData = Mage::getSingleton('customer/customer')->load($customerId)->setCreditPoint($revisedCreditPoints)->save();

                //unset credit points data
                Mage::getSingleton('core/session')->unsEstimateCredit();
                Mage::getSingleton('core/session')->unsPointsRedeem();
                Mage::getSingleton('core/session')->unsPointsPrice();
            } catch (Exception $e) {
                Mage::getModel('core/session')->addError($e->getMessage());
            }
        }
    }

    //this function is used to add credit points to customer's account balance.
    public function revertCreditPoints($observer) {

        $order = $observer->getEvent()->getOrder();
        $customerId = $order->getCustomerId();
        $orderStatus = Mage::helper('creditpoint')->getOrderStatus();
        $moduleStatus = Mage::helper('creditpoint')->getModuleStatus();
        $restoreConfig = Mage::helper('creditpoint')->getRestoreConfig();

        $grandTotal = round($order->getGrandTotal());
        $customerEarnedPoints = Mage::helper('creditpoint')->getCreditPointsAwarded($grandTotal);
        $customerCurrentPoints = Mage::getSingleton('customer/customer')->load($order->getCustomerId())->getCreditPoint();
        $customerAppliedPoints = Mage::getSingleton('creditpoint/creditpoint')->load($order->getEntityId(), 'order_id')->getAppliedCreditPoint();


        //check if order status matches configuration order status, order is not closed, can restore points, order is closed and module is active
        if (($order->getState() == $orderStatus && $moduleStatus == 1 && $restoreConfig == 1 && $order->getState() == Mage_Sales_Model_Order::STATE_CLOSED) || ($restoreConfig == 1 && $order->getState() == Mage_Sales_Model_Order::STATE_CLOSED)) {

            try {

                $restoredPoints = ($customerCurrentPoints - $customerEarnedPoints) + $customerAppliedPoints;

                $creditModel = Mage::getSingleton('creditpoint/creditpoint')
                        ->load($order->getId(), 'order_id')
                        ->setOrderRefund($restoreConfig)
                        ->save();

                //set restored customer's points
                $customerData = Mage::getSingleton('customer/customer')->load($order->getCustomerId())
                        ->setCreditPoint($restoredPoints)
                        ->save();
            } catch (Exception $e) {
                Mage::getModel('core/session')->addError($e->getMessage());
            }


            //check if order status matches configuration order status, order is not closed and module is active
        } elseif ($order->getState() == $orderStatus && $moduleStatus == 1) {

            try {

                //check if the order is placed first time OR no credit points applied on this order
                if ($customerAppliedPoints == NULL) {

                    //add earned points to current balance only     
                    $revisedCreditPoints = $customerCurrentPoints + $customerEarnedPoints;

                    $creditModel = Mage::getSingleton('creditpoint/creditpoint')
                            ->load($order->getId(), 'order_id')
                            ->setCustomerId($order->getCustomerId())
                            ->setOrderId($order->getEntityId())
                            ->setEarnedCreditPoint($customerEarnedPoints)
                            ->setCreatedTime($order->getCreatedAt())
                            ->save();

                    //set customer's credit points
                    $customerData = Mage::getSingleton('customer/customer')->load($order->getCustomerId())
                            ->setCreditPoint($revisedCreditPoints)
                            ->save();


                    //check if creditpoints applied on order
                } else {

                    //add earned points to current balance only     
                    $revisedCreditPoints = $customerCurrentPoints + $customerEarnedPoints;

                    $creditModel = Mage::getSingleton('creditpoint/creditpoint')
                            ->load($order->getId(), 'order_id')
                            ->setEarnedCreditPoint($customerEarnedPoints)
                            ->save();

                    //set customer's credit points
                    $customerData = Mage::getSingleton('customer/customer')->load($order->getCustomerId())
                            ->setCreditPoint($revisedCreditPoints)
                            ->save();
                }
            } catch (Exception $e) {
                Mage::getModel('core/session')->addError($e->getMessage());
            }
        }
    }

}

我不希望将默认订单状态从待处理更改为处理,但业务逻辑应处理来自管理员的待处理状态。

如果订单状态设置为来自管理员,则会调用事件sales_order_save_after而不是checkout_type_onepage_save_order_after。无论订单状态如何,用观察者编写的逻辑都将保持不变,但它似乎不适用于Pending

  1. 如果订单状态设置为Pending
  2. ,如何使其正常工作
  3. 事件是否被错误定义,如果是,为什么它适用于 其他订单状态'?

0 个答案:

没有答案