1

我正在由自己的观察员以编程方式为 sales_order_save_after 事件创建发票。

不幸的是,发票立即被标记为已付款。

我怎样才能实现新发票仍处于打开状态并且管理员必须将其设置为已付款状态?

到目前为止我的代码:

$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);
        }
    }
  }
4

2 回答 2

1

主要取决于您的发票将设置为paid或的付款方式设置pending

如果付款方式已指定:

检查以下代码以将发票设置为待处理。

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);
}
于 2015-10-20T18:25:02.120 回答
0

在 urfusion 的答案对我不起作用之后(在我无法使用两个受保护的 $_canCapture(Partial) = true; 行之后),我试图了解有关这两个受保护变量的更多信息。

我在 app/code/core/Mage/Payment/Model/Method/Abstract.php 中找到了它们。由于这个类是抽象的,我不能全局重写它,这可能很好,因为我会干扰其他支付方式。

现在,我只需要为扩展抽象类的支付方式银行转账(app/code/core/Mage/Payment/Model/Method/Banktransfer.php)“创建未付发票”。

我现在做了什么来解决我的问题?

创建我自己的模块来重写类 Mage_Payment_Model_Method_Banktransfer。

在下文中,{MY_COMPANY/NAMESPACE} 是一个占位符,可以替换为您的公司名称或将放置您的模块的其他命名空间名称。

1) 创建文件夹 app/code/local/{MY_COMPANY/NAMESPACE}/Payment/

2) 使用文件 config.xml 创建子文件夹 etc/:

<?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 创建子文件夹 Model/Method/ 以覆盖这两个变量并继承原始类的所有其余部分:

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

4) 通过将 {MY_COMPANY/NAMESPACE}_Payment.xml 添加到 app/etc/modules/ 来激活模块

<?xml version="1.0"?>
<config>
  <modules>
    <{MY_COMPANY/NAMESPACE}_Payment>
      <active>true</active>
      <codePool>local</codePool>
    </{MY_COMPANY/NAMESPACE}_Payment>
  </modules>
</config>
于 2015-10-22T13:00:24.177 回答