From: fomichev Date: Thu, 27 Feb 2025 09:06:40 +0000 (+0300) Subject: Исправления и тестовый код X-Git-Url: https://gitweb.erp-flowers.ru/?a=commitdiff_plain;h=1eff3f480eb1dfc0022a9c1b0cea9fd4711d2506;p=erp24_rep%2Fyii-erp24%2F.git Исправления и тестовый код --- diff --git a/erp24/controllers/MarketplaceOrdersController.php b/erp24/controllers/MarketplaceOrdersController.php index c8e1353d..7aa3d51e 100644 --- a/erp24/controllers/MarketplaceOrdersController.php +++ b/erp24/controllers/MarketplaceOrdersController.php @@ -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. diff --git a/erp24/records/MarketplaceOrders.php b/erp24/records/MarketplaceOrders.php index 0738d9ed..0dc211cc 100644 --- a/erp24/records/MarketplaceOrders.php +++ b/erp24/records/MarketplaceOrders.php @@ -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']); diff --git a/erp24/services/MarketplaceService.php b/erp24/services/MarketplaceService.php index 33ada88f..f20f7d72 100644 --- a/erp24/services/MarketplaceService.php +++ b/erp24/services/MarketplaceService.php @@ -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()); + } + } + } diff --git a/erp24/views/marketplace-orders/index.php b/erp24/views/marketplace-orders/index.php index e2afb514..9f3520c4 100644 --- a/erp24/views/marketplace-orders/index.php +++ b/erp24/views/marketplace-orders/index.php @@ -1,10 +1,12 @@ title = 'Заказы с маркетплейсов (Яндекс Маркет)'; $this->params['breadcrumbs'][] = $this->title; +YiiAsset::register($this); ?>
@@ -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' => ""]) . '
' . + 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 .= '
' . + 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' => 'Вы уверены, что хотите отменить заказ?', + ]) . '
'; + } + return $output; }, 'filter' => Html::input('text', 'MarketplaceOrdersSearch[status_code]', $searchModel->status_code, ['class' => 'form-control']), ],