This commit is contained in:
2026-03-25 11:01:26 +01:00
parent 0ac261b670
commit b8ec7a3d2d

View File

@@ -983,7 +983,7 @@ class QualityAnalysis(ModelSQL,ModelView):
class Line(metaclass=PoolMeta):
__name__ = 'purchase.line'
quantity_theorical = fields.Numeric("Th. quantity", digits='unit', readonly=False)
quantity_theorical = fields.Numeric("Contractual Qt", digits='unit', readonly=False)
price_type = fields.Selection([
('cash', 'Cash Price'),
('priced', 'Priced'),
@@ -1212,6 +1212,16 @@ class Line(metaclass=PoolMeta):
@classmethod
def write(cls, *args):
# Agents:
# Ici on gère la variation éventuelle de la théorical quantity après création du contrat
# Si delta > 0 on met à jour le lot virtual qui est toujours unique pour une purchase line
# mais aussi la table lot_qt dont le lot_p est ce lot virtuel (ajuster lot_quantity)
# si il n'existe aucun lot_qt non shippé (tous les lot_shipments à None) et aucun non matché (lot_s à None)
# alors il faut créer un nouveau lot_qt non shippé et non matché avec le delta
# Si delta négatif alors on decrease si c'est possible le lot_qt non shippé non matché et s'il n'y en a pas on envoie un
# message d'erreur 'Please unlink or unmatch lot'
Lot = Pool().get('lot.lot')
LotQt = Pool().get('lot.qt')
old_values = {}
for records, values in zip(args[::2], args[1::2]):
@@ -1224,11 +1234,57 @@ class Line(metaclass=PoolMeta):
lines = sum(args[::2], [])
for line in lines:
if line.id in old_values:
old = old_values[line.id]
new = line.quantity_theorical
delta = Decimal(new) - Decimal(old)
old = Decimal(old_values[line.id] or 0)
new = Decimal(line.quantity_theorical or 0)
delta = new - old
if delta > 0:
continue
virtual_lots = [lot for lot in (line.lots or []) if lot.lot_type == 'virtual']
if not virtual_lots:
continue
vlot = virtual_lots[0]
new_qty = round(Decimal(vlot.get_current_quantity_converted() or 0) + delta, 5)
vlot.set_current_quantity(new_qty, new_qty, 1)
Lot.save([vlot])
lqts = LotQt.search([
('lot_p', '=', vlot.id),
('lot_s', '=', None),
('lot_shipment_in', '=', None),
('lot_shipment_internal', '=', None),
('lot_shipment_out', '=', None),
])
if lqts:
lqt = lqts[0]
lqt.lot_quantity = round(Decimal(lqt.lot_quantity or 0) + delta, 5)
LotQt.save([lqt])
else:
lqt = LotQt()
lqt.lot_p = vlot.id
lqt.lot_s = None
lqt.lot_quantity = round(delta, 5)
lqt.lot_unit = line.unit
LotQt.save([lqt])
elif delta < 0:
virtual_lots = [lot for lot in (line.lots or []) if lot.lot_type == 'virtual']
if not virtual_lots:
continue
vlot = virtual_lots[0]
decrease = abs(delta)
lqts = LotQt.search([
('lot_p', '=', vlot.id),
('lot_s', '=', None),
('lot_shipment_in', '=', None),
('lot_shipment_internal', '=', None),
('lot_shipment_out', '=', None),
])
if (not lqts
or Decimal(lqts[0].lot_quantity or 0) < decrease):
raise UserError("Please unlink or unmatch lot")
new_qty = round(Decimal(vlot.get_current_quantity_converted() or 0) - decrease, 5)
vlot.set_current_quantity(new_qty, new_qty, 1)
Lot.save([vlot])
lqt = lqts[0]
lqt.lot_quantity = round(Decimal(lqt.lot_quantity or 0) - decrease, 5)
LotQt.save([lqt])
@classmethod
def copy(cls, lines, default=None):