HEX
Server: Apache
System: Linux s198.coreserver.jp 5.15.0-151-generic #161-Ubuntu SMP Tue Jul 22 14:25:40 UTC 2025 x86_64
User: nagasaki (10062)
PHP: 7.1.33
Disabled: NONE
Upload Files
File: /virtual/nagasaki/public_html/ec/app/Plugin/GmoEpsilon/Service/Client/GmoEpsilon_Regular.php
<?php

namespace Plugin\GmoEpsilon\Service\Client;

use Eccube\Entity\Order;
use Eccube\Entity\OrderDetail;
use Eccube\Entity\Shipping;
use Eccube\Entity\ShipmentItem;
use Plugin\GmoEpsilon\Entity\RegularOrder;
use Plugin\GmoEpsilon\Entity\RegularOrderDetail;
use Plugin\GmoEpsilon\Entity\RegularShipping;
use Plugin\GmoEpsilon\Entity\RegularShipmentItem;
use Doctrine\DBAL\Migrations\AbstractMigration;
use Doctrine\DBAL\Schema\Schema;

/**
 * 決済モジュール 決済処理:定期課金(クレジットカード決済)
 */
class GmoEpsilon_Regular extends GmoEpsilon_Base
{
    private $orderVar = array(
        'PreOrderId', 'Message', 'Name01', 'Name02', 'Kana01', 'Kana02', 'CompanyName', 'Email',
        'Tel01', 'Tel02', 'Tel03', 'Fax01', 'Fax02', 'Fax03', 'Zip01', 'Zip02', 'Zipcode', 'Addr01', 'Addr02',
        'Birth', 'Subtotal', 'Discount', 'DeliveryFeeTotal', 'Charge', 'Tax', 'Total', 'PaymentTotal', 'PaymentMethod',
        'Note', 'OrderDate', 'DelFlg', 'Customer', 'Country',
        'Pref', 'Sex', 'Job', 'Payment', 'DeviceType',
    );

    private $shippingVar = array(
        'Name01', 'Name02', 'Kana01', 'Kana02', 'CompanyName', 'Tel01', 'Tel02', 'Tel03', 'Fax01', 'Fax02', 'Fax03',
        'Zip01', 'Zip02', 'Zipcode', 'Addr01', 'Addr02', 'ShippingDeliveryName', 'ShippingDeliveryTime',
        'ShippingDeliveryDate', 'ShippingDeliveryFee', 'Rank', 'CreateDate', 'UpdateDate',
        'DelFlg', 'Country', 'Pref', 'Delivery', 'DeliveryTime', 'DeliveryFee',
    );

    private $orderDetailVar = array(
        'ProductName', 'ProductCode', 'ClassCategoryName1', 'ClassCategoryName2', 'Price', 'Quantity',
        'TaxRate', 'TaxRule', 'Product', 'ProductClass',
    );

    private $shipmentItemVar = array(
        'ProductName', 'ProductCode', 'ClassCategoryName1', 'ClassCategoryName2', 'Price', 'Quantity',
        'Product', 'ProductClass',
    );
    /**
     * コンストラクタ
     *
     * @return void
     */
    function __construct(\Eccube\Application $app)
    {
        parent::__construct($app);
        $this->app = $app;
        $this->const = $app['config']['GmoEpsilon']['const'];
    }

    /**
     * 受注情報を更新、定期受注マスタを登録
     *
     * @param \Eccube\Entity\Order $Order
     * @param array $response
     */
    function updateOrder($Order, $response)
    {
        // 受注情報を更新
        parent::updateOrder($Order, $response);

        // 定期受注マスタが未登録の場合 ※決済完了通知と2重に作成しないため
        $RegularOrder = $this->app['eccube.plugin.epsilon.repository.regular_order']->findBy(array('FirstOrder' => $response['order_number']));
        if (empty($RegularOrder)) {
            // 定期受注マスタを登録
            $this->copyOrderEachOther($Order, $response);
        }
    }

    function copyOrderEachOther($SourceOrder, array $other = null)
    {
        $this->app['orm.em']->getConnection()->beginTransaction();

        if (strpos(get_class($SourceOrder),'RegularOrder') !== false) {
            $source_prefix = 'Regular';
            $destination_prefix = '';
        } else {
            $source_prefix = '';
            $destination_prefix = 'Regular';
        }
        /**
         * 定期受注マスタを登録、以下の様に受注情報をコピー
         *
         * dtb_order → plg_epsilon_regular_order
         * dtb_order_detail → plg_epsilon_regular_order_detail
         * dtb_shipping → plg_epsilon_regular_shipping
         * dtb_shipment_item → plg_epsilon_regular_shipment_item
         */
        // order
        $DestinationOrder = empty($destination_prefix) ? new Order() : new RegularOrder();
        $this->copyRecord($DestinationOrder, $SourceOrder, $this->orderVar);
        if (strpos(get_class($DestinationOrder), 'RegularOrder') !== false) {
            $DestinationOrder->setTransCode($other['trans_code']);
            $DestinationOrder->setRegularOrderCount(1);
            $DestinationOrder->setRegularStatus($this->app['eccube.plugin.epsilon.repository.regular_status']->find(1));
            $DestinationOrder->setFirstOrder($SourceOrder);
            $DestinationOrder->setLastOrder($SourceOrder);
        } else {
            $DestinationOrder->setOrderStatus($this->app['eccube.repository.order_status']->find($this->app['config']['order_new']));
        }
        $this->app['orm.em']->persist($DestinationOrder);

        // order_detail
        $getter = 'get' . $source_prefix . 'OrderDetails';
        $SourceOrderDetails = $SourceOrder->$getter();
        foreach ($SourceOrderDetails as $SourceOrderDetail) {
            $DestinationOrderDetail = empty($destination_prefix) ? new OrderDetail() : new RegularOrderDetail();
            $this->copyRecord($DestinationOrderDetail, $SourceOrderDetail, $this->orderDetailVar);
            $setter = 'set' . $destination_prefix . 'Order';
            $DestinationOrderDetail->$setter($DestinationOrder);
            $this->app['orm.em']->persist($DestinationOrderDetail);

            $add = 'add' . $destination_prefix . 'OrderDetail';
            $DestinationOrder->$add($DestinationOrderDetail);
        }

        // shipping
        $getter = 'get' . $source_prefix . 'Shippings';
        $SourceShippings = $SourceOrder->$getter();
        foreach ($SourceShippings as $SourceShipping) {
            $DestinationShipping = empty($destination_prefix) ? new Shipping() : new RegularShipping();
            $this->copyRecord($DestinationShipping, $SourceShipping, $this->shippingVar);
            $setter = 'set' . $destination_prefix . 'Order';
            $DestinationShipping->$setter($DestinationOrder);
            // shipment_item
            $getter = 'get' . $source_prefix . 'ShipmentItems';
            $SourceShipmentItems = $SourceShipping->$getter();
            foreach ($SourceShipmentItems as $SourceShipmentItem) {
                $DestinationShipmentItem = empty($destination_prefix) ? new ShipmentItem() : new RegularShipmentItem();
                $this->copyRecord($DestinationShipmentItem, $SourceShipmentItem, $this->shipmentItemVar);
                $setter = 'set' . $destination_prefix . 'Shipping';
                $DestinationShipmentItem->$setter($DestinationShipping);
                $setter = 'set' . $destination_prefix . 'Order';
                $DestinationShipmentItem->$setter($DestinationOrder);
                $this->app['orm.em']->persist($DestinationShipmentItem);

                $add = 'add' . $destination_prefix . 'ShipmentItem';
                $DestinationShipping->$add($DestinationShipmentItem);
        }
            $this->app['orm.em']->persist($DestinationShipping);

            $add = 'add' . $destination_prefix . 'Shipping';
            $DestinationOrder->$add($DestinationShipping);
        }

        $this->app['orm.em']->flush();

        // order_extension
        if (strpos(get_class($DestinationOrder), 'RegularOrder') !== false) {
            // 拡張テーブルに定期受注番号を登録
            $OrderExtension = $this->app['eccube.plugin.epsilon.repository.order_extension']->find($SourceOrder->getId());
            $OrderExtension->setRegularOrderId($DestinationOrder->getId());
        } else {
            // 拡張テーブルに定期情報を登録
            $OrderExtension = new \Plugin\GmoEpsilon\Entity\Extension\OrderExtension();
            $OrderExtension->setId($DestinationOrder->getId());
            $OrderExtension->setTransCode($SourceOrder->getTransCode());
            $OrderExtension->setRegularOrderId($SourceOrder->getId());

            $SourceOrder->setRegularOrderCount($SourceOrder->getRegularOrderCount() + 1);
            $SourceOrder->setLastOrder($DestinationOrder);

            $this->app['orm.em']->persist($SourceOrder);
            $this->app['orm.em']->flush();
        }

        $this->app['orm.em']->persist($OrderExtension);
        $this->app['orm.em']->flush();

        $this->app['orm.em']->getConnection()->commit();
    }

    public function copyRecord(&$Destination, $Source, $commonVar)
    {
        foreach ($commonVar as $var) {
            $setFunc = 'set'.$var;
            $getFunc = 'get'.$var;
            $Destination->$setFunc($Source->$getFunc());
        }
    }

    /**
     * チェックするレスポンスパラメータのキーを取得
     *
     * @return array
     */
    function getCheckParameter()
    {
        return array('trans_code', 'user_id', 'result', 'order_number');
    }

    /**
     * 定期受注マスタを基に受注を登録
     *
     * @param integer $id
     */
    public function registOrder($regularOrderId)
    {
        // 定期受注マスタを取得
        $RegularOrder = $this->app['eccube.plugin.epsilon.repository.regular_order']->find($regularOrderId);
        // 受注を登録
        $this->copyOrderEachOther($RegularOrder);
        }



    /**
     * 次回受注作成日を取得
     *
     * @param \Eccube\Entity\Payment $Payment
     * @param \DateTime $CreateDate
     * @return \DateTime or boolean
     */
    public function getNextOrderDate($Payment, $CreateDate)
    {
        $result = null;
        // 今日の日付けを設定
        $Date = new \DateTime();

        $PaymentExtension = $this->app['eccube.plugin.epsilon.repository.payment_extension']->find($Payment->getId());

        // 最後の受注IDの作成日を取得する
        switch ($PaymentExtension->getMissionCode()){
            //  毎月
            case $this->const['EVERY_MONTH_MISSION_CODE']:
                $Interval = new \DateInterval('P1M');
                break;
            //  隔月
            case $this->const['EVERY_OTHER_MONTH_MISSION_CODE']:
                $Interval = new \DateInterval('P2M');
                break;
            //  3ヶ月毎
            case $this->const['EVERY_THREE_MONTH_MISSION_CODE']:
                $Interval = new \DateInterval('P3M');
                break;
            //  半年毎
            case $this->const['EVERY_SIX_MONTH_MISSION_CODE']:
                $Interval = new \DateInterval('P6M');
                break;
            // 毎年
            case $this->const['EVERY_YEAR_MISSION_CODE']:
                $Interval = new \DateInterval('P1Y');
                break;
        }

        $CreateDate->add($Interval);

        // 次回注文月を「年/月/日」の形で設定する
        if ($Date <= $CreateDate){
            $result = $CreateDate->format('Y/m/d');
        }

        return $result;
    }

}