PR

EC-CUBE 4.2 販売種別,配送方法設定(送料)

商品登録(商品情報)で販売種別を選択。
商品規格情報(色,サイズ等)が設定されている商品は、その商品の商品規格情報で販売種別を選択。
販売種別   設定 → システム設定 → マスタデータ管理 → mbt_sale_typeID,Nameを設定。
       ここでのIDは、dtb_delivery の sale_type_id に設定される。
配送方法設定   設定 → 店舗設定 → 配送方法設定 →
  ID毎に、必須として、
    配送業者名,配送方法名称,販売種別 (以上、dtb_delivery)
    ,取り扱う支払方法 (dtb_payment_option に delivery_id – payment_id の複合主キーで)
  標準の受注受付メールのテンプレートでは、
  ここの配送業者名(dtb_delivery の name , Shipping.shipping_delivery_name) が、
  「配送方法」として送信される。

商品登録(商品情報)で販売種別を選択。
商品規格情報(色,サイズ等)が設定されている商品は、その商品の商品規格情報で販売種別を選択。
販売種別   設定 → システム設定 → マスタデータ管理 → mbt_sale_typeID,Nameを設定。
       ここでのIDは、dtb_delivery に、sale_type_id
配送方法設定
  ID毎に、必須として、
    配送業者名,配送方法名称,販売種別 (以上、dtb_delivery)
    ,取り扱う支払方法 (dtb_payment_option に delivery_id – payment_id の複合主キーで)
            (payment-id は、dtb_payment の id)
    ,都道府県別送料設定 (dtb_delivery_fee
               AUTO_INCREMENT の id に、delivery_id,pref_id,fee)

商品により送料の設定を変える場合(サイズ,重量等の違いが大きく商品毎に送料が変わる場合)
送料の区分を販売種別で設定し、
配送方法設定で販売種別を紐付けし都道府県別の送料を設定、
販売種別を商品に紐付け、商品毎の送料が決められる。

(payment-id は、dtb_payment の id)
    ,都道府県別送料設定 (dtb_delivery_fee
              AUTO_INCREMENT の id に、delivery_id,pref_id,fee)

ただし、標準では送料は販売数に関わらず、一律で計算される。
送料を商品毎に販売数分加算するために、カスタマイズ。
\src\Eccube\Service\PurchaseFlow\Processor\DeliveryFeePreprocessor.php
最後の private function

/*##0001 送料 複数個でも一律送料 delivery_id=1 以外は、都道府県別送料×販売数を送料として計算 (手を抜いてハードコーディング)*/

private function saveDeliveryFeeItem(ItemHolderInterface $itemHolder)
{
    $DeliveryFeeType = $this->entityManager
        ->find(OrderItemType::class, OrderItemType::DELIVERY_FEE);
    $TaxInclude = $this->entityManager
        ->find(TaxDisplayType::class, TaxDisplayType::INCLUDED);
    $Taxation = $this->entityManager
        ->find(TaxType::class, TaxType::TAXATION);

    /** @var Order $Order */
    $Order = $itemHolder;
    /* @var Shipping $Shipping */
    foreach ($Order->getShippings() as $Shipping) {
        // 送料の計算
        $deliveryFeeProduct = 0;
        if ($this->BaseInfo->isOptionProductDeliveryFee()) {
            /** @var OrderItem $item */
            foreach ($Shipping->getOrderItems() as $item) {
                if (!$item->isProduct()) {
                    continue;
                }
                $deliveryFeeProduct += $item->getProductClass()->getDeliveryFee() * $item->getQuantity();
            }
        }

        /** @var DeliveryFee|null $DeliveryFee */
        $DeliveryFee = $this->deliveryFeeRepository->findOneBy([
            'Delivery' => $Shipping->getDelivery(),
            'Pref' => $Shipping->getPref(),
        ]);
    /* ##0001-01 006 Add Start */
        // 都道府県送料 * 数
        foreach ($Shipping->getOrderItems() as $item) {
            $DeliveryFeeTotal = $DeliveryFee->getFee() * $item->getQuantity();
        }
    /* ##0001-01 006 Add End */
        $fee = is_object($DeliveryFee) ? $DeliveryFee->getFee() : 0;
    /* ##0001-02 006 Add Start */
        $DeliveryId = $Shipping->getDelivery()->getId();
        if ($DeliveryId != 1){
          $fee = $DeliveryFeeTotal;
        }
    /* ##0001-02 006 Add End   */

        $OrderItem = new OrderItem();
        $OrderItem->setProductName($DeliveryFeeType->getName())
            ->setPrice($fee + $deliveryFeeProduct)
            ->setQuantity(1)
            ->setOrderItemType($DeliveryFeeType)
            ->setShipping($Shipping)
            ->setOrder($itemHolder)
            ->setTaxDisplayType($TaxInclude)
            ->setTaxType($Taxation)
            ->setProcessorName(DeliveryFeePreprocessor::class);

        $itemHolder->addItem($OrderItem);
        $Shipping->addOrderItem($OrderItem);
    }
}

コメント