From f353a47aca96750869b8c379d70b649cda4eba32 Mon Sep 17 00:00:00 2001 From: younes Date: Fri, 18 Jul 2025 10:52:10 +0100 Subject: [PATCH] IMP purchase request logic --- .../models/purchase_request.py | 14 ++-- .../wizards/picking_purchase_request.py | 73 +++++++++---------- 2 files changed, 42 insertions(+), 45 deletions(-) diff --git a/odex25_purchase/purchase_custom_stock/models/purchase_request.py b/odex25_purchase/purchase_custom_stock/models/purchase_request.py index 7806f644e..63a5bc1f7 100644 --- a/odex25_purchase/purchase_custom_stock/models/purchase_request.py +++ b/odex25_purchase/purchase_custom_stock/models/purchase_request.py @@ -243,15 +243,15 @@ class PurchaseRequest(models.Model): if not self.department_id: raise ValidationError(_("Please Select department for employee")) storable_lines = self.line_ids.filtered(lambda l: l.product_id.type == 'product') - asset_lines = self.line_ids.filtered(lambda l: l.product_id.asset_ok) consu_lines = self.line_ids.filtered(lambda l: l.product_id.type == 'consu') - consu_non_asset_lines = self.line_ids.filtered( - lambda l: l.product_id.type == 'consu' and not l.product_id.asset_ok) - relevant_lines = storable_lines | asset_lines | consu_non_asset_lines - has_available = any(l.available_qty > 0 for l in relevant_lines) - has_insufficient_qty = any(l.qty > l.available_qty for l in relevant_lines) - if storable_lines or consu_lines: + relevant_lines = self.line_ids.filtered( + lambda l: l.product_id.type == 'product' or + l.product_id.asset_ok or + (l.product_id.type == 'consu' and not l.product_id.asset_ok) + ) + has_available = any(l.available_qty > 0 for l in relevant_lines) + has_insufficient_qty = any(l.qty > l.available_qty for l in relevant_lines) if self.has_asset_product_line: self.create_asset_custody_lines() return self._open_picking_wizard(has_available if has_insufficient_qty else False) diff --git a/odex25_purchase/purchase_custom_stock/wizards/picking_purchase_request.py b/odex25_purchase/purchase_custom_stock/wizards/picking_purchase_request.py index 74eec8833..44ce43424 100644 --- a/odex25_purchase/purchase_custom_stock/wizards/picking_purchase_request.py +++ b/odex25_purchase/purchase_custom_stock/wizards/picking_purchase_request.py @@ -31,16 +31,16 @@ class PurcahseRefues(models.TransientModel): move_vals = [] - for line in self.request_line_ids.filtered(lambda line: line.product_id.type in ['product']): - if not line.product_id.asset_ok: - if min(line.qty, line.available_qty): - move_vals.append((0, 0, { - "product_id": line.product_id.id, - "name": line.product_id.name, - "product_uom": line.product_id.uom_id.id, - 'product_uom_qty': min(line.qty, line.available_qty), - })) - line.qty_purchased = 0 + for line in self.request_line_ids.filtered( + lambda l: l.product_id.type == 'product' and not l.product_id.asset_ok): + if min(line.qty, line.available_qty): + move_vals.append((0, 0, { + "product_id": line.product_id.id, + "name": line.product_id.name, + "product_uom": line.product_id.uom_id.id, + 'product_uom_qty': min(line.qty, line.available_qty), + })) + line.qty_purchased = 0 picking_vals.update({'move_lines': move_vals}) picking_id = self.env['stock.picking'].create(picking_vals) self.request_id.picking_id = picking_id.id @@ -78,19 +78,18 @@ class PurcahseRefues(models.TransientModel): } move_vals = [] - filtered_lines = self.request_line_ids.filtered(lambda line: line.product_id.type in ['product', 'consu']) - for line in filtered_lines: - if not line.product_id.asset_ok: - move_vals.append((0, 0, { - "product_id": line.product_id.id, - "name": line.product_id.name, - "product_uom": line.product_id.uom_id.id, - 'product_uom_qty': line.qty, - })) - if line.qty < line.available_qty: - line.qty_purchased = 0 - else: - line.qty_purchased = line.qty - line.available_qty + for line in self.request_line_ids.filtered( + lambda l: (l.product_id.type in ('product', 'consu')) and not l.product_id.asset_ok): + move_vals.append((0, 0, { + "product_id": line.product_id.id, + "name": line.product_id.name, + "product_uom": line.product_id.uom_id.id, + 'product_uom_qty': line.qty, + })) + if line.qty < line.available_qty: + line.qty_purchased = 0 + else: + line.qty_purchased = line.qty - line.available_qty picking_vals.update({'move_lines': move_vals}) picking_id = self.env['stock.picking'].create(picking_vals) self.request_id.picking_id = picking_id.id @@ -116,30 +115,28 @@ class PurcahseRefues(models.TransientModel): } move_vals = [] - for line in self.request_line_ids.filtered(lambda line: line.product_id.type in ['product', 'consu']): - if not line.product_id.asset_ok: - move_vals.append((0, 0, { - "product_id": line.product_id.id, - "name": line.product_id.name, - "product_uom": line.product_id.uom_id.id, - 'product_uom_qty': line.qty, - })) + for line in self.request_line_ids.filtered( + lambda l: (l.product_id.type in ('product', 'consu')) and not l.product_id.asset_ok): + move_vals.append((0, 0, { + "product_id": line.product_id.id, + "name": line.product_id.name, + "product_uom": line.product_id.uom_id.id, + 'product_uom_qty': line.qty, + })) picking_vals.update({'move_lines': move_vals}) picking_id = self.env['stock.picking'].create(picking_vals) self.request_id.picking_id = picking_id.id - storable_lines = self.request_line_ids.filtered(lambda l: l.product_id.type == 'product') - asset_lines = self.request_line_ids.filtered(lambda l: l.product_id.asset_ok) - consu_non_asset_lines = self.request_line_ids.filtered( - lambda l: l.product_id.type == 'consu' and not l.product_id.asset_ok + relevant_lines = self.request_line_ids.filtered( + lambda l: l.product_id.type == 'product' or + l.product_id.asset_ok or + (l.product_id.type == 'consu' and not l.product_id.asset_ok) ) - relevant_lines = storable_lines | asset_lines | consu_non_asset_lines - non_storable_product = self.request_line_ids - storable_lines - asset_lines - consu_non_asset_lines + non_storable_product = self.request_line_ids - relevant_lines fully_available = all(l.qty <= l.available_qty for l in relevant_lines) for line in self.request_line_ids: line.qty_purchased = line.qty if fully_available else line.qty - line.available_qty if fully_available: - # self = self.with_context(fully_available=True) if non_storable_product: self.request_id.write({'state': 'waiting'}) else: