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;
———-

これで、完了。

納品書の配送先を購入者へ差し替えることができた。