diff --git a/beesdoo_easy_my_coop/__manifest__.py b/beesdoo_easy_my_coop/__manifest__.py
index 8a1708a..aa1bc3e 100644
--- a/beesdoo_easy_my_coop/__manifest__.py
+++ b/beesdoo_easy_my_coop/__manifest__.py
@@ -23,12 +23,13 @@
],
'data': [
- 'data/product_share.xml',
- 'views/partner.xml',
'views/res_company.xml',
'views/subscription_request.xml',
'views/subscription_templates.xml',
'views/product.xml'
],
+ 'demo': [
+ 'demo/product_share.xml',
+ ],
'auto_install': True,
}
diff --git a/beesdoo_easy_my_coop/data/product_share.xml b/beesdoo_easy_my_coop/data/product_share.xml
deleted file mode 100644
index 50db413..0000000
--- a/beesdoo_easy_my_coop/data/product_share.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
- Acquisition de parts A de Beescoop scrl
- share_a
-
-
-
-
- Acquisition de parts B de Beescoop scrl
- share_b
-
-
-
-
- Acquisition de parts C de Beescoop scrl
- share_c
-
-
-
-
-
\ No newline at end of file
diff --git a/beesdoo_easy_my_coop/demo/product_share.xml b/beesdoo_easy_my_coop/demo/product_share.xml
new file mode 100644
index 0000000..cc7eca9
--- /dev/null
+++ b/beesdoo_easy_my_coop/demo/product_share.xml
@@ -0,0 +1,74 @@
+
+
+
+
+ Acquisition de parts A de Beescoop scrl
+ share_a
+
+
+ 3
+
+
+
+ Acquisition de parts B de Beescoop scrl
+ share_b
+
+
+ 2
+
+
+
+ Acquisition de parts C de Beescoop scrl
+ share_c
+
+
+ -1
+
+
+
+
+
+
+ 2
+ 2020-01-01
+
+
+
+
+
+
+ share_a
+
+
+
+
+ 4
+ 2020-01-01
+
+
+
+
+
+
+ share_b
+
+
+
+
+ 6
+ 2020-01-01
+
+
+
+
+
+
+ share_c
+
+
diff --git a/beesdoo_easy_my_coop/models/product.py b/beesdoo_easy_my_coop/models/product.py
index 35fc68f..91b6800 100644
--- a/beesdoo_easy_my_coop/models/product.py
+++ b/beesdoo_easy_my_coop/models/product.py
@@ -5,4 +5,18 @@ class ProductTemplate(models.Model):
_inherit = 'product.template'
- can_shop = fields.Boolean(string="Is share?")
+ max_nb_eater_allowed = fields.Integer(
+ string="Max number of eater allowed",
+ default=-1,
+ help=(
+ "Maximum number of eater allowed for the owner of the share. "
+ "A negative value means no maximum."
+ )
+ )
+ allow_working = fields.Boolean(
+ string="Allow owner to work?",
+ help=(
+ "Owner of this type of share are allowed to participate to the "
+ "shift system."
+ )
+ )
diff --git a/beesdoo_easy_my_coop/models/res_partner.py b/beesdoo_easy_my_coop/models/res_partner.py
index 6960c5a..55095f6 100644
--- a/beesdoo_easy_my_coop/models/res_partner.py
+++ b/beesdoo_easy_my_coop/models/res_partner.py
@@ -1,28 +1,42 @@
-from odoo import models, fields, api
+from odoo import models, fields, api, _
+from odoo.exceptions import ValidationError
class Partner(models.Model):
_inherit = 'res.partner'
- can_shop = fields.Boolean(compute='_can_shop', store=True)
info_session_confirmed = fields.Boolean(
string="Confirmed presence to info session",
default=False,
)
- @api.depends('cooperator_type',
- 'cooperative_status_ids',
- 'cooperative_status_ids.can_shop')
- def _can_shop(self):
- product_obj = self.env['product.template']
- can_shop_shares = product_obj.search([('is_share', '=', True),
- ('can_shop', '=', True)
- ]).mapped('default_code')
- for rec in self:
- if rec.cooperator_type in can_shop_shares:
- rec.can_shop = True
- elif (rec.cooperative_status_ids
- and rec.cooperative_status_ids[0].can_shop):
- rec.can_shop = True
- else:
- rec.can_shop = False
+ @api.constrains('child_eater_ids', 'parent_eater_id')
+ def _check_number_of_eaters(self):
+ """
+ Check the maximum number of eaters that can be assigned to a
+ share owner.
+ """
+ self.ensure_one()
+ share_type = None
+ if self.cooperator_type:
+ share_type = (
+ self.env['product.template']
+ .search([('default_code', '=', self.cooperator_type)])
+ )[0]
+ # If the current partner owns no share, check his parent.
+ if not share_type:
+ share_type = (
+ self.env['product.template']
+ .search([
+ ('default_code', '=', self.parent_eater_id.cooperator_type)
+ ])
+ )[0]
+ if (
+ share_type
+ and share_type.max_nb_eater_allowed >= 0
+ and len(self.child_eater_ids) > share_type.max_nb_eater_allowed
+ ):
+ raise ValidationError(
+ _('You can only set %d additional eaters per worker')
+ % share_type.max_nb_eater_allowed
+ )
diff --git a/beesdoo_easy_my_coop/tests/__init__.py b/beesdoo_easy_my_coop/tests/__init__.py
new file mode 100644
index 0000000..d57d215
--- /dev/null
+++ b/beesdoo_easy_my_coop/tests/__init__.py
@@ -0,0 +1 @@
+from . import test_res_partner
diff --git a/beesdoo_easy_my_coop/tests/test_res_partner.py b/beesdoo_easy_my_coop/tests/test_res_partner.py
new file mode 100644
index 0000000..3aa292b
--- /dev/null
+++ b/beesdoo_easy_my_coop/tests/test_res_partner.py
@@ -0,0 +1,78 @@
+# Copyright 2020 Coop IT Easy SCRLfs ()
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
+
+from odoo import exceptions
+from odoo.exceptions import ValidationError
+from odoo.tests.common import TransactionCase
+
+
+class TestResPartner(TransactionCase):
+ def setUp(self):
+ super().setUp()
+ self.eater1 = self.env.ref("beesdoo_base.eater1")
+ self.eater2 = self.env.ref("beesdoo_base.eater2")
+ self.eater3 = self.env.ref("beesdoo_base.eater3")
+ self.eater4 = self.env.ref("beesdoo_base.eater4")
+
+ def test_max_eater_assignment_share_a(self):
+ """
+ Test adding eater to a cooperator and raise when max is
+ reached.
+ """
+ coop1 = self.env.ref(
+ "beesdoo_base.res_partner_cooperator_1_demo"
+ )
+ coop1.write({"child_eater_ids": [(4, self.eater1.id)]})
+ self.assertEqual(len(coop1.child_eater_ids), 1)
+ coop1.write({"child_eater_ids": [(4, self.eater2.id)]})
+ self.assertEqual(len(coop1.child_eater_ids), 2)
+ coop1.write({"child_eater_ids": [(4, self.eater3.id)]})
+ self.assertEqual(len(coop1.child_eater_ids), 3)
+ with self.assertRaises(ValidationError) as econtext:
+ coop1.write({"child_eater_ids": [(4, self.eater4.id)]})
+ self.assertIn("can only set", str(econtext.exception))
+
+ def test_max_eater_assignment_share_b(self):
+ """
+ Test adding eater to a cooperator and raise when max is
+ reached.
+ """
+ coop2 = self.env.ref(
+ "beesdoo_base.res_partner_cooperator_2_demo"
+ )
+ coop2.write({"child_eater_ids": [(4, self.eater1.id)]})
+ self.assertEqual(len(coop2.child_eater_ids), 1)
+ coop2.write({"child_eater_ids": [(4, self.eater2.id)]})
+ self.assertEqual(len(coop2.child_eater_ids), 2)
+ with self.assertRaises(ValidationError) as econtext:
+ coop2.write({"child_eater_ids": [(4, self.eater3.id)]})
+ self.assertIn("can only set", str(econtext.exception))
+
+ def test_unlimited_eater_assignment_share_c(self):
+ """
+ Test that share_c can have an unlimited number of eater.
+ """
+ coop3 = self.env.ref(
+ "beesdoo_base.res_partner_cooperator_3_demo"
+ )
+ coop3.write({"child_eater_ids": [(4, self.eater1.id)]})
+ self.assertEqual(len(coop3.child_eater_ids), 1)
+ coop3.write({"child_eater_ids": [(4, self.eater2.id)]})
+ self.assertEqual(len(coop3.child_eater_ids), 2)
+ coop3.write({"child_eater_ids": [(4, self.eater3.id)]})
+ self.assertEqual(len(coop3.child_eater_ids), 3)
+ coop3.write({"child_eater_ids": [(4, self.eater4.id)]})
+ self.assertEqual(len(coop3.child_eater_ids), 4)
+
+ def test_share_with_no_eater_assignment_allowed(self):
+ """
+ Test that share that doesn't allow eater assignment.
+ """
+ share_c = self.env.ref("beesdoo_easy_my_coop.share_c")
+ share_c.max_nb_eater_allowed = 0
+ coop3 = self.env.ref(
+ "beesdoo_base.res_partner_cooperator_3_demo"
+ )
+ with self.assertRaises(ValidationError) as econtext:
+ coop3.write({"child_eater_ids": [(4, self.eater3.id)]})
+ self.assertIn("can only set", str(econtext.exception))
diff --git a/beesdoo_easy_my_coop/views/partner.xml b/beesdoo_easy_my_coop/views/partner.xml
deleted file mode 100644
index b523166..0000000
--- a/beesdoo_easy_my_coop/views/partner.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-
- beesdoo.partner.form.view.remove_duplicate_cooperator_type
- res.partner
-
-
-
-
-
-
-
-
diff --git a/beesdoo_easy_my_coop/views/product.xml b/beesdoo_easy_my_coop/views/product.xml
index 6316bae..09f8461 100644
--- a/beesdoo_easy_my_coop/views/product.xml
+++ b/beesdoo_easy_my_coop/views/product.xml
@@ -6,8 +6,9 @@
-
+
+
-
\ No newline at end of file
+