小計ゼロのチェックアウト請求書はどこで作成されますか?
-
12-12-2019 - |
質問
基本的な問題は次のとおりです。 無料 (小計ゼロ) の注文に対して請求書の作成が可能になりました。これは正常に機能し、請求書が作成されますが、請求書の電子メールは送信されません。
おそらくメソッドを追加するためだけに、メソッドが作成されたときにそのメソッドをオーバーライドする必要があるだけだと予想していました。 $invoice->sendEmail()
, しかし、これが正確にどこにあるのかを見つけるのに苦労しています。
解決
送信電子メール アドレスが正しく設定されていると仮定します。 Menu > System > Configuration
:ストアの電子メール アドレス:
System > Configuration : Store Email Addresses Configuration">
Sales を参照します。上記と同じインターフェイスの [Sales Emails] タブをクリックし、[Invoice] アコーディオン メニューを展開します。
次のことを確認する必要があります。
- 請求書のメールが有効になっていること
- 上記で構成したものに基づいて送信者アドレスを選択していること。この例では営業担当者を使用していますが、適切に設定された任意の電子メール アドレスを選択できます。
- 登録ユーザーに対してテンプレートが選択されていること (登録ユーザーをテストしている場合)
- テンプレートがゲスト ユーザー用に選択されていること (ゲスト ユーザーをテストしている場合)
これらのスクリーンショットは CE 1.9.1 で撮影しましたが、設定は EE でも同様であるはずです。使用している Magento EE のバージョンは新しいキュー システムを利用していないため、これらの設定を適切に構成し、カスタム オブザーバーを実装している限り、 このブログ投稿のコードに似ています, 、請求書メールが送信されるはずです。
重要なのは、カスタム モジュールにオブザーバーをアタッチさせることです。 sales_order_invoice_save_after
イベント - 請求書が保存された後、請求書の内容をクエリして電子メールを送信できます。
*重要な注意事項*
@xinqiu のように、この機能が通常の製品と同様に、ゼロ小計チェックアウト請求書のダウンロード可能な製品に確実に適用されるようにすることが目標の場合は、 コメントで指摘された, 、おそらくオブザーバーを sales_order_invoice_save_commit_after
代わりにイベント。
いつ sales_order_invoice_save_after
が起動された場合、他の注文/請求書や他の項目情報が保存されている可能性がある場合でも、購入したダウンロード可能な製品リンクの詳細を含む書き込み操作はまだデータベースに保存されていません。
これは私には直接の経験がまったくない分野ですが、データベース レベルで何らかの障害が発生し、トランザクションが MySQL によってロールバックされた場合、固有のダウンロード可能な製品リンク用に最初に作成された URL が再生成されると理解しています。 Magento が保存/コミット操作を再試行するときに
より簡潔に言うと、一意の URL がデータベースに安全に保存され、db トランザクションで正常にコミットされたかどうかは、 sales_order_invoice_save_commit_after
イベントが発生します (合計、注文/請求書番号など、他の高レベルの注文の詳細がすでに MySQL にコミットされている場合でも)
私はまだ自分でそれを試す機会がありませんが、その戦略のロジックに欠陥は見つからないようです(ただし、これはおそらく私が他の人よりはるかに経験が浅い領域の1つである可能性があります)を好む)。少し調べて実験してみると、それが確認できるはずです。自分で簡単に実験してみると、 を使用する方が賢明かもしれないと感じていることを告白しなければなりません。 sales_order_invoice_save_commit_after
...
...Magento ストアでどのような種類の製品を扱っているかに関係なく...Magento の注文/請求ワークフロー全体における (後の) シーケンスを考慮すると、少なくともこの時点で、関連するすべてのことがわかっているはずです。注文と品目の詳細が保存されており、何らかの例外が生成され、適切にロールバックされて再試行されたか、通常どおりに動作していました。
請求書メールの生成に使用しているテンプレートにダウンロード可能な製品へのリンクを含めたい場合は、以下に添付するコードを変更する必要があります。 sales_order_invoice_save_commit_after
これにより、注文およびダウンロード可能な製品に関するすべての関連情報がデータベースに保存され、(可能な場合) トランザクションでコミットされることが保証されます。
なぜ使用するのか分かりません sales_order_invoice_save_commit_after
他の問題が発生する可能性がありますが、私自身はそうしたことは一度もありません。また、以下に提供するコードは何度か成功させたので、間違っている可能性もあり、「走行距離は異なる場合があります。」という点に注意してください。
*重要な注意事項*
この例のモジュール コードは非常に単純です。デフォルトでは、請求書メール送信機能は、管理インターフェースのボタンをクリックして顧客に請求書のメールを手動で送信した場合に、0.00 ドルの請求書に対してのみトリガーされます (合計が 0 未満の場合は自動的に送信されます)。
上記のコードはボタンと同じロジックを起動しますが、イベントがオブザーバーをトリガーするときにトリガーされます。解決策は 3 つの基本コンポーネントです。
モジュール config.xml :
<config>
<modules>
<Havsund_Autoorder>
<version>1.0.0</version>
</Havsund_Autoorder>
</modules>
<global>
<events>
<sales_order_invoice_save_after>
<observers>
<havsund_autoorder_observer>
<type>singleton</type>
<class>Havsund_Autoorder_Model_Observer</class>
<method>automaticallyInvoiceShipCompleteOrder</method>
</havsund_autoorder_observer>
</observers>
</sales_order_invoice_save_after>
</events>
</global>
</config>
オブザーバーコード:
class Havsund_Autoorder_Model_Observer
{
/* @var Magento_Sales_Model_Order_Invoice */
var $_invoice;
/**
* Mage::dispatchEvent($this->_eventPrefix.'_save_after', $this->_getEventData());
* protected $_eventPrefix = 'sales_order';
* protected $_eventObject = 'order';
* event: sales_order_save_after
*/
public function automaticallyInvoiceShipCompleteOrder($observer)
{
try {
/* @var $order Magento_Sales_Model_Order_Invoice */
$this->_invoice = $observer->getEvent()->getInvoice();
$this->_invoice->sendEmail();
} catch (Mage_Core_Exception $e) {
Mage::log("HAVSUND AUTOORDER: Fehler #58 " . $e->getMessage());
}
return $this;
}
}
モジュールアクティベーション構成:
<?xml version="1.0"?>
<config>
<modules>
<Havsund_Autoorder>
<active>true</active>
<version>1.0.0</version>
<codePool>local</codePool>
<depends>
</depends>
</Havsund_Autoorder>
</modules>
</config>
注記:コンパイルを有効にしている場合は、カスタマイズをデプロイした後で実行するには無効にするか再コンパイルする必要があります。 エラーが発生する可能性があります のように:
Warning: get_class() expects parameter 1 to be object, boolean given in /app/code/core/Mage/Core/Model/App.php on line 1340