diff --git a/application/controllers/Os.php b/application/controllers/Os.php index 9a4bed25e..eea545a1f 100644 --- a/application/controllers/Os.php +++ b/application/controllers/Os.php @@ -563,8 +563,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->updateEstoque($produtos, null, '+'); 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'); } } @@ -576,8 +576,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->updateEstoque($produtos, null, '-'); 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..b430f3471 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->updateEstoque($produtos, null, '+'); 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->updateEstoque($produtos, null, '-'); 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..26638c994 100644 --- a/application/models/Produtos_model.php +++ b/application/models/Produtos_model.php @@ -73,6 +73,42 @@ public function count($table) public function updateEstoque($produto, $quantidade, $operacao = '-') { + if (is_array($produto)) { + if (empty($produto)) { + return true; + } + + // Group quantities by product ID to prevent issues with duplicate items in the same OS + $groupedProducts = []; + foreach ($produto as $p) { + $produto_id = isset($p->produtos_id) ? $p->produtos_id : $p['produtos_id']; + $qtd = isset($p->quantidade) ? $p->quantidade : $p['quantidade']; + + if (isset($groupedProducts[$produto_id])) { + $groupedProducts[$produto_id] += $qtd; + } else { + $groupedProducts[$produto_id] = $qtd; + } + } + + $cases = ''; + $ids = []; + $params = []; + + foreach ($groupedProducts as $produto_id => $qtd) { + $cases .= "WHEN ? THEN ? "; + $params[] = $produto_id; + $params[] = $qtd; + $ids[] = $produto_id; + } + + $placeholders = implode(',', array_fill(0, count($ids), '?')); + $sql = "UPDATE produtos SET estoque = estoque {$operacao} (CASE idProdutos {$cases} END) WHERE idProdutos IN ({$placeholders})"; + + $params = array_merge($params, $ids); + return $this->db->query($sql, $params); + } + $sql = "UPDATE produtos set estoque = estoque $operacao ? WHERE idProdutos = ?"; return $this->db->query($sql, [$quantidade, $produto]);