diff --git a/commown_b2b_mail_channel/models/contract.py b/commown_b2b_mail_channel/models/contract.py index b75c1568..931a8d7c 100644 --- a/commown_b2b_mail_channel/models/contract.py +++ b/commown_b2b_mail_channel/models/contract.py @@ -8,6 +8,12 @@ class Contract(models.Model): _inherit = "contract.contract" + def is_active_contract(self): + if self.date_start and self.date_start <= date.today(): + return not self.date_end or self.date_end > date.today() + else: + return False + @api.constrains("date_start") def on_contract_start_create_channel(self): """Trigger support channel creation if contract is about to start""" diff --git a/commown_b2b_mail_channel/models/res_partner.py b/commown_b2b_mail_channel/models/res_partner.py index a5d21cae..64dba283 100644 --- a/commown_b2b_mail_channel/models/res_partner.py +++ b/commown_b2b_mail_channel/models/res_partner.py @@ -28,6 +28,23 @@ def write(self, vals): self.env["mail.channel"].browse(new_chan_id).channel_invite( partners_to_add.ids ) + if not self.is_company and "parent_id" in vals.keys(): + new_parent_id = vals["parent_id"] + if new_parent_id: + new_parent = self.env["res.partner"].browse(new_parent_id) + if new_parent.mail_channel_id: + new_parent.mail_channel_id.channel_invite(self.id) + + elif not new_parent.mail_channel_id and self.contract_ids.filtered( + lambda c: c.is_active_contract() + ): + new_parent.sudo().create_mail_channel() + + if not new_parent_id: + old_parent = self.parent_id + if old_parent and old_parent.mail_channel_id: + self.remove_partners_from_channel(old_parent.mail_channel_id, self) + return super().write(vals) def remove_partners_from_channel(self, channel, partners): diff --git a/commown_b2b_mail_channel/tests/test_res_partner.py b/commown_b2b_mail_channel/tests/test_res_partner.py index 98516aff..25d7fadb 100644 --- a/commown_b2b_mail_channel/tests/test_res_partner.py +++ b/commown_b2b_mail_channel/tests/test_res_partner.py @@ -39,3 +39,32 @@ def test_support_channel_creation_on_contract_start(self): self.part1 + self.part2 + self.user_support.partner_id, ) self.assertEqual(company_chan.group_ids, expected_groups) + + def test_partner_is_added_when_parent_has_channel(self): + self.company.create_mail_channel() + mail_channel = self.company.mail_channel_id + self.assertTrue(mail_channel) + + initial_parts = mail_channel.channel_last_seen_partner_ids.mapped("partner_id") + + self.part1.parent_id = self.company + self.assertEqual( + mail_channel.channel_last_seen_partner_ids.mapped("partner_id"), + initial_parts + self.part1, + ) + + self.part1.parent_id = False + self.assertEqual( + mail_channel.channel_last_seen_partner_ids.mapped("partner_id"), + initial_parts, + ) + + def test_channel_creation_on_active_contract_join_company(self): + """Test if channel is created when a partner with an active contract join + company""" + self.part2.parent_id = self.company + self.contract.date_start = date.today() + self.assertFalse(self.company.mail_channel_id) + + self.part1.parent_id = self.company + self.assertTrue(self.company.mail_channel_id)