Jelajahi Sumber

feat: delete order, kitchen notes and paging on list itens

Fernando 4 bulan lalu
induk
melakukan
566288c3b2

+ 12 - 7
controllers/OrderCreateController.php

@@ -31,9 +31,11 @@ class OrderCreateController
              ->key('order_name', v::stringType()->notEmpty()->alnum(' '))
              ->key('order_phone', v::optional(v::stringType()->notEmpty()->length(8, 20)), false)
              ->key('status_status', v::stringType()->notEmpty()->in(['Aberta', 'Finalizada', 'Cancelada']))
+             ->key('kitchen_note', v::optional(v::stringType()), false)
              ->assert($body);
         } catch (ValidationException $e) {
-            return ResponseLib::sendFail("Validation failed: " . $e->getFullMessage(), [], "E_VALIDATE")->withStatus(400);
+            return ResponseLib::sendFail("Validation failed: " . $e->getFullMessage(), [], "E_VALIDATE")
+                ->withStatus(400);
         }
 
         $tableId = (int) $body['table_id'];
@@ -42,18 +44,20 @@ class OrderCreateController
         $orderPhone = $body['order_phone'] ?? '';
         $statusStatus = $body['status_status'];
         $userName = $body['user_name'];
+        $kitchenNote = isset($body['kitchen_note']) ? trim($body['kitchen_note']) : '';
 
         // Buscar user_id correspondente ao user_name
         $userId = $this->getUserIdByUserName($userName, $companyId);
-
         if (!$userId) {
-            return ResponseLib::sendFail("Usuário '{$userName}' não encontrado", [], "E_USER_NOT_FOUND")->withStatus(404);
+            return ResponseLib::sendFail("Usuário '{$userName}' não encontrado", [], "E_USER_NOT_FOUND")
+                ->withStatus(404);
         }
 
+        // Buscar status_id correspondente ao status_status
         $statusId = $this->model->getStatusIdByName($statusStatus);
-
         if ($statusId === null) {
-            return ResponseLib::sendFail("Invalid status_status provided: '{$statusStatus}'", [], "E_VALIDATE")->withStatus(400);
+            return ResponseLib::sendFail("Invalid status_status provided: '{$statusStatus}'", [], "E_VALIDATE")
+                ->withStatus(400);
         }
 
         $created = $this->model->createOrder(
@@ -62,7 +66,8 @@ class OrderCreateController
             $companyId,
             $orderName,
             $orderPhone,
-            $statusId 
+            $statusId,
+            $kitchenNote
         );
 
         return $created
@@ -80,4 +85,4 @@ class OrderCreateController
         }
         return null;
     }
-}
+}

+ 7 - 7
controllers/OrderDeleteController.php

@@ -20,23 +20,23 @@ class OrderDeleteController
     public function __invoke(ServerRequestInterface $request)
     {
         $body = json_decode((string)$request->getBody(), true) ?? [];
-
+    
         try {
-            // Validação dos campos obrigatórios: order_id e company_id
             v::key('order_id', v::intType()->positive())
                 ->key('company_id', v::intType()->positive())
                 ->assert($body);
         } catch (ValidationException $e) {
             return ResponseLib::sendFail("Validation failed: " . $e->getFullMessage(), [], "E_VALIDATE")->withStatus(400);
         }
-
+    
         $orderId = (int) $body['order_id'];
         $companyId = (int) $body['company_id'];
-
-        $deleted = $this->model->deleteOrder($orderId, $companyId);
-
+        $hardDelete = isset($body['cancel']) && $body['cancel'] === true;
+    
+        $deleted = $this->model->deleteOrder($orderId, $companyId, $hardDelete);
+    
         return $deleted
-            ? ResponseLib::sendOk(['deleted' => true])
+            ? ResponseLib::sendOk(['deleted' => true, 'hard' => $hardDelete])
             : ResponseLib::sendFail("Failed to delete order or order not found", [], "E_DATABASE")->withStatus(404);
     }
 }

+ 10 - 1
controllers/OrderItemGetController.php

@@ -26,6 +26,10 @@ class OrderItemGetController
             v::key('company_id', v::intType()->positive())->assert($body);
             if (isset($body['order_id'])) {
                 v::key('order_id', v::intType()->positive())->assert($body);
+            } else {
+                if (isset($body['page'])) {
+                    v::key('page', v::intType()->positive())->assert($body);
+                }
             }
         } catch (ValidationException $e) {
             return ResponseLib::sendFail("Validation failed: " . $e->getFullMessage(), [], "E_VALIDATE")->withStatus(400);
@@ -33,8 +37,13 @@ class OrderItemGetController
 
         $companyId = (int) $body['company_id'];
         $orderId = isset($body['order_id']) ? (int) $body['order_id'] : null;
+        $page = isset($body['page']) ? (int) $body['page'] : 1;
 
-        $orderItems = $this->model->getOrderItemsByOrderId($orderId, $companyId);
+        if ($page < 1) {
+            $page = 1;
+        }
+
+        $orderItems = $this->model->getOrderItemsByOrderId($orderId, $companyId, $page);
 
         $productModel = new ProductModel();
         foreach ($orderItems as &$item) {

+ 1 - 0
migrations/migrations_v1.sql

@@ -71,6 +71,7 @@ CREATE TABLE "order" (
     "order_created_at" TEXT NOT NULL,
     "order_finished_at" TEXT NOT NULL,
     "order_flag" TEXT NOT NULL,
+    "kitchen_note" TEXT NOT NULL DEFAULT '',
     FOREIGN KEY ("table_id") REFERENCES "table" ("table_id"),
     FOREIGN KEY ("user_id") REFERENCES "user" ("user_id"),
     FOREIGN KEY ("company_id") REFERENCES "company" ("company_id"),

+ 10 - 5
models/OrderItemModel.php

@@ -67,7 +67,7 @@ class OrderItemModel
         return $executed && $stmt->rowCount() > 0;
     }
 
-    public function getOrderItemsByOrderId(?int $orderId, int $companyId): array
+    public function getOrderItemsByOrderId(?int $orderId, int $companyId, int $page = 1, int $limit = 10): array
     {
         if ($orderId !== null) {
             $orderModel = new OrderModel();
@@ -75,7 +75,7 @@ class OrderItemModel
             if (!$order) {
                 return [];
             }
-
+        
             $stmt = $this->pdo->prepare("
                 SELECT order_item_id, order_id, product_id, company_id 
                 FROM order_item 
@@ -86,15 +86,20 @@ class OrderItemModel
                 'company_id' => $companyId,
             ]);
         } else {
+            $offset = ($page - 1) * $limit;
+        
             $stmt = $this->pdo->prepare("
                 SELECT order_item_id, order_id, product_id, company_id 
                 FROM order_item 
                 WHERE company_id = :company_id
+                LIMIT :limit OFFSET :offset
             ");
-            $stmt->execute(['company_id' => $companyId]);
+            $stmt->bindValue(':company_id', $companyId, \PDO::PARAM_INT);
+            $stmt->bindValue(':limit', $limit, \PDO::PARAM_INT);
+            $stmt->bindValue(':offset', $offset, \PDO::PARAM_INT);
+            $stmt->execute();
         }
-
+    
         return $stmt->fetchAll(\PDO::FETCH_ASSOC);
     }
-
 }

+ 62 - 22
models/OrderModel.php

@@ -22,20 +22,47 @@ class OrderModel
         int $companyId,
         string $orderName,
         string $orderPhone,
-        int $statusId
+        int $statusId,
+        string $kitchenNote = ''
     ): int|false {
-        if (!$this->tableExists($tableId, $companyId) || !$this->userExists($userId, $companyId) || !$this->companyExists($companyId) || !$this->statusExists($statusId)) {
+        if (
+            !$this->tableExists($tableId, $companyId) ||
+            !$this->userExists($userId, $companyId) ||
+            !$this->companyExists($companyId) ||
+            !$this->statusExists($statusId)
+        ) {
             error_log("Tentativa de criar pedido com IDs inválidos: table_id={$tableId}, user_id={$userId}, company_id={$companyId}, status_id={$statusId}");
             return false;
         }
-
+    
         $stmt = $this->pdo->prepare("
-            INSERT INTO `order` (table_id, user_id, company_id, order_name, order_phone, status_id, order_created_at, order_finished_at, order_flag)
-            VALUES (:table_id, :user_id, :company_id, :order_name, :order_phone, :status_id, :order_created_at, :order_finished_at, 'a')
+            INSERT INTO `order` (
+                table_id,
+                user_id,
+                company_id,
+                order_name,
+                order_phone,
+                status_id,
+                order_created_at,
+                order_finished_at,
+                order_flag,
+                kitchen_note
+            ) VALUES (
+                :table_id,
+                :user_id,
+                :company_id,
+                :order_name,
+                :order_phone,
+                :status_id,
+                :order_created_at,
+                :order_finished_at,
+                'a',
+                :kitchen_note
+            )
         ");
-
+    
         $currentTime = date('Y-m-d H:i:s');
-
+    
         try {
             $executed = $stmt->execute([
                 'table_id' => $tableId,
@@ -45,8 +72,10 @@ class OrderModel
                 'order_phone' => $orderPhone,
                 'status_id' => $statusId,
                 'order_created_at' => $currentTime,
-                'order_finished_at' => ' '
+                'order_finished_at' => ' ',
+                'kitchen_note' => $kitchenNote
             ]);
+        
             return $executed ? (int)$this->pdo->lastInsertId() : false;
         } catch (\PDOException $e) {
             error_log("PDO Exception during order creation: " . $e->getMessage());
@@ -72,25 +101,36 @@ class OrderModel
         return $executed && $stmt->rowCount() > 0;
     }
 
-    public function deleteOrder(int $orderId, int $companyId): bool
+        public function deleteOrder(int $orderId, int $companyId, bool $hardDelete = false): bool
     {
-        $currentTime = date('Y-m-d H:i:s');
+        if ($hardDelete) {
+            $stmtItems = $this->pdo->prepare("DELETE FROM order_item WHERE order_id = :order_id");
+            $stmtItems->execute(['order_id' => $orderId]);
 
-        $stmt = $this->pdo->prepare("
-            UPDATE `order`
-            SET order_flag = 'd', order_finished_at = :order_finished_at
-            WHERE order_id = :order_id AND company_id = :company_id AND order_flag = 'a'
-        ");
-            
-        $executed = $stmt->execute([
-            'order_finished_at' => $currentTime,
-            'order_id' => $orderId,
-            'company_id' => $companyId
-        ]);
+            $stmtOrder = $this->pdo->prepare("DELETE FROM `order` WHERE order_id = :order_id AND company_id = :company_id");
+            $stmtOrder->execute(['order_id' => $orderId, 'company_id' => $companyId]);
 
-        return $executed && $stmt->rowCount() > 0;
+            return $stmtOrder->rowCount() > 0;
+        } else {
+            $currentTime = date('Y-m-d H:i:s');
+
+            $stmt = $this->pdo->prepare("
+                UPDATE `order`
+                SET order_flag = 'd', order_finished_at = :order_finished_at
+                WHERE order_id = :order_id AND company_id = :company_id AND order_flag = 'a'
+            ");
+
+            $executed = $stmt->execute([
+                'order_finished_at' => $currentTime,
+                'order_id' => $orderId,
+                'company_id' => $companyId
+            ]);
+
+            return $executed && $stmt->rowCount() > 0;
+        }
     }
 
+
     public function getOrders(int $companyId, ?int $statusId = null): array
     {
         $sql = "SELECT * FROM `order` WHERE company_id = :company_id AND order_flag = 'a'";