0.0005) { apply_sale_payment($id, $summary['due_amount'], false); set_flash('success', tr('تم تحويل حالة الدفع إلى مدفوع بنجاح.', 'Payment status updated to paid successfully.')); } else { set_flash('info', tr('الفاتورة مدفوعة مسبقاً.', 'Invoice is already paid.')); } } } catch (Exception $e) { set_flash('danger', tr('تعذر تحديث حالة الدفع.', 'Failed to update payment status.')); } redirect_to('eid_orders.php', $_GET); } if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'update_delivery_status') { $id = (int)$_POST['id']; $newStatus = trim((string)($_POST['status'] ?? 'pending')); $allowedStatuses = array_keys(eid_delivery_status_options()); if (in_array($newStatus, $allowedStatuses, true)) { $stmt = db()->prepare("UPDATE sales_orders SET delivery_status = :status WHERE id = :id AND order_type = 'eid'"); $stmt->execute([':status' => $newStatus, ':id' => $id]); set_flash('success', tr('تم تحديث حالة التجهيز بنجاح.', 'Prep status updated successfully.')); } redirect_to('eid_orders.php', $_GET); } if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'delete_order') { $id = (int) ($_POST['id'] ?? 0); try { $stmt = db()->prepare("DELETE FROM sales_orders WHERE id = :id AND order_type = :order_type LIMIT 1"); $stmt->execute([ ':id' => $id, ':order_type' => 'eid', ]); if ($stmt->rowCount() > 0) { set_flash('success', tr('تم حذف طلب العيد بنجاح.', 'Eid order deleted successfully.')); } else { set_flash('warning', tr('تعذر العثور على طلب العيد المطلوب حذفه.', 'The Eid order to delete could not be found.')); } } catch (Throwable $e) { set_flash('danger', tr('تعذر حذف طلب العيد.', 'Failed to delete the Eid order.')); } redirect_to('eid_orders.php', $_GET); } $activeNav = 'eid_orders'; $pageTitle = tr('طلبات العيد', 'Eid Orders'); $metaDescription = tr('متابعة طلبات العيد مع الفلاتر والمدى الزمني.', 'Track Eid orders with filters and date range.'); $mode = isset($_GET['mode']) && in_array($_GET['mode'], ['pos', 'normal'], true) ? $_GET['mode'] : null; $branch = isset($_GET['branch']) && array_key_exists($_GET['branch'], branches()) ? $_GET['branch'] : null; $search = trim((string) ($_GET['q'] ?? '')); $paymentStatus = trim((string) ($_GET['payment_status'] ?? '')); $deliveryStatus = trim((string) ($_GET['delivery_status'] ?? '')); $dateFrom = trim((string) ($_GET['date_from'] ?? '')); $dateTo = trim((string) ($_GET['date_to'] ?? '')); $sort = trim((string) ($_GET['sort'] ?? 'delivery_date')); $dir = strtolower(trim((string) ($_GET['dir'] ?? 'desc'))); $sortMap = [ 'receipt_no' => 'receipt_no', 'customer' => 'customer_name', 'branch' => 'branch_code', 'delivery_date' => 'COALESCE(delivery_date, DATE(sale_date))', 'delivery_status' => 'delivery_status', 'item_count' => 'item_count', 'total_amount' => 'total_amount', ]; if (!isset($sortMap[$sort])) { $sort = 'delivery_date'; } if (!in_array($dir, ['asc', 'desc'], true)) { $dir = 'asc'; } $page = max(1, (int) ($_GET['p'] ?? 1)); $limit = 50; $offset = ($page - 1) * $limit; $allowedBranches = $user && $user['role'] !== 'owner' ? get_user_branches($user) : []; $deliveryOptions = eid_delivery_status_options(); $dbError = null; $totalPages = 1; $orders = []; $summary = [ 'total_orders' => 0, 'total_items' => 0, 'total_amount' => 0, 'prep_orders' => 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 = ''; } $summarySql = "SELECT COUNT(*) AS total_orders, COALESCE(SUM(item_count), 0) AS total_items, COALESCE(SUM(total_amount), 0) AS total_amount, COALESCE(SUM(CASE WHEN delivery_status IN ('pending', 'preparing') THEN 1 ELSE 0 END), 0) AS prep_orders FROM sales_orders" . $where; $summaryStmt = db()->prepare($summarySql); foreach ($params as $key => $value) { $summaryStmt->bindValue($key, $value); } $summaryStmt->execute(); $summary = $summaryStmt->fetch() ?: $summary; $countSql = 'SELECT COUNT(*) FROM sales_orders' . $where; $countStmt = db()->prepare($countSql); foreach ($params as $key => $value) { $countStmt->bindValue($key, $value); } $countStmt->execute(); $total = (int) $countStmt->fetchColumn(); $totalPages = max(1, (int) ceil($total / $limit)); $primarySort = $sortMap[$sort] . ' ' . strtoupper($dir); $secondarySort = $sort === 'delivery_date' ? ', sale_date DESC, id DESC' : ', COALESCE(delivery_date, DATE(sale_date)) DESC, sale_date DESC, id DESC'; $sql = "SELECT sales_orders.*, ( SELECT COUNT(*) FROM sales_orders AS seq WHERE seq.order_type = sales_orders.order_type AND seq.sale_mode = sales_orders.sale_mode AND seq.id <= sales_orders.id ) AS mode_serial_no FROM sales_orders" . $where . ' ORDER BY ' . $primarySort . $secondarySort . ' LIMIT :limit OFFSET :offset'; $stmt = db()->prepare($sql); foreach ($params as $key => $value) { $stmt->bindValue($key, $value); } $stmt->bindValue(':limit', $limit, PDO::PARAM_INT); $stmt->bindValue(':offset', $offset, PDO::PARAM_INT); $stmt->execute(); $orders = $stmt->fetchAll(); foreach ($orders as &$order) { $order['items'] = json_decode((string) ($order['items_json'] ?? '[]'), true) ?: []; $order['payment_summary'] = sale_payment_summary($order); $itemPreview = []; foreach ($order['items'] as $item) { $name = trim((string) ($item['name'] ?? $item['name_ar'] ?? $item['name_en'] ?? $item['sku'] ?? '')); $qty = max(0, (int) ($item['qty'] ?? 0)); if ($name === '') { continue; } $itemPreview[] = $qty > 0 ? $name . ' ×' . $qty : $name; if (count($itemPreview) >= 2) { break; } } $remainingItems = max(0, count($order['items']) - count($itemPreview)); $order['item_preview'] = $itemPreview; $order['item_preview_more'] = $remainingItems; } unset($order); } catch (Throwable $e) { $dbError = $e->getMessage(); } $queryState = static function (array $extra = []) use ($search, $branch, $mode, $paymentStatus, $deliveryStatus, $dateFrom, $dateTo, $sort, $dir): array { $params = [ 'q' => $search, 'branch' => $branch, 'mode' => $mode, 'payment_status' => $paymentStatus, 'delivery_status' => $deliveryStatus, 'date_from' => $dateFrom, 'date_to' => $dateTo, 'sort' => $sort, 'dir' => $dir, ]; foreach ($extra as $key => $value) { $params[$key] = $value; } return array_filter($params, static fn($value) => $value !== null && $value !== ''); }; $sortUrl = static function (string $column) use ($sort, $dir, $queryState): string { $nextDir = $sort === $column && $dir === 'asc' ? 'desc' : 'asc'; return url_for('eid_orders.php', $queryState(['sort' => $column, 'dir' => $nextDir, 'p' => 1])); }; $sortIcon = static function (string $column) use ($sort, $dir): string { if ($sort !== $column) { return 'bi-arrow-down-up text-muted'; } return $dir === 'asc' ? 'bi-sort-down-alt' : 'bi-sort-up'; }; require __DIR__ . '/includes/header.php'; ?>

>

# ·
8) { $phone = substr($phone, 3); } echo h($phone); } else { echo '-'; } ?>
1): ?>