namespace app\controllers;
+use OpenAPI\Client\ObjectSerializer;
use Yii;
use yii\helpers\ArrayHelper;
use yii\rest\Controller;
public function actionGetOrders()
{
Yii::$app->response->format = Response::FORMAT_JSON;
- $config = Configuration::getDefaultConfiguration()
- ->setApiKey('Api-Key', Yii::$app->params['YANDEX_MARKET_API_KEY']);
+ $request = Yii::$app->request;
+
+ $body = $request->getRawBody();
+ $content = json_decode($body, false, 512, JSON_THROW_ON_ERROR);
+ $testCampaignId = $request->get('campaign_id', 109969229);
+ $testData = ObjectSerializer::deserialize($content, '\OpenAPI\Client\Model\GetOrdersResponse', []);
+ if (!empty($testData) && isset($testData['orders'])) {
+ $ordersData[$testCampaignId] = $testData['orders'];
+ $result = $this->processOrders($ordersData);
+ return ['response' => 'OK (test data)', 'storeCount' => count($ordersData), 'result' => $result];
+ }
- $campaignIds = MarketplaceStore::find()
- ->select(['warehouse_guid'])
- ->where(['warehouse_id' => 2])
- ->column();
+ $fromDate = $request->get('from_date', date('d-m-Y'));
+ $toDate = $request->get('to_date', null);
- $statuses = MarketplaceOrderStatusTypes::find()
- ->select(['id', 'code'])
- ->indexBy('code')
- ->asArray()->all();
+ $status = $request->get('status', null);
+ $substatus = $request->get('substatus', null);
- $statuses = ArrayHelper::map($statuses, 'code', 'id');
- $statusCodes = array_unique(array_keys($statuses));
- // var_dump($statusCodes);die();
+ $campaignIds = MarketplaceStore::find()
+ ->select(['warehouse_guid'])
+ ->where(['warehouse_id' => 2])
+ ->column();
+ $config = Configuration::getDefaultConfiguration()
+ ->setApiKey('Api-Key', Yii::$app->params['YANDEX_MARKET_API_KEY']);
$apiInstance = new Api\OrdersApi(new GuzzleHttp\Client(), $config);
- //$apiModel = new Model\GetOrdersResponse();
+
+ $allOrders = [];
foreach ($campaignIds as $campaignId) {
- $result = $apiInstance->getOrdersWithHttpInfo($campaignId);
- $pager = $result[0]->getPager();
- if (empty($pager->getTotal())) {
- continue;
+ $currentPage = 1;
+ $hasMore = true;
+ while ($hasMore) {
+ $result = $apiInstance->getOrdersWithHttpInfo(
+ $campaignId,
+ null,
+ $status, // строка, например, "DELIVERED"
+ $substatus, // строка, например, "CANCELLED"
+ $fromDate,
+ $toDate,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+
+ );
+ $pager = $result[0]->getPager();
+ if (empty($pager->getTotal())) {
+ break;
+ }
+ $orders = $result[0]->getOrders();
+ if (!isset($allOrders[$campaignId]) || empty($allOrders[$campaignId])) {
+ $allOrders[$campaignId] = $orders;
+ } else {
+ $allOrders[$campaignId] = array_merge($allOrders[$campaignId], $orders);
+ }
+
+ $pager = $result[0]->getPager();
+ if ($pager && $pager->getPagesCount() > $currentPage) {
+ $currentPage++;
+ $hasMore = true;
+ } else {
+ $hasMore = false;
+ }
}
+ }
+ //var_dump($allOrders);die();
+ $result = $this->processOrders($allOrders);
+
+ return ['response' => 'OK', 'storeCount' => count($allOrders), 'result' => $result];
+ }
- $orders = $result[0]->getOrders();
+ protected function processOrders(array $allOrders)
+ {
+ $statuses = MarketplaceOrderStatusTypes::find()
+ ->select(['id', 'code'])
+ ->indexBy('code')
+ ->asArray()
+ ->all();
+ $statuses = ArrayHelper::map($statuses, 'code', 'id');
+ $statusCodes = array_unique(array_keys($statuses));
+ $newOrdersCount = 0;
+ $updatedOrdersCount = 0;
+ foreach ($allOrders as $campaignId => $orders) {
foreach ($orders as $order) {
- $status = $statuses[$order->getStatus()] ?? null;
- $substatus = $statuses[$order->getSubstatus()] ?? null;
+ $statusCode = $order->getStatus();
+ $substatusCode = $order->getSubstatus();
- if (!in_array($order->getStatus(), $statusCodes)) {
+ if (!in_array($statusCode, $statusCodes)) {
$newStatus = new MarketplaceOrderStatusTypes();
- $newStatus->code = $order->getStatus();
+ $newStatus->code = $statusCode;
if ($newStatus->save()) {
- $status = $newStatus->id;
- $statusCodes[] = $order->getStatus();
- $statuses[$order->getStatus()] = $newStatus->id;
+ $statusId = $newStatus->id;
+ $statusCodes[] = $statusCode;
+ $statuses[$statusCode] = $newStatus->id;
} else {
Yii::error(
- 'Ошибка сохранения статуса: ' . json_encode($newStatus->getErrors(), JSON_UNESCAPED_UNICODE)
+ 'Ошибка сохранения статуса: ' . json_encode(
+ $newStatus->getErrors(),
+ JSON_UNESCAPED_UNICODE
+ )
);
+ $statusId = null;
}
+ } else {
+ $statusId = $statuses[$statusCode];
}
- if (!in_array($order->getSubstatus(), $statusCodes)) {
+ if (!in_array($substatusCode, $statusCodes)) {
$newSubstatus = new MarketplaceOrderStatusTypes();
- $newSubstatus->code = $order->getSubstatus();
+ $newSubstatus->code = $substatusCode;
if ($newSubstatus->save()) {
- $substatus = $newSubstatus->id;
- $statusCodes[] = $order->getSubstatus();
- $statuses[$order->getSubstatus()] = $newSubstatus->id;
+ $substatusId = $newSubstatus->id;
+ $statusCodes[] = $substatusCode;
+ $statuses[$substatusCode] = $newSubstatus->id;
} else {
Yii::error(
'Ошибка сохранения подстатуса: ' . json_encode(
JSON_UNESCAPED_UNICODE
)
);
+ $substatusId = null;
}
+ } else {
+ $substatusId = $statuses[$substatusCode];
}
$newRawData = json_encode($order);
->one();
if (!$marketplaceOrder) {
+ // Создание нового заказа
$marketplaceOrder = new MarketplaceOrders();
$marketplaceOrder->marketplace_order_id = (string)$order->getId();
$marketplaceOrder->creation_date = date('Y-m-d H:i:s', strtotime($order->getCreationDate()));
$marketplaceOrder->cancel_requested = (int)$order->getCancelRequested();
$warehouseGuid = (string)$campaignId;
- $store = MarketplaceStore::findOne(['warehouse_guid' => $warehouseGuid]);
- $marketplaceOrder->store_id = $store ? $store->store_id : null;
- $marketplaceOrder->warehouse_guid = $warehouseGuid;
+ if ($warehouseGuid) {
+ $store = MarketplaceStore::findOne(['warehouse_guid' => $warehouseGuid]);
+ $marketplaceOrder->store_id = $store ? $store->store_id : null;
+ $marketplaceOrder->warehouse_guid = $warehouseGuid;
+ }
- $marketplaceOrder->status_id = (int)$status;
- $marketplaceOrder->substatus_id = (int)$substatus;
+ $marketplaceOrder->status_id = (int)$statusId;
+ $marketplaceOrder->substatus_id = (int)$substatusId;
$marketplaceOrder->raw_data = $newRawData;
if ($marketplaceOrder->save()) {
+ $newOrdersCount += 1;
+ // Создаем запись истории статусов
$newStatusHistoryRecord = new MarketplaceOrderStatusHistory();
$newStatusHistoryRecord->order_id = $marketplaceOrder->id;
- $newStatusHistoryRecord->status_id = (int)$status;
- $newStatusHistoryRecord->substatus_id = (int)$substatus;
+ $newStatusHistoryRecord->status_id = (int)$statusId;
+ $newStatusHistoryRecord->substatus_id = (int)$substatusId;
$newStatusHistoryRecord->active = 1;
$newStatusHistoryRecord->initiator = "ERP";
$newStatusHistoryRecord->date_from = date('Y-m-d H:i:s');
$newStatusHistoryRecord->date_end = '2100-01-01 00:00:00';
-
if (!$newStatusHistoryRecord->save()) {
Yii::error(
- 'Ошибка сохранения истории: ' . json_encode(
+ 'Ошибка сохранения истории статуса: ' . json_encode(
$newStatusHistoryRecord->getErrors(),
JSON_UNESCAPED_UNICODE
)
);
}
-
+ // Сохраняем данные доставки
$delivery = $order->getDelivery();
if ($delivery) {
$deliveryModel = new MarketplaceOrderDelivery();
$deliveryModel->street = $address->getStreet();
$deliveryModel->house = $address->getHouse();
$deliveryModel->apartment = $address->getApartment();
- $deliveryModel->latitude = $address->getGps()->getLatitude();
- $deliveryModel->longitude = $address->getGps()->getLongitude();
+ $gps = $address->getGps();
+ if ($gps) {
+ $deliveryModel->latitude = $gps->getLatitude();
+ $deliveryModel->longitude = $gps->getLongitude();
+ }
}
-
$dates = $delivery->getDates();
if ($dates) {
$deliveryModel->delivery_start = date(
strtotime($dates->getToDate() . ' ' . $dates->getToTime())
);
}
-
$courier = $delivery->getCourier();
if ($courier) {
$deliveryModel->courier_full_name = $courier->getFullName();
$deliveryModel->courier_vehicle_number = $courier->getVehicleNumber();
$deliveryModel->courier_vehicle_description = $courier->getVehicleDescription();
}
-
if (!$deliveryModel->save()) {
Yii::error(
'Ошибка сохранения доставки: ' . json_encode(
}
}
+ // Сохраняем позиции заказа
$items = $order->getItems();
if (!empty($items)) {
foreach ($items as $item) {
);
}
} else {
+ // Обновление существующего заказа, если данные изменились
if ($newRawData !== $marketplaceOrder->raw_data) {
$marketplaceOrder->updated_at = date('Y-m-d H:i:s', strtotime($order->getUpdatedAt()));
$marketplaceOrder->total = $order->getBuyerTotal();
$marketplaceOrder->payment_method = $order->getPaymentMethod();
$marketplaceOrder->cancel_requested = (int)$order->getCancelRequested();
$marketplaceOrder->raw_data = $newRawData;
-
- $statusHistoryRecord = MarketplaceOrderStatusHistory::find()
- ->where(['order_id' => $marketplaceOrder->id])
- ->one();
+ $marketplaceOrder->status_id = (int)$statusId;
+ $marketplaceOrder->substatus_id = (int)$substatusId;
+ $marketplaceOrder->updated_at = date('Y-m-d H:i:s', strtotime($order->getUpdatedAt()));
+ $marketplaceOrder->save();
+ $updatedOrdersCount += 1;
+ // Обновление истории статусов, если изменился статус
+ $statusHistoryRecord = MarketplaceOrderStatusHistory::find()->where(['order_id' => $marketplaceOrder->id])->one();
if (
- (!empty($statusHistoryRecord)) &&
- ($statusHistoryRecord->status_id !== $status
- || $statusHistoryRecord->substatus_id !== $substatus)
+ $statusHistoryRecord &&
+ ($statusHistoryRecord->status_id !== (int)$statusId ||
+ $statusHistoryRecord->substatus_id !== (int)$substatusId)
) {
$statusHistoryRecord->active = 0;
- $statusHistoryRecord->date_to = date();
+ $statusHistoryRecord->date_to = date('Y-m-d H:i:s');
$statusHistoryRecord->save();
$newStatusHistoryRecord = new MarketplaceOrderStatusHistory();
$newStatusHistoryRecord->order_id = $marketplaceOrder->id;
- $newStatusHistoryRecord->status_id = (int)$status;
- $newStatusHistoryRecord->substatus_id = (int)$substatus;
+ $newStatusHistoryRecord->status_id = (int)$statusId;
+ $newStatusHistoryRecord->substatus_id = (int)$substatusId;
$newStatusHistoryRecord->active = 1;
$newStatusHistoryRecord->initiator = "ERP";
$newStatusHistoryRecord->date_from = date('Y-m-d H:i:s');
$newStatusHistoryRecord->date_end = date('Y-m-d H:i:s', strtotime("2100-01-01"));
if (!$newStatusHistoryRecord->save()) {
Yii::error(
- 'Ошибка сохранения' . json_encode(
+ 'Ошибка сохранения новой истории статуса: ' . json_encode(
$newStatusHistoryRecord->getErrors(),
JSON_UNESCAPED_UNICODE
)
);
}
}
- $marketplaceOrder->status_id = (int)$status;
- $marketplaceOrder->substatus_id = (int)$substatus;
- $marketplaceOrder->updated_at = date('Y-m-d H:i:s', strtotime($order->getUpdatedAt()));
- $marketplaceOrder->save();
+ // Обновление позиций заказа
$newItems = $order->getItems();
- $existingItems = MarketplaceOrderItems::find()->where(['order_id' => $marketplaceOrder->id])
+ $existingItems = MarketplaceOrderItems::find()
+ ->where(['order_id' => $marketplaceOrder->id])
->all();
-
if (count($existingItems) !== count($newItems)) {
MarketplaceOrderItems::deleteAll(['order_id' => $marketplaceOrder->id]);
foreach ($newItems as $item) {
}
}
}
- return json_encode(["response" => "OK"]);
+ return ['newOrders' => $newOrdersCount, 'updateOrders' => $updatedOrdersCount];
}
}