From d4da45344c3291a966a302ffe82a2f23f33ad044 Mon Sep 17 00:00:00 2001 From: laurentbarontini Date: Wed, 6 May 2026 09:40:53 +0200 Subject: [PATCH] Remove lots --- modules/purchase_trade/lot.py | 91 +++++++++++++++++++++++------------ 1 file changed, 60 insertions(+), 31 deletions(-) diff --git a/modules/purchase_trade/lot.py b/modules/purchase_trade/lot.py index 7f4e387..a4708f4 100755 --- a/modules/purchase_trade/lot.py +++ b/modules/purchase_trade/lot.py @@ -2129,12 +2129,17 @@ class LotShippingStart(ModelView): def default_shipment(cls): return 'in' -class QtWarning(UserWarning): - pass - -class LotMatching(Wizard): - "Matching" - __name__ = "lot.matching" +class QtWarning(UserWarning): + pass + + +class LotRemoveWarning(UserWarning): + pass + + +class LotMatching(Wizard): + "Matching" + __name__ = "lot.matching" start = StateTransition() @@ -2620,31 +2625,55 @@ class LotImportLot(ModelView): lp.append(val) return lp -class LotRemove(Wizard): - "Remove lots" - __name__ = "lot.remove" - - start = StateTransition() - - def transition_start(self): - Lot = Pool().get('lot.lot') - Move = Pool().get('stock.move') - PL = Pool().get('purchase.line') - for r in self.records: - if r.id > 10000000 : - raise UserError("Trying to remove open lots!") - if r.r_lot_s: - raise UserError("Trying to remove matched lots!") - if r.r_lot_shipment_in or r.r_lot_shipment_internal or r.r_lot_shipment_out: - raise UserError("Trying to remove shipped lots!") - lot = Lot(r.id) - #delete move first if exist - if lot.move: - Move.delete([lot.move]) - if not lot.updateVirtualPart(lot.get_current_quantity_converted(),None,None): - lot.createVirtualPart(lot.get_current_quantity_converted(),None,None) - Lot.delete([lot]) - return 'end' +class LotRemove(Wizard): + "Remove lots" + __name__ = "lot.remove" + + start = StateTransition() + + @staticmethod + def _remove_warning_message(lot): + messages = [] + if lot.sale_line: + messages.append("matched") + if (lot.lot_shipment_in or lot.lot_shipment_internal + or lot.lot_shipment_out): + messages.append("shipped") + if messages: + return ( + "This physical lot is %s. By clicking yes, the physical lot " + "and its draft stock move will be deleted and the quantity " + "will be restored as open quantity." + % " and ".join(messages)) + return None + + def transition_start(self): + Lot = Pool().get('lot.lot') + Move = Pool().get('stock.move') + Warning = Pool().get('res.user.warning') + for r in self.records: + if r.id > 10000000 : + raise UserError("Trying to remove open lots!") + lot = Lot(r.id) + if lot.move and lot.move.state != 'draft': + raise UserError( + "Trying to remove a lot with a stock move that is not " + "draft!") + warning_message = self._remove_warning_message(lot) + if warning_message: + warning_name = Warning.format("Remove physical lot", [lot]) + if Warning.check(warning_name): + raise LotRemoveWarning(warning_name, warning_message) + quantity = lot.get_current_quantity_converted() + shipment_origin = lot.lot_shipment_origin + lot_s = lot.getVlot_s() if lot.sale_line else None + #delete move first if exist + if lot.move: + Move.delete([lot.move]) + if not lot.updateVirtualPart(quantity, shipment_origin, lot_s): + lot.createVirtualPart(quantity, shipment_origin, lot_s) + Lot.delete([lot]) + return 'end' def end(self): return 'reload'