@@ -197,28 +197,35 @@ def get_example_pairs():
197197 COALESCE(pt.name->>'pt_BR', pt.name->>'en_US', pt.name::text) AS produto,
198198 pt.default_code AS referencia,
199199 ROUND(SUM(sol.product_uom_qty), 2) AS total_vendido,
200- COALESCE(SUM(sq.quantity - sq.reserved_quantity), 0) AS estoque_atual
201- FROM
202- sale_order_line sol
203- JOIN
204- sale_order so ON sol.order_id = so.id
205- JOIN
206- product_product pp ON sol.product_id = pp.id
207- JOIN
208- product_template pt ON pp.product_tmpl_id = pt.id
209- LEFT JOIN
210- stock_quant sq ON sq.product_id = pp.id
211- LEFT JOIN
212- stock_location sl ON sq.location_id = sl.id
200+ COALESCE(SUM(q.estoque), 0) AS estoque_atual
201+ FROM sale_order_line sol
202+ JOIN sale_order so
203+ ON sol.order_id = so.id
204+ JOIN product_product pp
205+ ON sol.product_id = pp.id
206+ JOIN product_template pt
207+ ON pp.product_tmpl_id = pt.id
208+ LEFT JOIN (
209+ SELECT
210+ sq.product_id,
211+ SUM(sq.quantity - sq.reserved_quantity) AS estoque
212+ FROM stock_quant sq
213+ JOIN stock_location sl
214+ ON sq.location_id = sl.id
215+ WHERE sl.usage = 'internal'
216+ GROUP BY sq.product_id
217+ ) AS q
218+ ON q.product_id = pp.id
213219WHERE
214- so.state IN ('sale', 'done') -- apenas pedidos confirmados
220+ so.state IN ('sale', 'done')
215221 AND so.date_order >= (NOW() - INTERVAL '30 days')
216- AND (sl.usage IS NULL OR sl.usage = 'internal') -- estoque interno apenas
217222GROUP BY
218- pt.id, pt.name, pt.default_code
223+ pt.id,
224+ pt.default_code,
225+ produto
219226HAVING
220227 SUM(sol.product_uom_qty) > 0
221- AND COALESCE(SUM(sq.quantity - sq.reserved_quantity ), 0) = 0
228+ AND COALESCE(SUM(q.estoque ), 0) = 0
222229ORDER BY
223230 total_vendido DESC;
224231""" ,
@@ -227,23 +234,25 @@ def get_example_pairs():
227234 "question" : "Quais produtos não têm estoque disponível?" ,
228235 "sql" : """
229236SELECT
230- COALESCE( pt.name->>'pt_BR', pt.name->>' en_US', pt.name::text) AS produto,
237+ pt.name->>'en_US' AS produto,
231238 pt.default_code AS codigo,
232- COALESCE(SUM(sq.quantity - sq.reserved_quantity), 0) AS quantidade_disponivel
239+ COALESCE(SUM(CASE WHEN sl.usage = 'internal' THEN (sq.quantity - sq.reserved_quantity) ELSE 0 END), 0)
240+ AS quantidade_disponivel
233241FROM
234242 product_template pt
235243JOIN
236- product_product pp ON pt.id = pp.product_tmpl_id
244+ product_product pp
245+ ON pt.id = pp.product_tmpl_id
237246LEFT JOIN
238- stock_quant sq ON pp.id = sq.product_id
247+ stock_quant sq
248+ ON pp.id = sq.product_id
239249LEFT JOIN
240- stock_location sl ON sq.location_id = sl.id
241- WHERE
242- sl.usage = 'internal' OR sl.id IS NULL
250+ stock_location sl
251+ ON sl.id = sq.location_id
243252GROUP BY
244253 pt.id, pt.name, pt.default_code
245254HAVING
246- COALESCE(SUM(sq.quantity - sq.reserved_quantity), 0) <= 0
255+ COALESCE(SUM(CASE WHEN sl.usage = 'internal' THEN ( sq.quantity - sq.reserved_quantity) ELSE 0 END ), 0) <= 0
247256ORDER BY
248257 produto;
249258""" ,
0 commit comments