[ADD] account_banking_mandate, spliting functionality in two modules

This commit is contained in:
Pedro M. Baeza
2014-10-08 03:34:21 +02:00
committed by Stefan Rijnhart
parent 3ada27b98e
commit 8cc1f76969
17 changed files with 1396 additions and 0 deletions

View File

@@ -0,0 +1,22 @@
# -*- encoding: utf-8 -*-
##############################################################################
#
# Mandate module for openERP
# Copyright (C) 2014 Compassion CH (http://www.compassion.ch)
# @author: Cyril Sester <csester@compassion.ch>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from . import models

View File

@@ -0,0 +1,59 @@
# -*- encoding: utf-8 -*-
##############################################################################
#
# Mandate module for openERP
# Copyright (C) 2014 Compassion CH (http://www.compassion.ch)
# @author: Cyril Sester <csester@compassion.ch>,
# Alexis de Lattre <alexis.delattre@akretion.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
{
'name': 'Account Banking Mandate',
'summary': 'Banking mandates',
'version': '8.0.0.1.0',
'license': 'AGPL-3',
'author': "Compassion CH, "
"Serv. Tecnol. Avanzados - Pedro M. Baeza, "
"Akretion, "
"Odoo Community Association (OCA)",
'website': 'https://github.com/OCA/bank-payment',
'category': 'Banking addons',
'depends': [
'account_payment',
],
'data': [
'views/account_banking_mandate_view.xml',
'views/account_invoice_view.xml',
'views/account_payment_view.xml',
'views/res_partner_bank_view.xml',
'data/mandate_reference_sequence.xml',
'security/ir.model.access.csv',
],
'demo': [],
'test': ['test/banking_mandate.yml'],
'description': '''
This module adds a generic model for banking mandates.
These mandates can be specialized to fit any banking mandates (such as
sepa or lsv).
A banking mandate is attached to a bank account and represents an
authorization that the bank account owner gives to a company for a
specific operation (such as direct debit).
You can setup mandates from the accounting menu or directly from a bank
account.
''',
'installable': True,
}

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data noupdate="1">
<record id="dd_mandate_seq_type" model="ir.sequence.type">
<field name="name">DD Mandate Reference</field>
<field name="code">account.banking.mandate</field>
</record>
<record id="dd_mandate_seq" model="ir.sequence">
<field name="name">DD Mandate Reference</field>
<field name="code">account.banking.mandate</field>
<field name="prefix">BM</field>
<field name="padding" eval="7"/>
</record>
</data>
</openerp>

View File

@@ -0,0 +1,355 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_banking_mandate
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 8.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-10-31 23:00+0000\n"
"PO-Revision-Date: 2014-10-31 23:00+0000\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_mandate
#: model:ir.actions.act_window,help:account_banking_mandate.mandate_action
msgid "<p class=\"oe_view_nocontent_create\">\n"
" Click to create a new Banking Mandate.\n"
" </p><p>\n"
" A Banking Mandate is a document signed by your customer that gives you the autorization to do one or several operations on his bank account.\n"
" </p>\n"
" "
msgstr ""
#. module: account_banking_mandate
#: sql_constraint:account.banking.mandate:0
msgid "A Mandate with the same reference already exists for this company !"
msgstr ""
#. module: account_banking_mandate
#: model:ir.model,name:account_banking_mandate.model_account_banking_mandate
msgid "A generic banking mandate"
msgstr ""
#. module: account_banking_mandate
#: view:account.banking.mandate:account_banking_mandate.view_mandate_form
msgid "Back to Draft"
msgstr ""
#. module: account_banking_mandate
#: field:account.banking.mandate,partner_bank_id:0
msgid "Bank Account"
msgstr ""
#. module: account_banking_mandate
#: model:ir.model,name:account_banking_mandate.model_res_partner_bank
msgid "Bank Accounts"
msgstr ""
#. module: account_banking_mandate
#: view:account.banking.mandate:account_banking_mandate.view_mandate_form
#: view:account.banking.mandate:account_banking_mandate.view_mandate_tree
msgid "Banking Mandate"
msgstr ""
#. module: account_banking_mandate
#: model:mail.message.subtype,description:account_banking_mandate.mandate_cancel
msgid "Banking Mandate Cancelled"
msgstr ""
#. module: account_banking_mandate
#: model:mail.message.subtype,description:account_banking_mandate.mandate_valid
msgid "Banking Mandate Validated"
msgstr ""
#. module: account_banking_mandate
#: model:mail.message.subtype,description:account_banking_mandate.mandate_expired
msgid "Banking Mandate has Expired"
msgstr ""
#. module: account_banking_mandate
#: model:ir.actions.act_window,name:account_banking_mandate.mandate_action
msgid "Banking Mandates"
msgstr ""
#. module: account_banking_mandate
#: help:res.partner.bank,mandate_ids:0
msgid "Banking mandates represents an authorization that the bank account owner gives to a company for a specific operation"
msgstr ""
#. module: account_banking_mandate
#: view:account.banking.mandate:account_banking_mandate.view_mandate_form
msgid "Cancel"
msgstr ""
#. module: account_banking_mandate
#: view:account.banking.mandate:account_banking_mandate.view_mandate_search
msgid "Cancelled"
msgstr ""
#. module: account_banking_mandate
#: code:addons/account_banking_mandate/models/account_banking_mandate.py:110
#, python-format
msgid "Cannot validate the mandate '%s' because it is not attached to a bank account."
msgstr ""
#. module: account_banking_mandate
#: code:addons/account_banking_mandate/models/account_banking_mandate.py:106
#, python-format
msgid "Cannot validate the mandate '%s' without a date of signature."
msgstr ""
#. module: account_banking_mandate
#: field:account.banking.mandate,company_id:0
msgid "Company"
msgstr ""
#. module: account_banking_mandate
#: field:account.banking.mandate,create_uid:0
msgid "Created by"
msgstr ""
#. module: account_banking_mandate
#: field:account.banking.mandate,create_date:0
msgid "Created on"
msgstr ""
#. module: account_banking_mandate
#: view:payment.order:account_banking_mandate.view_mandate_payment_order_form
msgid "DD Mandate"
msgstr ""
#. module: account_banking_mandate
#: view:res.partner:account_banking_mandate.mandate_partner_form
#: view:res.partner.bank:account_banking_mandate.mandate_partner_bank_tree
msgid "DD Mandates"
msgstr ""
#. module: account_banking_mandate
#: field:account.banking.mandate,signature_date:0
msgid "Date of Signature of the Mandate"
msgstr ""
#. module: account_banking_mandate
#: field:account.banking.mandate,last_debit_date:0
msgid "Date of the Last Debit"
msgstr ""
#. module: account_banking_mandate
#: help:account.banking.mandate,message_last_post:0
msgid "Date of the last message posted on the record."
msgstr ""
#. module: account_banking_mandate
#: field:account.invoice,mandate_id:0
#: field:payment.line,mandate_id:0
msgid "Direct Debit Mandate"
msgstr ""
#. module: account_banking_mandate
#: view:res.partner.bank:account_banking_mandate.mandate_partner_bank_form
#: field:res.partner.bank,mandate_ids:0
msgid "Direct Debit Mandates"
msgstr ""
#. module: account_banking_mandate
#: view:account.banking.mandate:account_banking_mandate.view_mandate_search
msgid "Draft"
msgstr ""
#. module: account_banking_mandate
#: view:account.banking.mandate:account_banking_mandate.view_mandate_search
msgid "Expired"
msgstr ""
#. module: account_banking_mandate
#: field:account.banking.mandate,message_follower_ids:0
msgid "Followers"
msgstr ""
#. module: account_banking_mandate
#: help:account.banking.mandate,message_summary:0
msgid "Holds the Chatter summary (number of messages, ...). This summary is directly in html format in order to be inserted in kanban views."
msgstr ""
#. module: account_banking_mandate
#: field:account.banking.mandate,id:0
msgid "ID"
msgstr ""
#. module: account_banking_mandate
#: help:account.banking.mandate,message_unread:0
msgid "If checked new messages require your attention."
msgstr ""
#. module: account_banking_mandate
#: model:ir.model,name:account_banking_mandate.model_account_invoice
msgid "Invoice"
msgstr ""
#. module: account_banking_mandate
#: field:account.banking.mandate,message_is_follower:0
msgid "Is a Follower"
msgstr ""
#. module: account_banking_mandate
#: field:account.banking.mandate,message_last_post:0
msgid "Last Message Date"
msgstr ""
#. module: account_banking_mandate
#: field:account.banking.mandate,write_uid:0
msgid "Last Updated by"
msgstr ""
#. module: account_banking_mandate
#: field:account.banking.mandate,write_date:0
msgid "Last Updated on"
msgstr ""
#. module: account_banking_mandate
#: model:mail.message.subtype,name:account_banking_mandate.mandate_cancel
msgid "Mandate Cancelled"
msgstr ""
#. module: account_banking_mandate
#: model:mail.message.subtype,name:account_banking_mandate.mandate_expired
msgid "Mandate Expired"
msgstr ""
#. module: account_banking_mandate
#: model:mail.message.subtype,name:account_banking_mandate.mandate_valid
msgid "Mandate Validated"
msgstr ""
#. module: account_banking_mandate
#: code:addons/account_banking_mandate/models/account_banking_mandate.py:152
#, python-format
msgid "Mandate should be in cancel state"
msgstr ""
#. module: account_banking_mandate
#: code:addons/account_banking_mandate/models/account_banking_mandate.py:140
#, python-format
msgid "Mandate should be in draft or valid state"
msgstr ""
#. module: account_banking_mandate
#: code:addons/account_banking_mandate/models/account_banking_mandate.py:131
#, python-format
msgid "Mandate should be in draft state"
msgstr ""
#. module: account_banking_mandate
#: field:account.banking.mandate,message_ids:0
msgid "Messages"
msgstr ""
#. module: account_banking_mandate
#: help:account.banking.mandate,message_ids:0
msgid "Messages and communication history"
msgstr ""
#. module: account_banking_mandate
#: help:account.banking.mandate,state:0
msgid "Only valid mandates can be used in a payment line. A cancelled mandate is a mandate that has been cancelled by the customer."
msgstr ""
#. module: account_banking_mandate
#: field:account.banking.mandate,partner_id:0
msgid "Partner"
msgstr ""
#. module: account_banking_mandate
#: model:ir.model,name:account_banking_mandate.model_payment_line
msgid "Payment Line"
msgstr ""
#. module: account_banking_mandate
#: view:account.banking.mandate:account_banking_mandate.view_mandate_tree
msgid "Reference"
msgstr ""
#. module: account_banking_mandate
#: view:account.banking.mandate:account_banking_mandate.view_mandate_form
#: field:account.banking.mandate,payment_line_ids:0
msgid "Related Payment Lines"
msgstr ""
#. module: account_banking_mandate
#: model:ir.ui.menu,name:account_banking_mandate.mandate_menu
msgid "SEPA Direct Debit Mandates"
msgstr ""
#. module: account_banking_mandate
#: field:account.banking.mandate,scan:0
msgid "Scan of the Mandate"
msgstr ""
#. module: account_banking_mandate
#: view:account.banking.mandate:account_banking_mandate.view_mandate_search
msgid "Search Banking Mandates"
msgstr ""
#. module: account_banking_mandate
#: view:account.banking.mandate:account_banking_mandate.view_mandate_tree
msgid "Signature Date"
msgstr ""
#. module: account_banking_mandate
#: field:account.banking.mandate,state:0
msgid "Status"
msgstr ""
#. module: account_banking_mandate
#: field:account.banking.mandate,message_summary:0
msgid "Summary"
msgstr ""
#. module: account_banking_mandate
#: code:addons/account_banking_mandate/models/account_banking_mandate.py:92
#, python-format
msgid "The date of signature of mandate '%s' is in the future !"
msgstr ""
#. module: account_banking_mandate
#: code:addons/account_banking_mandate/models/account_banking_mandate.py:97
#, python-format
msgid "The mandate '%s' can't have a date of last debit before the date of signature."
msgstr ""
#. module: account_banking_mandate
#: code:addons/account_banking_mandate/models/payment_line.py:68
#, python-format
msgid "The payment line with reference '%s' has the bank account '%s' which is not attached to the mandate '%s' (this mandate is attached to the bank account '%s')."
msgstr ""
#. module: account_banking_mandate
#: field:account.banking.mandate,unique_mandate_reference:0
msgid "Unique Mandate Reference"
msgstr ""
#. module: account_banking_mandate
#: field:account.banking.mandate,message_unread:0
msgid "Unread Messages"
msgstr ""
#. module: account_banking_mandate
#: view:account.banking.mandate:account_banking_mandate.view_mandate_search
msgid "Valid"
msgstr ""
#. module: account_banking_mandate
#: view:account.banking.mandate:account_banking_mandate.view_mandate_form
msgid "Validate"
msgstr ""
#. module: account_banking_mandate
#: view:account.banking.mandate:account_banking_mandate.view_mandate_form
msgid "You should set a mandate back to draft only if you cancelled it by mistake. Do you want to continue?"
msgstr ""

View File

@@ -0,0 +1,360 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_banking_mandate
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 8.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-10-31 23:00+0000\n"
"PO-Revision-Date: 2014-10-31 23:00+0000\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_mandate
#: model:ir.actions.act_window,help:account_banking_mandate.mandate_action
msgid "<p class=\"oe_view_nocontent_create\">\n"
" Click to create a new Banking Mandate.\n"
" </p><p>\n"
" A Banking Mandate is a document signed by your customer that gives you the autorization to do one or several operations on his bank account.\n"
" </p>\n"
" "
msgstr "<p class=\"oe_view_nocontent_create\">\n"
" Pulse para crear un nuevo mandato bancario.\n"
" </p><p>\n"
" Un mandato bancario es un documento firmado por su cliente que le da autorización a hacer una o varias operaciones en su cuenta bancaria.\n"
" </p>\n"
" "
#. module: account_banking_mandate
#: sql_constraint:account.banking.mandate:0
msgid "A Mandate with the same reference already exists for this company !"
msgstr "Ya existe un mandato con la misma referencia para esta compañía"
#. module: account_banking_mandate
#: model:ir.model,name:account_banking_mandate.model_account_banking_mandate
msgid "A generic banking mandate"
msgstr "Un mandato bancario genérico"
#. module: account_banking_mandate
#: view:account.banking.mandate:account_banking_mandate.view_mandate_form
msgid "Back to Draft"
msgstr "Volver a borrador"
#. module: account_banking_mandate
#: field:account.banking.mandate,partner_bank_id:0
msgid "Bank Account"
msgstr "Cuenta bancaria"
#. module: account_banking_mandate
#: model:ir.model,name:account_banking_mandate.model_res_partner_bank
msgid "Bank Accounts"
msgstr "Cuentas bancarias"
#. module: account_banking_mandate
#: view:account.banking.mandate:account_banking_mandate.view_mandate_form
#: view:account.banking.mandate:account_banking_mandate.view_mandate_tree
msgid "Banking Mandate"
msgstr "Mandato bancario"
#. module: account_banking_mandate
#: model:mail.message.subtype,description:account_banking_mandate.mandate_cancel
msgid "Banking Mandate Cancelled"
msgstr "Mandato bancario cancelado"
#. module: account_banking_mandate
#: model:mail.message.subtype,description:account_banking_mandate.mandate_valid
msgid "Banking Mandate Validated"
msgstr "Mandato bancario validado"
#. module: account_banking_mandate
#: model:mail.message.subtype,description:account_banking_mandate.mandate_expired
msgid "Banking Mandate has Expired"
msgstr "El mandato bancario ha expirado"
#. module: account_banking_mandate
#: model:ir.actions.act_window,name:account_banking_mandate.mandate_action
msgid "Banking Mandates"
msgstr "Mandatos bancarios"
#. module: account_banking_mandate
#: help:res.partner.bank,mandate_ids:0
msgid "Banking mandates represents an authorization that the bank account owner gives to a company for a specific operation"
msgstr "Los mandatos bancarios representan una autorización que el propietario de la cuenta bancaria da a la compañía para un operación específica"
#. module: account_banking_mandate
#: view:account.banking.mandate:account_banking_mandate.view_mandate_form
msgid "Cancel"
msgstr "Cancelar"
#. module: account_banking_mandate
#: view:account.banking.mandate:account_banking_mandate.view_mandate_search
msgid "Cancelled"
msgstr "Cancelado"
#. module: account_banking_mandate
#: code:addons/account_banking_mandate/models/account_banking_mandate.py:110
#, python-format
msgid "Cannot validate the mandate '%s' because it is not attached to a bank account."
msgstr "No se puede validar el mandato '%s' porque no tiene ninguna cuenta bancaria asociada."
#. module: account_banking_mandate
#: code:addons/account_banking_mandate/models/account_banking_mandate.py:106
#, python-format
msgid "Cannot validate the mandate '%s' without a date of signature."
msgstr "No se puede validar el mandato '%s' sin una fecha de firma."
#. module: account_banking_mandate
#: field:account.banking.mandate,company_id:0
msgid "Company"
msgstr "Compañía"
#. module: account_banking_mandate
#: field:account.banking.mandate,create_uid:0
msgid "Created by"
msgstr "Creado por"
#. module: account_banking_mandate
#: field:account.banking.mandate,create_date:0
msgid "Created on"
msgstr "Creado en"
#. module: account_banking_mandate
#: view:payment.order:account_banking_mandate.view_mandate_payment_order_form
msgid "DD Mandate"
msgstr "Mandato bancario"
#. module: account_banking_mandate
#: view:res.partner:account_banking_mandate.mandate_partner_form
#: view:res.partner.bank:account_banking_mandate.mandate_partner_bank_tree
msgid "DD Mandates"
msgstr "Mandatos bancarios"
#. module: account_banking_mandate
#: field:account.banking.mandate,signature_date:0
msgid "Date of Signature of the Mandate"
msgstr "Fecha de la firma del mandato"
#. module: account_banking_mandate
#: field:account.banking.mandate,last_debit_date:0
msgid "Date of the Last Debit"
msgstr "Fecha del último cobro"
#. module: account_banking_mandate
#: help:account.banking.mandate,message_last_post:0
msgid "Date of the last message posted on the record."
msgstr "Fecha del último mensaje publicado en el registro."
#. module: account_banking_mandate
#: field:account.invoice,mandate_id:0
#: field:payment.line,mandate_id:0
msgid "Direct Debit Mandate"
msgstr "Mandato de adeudo directo"
#. module: account_banking_mandate
#: view:res.partner.bank:account_banking_mandate.mandate_partner_bank_form
#: field:res.partner.bank,mandate_ids:0
msgid "Direct Debit Mandates"
msgstr "Mandatos de adeudo directo"
#. module: account_banking_mandate
#: view:account.banking.mandate:account_banking_mandate.view_mandate_search
msgid "Draft"
msgstr "Borrador"
#. module: account_banking_mandate
#: view:account.banking.mandate:account_banking_mandate.view_mandate_search
msgid "Expired"
msgstr "Expirado"
#. module: account_banking_mandate
#: field:account.banking.mandate,message_follower_ids:0
msgid "Followers"
msgstr "Seguidores"
#. module: account_banking_mandate
#: help:account.banking.mandate,message_summary:0
msgid "Holds the Chatter summary (number of messages, ...). This summary is directly in html format in order to be inserted in kanban views."
msgstr "Contiene el resumen del chatter (nº de mensajes, ...). Este resumen está directamente en formato html para ser insertado en vistas kanban."
#. module: account_banking_mandate
#: field:account.banking.mandate,id:0
msgid "ID"
msgstr "ID"
#. module: account_banking_mandate
#: help:account.banking.mandate,message_unread:0
msgid "If checked new messages require your attention."
msgstr "Si está marcado, hay nuevos mensajes que requieren su atención"
#. module: account_banking_mandate
#: model:ir.model,name:account_banking_mandate.model_account_invoice
msgid "Invoice"
msgstr "Factura"
#. module: account_banking_mandate
#: field:account.banking.mandate,message_is_follower:0
msgid "Is a Follower"
msgstr "Es un seguidor"
#. module: account_banking_mandate
#: field:account.banking.mandate,message_last_post:0
msgid "Last Message Date"
msgstr "Fecha del último mensaje"
#. module: account_banking_mandate
#: field:account.banking.mandate,write_uid:0
msgid "Last Updated by"
msgstr "Última actualización por"
#. module: account_banking_mandate
#: field:account.banking.mandate,write_date:0
msgid "Last Updated on"
msgstr "Última actualización en"
#. module: account_banking_mandate
#: model:mail.message.subtype,name:account_banking_mandate.mandate_cancel
msgid "Mandate Cancelled"
msgstr "Mandato cancelado"
#. module: account_banking_mandate
#: model:mail.message.subtype,name:account_banking_mandate.mandate_expired
msgid "Mandate Expired"
msgstr "Mandato expirado"
#. module: account_banking_mandate
#: model:mail.message.subtype,name:account_banking_mandate.mandate_valid
msgid "Mandate Validated"
msgstr "Mandato validado"
#. module: account_banking_mandate
#: code:addons/account_banking_mandate/models/account_banking_mandate.py:152
#, python-format
msgid "Mandate should be in cancel state"
msgstr "El mandato debe estar en estado cancelado"
#. module: account_banking_mandate
#: code:addons/account_banking_mandate/models/account_banking_mandate.py:140
#, python-format
msgid "Mandate should be in draft or valid state"
msgstr "El mandato debe estar en estado borrador o validado"
#. module: account_banking_mandate
#: code:addons/account_banking_mandate/models/account_banking_mandate.py:131
#, python-format
msgid "Mandate should be in draft state"
msgstr "El mandato debe estar en estado borrador"
#. module: account_banking_mandate
#: field:account.banking.mandate,message_ids:0
msgid "Messages"
msgstr "Mensajes"
#. module: account_banking_mandate
#: help:account.banking.mandate,message_ids:0
msgid "Messages and communication history"
msgstr "Mensajes e historial de comunicación"
#. module: account_banking_mandate
#: help:account.banking.mandate,state:0
msgid "Only valid mandates can be used in a payment line. A cancelled mandate is a mandate that has been cancelled by the customer."
msgstr "Sólo se pueden usar mandatos validados en una línea de pago. Un mandato cancelado en un mandato que ha sido invalidado por el cliente."
#. module: account_banking_mandate
#: field:account.banking.mandate,partner_id:0
msgid "Partner"
msgstr "Empresa"
#. module: account_banking_mandate
#: model:ir.model,name:account_banking_mandate.model_payment_line
msgid "Payment Line"
msgstr "Línea de pago"
#. module: account_banking_mandate
#: view:account.banking.mandate:account_banking_mandate.view_mandate_tree
msgid "Reference"
msgstr "Referencia"
#. module: account_banking_mandate
#: view:account.banking.mandate:account_banking_mandate.view_mandate_form
#: field:account.banking.mandate,payment_line_ids:0
msgid "Related Payment Lines"
msgstr "Líneas de pago relacionadas"
#. module: account_banking_mandate
#: model:ir.ui.menu,name:account_banking_mandate.mandate_menu
msgid "SEPA Direct Debit Mandates"
msgstr "Mandatos de adeudo directo SEPA"
#. module: account_banking_mandate
#: field:account.banking.mandate,scan:0
msgid "Scan of the Mandate"
msgstr "Escaneado del mandato"
#. module: account_banking_mandate
#: view:account.banking.mandate:account_banking_mandate.view_mandate_search
msgid "Search Banking Mandates"
msgstr "Buscar mandatos bancarios"
#. module: account_banking_mandate
#: view:account.banking.mandate:account_banking_mandate.view_mandate_tree
msgid "Signature Date"
msgstr "Fecha de firma"
#. module: account_banking_mandate
#: field:account.banking.mandate,state:0
msgid "Status"
msgstr "Estado"
#. module: account_banking_mandate
#: field:account.banking.mandate,message_summary:0
msgid "Summary"
msgstr "Resumen"
#. module: account_banking_mandate
#: code:addons/account_banking_mandate/models/account_banking_mandate.py:92
#, python-format
msgid "The date of signature of mandate '%s' is in the future !"
msgstr "La fecha de firma del mandato '%s' no puede ser superior a la actual"
#. module: account_banking_mandate
#: code:addons/account_banking_mandate/models/account_banking_mandate.py:97
#, python-format
msgid "The mandate '%s' can't have a date of last debit before the date of signature."
msgstr "El mandato '%s' no puede tener una fecha de último cobro antes de la fecha de firma."
#. module: account_banking_mandate
#: code:addons/account_banking_mandate/models/payment_line.py:68
#, python-format
msgid "The payment line with reference '%s' has the bank account '%s' which is not attached to the mandate '%s' (this mandate is attached to the bank account '%s')."
msgstr "La línea de pago con referencia '%s' tiene la cuenta bancaria '%s', que no está puesta en el mandato '%s' (este mandato tiene como cuenta bancaria '%s')."
#. module: account_banking_mandate
#: field:account.banking.mandate,unique_mandate_reference:0
msgid "Unique Mandate Reference"
msgstr "Referencia única del mandato"
#. module: account_banking_mandate
#: field:account.banking.mandate,message_unread:0
msgid "Unread Messages"
msgstr "Mensajes sin leer"
#. module: account_banking_mandate
#: view:account.banking.mandate:account_banking_mandate.view_mandate_search
msgid "Valid"
msgstr "Válido"
#. module: account_banking_mandate
#: view:account.banking.mandate:account_banking_mandate.view_mandate_form
msgid "Validate"
msgstr "Validar"
#. module: account_banking_mandate
#: view:account.banking.mandate:account_banking_mandate.view_mandate_form
msgid "You should set a mandate back to draft only if you cancelled it by mistake. Do you want to continue?"
msgstr "Debe establecer un mandato de vuelta a borrador sólo si lo cancelo por error. ¿Desea continuar?"

View File

@@ -0,0 +1,26 @@
# -*- encoding: utf-8 -*-
##############################################################################
#
# Mandate module for openERP
# Copyright (C) 2014 Compassion CH (http://www.compassion.ch)
# @author: Cyril Sester <csester@compassion.ch>,
# Alexis de Lattre <alexis.delattre@akretion.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from . import account_banking_mandate
from . import account_invoice
from . import res_partner_bank
from . import payment_line

View File

@@ -0,0 +1,154 @@
# -*- encoding: utf-8 -*-
##############################################################################
#
# Mandate module for openERP
# Copyright (C) 2014 Compassion CH (http://www.compassion.ch)
# @author: Cyril Sester <csester@compassion.ch>,
# Alexis de Lattre <alexis.delattre@akretion.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from openerp import models, fields, exceptions, api, _
class AccountBankingMandate(models.Model):
''' The banking mandate is attached to a bank account and represents an
authorization that the bank account owner gives to a company for a
specific operation (such as direct debit)
'''
_name = 'account.banking.mandate'
_description = "A generic banking mandate"
_rec_name = 'unique_mandate_reference'
_inherit = ['mail.thread']
_order = 'signature_date desc'
_track = {
'state': {
'account_banking_mandate.mandate_valid': (
lambda self, cr, uid, obj, ctx=None: obj['state'] == 'valid'),
'account_banking_mandate.mandate_expired': (
lambda self, cr, uid, obj, ctx=None:
obj['state'] == 'expired'),
'account_banking_mandate.mandate_cancel': (
lambda self, cr, uid, obj, ctx=None: obj['state'] == 'cancel'),
},
}
def _get_states(self):
return [('draft', 'Draft'),
('valid', 'Valid'),
('expired', 'Expired'),
('cancel', 'Cancelled')]
partner_bank_id = fields.Many2one(
comodel_name='res.partner.bank', string='Bank Account',
track_visibility='onchange')
partner_id = fields.Many2one(
comodel_name='res.partner', related='partner_bank_id.partner_id',
string='Partner', store=True)
company_id = fields.Many2one(
comodel_name='res.company', string='Company', required=True,
default=lambda self: self.env['res.company']._company_default_get(
'account.banking.mandate'))
unique_mandate_reference = fields.Char(
string='Unique Mandate Reference', track_visibility='always',
default='/')
signature_date = fields.Date(string='Date of Signature of the Mandate',
track_visibility='onchange')
scan = fields.Binary(string='Scan of the Mandate')
last_debit_date = fields.Date(string='Date of the Last Debit',
readonly=True)
state = fields.Selection(
_get_states, string='Status', default='draft',
help="Only valid mandates can be used in a payment line. A cancelled "
"mandate is a mandate that has been cancelled by the customer.")
payment_line_ids = fields.One2many(
comodel_name='payment.line', inverse_name='mandate_id',
string="Related Payment Lines")
_sql_constraints = [(
'mandate_ref_company_uniq',
'unique(unique_mandate_reference, company_id)',
'A Mandate with the same reference already exists for this company !')]
@api.one
@api.constrains('signature_date', 'last_debit_date')
def _check_dates(self):
if (self.signature_date and
self.signature_date > fields.Date.context_today(self)):
raise exceptions.Warning(
_("The date of signature of mandate '%s' is in the future !")
% self.unique_mandate_reference)
if (self.signature_date and self.last_debit_date and
self.signature_date > self.last_debit_date):
raise exceptions.Warning(
_("The mandate '%s' can't have a date of last debit before "
"the date of signature.") % self.unique_mandate_reference)
@api.one
@api.constrains('state', 'partner_bank_id')
def _check_valid_state(self):
if self.state == 'valid':
if not self.signature_date:
raise exceptions.Warning(
_("Cannot validate the mandate '%s' without a date of "
"signature.") % self.unique_mandate_reference)
if not self.partner_bank_id:
raise exceptions.Warning(
_("Cannot validate the mandate '%s' because it is not "
"attached to a bank account.") %
self.unique_mandate_reference)
@api.model
def create(self, vals=None):
if vals.get('unique_mandate_reference', '/') == '/':
vals['unique_mandate_reference'] = \
self.env['ir.sequence'].next_by_code('account.banking.mandate')
return super(AccountBankingMandate, self).create(vals)
@api.one
@api.onchange('partner_bank_id')
def mandate_partner_bank_change(self):
self.partner_id = self.partner_bank_id.partner_id
@api.multi
def validate(self):
for mandate in self:
if mandate.state != 'draft':
raise exceptions.Warning(
_('Mandate should be in draft state'))
self.write({'state': 'valid'})
return True
@api.multi
def cancel(self):
for mandate in self:
if mandate.state not in ('draft', 'valid'):
raise exceptions.Warning(
_('Mandate should be in draft or valid state'))
self.write({'state': 'cancel'})
return True
@api.multi
def back2draft(self):
"""Allows to set the mandate back to the draft state.
This is for mandates cancelled by mistake.
"""
for mandate in self:
if mandate.state != 'cancel':
raise exceptions.Warning(
_('Mandate should be in cancel state'))
self.write({'state': 'draft'})
return True

View File

@@ -0,0 +1,33 @@
# -*- encoding: utf-8 -*-
##############################################################################
#
# Mandate module for openERP
# Copyright (C) 2014 Compassion CH (http://www.compassion.ch)
# @author: Cyril Sester <csester@compassion.ch>,
# Alexis de Lattre <alexis.delattre@akretion.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from openerp import models, fields
class AccountInvoice(models.Model):
_inherit = 'account.invoice'
mandate_id = fields.Many2one(
'account.banking.mandate', string='Direct Debit Mandate',
domain=[('state', '=', 'valid')], readonly=True,
states={'draft': [('readonly', False)]})

View File

@@ -0,0 +1,76 @@
# -*- encoding: utf-8 -*-
##############################################################################
#
# Mandate module for openERP
# Copyright (C) 2014 Compassion CH (http://www.compassion.ch)
# @author: Cyril Sester <csester@compassion.ch>,
# Alexis de Lattre <alexis.delattre@akretion.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from openerp import models, fields, api, exceptions, _
class PaymentLine(models.Model):
_inherit = 'payment.line'
mandate_id = fields.Many2one(
comodel_name='account.banking.mandate', string='Direct Debit Mandate',
domain=[('state', '=', 'valid')])
@api.multi
def create(self, vals=None):
"""If the customer invoice has a mandate, take it
otherwise, take the first valid mandate of the bank account
"""
if vals is None:
vals = {}
partner_bank_id = vals.get('bank_id')
move_line_id = vals.get('move_line_id')
if (self.env.context.get('search_payment_order_type') == 'debit'
and 'mandate_id' not in vals):
if move_line_id:
line = self.env['account.move.line'].browse(move_line_id)
if (line.invoice and line.invoice.type == 'out_invoice'
and line.invoice.mandate_id):
vals.update({
'mandate_id': line.invoice.mandate_id.id,
'bank_id': line.invoice.mandate_id.partner_bank_id.id,
})
if partner_bank_id and 'mandate_id' not in vals:
mandates = self.env['account.banking.mandate'].search(
[('partner_bank_id', '=', partner_bank_id),
('state', '=', 'valid')])
if mandates:
vals['mandate_id'] = mandates[0].id
return super(PaymentLine, self).create(vals)
@api.one
@api.constrains('mandate_id', 'bank_id')
def _check_mandate_bank_link(self):
if (self.mandate_id and self.bank_id
and self.mandate_id.partner_bank_id.id !=
self.bank_id.id):
raise exceptions.Warning(
_("The payment line with reference '%s' has the bank account "
"'%s' which is not attached to the mandate '%s' (this "
"mandate is attached to the bank account '%s').") %
(self.name,
self.env['res.partner.bank'].name_get(
[self.bank_id.id])[0][1],
self.mandate_id.unique_mandate_reference,
self.env['res.partner.bank'].name_get(
[self.mandate_id.partner_bank_id.id])[0][1]))

View File

@@ -0,0 +1,34 @@
# -*- encoding: utf-8 -*-
##############################################################################
#
# Mandate module for openERP
# Copyright (C) 2014 Compassion CH (http://www.compassion.ch)
# @author: Cyril Sester <csester@compassion.ch>,
# Alexis de Lattre <alexis.delattre@akretion.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from openerp import models, fields
class ResPartnerBank(models.Model):
_inherit = 'res.partner.bank'
mandate_ids = fields.One2many(
comodel_name='account.banking.mandate', inverse_name='partner_bank_id',
string='Direct Debit Mandates',
help='Banking mandates represents an authorization that the bank '
'account owner gives to a company for a specific operation')

View File

@@ -0,0 +1,3 @@
"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
"access_account_banking_mandate","Full access on account.banking.mandate","model_account_banking_mandate","account_payment.group_account_payment",1,1,1,1
"access_account_banking_mandate_read","Read access on account.banking.mandate","model_account_banking_mandate","base.group_user",1,0,0,0
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_account_banking_mandate Full access on account.banking.mandate model_account_banking_mandate account_payment.group_account_payment 1 1 1 1
3 access_account_banking_mandate_read Read access on account.banking.mandate model_account_banking_mandate base.group_user 1 0 0 0

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

View File

@@ -0,0 +1,36 @@
-
In order to test mandate, I create a partner with a bank account.
Then, I create a mandate, validate it, cancel it and the set it back to draft
I create a partner
-
!record {model: res.partner, id: mandate_partner, view: False}:
name: "Mandate test"
-
I create a partner bank account
-
!record {model: res.partner.bank, id: mandate_partner_bank, view: False}:
state: 'bank'
acc_number: '1234'
partner_id: mandate_partner
-
I create a mandate on 1st January
-
!record {model: account.banking.mandate, id: test_mandate, view: False}:
partner_bank_id: mandate_partner_bank
signature_date: "2014-01-01"
-
I check that the state field is automatically set by default
-
!assert {model: account.banking.mandate, id: test_mandate}:
- state == 'draft'
-
I go through all states by clicking on buttons and check that cancel state is reached
-
!python {model: account.banking.mandate}: |
self.validate(cr, uid, [ref('test_mandate')])
self.cancel(cr, uid, [ref('test_mandate')])
mandate = self.browse(cr, uid, ref('test_mandate'))
assert mandate.state == 'cancel', 'Mandate is not in cancel state'
self.back2draft(cr, uid, [ref('test_mandate')])

View File

@@ -0,0 +1,122 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2013 Akretion (http://www.akretion.com)
@author: Alexis de Lattre <alexis.delattre@akretion.com>
The licence is in the file __openerp__.py
-->
<openerp>
<data>
<record id="view_mandate_form" model="ir.ui.view">
<field name="name">view.mandate.form</field>
<field name="model">account.banking.mandate</field>
<field name="arch" type="xml">
<form string="Banking Mandate" version="7.0">
<header>
<button name="validate" type="object" string="Validate" states="draft" class="oe_highlight"/>
<button name="cancel" type="object" string="Cancel" states="draft,valid"/>
<button name="back2draft" type="object" string="Back to Draft"
states="cancel" groups="account.group_account_manager"
confirm="You should set a mandate back to draft only if you cancelled it by mistake. Do you want to continue?"/>
<field name="state" widget="statusbar"/>
</header>
<sheet>
<div class="oe_title">
<h1>
<field name="unique_mandate_reference"
class="oe_inline"
readonly="1"/>
</h1>
</div>
<group name="main">
<field name="company_id" groups="base.group_multi_company"/>
<field name="partner_bank_id"
invisible="context.get('mandate_bank_partner_view')" />
<field name="partner_id" invisible="context.get('mandate_bank_partner_view')" readonly="True"/>
<field name="signature_date"/>
<field name="scan"/>
<field name="last_debit_date"/>
</group>
<group name="payment_lines" string="Related Payment Lines">
<field name="payment_line_ids" nolabel="1"/>
</group>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids" widget="mail_followers"/>
<field name="message_ids" widget="mail_thread"/>
</div>
</form>
</field>
</record>
<record id="view_mandate_tree" model="ir.ui.view">
<field name="name">view.mandate.tree</field>
<field name="model">account.banking.mandate</field>
<field name="arch" type="xml">
<tree string="Banking Mandate" colors="blue:state=='draft';black:state in ('expired', 'cancel')">
<field name="company_id" groups="base.group_multi_company"/>
<field name="partner_id" invisible="context.get('mandate_bank_partner_view')"/>
<field name="unique_mandate_reference" string="Reference"/>
<field name="signature_date" string="Signature Date"/>
<field name="last_debit_date"/>
<field name="state"/>
</tree>
</field>
</record>
<record id="view_mandate_search" model="ir.ui.view">
<field name="name">view.mandate.search</field>
<field name="model">account.banking.mandate</field>
<field name="arch" type="xml">
<search string="Search Banking Mandates">
<field name="partner_id"/>
<filter name="draft" string="Draft" domain="[('state', '=', 'draft')]" />
<filter name="valid" string="Valid" domain="[('state', '=', 'valid')]" />
<filter name="cancel" string="Cancelled" domain="[('state', '=', 'cancel')]" />
<filter name="expired" string="Expired" domain="[('state', '=', 'expired')]" />
</search>
</field>
</record>
<record id="mandate_action" model="ir.actions.act_window">
<field name="name">Banking Mandates</field>
<field name="res_model">account.banking.mandate</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="help" type="html">
<p class="oe_view_nocontent_create">
Click to create a new Banking Mandate.
</p><p>
A Banking Mandate is a document signed by your customer that gives you the autorization to do one or several operations on his bank account.
</p>
</field>
</record>
<menuitem id="mandate_menu"
parent="account_payment.menu_main_payment"
action="mandate_action"
sequence="20"
/>
<!-- notifications in the chatter -->
<record id="mandate_valid" model="mail.message.subtype">
<field name="name">Mandate Validated</field>
<field name="res_model">account.banking.mandate</field>
<field name="default" eval="False"/>
<field name="description">Banking Mandate Validated</field>
</record>
<record id="mandate_expired" model="mail.message.subtype">
<field name="name">Mandate Expired</field>
<field name="res_model">account.banking.mandate</field>
<field name="default" eval="False"/>
<field name="description">Banking Mandate has Expired</field>
</record>
<record id="mandate_cancel" model="mail.message.subtype">
<field name="name">Mandate Cancelled</field>
<field name="res_model">account.banking.mandate</field>
<field name="default" eval="False"/>
<field name="description">Banking Mandate Cancelled</field>
</record>
</data>
</openerp>

View File

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2013 Akretion (http://www.akretion.com)
@author: Alexis de Lattre <alexis.delattre@akretion.com>
The licence is in the file __openerp__.py
-->
<openerp>
<data>
<record id="invoice_form" model="ir.ui.view">
<field name="name">add.mandate.on.customer.invoice.form</field>
<field name="model">account.invoice</field>
<field name="inherit_id" ref="account.invoice_form"/>
<field name="arch" type="xml">
<field name="partner_bank_id" position="after">
<field name="mandate_id" domain="[('partner_id', '=', partner_id), ('state', '=', 'valid')]" attrs="{'invisible': [('type', '=', 'out_refund')]}"/>
</field>
</field>
</record>
</data>
</openerp>

View File

@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2013 Akretion (http://www.akretion.com)
@author: Alexis de Lattre <alexis.delattre@akretion.com>
The licence is in the file __openerp__.py
-->
<openerp>
<data>
<record id="view_mandate_payment_order_form" model="ir.ui.view">
<field name="name">mandate.payment.order.form</field>
<field name="model">payment.order</field>
<field name="inherit_id" ref="account_payment.view_payment_order_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='line_ids']/form/notebook/page/group/field[@name='bank_id']" position="after">
<field name="mandate_id" domain="[('partner_bank_id', '=', bank_id), ('state', '=', 'valid')]" invisible="context.get('search_payment_order_type')!='debit'" context="{'default_partner_bank_id': bank_id}"/>
<newline />
</xpath>
<xpath expr="//field[@name='line_ids']/tree/field[@name='bank_id']" position="after">
<field name="mandate_id" string="DD Mandate" invisible="context.get('search_payment_order_type')!='debit'"/>
</xpath>
</field>
</record>
</data>
</openerp>

View File

@@ -0,0 +1,48 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2013 Akretion (http://www.akretion.com)
@author: Alexis de Lattre <alexis.delattre@akretion.com>
The licence is in the file __openerp__.py
-->
<openerp>
<data>
<record id="mandate_partner_bank_form" model="ir.ui.view">
<field name="name">mandate.res.partner.bank.form</field>
<field name="model">res.partner.bank</field>
<field name="inherit_id" ref="base.view_partner_bank_form"/>
<field name="arch" type="xml">
<group name="bank" position="after">
<group name="mandates" string="Direct Debit Mandates" colspan="4">
<field name="mandate_ids" context="{'default_partner_bank_id': active_id, 'mandate_bank_partner_view': True}" nolabel="1"/>
</group>
</group>
</field>
</record>
<record id="mandate_partner_bank_tree" model="ir.ui.view">
<field name="name">mandate.res.partner.bank.tree</field>
<field name="model">res.partner.bank</field>
<field name="inherit_id" ref="base.view_partner_bank_tree"/>
<field name="arch" type="xml">
<field name="partner_id" position="after">
<field name="mandate_ids" string="DD Mandates"/>
</field>
</field>
</record>
<!-- add number of mandates in this list of bank accounts
on the partner form -->
<record id="mandate_partner_form" model="ir.ui.view">
<field name="name">mandate.partner.form</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="account.view_partner_property_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='bank_ids']/tree/field[@name='owner_name']" position="after">
<field name="mandate_ids" string="DD Mandates"/>
</xpath>
</field>
</record>
</data>
</openerp>