Merge PR #698 into 13.0

Signed-off-by pedrobaeza
This commit is contained in:
OCA-git-bot
2020-04-22 09:04:30 +00:00
40 changed files with 12468 additions and 0 deletions

View File

@@ -0,0 +1,119 @@
================================
Account Banking PAIN Base Module
================================
.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fbank--payment-lightgray.png?logo=github
:target: https://github.com/OCA/bank-payment/tree/12.0/account_banking_pain_base
:alt: OCA/bank-payment
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/bank-payment-12-0/bank-payment-12-0-account_banking_pain_base
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
:target: https://runbot.odoo-community.org/runbot/173/12.0
:alt: Try me on Runbot
|badge1| |badge2| |badge3| |badge4| |badge5|
This module contains fields and functions that are used by the module for SEPA
Credit Transfer (account_banking_sepa_credit_transfer) and SEPA Direct Debit
(account_banking_sepa_direct_debit). This module doesn't provide any
functionality by itself.
This module was started during the Akretion-Noviat code sprint of November
21st 2013 in Epiais les Louvres (France).
**Table of contents**
.. contents::
:local:
Installation
============
This module depends on :
- account_payment_order
This module is part of the OCA/bank-payment suite.
Configuration
=============
#. Go to Invoicing/Accounting > Configuration > Settings.
#. On the fields "Initiating Party Issuer" and "Initiating Party Identifier",
in the section *SEPA/PAIN*, you can fill the corresponding identifiers.
If your country requires several identifiers (like Spain), you must:
#. Go to *Invoicing/Accounting > Configuration > Settings*.
#. On the section *SEPA/PAIN*, check the mark "Multiple identifiers".
#. Now go to *Invoicing/Accounting > Configuration > Management > Payment Modes*.
#. Create a payment mode for your specific bank.
#. Fill the specific identifiers on the fields "Initiating Party Identifier"
and "Initiating Party Issuer".
Usage
=====
See 'readme' files of the OCA/bank-payment suite.
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/bank-payment/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed
`feedback <https://github.com/OCA/bank-payment/issues/new?body=module:%20account_banking_pain_base%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues.
Credits
=======
Authors
~~~~~~~
* Akretion
* Noviat
* Tecnativa
Contributors
~~~~~~~~~~~~
* Alexis de Lattre <alexis.delattre@akretion.com>
* Pedro M. Baeza
* Stéphane Bidoul <stephane.bidoul@acsone.eu>
* Ignacio Ibeas - Acysos S.L.
* Alexandre Fayolle
* Raphaël Valyi
* Sandy Carter
* Stefan Rijnhart (Therp)
* Antonio Espinosa <antonioea@antiun.com>
Maintainers
~~~~~~~~~~~
This module is maintained by the OCA.
.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org
OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
This module is part of the `OCA/bank-payment <https://github.com/OCA/bank-payment/tree/12.0/account_banking_pain_base>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View File

@@ -0,0 +1,6 @@
# © 2013 Akretion - Alexis de Lattre <alexis.delattre@akretion.com>
# © 2014 Serv. Tecnol. Avanzados - Pedro M. Baeza
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from . import models
from .post_install import set_default_initiating_party

View File

@@ -0,0 +1,27 @@
# Copyright 2013-2016 Akretion - Alexis de Lattre
# Copyright 2014-2017 Tecnativa - Pedro M. Baeza
# Copyright 2016 Tecnativa - Antonio Espinosa
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
{
"name": "Account Banking PAIN Base Module",
"summary": "Base module for PAIN file generation",
"version": "13.0.1.0.0",
"license": "AGPL-3",
"author": "Akretion, " "Noviat, " "Tecnativa, " "Odoo Community Association (OCA)",
"website": "https://github.com/OCA/bank-payment",
"category": "Hidden",
"depends": ["account_payment_order"],
"external_dependencies": {"python": ["unidecode", "lxml"]},
"data": [
"security/security.xml",
"views/account_payment_line.xml",
"views/account_payment_order.xml",
"views/bank_payment_line_view.xml",
"views/account_payment_mode.xml",
"views/res_config_settings.xml",
"views/account_payment_method.xml",
],
"post_init_hook": "set_default_initiating_party",
"installable": True,
}

View File

@@ -0,0 +1,982 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_banking_pain_base
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: account_banking_pain_base
#: sql_constraint:account.payment.method:0
msgid "A payment method of the same type already exists with this code and PAIN version"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Account Management"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Advance Payment"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Agricultural Transfer"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Air"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Alimony Payment"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Anesthesia Services"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Annuity"
msgstr ""
#. module: account_banking_pain_base
#: model:ir.model,name:account_banking_pain_base.model_res_bank
msgid "Bank"
msgstr ""
#. module: account_banking_pain_base
#: model:ir.model,name:account_banking_pain_base.model_bank_payment_line
msgid "Bank Payment Lines"
msgstr ""
#. module: account_banking_pain_base
#: model:ir.model.fields,field_description:account_banking_pain_base.field_account_payment_order__batch_booking
msgid "Batch Booking"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,category_purpose:0
msgid "Bonus Payment"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Bonus Payment."
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.order,charge_bearer:0
msgid "Borne by Creditor"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.order,charge_bearer:0
msgid "Borne by Debtor"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Bus"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Business Expenses"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Cable TV Bill"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Cancellation Fee"
msgstr ""
#. module: account_banking_pain_base
#: code:addons/account_banking_pain_base/models/account_payment_order.py:101
#, python-format
msgid "Cannot compute the field '{field_name}'."
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Car Loan Principal Repayment"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,category_purpose:0
msgid "Card Bulk Clearing"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,category_purpose:0
#: selection:account.payment.line,purpose:0
msgid "Cash Management Transfer"
msgstr ""
#. module: account_banking_pain_base
#: model:ir.model.fields,field_description:account_banking_pain_base.field_account_payment_line__category_purpose
#: model:ir.model.fields,field_description:account_banking_pain_base.field_bank_payment_line__category_purpose
msgid "Category Purpose"
msgstr ""
#. module: account_banking_pain_base
#: model:ir.model.fields,field_description:account_banking_pain_base.field_account_payment_order__charge_bearer
msgid "Charge Bearer"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Charity Payment"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Child Benefit"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Collection Payment"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Commercial Payment"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Commission"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Commodity Transfer"
msgstr ""
#. module: account_banking_pain_base
#: model:ir.model.fields,field_description:account_banking_pain_base.field_account_payment_line__communication
msgid "Communication"
msgstr ""
#. module: account_banking_pain_base
#: model:ir.model.fields,field_description:account_banking_pain_base.field_account_payment_line__communication_type
msgid "Communication Type"
msgstr ""
#. module: account_banking_pain_base
#: model:ir.model,name:account_banking_pain_base.model_res_company
msgid "Companies"
msgstr ""
#. module: account_banking_pain_base
#: model:ir.model,name:account_banking_pain_base.model_res_config_settings
msgid "Config Settings"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Consumer Third Party Consolidated Payment"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Convalescent Care Facility"
msgstr ""
#. module: account_banking_pain_base
#: model:ir.model.fields,field_description:account_banking_pain_base.field_account_payment_method__convert_to_ascii
msgid "Convert to ASCII"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Copyright"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Costs"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,category_purpose:0
msgid "Credit Card Payment"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Credit Card Payment "
msgstr ""
#. module: account_banking_pain_base
#: code:addons/account_banking_pain_base/models/account_payment_order.py:451
#, python-format
msgid "Creditor name"
msgstr ""
#. module: account_banking_pain_base
#: code:addons/account_banking_pain_base/models/account_payment_order.py:107
#, python-format
msgid "Data for evaluation:\n"
" context: {eval_ctx}\n"
" field path: {field_value}"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Debit Card Payment"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,category_purpose:0
msgid "Debit Card Payment"
msgstr ""
#. module: account_banking_pain_base
#: code:addons/account_banking_pain_base/models/account_payment_order.py:453
#, python-format
msgid "Debtor name"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,category_purpose:0
msgid "Deliver Against Payment"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Dental Services"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Derivatives"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,category_purpose:0
#: selection:account.payment.line,purpose:0
msgid "Dividend"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Durable Medicale Equipment"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Electricity Bill"
msgstr ""
#. module: account_banking_pain_base
#: model:ir.model.fields,help:account_banking_pain_base.field_res_config_settings__group_pain_multiple_identifier
msgid "Enable this option if your country requires several SEPA/PAIN identifiers like in Spain."
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Energies"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Estate Tax"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,category_purpose:0
msgid "Fee Collection"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Ferry"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.order,charge_bearer:0
msgid "Following Service Level"
msgstr ""
#. module: account_banking_pain_base
#: model:ir.model.fields,help:account_banking_pain_base.field_account_payment_order__charge_bearer
msgid "Following service level : transaction charges are to be applied following the rules agreed in the service level and/or scheme (SEPA Core messages must use this). Shared : transaction charges on the debtor side are to be borne by the debtor, transaction charges on the creditor side are to be borne by the creditor. Borne by creditor : all transaction charges are to be borne by the creditor. Borne by debtor : all transaction charges are to be borne by the debtor."
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Foreign Exchange"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,communication_type:0
msgid "Free"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Gas Bill"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Government Insurance"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,category_purpose:0
#: selection:account.payment.line,purpose:0
msgid "Government Payment"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Health Insurance"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,category_purpose:0
#: selection:account.payment.line,purpose:0
msgid "Hedging"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,priority:0
msgid "High"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Home Health Care"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Hospital Care"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Housing Loan Repayment"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Housing Tax"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,communication_type:0
msgid "ISO"
msgstr ""
#. module: account_banking_pain_base
#: model:ir.model.fields,help:account_banking_pain_base.field_account_payment_method__convert_to_ascii
msgid "If active, Odoo will convert each accented character to the corresponding unaccented character, so that only ASCII characters are used in the generated PAIN file."
msgstr ""
#. module: account_banking_pain_base
#: model:ir.model.fields,help:account_banking_pain_base.field_account_payment_line__category_purpose
#: model:ir.model.fields,help:account_banking_pain_base.field_account_payment_line__purpose
#: model:ir.model.fields,help:account_banking_pain_base.field_bank_payment_line__category_purpose
#: model:ir.model.fields,help:account_banking_pain_base.field_bank_payment_line__purpose
msgid "If neither your bank nor your local regulations oblige you to set the category purpose, leave the field empty."
msgstr ""
#. module: account_banking_pain_base
#: model:ir.model.fields,help:account_banking_pain_base.field_account_payment_order__batch_booking
msgid "If true, the bank statement will display only one debit line for all the wire transfers of the SEPA XML file ; if false, the bank statement will display one debit line per wire transfer of the SEPA XML file."
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Income Tax"
msgstr ""
#. module: account_banking_pain_base
#: model:ir.model.fields,field_description:account_banking_pain_base.field_account_payment_mode__initiating_party_identifier
#: model:ir.model.fields,field_description:account_banking_pain_base.field_res_company__initiating_party_identifier
#: model:ir.model.fields,field_description:account_banking_pain_base.field_res_config_settings__initiating_party_identifier
msgid "Initiating Party Identifier"
msgstr ""
#. module: account_banking_pain_base
#: model:ir.model.fields,field_description:account_banking_pain_base.field_account_payment_mode__initiating_party_issuer
#: model:ir.model.fields,field_description:account_banking_pain_base.field_res_company__initiating_party_issuer
#: model:ir.model.fields,field_description:account_banking_pain_base.field_res_config_settings__initiating_party_issuer
msgid "Initiating Party Issuer"
msgstr ""
#. module: account_banking_pain_base
#: model:ir.model.fields,field_description:account_banking_pain_base.field_account_payment_mode__initiating_party_scheme
#: model:ir.model.fields,field_description:account_banking_pain_base.field_res_company__initiating_party_scheme
#: model:ir.model.fields,field_description:account_banking_pain_base.field_res_config_settings__initiating_party_scheme
msgid "Initiating Party Scheme"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Installment"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Instalment Hire Purchase Agreement"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,local_instrument:0
msgid "Instant Transfer"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Insurance Premium"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,category_purpose:0
#: selection:account.payment.line,purpose:0
msgid "Interest"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Intermediate Care Facility"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Intra Company Payment"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,category_purpose:0
msgid "Intra-Company Payment"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,category_purpose:0
msgid "Irrevocable Credit Card Payment"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,category_purpose:0
msgid "Irrevocable Debit Card Payment"
msgstr ""
#. module: account_banking_pain_base
#: model:ir.model.fields,help:account_banking_pain_base.field_account_payment_line__communication
msgid "Label of the payment that will be seen by the destinee"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Labor Insurance"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "License Fee"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Life Insurance"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Liquidity Management"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,category_purpose:0
#: selection:account.payment.line,purpose:0
msgid "Loan"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Loan Repayment"
msgstr ""
#. module: account_banking_pain_base
#: model:ir.model.fields,field_description:account_banking_pain_base.field_account_payment_line__local_instrument
#: model:ir.model.fields,field_description:account_banking_pain_base.field_bank_payment_line__local_instrument
msgid "Local Instrument"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Long Term Care Facility"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Medical Services"
msgstr ""
#. module: account_banking_pain_base
#: code:addons/account_banking_pain_base/models/account_payment_order.py:337
#, python-format
msgid "Missing 'Initiating Party Issuer' and/or 'Initiating Party Identifier' for the company '%s'. Both fields must have a value."
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Multiple Service Types"
msgstr ""
#. module: account_banking_pain_base
#: model:ir.model.fields,field_description:account_banking_pain_base.field_res_config_settings__group_pain_multiple_identifier
msgid "Multiple identifiers"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Netting"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Network Charge"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Network Communication"
msgstr ""
#. module: account_banking_pain_base
#: code:addons/account_banking_pain_base/models/account_payment_method.py:22
#, python-format
msgid "No XSD file path found for payment method '%s'"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,priority:0
msgid "Normal"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Not Otherwise Specified"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Opening Fee"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Other"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,category_purpose:0
msgid "Other Payment"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Other Telecom Related Bill"
msgstr ""
#. module: account_banking_pain_base
#: model:ir.model.fields,field_description:account_banking_pain_base.field_account_payment_method__pain_version
msgid "PAIN Version"
msgstr ""
#. module: account_banking_pain_base
#: code:addons/account_banking_pain_base/models/account_payment_order.py:449
#, python-format
msgid "Partner name"
msgstr ""
#. module: account_banking_pain_base
#: code:addons/account_banking_pain_base/models/account_payment_order.py:146
#, python-format
msgid "Partner's bank account is '%s'."
msgstr ""
#. module: account_banking_pain_base
#: code:addons/account_banking_pain_base/models/account_payment_order.py:142
#, python-format
msgid "Payment Line has reference '%s'."
msgstr ""
#. module: account_banking_pain_base
#: model:ir.model,name:account_banking_pain_base.model_account_payment_line
msgid "Payment Lines"
msgstr ""
#. module: account_banking_pain_base
#: model:ir.model,name:account_banking_pain_base.model_account_payment_method
msgid "Payment Methods"
msgstr ""
#. module: account_banking_pain_base
#: model:ir.model,name:account_banking_pain_base.model_account_payment_mode
msgid "Payment Modes"
msgstr ""
#. module: account_banking_pain_base
#: model:ir.model,name:account_banking_pain_base.model_account_payment_order
msgid "Payment Order"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Payment Terms"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,category_purpose:0
#: selection:account.payment.line,purpose:0
msgid "Pension Payment"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Preauthorized debit"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Precious Metal"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Price Payment"
msgstr ""
#. module: account_banking_pain_base
#: model:ir.model.fields,field_description:account_banking_pain_base.field_account_payment_line__priority
#: model:ir.model.fields,field_description:account_banking_pain_base.field_bank_payment_line__priority
msgid "Priority"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Property Insurance"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Purchase Sale Of Goods"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Purchase Sale Of Services"
msgstr ""
#. module: account_banking_pain_base
#: model:ir.model.fields,field_description:account_banking_pain_base.field_account_payment_line__purpose
#: model:ir.model.fields,field_description:account_banking_pain_base.field_bank_payment_line__purpose
msgid "Purpose"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Railway"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Receipt Payment"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,category_purpose:0
msgid "Receive Against Payment"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Recurring Installment Payment"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Rent"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Royalties"
msgstr ""
#. module: account_banking_pain_base
#: model:ir.model.fields,field_description:account_banking_pain_base.field_account_payment_order__sepa
msgid "SEPA Payment"
msgstr ""
#. module: account_banking_pain_base
#: model_terms:ir.ui.view,arch_db:account_banking_pain_base.view_account_config_settings
msgid "SEPA/PAIN"
msgstr ""
#. module: account_banking_pain_base
#: model:res.groups,name:account_banking_pain_base.group_pain_multiple_identifier
msgid "SEPA/PAIN Identifiers on Payment Modes"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,category_purpose:0
#: selection:account.payment.line,purpose:0
msgid "Salary Payment"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Savings"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,category_purpose:0
#: selection:account.payment.line,purpose:0
msgid "Securities"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.order,charge_bearer:0
msgid "Shared"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,category_purpose:0
#: selection:account.payment.line,purpose:0
msgid "Social Security Benefit"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Study"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Subscription"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,category_purpose:0
#: selection:account.payment.line,purpose:0
msgid "Supplier Payment"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,category_purpose:0
#: selection:account.payment.line,purpose:0
msgid "Tax Payment"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Telephone Bill"
msgstr ""
#. module: account_banking_pain_base
#: code:addons/account_banking_pain_base/models/account_payment_order.py:125
#, python-format
msgid "The '%s' is empty or 0. It should have a non-null value."
msgstr ""
#. module: account_banking_pain_base
#: code:addons/account_banking_pain_base/models/res_bank.py:29
#, python-format
msgid "The following Bank Identifier Codes (BIC) do not respect the SEPA pattern:\n"
"{bic_list}\n"
"\n"
"SEPA pattern: {sepa_pattern}"
msgstr ""
#. module: account_banking_pain_base
#: code:addons/account_banking_pain_base/models/account_payment_order.py:165
#, python-format
msgid "The generated XML file is not valid against the official XML Schema Definition. The generated XML file and the full error have been written in the server logs. Here is the error, which may give you an idea on the cause of the problem : %s"
msgstr ""
#. module: account_banking_pain_base
#: code:addons/account_banking_pain_base/models/account_payment_order.py:120
#, python-format
msgid "The type of the field '%s' is %s. It should be a string or unicode."
msgstr ""
#. module: account_banking_pain_base
#: model:ir.model.fields,help:account_banking_pain_base.field_account_payment_line__priority
#: model:ir.model.fields,help:account_banking_pain_base.field_bank_payment_line__priority
msgid "This field will be used as 'Instruction Priority' in the generated PAIN file."
msgstr ""
#. module: account_banking_pain_base
#: model:ir.model.fields,help:account_banking_pain_base.field_res_company__initiating_party_identifier
#: model:ir.model.fields,help:account_banking_pain_base.field_res_config_settings__initiating_party_identifier
msgid "This will be used as the 'Initiating Party Identifier' in the PAIN files generated by Odoo."
msgstr ""
#. module: account_banking_pain_base
#: model:ir.model.fields,help:account_banking_pain_base.field_account_payment_mode__initiating_party_identifier
msgid "This will be used as the 'Initiating Party Identifier' in the PAIN files generated by Odoo. If not defined, Initiating Party Identifier from company will be used.\n"
"Common format (13): \n"
"- Country code (2, optional)\n"
"- Company idenfier (N, VAT)\n"
"- Service suffix (N, issued by bank)"
msgstr ""
#. module: account_banking_pain_base
#: model:ir.model.fields,help:account_banking_pain_base.field_res_company__initiating_party_issuer
#: model:ir.model.fields,help:account_banking_pain_base.field_res_config_settings__initiating_party_issuer
msgid "This will be used as the 'Initiating Party Issuer' in the PAIN files generated by Odoo."
msgstr ""
#. module: account_banking_pain_base
#: model:ir.model.fields,help:account_banking_pain_base.field_account_payment_mode__initiating_party_issuer
msgid "This will be used as the 'Initiating Party Issuer' in the PAIN files generated by Odoo. If not defined, Initiating Party Issuer from company will be used.\n"
"Common format (13): \n"
"- Country code (2, optional)\n"
"- Company idenfier (N, VAT)\n"
"- Service suffix (N, issued by bank)"
msgstr ""
#. module: account_banking_pain_base
#: model:ir.model.fields,help:account_banking_pain_base.field_res_company__initiating_party_scheme
#: model:ir.model.fields,help:account_banking_pain_base.field_res_config_settings__initiating_party_scheme
msgid "This will be used as the 'Initiating Party Scheme Name' in the PAIN files generated by Odoo."
msgstr ""
#. module: account_banking_pain_base
#: model:ir.model.fields,help:account_banking_pain_base.field_account_payment_mode__initiating_party_scheme
msgid "This will be used as the 'Initiating Party Scheme Name' in the PAIN files generated by Odoo. This value is determined by the financial institution that will process the file. If not defined, no scheme will be used.\n"
""
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,category_purpose:0
msgid "Trade"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Trade Services"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,category_purpose:0
msgid "Trade Settlement Payment"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,category_purpose:0
#: selection:account.payment.line,purpose:0
msgid "Treasury Payment"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Trust Fund"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Unemployment Disability Benefit"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,category_purpose:0
msgid "VAT Payment"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Value Added Tax Payment"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Vision Care"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,purpose:0
msgid "Water Bill"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,category_purpose:0
msgid "WithHolding"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.line,category_purpose:0
msgid "ePayment"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.method,pain_version:0
msgid "pain.001.001.02"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.method,pain_version:0
msgid "pain.001.001.03 (recommended for credit transfer)"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.method,pain_version:0
msgid "pain.001.001.04"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.method,pain_version:0
msgid "pain.001.001.05"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.method,pain_version:0
msgid "pain.001.003.03 (credit transfer in Germany)"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.method,pain_version:0
msgid "pain.008.001.02 (recommended for direct debit)"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.method,pain_version:0
msgid "pain.008.001.03"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.method,pain_version:0
msgid "pain.008.001.04"
msgstr ""
#. module: account_banking_pain_base
#: selection:account.payment.method,pain_version:0
msgid "pain.008.003.02 (direct debit in Germany)"
msgstr ""

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,8 @@
from . import account_payment_line
from . import account_payment_order
from . import bank_payment_line
from . import account_payment_mode
from . import res_company
from . import res_config_settings
from . import account_payment_method
from . import res_bank

View File

@@ -0,0 +1,172 @@
# © 2013-2016 Akretion - Alexis de Lattre <alexis.delattre@akretion.com>
# © 2014 Serv. Tecnol. Avanzados - Pedro M. Baeza
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from odoo import fields, models
class AccountPaymentLine(models.Model):
_inherit = "account.payment.line"
priority = fields.Selection(
[("NORM", "Normal"), ("HIGH", "High")],
string="Priority",
default="NORM",
help="This field will be used as 'Instruction Priority' in "
"the generated PAIN file.",
)
# local_instrument is used for instant credit transfers which
# will begin on November 2017, cf account_banking_sepa_credit_transfer
# It is also used in some countries such as switzerland,
# cf l10n_ch_pain_base that adds some entries in the selection field
local_instrument = fields.Selection([], string="Local Instrument")
category_purpose = fields.Selection(
[
# Full category purpose list found on:
# https://www.iso20022.org/external_code_list.page
# Document "External Code Sets spreadsheet" version Feb 8th 2017
("BONU", "Bonus Payment"),
("CASH", "Cash Management Transfer"),
("CBLK", "Card Bulk Clearing"),
("CCRD", "Credit Card Payment"),
("CORT", "Trade Settlement Payment"),
("DCRD", "Debit Card Payment"),
("DIVI", "Dividend"),
("DVPM", "Deliver Against Payment"),
("EPAY", "ePayment"),
("FCOL", "Fee Collection"),
("GOVT", "Government Payment"),
("HEDG", "Hedging"),
("ICCP", "Irrevocable Credit Card Payment"),
("IDCP", "Irrevocable Debit Card Payment"),
("INTC", "Intra-Company Payment"),
("INTE", "Interest"),
("LOAN", "Loan"),
("OTHR", "Other Payment"),
("PENS", "Pension Payment"),
("RVPM", "Receive Against Payment"),
("SALA", "Salary Payment"),
("SECU", "Securities"),
("SSBE", "Social Security Benefit"),
("SUPP", "Supplier Payment"),
("TAXS", "Tax Payment"),
("TRAD", "Trade"),
("TREA", "Treasury Payment"),
("VATX", "VAT Payment"),
("WHLD", "WithHolding"),
],
string="Category Purpose",
help="If neither your bank nor your local regulations oblige you to "
"set the category purpose, leave the field empty.",
)
purpose = fields.Selection(
# Full category purpose list found on:
# https://www.iso20022.org/external_code_list.page
# Document "External Code Sets spreadsheet" version 31 August, 2018
selection=[
("ACCT", "Account Management"),
("CASH", "Cash Management Transfer"),
("COLL", "Collection Payment"),
("INTC", "Intra Company Payment"),
("LIMA", "Liquidity Management"),
("NETT", "Netting"),
("AGRT", "Agricultural Transfer"),
("BEXP", "Business Expenses"),
("COMC", "Commercial Payment"),
("CPYR", "Copyright"),
("GDDS", "Purchase Sale Of Goods"),
("LICF", "License Fee"),
("ROYA", "Royalties"),
("SCVE", "Purchase Sale Of Services"),
("SUBS", "Subscription"),
("SUPP", "Supplier Payment"),
("TRAD", "Trade Services"),
("CHAR", "Charity Payment"),
("COMT", "Consumer Third Party Consolidated Payment"),
("CLPR", "Car Loan Principal Repayment"),
("GOVI", "Government Insurance"),
("HLRP", "Housing Loan Repayment"),
("INSU", "Insurance Premium"),
("INTE", "Interest"),
("LBRI", "Labor Insurance"),
("LIFI", "Life Insurance"),
("LOAN", "Loan"),
("LOAR", "Loan Repayment"),
("PPTI", "Property Insurance"),
("RINP", "Recurring Installment Payment"),
("TRFD", "Trust Fund"),
("ADVA", "Advance Payment"),
("CCRD", "Credit Card Payment "),
("CFEE", "Cancellation Fee"),
("COST", "Costs"),
("DCRD", "Debit Card Payment"),
("GOVT", "Government Payment"),
("IHRP", "Instalment Hire Purchase Agreement"),
("INSM", "Installment"),
("MSVC", "Multiple Service Types"),
("NOWS", "Not Otherwise Specified"),
("OFEE", "Opening Fee"),
("OTHR", "Other"),
("PADD", "Preauthorized debit"),
("PTSP", "Payment Terms"),
("RCPT", "Receipt Payment"),
("RENT", "Rent"),
("STDY", "Study"),
("ANNI", "Annuity"),
("CMDT", "Commodity Transfer"),
("DERI", "Derivatives"),
("DIVD", "Dividend"),
("FREX", "Foreign Exchange"),
("HEDG", "Hedging"),
("PRME", "Precious Metal"),
("SAVG", "Savings"),
("SECU", "Securities"),
("TREA", "Treasury Payment"),
("ANTS", "Anesthesia Services"),
("CVCF", "Convalescent Care Facility"),
("DMEQ", "Durable Medicale Equipment"),
("DNTS", "Dental Services"),
("HLTC", "Home Health Care"),
("HLTI", "Health Insurance"),
("HSPC", "Hospital Care"),
("ICRF", "Intermediate Care Facility"),
("LTCF", "Long Term Care Facility"),
("MDCS", "Medical Services"),
("VIEW", "Vision Care"),
("ALMY", "Alimony Payment"),
("BECH", "Child Benefit"),
("BENE", "Unemployment Disability Benefit"),
("BONU", "Bonus Payment."),
("COMM", "Commission"),
("PENS", "Pension Payment"),
("PRCP", "Price Payment"),
("SALA", "Salary Payment"),
("SSBE", "Social Security Benefit"),
("ESTX", "Estate Tax"),
("HSTX", "Housing Tax"),
("INTX", "Income Tax"),
("TAXS", "Tax Payment"),
("VATX", "Value Added Tax Payment"),
("AIRB", "Air"),
("BUSB", "Bus"),
("FERB", "Ferry"),
("RLWY", "Railway"),
("CBTV", "Cable TV Bill"),
("ELEC", "Electricity Bill"),
("ENRG", "Energies"),
("GASB", "Gas Bill"),
("NWCH", "Network Charge"),
("NWCM", "Network Communication"),
("OTLC", "Other Telecom Related Bill"),
("PHON", "Telephone Bill"),
("WTER", "Water Bill"),
],
help="If neither your bank nor your local regulations oblige you to "
"set the category purpose, leave the field empty.",
)
# PAIN allows 140 characters
communication = fields.Char(size=140)
# The field struct_communication_type has been dropped in v9
# We now use communication_type ; you should add an option
# in communication_type with selection_add=[]
communication_type = fields.Selection(selection_add=[("ISO", "ISO")])

View File

@@ -0,0 +1,33 @@
# © 2016 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from odoo import _, fields, models
from odoo.exceptions import UserError
class AccountPaymentMethod(models.Model):
_inherit = "account.payment.method"
pain_version = fields.Selection([], string="PAIN Version")
convert_to_ascii = fields.Boolean(
string="Convert to ASCII",
default=True,
help="If active, Odoo will convert each accented character to "
"the corresponding unaccented character, so that only ASCII "
"characters are used in the generated PAIN file.",
)
def get_xsd_file_path(self):
"""This method is designed to be inherited in the SEPA modules"""
self.ensure_one()
raise UserError(_("No XSD file path found for payment method '%s'") % self.name)
_sql_constraints = [
(
# Extending this constraint from account_payment_mode
"code_payment_type_unique",
"unique(code, payment_type, pain_version)",
"A payment method of the same type already exists with this code"
" and PAIN version",
)
]

View File

@@ -0,0 +1,41 @@
# © 2013-2016 Akretion - Alexis de Lattre <alexis.delattre@akretion.com>
# © 2014 Serv. Tecnol. Avanzados - Pedro M. Baeza
# © 2016 Antiun Ingenieria S.L. - Antonio Espinosa
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from odoo import fields, models
class AccountPaymentMode(models.Model):
_inherit = "account.payment.mode"
initiating_party_issuer = fields.Char(
string="Initiating Party Issuer",
size=35,
help="This will be used as the 'Initiating Party Issuer' in the "
"PAIN files generated by Odoo. If not defined, Initiating Party "
"Issuer from company will be used.\n"
"Common format (13): \n"
"- Country code (2, optional)\n"
"- Company idenfier (N, VAT)\n"
"- Service suffix (N, issued by bank)",
)
initiating_party_identifier = fields.Char(
string="Initiating Party Identifier",
size=35,
help="This will be used as the 'Initiating Party Identifier' in "
"the PAIN files generated by Odoo. If not defined, Initiating Party "
"Identifier from company will be used.\n"
"Common format (13): \n"
"- Country code (2, optional)\n"
"- Company idenfier (N, VAT)\n"
"- Service suffix (N, issued by bank)",
)
initiating_party_scheme = fields.Char(
string="Initiating Party Scheme",
size=35,
help="This will be used as the 'Initiating Party Scheme Name' in "
"the PAIN files generated by Odoo. This value is determined by the "
"financial institution that will process the file. If not defined, "
"no scheme will be used.\n",
)

View File

@@ -0,0 +1,625 @@
# © 2013-2016 Akretion - Alexis de Lattre <alexis.delattre@akretion.com>
# © 2014 Serv. Tecnol. Avanzados - Pedro M. Baeza
# © 2016 Antiun Ingenieria S.L. - Antonio Espinosa
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
import logging
from datetime import datetime
from lxml import etree
from odoo import _, api, fields, models, tools
from odoo.exceptions import UserError
from odoo.tools.safe_eval import safe_eval
try:
from unidecode import unidecode
except ImportError:
unidecode = None
logger = logging.getLogger(__name__)
class AccountPaymentOrder(models.Model):
_inherit = "account.payment.order"
sepa = fields.Boolean(compute="_compute_sepa", readonly=True, string="SEPA Payment")
charge_bearer = fields.Selection(
[
("SLEV", "Following Service Level"),
("SHAR", "Shared"),
("CRED", "Borne by Creditor"),
("DEBT", "Borne by Debtor"),
],
string="Charge Bearer",
default="SLEV",
readonly=True,
states={"draft": [("readonly", False)], "open": [("readonly", False)]},
track_visibility="onchange",
help="Following service level : transaction charges are to be "
"applied following the rules agreed in the service level "
"and/or scheme (SEPA Core messages must use this). Shared : "
"transaction charges on the debtor side are to be borne by "
"the debtor, transaction charges on the creditor side are to "
"be borne by the creditor. Borne by creditor : all "
"transaction charges are to be borne by the creditor. Borne "
"by debtor : all transaction charges are to be borne by the "
"debtor.",
)
batch_booking = fields.Boolean(
string="Batch Booking",
readonly=True,
states={"draft": [("readonly", False)], "open": [("readonly", False)]},
track_visibility="onchange",
help="If true, the bank statement will display only one debit "
"line for all the wire transfers of the SEPA XML file ; if "
"false, the bank statement will display one debit line per wire "
"transfer of the SEPA XML file.",
)
@api.depends(
"company_partner_bank_id.acc_type",
"payment_line_ids.currency_id",
"payment_line_ids.partner_bank_id.acc_type",
)
def _compute_sepa(self):
eur = self.env.ref("base.EUR")
for order in self:
sepa = True
if order.company_partner_bank_id.acc_type != "iban":
sepa = False
for pline in order.payment_line_ids:
if pline.currency_id != eur:
sepa = False
break
if pline.partner_bank_id.acc_type != "iban":
sepa = False
break
sepa = order.compute_sepa_final_hook(sepa)
self.sepa = sepa
def compute_sepa_final_hook(self, sepa):
self.ensure_one()
return sepa
@api.model
def _prepare_field(
self, field_name, field_value, eval_ctx, max_size=0, gen_args=None
):
"""This function is designed to be inherited !"""
if gen_args is None:
gen_args = {}
assert isinstance(eval_ctx, dict), "eval_ctx must contain a dict"
try:
value = safe_eval(field_value, eval_ctx)
# SEPA uses XML ; XML = UTF-8 ; UTF-8 = support for all characters
# But we are dealing with banks...
# and many banks don't want non-ASCCI characters !
# cf section 1.4 "Character set" of the SEPA Credit Transfer
# Scheme Customer-to-bank guidelines
if gen_args.get("convert_to_ascii"):
value = unidecode(value)
unallowed_ascii_chars = [
'"',
"#",
"$",
"%",
"&",
"*",
";",
"<",
">",
"=",
"@",
"[",
"]",
"^",
"_",
"`",
"{",
"}",
"|",
"~",
"\\",
"!",
]
for unallowed_ascii_char in unallowed_ascii_chars:
value = value.replace(unallowed_ascii_char, "-")
except Exception:
error_msg_prefix = _("Cannot compute the field '{field_name}'.").format(
field_name=field_name
)
error_msg_details_list = self.except_messages_prepare_field(
eval_ctx, field_name
)
error_msg_data = _(
"Data for evaluation:\n"
"\tcontext: {eval_ctx}\n"
"\tfield path: {field_value}"
).format(eval_ctx=eval_ctx, field_value=field_value)
raise UserError(
"\n".join(
[error_msg_prefix] + error_msg_details_list + [error_msg_data]
)
)
if not isinstance(value, str):
raise UserError(
_(
"The type of the field '%s' is %s. It should be a string "
"or unicode."
)
% (field_name, type(value))
)
if not value:
raise UserError(
_("The '%s' is empty or 0. It should have a non-null value.")
% field_name
)
if max_size and len(value) > max_size:
value = value[0:max_size]
return value
@api.model
def except_messages_prepare_field(self, eval_ctx, field_name):
"""
Inherit this method to provide more detailed error messages for
exceptions to be raised while evaluating `field_name` using `eval_ctx`.
:return: List containing the error messages.
"""
error_messages = list()
line = eval_ctx.get("line")
if line:
error_messages.append(_("Payment Line has reference '%s'.") % line.name)
partner_bank = eval_ctx.get("partner_bank")
if partner_bank:
error_messages.append(
_("Partner's bank account is '%s'.") % partner_bank.display_name
)
return error_messages
@api.model
def _validate_xml(self, xml_string, gen_args):
xsd_etree_obj = etree.parse(tools.file_open(gen_args["pain_xsd_file"]))
official_pain_schema = etree.XMLSchema(xsd_etree_obj)
try:
root_to_validate = etree.fromstring(xml_string)
official_pain_schema.assertValid(root_to_validate)
except Exception as e:
logger.warning("The XML file is invalid against the XML Schema Definition")
logger.warning(xml_string)
logger.warning(e)
raise UserError(
_(
"The generated XML file is not valid against the official "
"XML Schema Definition. The generated XML file and the "
"full error have been written in the server logs. Here "
"is the error, which may give you an idea on the cause "
"of the problem : %s"
)
% str(e)
)
return True
def finalize_sepa_file_creation(self, xml_root, gen_args):
xml_string = etree.tostring(
xml_root, pretty_print=True, encoding="UTF-8", xml_declaration=True
)
logger.debug(
"Generated SEPA XML file in format %s below" % gen_args["pain_flavor"]
)
logger.debug(xml_string)
self._validate_xml(xml_string, gen_args)
filename = "{}{}.xml".format(gen_args["file_prefix"], self.name)
return (xml_string, filename)
def generate_pain_nsmap(self):
self.ensure_one()
pain_flavor = self.payment_mode_id.payment_method_id.pain_version
nsmap = {
"xsi": "http://www.w3.org/2001/XMLSchema-instance",
None: "urn:iso:std:iso:20022:tech:xsd:%s" % pain_flavor,
}
return nsmap
def generate_pain_attrib(self):
self.ensure_one()
return {}
@api.model
def generate_group_header_block(self, parent_node, gen_args):
group_header = etree.SubElement(parent_node, "GrpHdr")
message_identification = etree.SubElement(group_header, "MsgId")
message_identification.text = self._prepare_field(
"Message Identification", "self.name", {"self": self}, 35, gen_args=gen_args
)
creation_date_time = etree.SubElement(group_header, "CreDtTm")
creation_date_time.text = datetime.strftime(
datetime.today(), "%Y-%m-%dT%H:%M:%S"
)
if gen_args.get("pain_flavor") == "pain.001.001.02":
# batch_booking is in "Group header" with pain.001.001.02
# and in "Payment info" in pain.001.001.03/04
batch_booking = etree.SubElement(group_header, "BtchBookg")
batch_booking.text = str(self.batch_booking).lower()
nb_of_transactions = etree.SubElement(group_header, "NbOfTxs")
control_sum = etree.SubElement(group_header, "CtrlSum")
# Grpg removed in pain.001.001.03
if gen_args.get("pain_flavor") == "pain.001.001.02":
grouping = etree.SubElement(group_header, "Grpg")
grouping.text = "GRPD"
self.generate_initiating_party_block(group_header, gen_args)
return group_header, nb_of_transactions, control_sum
@api.model
def generate_start_payment_info_block(
self,
parent_node,
payment_info_ident,
priority,
local_instrument,
category_purpose,
sequence_type,
requested_date,
eval_ctx,
gen_args,
):
payment_info = etree.SubElement(parent_node, "PmtInf")
payment_info_identification = etree.SubElement(payment_info, "PmtInfId")
payment_info_identification.text = self._prepare_field(
"Payment Information Identification",
payment_info_ident,
eval_ctx,
35,
gen_args=gen_args,
)
payment_method = etree.SubElement(payment_info, "PmtMtd")
payment_method.text = gen_args["payment_method"]
nb_of_transactions = False
control_sum = False
if gen_args.get("pain_flavor") != "pain.001.001.02":
batch_booking = etree.SubElement(payment_info, "BtchBookg")
batch_booking.text = str(self.batch_booking).lower()
# The "SEPA Customer-to-bank
# Implementation guidelines" for SCT and SDD says that control sum
# and nb_of_transactions should be present
# at both "group header" level and "payment info" level
nb_of_transactions = etree.SubElement(payment_info, "NbOfTxs")
control_sum = etree.SubElement(payment_info, "CtrlSum")
payment_type_info = etree.SubElement(payment_info, "PmtTpInf")
if priority and gen_args["payment_method"] != "DD":
instruction_priority = etree.SubElement(payment_type_info, "InstrPrty")
instruction_priority.text = priority
if self.sepa:
service_level = etree.SubElement(payment_type_info, "SvcLvl")
service_level_code = etree.SubElement(service_level, "Cd")
service_level_code.text = "SEPA"
if local_instrument:
local_instrument_root = etree.SubElement(payment_type_info, "LclInstrm")
if gen_args.get("local_instrument_type") == "proprietary":
local_instr_value = etree.SubElement(local_instrument_root, "Prtry")
else:
local_instr_value = etree.SubElement(local_instrument_root, "Cd")
local_instr_value.text = local_instrument
if sequence_type:
sequence_type_node = etree.SubElement(payment_type_info, "SeqTp")
sequence_type_node.text = sequence_type
if category_purpose:
category_purpose_node = etree.SubElement(payment_type_info, "CtgyPurp")
category_purpose_code = etree.SubElement(category_purpose_node, "Cd")
category_purpose_code.text = category_purpose
if gen_args["payment_method"] == "DD":
request_date_tag = "ReqdColltnDt"
else:
request_date_tag = "ReqdExctnDt"
requested_date_node = etree.SubElement(payment_info, request_date_tag)
requested_date_node.text = requested_date
return payment_info, nb_of_transactions, control_sum
@api.model
def _must_have_initiating_party(self, gen_args):
"""This method is designed to be inherited in localization modules for
countries in which the initiating party is required"""
return False
@api.model
def generate_initiating_party_block(self, parent_node, gen_args):
my_company_name = self._prepare_field(
"Company Name",
"self.company_partner_bank_id.partner_id.name",
{"self": self},
gen_args.get("name_maxsize"),
gen_args=gen_args,
)
initiating_party = etree.SubElement(parent_node, "InitgPty")
initiating_party_name = etree.SubElement(initiating_party, "Nm")
initiating_party_name.text = my_company_name
initiating_party_identifier = (
self.payment_mode_id.initiating_party_identifier
or self.payment_mode_id.company_id.initiating_party_identifier
)
initiating_party_issuer = (
self.payment_mode_id.initiating_party_issuer
or self.payment_mode_id.company_id.initiating_party_issuer
)
initiating_party_scheme = (
self.payment_mode_id.initiating_party_scheme
or self.payment_mode_id.company_id.initiating_party_scheme
)
# in pain.008.001.02.ch.01.xsd files they use
# initiating_party_identifier but not initiating_party_issuer
if initiating_party_identifier:
iniparty_id = etree.SubElement(initiating_party, "Id")
iniparty_org_id = etree.SubElement(iniparty_id, "OrgId")
iniparty_org_other = etree.SubElement(iniparty_org_id, "Othr")
iniparty_org_other_id = etree.SubElement(iniparty_org_other, "Id")
iniparty_org_other_id.text = initiating_party_identifier
if initiating_party_scheme:
iniparty_org_other_scheme = etree.SubElement(
iniparty_org_other, "SchmeNm"
)
iniparty_org_other_scheme_name = etree.SubElement(
iniparty_org_other_scheme, "Prtry"
)
iniparty_org_other_scheme_name.text = initiating_party_scheme
if initiating_party_issuer:
iniparty_org_other_issuer = etree.SubElement(iniparty_org_other, "Issr")
iniparty_org_other_issuer.text = initiating_party_issuer
elif self._must_have_initiating_party(gen_args):
raise UserError(
_(
"Missing 'Initiating Party Issuer' and/or "
"'Initiating Party Identifier' for the company '%s'. "
"Both fields must have a value."
)
% self.company_id.name
)
return True
@api.model
def generate_party_agent(
self, parent_node, party_type, order, partner_bank, gen_args, bank_line=None
):
"""Generate the piece of the XML file corresponding to BIC
This code is mutualized between TRF and DD
Starting from Feb 1st 2016, we should be able to do
cross-border SEPA transfers without BIC, cf
http://www.europeanpaymentscouncil.eu/index.cfm/
sepa-credit-transfer/iban-and-bic/
In some localization (l10n_ch_sepa for example), they need the
bank_line argument"""
assert order in ("B", "C"), "Order can be 'B' or 'C'"
if partner_bank.bank_bic:
party_agent = etree.SubElement(parent_node, "%sAgt" % party_type)
party_agent_institution = etree.SubElement(party_agent, "FinInstnId")
party_agent_bic = etree.SubElement(
party_agent_institution, gen_args.get("bic_xml_tag")
)
party_agent_bic.text = partner_bank.bank_bic
else:
if order == "B" or (order == "C" and gen_args["payment_method"] == "DD"):
party_agent = etree.SubElement(parent_node, "%sAgt" % party_type)
party_agent_institution = etree.SubElement(party_agent, "FinInstnId")
party_agent_other = etree.SubElement(party_agent_institution, "Othr")
party_agent_other_identification = etree.SubElement(
party_agent_other, "Id"
)
party_agent_other_identification.text = "NOTPROVIDED"
# for Credit Transfers, in the 'C' block, if BIC is not provided,
# we should not put the 'Creditor Agent' block at all,
# as per the guidelines of the EPC
return True
@api.model
def generate_party_id(self, parent_node, party_type, partner):
"""Generate an Id element for partner inside the parent node.
party_type can currently be Cdtr or Dbtr. Notably, the initiating
party orgid is generated with another mechanism and configured
at the company or payment mode level.
"""
return
@api.model
def generate_party_acc_number(
self, parent_node, party_type, order, partner_bank, gen_args, bank_line=None
):
party_account = etree.SubElement(parent_node, "%sAcct" % party_type)
party_account_id = etree.SubElement(party_account, "Id")
if partner_bank.acc_type == "iban":
party_account_iban = etree.SubElement(party_account_id, "IBAN")
party_account_iban.text = partner_bank.sanitized_acc_number
else:
party_account_other = etree.SubElement(party_account_id, "Othr")
party_account_other_id = etree.SubElement(party_account_other, "Id")
party_account_other_id.text = partner_bank.sanitized_acc_number
return True
@api.model
def generate_address_block(self, parent_node, partner, gen_args):
"""Generate the piece of the XML corresponding to PstlAdr"""
if partner.country_id:
postal_address = etree.SubElement(parent_node, "PstlAdr")
if gen_args.get("pain_flavor").startswith("pain.001.001.") or gen_args.get(
"pain_flavor"
).startswith("pain.008.001."):
if partner.zip:
pstcd = etree.SubElement(postal_address, "PstCd")
pstcd.text = self._prepare_field(
"Postal Code",
"partner.zip",
{"partner": partner},
16,
gen_args=gen_args,
)
if partner.city:
twnnm = etree.SubElement(postal_address, "TwnNm")
twnnm.text = self._prepare_field(
"Town Name",
"partner.city",
{"partner": partner},
35,
gen_args=gen_args,
)
country = etree.SubElement(postal_address, "Ctry")
country.text = self._prepare_field(
"Country",
"partner.country_id.code",
{"partner": partner},
2,
gen_args=gen_args,
)
if partner.street:
adrline1 = etree.SubElement(postal_address, "AdrLine")
adrline1.text = self._prepare_field(
"Adress Line1",
"partner.street",
{"partner": partner},
70,
gen_args=gen_args,
)
return True
@api.model
def generate_party_block(
self, parent_node, party_type, order, partner_bank, gen_args, bank_line=None
):
"""Generate the piece of the XML file corresponding to Name+IBAN+BIC
This code is mutualized between TRF and DD
In some localization (l10n_ch_sepa for example), they need the
bank_line argument"""
assert order in ("B", "C"), "Order can be 'B' or 'C'"
party_type_label = _("Partner name")
if party_type == "Cdtr":
party_type_label = _("Creditor name")
elif party_type == "Dbtr":
party_type_label = _("Debtor name")
name = "partner_bank.partner_id.name"
eval_ctx = {"partner_bank": partner_bank}
party_name = self._prepare_field(
party_type_label,
name,
eval_ctx,
gen_args.get("name_maxsize"),
gen_args=gen_args,
)
# At C level, the order is : BIC, Name, IBAN
# At B level, the order is : Name, IBAN, BIC
if order == "C":
self.generate_party_agent(
parent_node,
party_type,
order,
partner_bank,
gen_args,
bank_line=bank_line,
)
party = etree.SubElement(parent_node, party_type)
party_nm = etree.SubElement(party, "Nm")
party_nm.text = party_name
partner = partner_bank.partner_id
self.generate_address_block(party, partner, gen_args)
self.generate_party_id(party, party_type, partner)
self.generate_party_acc_number(
parent_node, party_type, order, partner_bank, gen_args, bank_line=bank_line
)
if order == "B":
self.generate_party_agent(
parent_node,
party_type,
order,
partner_bank,
gen_args,
bank_line=bank_line,
)
return True
@api.model
def generate_remittance_info_block(self, parent_node, line, gen_args):
remittance_info = etree.SubElement(parent_node, "RmtInf")
if line.communication_type == "normal":
remittance_info_unstructured = etree.SubElement(remittance_info, "Ustrd")
remittance_info_unstructured.text = self._prepare_field(
"Remittance Unstructured Information",
"line.communication",
{"line": line},
140,
gen_args=gen_args,
)
else:
remittance_info_structured = etree.SubElement(remittance_info, "Strd")
creditor_ref_information = etree.SubElement(
remittance_info_structured, "CdtrRefInf"
)
if gen_args.get("pain_flavor") == "pain.001.001.02":
creditor_ref_info_type = etree.SubElement(
creditor_ref_information, "CdtrRefTp"
)
creditor_ref_info_type_code = etree.SubElement(
creditor_ref_info_type, "Cd"
)
creditor_ref_info_type_code.text = "SCOR"
# SCOR means "Structured Communication Reference"
creditor_ref_info_type_issuer = etree.SubElement(
creditor_ref_info_type, "Issr"
)
creditor_ref_info_type_issuer.text = line.communication_type
creditor_reference = etree.SubElement(
creditor_ref_information, "CdtrRef"
)
else:
if gen_args.get("structured_remittance_issuer", True):
creditor_ref_info_type = etree.SubElement(
creditor_ref_information, "Tp"
)
creditor_ref_info_type_or = etree.SubElement(
creditor_ref_info_type, "CdOrPrtry"
)
creditor_ref_info_type_code = etree.SubElement(
creditor_ref_info_type_or, "Cd"
)
creditor_ref_info_type_code.text = "SCOR"
creditor_ref_info_type_issuer = etree.SubElement(
creditor_ref_info_type, "Issr"
)
creditor_ref_info_type_issuer.text = line.communication_type
creditor_reference = etree.SubElement(creditor_ref_information, "Ref")
creditor_reference.text = self._prepare_field(
"Creditor Structured Reference",
"line.communication",
{"line": line},
35,
gen_args=gen_args,
)
return True
@api.model
def generate_creditor_scheme_identification(
self,
parent_node,
identification,
identification_label,
eval_ctx,
scheme_name_proprietary,
gen_args,
):
csi_id = etree.SubElement(parent_node, "Id")
csi_privateid = etree.SubElement(csi_id, "PrvtId")
csi_other = etree.SubElement(csi_privateid, "Othr")
csi_other_id = etree.SubElement(csi_other, "Id")
csi_other_id.text = self._prepare_field(
identification_label, identification, eval_ctx, gen_args=gen_args
)
csi_scheme_name = etree.SubElement(csi_other, "SchmeNm")
csi_scheme_name_proprietary = etree.SubElement(csi_scheme_name, "Prtry")
csi_scheme_name_proprietary.text = scheme_name_proprietary
return True

View File

@@ -0,0 +1,25 @@
# © 2013-2016 Akretion - Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from odoo import api, fields, models
class BankPaymentLine(models.Model):
_inherit = "bank.payment.line"
priority = fields.Selection(related="payment_line_ids.priority", string="Priority")
local_instrument = fields.Selection(
related="payment_line_ids.local_instrument", string="Local Instrument"
)
category_purpose = fields.Selection(
related="payment_line_ids.category_purpose", string="Category Purpose"
)
purpose = fields.Selection(related="payment_line_ids.purpose")
@api.model
def same_fields_payment_line_and_bank_payment_line(self):
res = super(
BankPaymentLine, self
).same_fields_payment_line_and_bank_payment_line()
res += ["priority", "local_instrument", "category_purpose", "purpose"]
return res

View File

@@ -0,0 +1,35 @@
# Copyright 2019 ACSONE SA/NV
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
import re
from odoo import _, api, models
from odoo.exceptions import ValidationError
BIC_REGEX = re.compile(r"[A-Z]{6}[A-Z2-9][A-NP-Z0-9]([A-Z0-9]{3})?$")
class ResBank(models.Model):
_inherit = "res.bank"
@api.constrains("bic")
def _check_bic(self):
"""
This method strengthens the constraint on the BIC of the bank account
(The account_payment_order module already checks the length in the
check_bic_length method).
:raise: ValidationError if the BIC doesn't respect the regex of the
SEPA pain schemas.
"""
invalid_banks = self.filtered(lambda r: r.bic and not BIC_REGEX.match(r.bic))
if invalid_banks:
raise ValidationError(
_(
"The following Bank Identifier Codes (BIC) do not respect "
"the SEPA pattern:\n{bic_list}\n\nSEPA pattern: "
"{sepa_pattern}"
).format(
sepa_pattern=BIC_REGEX.pattern,
bic_list="\n".join(invalid_banks.mapped("bic")),
)
)

View File

@@ -0,0 +1,58 @@
# © 2013-2016 Akretion - Alexis de Lattre <alexis.delattre@akretion.com>
# © 2013 Noviat (http://www.noviat.com) - Luc de Meyer
# © 2014 Serv. Tecnol. Avanzados - Pedro M. Baeza
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
import logging
from odoo import fields, models
logger = logging.getLogger(__name__)
class ResCompany(models.Model):
_inherit = "res.company"
initiating_party_issuer = fields.Char(
string="Initiating Party Issuer",
size=35,
help="This will be used as the 'Initiating Party Issuer' in the "
"PAIN files generated by Odoo.",
)
initiating_party_identifier = fields.Char(
string="Initiating Party Identifier",
size=35,
help="This will be used as the 'Initiating Party Identifier' in "
"the PAIN files generated by Odoo.",
)
initiating_party_scheme = fields.Char(
string="Initiating Party Scheme",
size=35,
help="This will be used as the 'Initiating Party Scheme Name' in "
"the PAIN files generated by Odoo.",
)
def _default_initiating_party(self):
"""This method is called from post_install.py"""
self.ensure_one()
party_issuer_per_country = {
"BE": "KBO-BCE" # KBO-BCE = the registry of companies in Belgium
}
logger.debug("Calling _default_initiating_party on company %s", self.name)
country_code = self.country_id.code
if not self.initiating_party_issuer:
if country_code and country_code in party_issuer_per_country:
self.write(
{"initiating_party_issuer": party_issuer_per_country[country_code]}
)
logger.info("Updated initiating_party_issuer on company %s", self.name)
party_identifier = False
if not self.initiating_party_identifier:
if self.vat and country_code:
if country_code == "BE":
party_identifier = self.vat[2:].replace(" ", "")
if party_identifier:
self.write({"initiating_party_identifier": party_identifier})
logger.info(
"Updated initiating_party_identifier on company %s", self.name
)

View File

@@ -0,0 +1,25 @@
# Copyright 2016 Akretion - Alexis de Lattre <alexis.delattre@akretion.com>
# Copyright 2017 Tecnativa - Pedro M. Baeza
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from odoo import fields, models
class ResConfigSettings(models.TransientModel):
_inherit = "res.config.settings"
initiating_party_issuer = fields.Char(
related="company_id.initiating_party_issuer", readonly=False
)
initiating_party_identifier = fields.Char(
related="company_id.initiating_party_identifier", readonly=False
)
initiating_party_scheme = fields.Char(
related="company_id.initiating_party_scheme", readonly=False
)
group_pain_multiple_identifier = fields.Boolean(
string="Multiple identifiers",
implied_group="account_banking_pain_base." "group_pain_multiple_identifier",
help="Enable this option if your country requires several SEPA/PAIN "
"identifiers like in Spain.",
)

View File

@@ -0,0 +1,13 @@
# © 2015-2016 Akretion - Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from odoo import SUPERUSER_ID, api
def set_default_initiating_party(cr, registry):
with api.Environment.manage():
env = api.Environment(cr, SUPERUSER_ID, {})
for company in env["res.company"].search([]):
company._default_initiating_party()
return

View File

@@ -0,0 +1,12 @@
#. Go to Invoicing/Accounting > Configuration > Settings.
#. On the fields "Initiating Party Issuer" and "Initiating Party Identifier",
in the section *SEPA/PAIN*, you can fill the corresponding identifiers.
If your country requires several identifiers (like Spain), you must:
#. Go to *Invoicing/Accounting > Configuration > Settings*.
#. On the section *SEPA/PAIN*, check the mark "Multiple identifiers".
#. Now go to *Invoicing/Accounting > Configuration > Management > Payment Modes*.
#. Create a payment mode for your specific bank.
#. Fill the specific identifiers on the fields "Initiating Party Identifier"
and "Initiating Party Issuer".

View File

@@ -0,0 +1,12 @@
* Alexis de Lattre <alexis.delattre@akretion.com>
* Pedro M. Baeza
* Stéphane Bidoul <stephane.bidoul@acsone.eu>
* Ignacio Ibeas - Acysos S.L.
* Alexandre Fayolle
* Raphaël Valyi
* Sandy Carter
* Stefan Rijnhart (Therp)
* Antonio Espinosa <antonioea@antiun.com>
* `DynApps NV <https://www.dynapps.be>`_:
* Axel Priem <axel.priem@dynapps.be>

View File

@@ -0,0 +1,7 @@
This module contains fields and functions that are used by the module for SEPA
Credit Transfer (account_banking_sepa_credit_transfer) and SEPA Direct Debit
(account_banking_sepa_direct_debit). This module doesn't provide any
functionality by itself.
This module was started during the Akretion-Noviat code sprint of November
21st 2013 in Epiais les Louvres (France).

View File

@@ -0,0 +1,5 @@
This module depends on :
- account_payment_order
This module is part of the OCA/bank-payment suite.

View File

@@ -0,0 +1 @@
See 'readme' files of the OCA/bank-payment suite.

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="group_pain_multiple_identifier" model="res.groups">
<field name="name">SEPA/PAIN Identifiers on Payment Modes</field>
<field name="category_id" ref="base.module_category_hidden" />
</record>
</odoo>

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

View File

@@ -0,0 +1,466 @@
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils 0.15.1: http://docutils.sourceforge.net/" />
<title>Account Banking PAIN Base Module</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }
.last, .with-subtitle {
margin-bottom: 0 ! important }
.hidden {
display: none }
.subscript {
vertical-align: sub;
font-size: smaller }
.superscript {
vertical-align: super;
font-size: smaller }
a.toc-backref {
text-decoration: none ;
color: black }
blockquote.epigraph {
margin: 2em 5em ; }
dl.docutils dd {
margin-bottom: 0.5em }
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/
div.abstract {
margin: 2em 5em }
div.abstract p.topic-title {
font-weight: bold ;
text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
color: red ;
font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }
div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }
div.figure {
margin-left: 2em ;
margin-right: 2em }
div.footer, div.header {
clear: both;
font-size: smaller }
div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }
div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }
div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }
div.system-messages {
margin: 5em }
div.system-messages h1 {
color: red }
div.system-message {
border: medium outset ;
padding: 1em }
div.system-message p.system-message-title {
color: red ;
font-weight: bold }
div.topic {
margin: 2em }
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title {
text-align: center }
h2.subtitle {
text-align: center }
hr.docutils {
width: 75% }
img.align-left, .figure.align-left, object.align-left, table.align-left {
clear: left ;
float: left ;
margin-right: 1em }
img.align-right, .figure.align-right, object.align-right, table.align-right {
clear: right ;
float: right ;
margin-left: 1em }
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left }
.align-center {
clear: both ;
text-align: center }
.align-right {
text-align: right }
/* reset inner alignment in figures */
div.align-right {
text-align: inherit }
/* div.align-center * { */
/* text-align: left } */
.align-top {
vertical-align: top }
.align-middle {
vertical-align: middle }
.align-bottom {
vertical-align: bottom }
ol.simple, ul.simple {
margin-bottom: 1em }
ol.arabic {
list-style: decimal }
ol.loweralpha {
list-style: lower-alpha }
ol.upperalpha {
list-style: upper-alpha }
ol.lowerroman {
list-style: lower-roman }
ol.upperroman {
list-style: upper-roman }
p.attribution {
text-align: right ;
margin-left: 50% }
p.caption {
font-style: italic }
p.credits {
font-style: italic ;
font-size: smaller }
p.label {
white-space: nowrap }
p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }
p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }
p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }
p.topic-title {
font-weight: bold }
pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }
pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ;
margin-right: 2em }
pre.code .ln { color: grey; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
span.classifier {
font-family: sans-serif ;
font-style: oblique }
span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }
span.interpreted {
font-family: sans-serif }
span.option {
white-space: nowrap }
span.pre {
white-space: pre }
span.problematic {
color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation {
border-left: solid 1px gray;
margin-left: 1px }
table.docinfo {
margin: 2em 4em }
table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }
table.footnote {
border-left: solid 1px black;
margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }
/* "booktabs" style (no vertical lines) */
table.docutils.booktabs {
border: 0px;
border-top: 2px solid;
border-bottom: 2px solid;
border-collapse: collapse;
}
table.docutils.booktabs * {
border: 0px;
}
table.docutils.booktabs th {
border-bottom: thin solid;
text-align: left;
}
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }
ul.auto-toc {
list-style-type: none }
</style>
</head>
<body>
<div class="document" id="account-banking-pain-base-module">
<h1 class="title">Account Banking PAIN Base Module</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/bank-payment/tree/12.0/account_banking_pain_base"><img alt="OCA/bank-payment" src="https://img.shields.io/badge/github-OCA%2Fbank--payment-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/bank-payment-12-0/bank-payment-12-0-account_banking_pain_base"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/173/12.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
<p>This module contains fields and functions that are used by the module for SEPA
Credit Transfer (account_banking_sepa_credit_transfer) and SEPA Direct Debit
(account_banking_sepa_direct_debit). This module doesnt provide any
functionality by itself.</p>
<p>This module was started during the Akretion-Noviat code sprint of November
21st 2013 in Epiais les Louvres (France).</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#installation" id="id1">Installation</a></li>
<li><a class="reference internal" href="#configuration" id="id2">Configuration</a></li>
<li><a class="reference internal" href="#usage" id="id3">Usage</a></li>
<li><a class="reference internal" href="#bug-tracker" id="id4">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="id5">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="id6">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="id7">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="id8">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="installation">
<h1><a class="toc-backref" href="#id1">Installation</a></h1>
<p>This module depends on :</p>
<ul class="simple">
<li>account_payment_order</li>
</ul>
<p>This module is part of the OCA/bank-payment suite.</p>
</div>
<div class="section" id="configuration">
<h1><a class="toc-backref" href="#id2">Configuration</a></h1>
<ol class="arabic simple">
<li>Go to Invoicing/Accounting &gt; Configuration &gt; Settings.</li>
<li>On the fields “Initiating Party Issuer” and “Initiating Party Identifier”,
in the section <em>SEPA/PAIN</em>, you can fill the corresponding identifiers.</li>
</ol>
<p>If your country requires several identifiers (like Spain), you must:</p>
<ol class="arabic simple">
<li>Go to <em>Invoicing/Accounting &gt; Configuration &gt; Settings</em>.</li>
<li>On the section <em>SEPA/PAIN</em>, check the mark “Multiple identifiers”.</li>
<li>Now go to <em>Invoicing/Accounting &gt; Configuration &gt; Management &gt; Payment Modes</em>.</li>
<li>Create a payment mode for your specific bank.</li>
<li>Fill the specific identifiers on the fields “Initiating Party Identifier”
and “Initiating Party Issuer”.</li>
</ol>
</div>
<div class="section" id="usage">
<h1><a class="toc-backref" href="#id3">Usage</a></h1>
<p>See readme files of the OCA/bank-payment suite.</p>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#id4">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/bank-payment/issues">GitHub Issues</a>.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed
<a class="reference external" href="https://github.com/OCA/bank-payment/issues/new?body=module:%20account_banking_pain_base%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h1><a class="toc-backref" href="#id5">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#id6">Authors</a></h2>
<ul class="simple">
<li>Akretion</li>
<li>Noviat</li>
<li>Tecnativa</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#id7">Contributors</a></h2>
<ul class="simple">
<li>Alexis de Lattre &lt;<a class="reference external" href="mailto:alexis.delattre&#64;akretion.com">alexis.delattre&#64;akretion.com</a>&gt;</li>
<li>Pedro M. Baeza</li>
<li>Stéphane Bidoul &lt;<a class="reference external" href="mailto:stephane.bidoul&#64;acsone.eu">stephane.bidoul&#64;acsone.eu</a>&gt;</li>
<li>Ignacio Ibeas - Acysos S.L.</li>
<li>Alexandre Fayolle</li>
<li>Raphaël Valyi</li>
<li>Sandy Carter</li>
<li>Stefan Rijnhart (Therp)</li>
<li>Antonio Espinosa &lt;<a class="reference external" href="mailto:antonioea&#64;antiun.com">antonioea&#64;antiun.com</a>&gt;</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#id8">Maintainers</a></h2>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
<p>OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.</p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/bank-payment/tree/12.0/account_banking_pain_base">OCA/bank-payment</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8" ?>
<!--
© 2013-2016 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
-->
<odoo>
<record id="account_payment_line_form" model="ir.ui.view">
<field name="name">pain.base.account.payment.line</field>
<field name="model">account.payment.line</field>
<field
name="inherit_id"
ref="account_payment_order.account_payment_line_form"
/>
<field name="arch" type="xml">
<field name="communication_type" position="before">
<field name="priority" />
<field name="local_instrument" />
<field name="category_purpose" />
<field name="purpose" />
</field>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="account_payment_method_form" model="ir.ui.view">
<field name="name">pain_base.account_payment_method.form</field>
<field name="model">account.payment.method</field>
<field
name="inherit_id"
ref="account_payment_mode.account_payment_method_form"
/>
<field name="arch" type="xml">
<field name="payment_type" position="after">
<field name="pain_version" />
<field
name="convert_to_ascii"
attrs="{'invisible': [('pain_version', '=', False)]}"
/>
</field>
</field>
</record>
<record id="account_payment_method_tree" model="ir.ui.view">
<field name="name">pain_base.account_payment_method.tree</field>
<field name="model">account.payment.method</field>
<field
name="inherit_id"
ref="account_payment_mode.account_payment_method_tree"
/>
<field name="arch" type="xml">
<field name="payment_type" position="after">
<field name="pain_version" />
</field>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,32 @@
<?xml version="1.0" encoding="utf-8" ?>
<!--
Copyright (C) 2013-2016 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
Copyright 2015-2017 Tecnativa
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
-->
<odoo>
<record id="account_payment_mode_form" model="ir.ui.view">
<field name="name">pain_base.account.payment.mode.form</field>
<field name="model">account.payment.mode</field>
<field
name="inherit_id"
ref="account_payment_order.account_payment_mode_form"
/>
<field name="arch" type="xml">
<group name="main" position="inside">
<field
name="initiating_party_identifier"
groups="account_banking_pain_base.group_pain_multiple_identifier"
/>
<field
name="initiating_party_issuer"
groups="account_banking_pain_base.group_pain_multiple_identifier"
/>
<field
name="initiating_party_scheme"
groups="account_banking_pain_base.group_pain_multiple_identifier"
/>
</group>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8" ?>
<!--
© 2016 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
-->
<odoo>
<record id="account_payment_order_form" model="ir.ui.view">
<field name="name">pain.base.account.payment.order.form</field>
<field name="model">account.payment.order</field>
<field
name="inherit_id"
ref="account_payment_order.account_payment_order_form"
/>
<field name="arch" type="xml">
<field name="company_partner_bank_id" position="after">
<field name="sepa" />
<field name="batch_booking" />
<field
name="charge_bearer"
attrs="{'invisible': [('sepa', '=', True)]}"
/>
</field>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8" ?>
<!--
© 2015-2016 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
-->
<odoo>
<record id="bank_payment_line_form" model="ir.ui.view">
<field name="name">pain.base.bank.payment.line.form</field>
<field name="model">bank.payment.line</field>
<field name="inherit_id" ref="account_payment_order.bank_payment_line_form" />
<field name="arch" type="xml">
<field name="partner_bank_id" position="after">
<field name="priority" />
<field name="local_instrument" />
<field name="category_purpose" />
<field name="purpose" />
</field>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,46 @@
<?xml version="1.0" encoding="utf-8" ?>
<!--
© 2016 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
-->
<odoo>
<record id="view_account_config_settings" model="ir.ui.view">
<field name="name">pain.group.on.account.config.settings</field>
<field name="model">res.config.settings</field>
<field name="inherit_id" ref="account.res_config_settings_view_form" />
<field name="arch" type="xml">
<xpath expr="//div[@id='analytic']" position="after">
<h2>SEPA/PAIN</h2>
<div class="row mt16 o_settings_container" id="pain">
<div class="col-xs-12 col-md-6 o_setting_box">
<div class="o_setting_right_pane">
<div class="content-group">
<div class="row mt16">
<label
for="initiating_party_identifier"
class="col-md-3 o_light_label"
/>
<field name="initiating_party_identifier" />
</div>
<div class="row mt16">
<label
for="initiating_party_issuer"
class="col-md-3 o_light_label"
/>
<field name="initiating_party_issuer" />
</div>
<div class="row mt16">
<label
for="group_pain_multiple_identifier"
class="col-md-3 o_light_label"
/>
<field name="group_pain_multiple_identifier" />
</div>
</div>
</div>
</div>
</div>
</xpath>
</field>
</record>
</odoo>

1
requirements.txt Normal file
View File

@@ -0,0 +1 @@
unidecode

View File

@@ -0,0 +1 @@
../../../../account_banking_pain_base

View File

@@ -0,0 +1,6 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)