diff --git a/__init__.py b/__init__.py index 6bc0934..b3b174b 100644 --- a/__init__.py +++ b/__init__.py @@ -14,4 +14,5 @@ def register(): Pool.register( sale.HandleShipmentException, sale.HandleInvoiceException, + sale.ReturnSale, module='sale_product_package', type_='wizard') diff --git a/sale.py b/sale.py index 8486def..bcbe00b 100644 --- a/sale.py +++ b/sale.py @@ -8,7 +8,7 @@ from trytond.i18n import gettext from trytond.exceptions import UserError __all__ = ['Sale', 'SaleLine', - 'HandleShipmentException', 'HandleInvoiceException'] + 'HandleShipmentException', 'HandleInvoiceException', 'ReturnSale'] class Sale(metaclass=PoolMeta): @@ -142,3 +142,22 @@ class HandleInvoiceException(metaclass=PoolMeta): def transition_handle(self): with Transaction().set_context(validate_package=False): return super(HandleInvoiceException, self).transition_handle() + + +class ReturnSale(metaclass=PoolMeta): + __name__ = 'sale.return_sale' + + def do_return_(self, action): + action, data = super().do_return_(action) + + if data.get('res_id'): + sales = self.model.browse(data['res_id']) + + for sale in sales: + for line in sale.lines: + if line.type == 'line' and line.package_quantity: + line.package_quantity *= -1 + sale.lines = sale.lines # Force saving + self.model.save(sales) + + return action, data diff --git a/tests/scenario_sale_product_package.rst b/tests/scenario_sale_product_package.rst index ca32dd4..ae2f675 100644 --- a/tests/scenario_sale_product_package.rst +++ b/tests/scenario_sale_product_package.rst @@ -140,4 +140,24 @@ Sale products with package:: >>> line.quantity = 12 >>> line.package_quantity 2 + >>> line = sale.lines.new() + >>> line.type = 'comment' + >>> line.description = 'Test comment' >>> sale.save() + >>> sale.click('quote') + >>> sale.click('confirm') + >>> sale.state + 'processing' + +Return sale:: + + + >>> return_sale = Wizard('sale.return_sale', [sale]) + >>> return_sale.execute('return_') + >>> returned_sale, = Sale.find([ + ... ('state', '=', 'draft'), + ... ]) + >>> returned_sale.origin == sale + True + >>> sorted([(x.quantity or 0, x.package_quantity or 0) for x in returned_sale.lines]) + [(-12.0, -2), (0, 0)]