diff --git a/addons/sale/models/sale_order.py b/addons/sale/models/sale_order.py index 09d03b8849b..e2e4eaa6f1c 100644 --- a/addons/sale/models/sale_order.py +++ b/addons/sale/models/sale_order.py @@ -121,6 +121,12 @@ class SaleOrder(models.Model): string="Expiration", compute='_compute_validity_date', store=True, readonly=False, copy=False, precompute=True) + journal_id = fields.Many2one( + 'account.journal', string="Invoicing Journal", + compute="_compute_journal_id", store=True, readonly=False, precompute=True, + domain=[('type', '=', 'sale')], check_company=True, + help="If set, the SO will invoice in this journal; " + "otherwise the sales journal with the lowest sequence is used.") # Partner-based computes note = fields.Html( @@ -323,6 +329,9 @@ class SaleOrder(models.Model): else: order.validity_date = False + def _compute_journal_id(self): + self.journal_id = False + @api.depends('partner_id') def _compute_note(self): use_invoice_terms = self.env['ir.config_parameter'].sudo().get_param('account.use_invoice_terms') @@ -1121,7 +1130,7 @@ class SaleOrder(models.Model): """ self.ensure_one() - return { + values = { 'ref': self.client_order_ref or '', 'move_type': 'out_invoice', 'narration': self.note, @@ -1142,6 +1151,9 @@ class SaleOrder(models.Model): 'invoice_line_ids': [], 'user_id': self.user_id.id, } + if self.journal_id: + values['journal_id'] = self.journal_id.id + return values def action_view_invoice(self, invoices=False): if not invoices: diff --git a/addons/sale/views/sale_order_views.xml b/addons/sale/views/sale_order_views.xml index 11acd41b6b7..f2db078bb79 100644 --- a/addons/sale/views/sale_order_views.xml +++ b/addons/sale/views/sale_order_views.xml @@ -720,6 +720,7 @@ + diff --git a/addons/sale_management/models/sale_order.py b/addons/sale_management/models/sale_order.py index 0b0cdcee427..e49883c38f3 100644 --- a/addons/sale_management/models/sale_order.py +++ b/addons/sale_management/models/sale_order.py @@ -69,6 +69,12 @@ class SaleOrder(models.Model): if validity_days > 0: order.validity_date = fields.Date.context_today(order) + timedelta(validity_days) + @api.depends('sale_order_template_id') + def _compute_journal_id(self): + super()._compute_journal_id() + for order in self.filtered('sale_order_template_id'): + order.journal_id = order.sale_order_template_id.journal_id + #=== CONSTRAINT METHODS ===# @api.constrains('company_id', 'sale_order_option_ids') diff --git a/addons/sale_management/models/sale_order_template.py b/addons/sale_management/models/sale_order_template.py index 474cc9fb1c4..4efc2f1de8c 100644 --- a/addons/sale_management/models/sale_order_template.py +++ b/addons/sale_management/models/sale_order_template.py @@ -50,6 +50,11 @@ class SaleOrderTemplate(models.Model): comodel_name='sale.order.template.option', inverse_name='sale_order_template_id', string="Optional Products", copy=True) + journal_id = fields.Many2one( + 'account.journal', string="Invoicing Journal", + domain=[('type', '=', 'sale')], company_dependent=True, check_company=True, + help="If set, SO with this template will invoice in this journal; " + "otherwise the sales journal with the lowest sequence is used.") #=== COMPUTE METHODS ===# diff --git a/addons/sale_management/views/sale_order_template_views.xml b/addons/sale_management/views/sale_order_template_views.xml index cb6316a913a..3a82df72d90 100644 --- a/addons/sale_management/views/sale_order_template_views.xml +++ b/addons/sale_management/views/sale_order_template_views.xml @@ -45,6 +45,7 @@ style="width: 3rem"/> +