You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
119 lines
4.9 KiB
119 lines
4.9 KiB
# -*- coding: utf-8 -*-
|
|
# Copyright 2018 Tecnativa - Jairo Llopis
|
|
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl).
|
|
|
|
from odoo import _, api, fields, models
|
|
from odoo.exceptions import ValidationError
|
|
from oca.decorators import foreach # pylint: disable=W7935
|
|
import logging
|
|
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
|
|
class PosConfig(models.Model):
|
|
_inherit = 'pos.config'
|
|
|
|
# Redefine preexisting field
|
|
pricelist_id = fields.Many2one(
|
|
string="Default Pricelist",
|
|
help="The pricelist used if no customer is selected or if the "
|
|
"customer has no Sale Pricelist configured.",
|
|
)
|
|
# New fields
|
|
available_pricelist_ids = fields.Many2many(
|
|
'product.pricelist',
|
|
string='Available Pricelists',
|
|
default=lambda self: self._default_pricelist(),
|
|
help="Make several pricelists available in the Point of Sale. "
|
|
"You can also apply a pricelist to specific customers from "
|
|
"their contact form (in Sales tab). To be valid, this pricelist "
|
|
"must be listed here as an available pricelist. Otherwise the "
|
|
"default pricelist will apply.",
|
|
)
|
|
use_pricelist = fields.Boolean(
|
|
"Use pricelists",
|
|
help="Set shop-specific prices, seasonal discounts, etc.",
|
|
)
|
|
group_sale_pricelist = fields.Boolean(
|
|
"Use pricelists to adapt your price per customers",
|
|
implied_group='product.group_sale_pricelist',
|
|
help="Allows to manage different prices based on rules per "
|
|
"category of customers. Example: 10% for retailers, promotion "
|
|
"of 5 EUR on this product, etc.",
|
|
)
|
|
group_pricelist_item = fields.Boolean(
|
|
"Show pricelists to customers",
|
|
implied_group='product.group_pricelist_item',
|
|
)
|
|
|
|
@api.constrains('pricelist_id', 'available_pricelist_ids', 'journal_id',
|
|
'invoice_journal_id', 'journal_ids')
|
|
@foreach()
|
|
def _check_currencies(self):
|
|
if self.pricelist_id not in self.available_pricelist_ids:
|
|
raise ValidationError(_(
|
|
"The default pricelist must be included in "
|
|
"the available pricelists."))
|
|
if self.available_pricelist_ids.filtered(
|
|
lambda pricelist: pricelist.currency_id != self.currency_id):
|
|
raise ValidationError(_(
|
|
"All available pricelists must be in the same currency "
|
|
"as the company or as the Sales Journal set on this "
|
|
"point of sale if you use the Accounting application."))
|
|
if (self.invoice_journal_id.currency_id and
|
|
self.invoice_journal_id.currency_id != self.currency_id):
|
|
raise ValidationError(_(
|
|
"The invoice journal must be in the same currency as the "
|
|
"Sales Journal or the company currency if that is not set."))
|
|
if self.journal_ids.filtered(
|
|
lambda journal: (journal.currency_id and
|
|
journal.currency_id != self.currency_id)):
|
|
raise ValidationError(_(
|
|
"All payment methods must be in the same currency as the "
|
|
"Sales Journal or the company currency if that is not set."))
|
|
|
|
@api.onchange('use_pricelist')
|
|
def _onchange_use_pricelist(self):
|
|
"""If the 'pricelist' box is unchecked, reset the pricelist_id
|
|
|
|
This makes the posbox to stop using a pricelist.
|
|
"""
|
|
if not self.use_pricelist:
|
|
self.pricelist_id = self.available_pricelist_ids = \
|
|
self._default_pricelist()
|
|
else:
|
|
self.update({
|
|
'group_sale_pricelist': True,
|
|
'group_pricelist_item': True,
|
|
})
|
|
|
|
@api.onchange('available_pricelist_ids')
|
|
def _onchange_available_pricelist_ids(self):
|
|
if self.pricelist_id not in self.available_pricelist_ids:
|
|
self.pricelist_id = False
|
|
|
|
@foreach()
|
|
def _check_groups_implied(self):
|
|
for field_name in (f for f in self.fields_get_keys()
|
|
if f.startswith('group_')):
|
|
field = self._fields[field_name]
|
|
if (field.type in {'boolean', 'selection'} and
|
|
hasattr(field, 'implied_group')):
|
|
field_group_xmlids = getattr(
|
|
field, 'group', 'base.group_user').split(',')
|
|
field_groups = self.env['res.groups'].concat(
|
|
*(self.env.ref(it) for it in field_group_xmlids))
|
|
field_groups.write({
|
|
'implied_ids': [(4, self.env.ref(field.implied_group).id)],
|
|
})
|
|
|
|
@api.model
|
|
def create(self, vals):
|
|
result = super(PosConfig, self).create(vals)
|
|
result.sudo()._check_groups_implied()
|
|
return result
|
|
|
|
def write(self, vals):
|
|
result = super(PosConfig, self).write(vals)
|
|
self.sudo()._check_groups_implied()
|
|
return result
|