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.
]);
}
+ 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.
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']);
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;
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());
+ }
+ }
+
}
<?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 */
$this->title = 'Заказы с маркетплейсов (Яндекс Маркет)';
$this->params['breadcrumbs'][] = $this->title;
+YiiAsset::register($this);
?>
<div class="marketplace-orders-index p-4">
'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']),
],
$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']),
],