diff --git a/modules/purchase_trade/purchase.py b/modules/purchase_trade/purchase.py index cea3eea..dba26a1 100755 --- a/modules/purchase_trade/purchase.py +++ b/modules/purchase_trade/purchase.py @@ -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):