$productsArr = Products1c::getProductsFromClass(['wrap']);
return $productsArr['wrap'] ?? [];
}
+
+ /**
+ * Получить продажи МП из таблицы sales через create_checks
+ *
+ * @param string $dateFrom
+ * @param string $dateTo
+ * @return array
+ * @throws \Exception
+ */
+ public function getMarketplaceSalesFromChecks(string $dateFrom, string $dateTo): array
+ {
+ $query = Sales::find()
+ ->alias('s')
+ ->select([
+ 's.id',
+ 's.date',
+ 's.summ',
+ 's.skidka',
+ 's.store_id_1c',
+ 's.operation',
+ 'cc.marketplace_order_id',
+ 'cc.is_marketplace',
+ ])
+ ->innerJoin('create_checks cc', 's.id = cc.guid')
+ ->andWhere(['cc.is_marketplace' => 1])
+ ->andWhere(['>=', 's.date', DateHelper::getDateTimeStartDay($dateFrom, true)])
+ ->andWhere(['<=', 's.date', DateHelper::getDateTimeEndDay($dateTo, true)])
+ ->orderBy(['s.date' => SORT_DESC]);
+
+ return $query->asArray()->all();
+ }
+
+ /**
+ * Получить продажи МП из завершенных заказов (fallback)
+ *
+ * @param string $dateFrom
+ * @param string $dateTo
+ * @return array
+ * @throws \Exception
+ */
+ public function getMarketplaceSalesFromOrders(string $dateFrom, string $dateTo): array
+ {
+ $orders = $this->getMarketplaceOrdersForPeriod($dateFrom, $dateTo);
+
+ $result = [];
+ foreach ($orders as $order) {
+ // Получаем store_id_1c через связь
+ $storeId1c = null;
+ if ($order->store && $order->store->storeGuid) {
+ $storeId1c = $order->store->storeGuid->export_val;
+ }
+
+ if (empty($storeId1c)) {
+ continue;
+ }
+
+ $result[] = [
+ 'id' => $order->id,
+ 'date' => $order->updated_at,
+ 'summ' => $order->total,
+ 'skidka' => 0,
+ 'store_id_1c' => $storeId1c,
+ 'operation' => Sales::OPERATION_SALE,
+ 'marketplace_order_id' => $order->marketplace_order_id,
+ 'is_marketplace' => 1,
+ ];
+ }
+
+ return $result;
+ }
+
+ /**
+ * Получить продажи МП по магазинам с автоматическим выбором источника
+ *
+ * @param string $dateFrom
+ * @param string $dateTo
+ * @return array
+ * @throws \Exception
+ */
+ public function getMarketplaceSalesByStore(string $dateFrom, string $dateTo): array
+ {
+ // Сначала пытаемся получить из чеков
+ $salesFromChecks = $this->getMarketplaceSalesFromChecks($dateFrom, $dateTo);
+
+ $sales = [];
+ $source = 'orders'; // По умолчанию fallback
+
+ if (!empty($salesFromChecks)) {
+ // Если есть чеки МП, используем их
+ $sales = $salesFromChecks;
+ $source = 'checks';
+ } else {
+ // Fallback: используем заказы МП
+ $sales = $this->getMarketplaceSalesFromOrders($dateFrom, $dateTo);
+ }
+
+ // Группируем по магазинам
+ return $this->groupMarketplaceSalesByStore($sales, $source);
+ }
+
+ /**
+ * Группировка продаж МП по магазинам
+ *
+ * @param array $sales
+ * @param string $source
+ * @return array
+ */
+ private function groupMarketplaceSalesByStore(array $sales, string $source): array
+ {
+ $grouped = [];
+
+ foreach ($sales as $sale) {
+ $storeId1c = $sale['store_id_1c'];
+
+ if (!isset($grouped[$storeId1c])) {
+ $grouped[$storeId1c] = [
+ 'store_id_1c' => $storeId1c,
+ 'total_orders' => 0,
+ 'total_summ' => 0,
+ 'source' => $source,
+ 'sales' => [],
+ ];
+ }
+
+ $saleAmount = $sale['summ'] - $sale['skidka'];
+
+ // Применяем операцию (продажа или возврат)
+ if ($sale['operation'] === Sales::OPERATION_SALE) {
+ $grouped[$storeId1c]['total_summ'] += $saleAmount;
+ $grouped[$storeId1c]['total_orders']++;
+ } elseif ($sale['operation'] === Sales::OPERATION_RETURN) {
+ $grouped[$storeId1c]['total_summ'] -= $saleAmount;
+ }
+
+ $grouped[$storeId1c]['sales'][] = $sale;
+ }
+
+ // Сортировка по сумме (убывание)
+ uasort($grouped, function ($a, $b) {
+ return $b['total_summ'] <=> $a['total_summ'];
+ });
+
+ return $grouped;
+ }
}
}
echo"</tbody></table>
<b>Итого $itog руб по доставке</b>";
+?>
+
+<?php if (!empty($marketplaceSales)): ?>
+<h5 class="mt-4">Продажи маркетплейсов</h5>
+<div class="table-responsive">
+ <table class="table table-striped">
+ <thead>
+ <tr>
+ <th>Магазин</th>
+ <th>Количество заказов</th>
+ <th>Сумма продаж</th>
+ <th>Источник данных</th>
+ </tr>
+ </thead>
+ <tbody>
+ <?php
+ $totalMpSumm = 0;
+ $totalMpOrders = 0;
+ foreach ($marketplaceSales as $storeId1c => $data):
+ $storeName = $city_stores[$storeId1c] ?? 'Неизвестный магазин';
+ $totalMpSumm += $data['total_summ'];
+ $totalMpOrders += $data['total_orders'];
+ ?>
+ <tr>
+ <td><?= $storeName ?></td>
+ <td><?= $data['total_orders'] ?></td>
+ <td><?= number_format($data['total_summ'], 2, '.', ' ') ?> руб</td>
+ <td>
+ <span class="badge bg-<?= $data['source'] === 'checks' ? 'success' : 'warning' ?>">
+ <?= $data['source'] === 'checks' ? 'Чеки (1С)' : 'Заказы МП' ?>
+ </span>
+ </td>
+ </tr>
+ <?php endforeach; ?>
+ </tbody>
+ <tfoot>
+ <tr class="bg-success">
+ <th>Итого</th>
+ <th><?= $totalMpOrders ?></th>
+ <th><?= number_format($totalMpSumm, 2, '.', ' ') ?> руб</th>
+ <th></th>
+ </tr>
+ </tfoot>
+ </table>
+</div>
+<b>Итого <?= number_format($totalMpSumm, 2, '.', ' ') ?> руб по маркетплейсам</b>
+<?php endif; ?>