diff --git a/addons/point_of_sale/data/point_of_sale_data.xml b/addons/point_of_sale/data/point_of_sale_data.xml index aba585a2b5a..f2c82edc99a 100644 --- a/addons/point_of_sale/data/point_of_sale_data.xml +++ b/addons/point_of_sale/data/point_of_sale_data.xml @@ -51,6 +51,15 @@ MISC + + + POS Sale Journal + POSS + sale + + 20 + + diff --git a/addons/point_of_sale/models/pos_config.py b/addons/point_of_sale/models/pos_config.py index ad25692e1e3..07bd2f84051 100644 --- a/addons/point_of_sale/models/pos_config.py +++ b/addons/point_of_sale/models/pos_config.py @@ -30,6 +30,12 @@ class PosConfig(models.Model): _name = 'pos.config' def _default_sale_journal(self): + journal = self.env.ref('point_of_sale.pos_sale_journal', raise_if_not_found=False) + if journal and journal.company_id == self.env.user.company_id: + return journal + return self._default_invoice_journal() + + def _default_invoice_journal(self): return self.env['account.journal'].search([('type', '=', 'sale'), ('company_id', '=', self.env.user.company_id.id)], limit=1) def _default_pricelist(self): @@ -61,6 +67,11 @@ class PosConfig(models.Model): domain=[('type', '=', 'sale')], help="Accounting journal used to post sales entries.", default=_default_sale_journal) + invoice_journal_id = fields.Many2one( + 'account.journal', string='Invoice Journal', + domain=[('type', '=', 'sale')], + help="Accounting journal used to create invoices.", + default=_default_invoice_journal) currency_id = fields.Many2one('res.currency', compute='_compute_currency', string="Currency") iface_cashdrawer = fields.Boolean(string='Cashdrawer', help="Automatically open the cashdrawer") iface_payment_terminal = fields.Boolean(string='Payment Terminal', help="Enables Payment Terminal integration") @@ -160,6 +171,11 @@ class PosConfig(models.Model): if self.journal_id and self.journal_id.company_id.id != self.company_id.id: raise UserError(_("The company of the sale journal is different than the one of point of sale")) + @api.constrains('company_id', 'invoice_journal_id') + def _check_company_journal(self): + if self.invoice_journal_id and self.invoice_journal_id.company_id.id != self.company_id.id: + raise UserError(_("The invoice journal and the point of sale must belong to the same company")) + @api.constrains('company_id', 'journal_ids') def _check_company_payment(self): if self.env['account.journal'].search_count([('id', 'in', self.journal_ids.ids), ('company_id', '!=', self.company_id.id)]): diff --git a/addons/point_of_sale/models/pos_order.py b/addons/point_of_sale/models/pos_order.py index b069d627a76..ca3d71f665b 100644 --- a/addons/point_of_sale/models/pos_order.py +++ b/addons/point_of_sale/models/pos_order.py @@ -160,7 +160,7 @@ class PosOrder(models.Model): 'name': self.name, 'origin': self.name, 'account_id': self.partner_id.property_account_receivable_id.id, - 'journal_id': self.sale_journal.id, + 'journal_id': self.session_id.config_id.invoice_journal_id.id, 'type': 'out_invoice', 'reference': self.name, 'partner_id': self.partner_id.id, diff --git a/addons/point_of_sale/models/pos_session.py b/addons/point_of_sale/models/pos_session.py index 942625d76ba..ea0f8391bfe 100644 --- a/addons/point_of_sale/models/pos_session.py +++ b/addons/point_of_sale/models/pos_session.py @@ -144,10 +144,13 @@ class PosSession(models.Model): pos_config = self.env['pos.config'].browse(config_id) ctx = dict(self.env.context, company_id=pos_config.company_id.id) if not pos_config.journal_id: - jid = pos_config.with_context(ctx).default_get(['journal_id'])['journal_id'] - if not jid: + default_journals = pos_config.with_context(ctx).default_get(['journal_id', 'invoice_journal_id']) + if (not default_journals.get('journal_id') or + not default_journals.get('invoice_journal_id')): raise UserError(_("Unable to open the session. You have to assign a sale journal to your point of sale.")) - pos_config.with_context(ctx).sudo().write({'journal_id': jid}) + pos_config.with_context(ctx).sudo().write({ + 'journal_id': default_journals['journal_id'], + 'invoice_journal_id': default_journals['invoice_journal_id']}) # define some cash journal if no payment method exists if not pos_config.journal_ids: Journal = self.env['account.journal'] diff --git a/addons/point_of_sale/tests/test_frontend.py b/addons/point_of_sale/tests/test_frontend.py index c399c974677..88fbc551bb7 100644 --- a/addons/point_of_sale/tests/test_frontend.py +++ b/addons/point_of_sale/tests/test_frontend.py @@ -42,8 +42,10 @@ class TestUi(odoo.tests.HttpCase): env['product.pricelist'].search([]).write(dict(currency_id=main_company.currency_id.id)) - main_pos_config.journal_id = test_sale_journal - main_pos_config.write({'journal_ids': [(0, 0, {'name': 'Cash Journal - Test', + main_pos_config.write({ + 'journal_id': test_sale_journal.id, + 'invoice_journal_id': test_sale_journal.id, + 'journal_ids': [(0, 0, {'name': 'Cash Journal - Test', 'code': 'TSC', 'type': 'cash', 'company_id': main_company.id, diff --git a/addons/point_of_sale/views/pos_config_view.xml b/addons/point_of_sale/views/pos_config_view.xml index a50f40929a5..f94f7905cca 100644 --- a/addons/point_of_sale/views/pos_config_view.xml +++ b/addons/point_of_sale/views/pos_config_view.xml @@ -14,6 +14,7 @@ +