]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
Исправления и тестовый код
authorfomichev <vladimir.fomichev@erp-flowers.ru>
Thu, 27 Feb 2025 09:06:40 +0000 (12:06 +0300)
committerfomichev <vladimir.fomichev@erp-flowers.ru>
Thu, 27 Feb 2025 09:06:40 +0000 (12:06 +0300)
erp24/controllers/MarketplaceOrdersController.php
erp24/records/MarketplaceOrders.php
erp24/services/MarketplaceService.php
erp24/views/marketplace-orders/index.php

index c8e1353dcb7e0c5db21f6689175c0f933cc5db4b..7aa3d51e4824e0a8d65909944b7b0d403ff67d19 100644 (file)
@@ -2,11 +2,15 @@
 
 namespace app\controllers;
 
+use Yii;
+use yii\base\Exception;
 use yii_app\records\MarketplaceOrders;
 use yii_app\records\MarketplaceOrdersSearch;
 use yii\web\Controller;
 use yii\web\NotFoundHttpException;
 use yii\filters\VerbFilter;
+use yii_app\records\MarketplaceOrderStatusTypes;
+use yii_app\services\MarketplaceService;
 
 /**
  * MarketplaceOrdersController implements the CRUD actions for MarketplaceOrders model.
@@ -102,6 +106,103 @@ class MarketplaceOrdersController extends Controller
         ]);
     }
 
+    public function actionUpdateToReadyStatus($id)
+    {
+        $model = $this->findModel($id);
+
+        if ($model->status->code === 'PROCESSING') {
+            /*$substatusId = MarketplaceOrderStatusTypes::find()->where(['code' => "READY_TO_SHIP"])->one()->id;
+            $model->substatus_id = $substatusId;
+
+            if (!$model->save()) {
+                Yii::error('Ошибка сохранения модели: ' . json_encode($model->getErrors(), JSON_UNESCAPED_UNICODE));
+                Yii::$app->session->setFlash('error', 'Ошибка обновления статуса заказа.');
+            }*/
+            try {
+                $updatedOrder = MarketplaceService::updateOrderStatus(
+                    $model->warehouse_guid,
+                    $model->marketplace_order_id,
+                    $model->status->code,
+                    "READY_TO_SHIP"
+                );
+
+                if (!$updatedOrder || (is_array($updatedOrder) && isset($updatedOrder['error']))) {
+                    $errorMsg = is_array($updatedOrder) && isset($updatedOrder['error'])
+                        ? $updatedOrder['error']
+                        : 'Не удалось обновить статус заказа.';
+                    throw new Exception($errorMsg);
+                }
+
+                MarketplaceService::processOrders($updatedOrder);
+                Yii::$app->session->setFlash('success', 'Статус заказа успешно обновлен.');
+            } catch (Exception $e) {
+                Yii::$app->session->setFlash('error', 'Ошибка обновления статуса заказа: ' . $e->getMessage());
+                Yii::error(
+                    'Не удалось обновить статус заказа: ' . json_encode(
+                        $e->getMessage(),
+                        JSON_UNESCAPED_UNICODE
+                    )
+                );
+            }
+        } else {
+            Yii::$app->session->setFlash(
+                'error',
+                'Невозможно обновить статус заказа, так как он не находится в состоянии PROCESSING.'
+            );
+        }
+
+        return $this->redirect(['index']);
+    }
+
+    public function actionUpdateToCancelledStatus($id)
+    {
+        $model = $this->findModel($id);
+
+        if ($model->status->code === 'PROCESSING') {
+            /*$statusId = MarketplaceOrderStatusTypes::find()->where(['code' => "CANCELLED"])->one()->id;
+            $substatusId = MarketplaceOrderStatusTypes::find()->where(['code' => "SHOP_FAILED"])->one()->id;
+            $model->status_id = $statusId;
+            $model->substatus_id = $substatusId;
+            if (!$model->save()) {
+                Yii::error('Ошибка сохранения модели: ' . json_encode($model->getErrors(), JSON_UNESCAPED_UNICODE));
+                Yii::$app->session->setFlash('error', 'Ошибка обновления статуса заказа.');
+            }
+            return $this->redirect(['index']);*/
+
+            try {
+                $updatedOrder = MarketplaceService::updateOrderStatus(
+                    $model->warehouse_guid,
+                    $model->marketplace_order_id,
+                    "CANCELLED",
+                    "SHOP_FAILED"
+                );
+
+                if (!$updatedOrder || (is_array($updatedOrder) && isset($updatedOrder['error']))) {
+                    $errorMsg = is_array($updatedOrder) && isset($updatedOrder['error'])
+                        ? $updatedOrder['error']
+                        : 'Не удалось обновить статус заказа.';
+                    throw new Exception($errorMsg);
+                }
+
+                MarketplaceService::processOrders($updatedOrder);
+                Yii::$app->session->setFlash('success', 'Статус заказа успешно обновлен.');
+            } catch (Exception $e) {
+                Yii::$app->session->setFlash('error', 'Ошибка обновления статуса заказа: ' . $e->getMessage());
+                Yii::error('Не удалось обновить статус заказа: ' . json_encode(
+                    $e->getMessage(),
+                    JSON_UNESCAPED_UNICODE
+                    ));
+            }
+        } else {
+            Yii::$app->session->setFlash(
+                'error',
+                'Невозможно обновить статус заказа, так как он не находится в состоянии PROCESSING.'
+            );
+        }
+
+        return $this->redirect(['index']);
+    }
+
     /**
      * Deletes an existing MarketplaceOrders model.
      * If deletion is successful, the browser will be redirected to the 'index' page.
index 0738d9eda9fd5ac4f32a77d8d93d39d6f013d7bd..0dc211cccbba3592237001399a24394238f1a139 100644 (file)
@@ -101,6 +101,11 @@ class MarketplaceOrders extends \yii\db\ActiveRecord
         return $this->hasOne(CityStore::class, ['id' => 'store_id']);
     }
 
+    public function getMpstore()
+    {
+        return $this->hasOne(MarketplaceStore::class, ['warehouse_guid' => 'warehouse_guid']);
+    }
+
     public function getStatus()
     {
         return $this->hasOne(MarketplaceOrderStatusTypes::class, ['id' => 'status_id']);
index 33ada88f07bf1ae5a785c483cc7f0ca0cb659983..f20f7d726e52cdb64199c0f4743b40d9cc7a28bd 100644 (file)
@@ -7,6 +7,7 @@ use OpenAPI\Client\Api\OrdersApi;
 use OpenAPI\Client\Api\ReturnsApi;
 use OpenAPI\Client\ApiException;
 use OpenAPI\Client\Configuration;
+use OpenAPI\Client\Model\UpdateOrderStatusRequest;
 use Yii;
 use yii\helpers\ArrayHelper;
 use yii\helpers\Json;
@@ -1288,4 +1289,23 @@ class MarketplaceService
             Yii::error("Ошибка получения возврата: " . $e->getMessage());
         }
     }
+
+    public static function updateOrderStatus($campaignId, $orderId, $newStatus, $newSubstatus)
+    {
+        $config = Configuration::getDefaultConfiguration()
+            ->setApiKey('Api-Key', Yii::$app->params['YANDEX_MARKET_API_KEY']);
+        $apiInstance = new OrdersApi(new Client(), $config);
+        $contentType = OrdersApi::contentTypes['getReturn'][0];
+        $data = ['status' => $newStatus, 'substatus' => $newSubstatus];
+        // TODO добавление доставки "realDeliveryDate"
+        $updateOrderStatusRequest = new UpdateOrderStatusRequest($data);
+        try {
+            $response = $apiInstance->updateOrderStatus($campaignId, $orderId, $updateOrderStatusRequest, $contentType);
+            $order = $response->getOrder();
+            return [$campaignId => [$order]];
+        } catch (\Exception $e) {
+            Yii::error("Ошибка изменения статуса: " . $e->getMessage());
+        }
+    }
+
 }
index e2afb51485783ee73268172016fa3c48530d3281..9f3520c4463fe710805892c3db8cb6e8dc371aff 100644 (file)
@@ -1,10 +1,12 @@
 <?php
 
+use yii\web\YiiAsset;
 use yii_app\records\MarketplaceOrders;
 use yii\helpers\Html;
 use yii\helpers\Url;
 use yii\grid\ActionColumn;
 use yii\grid\GridView;
+use yii_app\records\MarketplaceStore;
 
 /** @var yii\web\View $this */
 /** @var yii_app\records\MarketplaceOrdersSearch $searchModel */
@@ -12,6 +14,7 @@ use yii\grid\GridView;
 
 $this->title = 'Заказы с маркетплейсов (Яндекс Маркет)';
 $this->params['breadcrumbs'][] = $this->title;
+YiiAsset::register($this);
 ?>
 <div class="marketplace-orders-index p-4">
 
@@ -36,8 +39,10 @@ $this->params['breadcrumbs'][] = $this->title;
             'marketplace_order_id',
             [
                 'attribute' => 'store_id',
+                'format' => 'raw', // добавляем raw формат
                 'value' => function ($model) {
-                    return $model->store->name ?? '-';
+                    return Html::tag('span', $model->store->name ?? '-', ['class' => ""]) . '<br>' .
+                        Html::tag('span', MarketplaceStore::getWarehouseId()[$model->mpstore->warehouse_id], ['class' => "bg-success text-white"]);
                 },
                 'filter' => Html::input('text', 'MarketplaceOrdersSearch[store_name]', $searchModel->store_name, ['class' => 'form-control']),
             ],
@@ -51,8 +56,30 @@ $this->params['breadcrumbs'][] = $this->title;
                         $class = 'bg-success text-white';
                     } elseif ($status === 'CANCELLED') {
                         $class = 'bg-danger text-white';
+                    } elseif ($status === 'PROCESSING') {
+                        $class = 'bg-primary text-white';
+                    } else {
+                        $class = 'bg-secondary text-white';
                     }
-                    return Html::tag('span', $status, ['class' => "badge $class"]);
+
+                    $output = Html::tag('span', $status, ['class' => "badge $class"]);
+
+                    if ($status === 'PROCESSING' ) {
+                        $readyUrl = Url::to(['update-to-ready-status', 'id' => $model->id]);
+                        $cancelUrl = Url::to(['update-to-cancelled-status', 'id' => $model->id]);
+                        $output .= '<div class="mt-2">' .
+                            Html::a('Готов', $readyUrl, [
+                                'class' => 'btn btn-sm btn-success',
+                                'data-method' => 'post',
+                                'data-confirm' => 'Вы уверены, что хотите перевести заказ в статус "Готов к отправке"?',
+                            ]) . ' ' .
+                            Html::a('Отменить', $cancelUrl, [
+                                'class' => 'btn btn-sm btn-danger',
+                                'data-method' => 'post',
+                                'data-confirm' => 'Вы уверены, что хотите отменить заказ?',
+                            ]) . '</div>';
+                    }
+                    return $output;
                 },
                 'filter' => Html::input('text', 'MarketplaceOrdersSearch[status_code]', $searchModel->status_code, ['class' => 'form-control']),
             ],