Chapter 08

バックエンド - 処理スクラップ

ta.toshio
ta.toshio
2021.05.29に更新

ポイントまわり

ポイント計算

src/Eccube/Service/PurchaseFlow/Processor/PointProcessor.php

   /**
     * {@inheritdoc}
     */
    public function addDiscountItem(ItemHolderInterface $itemHolder, PurchaseContext $context)
    {
        if (!$this->supports($itemHolder)) {
            return;
        }

        $usePoint = $itemHolder->getUsePoint();
        $discount = $this->pointHelper->pointToDiscount($usePoint);

        // 利用ポイントがある場合は割引明細を追加
        if ($usePoint > 0) {
            $result = null;

            // 購入フロー実行時
            if ($context->isShoppingFlow()) {
                // 支払い金額 < 利用ポイントによる値引き額.
                if ($itemHolder->getTotal() + $discount < 0) {
                    $minus = $itemHolder->getTotal() + $discount;
                    // 利用ポイントが支払い金額を上回っていた場合は支払い金額が0円以上となるようにポイントを調整
                    $overPoint = $this->pointHelper->priceToPoint($minus);
                    $usePoint = $itemHolder->getUsePoint() + $overPoint;
                    $discount = $this->pointHelper->pointToDiscount($usePoint);
                    $result = ProcessResult::warn(trans('purchase_flow.over_payment_total'), self::class);
                }

                // 所有ポイント < 利用ポイント
                $Customer = $itemHolder->getCustomer();
                if ($Customer->getPoint() < $usePoint) {
                    // 利用ポイントが所有ポイントを上回っていた場合は所有ポイントで上書き
                    $usePoint = $Customer->getPoint();
                    $discount = $this->pointHelper->pointToDiscount($usePoint);
                    $result = ProcessResult::warn(trans('purchase_flow.over_customer_point'), self::class);
                }
                // 受注登録・編集実行時
            } else {
                // 支払い金額 < 利用ポイントによる値引き額.
                if ($itemHolder->getTotal() >= 0 && $itemHolder->getTotal() + $discount < 0) {
                    $result = ProcessResult::error(trans('purchase_flow.over_payment_total'), self::class);
                }
            }

            $itemHolder->setUsePoint($usePoint);
            $this->pointHelper->addPointDiscountItem($itemHolder, $discount);

            if ($result) {
                return $result;
            }
        }
    }

ポイントヘルパー

ポイントを金額に変換するメソッドや、受注(予定)明細にポイントによるディスカウントの明細オブジェクト(OrderItem)を作成(または削除)するメソッド等がある。

src/Eccube/Service/PointHelper.php

...
    /**
     * ポイントを金額に変換する.
     *
     * @param $point ポイント
     *
     * @return float|int 金額
     *
     * @throws \Doctrine\ORM\NoResultException
     * @throws \Doctrine\ORM\NonUniqueResultException
     */
    public function pointToPrice($point)
    {
        $BaseInfo = $this->baseInfoRepository->get();

        return intval($point * $BaseInfo->getPointConversionRate());
    }

    /**
     * ポイントを値引き額に変換する. マイナス値を返す.
     *
     * @param $point ポイント
     *
     * @return float|int 金額
     *
     * @throws \Doctrine\ORM\NoResultException
     * @throws \Doctrine\ORM\NonUniqueResultException
     */
    public function pointToDiscount($point)
    {
        return $this->pointToPrice($point) * -1;
    }

    /**
     * 明細追加処理.
     *
     * @param ItemHolderInterface $itemHolder
     * @param integer $discount
     */
    public function addPointDiscountItem(ItemHolderInterface $itemHolder, $discount)
    {
        $DiscountType = $this->entityManager->find(OrderItemType::class, OrderItemType::POINT);
        $TaxInclude = $this->entityManager->find(TaxDisplayType::class, TaxDisplayType::INCLUDED);
        $Taxation = $this->entityManager->find(TaxType::class, TaxType::NON_TAXABLE);

        $OrderItem = new OrderItem();
        $OrderItem->setProductName($DiscountType->getName())
            ->setPrice($discount)
            ->setQuantity(1)
            ->setTax(0)
            ->setTaxRate(0)
            ->setRoundingType(null)
            ->setOrderItemType($DiscountType)
            ->setTaxDisplayType($TaxInclude) // 税込み表示  
            ->setTaxType($Taxation) // 非課税
            ->setOrder($itemHolder)
            ->setProcessorName(PointProcessor::class);
        $itemHolder->addItem($OrderItem);
    }
    

    public function prepare(ItemHolderInterface $itemHolder, $point)
    {
        // ユーザの保有ポイントを減算
        $Customer = $itemHolder->getCustomer();
        $Customer->setPoint($Customer->getPoint() - $point);
    }

    public function rollback(ItemHolderInterface $itemHolder, $point)
    {
        // 利用したポイントをユーザに戻す.
        $Customer = $itemHolder->getCustomer();
        $Customer->setPoint($Customer->getPoint() + $point);
    }