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. -->
+
+