2015-10-20 53 views
1

我以自己的觀察員爲sales_order_save_after事件以編程方式創建發票。magento以編程方式創建未付發票

不幸的是,發票立即被標記爲已付款。

我該如何實現新發票仍然開放,管理員必須將其設置爲付費狀態?

我迄今爲止代碼:

$invoiceId = Mage::getModel('sales/order_invoice_api') 
        ->create($order->getIncrementId(), array()); 
$invoice = Mage::getModel('sales/order_invoice') 
        ->loadByIncrementId($invoiceId); 
$invoice->capture()->save(); 

編輯: 爲了使我的留言urfusion的回答可以理解的,這裏的代碼片段:

public function order_placed($observer) { 
    $event = $observer->getEvent(); 

    // .... 

    $emailInvoice = false; 
    $captureInvoice = false; 

    $order = Mage::getModel("sales/order")->load($data['entity_id']); 
    if($order->canInvoice() and $order->getIncrementId()) 
    { 
     $invoiceApi = Mage::getModel('sales/order_invoice_api'); 
     $invoiceId = $invoiceApi->create(
           $order->getIncrementId(), 
           array(), 
           Mage::Helper('sales')->__('Pending Invoice created!'), 
           $emailInvoice, 
           false); 

     if($captureInvoice) { 
      $invoiceApi->capture($invoiceId); 
     } 
    } 
    } 

回答

1

主要是取決於付款方式設置您的發票將被設置爲paidpending

如果支付方法已經指定:

檢查用於設定發票未決下面的代碼。

protected $_canCapture     = true; 
protected $_canCapturePartial   = true; 

$emailInvoice = true; 
$captureInvoice = false; 

$invoiceApi = Mage::getModel('sales/order_invoice_api'); 
$invoiceId = $invoiceApi->create(
    $order->getIncrementId(), 
    array(), 
    Mage::helper('sales')->__('Pending Invoice created!'), 
    $emailInvoice, 
    false 
); 

if ($captureInvoice) { 
    $invoiceApi->capture($invoiceId); 
} 
+0

感謝您的回答。將代碼提交給我的觀察員後,我仍然收到掛單但已付款發票。我編輯了我的答案,以顯示一些代碼,因爲我不能接受受保護的變量,因爲我在方法中。但我認爲這只是來自某個地方的示例代碼? magento如何以及​​在哪裏使用受保護的變量? – alexandre

0

後urfusion的答案不是爲我工作(後我不能使用二級保護$ _canCapture(部分)= TRUE;行)我試圖找到更多關於二級保護變量。

我在app/code/core/Mage/Payment/Model/Method/Abstract.php中找到了它們。 由於這個課程是抽象的,我無法在全球重寫,這可能是好的,因爲我會干擾其他支付方式。

現在,我只需要爲擴展抽象類的支付方法banktransfer(app/code/core/Mage/Payment/Model/Method/Banktransfer.php)創建「未付發票」。

我現在做了什麼來解決我的問題?

創建我自己的模塊來重寫類Mage_Payment_Model_Method_Banktransfer。

在下面,{MY_COMPANY/NAMESPACE}是一個佔位符,可以替換爲您的公司名稱或模塊將放置在其中的某個其他名稱空間名稱。

1)創建的文件夾應用程序/代碼/本地/ {MY_COMPANY/NAMESPACE} /付款/

2)創建的子文件夾等/與文件config.xml中:

<?xml version="1.0"?> 
<config> 
    <modules> 
    <{MY_COMPANY/NAMESPACE}_Payment> 
     <version>1.0</version> 
    </{MY_COMPANY/NAMESPACE}_Payment> 
    </modules> 

    <global> 
    <models> 
     <payment> 
     <rewrite> 
      <method_banktransfer>{MY_COMPANY/NAMESPACE}_Payment_Model_Method_Banktransfer</method_banktransfer> 
     </rewrite> 
     </payment> 
    </models> 
    </global> 
</config> 

3)創建的子文件夾型號/方法/與文件Banktransfer.php只覆蓋這兩個變量,inheritate原始類的所有其餘部分:通過添加{MY_COMPANY /命名空間} _Payment.xml

class {MY_COMPANY/NAMESPACE}_Payment_Model_Method_Banktransfer extends Mage_Payment_Model_Method_Banktransfer 
{ 
    protected $_canCapture     = true; 
    protected $_canCapturePartial   = true; 
} 

4)激活模塊到應用程序/ etc/modules/

<?xml version="1.0"?> 
<config> 
    <modules> 
    <{MY_COMPANY/NAMESPACE}_Payment> 
     <active>true</active> 
     <codePool>local</codePool> 
    </{MY_COMPANY/NAMESPACE}_Payment> 
    </modules> 
</config> 
相關問題