IMP purchase request logic

This commit is contained in:
younes 2025-07-18 10:52:10 +01:00
parent a40d7597d8
commit f353a47aca
2 changed files with 42 additions and 45 deletions

View File

@ -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)

View File

@ -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: