ReportsModel.php 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. <?php
  2. namespace Models;
  3. class ReportsModel
  4. {
  5. private \PDO $pdo;
  6. public function __construct()
  7. {
  8. $dbFile = $_ENV['DB_FILE'];
  9. $dbPath = __DIR__ . '/../' . $dbFile;
  10. $this->pdo = new \PDO("sqlite:" . $dbPath);
  11. $this->pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
  12. $this->pdo->exec('PRAGMA journal_mode = WAL;');
  13. $this->pdo->exec('PRAGMA busy_timeout = 5000;');
  14. }
  15. public function getReports(int $companyId, ?int $page = null, ?int $limit = null): array
  16. {
  17. // Total de vendas
  18. $sqlTotalValue = "
  19. SELECT SUM(CAST(product_price AS REAL)) AS total_sales
  20. FROM `order`
  21. NATURAL JOIN order_item
  22. NATURAL JOIN product
  23. NATURAL JOIN status
  24. WHERE company_id = :company_id
  25. AND status_status = 'Finalizada'
  26. ";
  27. $stmtTotal = $this->pdo->prepare($sqlTotalValue);
  28. $stmtTotal->execute(['company_id' => $companyId]);
  29. $totalSales = $stmtTotal->fetchColumn() ?: 0;
  30. // Top 3 itens mais vendidos
  31. $sqlTopItems = "
  32. SELECT product_name, COUNT(*) AS sold_quantity
  33. FROM `order`
  34. NATURAL JOIN order_item
  35. NATURAL JOIN product
  36. NATURAL JOIN status
  37. WHERE company_id = :company_id
  38. AND status_status = 'Finalizada'
  39. GROUP BY product_id
  40. ORDER BY sold_quantity DESC
  41. LIMIT 3
  42. ";
  43. $stmtTopItems = $this->pdo->prepare($sqlTopItems);
  44. $stmtTopItems->execute(['company_id' => $companyId]);
  45. $topItems = $stmtTopItems->fetchAll(\PDO::FETCH_ASSOC);
  46. // Lista de pedidos
  47. $sqlOrders = "
  48. SELECT order_id,
  49. order_finished_at,
  50. table_id,
  51. order_name,
  52. order_flag
  53. FROM `order`
  54. NATURAL JOIN status
  55. WHERE company_id = :company_id
  56. AND status_status = 'Finalizada'
  57. ORDER BY order_finished_at DESC
  58. ";
  59. $offset = 0;
  60. if ($page !== null && $limit !== null) {
  61. $offset = ($page - 1) * $limit;
  62. $sqlOrders .= " LIMIT :limit OFFSET :offset";
  63. }
  64. $stmtOrders = $this->pdo->prepare($sqlOrders);
  65. $stmtOrders->bindValue(':company_id', $companyId, \PDO::PARAM_INT);
  66. if ($page !== null && $limit !== null) {
  67. $stmtOrders->bindValue(':limit', $limit, \PDO::PARAM_INT);
  68. $stmtOrders->bindValue(':offset', $offset, \PDO::PARAM_INT);
  69. }
  70. $stmtOrders->execute();
  71. $ordersData = $stmtOrders->fetchAll(\PDO::FETCH_ASSOC);
  72. if (empty($ordersData)) {
  73. return [
  74. 'total_sales' => (float) $totalSales,
  75. 'top_items' => $topItems,
  76. 'orders' => []
  77. ];
  78. }
  79. // Pega os IDs dos pedidos encontrados
  80. $orderIds = array_column($ordersData, 'order_id');
  81. $inQuery = implode(',', array_fill(0, count($orderIds), '?'));
  82. // Busca itens dos pedidos
  83. $sqlItems = "
  84. SELECT order_id,
  85. product_name,
  86. product_price
  87. FROM order_item
  88. NATURAL JOIN product
  89. WHERE order_id IN ($inQuery)
  90. ";
  91. $stmtItems = $this->pdo->prepare($sqlItems);
  92. foreach ($orderIds as $k => $id) {
  93. $stmtItems->bindValue($k + 1, $id, \PDO::PARAM_INT);
  94. }
  95. $stmtItems->execute();
  96. $itemsData = $stmtItems->fetchAll(\PDO::FETCH_ASSOC);
  97. // Monta estrutura final de pedidos + itens
  98. $orders = [];
  99. foreach ($ordersData as $order) {
  100. $orders[$order['order_id']] = $order + ['items' => []];
  101. }
  102. foreach ($itemsData as $item) {
  103. $orders[$item['order_id']]['items'][] = [
  104. 'product_name' => $item['product_name'],
  105. 'product_price' => $item['product_price']
  106. ];
  107. }
  108. return [
  109. 'total_sales' => (float) $totalSales,
  110. 'top_items' => $topItems,
  111. 'orders' => array_values($orders),
  112. ];
  113. }
  114. }