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:
parent
b437a82a70
commit
2164e2be54
4 changed files with 146 additions and 46 deletions
|
|
@ -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.",
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Reference in a new issue