diff --git a/beesdoo_base/demo/cooperators.xml b/beesdoo_base/demo/cooperators.xml index 1d3bcd6..2795b16 100644 --- a/beesdoo_base/demo/cooperators.xml +++ b/beesdoo_base/demo/cooperators.xml @@ -9,7 +9,6 @@ Fernand Peso - worker_eater fernand_peso@demo.net @@ -22,7 +21,6 @@ Dupont Dupont - worker_eater d_dupont@demo.net @@ -35,7 +33,6 @@ Ronan Le Gall - worker_eater ronan_gall@demo.net @@ -48,7 +45,6 @@ Elouan Bees - worker_eater elouan_bees@demo.net @@ -61,7 +57,6 @@ Anne de Marchalo - worker_eater anne_marchalo@demo.net @@ -74,7 +69,6 @@ Jean Beaumont - worker_eater jean_beaumont@demo.net diff --git a/beesdoo_base/models/partner.py b/beesdoo_base/models/partner.py index 8196b02..e062164 100644 --- a/beesdoo_base/models/partner.py +++ b/beesdoo_base/models/partner.py @@ -1,3 +1,6 @@ +# Copyright 2020 Coop IT Easy SCRL fs +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + from odoo import _, api, fields, models from odoo.exceptions import ValidationError @@ -24,10 +27,23 @@ class Partner(models.Model): compute="_compute_bar_code", string="Parent Barcode", store=True ) member_card_ids = fields.One2many("member.card", "partner_id") + country_id = fields.Many2one( + required=True, default=lambda self: self.env.ref("base.be") + ) member_card_to_be_printed = fields.Boolean("Print BEES card?") last_printed = fields.Datetime("Last printed on") + cooperator_type = fields.Selection( + [ + ("share_a", "Share A"), + ("share_b", "Share B"), + ("share_c", "Share C"), + ], + store=True, + compute=None, + ) + @api.multi @api.depends( "parent_eater_id", "parent_eater_id.barcode", @@ -35,28 +51,61 @@ class Partner(models.Model): "member_card_ids", ) def _compute_bar_code(self): - for rec in self: - if rec.eater == "eater": - rec.parent_barcode = rec.parent_eater_id.barcode - elif rec.member_card_ids: - for c in rec.member_card_ids: + for partner in self: + if partner.eater == "eater": + partner.parent_barcode = partner.parent_eater_id.barcode + elif partner.member_card_ids: + for c in partner.member_card_ids: if c.valid: - rec.barcode = c.barcode + partner.barcode = c.barcode + + @api.multi + @api.constrains("child_eater_ids", "parent_eater_id") + def _check_number_of_eaters(self): + """The owner of an A share can have a maximum of two eaters but + the owner of a B share can have a maximum of three eaters. + """ + for partner in self: + # Get the default_code of the share for the current eater and his parent + share_type_code = partner.cooperator_type + parent_share_type_code = partner.parent_eater_id.cooperator_type + # Raise exception + if ( + share_type_code == "share_b" + or parent_share_type_code == "share_b" + ): + if ( + len(partner.child_eater_ids) > 3 + or len(partner.parent_eater_id.child_eater_ids) > 3 + ): + raise ValidationError( + _( + "You can only set three additional eaters per worker" + ) + ) + else: + if ( + len(partner.child_eater_ids) > 2 + or len(partner.parent_eater_id.child_eater_ids) > 2 + ): + raise ValidationError( + _("You can only set two additional eaters per worker") + ) @api.multi def write(self, values): - for rec in self: + for partner in self: if ( values.get("parent_eater_id") - and rec.parent_eater_id - and rec.parent_eater_id.id != values.get("parent_eater_id") + and partner.parent_eater_id + and partner.parent_eater_id.id != values.get("parent_eater_id") ): raise ValidationError( _( "You try to assign a eater to a worker but this eater " "is already assign to %s please remove it before " ) - % rec.parent_eater_id.name + % partner.parent_eater_id.name ) # replace many2many command when writing on child_eater_ids to just # remove the link @@ -66,6 +115,7 @@ class Partner(models.Model): command[0] = 3 return super(Partner, self).write(values) + @api.multi def _deactivate_active_cards(self): self.ensure_one() for card in self.member_card_ids.filtered("valid"): diff --git a/beesdoo_product/models/beesdoo_product.py b/beesdoo_product/models/beesdoo_product.py index e483f05..c460a9a 100644 --- a/beesdoo_product/models/beesdoo_product.py +++ b/beesdoo_product/models/beesdoo_product.py @@ -1,3 +1,6 @@ +# Copyright 2020 Coop IT Easy SCRL fs +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + import logging import uuid @@ -150,11 +153,13 @@ class BeesdooProduct(models.Model): @api.multi @api.depends("seller_ids", "seller_ids.date_start") def _compute_main_seller_id(self): - self.ensure_one() - # Calcule le vendeur associé qui a la date de début la plus récente - # et plus petite qu’aujourd’hui - sellers_ids = self._get_main_supplier_info() - self.main_seller_id = sellers_ids and sellers_ids[0].name or False + for product in self: + # Calcule le vendeur associé qui a la date de début la plus récente + # et plus petite qu’aujourd’hui + sellers_ids = product._get_main_supplier_info() + product.main_seller_id = ( + sellers_ids and sellers_ids[0].name or False + ) @api.multi @api.depends( @@ -166,57 +171,65 @@ class BeesdooProduct(models.Model): "weight", ) def _compute_total(self): - self.ensure_one() - consignes_group = self.env.ref( - "beesdoo_product.consignes_group_tax", raise_if_not_found=False - ) + for product in self: + consignes_group = self.env.ref( + "beesdoo_product.consignes_group_tax", raise_if_not_found=False + ) - taxes_included = set(self.taxes_id.mapped("price_include")) - if len(taxes_included) == 0: - self.total_with_vat = self.list_price - return True + taxes_included = set(product.taxes_id.mapped("price_include")) + if len(taxes_included) == 0: + product.total_with_vat = product.list_price + return True - elif len(taxes_included) > 1: - raise ValidationError( - _("Several tax strategies (price_include) defined for %s") - % self.name - ) + elif len(taxes_included) > 1: + raise ValidationError( + _("Several tax strategies (price_include) defined for %s") + % product.name + ) - elif taxes_included.pop(): - self.total_with_vat = self.list_price - self.total_deposit = sum( + elif taxes_included.pop(): + product.total_with_vat = product.list_price + product.total_deposit = sum( + [ + tax._compute_amount( + product.list_price, product.list_price + ) + for tax in product.taxes_id + if tax.tax_group_id == consignes_group + ] + ) + else: + tax_amount_sum = sum( + [ + tax._compute_amount( + product.list_price, product.list_price + ) + for tax in product.taxes_id + if tax.tax_group_id != consignes_group + ] + ) + product.total_with_vat = product.list_price + tax_amount_sum + + product.total_deposit = sum( [ - tax._compute_amount(self.list_price, self.list_price) - for tax in self.taxes_id + tax._compute_amount(product.list_price, product.list_price) + for tax in product.taxes_id if tax.tax_group_id == consignes_group ] ) - else: - tax_amount_sum = sum( - [ - tax._compute_amount(self.list_price, self.list_price) - for tax in self.taxes_id - if tax.tax_group_id != consignes_group - ] - ) - self.total_with_vat = self.list_price + tax_amount_sum - - self.total_deposit = sum( - [ - tax._compute_amount(self.list_price, self.list_price) - for tax in self.taxes_id - if tax.tax_group_id == consignes_group - ] - ) - if self.display_weight > 0: - self.total_with_vat_by_unit = self.total_with_vat / self.weight + if product.display_weight > 0: + product.total_with_vat_by_unit = ( + product.total_with_vat / product.weight + ) @api.multi @api.depends("weight", "display_unit") def _compute_display_weight(self): - self.ensure_one() - self.display_weight = self.weight * self.display_unit.factor + for product in self: + product.display_weight = ( + product.weight * product.display_unit.factor + ) @api.multi @api.constrains("display_unit", "default_reference_unit") @@ -236,12 +249,15 @@ class BeesdooProduct(models.Model): @api.multi @api.depends("seller_ids") def _compute_cost(self): - self.ensure_one() - suppliers = self._get_main_supplier_info() - if len(suppliers) > 0: - self.suggested_price = ( - suppliers[0].price * self.uom_po_id.factor - ) * (1 + suppliers[0].product_tmpl_id.categ_id.profit_margin / 100) + for product in self: + suppliers = product._get_main_supplier_info() + if len(suppliers) > 0: + product.suggested_price = ( + suppliers[0].price * product.uom_po_id.factor + ) * ( + 1 + + suppliers[0].product_tmpl_id.categ_id.profit_margin / 100 + ) class BeesdooScaleCategory(models.Model):