0, 'unique_items' => 0, 'total_quantity' => 0, 'total_amount' => 0, ]; try { $params = [':order_type' => 'eid']; $where = ' WHERE order_type = :order_type '; if ($mode) { $where .= ' AND sale_mode = :sale_mode '; $params[':sale_mode'] = $mode; } if ($branch) { $where .= ' AND branch_code = :branch_code '; $params[':branch_code'] = $branch; } if ($user && $user['role'] !== 'owner') { if ($allowedBranches === []) { $where .= ' AND 1=0 '; } else { $namedParams = []; foreach ($allowedBranches as $i => $allowedBranch) { $key = ':v_branch_' . $i; $namedParams[] = $key; $params[$key] = $allowedBranch; } $where .= ' AND branch_code IN (' . implode(', ', $namedParams) . ') '; } } if ($search !== '') { $where .= ' AND (receipt_no LIKE :search OR customer_name LIKE :search OR cashier_name LIKE :search OR notes LIKE :search) '; $params[':search'] = '%' . $search . '%'; } if (in_array($paymentStatus, ['paid', 'partial', 'unpaid'], true)) { $where .= ' AND payment_status = :payment_status '; $params[':payment_status'] = $paymentStatus; } if (isset($deliveryOptions[$deliveryStatus])) { $where .= ' AND delivery_status = :delivery_status '; $params[':delivery_status'] = $deliveryStatus; } if ($dateFrom !== '' && preg_match('/^\d{4}-\d{2}-\d{2}$/', $dateFrom)) { $where .= ' AND DATE(COALESCE(delivery_date, sale_date)) >= :date_from '; $params[':date_from'] = $dateFrom; } else { $dateFrom = ''; } if ($dateTo !== '' && preg_match('/^\d{4}-\d{2}-\d{2}$/', $dateTo)) { $where .= ' AND DATE(COALESCE(delivery_date, sale_date)) <= :date_to '; $params[':date_to'] = $dateTo; } else { $dateTo = ''; } $sql = 'SELECT * FROM sales_orders' . $where . ' ORDER BY COALESCE(delivery_date, DATE(sale_date)) ASC, sale_date ASC'; $stmt = db()->prepare($sql); foreach ($params as $key => $value) { $stmt->bindValue($key, $value); } $stmt->execute(); $orders = $stmt->fetchAll(); $itemIndex = []; foreach ($orders as &$order) { $decodedItems = json_decode((string) ($order['items_json'] ?? '[]'), true); $items = is_array($decodedItems) ? $decodedItems : []; $order['items'] = $items; foreach ($items as $item) { $sku = trim((string) ($item['sku'] ?? '')); $name = trim((string) ($item['name_ar'] ?? '')); if ($name === '') { $name = trim((string) ($item['name_en'] ?? '')); } if ($name === '') { $name = $sku !== '' ? $sku : tr('صنف بدون اسم', 'Unnamed item'); } $key = $sku !== '' ? $sku : md5($name); $qty = max(0, (float) ($item['qty'] ?? 0)); if (!isset($itemIndex[$key])) { $itemIndex[$key] = [ 'sku' => $sku, 'name' => $name, 'qty' => 0.0, 'order_count' => 0, ]; } $itemIndex[$key]['qty'] += $qty; $itemIndex[$key]['order_count']++; } } unset($order); usort($orders, static function (array $a, array $b): int { $aDate = (string) ($a['delivery_date'] ?: substr((string) ($a['sale_date'] ?? ''), 0, 10)); $bDate = (string) ($b['delivery_date'] ?: substr((string) ($b['sale_date'] ?? ''), 0, 10)); return [$aDate, (string) ($a['receipt_no'] ?? '')] <=> [$bDate, (string) ($b['receipt_no'] ?? '')]; }); $itemRows = array_values($itemIndex); usort($itemRows, static function (array $a, array $b): int { if ($a['qty'] === $b['qty']) { return strcasecmp((string) $a['name'], (string) $b['name']); } return $b['qty'] <=> $a['qty']; }); $summary['total_orders'] = count($orders); $summary['unique_items'] = count($itemRows); $summary['total_quantity'] = array_sum(array_map(static fn(array $row): float => (float) $row['qty'], $itemRows)); $summary['total_amount'] = array_sum(array_map(static fn(array $row): float => (float) ($row['total_amount'] ?? 0), $orders)); } catch (Throwable $e) { $dbError = $e->getMessage(); } $filterParams = array_filter([ 'q' => $search, 'branch' => $branch, 'mode' => $mode, 'payment_status' => $paymentStatus, 'delivery_status' => $deliveryStatus, 'date_from' => $dateFrom, 'date_to' => $dateTo, ], static fn($value) => $value !== null && $value !== ''); $generatedAt = date('Y-m-d H:i'); require __DIR__ . '/includes/header.php'; ?>

:
:
$row): ?>
#