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 + + + + + + + + + + +