73 lines
3.4 KiB
Python
73 lines
3.4 KiB
Python
# © 2016-2017 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
|
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
|
|
|
from odoo import models, api, _
|
|
from odoo.exceptions import UserError
|
|
from lxml import etree
|
|
import logging
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class BaseUbl(models.AbstractModel):
|
|
_inherit = 'base.ubl'
|
|
|
|
@api.model
|
|
def _ubl_add_payment_means(
|
|
self, partner_bank, payment_mode, date_due, parent_node, ns,
|
|
payment_identifier=None, version='2.1'):
|
|
pay_means = etree.SubElement(parent_node, ns['cac'] + 'PaymentMeans')
|
|
pay_means_code = etree.SubElement(
|
|
pay_means, ns['cbc'] + 'PaymentMeansCode', listID="UN/ECE 4461")
|
|
# Why not schemeAgencyID='6' + schemeID
|
|
if payment_mode: # type is a required field on payment_mode
|
|
if not payment_mode.payment_method_id.unece_id:
|
|
raise UserError(_(
|
|
"Missing 'UNECE Payment Mean' on payment type '%s' "
|
|
"used by the payment mode '%s'.") % (
|
|
payment_mode.payment_method_id.name, payment_mode.name))
|
|
pay_means_code.text = payment_mode.payment_method_id.unece_code
|
|
else:
|
|
pay_means_code.text = '31'
|
|
logger.warning(
|
|
'Missing payment mode on invoice ID %d. '
|
|
'Using 31 (wire transfer) as UNECE code as fallback '
|
|
'for payment mean', self.id)
|
|
if date_due:
|
|
pay_due_date = etree.SubElement(
|
|
pay_means, ns['cbc'] + 'PaymentDueDate')
|
|
pay_due_date.text = date_due
|
|
if pay_means_code.text in ['30', '31', '42']:
|
|
if (
|
|
not partner_bank and
|
|
payment_mode and
|
|
payment_mode.bank_account_link == 'fixed' and
|
|
payment_mode.fixed_journal_id):
|
|
partner_bank = payment_mode.fixed_journal_id.bank_account_id
|
|
if partner_bank and partner_bank.acc_type == 'iban':
|
|
# In the Chorus specs, they except 'IBAN' in PaymentChannelCode
|
|
# I don't know if this usage is common or not
|
|
payment_channel_code = etree.SubElement(
|
|
pay_means, ns['cbc'] + 'PaymentChannelCode')
|
|
payment_channel_code.text = 'IBAN'
|
|
if payment_identifier:
|
|
payment_id = etree.SubElement(
|
|
pay_means, ns['cbc'] + 'PaymentID')
|
|
payment_id.text = payment_identifier
|
|
payee_fin_account = etree.SubElement(
|
|
pay_means, ns['cac'] + 'PayeeFinancialAccount')
|
|
payee_fin_account_id = etree.SubElement(
|
|
payee_fin_account, ns['cbc'] + 'ID', schemeName='IBAN')
|
|
payee_fin_account_id.text =\
|
|
partner_bank.sanitized_acc_number
|
|
if partner_bank.bank_bic:
|
|
financial_inst_branch = etree.SubElement(
|
|
payee_fin_account,
|
|
ns['cac'] + 'FinancialInstitutionBranch')
|
|
financial_inst = etree.SubElement(
|
|
financial_inst_branch,
|
|
ns['cac'] + 'FinancialInstitution')
|
|
financial_inst_id = etree.SubElement(
|
|
financial_inst, ns['cbc'] + 'ID', schemeName='BIC')
|
|
financial_inst_id.text = partner_bank.bank_bic
|