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