Add Our bank account

This commit is contained in:
2026-04-23 10:15:20 +02:00
parent 036a2801e5
commit 228ee07a9c
5 changed files with 140 additions and 40 deletions

View File

@@ -1,8 +1,8 @@
# Business Rules - Purchase Trade # Business Rules - Purchase Trade
Statut: `draft` Statut: `draft`
Version: `v0.5` Version: `v0.6`
Derniere mise a jour: `2026-04-10` Derniere mise a jour: `2026-04-23`
Owner metier: `a completer` Owner metier: `a completer`
Owner technique: `a completer` Owner technique: `a completer`
@@ -389,6 +389,27 @@ Owner technique: `a completer`
- Priorite: - Priorite:
- `importante` - `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 ### 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 - Intent: eviter qu'une valuation `basis` ouverte sorte a zero alors que la

View File

@@ -263,10 +263,17 @@ class Purchase(metaclass=PoolMeta):
bank_accounts = fields.Function( bank_accounts = fields.Function(
fields.Many2Many('bank.account', None, None, "Bank Accounts"), fields.Many2Many('bank.account', None, None, "Bank Accounts"),
'on_change_with_bank_accounts') 'on_change_with_bank_accounts')
bank_account = fields.Many2One( bank_account = fields.Many2One(
'bank.account', "Bank Account", 'bank.account', "Bank Account",
domain=[('id', 'in', Eval('bank_accounts', []))], domain=[('id', 'in', Eval('bank_accounts', []))],
depends=['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')]) 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')]) to_location = fields.Many2One('stock.location', 'To location', required=True,domain=[('type', "!=", 'supplier')])
shipment_in = fields.Many2One('stock.shipment.in','Purchases') shipment_in = fields.Many2One('stock.shipment.in','Purchases')
@@ -324,22 +331,52 @@ class Purchase(metaclass=PoolMeta):
return account return account
return party_bank_accounts[0] 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') @fields.depends('party', '_parent_party.bank_accounts')
def on_change_with_bank_accounts(self, name=None): def on_change_with_bank_accounts(self, name=None):
if self.party and self.party.bank_accounts: if self.party and self.party.bank_accounts:
return [account.id for account in self.party.bank_accounts] return [account.id for account in self.party.bank_accounts]
return [] return []
@fields.depends( @fields.depends('company', '_parent_company.party',
'company', 'party', 'invoice_party', 'payment_term', 'lines', '_parent_company.party.bank_accounts')
'bank_account', '_parent_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): def on_change_party(self):
super().on_change_party() super().on_change_party()
self.bank_account = self._get_default_bank_account() 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): def on_change_currency(self):
self.bank_account = self._get_default_bank_account() 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 @classmethod
def default_wb(cls): def default_wb(cls):

View File

@@ -228,10 +228,17 @@ class Sale(metaclass=PoolMeta):
bank_accounts = fields.Function( bank_accounts = fields.Function(
fields.Many2Many('bank.account', None, None, "Bank Accounts"), fields.Many2Many('bank.account', None, None, "Bank Accounts"),
'on_change_with_bank_accounts') 'on_change_with_bank_accounts')
bank_account = fields.Many2One( bank_account = fields.Many2One(
'bank.account', "Bank Account", 'bank.account', "Bank Account",
domain=[('id', 'in', Eval('bank_accounts', []))], domain=[('id', 'in', Eval('bank_accounts', []))],
depends=['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')]) 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')]) to_location = fields.Many2One('stock.location', 'To location', required=True,domain=[('type', "!=", 'supplier')])
shipment_out = fields.Many2One('stock.shipment.out','Sales') shipment_out = fields.Many2One('stock.shipment.out','Sales')
@@ -278,32 +285,63 @@ class Sale(metaclass=PoolMeta):
self.company and self.company.party self.company and self.company.party
and self.company.party.name == 'MELYA') and self.company.party.name == 'MELYA')
def _get_default_bank_account(self): def _get_default_bank_account(self):
if not self.party or not self.party.bank_accounts: if not self.party or not self.party.bank_accounts:
return None return None
party_bank_accounts = list(self.party.bank_accounts) party_bank_accounts = list(self.party.bank_accounts)
if self.currency: if self.currency:
for account in party_bank_accounts: for account in party_bank_accounts:
if account.currency == self.currency: if account.currency == self.currency:
return account return account
return party_bank_accounts[0] return party_bank_accounts[0]
@fields.depends('party', '_parent_party.bank_accounts') def _get_default_our_bank_account(self):
def on_change_with_bank_accounts(self, name=None): if (not self.company or not self.company.party
if self.party and self.party.bank_accounts: or not self.company.party.bank_accounts):
return [account.id for account in self.party.bank_accounts] return None
return [] company_bank_accounts = list(self.company.party.bank_accounts)
if self.currency:
@fields.depends( for account in company_bank_accounts:
'company', 'party', 'invoice_party', 'shipment_party', 'warehouse', if account.currency == self.currency:
'payment_term', 'lines', 'bank_account', '_parent_party.bank_accounts') return account
def on_change_party(self): return company_bank_accounts[0]
super().on_change_party()
self.bank_account = self._get_default_bank_account() @fields.depends('party', '_parent_party.bank_accounts')
def on_change_with_bank_accounts(self, name=None):
@fields.depends('party', 'currency', '_parent_party.bank_accounts') if self.party and self.party.bank_accounts:
def on_change_currency(self): return [account.id for account in self.party.bank_accounts]
self.bank_account = self._get_default_bank_account() 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 @classmethod
def default_wb(cls): def default_wb(cls):

View File

@@ -82,5 +82,7 @@ this repository contains the full copyright notices and license terms. -->
<xpath expr="/form/notebook/page[@id='info']/label[@name='invoice_party']" position="before"> <xpath expr="/form/notebook/page[@id='info']/label[@name='invoice_party']" position="before">
<label name="bank_account"/> <label name="bank_account"/>
<field name="bank_account"/> <field name="bank_account"/>
<label name="our_bank_account"/>
<field name="our_bank_account"/>
</xpath> </xpath>
</data> </data>

View File

@@ -95,5 +95,7 @@ this repository contains the full copyright notices and license terms. -->
<xpath expr="/form/notebook/page[@id='other']/label[@name='company']" position="before"> <xpath expr="/form/notebook/page[@id='other']/label[@name='company']" position="before">
<label name="bank_account"/> <label name="bank_account"/>
<field name="bank_account"/> <field name="bank_account"/>
<label name="our_bank_account"/>
<field name="our_bank_account"/>
</xpath> </xpath>
</data> </data>