diff --git a/delivery_carrier_partner_account/__manifest__.py b/delivery_carrier_partner_account/__manifest__.py index 08c316f..a504df0 100644 --- a/delivery_carrier_partner_account/__manifest__.py +++ b/delivery_carrier_partner_account/__manifest__.py @@ -19,7 +19,7 @@ # { "name": "Carrier Accounts by Partner", - "version": "18.0.0.1.3", + "version": "18.0.0.1.4", "summary": "Add one or many carrier accounts per partner", "category": "Delivery", "author": "Bemade Inc.", diff --git a/delivery_carrier_partner_account/models/delivery_carrier_account.py b/delivery_carrier_partner_account/models/delivery_carrier_account.py index 136fe82..abcf440 100644 --- a/delivery_carrier_partner_account/models/delivery_carrier_account.py +++ b/delivery_carrier_partner_account/models/delivery_carrier_account.py @@ -38,19 +38,3 @@ class DeliveryCarrierAccount(models.Model): def _compute_display_name(self): for record in self: record.display_name = record.account_number - - def write(self, vals): - res = super().write(vals) - for partner in self.partner_id.filtered( - lambda partner: not partner.default_carrier_account_id - ): - partner.default_carrier_account_id = partner.carrier_account_ids[0] - return res - - @api.model_create_multi - def create(self, vals_list): - res = super().create(vals_list) - for rec in res: - if not rec.partner_id.default_carrier_account_id: - rec.partner_id.default_carrier_account_id = rec - return res diff --git a/delivery_carrier_partner_account/models/res_partner.py b/delivery_carrier_partner_account/models/res_partner.py index 92459ff..495f9cb 100644 --- a/delivery_carrier_partner_account/models/res_partner.py +++ b/delivery_carrier_partner_account/models/res_partner.py @@ -13,29 +13,77 @@ class Partner(models.Model): default_carrier_account_id = fields.Many2one( comodel_name="delivery.carrier.account", + compute="_compute_logistic_defaults", + inverse="_inverse_default_carrier_account_id", + store=True, tracking=1, ondelete="restrict", ) - def write(self, vals): - update_default_carrier = ( - "carrier_account_ids" in vals and not self.default_carrier_account_id - ) - res = super().write(vals) - if update_default_carrier and self.carrier_account_ids: - self.default_carrier_account_id = self.carrier_account_ids[0] - self.property_delivery_carrier_id = ( - self.default_carrier_account_id.delivery_carrier_id - ) - return res + property_delivery_carrier_id = fields.Many2one( + compute="_compute_logistic_defaults", + inverse="_inverse_property_delivery_carrier_id", + store=True, + ) - @api.model_create_multi - def create(self, vals_list): - res = super().create(vals_list) - for rec in res: - if not rec.default_carrier_account_id and rec.carrier_account_ids: - rec.default_carrier_account_id = rec.carrier_account_ids[0] - return res + def _inverse_default_carrier_account_id(self): + pass + + def _inverse_property_delivery_carrier_id(self): + pass + + @api.depends( + "carrier_account_ids", + "carrier_account_ids.active", + "carrier_account_ids.delivery_carrier_id", + ) + def _compute_logistic_defaults(self): + # Unset default carrier account if it is archived + for partner in self.filtered( + lambda partner: partner.default_carrier_account_id + and not partner.default_carrier_account_id.active + ): + partner.default_carrier_account_id = False + + # Unset the default carrier if no accounts are available + for partner in self.filtered( + lambda partner: partner.property_delivery_carrier_id + ).filtered( + lambda partner: not partner.carrier_account_ids.filtered( + lambda account: account.delivery_carrier_id + == partner.property_delivery_carrier_id + and account.active + ) + ): + partner.property_delivery_carrier_id = False + + # Set default carrier account if not set and accounts available + for partner in self.filtered( + lambda partner: not partner.default_carrier_account_id + and partner.carrier_account_ids.filtered("active") + ): + partner.default_carrier_account_id = partner.carrier_account_ids.filtered( + "active" + )[0] + + # Set default carrier if not set and default account is set + for partner in self.filtered( + lambda partner: not partner.property_delivery_carrier_id + and partner.default_carrier_account_id + ): + partner.property_delivery_carrier_id = ( + partner.default_carrier_account_id.delivery_carrier_id + ) + + # Reset default carrier if account is set and doesn't match + for partner in self.filtered( + lambda partner: partner.default_carrier_account_id + and partner.default_carrier_account_id.delivery_carrier_id + != partner.property_delivery_carrier_id + ): + partner.property_delivery_carrier_id = ( + partner.default_carrier_account_id.delivery_carrier_id + ) def get_carrier_account(self, carrier): self.ensure_one() @@ -52,3 +100,22 @@ class Partner(models.Model): if commercial_patner_accounts: return commercial_patner_accounts[0] return self.env["delivery.carrier.account"] + + def process_carrier_account_archiving(self): + for partner in self: + # Unset default carrier account if it is archived + if ( + partner.default_carrier_account_id + and not partner.default_carrier_account_id.active + ): + partner.default_carrier_account_id = False + # Unset default carrier if not more accounts available + if ( + partner.property_delivery_carrier_id + and not partner.carrier_account_ids.filtered( + lambda account: account.delivery_carrier_id + == partner.property_delivery_carrier_id + and account.active + ) + ): + partner.property_delivery_carrier_id = False diff --git a/delivery_carrier_partner_account/tests/test_res_partner.py b/delivery_carrier_partner_account/tests/test_res_partner.py index d2c1e46..f1d2ccd 100644 --- a/delivery_carrier_partner_account/tests/test_res_partner.py +++ b/delivery_carrier_partner_account/tests/test_res_partner.py @@ -1,4 +1,4 @@ -from odoo.tests import TransactionCase, tagged +from odoo.tests import TransactionCase, tagged, Form from odoo import Command @@ -12,16 +12,15 @@ class TestResPartner(TransactionCase): partner = self.env["res.partner"].create( { "name": "Test Partner", - "carrier_account_ids": [ - Command.create( - { - "delivery_carrier_id": self.env.ref( - "delivery.free_delivery_carrier" - ).id, - "account_number": "1234567890", - } - ) - ], + } + ) + account = self.env["delivery.carrier.account"].create( + { + "partner_id": partner.id, + "delivery_carrier_id": self.env.ref( + "delivery.free_delivery_carrier" + ).id, + "account_number": "1234567890", } ) @@ -97,3 +96,53 @@ class TestResPartner(TransactionCase): ) self.assertEqual(partner.default_carrier_account_id, new_account) + + def test_no_archived_default_carrier_account(self): + partner = self.env["res.partner"].create( + { + "name": "Test Partner", + } + ) + account = self.env["delivery.carrier.account"].create( + { + "partner_id": partner.id, + "delivery_carrier_id": self.env.ref( + "delivery.free_delivery_carrier" + ).id, + "account_number": "1234567890", + } + ) + + with Form(account) as account_form: + account_form.active = False + + self.assertFalse(partner.default_carrier_account_id) + + def test_multiple_carrier_accounts_reset_default_on_archive(self): + partner = self.env["res.partner"].create( + { + "name": "Test Partner", + } + ) + account1 = self.env["delivery.carrier.account"].create( + { + "partner_id": partner.id, + "delivery_carrier_id": self.env.ref( + "delivery.free_delivery_carrier" + ).id, + "account_number": "1234567890", + } + ) + account2 = self.env["delivery.carrier.account"].create( + { + "partner_id": partner.id, + "delivery_carrier_id": self.env.ref( + "delivery.free_delivery_carrier" + ).id, + "account_number": "1234567891", + } + ) + self.assertEqual(partner.default_carrier_account_id, account1) + with Form(account1) as account_form: + account_form.active = False + self.assertEqual(partner.default_carrier_account_id, account2)