EC-CUBEの納品書で左上に配送先ではなく購入者の情報を掲載したい
誰かにプレゼントをするような場合、購入者と配送先が異なることがある。
管理画面の[受注管理]→[受注一覧]→[納品書出力]を押すと「お買上げ明細書(納品書)」のPDFが出力されるが、この納品書の宛名に当たる部分が、デフォルトでは配送先に固定されている。
ここを配送先ではなく、お金を払った購入者(請求先)へ変更したいのだ。
例えば、山田太郎さんが鈴木一郎さんへプレゼントした場合には、納品書が下記のようになる。
E-CUBE 4.2.0にて実験。
参考サイト)
https://xoops.ec-cube.net/modules/newbb/viewtopic.php?topic_id=26348&forum=17&post_id=104935#forumpost104935
https://qiita.com/chihiro-adachi/items/b3bb70e6abbc0f824965
https://xoops.ec-cube.net/modules/newbb/viewtopic.php?viewmode=flat&order=ASC&topic_id=26833&forum=11
https://web-memo.yzkzk365.com/2021/07/30/eccube4-nouhinsyo-tyumonsya/
準備や、エラー発生を含めて順を追って記載する。
(0)ソースを直接編集して動作確認
まずsrc下で直接編集。
src/Eccube/Service/OrderPdfService.php
renderOrderData()内で、
$Order = $Shipping->getOrder();
の行を活かして、
$Shipping->getPref()
を
$Order->getPref()
に変更する。
同様に $Shipping->getAddr01();
を
$Order->getAddr01();
といった形でメソッド内の $Shipping を $Order に修正する。
protected function renderOrderData(Shipping $Shipping) { ..... $Order = $Shipping->getOrder(); if(0): // 購入者都道府県+住所1 // $text = $Order->getPref().$Order->getAddr01(); $text = $Shipping->getPref().$Shipping->getAddr01(); $this->lfText(27, 47, $text, 10); $this->lfText(27, 51, $Shipping->getAddr02(), 10); // 購入者住所2 // 購入者氏名 if (null !== $Shipping->getCompanyName()) { // 会社名 $text = $Shipping->getCompanyName(); $this->lfText(27, 57, $text, 11); // 氏名 $text = $Shipping->getName01().' '.$Shipping->getName02().' 様'; $this->lfText(27, 63, $text, 11); } else { $text = $Shipping->getName01().' '.$Shipping->getName02().' 様'; $this->lfText(27, 59, $text, 11); } endif; // 購入者都道府県+住所1 // $text = $Order->getPref().$Order->getAddr01(); $text = $Order->getPref().$Order->getAddr01(); $this->lfText(27, 47, $text, 10); $this->lfText(27, 51, $Order->getAddr02(), 10); // 購入者住所2 // 購入者氏名 if (null !== $Order->getCompanyName()) { // 会社名 $text = $Order->getCompanyName(); $this->lfText(27, 57, $text, 11); // 氏名 $text = $Order->getName01().' '.$Order->getName02().' 様'; $this->lfText(27, 63, $text, 11); } else { $text = $Order->getName01().' '.$Order->getName02().' 様'; $this->lfText(27, 59, $text, 11); }
この修正で問題なく、配送者が購入者へ置き換わるることを確認。
さて、このままだとEC-CUBE本体のアップデートで修正が消えてしまう可能性があるため、src/Eccube/Service/OrderPdfService.php の修正は元に戻して app下に修正を反映することにする。
(1)PDF出力のソースをコピーして編集
src/Eccube/Service/OrderPdfService.php
↓
app/Customize/Service/OrderPdfService.php
修正内容は同じで、function renderOrderData 内の $Shipping を $Order に修正する。
(2)作成した app 下の OrderPdfService.php が参照されるよう設定
(1)だけをやっても、作成したphpファイルがが即使われるわけではない。twigファイルとは違うようだ。
よって、yamlで指定する。
app/Customize/Resource/config/services.yaml
を作成し、下記の内容にする。
services: Customize\Service\OrderPdfService: public: false autowire: true decorates: Eccube\Service\OrderPdfService
ここで再度納品書を出力すると、下記エラーが発生。
———-
Cannot resolve argument $orderPdfService of “Eccube\Controller\Admin\Order\OrderController::exportPdfDownload()”: Cannot autowire service “Customize\Service\OrderPdfService”: argument “$taxRuleService” of method “__construct()” has type “Customize\Service\TaxRuleService” but this class was not found.
———-
taxRuleService のクラスがない的なことですね。
(3)app/Customize/Service/OrderPdfService.phpを再修正
use Eccube\Service\TaxRuleService;
を追加する。
ここで納品書を出そうとするとまたエラー発生。
———-
Argument 2 passed to Eccube\Controller\Admin\Order\OrderController::exportPdfDownload() must be an instance of Eccube\Service\OrderPdfService, instance of Customize\Service\OrderPdfService given, called in [ドキュメントルート]/ec/vendor/symfony/http-kernel/HttpKernel.php on line 153
———-
コントローラー側も直さないとだめということですね。
(4)コントローラーのソースをコピーして編集
app/Customize/Controllerに
Admin/Order フォルダを作成し、
src/Eccube/Controller/Admin/Order/OrderController.php
を下記にコピーする。
app/Customize/Controller/Admin/OrderOrderController.php
そして下記の内容を修正する。
———-
namespace Eccube\Controller\Admin\Order;
↓
namespace Customize\Controller\Admin\Order;
———-
———-
// use Eccube\Service\OrderPdfService;
// ↓
use Customize\Service\OrderPdfService;
———-
これで、完了。
納品書の配送先を購入者へ差し替えることができた。