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
Pending
?