From 228ee07a9ce881167bcbb238f5bdc63f668d9e5d Mon Sep 17 00:00:00 2001 From: laurentbarontini Date: Thu, 23 Apr 2026 10:15:20 +0200 Subject: [PATCH] Add Our bank account --- modules/purchase_trade/docs/business-rules.md | 25 ++++- modules/purchase_trade/purchase.py | 55 +++++++++-- modules/purchase_trade/sale.py | 96 +++++++++++++------ modules/purchase_trade/view/purchase_form.xml | 2 + modules/purchase_trade/view/sale_form.xml | 2 + 5 files changed, 140 insertions(+), 40 deletions(-) diff --git a/modules/purchase_trade/docs/business-rules.md b/modules/purchase_trade/docs/business-rules.md index 33671ec..605f093 100644 --- a/modules/purchase_trade/docs/business-rules.md +++ b/modules/purchase_trade/docs/business-rules.md @@ -1,8 +1,8 @@ # Business Rules - Purchase Trade Statut: `draft` -Version: `v0.5` -Derniere mise a jour: `2026-04-10` +Version: `v0.6` +Derniere mise a jour: `2026-04-23` Owner metier: `a completer` Owner technique: `a completer` @@ -389,6 +389,27 @@ Owner technique: `a completer` - Priorite: - `importante` +### BR-PT-018 - Les contrats distinguent le compte bancaire tiers du compte bancaire compagnie + +- Intent: eviter de confondre le compte bancaire du client/fournisseur avec le + compte bancaire de la compagnie courante utilise pour encaisser ou payer. +- Description: + - Sur `sale.sale` et `purchase.purchase`, `bank_account` represente le compte + bancaire propre a la `party` du contrat. + - Sur `sale.sale` et `purchase.purchase`, `our_bank_account` represente le + compte bancaire propre a `company.party`. + - Les deux champs sont limites aux comptes bancaires disponibles sur leur + party respective. +- Resultat attendu: + - si plusieurs comptes existent, le compte dont la devise correspond a la + devise du contrat est propose en priorite + - si aucun compte ne matche la devise, le premier compte disponible est + propose + - le champ `Our Bank Account` reste modifiable par l'utilisateur dans le + domaine des comptes de la compagnie +- Priorite: + - `importante` + ### BR-PT-012 - Fallback valuation basis sans summary: utiliser le prix economique de la ligne - Intent: eviter qu'une valuation `basis` ouverte sorte a zero alors que la diff --git a/modules/purchase_trade/purchase.py b/modules/purchase_trade/purchase.py index 154f642..17ebf0e 100755 --- a/modules/purchase_trade/purchase.py +++ b/modules/purchase_trade/purchase.py @@ -263,10 +263,17 @@ class Purchase(metaclass=PoolMeta): bank_accounts = fields.Function( fields.Many2Many('bank.account', None, None, "Bank Accounts"), 'on_change_with_bank_accounts') - bank_account = fields.Many2One( - 'bank.account', "Bank Account", - domain=[('id', 'in', Eval('bank_accounts', []))], - depends=['bank_accounts']) + bank_account = fields.Many2One( + 'bank.account', "Bank Account", + domain=[('id', 'in', Eval('bank_accounts', []))], + depends=['bank_accounts']) + our_bank_accounts = fields.Function( + fields.Many2Many('bank.account', None, None, "Our Bank Accounts"), + 'on_change_with_our_bank_accounts') + our_bank_account = fields.Many2One( + 'bank.account', "Our Bank Account", + domain=[('id', 'in', Eval('our_bank_accounts', []))], + depends=['our_bank_accounts']) from_location = fields.Many2One('stock.location', 'From location', required=True,domain=[('type', "!=", 'customer')]) to_location = fields.Many2One('stock.location', 'To location', required=True,domain=[('type', "!=", 'supplier')]) shipment_in = fields.Many2One('stock.shipment.in','Purchases') @@ -324,22 +331,52 @@ class Purchase(metaclass=PoolMeta): return account return party_bank_accounts[0] + def _get_default_our_bank_account(self): + if (not self.company or not self.company.party + or not self.company.party.bank_accounts): + return None + company_bank_accounts = list(self.company.party.bank_accounts) + if self.currency: + for account in company_bank_accounts: + if account.currency == self.currency: + return account + return company_bank_accounts[0] + @fields.depends('party', '_parent_party.bank_accounts') def on_change_with_bank_accounts(self, name=None): if self.party and self.party.bank_accounts: return [account.id for account in self.party.bank_accounts] return [] - - @fields.depends( - 'company', 'party', 'invoice_party', 'payment_term', 'lines', - 'bank_account', '_parent_party.bank_accounts') + + @fields.depends('company', '_parent_company.party', + '_parent_company.party.bank_accounts') + def on_change_with_our_bank_accounts(self, name=None): + if (self.company and self.company.party + and self.company.party.bank_accounts): + return [account.id for account in self.company.party.bank_accounts] + return [] + + @fields.depends( + 'company', 'party', 'invoice_party', 'payment_term', 'lines', + 'bank_account', 'our_bank_account', '_parent_party.bank_accounts', + '_parent_company.party', '_parent_company.party.bank_accounts') def on_change_party(self): super().on_change_party() self.bank_account = self._get_default_bank_account() + self.our_bank_account = self._get_default_our_bank_account() - @fields.depends('party', 'currency', '_parent_party.bank_accounts') + @fields.depends( + 'party', 'company', 'currency', '_parent_party.bank_accounts', + '_parent_company.party', '_parent_company.party.bank_accounts') def on_change_currency(self): self.bank_account = self._get_default_bank_account() + self.our_bank_account = self._get_default_our_bank_account() + + @fields.depends('company', 'currency', 'our_bank_account', + '_parent_company.party', '_parent_company.party.bank_accounts') + def on_change_company(self): + super().on_change_company() + self.our_bank_account = self._get_default_our_bank_account() @classmethod def default_wb(cls): diff --git a/modules/purchase_trade/sale.py b/modules/purchase_trade/sale.py index 04e8cd1..c52b246 100755 --- a/modules/purchase_trade/sale.py +++ b/modules/purchase_trade/sale.py @@ -228,10 +228,17 @@ class Sale(metaclass=PoolMeta): bank_accounts = fields.Function( fields.Many2Many('bank.account', None, None, "Bank Accounts"), 'on_change_with_bank_accounts') - bank_account = fields.Many2One( - 'bank.account', "Bank Account", - domain=[('id', 'in', Eval('bank_accounts', []))], - depends=['bank_accounts']) + bank_account = fields.Many2One( + 'bank.account', "Bank Account", + domain=[('id', 'in', Eval('bank_accounts', []))], + depends=['bank_accounts']) + our_bank_accounts = fields.Function( + fields.Many2Many('bank.account', None, None, "Our Bank Accounts"), + 'on_change_with_our_bank_accounts') + our_bank_account = fields.Many2One( + 'bank.account', "Our Bank Account", + domain=[('id', 'in', Eval('our_bank_accounts', []))], + depends=['our_bank_accounts']) from_location = fields.Many2One('stock.location', 'From location', required=True,domain=[('type', "!=", 'customer')]) to_location = fields.Many2One('stock.location', 'To location', required=True,domain=[('type', "!=", 'supplier')]) shipment_out = fields.Many2One('stock.shipment.out','Sales') @@ -278,32 +285,63 @@ class Sale(metaclass=PoolMeta): self.company and self.company.party and self.company.party.name == 'MELYA') - def _get_default_bank_account(self): - if not self.party or not self.party.bank_accounts: - return None - party_bank_accounts = list(self.party.bank_accounts) - if self.currency: + def _get_default_bank_account(self): + if not self.party or not self.party.bank_accounts: + return None + party_bank_accounts = list(self.party.bank_accounts) + if self.currency: for account in party_bank_accounts: - if account.currency == self.currency: - return account - return party_bank_accounts[0] - - @fields.depends('party', '_parent_party.bank_accounts') - def on_change_with_bank_accounts(self, name=None): - if self.party and self.party.bank_accounts: - return [account.id for account in self.party.bank_accounts] - return [] - - @fields.depends( - 'company', 'party', 'invoice_party', 'shipment_party', 'warehouse', - 'payment_term', 'lines', 'bank_account', '_parent_party.bank_accounts') - def on_change_party(self): - super().on_change_party() - self.bank_account = self._get_default_bank_account() - - @fields.depends('party', 'currency', '_parent_party.bank_accounts') - def on_change_currency(self): - self.bank_account = self._get_default_bank_account() + if account.currency == self.currency: + return account + return party_bank_accounts[0] + + def _get_default_our_bank_account(self): + if (not self.company or not self.company.party + or not self.company.party.bank_accounts): + return None + company_bank_accounts = list(self.company.party.bank_accounts) + if self.currency: + for account in company_bank_accounts: + if account.currency == self.currency: + return account + return company_bank_accounts[0] + + @fields.depends('party', '_parent_party.bank_accounts') + def on_change_with_bank_accounts(self, name=None): + if self.party and self.party.bank_accounts: + return [account.id for account in self.party.bank_accounts] + return [] + + @fields.depends('company', '_parent_company.party', + '_parent_company.party.bank_accounts') + def on_change_with_our_bank_accounts(self, name=None): + if (self.company and self.company.party + and self.company.party.bank_accounts): + return [account.id for account in self.company.party.bank_accounts] + return [] + + @fields.depends( + 'company', 'party', 'invoice_party', 'shipment_party', 'warehouse', + 'payment_term', 'lines', 'bank_account', 'our_bank_account', + '_parent_party.bank_accounts', '_parent_company.party', + '_parent_company.party.bank_accounts') + def on_change_party(self): + super().on_change_party() + self.bank_account = self._get_default_bank_account() + self.our_bank_account = self._get_default_our_bank_account() + + @fields.depends( + 'party', 'company', 'currency', '_parent_party.bank_accounts', + '_parent_company.party', '_parent_company.party.bank_accounts') + def on_change_currency(self): + self.bank_account = self._get_default_bank_account() + self.our_bank_account = self._get_default_our_bank_account() + + @fields.depends('company', 'currency', 'our_bank_account', + '_parent_company.party', '_parent_company.party.bank_accounts') + def on_change_company(self): + super().on_change_company() + self.our_bank_account = self._get_default_our_bank_account() @classmethod def default_wb(cls): diff --git a/modules/purchase_trade/view/purchase_form.xml b/modules/purchase_trade/view/purchase_form.xml index e3d9313..1cbc716 100755 --- a/modules/purchase_trade/view/purchase_form.xml +++ b/modules/purchase_trade/view/purchase_form.xml @@ -82,5 +82,7 @@ this repository contains the full copyright notices and license terms. --> diff --git a/modules/purchase_trade/view/sale_form.xml b/modules/purchase_trade/view/sale_form.xml index 8ec11b5..57f491d 100755 --- a/modules/purchase_trade/view/sale_form.xml +++ b/modules/purchase_trade/view/sale_form.xml @@ -95,5 +95,7 @@ this repository contains the full copyright notices and license terms. -->