app/Plugin/Movement/Event.php line 74

Open in your IDE?
  1. <?php
  2. namespace Plugin\Movement;
  3. use Eccube\Entity\Order;
  4. use Eccube\Entity\OrderDetail;
  5. use Eccube\Entity\Product;
  6. use Eccube\Entity\ProductClass;
  7. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  8. use Symfony\Component\EventDispatcher\GenericEvent;
  9. use Symfony\Component\Workflow\Event\TransitionEvent;
  10. use Plugin\Movement\LogManager;
  11. class Event implements EventSubscriberInterface
  12. {
  13.     private $url 'https://webapi.smaregi.jp/access/';
  14.     private $contractId 'skcc222y1';
  15.     private $token '4b5ad52adf4c8dec3e49457ff56884f8';
  16.     /**
  17.      * @return array
  18.      */
  19.     public static function getSubscribedEvents()
  20.     {
  21.         return [
  22.             'admin.product.edit.complete' => 'onAdminProductEditComplete',
  23.             'front.shopping.complete.initialize' => 'onFrontShoppingCompleteInitialize',
  24.             'admin.order.edit.index.complete' => 'onAdminOrderEditIndexComplete',
  25.             'workflow.order.transition.cancel' => 'onWorkflowOrderTransitionCancel',
  26.         ];
  27.     }
  28.     public function onAdminProductEditComplete(GenericEvent $event)
  29.     {
  30.         //error_log( date('[Y-m-d H:i:s] ') . 'onAdminProductEditComplete' . "\n", 3, "/home/liquor-sato/temp/log.txt");
  31.         /** @var Product $product */
  32.         $product $event->getArgument('Product');
  33.         /** @var ProductClass $productClass */
  34.         $productClass $product->getProductClasses()[0];
  35.         $stock $productClass->getStock();
  36.         $stockUnlimited $productClass->isStockUnlimited();
  37.         $code $productClass->getCode();
  38.         $logManager LogManager::sharedInstance();
  39.         if (empty($code)) {
  40.             $logManager->logOutward("管理画面編集終了時の処理を開始します。商品IDがありませんでした。処理を行いません。"'admin_edit_complete_start');
  41.         } else if ($stockUnlimited === true) {
  42.             $logManager->logOutward("管理画面編集終了時の処理を開始します。商品ID: {$code} の商品を、在庫無制限により在庫の操作をしません。"'admin_edit_complete_start');
  43.             // 以下、以前はそのような仕様があったが、いまはしなくてよいよう
  44.             //$logManager->logOutward("管理画面編集終了時の処理を開始します。商品ID: {$code} の商品を、在庫: 0 (無制限により) に変更します。", 'admin_edit_complete_start');
  45.             //$this->sendRequest(0, $code);
  46.         } else if ((string)$stock !== '0' and empty($stock)) {
  47.             $logManager->logOutward("管理画面編集終了時の処理を開始します。在庫の数値を確認できませんでした。処理を行いません。"'admin_edit_complete_start');
  48.         } else {
  49.             $logManager->logOutward("管理画面編集終了時の処理を開始します。商品ID: {$code} の商品を、在庫: {$stock} に変更します。"'admin_edit_complete_start');
  50.             $this->sendRequest($stock$code);
  51.         }
  52.         //error_log( date('[Y-m-d H:i:s] ') . 'Code: ' . $code . ' Stock: ' . $stock . "\n", 3, "/home/liquor-sato/temp/log.txt");
  53.     }
  54.     public function onAdminOrderEditIndexComplete(GenericEvent $event)
  55.     {
  56.         $argumentKey 'TargetOrder';
  57.         $order $event->getArgument($argumentKey);
  58.         $this->onUpdateOrder($order'admin_order_edit');
  59.     }
  60.     public function onFrontShoppingCompleteInitialize(GenericEvent $event)
  61.     {
  62.         $argumentKey 'Order';
  63.         $order $event->getArgument($argumentKey);
  64.         $this->onUpdateOrder($order'shopping_complete');
  65.     }
  66.     public function onWorkflowOrderTransitionCancel(TransitionEvent $event)
  67.     {
  68.         $order $event->getSubject()->getOrder();
  69.         $this->onUpdateOrder($order'workflow_order_cancel');
  70.     }
  71.     private function onUpdateOrder(Order $order$type)
  72.     {
  73.         //error_log( date('[Y-m-d H:i:s] ') . 'xxxxxx' . "\n", 3, "/home/liquor-sato/temp/log.txt");
  74.         $action '';
  75.         $actionCode '';
  76.         switch($type){
  77.             case 'shopping_complete':
  78.                 $action '商品購入完了時の処理';
  79.                 $actionCode 'shopping_complete';
  80.                 break;
  81.             case 'admin_order_edit':
  82.                 $action '注文編集時の処理';
  83.                 $actionCode 'order_edit_complete';
  84.                 break;
  85.             case 'workflow_order_cancel':
  86.                 $action '注文キャンセル時の処理';
  87.                 $actionCode 'workflow_order_cancel';
  88.                 break;
  89.         }
  90.         $logManager LogManager::sharedInstance();
  91.         $logManager->logOutward($action "を開始します。"$actionCode '_start');
  92.         //$arguments = $event->getArguments();
  93.         //$keys = array_keys($arguments);
  94.         /*
  95.         //$orderDetails = $order->getOrderDetails();
  96.         $orderDetails = $order->getOrderItems();
  97.         $orderData = array(
  98.             'orderId' => $order->getId(),
  99.             'subTotal' => $order->getSubtotal() - $order->getTax(),
  100.             'discount' => $order->getDiscount(),
  101.             'deliveryFee' => $order->getDeliveryFeeTotal(),
  102.             'charge' => $order->getCharge(),
  103.             'tax' => $order->getTax(),
  104.             'totalPrice' => $order->getTotalPrice()
  105.         );
  106.         */
  107.         $detailArray = array();
  108.         $orderItems $order->getOrderItems();
  109.         foreach ($orderItems as $orderItem) {
  110.             /** @var ProductClass $productClass */
  111.             $productClass $orderItem->getProductClass();
  112.             $product $orderItem->getProduct();
  113.             if (empty($productClass)) {
  114.                 continue;
  115.             }
  116.             $stock $productClass->getStock();
  117.             $stockUnlimited $productClass->isStockUnlimited();
  118.             $code $productClass->getCode();
  119.             /*
  120.             $transactionDetail = array(
  121.                 'code' => $orderItem->getProductCode(),
  122.                 'name' => $orderItem->getProductName(),
  123.                 'price' => $orderItem->getPrice(),
  124.                 'quantity' => $orderItem->getQuantity(),
  125.             );
  126.             $detailArray[] = $transactionDetail;
  127. */
  128.             if (empty($code)) {
  129.                 $logManager->logOutward("商品IDがありませんでした。処理を行いません。"$actionCode '_doing');
  130.             } else {
  131.                 switch($actionCode) {
  132.                     case 'shopping_complete':
  133.                         if ($stockUnlimited === true) {
  134.                             // unlimitedの場合在庫の相対値操作
  135.                             $difference $orderItem->getQuantity() * -1;
  136.                             $logManager->logOutward("商品ID: {$code} の商品を、在庫: " $difference " (無制限により) します。"$actionCode '_doing');
  137.                             $this->sendRequest($difference$code2);
  138.                         } else {
  139.                             // unlimitedでないなら新しい在庫の数値に合わせる
  140.                             if ((string)$stock !== '0' and empty($stock)) {
  141.                                 $logManager->logOutward("商品ID: {$code} の商品について、在庫の数値を確認できませんでした。処理を行いません。"$actionCode '_doing');
  142.                             } else {
  143.                                 $logManager->logOutward("商品ID: {$code} の商品を、在庫: {$stock} に変更します。"$actionCode '_doing');
  144.                                 $this->sendRequest($stock$code);
  145.                             }
  146.                         }
  147.                         break;
  148.                     case 'order_edit_complete':
  149.                         if ($stockUnlimited === true) {
  150.                             $logManager->logOutward("商品ID: {$code} の商品について、無制限のため、この部分では処理を行いません。"$actionCode '_doing');
  151.                         } else {
  152.                             // unlimitedでないなら新しい在庫の数値に合わせる
  153.                             if ((string)$stock !== '0' and empty($stock)) {
  154.                                 $logManager->logOutward("商品ID: {$code} の商品について、在庫の数値を確認できませんでした。処理を行いません。"$actionCode '_doing');
  155.                             } else {
  156.                                 $logManager->logOutward("商品ID: {$code} の商品を、在庫: {$stock} に変更します。"$actionCode '_doing');
  157.                                 $this->sendRequest($stock$code);
  158.                             }
  159.                         }
  160.                         break;
  161.                     case 'workflow_order_cancel':
  162.                         if ($stockUnlimited === true) {
  163.                             // unlimitedの場合在庫の相対値操作
  164.                             $difference $orderItem->getQuantity();
  165.                             $logManager->logOutward("商品ID: {$code} の商品を、在庫: +" $difference " (無制限商品のキャンセルにより) します。"$actionCode '_doing');
  166.                             $this->sendRequest($difference$code2);
  167.                         } else {
  168.                             //$logManager->logOutward("商品ID: {$code} の商品について、無制限ではないため、この部分では処理を行いません。", $actionCode . '_doing');
  169.                             // unlimitedでないなら新しい在庫の数値に合わせる
  170.                             if ((string)$stock !== '0' and empty($stock)) {
  171.                                 $logManager->logOutward("商品ID: {$code} の商品について、在庫の数値を確認できませんでした。処理を行いません。"$actionCode '_doing');
  172.                             } else {
  173.                                 $logManager->logOutward("商品ID: {$code} の商品を、在庫: {$stock} に変更します。"$actionCode '_doing');
  174.                                 $this->sendRequest($stock$code);
  175.                             }
  176.                         }
  177.                         break;
  178.                 }
  179.             }
  180.             //error_log( date('[Y-m-d H:i:s] ') . 'Code: ' . $code . ' Stock: ' . $stock . "\n", 3, "/home/liquor-sato/temp/log.txt");
  181.         }
  182.         //$this->sendSalesRequest($orderData, $detailArray);
  183.     }
  184.     private function sendSalesRequest($orderData$detailArray)
  185.     {
  186.         if (empty($detailArray)) {
  187.             return;
  188.         }
  189.         $headers = array(
  190.             'X-contract-id: ' $this->contractId,
  191.             'X-access-token: ' $this->token,
  192.             'Content-Type: application/x-www-form-urlencoded;charset=UTF-8'
  193.         );
  194.         $header implode("\r\n"$headers);
  195.         $params = array(
  196.             'proc_info' => array(
  197.                 'proc_division' => 'U'
  198.             ),
  199.             'data' => array(
  200.                 array(
  201.                     'table_name' => 'TransactionHead',
  202.                     'rows' => array(
  203.                         array(
  204.                             'transactionHeadDivision' => '1',
  205.                             'cancelDivision' => '0',
  206.                             'subtotal' => $orderData['subTotal'],
  207.                             'subtotalDiscountPrice' => $orderData['discount'],
  208.                             'total' => $orderData['totalPrice'],
  209.                             'taxExclude' => $orderData['tax'],
  210.                             'storeId' => '1',
  211.                             'terminalId' => '99',
  212.                             'terminalTranId' => $orderData['orderId'],
  213.                             'terminalTranDateTime' => date('Y-m-d H:i:s'),
  214.                             'sumDivision' => '2',
  215.                             'sumDateTime' => date('Y-m-d'),
  216.                             'carriage' => $orderData['deliveryFee'],
  217.                             'commission' => $orderData['charge'],
  218.                         )
  219.                     )
  220.                 ), array(
  221.                     'table_name' => 'TransactionDetail',
  222.                     'rows' => array()
  223.                 )
  224.             )
  225.         );
  226.         $details = array();
  227.         foreach($detailArray as $detail) {
  228.             $array = array(
  229.                 'transactionDetailDivision' => '1',
  230.                 'productId' => $detail['code'],
  231.                 'productName' => $detail['name'],
  232.                 'taxDivision' => '1',
  233.                 'price' => $detail['price'],
  234.                 'salesPrice' => $detail['price'],
  235.                 'quantity' => $detail['quantity']
  236.             );
  237.             $details[] = $array;
  238.         }
  239.         $params['data'][1]['rows'] = $details;
  240.         $data = array(
  241.             'proc_name' => 'transaction_upd',
  242.             'params' => json_encode($params)
  243.         );
  244.         //error_log( date('[Y-m-d H:i:s] ') . 'Params: ' . print_r($params, true) . "\n", 3, "/home/liquor-sato/temp/log.txt");
  245.         $options = array(
  246.             'http' => array(
  247.                 'method' => 'POST',
  248.                 'content' => http_build_query($data),
  249.                 'header' => $header
  250.             )
  251.         );
  252.         if (gethostname() !== 'zotac') {
  253.             $contents file_get_contents($this->urlfalsestream_context_create($options));
  254.         }
  255.     }
  256.     private function sendRequest($stock$code$procDetailDivision 1)
  257.     {
  258.         if (empty($code)) {
  259.             return;
  260.         }
  261.         $headers = array(
  262.             'X-contract-id: ' $this->contractId,
  263.             'X-access-token: ' $this->token,
  264.             'Content-Type: application/x-www-form-urlencoded;charset=UTF-8'
  265.         );
  266.         $header implode("\r\n"$headers);
  267.         $params = array(
  268.             'proc_info' => array(
  269.                 'proc_division' => 'U',
  270.                 'proc_detail_division' => $procDetailDivision
  271.             ),
  272.             'data' => array(
  273.                 array(
  274.                     'table_name' => 'Stock',
  275.                     'rows' => array(
  276.                         array(
  277.                             'storeId' => 1,
  278.                             'productId' => $code,
  279.                             'stockAmount' => $stock,
  280.                             'stockDivision' => 15
  281.                         )
  282.                     )
  283.                 )
  284.             )
  285.         );
  286.         $data = array(
  287.             'proc_name' => 'stock_upd',
  288.             'params' => json_encode($params)
  289.         );
  290.         $options = array(
  291.             'http' => array(
  292.                 'method' => 'POST',
  293.                 'content' => http_build_query($data),
  294.                 'header' => $header
  295.             )
  296.         );
  297.         if (gethostname() !== 'zotac') {
  298.             $contents file_get_contents($this->urlfalsestream_context_create($options));
  299.             $logManager LogManager::sharedInstance();
  300.             if ($procDetailDivision === 2) {
  301.                 $logManager->logOutward("スマレジにデータを送信しました。商品ID: {$code} の商品を、在庫: {$stock} (相対値)に変更します。"'sent_request'$contents);
  302.             } else {
  303.                 $logManager->logOutward("スマレジにデータを送信しました。商品ID: {$code} の商品を、在庫: {$stock} (絶対値)に変更します。"'sent_request'$contents);
  304.             }
  305.             $params = array(
  306.                 'conditions' => array(
  307.                     array('storeId' => '1'),
  308.                     array('productId' => $code)
  309.                 ),
  310.                 'table_name' => 'Stock'
  311.             );
  312.             $data = array(
  313.                 'proc_name' => 'stock_ref',
  314.                 'params' => json_encode($params)
  315.             );
  316.             $options = array(
  317.                 'http' => array(
  318.                     'method' => 'POST',
  319.                     'content' => http_build_query($data),
  320.                     'header' => $header
  321.                 )
  322.             );
  323.             $contents file_get_contents($this->urlfalsestream_context_create($options));
  324.             $logManager->logOutward("スマレジのデータを確認します。商品ID: {$code} "'stock_confirm'$contents);
  325.         }
  326.     }
  327. }