Files
tradon/modules/account_payment_sepa/party.py
2026-03-14 09:42:12 +00:00

104 lines
3.3 KiB
Python

# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from trytond.i18n import gettext
from trytond.model import fields
from trytond.pool import Pool, PoolMeta
from trytond.pyson import Eval
from .exceptions import PartyIdentificationdError
class Party(metaclass=PoolMeta):
__name__ = 'party.party'
sepa_creditor_identifier_used = fields.Function(fields.Char(
'SEPA Creditor Identifier Used'),
'get_sepa_creditor_identifier_used')
sepa_mandates = fields.One2Many('account.payment.sepa.mandate', 'party',
'SEPA Mandates')
@classmethod
def copy(cls, parties, default=None):
if default is None:
default = {}
else:
default = default.copy()
default.setdefault('sepa_mandates', [])
return super().copy(parties, default=default)
def get_sepa_creditor_identifier_used(self, name):
for identifier in self.identifiers:
if identifier.type == 'eu_at_02':
return identifier.code
def get_sepa_identifier(self, name):
pool = Pool()
Identifier = pool.get('party.identifier')
for identifier in self.identifiers:
if identifier.type == name:
return identifier.sepa_identifier
else:
type = dict(Identifier.get_types()).get(name, name)
raise PartyIdentificationdError(
gettext('account_payment_sepa.msg_party_no_id',
party=self.rec_name,
type=type))
def sepa_mandates_for(self, payment):
for mandate in self.sepa_mandates:
if mandate.company == payment.company:
yield mandate
class PartyReceptionDirectDebit(metaclass=PoolMeta):
__name__ = 'party.party.reception_direct_debit'
sepa_mandate = fields.Many2One(
'account.payment.sepa.mandate', "Mandate", ondelete='CASCADE',
domain=[
('party', '=', Eval('party', -1)),
],
states={
'invisible': Eval('process_method') != 'sepa',
'readonly': ~Eval('party') | (Eval('party', -1) < 0),
})
def _get_payment(self, line, date, amount):
payment = super()._get_payment(line, date, amount)
payment.sepa_mandate = self.sepa_mandate
return payment
class PartyIdentifier(metaclass=PoolMeta):
__name__ = 'party.identifier'
sepa_es_suffix = fields.Char(
"SEPA Suffix", size=3,
states={
'invisible': Eval('type') != 'es_vat',
})
@property
def sepa_identifier(self):
identifier = {
'Type': 'OrgId',
'Id': self.code,
}
if self.type == 'eu_at_02':
identifier['Type'] = 'PrvtId'
identifier['SchmeNm'] = {'Prtry': 'SEPA'}
elif self.type == 'be_vat':
identifier['Issr'] = 'KBO-BCE'
elif self.type == 'es_vat':
identifier['Id'] += self.sepa_es_suffix or '000'
return identifier
class Replace(metaclass=PoolMeta):
__name__ = 'party.replace'
@classmethod
def fields_to_replace(cls):
return super().fields_to_replace() + [
('account.payment.sepa.mandate', 'party'),
]