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