2015-10-20 21 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> 
相关问题