Magento退款以编程方式

时间:2012-07-09 15:32:49

标签: php magento

HY,

我正在尝试以编程方式创建退款:

//get order magento

$orderMagento = Mage::getModel('sales/order')->loadByIncrementId($realOrderIncrementId );
if($orderMagento->getStatus() == Mage_Sales_Model_Order::STATE_CANCELED){
//création de l'avoir
$convertOrder = new Mage_Sales_Model_Convert_Order ();
$creditMemo = $convertOrder->toCreditmemo ( $orderMagento );

$items = $orderMagento->getAllItems ();
$totalQty = 0;

foreach ( $items as $item ) {
  $_eachCreditMemoItem = $convertOrder->itemToCreditmemoItem ( $item );
  $_eachCreditMemoItem->setQty ($item->getQtyInvoiced());
  $_eachCreditMemoItem->register ();
  $creditMemo->addItem ( $_eachCreditMemoItem );
  $totalQty += $item->getQtyInvoiced ();
} 

$creditMemo->refund();
$creditMemo->setTotalQty ( $totalQty );
$orderCreditMemoStatusCode = Mage_Sales_Model_Order::STATE_CLOSED;
$orderCreditMemoStatusComment = '[OK]Remboursement des article : ';
$saveTransaction = Mage::getModel('core/resource_transaction')->addObject ($creditMemo )->addObject ( $orderMagento )->save ();
$orderMagento->addStatusToHistory ( $orderCreditMemoStatusCode, $orderCreditMemoStatusComment, false );
$orderMagento->save ();
}

此代码创建贷记通知单,但所有金额均为空(BaseGrandTotal = 0.00€等等)

问题出在哪里?

谢谢你

1 个答案:

答案 0 :(得分:2)

首先,谢谢你,我开始使用你的代码编程实现creditmemo,而我遇到的问题是信用记忆是在没有产品的情况下创建的。我将分享我的代码,以便您可以使用它。

/*
I think your problem is with the content of the variable data, I'll give you an example:

array(6) {
  ["items"] => array(2) {
    [11] => array(1) {
      ["qty"] => string(6) "2"
    }
    [13] => array(1) {
      ["qty"] => string(1) "0"
    }
  }
  ["do_offline"] => string(1) "1"
  ["comment_text"] => string(0) ""
  ["shipping_amount"] => string(1) "0"
  ["adjustment_positive"] => string(1) "0"
  ["adjustment_negative"] => string(1) "0"
  ["qtys"] => array(2) {
    [11] => int(2)
    [13] => int(0)
  }
}

* /

 /**
 *
 * @param array $dif array that contains my product information with qty and product_id and item_id
 * @param type $info array("order_increment_id" => $order->getIncrementId(), "invoice_id" => $invoiceId);
 * @return type 
 */
protected function creaDevolucio($dif, $info){
    $qtys = array();

    foreach ($dif as $item) {
        if (isset($item['qty'])) {
            $qtys[$item['order_item_id']] = array("qty"=> $item['qty']);
        }
        if (isset($item['back_to_stock'])) {
            $backToStock[$item['order_item_id']] = true;
        }
    }

    $data = array(
        "items" => $qtys,
        "do_offline" => "1",
        "comment_text" => "",
        "shipping_amount" => "0",
        "adjustment_positive" => "0",
        "adjustment_negative" => "0",
    );
    if (!empty($data['comment_text'])) {
        Mage::getSingleton('adminhtml/session')->setCommentText($data['comment_text']);
    }

    try {
        $creditmemo = $this->_initCreditmemo($data, $info);
        if ($creditmemo) {
            if (($creditmemo->getGrandTotal() <=0) && (!$creditmemo->getAllowZeroGrandTotal())) {
                Mage::throwException(
                    $this->__('Credit memo\'s total must be positive.')
                );
            }

            $comment = '';
            if (!empty($data['comment_text'])) {
                $creditmemo->addComment(
                    $data['comment_text'],
                    isset($data['comment_customer_notify']),
                    isset($data['is_visible_on_front'])
                );
                if (isset($data['comment_customer_notify'])) {
                    $comment = $data['comment_text'];
                }
            }

            if (isset($data['do_refund'])) {
                $creditmemo->setRefundRequested(true);
            }
            if (isset($data['do_offline'])) {
                $creditmemo->setOfflineRequested((bool)(int)$data['do_offline']);
            }

            $creditmemo->register();
            if (!empty($data['send_email'])) {
                $creditmemo->setEmailSent(true);
            }

            $creditmemo->getOrder()->setCustomerNoteNotify(!empty($data['send_email']));
            $this->_saveCreditmemo($creditmemo);
            $creditmemo->sendEmail(!empty($data['send_email']), $comment);
            echo '<br>The credit memo has been created.';
            Mage::getSingleton('adminhtml/session')->getCommentText(true);
            return;
        } else {
            //$this->_forward('noRoute');
            //return;
        }
    } catch (Mage_Core_Exception $e) {
        $this->_getSession()->addError($e->getMessage());
        Mage::getSingleton('adminhtml/session')->setFormData($data);
    } catch (Exception $e) {
        Mage::logException($e);
        $this->_getSession()->addError($this->__('Cannot save the credit memo.'));
    }
}

/**
 *
 * @param type $data contains products info to refund
 * @param type $info array("order_increment_id" => $order->getIncrementId(), "invoice_id" => $invoiceId);
 * @param type $update
 * @return boolean 
 */
protected function _initCreditmemo($data, $info, $update = false)
{
    $creditmemo = false;
    $invoice=false;
    $creditmemoId = null;//$this->getRequest()->getParam('creditmemo_id');
    $orderId = $info['order_increment_id'];//$this->getRequest()->getParam('order_id');
    $invoiceId = $data['invoice_id'];
    echo "<br>abans if. OrderId: ".$orderId;
    if ($creditmemoId) {
        $creditmemo = Mage::getModel('sales/order_creditmemo')->load($creditmemoId);
    } elseif ($orderId) {
        $order  = Mage::getModel('sales/order')->loadByIncrementId($orderId);
        if ($invoiceId) {
            $invoice = Mage::getModel('sales/order_invoice')
                ->load($invoiceId)
                ->setOrder($order);
            echo '<br>loaded_invoice_number: '.$invoice->getId();
        }

         if (!$order->canCreditmemo()) {
            echo '<br>cannot create credit memo'; 
            if(!$order->isPaymentReview())
            {
                echo '<br>cannot credit memo Payment is in review'; 
            }
            if(!$order->canUnhold())
            {
                echo '<br>cannot credit memo Order is on hold'; 
            }
            if(abs($order->getTotalPaid()-$order->getTotalRefunded())<.0001)
            {
                echo '<br>cannot credit memo Amount Paid is equal or less than amount refunded'; 
            }
            if($order->getActionFlag('edit') === false)
            {
                echo '<br>cannot credit memo Action Flag of Edit not set'; 
            }
            if ($order->hasForcedCanCreditmemo()) {
                echo '<br>cannot credit memo Can Credit Memo has been forced set'; 
            }
            return false;
        }

        $savedData = array();
        if (isset($data['items'])) {
            $savedData = $data['items'];
        } else {
            $savedData = array();
        }

        $qtys = array();
        $backToStock = array();
        foreach ($savedData as $orderItemId =>$itemData) {
            if (isset($itemData['qty'])) {
                $qtys[$orderItemId] = $itemData['qty'];
            }
            if (isset($itemData['back_to_stock'])) {
                $backToStock[$orderItemId] = true;
            }
        }
        $data['qtys'] = $qtys;

        $service = Mage::getModel('sales/service_order', $order);
        if ($invoice) {
            $creditmemo = $service->prepareInvoiceCreditmemo($invoice, $data);
        } else {
            $creditmemo = $service->prepareCreditmemo($data);
        }

        /**
         * Process back to stock flags
         */
        foreach ($creditmemo->getAllItems() as $creditmemoItem) {
            $orderItem = $creditmemoItem->getOrderItem();
            $parentId = $orderItem->getParentItemId();
            if (isset($backToStock[$orderItem->getId()])) {
                $creditmemoItem->setBackToStock(true);
            } elseif ($orderItem->getParentItem() && isset($backToStock[$parentId]) && $backToStock[$parentId]) {
                $creditmemoItem->setBackToStock(true);
            } elseif (empty($savedData)) {
                $creditmemoItem->setBackToStock(Mage::helper('cataloginventory')->isAutoReturnEnabled());
            } else {
                $creditmemoItem->setBackToStock(false);
            }
        }
    }

    return $creditmemo;
}

/**
 * Save creditmemo and related order, invoice in one transaction
 * @param Mage_Sales_Model_Order_Creditmemo $creditmemo
 */
protected function _saveCreditmemo($creditmemo)
{
    $transactionSave = Mage::getModel('core/resource_transaction')
        ->addObject($creditmemo)
        ->addObject($creditmemo->getOrder());
    if ($creditmemo->getInvoice()) {
        $transactionSave->addObject($creditmemo->getInvoice());
    }
    $transactionSave->save();

    return $this;
}