delivery_carrier_partner_account: fix and refactoring

- Fix: partners can no longer have default carrier accounts that are
archived.
- Refactor: remove write/create overrides to replace them with
  computed/stored fields.
This commit is contained in:
Marc Durepos 2025-06-30 11:25:53 -04:00
parent b437a82a70
commit 2164e2be54
4 changed files with 146 additions and 46 deletions

View file

@ -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.",

View file

@ -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

View file

@ -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

View file

@ -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)