summaryrefslogtreecommitdiff
path: root/indoteknik_custom/models/automatic_purchase.py
diff options
context:
space:
mode:
Diffstat (limited to 'indoteknik_custom/models/automatic_purchase.py')
-rw-r--r--indoteknik_custom/models/automatic_purchase.py76
1 files changed, 69 insertions, 7 deletions
diff --git a/indoteknik_custom/models/automatic_purchase.py b/indoteknik_custom/models/automatic_purchase.py
index 4b0ce325..f7c0d75e 100644
--- a/indoteknik_custom/models/automatic_purchase.py
+++ b/indoteknik_custom/models/automatic_purchase.py
@@ -314,7 +314,74 @@ 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),
+ ('sale_line_id', '=', sale_order.sale_line_id.id),
+ ('sale_id', '=', sale_order.sale_id.id),
+ ('purchase_order_id.state', '!=', 'cancel'),
+ ])
+
+ skip_line = False
+
+ 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] and exist:
+ skip_line = True
+
+ if skip_line:
+ continue
+
+ stock_move = self.env['stock.move'].search([
+ ('reference', 'ilike', 'BU/PICK'),
+ ('state', 'in', ['confirmed','waiting','partially_available']),
+ ('product_id', '=', sale_order.product_id.id),
+ ('sale_line_id', '=', sale_order.sale_line_id.id),
+ ])
+ if not stock_move:
+ continue
# @stephan skip so line yang sudah pernah ada di purchase order sales match sebelumnya
salesperson_name = sale_order.sale_id.user_id.name
@@ -499,7 +566,8 @@ class AutomaticPurchase(models.Model):
# _logger.info('test %s' % point.product_id.name)
if point.product_id.qty_available_bandengan > point.product_min_qty:
continue
- qty_purchase = point.product_max_qty - point.product_id.qty_incoming_bandengan - point.product_id.qty_available_bandengan
+ # qty_purchase = point.product_max_qty - point.product_id.qty_incoming_bandengan - point.product_id.qty_available_bandengan
+ qty_purchase = point.product_max_qty - point.product_id.qty_available_bandengan
po_line = self.env['purchase.order.line'].search([('product_id', '=', point.product_id.id), ('order_id.state', '=', 'done')], order='id desc', limit=1)
if self.vendor_id:
@@ -739,11 +807,5 @@ class SaleNotInMatchPO(models.Model):
apsm.create_date, apsm.write_uid, apsm.write_date, apsm.purchase_price,
apsm.purchase_tax_id, apsm.note_procurement
from automatic_purchase_sales_match apsm
- where apsm.sale_line_id not in (
- select distinct coalesce(posm.sale_line_id,0)
- from purchase_order_sales_match posm
- join purchase_order po on po.id = posm.purchase_order_id
- where po.state not in ('cancel')
- )
)
""" % self._table) \ No newline at end of file