Windowsソフト、iPhoneアプリ、ゲーム音楽素材の「Meteoric Stream」 -> 資料室 -> EC-Cube3 -> 【ECCube3】AmazonPayで、お届け日調整プラグインが機能しない時の対策

【ECCube3】AmazonPayで、お届け日調整プラグインが機能しない時の対策

株式会社ブラテック製のお届け日調整プラグインと、
アイピーロジック製のAmazon Payプラグインの併用で、
Amazon Payでの注文時に、お届け日が、きちんと調整されない不具合がありましたので、
メモです。

以下のバージョンに対して修正を行いました。
ECCube : 3.0.15
お届け日調整プラグイン: 1.0.10
Amazon Pay: 1.2.1

修正方法ですが、Amazon Pay側のプラグインを修正します。

/app/Plugin/AmazonPayments/Controller/AmazonShoppingController.php:
539行目あたり:
青の部分を、赤の部分に移動します。
要するに、ちゃんと住所を取得出来てから、
注文フォームを作成するわけです。

// $builder = $app['eccube.plugin.amazonpayments.service.amazon_shopping']->getShippingFormBuilder($Order);
// $form = $builder->getForm();

// $form->handleRequest($request);

// $data = $form->getData();
// $message = $data['message'];


// Amazonからお届け先取得
$arrAmznAddr = $app['eccube.plugin.amazonpayments.service.amazon_request']->getDeliveryAddress($amazonOrderReferenceId, $addressConsentToken);

// EC-CUBEに対応付け
$Shippings = $Order->getShippings();
foreach ($Shippings as $key => $Shipping) {
$app['eccube.plugin.amazonpayments.service.amazon_shopping']->convertAddress($Order, $Shippings[$key], $arrAmznAddr);
}

$builder = $app['eccube.plugin.amazonpayments.service.amazon_shopping']->getShippingFormBuilder($Order);
$form = $builder->getForm();

$form->handleRequest($request);

$data = $form->getData();
$message = $data['message'];



/app/Plugin/AmazonPayments/Service/AmazonShoppingService.php:
40行目あたり:
use宣言で、DeliveryDateプラグインを使う事を宣言します。
use Plugin\DeliveryDate\Repository\ProductClassRepository;
use Plugin\DeliveryDate\Repository\HolidayRepository;
use Plugin\DeliveryDate\Repository\DeliveryDateRepository;



/app/Plugin/AmazonPayments/Service/AmazonShoppingService.php:
1147行目あたり:
赤文字の部分を追加します。
要するに、Amazon Paymentから取得した住所を、セッションに保持して、後で使用します。

$Pref = $this->app['eccube.repository.master.pref']->findOneBy(array('name' => $arrAmznAddr['StateOrRegion']));
if (!empty($Pref)) {
    $_SESSION["order_pref"] = $Pref->getId();
    $Shipping->setPref($Pref);
} else {
    // 存在しない都道府県の場合
    $this->app['monolog.amazonpayments']->addInfo('*** 都道府県マッチングエラー *** addr = '.print_r($arrAmznAddr, true));
    $Shipping->setPref(null);
    $addr01 = $arrAmznAddr['StateOrRegion'] . $addr01;
}


/app/Plugin/AmazonPayments/Service/AmazonShoppingService.php:
858行目あたり:
赤文字が、追加したコードです。

public function getFormDeliveryDates(Order $Order)
{
    // お届け日の設定
    $deliveryDatePluginFlg = 1;
    $minDate = 0;
    $deliveryDateFlag = false;
    if($deliveryDatePluginFlg){
        $deliveryDateFlag = true;
    }

    // 配送時に最大となる商品日数を取得
    foreach ($Order->getOrderDetails() as $detail) {
        if($deliveryDatePluginFlg){
            $deliveryDate = $this->app['eccube.deliverydate.repository.product_class']->findOneBy(array('product_class_id' => $detail->getProductClass()->getId()));
            if (!is_null($deliveryDate)) {
                $days = $deliveryDate->getDays();
                if(!is_null($days)){
                    if ($minDate < $days) {
                        $minDate = $days;
                    }
                }else{
                    $deliveryDateFlag = false;
                    break;
                }
            }else{
                $deliveryDateFlag = false;
                break;
            }
        }else{

            // ここはデフォルトの処理
            $deliveryDate = $detail->getProductClass()->getDeliveryDate();
            if (!is_null($deliveryDate)) {
                if ($minDate < $deliveryDate->getValue()) {
                    $minDate = $deliveryDate->getValue();
                }
                // 配送日数が設定されている
                $deliveryDateFlag = true;
            }
        }
    }

    // 配達最大日数期間を設定
    $deliveryDates = array();

    if($deliveryDateFlag && $deliveryDatePluginFlg){
        $Method = $this->app['eccube.deliverydate.repository.config']->findOneBy(array('name' => 'method'));
        $AcceptTime = $this->app['eccube.deliverydate.repository.config']->findOneBy(array('name' => 'accept_time'));
        if($AcceptTime){
            $time = (int)$AcceptTime->getValue();
            if($minDate == 0 && $time > 0){
                $isHoliday = false;
                if($Method){
                    if($Method->getValue() != 1){
                        $date = new \DateTime();
                        if($this->app['eccube.deliverydate.repository.holiday']->checkHoliday($date)){
                            $isHoliday = true;
                        }
                    }
                }
                if(!$isHoliday){
                    $now = getdate();
                    if($now['hours'] >= $time){
                        $minDate = 1;
                    }
                }
            }
        }
        // 発送までの日数を計算
        if($Method){
            if($Method->getValue() != 1){
                $shippingDate = $minDate;
                $i=0;
                while($shippingDate >= 0){
                    $date = new \DateTime($i . 'day');
                    if($this->app['eccube.deliverydate.repository.holiday']->checkHoliday($date)){
                        $minDate++;
                    }else{
                        $shippingDate--;
                    }
                    $i++;
                }
            }
        }
        // 都道府県ごとの配送日数を加算
        if($_SESSION["order_pref"]){
            $plgDeliveryDate = $this->app['eccube.deliverydate.repository.delivery_date']->findOneBy(array(
                'Delivery' => empty($Delivery) ? 1 : $Delivery,
                'Pref' => $_SESSION["order_pref"],
            ));
            unset($_SESSION["order_pref"]);
        }else{
            // このあたりの処理、冗長なので、後で修正するかも。
            if(!empty($Order->getPref())){
             $plgDeliveryDate = $this->app['eccube.deliverydate.repository.delivery_date']->findOneBy(array(
             'Delivery' => empty($Delivery) ? 1 : $Delivery,
             'Pref' => (int)@$Order->getPref()->getId(),
             ));
            }else{
             $plgDeliveryDate = $this->app['eccube.deliverydate.repository.delivery_date']->findOneBy(array(
             'Delivery' => empty($Delivery) ? 1 : $Delivery,
             'Pref' => 13,
             ));
            }
        }

        if($plgDeliveryDate){
            $dates = $plgDeliveryDate->getDates();
            if(!is_null($dates))$minDate += $dates;
        }

        // 配達最大日数期間を設定
        $deliveryDates = array();

        $period = new \DatePeriod (
            new \DateTime($minDate . ' day'),
            new \DateInterval('P1D'),
            new \DateTime($minDate + $this->app['config']['deliv_date_end_max'] . ' day')
        );
        
        foreach ($period as $day) {
            $deliveryDates[$day->format('Y/m/d')] = $day->format('Y/m/d');
        }
    }
    else{

        // ここはデフォルトの処理
        // 配送日数が設定されている
        if ($deliveryDateFlag) {
            $period = new \DatePeriod (
                new \DateTime($minDate . ' day'),
                new \DateInterval('P1D'),
                new \DateTime($minDate + $this->app['config']['deliv_date_end_max'] . ' day')
            );

            foreach ($period as $day) {
                $deliveryDates[$day->format('Y/m/d')] = $day->format('Y/m/d');
            }
        }
     }

    return $deliveryDates;

}


結論:
あーーーー、もう、ECCubeめんどくさいwww

この記事の最終更新日:2018/06/19
最初に記事を書いた日:2018/06/19

この記事をシェアする

このエントリーをはてなブックマークに追加

関連記事

Meteoric Streamについて

管理人

Windowsソフト、iPhoneアプリ、ゲーム音楽素材の「Meteoric Stream」 -> 資料室 -> EC-Cube3 -> 【ECCube3】AmazonPayで、お届け日調整プラグインが機能しない時の対策