|
|
@@ -19,55 +19,97 @@ class ReportsModel
|
|
|
public function getReports(int $companyId, int $page = 1, int $limit = 10): array
|
|
|
{
|
|
|
$offset = ($page - 1) * $limit;
|
|
|
+
|
|
|
+ $sqlTotalValue = "
|
|
|
+ SELECT SUM(CAST(product_price AS REAL)) AS total_sales
|
|
|
+ FROM `order`
|
|
|
+ NATURAL JOIN order_item
|
|
|
+ NATURAL JOIN product
|
|
|
+ NATURAL JOIN status
|
|
|
+ WHERE company_id = :company_id
|
|
|
+ AND status_status = 'Finalizada'
|
|
|
+ ";
|
|
|
+ $stmtTotal = $this->pdo->prepare($sqlTotalValue);
|
|
|
+ $stmtTotal->execute(['company_id' => $companyId]);
|
|
|
+ $totalSales = $stmtTotal->fetchColumn() ?: 0;
|
|
|
|
|
|
- $sql = "
|
|
|
- SELECT o.order_id,
|
|
|
- o.order_finished_at,
|
|
|
- o.table_id,
|
|
|
- o.order_name,
|
|
|
- o.order_flag,
|
|
|
- p.product_name,
|
|
|
- p.product_price
|
|
|
- FROM 'order' o
|
|
|
+ $sqlTopItems = "
|
|
|
+ SELECT product_name, COUNT(*) AS sold_quantity
|
|
|
+ FROM `order`
|
|
|
NATURAL JOIN order_item
|
|
|
- NATURAL JOIN product p
|
|
|
+ NATURAL JOIN product
|
|
|
NATURAL JOIN status
|
|
|
- WHERE o.company_id = :company_id
|
|
|
+ WHERE company_id = :company_id
|
|
|
AND status_status = 'Finalizada'
|
|
|
- ORDER BY o.order_finished_at DESC
|
|
|
- LIMIT :limit OFFSET :offset;
|
|
|
+ GROUP BY product_id
|
|
|
+ ORDER BY sold_quantity DESC
|
|
|
+ LIMIT 3
|
|
|
";
|
|
|
+ $stmtTopItems = $this->pdo->prepare($sqlTopItems);
|
|
|
+ $stmtTopItems->execute(['company_id' => $companyId]);
|
|
|
+ $topItems = $stmtTopItems->fetchAll(\PDO::FETCH_ASSOC);
|
|
|
|
|
|
- $stmt = $this->pdo->prepare($sql);
|
|
|
- $stmt->bindValue(':company_id', $companyId, \PDO::PARAM_INT);
|
|
|
- $stmt->bindValue(':limit', $limit, \PDO::PARAM_INT);
|
|
|
- $stmt->bindValue(':offset', $offset, \PDO::PARAM_INT);
|
|
|
- $stmt->execute();
|
|
|
+ $sqlOrders = "
|
|
|
+ SELECT order_id,
|
|
|
+ order_finished_at,
|
|
|
+ table_id,
|
|
|
+ order_name,
|
|
|
+ order_flag
|
|
|
+ FROM `order`
|
|
|
+ NATURAL JOIN status
|
|
|
+ WHERE company_id = :company_id
|
|
|
+ AND status_status = 'Finalizada'
|
|
|
+ ORDER BY order_finished_at DESC
|
|
|
+ LIMIT :limit OFFSET :offset;
|
|
|
+ ";
|
|
|
+ $stmtOrders = $this->pdo->prepare($sqlOrders);
|
|
|
+ $stmtOrders->bindValue(':company_id', $companyId, \PDO::PARAM_INT);
|
|
|
+ $stmtOrders->bindValue(':limit', $limit, \PDO::PARAM_INT);
|
|
|
+ $stmtOrders->bindValue(':offset', $offset, \PDO::PARAM_INT);
|
|
|
+ $stmtOrders->execute();
|
|
|
+ $ordersData = $stmtOrders->fetchAll(\PDO::FETCH_ASSOC);
|
|
|
|
|
|
- $rows = $stmt->fetchAll(\PDO::FETCH_ASSOC);
|
|
|
+ if (empty($ordersData)) {
|
|
|
+ return [
|
|
|
+ 'total_sales' => (float) $totalSales,
|
|
|
+ 'top_items' => $topItems,
|
|
|
+ 'orders' => []
|
|
|
+ ];
|
|
|
+ }
|
|
|
|
|
|
- // Agrupamento por pedido
|
|
|
- $orders = [];
|
|
|
- foreach ($rows as $row) {
|
|
|
- $orderId = $row['order_id'];
|
|
|
+ $orderIds = array_column($ordersData, 'order_id');
|
|
|
+ $inQuery = implode(',', array_fill(0, count($orderIds), '?'));
|
|
|
|
|
|
- if (!isset($orders[$orderId])) {
|
|
|
- $orders[$orderId] = [
|
|
|
- 'order_id' => $row['order_id'],
|
|
|
- 'order_finished_at'=> $row['order_finished_at'],
|
|
|
- 'table_id' => $row['table_id'],
|
|
|
- 'order_name' => $row['order_name'],
|
|
|
- 'order_flag' => $row['order_flag'],
|
|
|
- 'items' => []
|
|
|
- ];
|
|
|
- }
|
|
|
+ $sqlItems = "
|
|
|
+ SELECT order_id,
|
|
|
+ product_name,
|
|
|
+ product_price
|
|
|
+ FROM order_item
|
|
|
+ NATURAL JOIN product
|
|
|
+ WHERE order_id IN ($inQuery);
|
|
|
+ ";
|
|
|
+ $stmtItems = $this->pdo->prepare($sqlItems);
|
|
|
+ foreach ($orderIds as $k => $id) {
|
|
|
+ $stmtItems->bindValue($k + 1, $id, \PDO::PARAM_INT);
|
|
|
+ }
|
|
|
+ $stmtItems->execute();
|
|
|
+ $itemsData = $stmtItems->fetchAll(\PDO::FETCH_ASSOC);
|
|
|
|
|
|
- $orders[$orderId]['items'][] = [
|
|
|
- 'product_name' => $row['product_name'],
|
|
|
- 'product_price' => $row['product_price']
|
|
|
+ $orders = [];
|
|
|
+ foreach ($ordersData as $order) {
|
|
|
+ $orders[$order['order_id']] = $order + ['items' => []];
|
|
|
+ }
|
|
|
+ foreach ($itemsData as $item) {
|
|
|
+ $orders[$item['order_id']]['items'][] = [
|
|
|
+ 'product_name' => $item['product_name'],
|
|
|
+ 'product_price' => $item['product_price']
|
|
|
];
|
|
|
}
|
|
|
|
|
|
- return array_values($orders);
|
|
|
+ return [
|
|
|
+ 'total_sales' => (float) $totalSales,
|
|
|
+ 'top_items' => $topItems,
|
|
|
+ 'orders' => array_values($orders),
|
|
|
+ ];
|
|
|
}
|
|
|
}
|