From 0d73cab59d77daee8386d05753068e034b3942eb Mon Sep 17 00:00:00 2001 From: sbejaoui Date: Mon, 24 Aug 2020 11:49:35 +0200 Subject: [PATCH] [12.0][IMP] - Different payment mode for contracts generated from sale orders new option allow to set different payment mode for the contracts generated from the sale order than the one will be used for invoices. --- contract_sale_payment_mode/__manifest__.py | 4 +-- contract_sale_payment_mode/models/__init__.py | 2 ++ .../models/res_company.py | 13 +++++++ .../models/res_config_settings.py | 15 ++++++++ .../models/sale_order.py | 31 +++++++++++++++-- .../tests/test_sale_order.py | 19 +++++++++++ .../views/res_config_settings.xml | 34 +++++++++++++++++++ .../views/sale_order.xml | 20 +++++++++++ 8 files changed, 134 insertions(+), 4 deletions(-) create mode 100644 contract_sale_payment_mode/models/res_company.py create mode 100644 contract_sale_payment_mode/models/res_config_settings.py create mode 100644 contract_sale_payment_mode/views/res_config_settings.xml create mode 100644 contract_sale_payment_mode/views/sale_order.xml diff --git a/contract_sale_payment_mode/__manifest__.py b/contract_sale_payment_mode/__manifest__.py index 1aa7187c9..78ec1b32a 100644 --- a/contract_sale_payment_mode/__manifest__.py +++ b/contract_sale_payment_mode/__manifest__.py @@ -16,7 +16,7 @@ 'product_contract', ], 'data': [ - ], - 'demo': [ + 'views/res_config_settings.xml', + 'views/sale_order.xml' ], } diff --git a/contract_sale_payment_mode/models/__init__.py b/contract_sale_payment_mode/models/__init__.py index 6aacb7531..20972a4c7 100644 --- a/contract_sale_payment_mode/models/__init__.py +++ b/contract_sale_payment_mode/models/__init__.py @@ -1 +1,3 @@ from . import sale_order +from . import res_company +from . import res_config_settings diff --git a/contract_sale_payment_mode/models/res_company.py b/contract_sale_payment_mode/models/res_company.py new file mode 100644 index 000000000..0f8f937b7 --- /dev/null +++ b/contract_sale_payment_mode/models/res_company.py @@ -0,0 +1,13 @@ +# Copyright 2020 ACSONE SA/NV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class ResCompany(models.Model): + + _inherit = 'res.company' + + specific_contract_payment_mode = fields.Boolean( + string="Specific payment mode for contracts created from sale orders" + ) diff --git a/contract_sale_payment_mode/models/res_config_settings.py b/contract_sale_payment_mode/models/res_config_settings.py new file mode 100644 index 000000000..4c2b746de --- /dev/null +++ b/contract_sale_payment_mode/models/res_config_settings.py @@ -0,0 +1,15 @@ +# Copyright 2020 ACSONE SA/NV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class ResConfigSettings(models.TransientModel): + + _inherit = 'res.config.settings' + + specific_contract_payment_mode = fields.Boolean( + related="company_id.specific_contract_payment_mode", + string="Specific payment mode for contracts created from sale orders", + readonly=False + ) diff --git a/contract_sale_payment_mode/models/sale_order.py b/contract_sale_payment_mode/models/sale_order.py index 95a4a79b1..cbefeb798 100644 --- a/contract_sale_payment_mode/models/sale_order.py +++ b/contract_sale_payment_mode/models/sale_order.py @@ -1,16 +1,43 @@ # Copyright 2019 ACSONE SA/NV +# Copyright 2020 ACSONE SA/NV # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from odoo import api, models +from odoo import api, fields, models class SaleOrder(models.Model): _inherit = 'sale.order' + contract_payment_mode_id = fields.Many2one( + comodel_name='account.payment.mode', + string='Contract Payment Mode', + domain=[('payment_type', '=', 'inbound')], + index=True, + ) + specific_contract_payment_mode = fields.Boolean( + related="company_id.specific_contract_payment_mode", + string="Different payment mode for contracts generated from sale " + "orders", + ) + + @api.onchange('partner_id') + def onchange_partner_id(self): + res = super().onchange_partner_id() + if self.partner_id: + self.contract_payment_mode_id = self.partner_id.with_context( + force_company=self.company_id.id + ).customer_payment_mode_id + else: + self.payment_mode_id = False + return res + @api.multi def _prepare_contract_value(self, contract_template): self.ensure_one() vals = super(SaleOrder, self)._prepare_contract_value( contract_template) - vals['payment_mode_id'] = self.payment_mode_id.id + if self.specific_contract_payment_mode: + vals['payment_mode_id'] = self.contract_payment_mode_id.id + else: + vals['payment_mode_id'] = self.payment_mode_id.id return vals diff --git a/contract_sale_payment_mode/tests/test_sale_order.py b/contract_sale_payment_mode/tests/test_sale_order.py index 661d8efa0..c15ec8b27 100644 --- a/contract_sale_payment_mode/tests/test_sale_order.py +++ b/contract_sale_payment_mode/tests/test_sale_order.py @@ -19,3 +19,22 @@ class TestSaleOrderPaymentMode(TestSaleOrder): self.sale.order_line.mapped('contract_id.payment_mode_id'), self.payment_mode, ) + + def test_action_confirm_with_contract_payment_mode_1(self): + self.contract_payment_mode_id = self.payment_mode.copy() + self.sale.contract_payment_mode_id = self.contract_payment_mode_id + self.test_action_confirm() + self.assertEqual( + self.sale.order_line.mapped('contract_id.payment_mode_id'), + self.payment_mode, + ) + + def test_action_confirm_with_contract_payment_mode_2(self): + self.contract_payment_mode_id = self.payment_mode.copy() + self.sale.contract_payment_mode_id = self.contract_payment_mode_id + self.sale.company_id.specific_contract_payment_mode = True + self.test_action_confirm() + self.assertEqual( + self.sale.order_line.mapped('contract_id.payment_mode_id'), + self.contract_payment_mode_id, + ) diff --git a/contract_sale_payment_mode/views/res_config_settings.xml b/contract_sale_payment_mode/views/res_config_settings.xml new file mode 100644 index 000000000..ef14bc7ae --- /dev/null +++ b/contract_sale_payment_mode/views/res_config_settings.xml @@ -0,0 +1,34 @@ + + + + + + + res.config.settings + + + +
+
+ +
+
+
+
+
+
+
+ + + +
diff --git a/contract_sale_payment_mode/views/sale_order.xml b/contract_sale_payment_mode/views/sale_order.xml new file mode 100644 index 000000000..7f10b0048 --- /dev/null +++ b/contract_sale_payment_mode/views/sale_order.xml @@ -0,0 +1,20 @@ + + + + + + + + sale.order + + + + + + + + + + +