From 330ac4370f77e5320730395694ef06e1738ee8fc Mon Sep 17 00:00:00 2001 From: Jeppe Bundgaard Date: Tue, 10 Feb 2026 14:05:22 +0100 Subject: [PATCH] Add `getWashesInTimeRange` method to `orders_o` for fetching orders within specified daily time range - Introduce filtering by time range and optional department ID. - Validate inputs and ensure robust exception handling for invalid ranges. - Optimize SQL queries for performance with joins and distinct order retrieval. --- services/nginx/app/objects/orders_o.php | 58 +++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/services/nginx/app/objects/orders_o.php b/services/nginx/app/objects/orders_o.php index 4c92eb6d..1122ce4c 100644 --- a/services/nginx/app/objects/orders_o.php +++ b/services/nginx/app/objects/orders_o.php @@ -1566,4 +1566,62 @@ class orders_o extends db } return $order_item_objects; } + + /** + * @param \DateTime|string $daily_start E.g. 2025-01-01 08:00:00 + * @param \DateTime|string $daily_end E.g. 2025-01-01 18:00:00 + * $options array An optional array of options to filter the results. Supported options: + * - department_id (int): Filter orders by a specific department ID. + * @return orders_o[] An array of orders that have washes within the specified daily time range, regardless of the date. The time range is specified in "H:i:s" format (e.g. "08:00:00" for 8 AM and "18:00:00" for 6 PM). + * @throws Exception + */ + public function getWashesInTimeRange(\DateTime|string $daily_start, \DateTime|string $daily_end, array $options = []): array + { global /** @var db $db */ + $db; + // Convert daily_start and daily_end to time strings if they are DateTime objects + if ($daily_start instanceof \DateTime) { + $daily_start = $daily_start->format('Y-m-d H:i:s'); + } + if ($daily_end instanceof \DateTime) { + $daily_end = $daily_end->format('Y-m-d H:i:s'); + } + // Validate the time range + if (strtotime($daily_start) === false || strtotime($daily_end) === false) { + throw new Exception('Invalid time range provided'); + } + if (strtotime($daily_start) > strtotime($daily_end)) { + throw new Exception('The start time cannot be after the end time'); + } + // Prepare the SQL query to find orders with washes in the daily time range + $daily_start = $db->escape_string($daily_start); + $daily_end = $db->escape_string($daily_end); + // Options for filtering by department ID + $department_filter = ''; + if (isset($options['department_id']) && is_int($options['department_id'])) { + $department_id = $options['department_id']; + $department_filter = "AND o.department_id = $department_id"; + } + + $sql = "SELECT DISTINCT o.id + FROM $this->table o + JOIN order_items oi ON oi.order_id = o.id + JOIN products p ON p.id = oi.product_id + WHERE TIME(o.created_at) BETWEEN TIME('$daily_start') AND TIME('$daily_end') + AND o.created_at BETWEEN '$daily_start' AND '$daily_end' + AND o.deleted_at IS NULL + AND p.is_wash = 1 + $department_filter"; + //echo "Executing SQL query to find washes in time range: $sql\n"; // Debug log to check the generated SQL query + $result = $db->query($sql); + if ($result->num_rows === 0) { + return []; // No washes found in the time range + } + $orders = []; + while ($row = $result->fetch_assoc()) { + $order = new orders_o(); + $order->select((int)$row['id']); + $orders[] = $order; + } + return $orders; + } } \ No newline at end of file