summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAzka Nathan <darizkyfaz@gmail.com>2026-02-27 14:42:29 +0700
committerAzka Nathan <darizkyfaz@gmail.com>2026-02-27 14:42:29 +0700
commit4d8b06efe10c33d44301b05d86bf96a62033820a (patch)
tree9a750de8f92d1c16f87c39c02dc24535bdc49767
parent3e08828c8e0238478a9b2575aa0705ab89124050 (diff)
push
-rw-r--r--indoteknik_custom/models/automatic_purchase.py72
1 files changed, 46 insertions, 26 deletions
diff --git a/indoteknik_custom/models/automatic_purchase.py b/indoteknik_custom/models/automatic_purchase.py
index f4ecdcd6..7e324061 100644
--- a/indoteknik_custom/models/automatic_purchase.py
+++ b/indoteknik_custom/models/automatic_purchase.py
@@ -314,6 +314,8 @@ class AutomaticPurchase(models.Model):
sale_ids_set = set()
sale_ids_name = set()
+ retur_cache = {}
+ incoming_cache = {}
for sale_order in matches_so:
exist = self.env['purchase.order.sales.match'].search([
('product_id', '=', sale_order.product_id.id),
@@ -324,32 +326,50 @@ class AutomaticPurchase(models.Model):
skip_line = False
- for existing in exist:
- if existing.purchase_order_id.state in ['done', 'purchase']:
- # if existing.purchase_line_id.qty_received != existing.purchase_line_id.product_qty:
- # break
-
- incoming = self.env['stock.move'].search([
- ('reference', 'ilike', 'BU/INPUT'),
- ('state', 'not in', ['done','cancel']),
- ('product_id', '=', existing.product_id.id),
- ('purchase_line_id', '=', existing.purchase_line_id.id),
- ], limit=1)
-
- if incoming:
- skip_line = True
- break
-
- retur = self.env['stock.move'].search([
- ('reference', 'ilike', 'BU/INPUT'),
- ('state', 'in', ['done']),
- ('product_id', '=', existing.product_id.id),
- ('purchase_line_id', '=', existing.purchase_line_id.id),
- ], limit=1)
-
- if retur and existing.purchase_line_id.qty_received == existing.purchase_line_id.product_qty:
- skip_line = True
- break
+ sale_line_id = sale_order.sale_line_id.id
+
+ if sale_line_id not in incoming_cache:
+
+ qty_incoming = 0
+
+ for existing in exist:
+ if existing.purchase_order_id.state in ['done', 'purchase']:
+
+ incoming_moves = self.env['stock.move'].search([
+ ('reference', 'ilike', 'BU/INPUT'),
+ ('state', 'not in', ['done','cancel']),
+ ('product_id', '=', existing.product_id.id),
+ ('purchase_line_id', '=', existing.purchase_line_id.id),
+ ])
+
+ qty_incoming += sum(incoming_moves.mapped('product_uom_qty'))
+
+ incoming_cache[sale_line_id] = qty_incoming
+
+
+ qty_need = sale_order.sale_line_id.product_uom_qty
+
+ if incoming_cache[sale_line_id] >= qty_need:
+ skip_line = True
+
+ sale_line_id = sale_order.sale_line_id.id
+
+ if sale_line_id not in retur_cache:
+
+ fully_received = True
+
+ for existing in exist:
+ if existing.purchase_order_id.state in ['done', 'purchase']:
+
+ if existing.purchase_line_id.qty_received != existing.purchase_line_id.product_qty:
+ fully_received = False
+ break
+
+ retur_cache[sale_line_id] = fully_received
+
+
+ if retur_cache[sale_line_id]:
+ skip_line = True
if skip_line:
continue