Browse Source

feat: report values and update fixes

Fernando 4 tháng trước cách đây
mục cha
commit
fab7ecab29
3 tập tin đã thay đổi với 104 bổ sung45 xóa
  1. 2 2
      controllers/OrderUpdateController.php
  2. 23 6
      models/OrderModel.php
  3. 79 37
      models/ReportsModel.php

+ 2 - 2
controllers/OrderUpdateController.php

@@ -25,7 +25,7 @@ class OrderUpdateController
             v::key('company_id', v::intType()->positive())
                 ->key('order_id', v::intType()->positive())
                 ->key('status_status', v::stringType()->notEmpty()->in(['Aberta', 'Finalizada', 'Cancelada']), true)
-                ->optional(v::key('order_flag', v::stringType()->notEmpty()->in(['Dinheiro', 'PIX', 'Cartão de Crédito', 'Cartão de Débito', 'p', 'a']), true))
+                ->key('order_flag', v::stringType()->notEmpty()->in(['Dinheiro', 'PIX', 'Cartão de Crédito', 'Cartão de Débito', 'p', 'a']), false)
                 ->assert($body);
         } catch (ValidationException $e) {
             return ResponseLib::sendFail("Validation failed: " . $e->getFullMessage(), [], "E_VALIDATE")->withStatus(400);
@@ -34,7 +34,7 @@ class OrderUpdateController
         $companyId    = (int) $body['company_id'];
         $orderId      = (int) $body['order_id'];
         $statusStatus = $body['status_status'];
-        $orderFlag    = $body['order_flag'] ?? '';
+        $orderFlag = array_key_exists('order_flag', $body) ? $body['order_flag'] : null;
 
         $statusId = $this->model->getStatusIdByName($statusStatus);
         if ($statusId === '') {

+ 23 - 6
models/OrderModel.php

@@ -56,37 +56,54 @@ class OrderModel
 
     public function updateOrderStatus(int $orderId, int $companyId, int $statusId, ?string $orderFlag = null): bool
     {
+        $stmtStatus = $this->pdo->prepare("
+            SELECT status_status 
+            FROM status 
+            WHERE status_id = :status_id
+        ");
+        $stmtStatus->execute(['status_id' => $statusId]);
+        $statusName = $stmtStatus->fetchColumn();
+
         $sql = "
             UPDATE `order`
             SET status_id = :status_id
         ";
-    
+
+        if (strtolower($statusName) === 'finalizada') {
+            $sql .= ", order_finished_at = :order_finished_at";
+        }
+
         if ($orderFlag !== null) {
             $sql .= ", order_flag = :order_flag";
         }
-    
+
         $sql .= "
             WHERE order_id = :order_id 
               AND company_id = :company_id
         ";
-    
+
         $stmt = $this->pdo->prepare($sql);
-    
+
         $params = [
             'status_id'  => $statusId,
             'order_id'   => $orderId,
             'company_id' => $companyId
         ];
-    
+
+        if (strtolower($statusName) === 'finalizada') {
+            $params['order_finished_at'] = date('Y-m-d H:i:s');
+        }
+
         if ($orderFlag !== null) {
             $params['order_flag'] = $orderFlag;
         }
-    
+
         $executed = $stmt->execute($params);
         return $executed && $stmt->rowCount() > 0;
     }
 
 
+
         public function deleteOrder(int $orderId, int $companyId, bool $hardDelete = false): bool
     {
         if ($hardDelete) {

+ 79 - 37
models/ReportsModel.php

@@ -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),
+        ];
     }
 }