magento以编程方式创建未付发票

时间:2015-10-20 16:35:03

标签: magento payment invoice bank

我正在通过自己的观察员以编程方式为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);
        }
    }
  }

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:0)

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

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

目前,我只需要为付款方式banktransfer(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>