Ejemplo n.º 1
0
 public function createOrder()
 {
     /**
      * Проверяем повторный запрос invoice от сервера
      */
     $result = \frontend\models\InvoiceTable::find()->where(["invoice_id" => $this->invoiceId])->one();
     if ($result) {
         /**
          * Проверяем ответ от InSales на создание заказа
          */
         if (isset($result->order_request) && $result->order_request == 1) {
             //Пришел ответ от InSales и заказ добавлен, отвечаем серверу
             if (isset($result->order_id, $result->amount) && !empty($result->order_id) && !empty($result->amount)) {
                 $ordersId = json_decode($result->order_id, true);
                 if (is_array($ordersId) && isset($ordersId['oExternal'], $ordersId['oInternal'])) {
                     $this->invoice->setOrderId($ordersId['oExternal']);
                     $this->invoice->setAmount($result->amount);
                     $this->invoice->setUserData(json_encode(array("orderId" => $ordersId['oInternal'])));
                     return true;
                 }
             } else {
                 //@ToDo
                 PayqrLog::log("Маловероятно, при каких условиях такое возможно???");
                 //Производим обновление результата
                 \frontend\models\InvoiceTable::updateAll(['iteration' => $result->iteration + 1, 'order_request' => 0], 'invoice_id = :invoice_id', [':invoice_id' => $this->invoiceId]);
             }
         }
         if (isset($result->order_request) && $result->order_request == 0) {
             //ответ от сервера еще не пришел, ждем ответа
             //поскольку предыдущее соединение неактивно, то будем ждать ответа от сервера
             $currentSec = 1;
             while (true) {
                 PayqrLog::log("Ждем ответа от InSales [" . $currentSec . " c.]");
                 if (((int) $result->iteration + 1) * 5 < $currentSec) {
                     break;
                 }
                 sleep(1);
                 //проверяем пришел ли ответ от сервера
                 $iterResult = \frontend\models\InvoiceTable::find()->where(["invoice_id" => $this->invoiceId])->one();
                 if ($iterResult && $iterResult->order_request == 0) {
                     PayqrLog::log("Ответ еще не поступил от InSales [" . $currentSec . " c.]");
                     continue;
                 }
                 if ($iterResult && $iterResult->order_request == -1) {
                     PayqrLog::log("Ответ от InSales ошибочный [" . $currentSec . " c.]");
                     //Производим обновление результата
                     \frontend\models\InvoiceTable::updateAll(['iteration' => $result->iteration + 1, 'order_request' => 0], 'invoice_id = :invoice_id', [':invoice_id' => $this->invoiceId]);
                     break;
                 }
                 if ($iterResult && $iterResult->order_request == 1) {
                     PayqrLog::log("Ответ от InSales пришел [" . $currentSec . " c.]");
                     $ordersId = json_decode($iterResult->order_id, true);
                     if (is_array($ordersId) && isset($ordersId['oExternal'], $ordersId['oInternal'])) {
                         $this->invoice->setOrderId($ordersId['oExternal']);
                         $this->invoice->setAmount($result->amount);
                         $this->invoice->setUserData(json_encode(array("orderId" => $ordersId['oInternal'])));
                         return true;
                     }
                 }
                 $currentSec++;
             }
         }
         if (isset($result->order_request) && $result->order_request == -1) {
             //запрос завершился ошибкой, пробуем создать новый заказ
             PayqrLog::log("Предыдущий запрос завершился ошибкой! Производим обновление состояние: iteration, order_request");
             \frontend\models\InvoiceTable::updateAll(['iteration' => $result->iteration + 1, 'order_request' => 0], 'invoice_id = :invoice_id', [':invoice_id' => $this->invoiceId]);
         }
         /*
          * 
          */
     }
     /*
      * Создаем заказ через API InSales (отправляем xml)
      */
     $orderXml = OrderXml::getOrderXML($this->invoice);
     $orderResult = OrderTransport::getInstance($this->invoice)->createOrder($orderXml);
     $orderIdExternal = OrderXmlParser::getInstance($orderResult)->getExtId();
     $orderIdInternal = OrderXmlParser::getInstance($orderResult)->getIntId();
     $totalPrice = OrderXmlParser::getInstance($orderResult)->getTotal();
     $this->invoice->setAmount($totalPrice);
     //устанавливаем номер заказа
     $this->invoice->setOrderId($orderIdExternal);
     /**
      * Обработка доставки
      */
     $deliveryCased = $this->invoice->getDeliveryCasesSelected();
     if (isset($deliveryCased->amountFrom) && !empty($deliveryCased->amountFrom)) {
         $this->invoice->setAmount((double) $totalPrice + (double) $deliveryCased->amountFrom);
     }
     //удаляем строку по условию
     \frontend\models\InvoiceTable::deleteAll(["invoice_id" => $this->invoiceId]);
     $invoiceTable = new \frontend\models\InvoiceTable();
     $invoiceTable->createInvoice($this->invoiceId, json_encode(array("oInternal" => $orderIdInternal, "oExternal" => $orderIdExternal)), $totalPrice);
     /*
      * Устанавливаем пользовательские данные
      */
     $this->invoice->setUserData(json_encode(array("orderId" => $orderIdInternal)));
     /*
      * Отправляем сообщение пользователю
      */
     PayqrMessage::getInstance($this->settings, $this->invoice)->setMessage('inv.order.creating');
 }