From: marina Date: Wed, 2 Jul 2025 07:31:17 +0000 (+0300) Subject: ERP-433 Отчет по остаткам букетов для МП и причинам, если логика не проходит. Возможн... X-Git-Url: https://gitweb.erp-flowers.ru/?a=commitdiff_plain;h=f4175666112525ac932470aeb97672820b211822;p=erp24_rep%2Fyii-erp24%2F.git ERP-433 Отчет по остаткам букетов для МП и причинам, если логика не проходит. Возможность ручной выгрузки из ERP в Excel --- diff --git a/erp24/actions/marketplace/ReportAction.php b/erp24/actions/marketplace/ReportAction.php index bc885cf1..514b8ab5 100644 --- a/erp24/actions/marketplace/ReportAction.php +++ b/erp24/actions/marketplace/ReportAction.php @@ -27,34 +27,53 @@ class ReportAction extends Action $products = Products1c::find() ->alias('p1n') ->leftJoin('prices p', 'p.product_id = p1n.id') - ->leftJoin('matrix_erp_property mep', 'mep.guid = p1n.id') + ->leftJoin('matrix_erp_property_dynamic mep', 'mep.product_id = p1n.id AND mep.active = 1') + ->leftJoin(['mp_check' => new \yii\db\Expression(" + LATERAL ( + SELECT + bool_or(mp.minimal_quantity > (j.value::numeric)) AS has_insufficient_quantity, + string_agg( + format( + 'Недостаточно \"%s\" (нужно ≥ %s, указано %s)', + j.guid, + mp.minimal_quantity, + j.value + ), + E'\n' + ) FILTER (WHERE mp.minimal_quantity > (j.value::numeric)) AS insuff_reason + FROM jsonb_each_text(mep.value::jsonb) AS j(guid, value) + JOIN marketplace_priority mp ON mp.id::text = j.guid + ) +")], 'true') + ->select([ 'p1n.id', 'p1n.name', 'p1n.articule', new \yii\db\Expression(" - CASE - WHEN mep.id IS NULL AND p.price IS NULL THEN - 'Не имеет состава букета в MatrixErpProperty и нет цены' - WHEN mep.id IS NULL THEN - 'Не имеет состава букета в MatrixErpProperty' - WHEN p.price IS NULL THEN - 'Нет цены' - ELSE NULL - END AS reason - "), + CASE + WHEN mep.id IS NULL AND p.price IS NULL THEN + 'Не имеет состава букета в MatrixErpProperty и нет цены' + WHEN mep.id IS NULL THEN + 'Не имеет состава букета в MatrixErpProperty' + WHEN p.price IS NULL THEN + 'Нет цены' + WHEN mp_check.has_insufficient_quantity THEN + mp_check.insuff_reason + ELSE NULL + END AS reason + "), new \yii\db\Expression(" - CASE - WHEN mep.id IS NULL OR p.price IS NULL THEN FALSE - ELSE TRUE - END AS is_valid - ") + CASE + WHEN mep.id IS NULL OR p.price IS NULL OR mp_check.has_insufficient_quantity THEN FALSE + ELSE TRUE + END AS is_valid + ") ]) ->where(['in', 'parent_id', $subQuery]) ->asArray() ->all(); - $dataProvider = new ArrayDataProvider([ 'allModels' => $products, 'pagination' => ['pageSize' => 20], diff --git a/erp24/services/MarketplaceService.php b/erp24/services/MarketplaceService.php index 7bc8b269..37a26fb2 100644 --- a/erp24/services/MarketplaceService.php +++ b/erp24/services/MarketplaceService.php @@ -35,7 +35,7 @@ use yii_app\records\ProductsClass; class MarketplaceService { - // Порядок основных категорий (Цветы, Живые растения) не менять, добавлять в конец массива + // Порядок основных категорий (Цветы, Живые растения) не менять, добавлять в конец массива private const CATEGORIES_WITH_SUBCATEGORIES = [ "Цветы" => [ 1 => "Монобукеты", @@ -94,7 +94,8 @@ class MarketplaceService self::SUBJECT_DELIVERED => 5, ]; - public static function infoForMarketplace(int $marketId) { + public static function infoForMarketplace(int $marketId) + { if (!array_key_exists($marketId, MarketplaceStore::getWarehouseId())) return; @@ -121,23 +122,22 @@ class MarketplaceService // 2. Получение цен на букеты $prices = ArrayHelper::map(Prices::findAll(['product_id' => ArrayHelper::getColumn($productsGuids, 'id')]), 'product_id', 'price'); - /* $allPrices = Prices::findAll(['product_id' => $productsGuidsIds]); - - if (empty($allPrices)) { - Yii::warning('Не найдено цен для GUID.'); - } + /* $allPrices = Prices::findAll(['product_id' => $productsGuidsIds]); - $prices = ArrayHelper::map($allPrices, 'product_id', 'price') ?: []; // Ensure $prices is an array + if (empty($allPrices)) { + Yii::warning('Не найдено цен для GUID.'); + } - foreach ($productsGuidsIds as $productId) { - // Ensure $productId is scalar before checking - if (is_scalar($productId) && !array_key_exists($productId, $prices)) { - $prices[$productId] = 0; - } elseif (!is_scalar($productId)) { - Yii::warning('Invalid productId type: ' . gettype($productId)); - } - }*/ + $prices = ArrayHelper::map($allPrices, 'product_id', 'price') ?: []; // Ensure $prices is an array + foreach ($productsGuidsIds as $productId) { + // Ensure $productId is scalar before checking + if (is_scalar($productId) && !array_key_exists($productId, $prices)) { + $prices[$productId] = 0; + } elseif (!is_scalar($productId)) { + Yii::warning('Invalid productId type: ' . gettype($productId)); + } + }*/ // 3. Получение состава букетов @@ -285,12 +285,13 @@ class MarketplaceService } } } - // var_dump($distribution); + // var_dump($distribution); return $distribution; } - public static function getMarketplaceProducts() { + public static function getMarketplaceProducts() + { $productsGroup = ProductsClass::find() ->where(['tip' => [ProductsClass::MARKETPLACE, ProductsClass::MARKETPLACE_ADDITIONAL]]) ->select('category_id') @@ -301,6 +302,7 @@ class MarketplaceService return $products; } + /** * Статический метод для получения всей информации по продуктам, которая необходима для создания фида. * @@ -318,7 +320,6 @@ class MarketplaceService ->where(['tip' => 'products']) ->andWhere(['not', ['components' => '']]) ->andWhere(['parent_id' => $parents]) - ->all(); $count = (int)$id; @@ -349,7 +350,7 @@ class MarketplaceService if ($price == 0) { $message = "У товара {$product->id} отсутствует цена и он будет исключен из фида."; Yii::error($message, __METHOD__); - InfoLogService::setInfoLog( + InfoLogService::setInfoLog( __FILE__, __LINE__, $message, @@ -427,13 +428,34 @@ class MarketplaceService $result = []; foreach ($products as $product) { - $check = self::checkProducts($product); - if ($check === false) { - continue; + $properties = MarketplaceService::getProductPropertiesByGuid($product->id); + if (!$properties) { + $message = "Товар с GUID {$product->id} не имеет свойств в MatrixErpProperty и был исключен из фида."; + Yii::error($message, __METHOD__); + + InfoLogService::setInfoLog( + __FILE__, + __LINE__, + $message, + 'Missing properties error' + ); } - $properties = $check['properties']; - $price = $check['price']; + $price = MarketplaceService::getProductPrice($product->id); + + if ($price == 0) { + $message = "У товара {$product->id} отсутствует цена и он будет исключен из фида."; + Yii::error($message, __METHOD__); + + + InfoLogService::setInfoLog( + __FILE__, + __LINE__, + $message, + 'Zero price error' + ); + continue; + } $components = json_decode($product->components, true); $composition = []; @@ -473,7 +495,7 @@ class MarketplaceService return $result; } - + public function checkProducts($product, $isView = false): array|false { $properties = MarketplaceService::getProductPropertiesByGuid($product->id); @@ -541,11 +563,11 @@ class MarketplaceService $offer->addAttribute('available', $product['available'] ? 'true' : 'false'); // Добавление URL продукта - $offer->addChild('url', $product['productLink']); + $offer->addChild('url', $product['productLink']); // Добавление цены и валюты $offer->addChild('price', $product['price']); - // $offer->addChild('oldPrice', $product['oldprice']); + // $offer->addChild('oldPrice', $product['oldprice']); $offer->addChild('currencyId', 'RUB'); $offer->addChild('categoryId', $product['category_id']); @@ -561,7 +583,7 @@ class MarketplaceService } // Добавление веса и количества - if (isset($product['weight']) ) { + if (isset($product['weight'])) { $offer->addChild('weight', $product['weight']); } if (!(isset($product['category_id']) && str_starts_with((string)$product['category_id'], '1'))) { @@ -588,7 +610,6 @@ class MarketplaceService } - // Добавление изображений продукта if (!empty($product['pictures'])) { foreach ($product['pictures'] as $picture) { @@ -601,7 +622,8 @@ class MarketplaceService } - private static function getProductPropertiesByGuid($guid) { + private static function getProductPropertiesByGuid($guid) + { $product = MatrixErpProperty::find() ->where(['guid' => $guid]) ->one(); @@ -623,7 +645,8 @@ class MarketplaceService ]; } - private static function getProductImageUrl($imageId) { + private static function getProductImageUrl($imageId) + { $image = Images::findOne($imageId); $fileName = ''; if ($image && File::src($image->filename, 'images') != null) { @@ -634,18 +657,27 @@ class MarketplaceService return null; } - private static function getProductLinkByGuid($guid) { + + private static function getProductLinkByGuid($guid) + { return 'https://media.erp-flowers.ru/media/view-card?guid=' . urlencode($guid); } - private static function getProductPrice($productId) { + private static function getProductPrice($productId) + { $price = Prices::find() ->where(['product_id' => $productId]) ->one(); return $price['price'] ?? 0; } - private static function getProductOldPrice($productId) { return 300; } - private static function getProductDescription($productId) { + + private static function getProductOldPrice($productId) + { + return 300; + } + + private static function getProductDescription($productId) + { $product = MatrixErpProperty::find() ->where(['guid' => $productId]) @@ -657,8 +689,14 @@ class MarketplaceService return $product->description; } - private static function getProductQty($productId) { return 9; } - private static function getProductWeight($productId) { + + private static function getProductQty($productId) + { + return 9; + } + + private static function getProductWeight($productId) + { $product = MatrixErpProperty::find() ->where(['guid' => $productId]) ->one(); @@ -677,7 +715,9 @@ class MarketplaceService return $product->weight ?? 0.5; } - private static function getProductCategory($productId) { + + private static function getProductCategory($productId) + { $product = MatrixErpProperty::find() ->where(['guid' => $productId]) @@ -695,7 +735,7 @@ class MarketplaceService return null; } - return self::getCategorySubcategoryId($product->flowwow_category, $product->flowwow_subcategory); + return self::getCategorySubcategoryId($product->flowwow_category, $product->flowwow_subcategory); } public static function getCategorySubcategoryId($category, $subcategory) @@ -734,10 +774,13 @@ class MarketplaceService return (string)$categoryIndex . (string)$subcategoryIndex; } - private static function getProductMinOrder($productId) { + private static function getProductMinOrder($productId) + { return 1; } - private static function getProductAvailability($availableQty) { + + private static function getProductAvailability($availableQty) + { return $availableQty > 0; } @@ -820,14 +863,15 @@ class MarketplaceService ]; } + /** * Получает данные о заказах для указанных кампаний с учетом фильтров. * - * @param array $campaignIds Массив идентификаторов кампаний (warehouse_guid). - * @param string|null $status Фильтр по статусу заказа (например, "DELIVERED"). - * @param string|null $substatus Фильтр по подстатусу заказа (например, "CANCELLED"). - * @param string $fromDate Начальная дата в формате "дд-мм-гггг". - * @param string|null $toDate Конечная дата в формате "дд-мм-гггг". + * @param array $campaignIds Массив идентификаторов кампаний (warehouse_guid). + * @param string|null $status Фильтр по статусу заказа (например, "DELIVERED"). + * @param string|null $substatus Фильтр по подстатусу заказа (например, "CANCELLED"). + * @param string $fromDate Начальная дата в формате "дд-мм-гггг". + * @param string|null $toDate Конечная дата в формате "дд-мм-гггг". * * @return array Массив заказов, сгруппированных по кампании. */ @@ -884,8 +928,8 @@ class MarketplaceService * возвращая данные в виде массива, где ключ – идентификатор кампании (магазина), * а значение – массив заказов (в данном случае с одним заказом). * - * @param int $campaignId Идентификатор кампании (магазина) в API. - * @param int $orderId Идентификатор заказа. + * @param int $campaignId Идентификатор кампании (магазина) в API. + * @param int $orderId Идентификатор заказа. * @param string|null $contentType Заголовок Content-Type. Если не передан, используется значение по умолчанию. * * @return array Массив заказов в виде: [ $campaignId => [ $order ] ] @@ -1151,18 +1195,18 @@ class MarketplaceService } } } - // проверяем и устанавливаем ready_to = 1 - $baseUrl = "https://partner.market.yandex.ru/order/"; - $marketplaceOrder->order_link = $baseUrl . $marketplaceOrder->marketplace_order_id . "?tld=ru&partnerId=197274828"; - if (!$marketplaceOrder->save()) { - Yii::error( - 'Ошибка сохранения заказа при создании ссылки: ' . json_encode( - $marketplaceOrder->getErrors(), - JSON_UNESCAPED_UNICODE - ) - ); - } - self::setReadyMarketplaceOrders($marketplaceOrder); + // проверяем и устанавливаем ready_to = 1 + $baseUrl = "https://partner.market.yandex.ru/order/"; + $marketplaceOrder->order_link = $baseUrl . $marketplaceOrder->marketplace_order_id . "?tld=ru&partnerId=197274828"; + if (!$marketplaceOrder->save()) { + Yii::error( + 'Ошибка сохранения заказа при создании ссылки: ' . json_encode( + $marketplaceOrder->getErrors(), + JSON_UNESCAPED_UNICODE + ) + ); + } + self::setReadyMarketplaceOrders($marketplaceOrder); } else { Yii::error( 'Ошибка сохранения заказа: ' . json_encode( @@ -1404,8 +1448,8 @@ class MarketplaceService * Получает данные о возврате заказа через ReturnsApi. * * @param int $campaignId Идентификатор кампании (магазина). - * @param int $orderId Идентификатор заказа. - * @param int $returnId Идентификатор возврата. + * @param int $orderId Идентификатор заказа. + * @param int $returnId Идентификатор возврата. * * @return array Массив с данными возврата: * - 'returnedAt': Время создания возврата (ISO 8601). @@ -1427,7 +1471,7 @@ class MarketplaceService $returnedAt = $returnResult->getCreationDate(); $rawReturnData = json_encode($returnResponse); return [ - 'returnedAt' => $returnedAt, + 'returnedAt' => $returnedAt, 'rawReturnData' => $rawReturnData, ]; } catch (\Exception $e) { @@ -1465,9 +1509,10 @@ class MarketplaceService $progressCallback = null, $seen = false, $unseen = false - ) { + ) + { imap_errors(); - imap_alerts(); + imap_alerts(); $debugMode = true; set_time_limit(300); @@ -1482,12 +1527,12 @@ class MarketplaceService if (!$date) { //$date = date('d-M-Y'); - $sinceDate = date('d-M-Y',strtotime("-1 day")); - $beforeDate = date('d-M-Y',strtotime("+1 day")); + $sinceDate = date('d-M-Y', strtotime("-1 day")); + $beforeDate = date('d-M-Y', strtotime("+1 day")); $searchCriteria = 'SINCE "' . $sinceDate . '" BEFORE "' . $beforeDate . '"'; } else { - $sinceDate = date('d-M-Y',strtotime("{$date} -1 day")); - $beforeDate = date('d-M-Y',strtotime("{$date} +1 day")); + $sinceDate = date('d-M-Y', strtotime("{$date} -1 day")); + $beforeDate = date('d-M-Y', strtotime("{$date} +1 day")); if ($useSince) { $searchCriteria = 'SINCE '; $searchCriteria .= '"' . $date . '" '; @@ -1560,7 +1605,7 @@ class MarketplaceService if ($progressCallback) { call_user_func($progressCallback, "Поиск писем в папке: $folder..."); } - // self::imap_debug_log("Поисковой запрос: {$searchCriteria}", $debugMode, $progressCallback); + // self::imap_debug_log("Поисковой запрос: {$searchCriteria}", $debugMode, $progressCallback); $emails = imap_search($inbox, $searchCriteria); self::check_imap_errors($debugMode, $progressCallback); @@ -1681,7 +1726,7 @@ class MarketplaceService $email->date = $date; $email->body = $body; $email->created_at = date('Y-m-d H:i:s'); - + if ($email->save()) { return $email; } else { @@ -1692,7 +1737,8 @@ class MarketplaceService } - public static function imap_debug_log($message, $debugMode, $progressCallback) { + public static function imap_debug_log($message, $debugMode, $progressCallback) + { if ($debugMode) { if ($progressCallback) { @@ -1702,7 +1748,8 @@ class MarketplaceService } } - public static function check_imap_errors($debugMode, $progressCallback) { + public static function check_imap_errors($debugMode, $progressCallback) + { $errors = imap_errors(); $alerts = imap_alerts(); @@ -1755,27 +1802,27 @@ class MarketplaceService { $count = 0; if ($message) { - $store = MarketplaceStore::getWarehouseGuidByAccountEmail($message['to']) ?? 206008; - - $order = self::getOrdersDataFromMessage($message); - - if ($message['subject_index'] == self::SUBJECT_INDEX[self::SUBJECT_NEW]) { - $statusCode = 'PROCESSING'; - $substatusCode = 'STARTED'; - } elseif ($message['subject_index'] == self::SUBJECT_INDEX[self::SUBJECT_APPROVED]) { - $statusCode = 'PROCESSING'; - $substatusCode = 'APPROVED'; - } elseif ($message['subject_index'] == self::SUBJECT_INDEX[self::SUBJECT_CANCELLED]) { - $statusCode = 'CANCELLED'; - $substatusCode = 'USER_CHANGED_MIND'; - } elseif ($message['subject_index'] == self::SUBJECT_INDEX[self::SUBJECT_CHANGED]) { - $statusCode = 'PROCESSING'; - $substatusCode = 'CHANGED'; - } elseif ($message['subject_index'] == self::SUBJECT_INDEX[self::SUBJECT_DELIVERED]) { - $statusCode = 'DELIVERED'; - $substatusCode = 'DELIVERY_SERVICE_DELIVERED'; - } - $count = self::processFlowwowOrders($order, $store, $statusCode, $substatusCode, $message['subject_index']); + $store = MarketplaceStore::getWarehouseGuidByAccountEmail($message['to']) ?? 206008; + + $order = self::getOrdersDataFromMessage($message); + + if ($message['subject_index'] == self::SUBJECT_INDEX[self::SUBJECT_NEW]) { + $statusCode = 'PROCESSING'; + $substatusCode = 'STARTED'; + } elseif ($message['subject_index'] == self::SUBJECT_INDEX[self::SUBJECT_APPROVED]) { + $statusCode = 'PROCESSING'; + $substatusCode = 'APPROVED'; + } elseif ($message['subject_index'] == self::SUBJECT_INDEX[self::SUBJECT_CANCELLED]) { + $statusCode = 'CANCELLED'; + $substatusCode = 'USER_CHANGED_MIND'; + } elseif ($message['subject_index'] == self::SUBJECT_INDEX[self::SUBJECT_CHANGED]) { + $statusCode = 'PROCESSING'; + $substatusCode = 'CHANGED'; + } elseif ($message['subject_index'] == self::SUBJECT_INDEX[self::SUBJECT_DELIVERED]) { + $statusCode = 'DELIVERED'; + $substatusCode = 'DELIVERY_SERVICE_DELIVERED'; + } + $count = self::processFlowwowOrders($order, $store, $statusCode, $substatusCode, $message['subject_index']); } return $count; @@ -1883,7 +1930,7 @@ class MarketplaceService } if ($clientText) { - $orderDetails['client'] = str_replace('Позвонить', '', $clientText); + $orderDetails['client'] = str_replace('Позвонить', '', $clientText); } $recipientBlock = $main->findOne('p:contains("Получатель")'); @@ -1898,15 +1945,15 @@ class MarketplaceService $itemsBlock = false; if ($main->findOneOrFalse('table h2:contains("Детали заказа")') != false) { $itemsBlock = $main->findOneOrFalse('table h2:contains("Детали заказа")'); - // Yii::warning('Детали заказа 1: ' . json_encode($itemsBlock->innerText(), JSON_UNESCAPED_UNICODE), __METHOD__); + // Yii::warning('Детали заказа 1: ' . json_encode($itemsBlock->innerText(), JSON_UNESCAPED_UNICODE), __METHOD__); } elseif ($main->findOneOrFalse('table p:contains("Детали заказа")') != false) { $itemsBlock = $main->findOneOrFalse('table p:contains("Детали заказа")'); - // Yii::warning('Детали заказа 2: ' . json_encode($itemsBlock->innerText(), JSON_UNESCAPED_UNICODE), __METHOD__); + // Yii::warning('Детали заказа 2: ' . json_encode($itemsBlock->innerText(), JSON_UNESCAPED_UNICODE), __METHOD__); } if ($itemsBlock) { Yii::warning('Детали заказа 3: ' . json_encode($itemsBlock->parentNode()->innerText(), JSON_UNESCAPED_UNICODE), __METHOD__); - // $itemsTable = $itemsBlock->parentNode()->find('table', 2); + // $itemsTable = $itemsBlock->parentNode()->find('table', 2); $itemsTable = $itemsBlock->parentNode(); $itemsRows = $itemsTable->find('tr'); @@ -1921,12 +1968,12 @@ class MarketplaceService // Извлекаем название и количество из второго $tds = $itemsRow->find('td'); if (count($tds) >= 2) { - $itemData['name'] = trim(str_replace("\u{00A0}", ' ', strip_tags(preg_replace('/\s+/', ' ',$tds[1]->find('p', 0)->innerText())))); + $itemData['name'] = trim(str_replace("\u{00A0}", ' ', strip_tags(preg_replace('/\s+/', ' ', $tds[1]->find('p', 0)->innerText())))); $itemData['count'] = trim(str_replace(["\u{00A0}", 'шт.'], '', strip_tags(preg_replace('/\s+/', '', $tds[1]->find('p', 1)->innerText())))); } // Извлекаем цену из третьего if (count($tds) >= 3) { - $itemData['price'] = (float)trim(str_replace(["\u{00A0}", '₽' , ' '], '', strip_tags(preg_replace('/\s+/', ' ', $tds[2]->find('p', 0)->innerText())))); + $itemData['price'] = (float)trim(str_replace(["\u{00A0}", '₽', ' '], '', strip_tags(preg_replace('/\s+/', ' ', $tds[2]->find('p', 0)->innerText())))); } // Добавляем данные в массив $orderItems[] = $itemData; @@ -1945,9 +1992,9 @@ class MarketplaceService ( preg_replace ( - '/\s+/', - ' ', - $sumBlock->innerText() + '/\s+/', + ' ', + $sumBlock->innerText() ) ) ) @@ -2005,23 +2052,23 @@ class MarketplaceService $marketplaceOrder = self::createOrder($orderDetails, $campaignId, $statusId, $substatusId); if ($marketplaceOrder->save()) { self::sendMessageToTelegram($marketplaceOrder->guid, "Тестовое сообщение для https://tracker.yandex.ru/ERP-326 из [2]"); - $newOrdersCount += 1; - self::createOrUpdateStatusHistory($marketplaceOrder->id, $statusId, $substatusId, $orderDetails); - self::saveOrderItems($orderDetails, $marketplaceOrder->id, $marketplaceOrder->warehouse_guid); + $newOrdersCount += 1; + self::createOrUpdateStatusHistory($marketplaceOrder->id, $statusId, $substatusId, $orderDetails); + self::saveOrderItems($orderDetails, $marketplaceOrder->id, $marketplaceOrder->warehouse_guid); } else { - Yii::error( - 'Ошибка сохранения заказа: ' . json_encode( - $marketplaceOrder->getErrors(), - JSON_UNESCAPED_UNICODE - ) - ); + Yii::error( + 'Ошибка сохранения заказа: ' . json_encode( + $marketplaceOrder->getErrors(), + JSON_UNESCAPED_UNICODE + ) + ); } self::setReadyMarketplaceOrders($marketplaceOrder); } } else { $marketplaceOrder->status_id = $statusId; $marketplaceOrder->substatus_id = $substatusId; - if ($index == self::SUBJECT_INDEX[self::SUBJECT_APPROVED] ) { + if ($index == self::SUBJECT_INDEX[self::SUBJECT_APPROVED]) { //заказ принят if ($marketplaceOrder->raw_data !== json_encode($orderDetails, JSON_UNESCAPED_UNICODE)) { $marketplaceOrder->raw_data = json_encode($orderDetails, JSON_UNESCAPED_UNICODE); @@ -2040,7 +2087,7 @@ class MarketplaceService } } elseif ($index == self::SUBJECT_INDEX[self::SUBJECT_CHANGED]) { - $oldRawData = json_decode($marketplaceOrder->raw_data,true, 512, JSON_UNESCAPED_UNICODE); + $oldRawData = json_decode($marketplaceOrder->raw_data, true, 512, JSON_UNESCAPED_UNICODE); $isChanged = false; // заказ изменен if (isset($orderDetails['comment']) && (!isset($oldRawData['comment']) || $orderDetails['comment'] != $oldRawData['comment'])) { @@ -2175,7 +2222,7 @@ class MarketplaceService (($statusHistoryRecord->status_id !== (int)$statusId && $statusHistoryRecord->status_id !== $deliveredStatusCodeId) || ($statusHistoryRecord->substatus_id !== (int)$substatusId && $statusHistoryRecord->substatus_id !== $deliveredSubstatusCodeId)) || (strtotime($order['date']) > strtotime($statusHistoryRecord->date_from)) - ) { + ) { $statusHistoryRecord->active = 0; $statusHistoryRecord->date_end = date('Y-m-d H:i:s'); $statusHistoryRecord->save(); @@ -2199,7 +2246,7 @@ class MarketplaceService } } } - + public static function saveOrderItems($order, $orderId, $warehouseGuid) { @@ -2231,6 +2278,7 @@ class MarketplaceService } } } + public static function extractArticleCode($productName) { if (preg_match('/\(([^()]+)\)\s*$/u', $productName, $matches)) { diff --git a/erp24/views/marketplace/report.php b/erp24/views/marketplace/report.php index 3df942c6..4da970c3 100644 --- a/erp24/views/marketplace/report.php +++ b/erp24/views/marketplace/report.php @@ -1,16 +1,49 @@ title = 'Список продуктов, которые не попадают в фиды'; +$this->title = 'Отчет продуктов по активности на МП'; $this->params['breadcrumbs'][] = $this->title; ?>
+
+ +
+
+ 'store', + 'data' => ArrayHelper::map( + CityStore::getAllActiveIdName(), + 'id', + 'name' + ), + 'value' => 4, + 'options' => [ + 'placeholder' => 'Выберите магазин', + 'allowClear' => true, + ], + 'pluginOptions' => [ + 'allowClear' => true, + ], + ]) ?> +
+
+ 'btn btn-primary']) ?> +
+
+ +
+ +

title) ?>