Quellcode durchsuchen

feat: Reports Route and OrderUpdate updates order_flag(payment type)

Fernando vor 4 Monaten
Ursprung
Commit
8529a6c725

+ 7 - 9
controllers/OrderUpdateController.php

@@ -22,32 +22,30 @@ class OrderUpdateController
         $body = json_decode((string)$request->getBody(), true) ?? [];
 
         try {
-            // company_id e order_id são obrigatórios para identificar o pedido
-            // status_status é obrigatório para a atualização
             v::key('company_id', v::intType()->positive())
                 ->key('order_id', v::intType()->positive())
-                ->key('status_status', v::stringType()->notEmpty()->in(['Aberta', 'Finalizada', 'Cancelada']), true) // Adicione aqui todos os status possíveis para atualização
+                ->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']), true))
                 ->assert($body);
         } catch (ValidationException $e) {
             return ResponseLib::sendFail("Validation failed: " . $e->getFullMessage(), [], "E_VALIDATE")->withStatus(401);
         }
 
-        $companyId = (int) $body['company_id'];
-        $orderId = (int) $body['order_id'];
+        $companyId    = (int) $body['company_id'];
+        $orderId      = (int) $body['order_id'];
         $statusStatus = $body['status_status'];
+        $orderFlag    = $body['order_flag'] ?? null;
 
-        // Converte o status_status para status_id usando o Model
         $statusId = $this->model->getStatusIdByName($statusStatus);
-
         if ($statusId === null) {
-            // Isso pode acontecer se o status_status enviado não for mapeado no banco
             return ResponseLib::sendFail("Invalid status_status Provided: '{$statusStatus}'", [], "E_VALIDATE")->withStatus(400);
         }
 
-        $updated = $this->model->updateOrderStatus($orderId, $companyId, $statusId);
+        $updated = $this->model->updateOrderStatus($orderId, $companyId, $statusId, $orderFlag);
 
         return $updated
             ? ResponseLib::sendOk(['updated' => true])
             : ResponseLib::sendFail("Failed to Update Order Status or Order Not Found", [], "E_DATABASE")->withStatus(204);
+
     }
 }

+ 44 - 0
controllers/ReportsGetController.php

@@ -0,0 +1,44 @@
+<?php
+
+namespace Controllers;
+
+use Libs\ResponseLib;
+use Psr\Http\Message\ServerRequestInterface;
+use Models\ReportsModel;
+use Respect\Validation\Validator as v;
+use Respect\Validation\Exceptions\ValidationException;
+
+class ReportsGetController
+{
+    private ReportsModel $model;
+
+    public function __construct()
+    {
+        $this->model = new ReportsModel();
+    }
+
+    public function __invoke(ServerRequestInterface $request)
+    {
+        $body = json_decode((string) $request->getBody(), true) ?? [];
+
+        try {
+            v::key('company_id', v::intType()->positive())->assert($body);
+            v::optional(v::key('page', v::intType()->positive()))->assert($body);
+            v::optional(v::key('limit', v::intType()->positive()))->assert($body);
+        } catch (ValidationException $e) {
+            return ResponseLib::sendFail("Validation failed: " . $e->getFullMessage(), [], "E_VALIDATE")->withStatus(401);
+        }
+
+        $companyId = (int) $body['company_id'];
+        $page      = isset($body['page']) ? (int) $body['page'] : 1;
+        $limit     = isset($body['limit']) ? (int) $body['limit'] : 10;
+
+        $reports = $this->model->getReports($companyId, $page, $limit);
+
+        if (!$reports) {
+            return ResponseLib::sendFail("No Reports Found", [], "E_NO_DATA")->withStatus(204);
+        }
+
+        return ResponseLib::sendOk($reports);
+    }
+}

+ 26 - 11
models/OrderModel.php

@@ -54,24 +54,39 @@ class OrderModel
         }
     }
 
-    public function updateOrderStatus(int $orderId, int $companyId, int $statusId): bool
+    public function updateOrderStatus(int $orderId, int $companyId, int $statusId, ?string $orderFlag = null): bool
     {
-
-        $stmt = $this->pdo->prepare("
+        $sql = "
             UPDATE `order`
             SET status_id = :status_id
-            WHERE order_id = :order_id AND company_id = :company_id AND order_flag = 'a'
-        ");
-
-        $executed = $stmt->execute([
-            'status_id' => $statusId,
-            'order_id' => $orderId,
+        ";
+    
+        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 ($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) {

+ 73 - 0
models/ReportsModel.php

@@ -0,0 +1,73 @@
+<?php
+
+namespace Models;
+
+class ReportsModel
+{
+    private \PDO $pdo;
+
+    public function __construct()
+    {
+        $dbFile = $_ENV['DB_FILE'];
+        $dbPath = __DIR__ . '/../' . $dbFile;
+        $this->pdo = new \PDO("sqlite:" . $dbPath);
+        $this->pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
+        $this->pdo->exec('PRAGMA journal_mode = WAL;');
+        $this->pdo->exec('PRAGMA busy_timeout = 5000;');
+    }
+
+    public function getReports(int $companyId, int $page = 1, int $limit = 10): array
+    {
+        $offset = ($page - 1) * $limit;
+
+        $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
+            NATURAL JOIN order_item
+            NATURAL JOIN product p
+            NATURAL JOIN status
+            WHERE o.company_id = :company_id
+              AND status_status = 'Finalizada'
+            ORDER BY o.order_finished_at DESC
+            LIMIT :limit OFFSET :offset;
+        ";
+
+        $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();
+
+        $rows = $stmt->fetchAll(\PDO::FETCH_ASSOC);
+
+        // Agrupamento por pedido
+        $orders = [];
+        foreach ($rows as $row) {
+            $orderId = $row['order_id'];
+
+            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'            => []
+                ];
+            }
+
+            $orders[$orderId]['items'][] = [
+                'product_name'  => $row['product_name'],
+                'product_price' => $row['product_price']
+            ];
+        }
+
+        return array_values($orders);
+    }
+}

+ 3 - 0
public/index.php

@@ -90,4 +90,7 @@ $app->get('/menu/get/{id}', $cors, \Controllers\MenuGetController::class);
 //Kitchen Route
 $app->post('/kitchen/get', $cors, \Controllers\KitchenGetController::class);
 
+//Reports Route
+$app->post('/reports/get', $cors, \Controllers\ReportsGetController::class);
+
 $app->run();