From 8d1354358ec9c08acc68a90a04edf293cd0c0b17 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Mon, 31 Aug 2026 16:55:30 +0000 Subject: [PATCH] Optimize updateEstoque with batch update Co-authored-by: cezargf <25113573+cezargf@users.noreply.github.com> --- application/controllers/Os.php | 4 +- .../controllers/api/v1/OsController.php | 4 +- application/models/Produtos_model.php | 43 +++++++++++++++++++ 3 files changed, 47 insertions(+), 4 deletions(-) diff --git a/application/controllers/Os.php b/application/controllers/Os.php index 045249133..62a007c79 100644 --- a/application/controllers/Os.php +++ b/application/controllers/Os.php @@ -571,8 +571,8 @@ private function devolucaoEstoque($id) if ($produtos = $this->os_model->getProdutos($id)) { $this->load->model('produtos_model'); if ($this->data['configuration']['control_estoque']) { + $this->produtos_model->updateEstoqueBatch($produtos, '+'); foreach ($produtos as $p) { - $this->produtos_model->updateEstoque($p->produtos_id, $p->quantidade, '+'); log_info('ESTOQUE: Produto id ' . $p->produtos_id . ' voltou ao estoque. Quantidade: ' . $p->quantidade . '. Motivo: Cancelamento/Exclusão'); } } @@ -584,8 +584,8 @@ private function debitarEstoque($id) if ($produtos = $this->os_model->getProdutos($id)) { $this->load->model('produtos_model'); if ($this->data['configuration']['control_estoque']) { + $this->produtos_model->updateEstoqueBatch($produtos, '-'); foreach ($produtos as $p) { - $this->produtos_model->updateEstoque($p->produtos_id, $p->quantidade, '-'); log_info('ESTOQUE: Produto id ' . $p->produtos_id . ' baixa do estoque. Quantidade: ' . $p->quantidade . '. Motivo: Mudou status que já estava Cancelado para outro'); } } diff --git a/application/controllers/api/v1/OsController.php b/application/controllers/api/v1/OsController.php index 50f57b005..674192af2 100644 --- a/application/controllers/api/v1/OsController.php +++ b/application/controllers/api/v1/OsController.php @@ -1044,8 +1044,8 @@ private function devolucaoEstoque($id) if ($produtos = $this->os_model->getProdutos($id)) { $this->load->model('produtos_model'); if ($this->getConfig('control_estoque')) { + $this->produtos_model->updateEstoqueBatch($produtos, '+'); foreach ($produtos as $p) { - $this->produtos_model->updateEstoque($p->produtos_id, $p->quantidade, '+'); log_info('ESTOQUE: Produto id ' . $p->produtos_id . ' voltou ao estoque. Quantidade: ' . $p->quantidade . '. Motivo: Cancelamento/Exclusão'); } } @@ -1057,8 +1057,8 @@ private function debitarEstoque($id) if ($produtos = $this->os_model->getProdutos($id)) { $this->load->model('produtos_model'); if ($this->getConfig('control_estoque')) { + $this->produtos_model->updateEstoqueBatch($produtos, '-'); foreach ($produtos as $p) { - $this->produtos_model->updateEstoque($p->produtos_id, $p->quantidade, '-'); log_info('ESTOQUE: Produto id ' . $p->produtos_id . ' baixa do estoque. Quantidade: ' . $p->quantidade . '. Motivo: Mudou status que já estava Cancelado para outro'); } } diff --git a/application/models/Produtos_model.php b/application/models/Produtos_model.php index 3691e93af..6c3672d6f 100644 --- a/application/models/Produtos_model.php +++ b/application/models/Produtos_model.php @@ -77,4 +77,47 @@ public function updateEstoque($produto, $quantidade, $operacao = '-') return $this->db->query($sql, [$quantidade, $produto]); } + + public function updateEstoqueBatch($produtos, $operacao = '-') + { + if (empty($produtos)) { + return true; + } + + $aggregated = []; + + foreach ($produtos as $p) { + $id = isset($p->produtos_id) ? $p->produtos_id : (isset($p['produtos_id']) ? $p['produtos_id'] : null); + $qtd = isset($p->quantidade) ? $p->quantidade : (isset($p['quantidade']) ? $p['quantidade'] : null); + + if ($id === null || $qtd === null) { + continue; + } + + if (!isset($aggregated[$id])) { + $aggregated[$id] = 0; + } + $aggregated[$id] += $qtd; + } + + if (empty($aggregated)) { + return true; + } + + $ids = []; + $cases = []; + $params = []; + + foreach ($aggregated as $id => $qtd) { + $ids[] = $id; + $cases[] = "WHEN idProdutos = ? THEN estoque $operacao ?"; + $params[] = $id; + $params[] = $qtd; + } + + $sql = "UPDATE produtos SET estoque = CASE " . implode(" ", $cases) . " ELSE estoque END WHERE idProdutos IN (" . implode(",", array_fill(0, count($ids), "?")) . ")"; + $params = array_merge($params, $ids); + + return $this->db->query($sql, $params); + } }