banking-addons-team team mailing list archive
-
banking-addons-team team
-
Mailing list archive
-
Message #02048
Re: [Merge] lp:~compassion/banking-addons/banking-addons-mandate into lp:banking-addons
Review: Needs Fixing
See my comments inline
Diff comments:
> === added directory 'account_banking_mandate'
> === added file 'account_banking_mandate/__init__.py'
> --- account_banking_mandate/__init__.py 1970-01-01 00:00:00 +0000
> +++ account_banking_mandate/__init__.py 2014-06-25 11:54:20 +0000
> @@ -0,0 +1,22 @@
> +# -*- encoding: utf-8 -*-
> +##############################################################################
> +#
> +# Mandate module for openERP
> +# Copyright (C) 2014 Compassion CH (http://www.compassion.ch)
> +# @author: Cyril Sester <csester@xxxxxxxxxxxxx>
> +#
> +# 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/>.
> +#
> +##############################################################################
> +import model
> \ No newline at end of file
>
> === added file 'account_banking_mandate/__openerp__.py'
> --- account_banking_mandate/__openerp__.py 1970-01-01 00:00:00 +0000
> +++ account_banking_mandate/__openerp__.py 2014-06-25 11:54:20 +0000
> @@ -0,0 +1,46 @@
> +# -*- encoding: utf-8 -*-
> +##############################################################################
> +#
> +# Mandate module for openERP
> +# Copyright (C) 2014 Compassion CH (http://www.compassion.ch)
> +# @author: Cyril Sester <csester@xxxxxxxxxxxxx>
> +#
> +# 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': 'Direct Debit mandate',
> + 'version': '0.1',
> + 'license': 'AGPL-3',
> + 'author': 'Compassion CH',
> + 'website': 'http://www.compassion.ch',
> + 'category': 'Banking addons',
> + 'depends': ['account_direct_debit'],
I will try only to depends on account_banking
> + 'external_dependencies': {},
> + 'data': [
> + 'view/account_banking_mandate_view.xml',
> + 'view/account_invoice_view.xml',
> + 'view/account_payment_view.xml',
> + 'view/res_partner_bank_view.xml',
> + 'data/mandate_reference_sequence.xml',
> + ],
> + 'demo': [],
> + 'description': '''
White space at the end/PEP(
> +This module adds a generic model for direct debit mandates. These mandates can be specialized to
For banking mandates
> +fit any direct debit mandate (such as sepa or lsv).
> + ''',
> + 'active': False,
> + 'installable': True,
> +}
>
> === added directory 'account_banking_mandate/data'
> === renamed file 'account_banking_sepa_direct_debit/data/mandate_reference_sequence.xml' => 'account_banking_mandate/data/mandate_reference_sequence.xml'
> --- account_banking_sepa_direct_debit/data/mandate_reference_sequence.xml 2013-10-22 22:25:06 +0000
> +++ account_banking_mandate/data/mandate_reference_sequence.xml 2014-06-25 11:54:20 +0000
> @@ -3,14 +3,14 @@
> <data noupdate="1">
>
>
> -<record id="sdd_mandate_seq_type" model="ir.sequence.type">
> - <field name="name">SDD Mandate Reference</field>
> - <field name="code">sdd.mandate.reference</field>
> +<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>
You should not Change sequence name as some code may rely on it, even if it is a bad practice.
>
> -<record id="sdd_mandate_seq" model="ir.sequence">
> - <field name="name">SDD Mandate Reference</field>
> - <field name="code">sdd.mandate.reference</field>
> +<record id="dd_mandate_seq" model="ir.sequence">
> + <field name="name">DD Mandate Reference</field>
> + <field name="code">account.banking.mandate</field>
You should not Change sequence name as some code may rely on it, even if it is a bad practice.
> <field name="prefix">RUM</field>
> <field name="padding" eval="7"/>
> <!-- remember that max size for the mandate ref is 35 -->
>
> === added directory 'account_banking_mandate/model'
> === added file 'account_banking_mandate/model/__init__.py'
> --- account_banking_mandate/model/__init__.py 1970-01-01 00:00:00 +0000
> +++ account_banking_mandate/model/__init__.py 2014-06-25 11:54:20 +0000
> @@ -0,0 +1,22 @@
> +# -*- encoding: utf-8 -*-
> +##############################################################################
> +#
> +# Mandate module for openERP
> +# Copyright (C) 2014 Compassion CH (http://www.compassion.ch)
> +# @author: Cyril Sester <csester@xxxxxxxxxxxxx>
> +#
> +# 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/>.
> +#
> +##############################################################################
> +import account_banking_mandate
> \ No newline at end of file
from . import account_banking_mandat
>
> === added file 'account_banking_mandate/model/account_banking_mandate.py'
> --- account_banking_mandate/model/account_banking_mandate.py 1970-01-01 00:00:00 +0000
> +++ account_banking_mandate/model/account_banking_mandate.py 2014-06-25 11:54:20 +0000
> @@ -0,0 +1,261 @@
> +# -*- encoding: utf-8 -*-
> +##############################################################################
> +#
> +# Mandate module for openERP
> +# Copyright (C) 2014 Compassion CH (http://www.compassion.ch)
> +# @author: Cyril Sester <csester@xxxxxxxxxxxxx>
> +#
Do not forget initial autor name
> +# 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.osv import orm, fields
> +from openerp.tools.translate import _
> +from datetime import datetime
> +import logging
> +
Standard library import should be atop
> +logger = logging.getLogger(__name__)
> +
> +class mandate(orm.Model):
> + '''Direct Debit Mandate'''
I will use """Banking Mandate""" and add more doc
> + _name = 'account.banking.mandate'
> + _description = __doc__
This is a common idiom that can be dangerous if some one chnage the docstring and put a long paragraph. The description fields of the model is limited in size
> + _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',
> + },
> + }
> +
> + _columns = {
> + 'partner_bank_id': fields.many2one(
> + 'res.partner.bank', 'Bank Account', track_visibility='onchange'),
> + 'partner_id': fields.related(
> + 'partner_bank_id', 'partner_id', type='many2one',
> + relation='res.partner', string='Partner', readonly=True),
> + 'company_id': fields.many2one('res.company', 'Company', required=True),
> + 'unique_mandate_reference': fields.char(
> + 'Unique Mandate Reference', size=35, readonly=True,
> + track_visibility='always'),
> + 'signature_date': fields.date(
> + 'Date of Signature of the Mandate', track_visibility='onchange'),
> + 'scan': fields.binary('Scan of the Mandate'),
> + 'last_debit_date': fields.date(
> + 'Date of the Last Debit', readonly=True),
> + 'state': fields.selection([
As it is intended to be extended it would be nice to add a hook function to allow polite inheritance of selection field
> + ('draft', 'Draft'),
> + ('valid', 'Valid'),
> + ('expired', 'Expired'),
> + ('cancel', 'Cancelled'),
> + ], 'Status',
> + 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(
> + 'payment.line', 'mandate_id', "Related Payment Lines"),
> + }
> +
> + _defaults = {
> + 'company_id': lambda self, cr, uid, context:
> + self.pool['res.company']._company_default_get(
> + cr, uid, 'account.banking.mandate', context=context),
> + 'state': 'draft',
> + 'unique_mandate_reference': '/',
> + }
> +
> + _sql_constraints = [(
> + 'mandate_ref_company_uniq',
> + 'unique(unique_mandate_reference, company_id)',
> + 'A Mandate with the same reference already exists for this company !'
> + )]
> +
> + def create(self, cr, uid, vals, context=None):
> + if vals.get('unique_mandate_reference', '/') == '/':
> + vals['unique_mandate_reference'] = \
We can add intermediate variable for redability
> + self.pool['ir.sequence'].next_by_code(
> + cr, uid, 'account.banking.mandate', context=context)
> + return super(mandate, self).create(cr, uid, vals, context=context)
> +
> + def _check_mandate(self, cr, uid, ids):
> + for mandate in self.browse(cr, uid, ids):
We may split this function to be more code polite
> + if (mandate.signature_date and
> + mandate.signature_date >
> + datetime.today().strftime('%Y-%m-%d')):
> + raise orm.except_orm(
> + _('Error:'),
> + _("The date of signature of mandate '%s' is in the "
> + "future !")
> + % mandate.unique_mandate_reference)
> + if mandate.state == 'valid' and not mandate.signature_date:
> + raise orm.except_orm(
> + _('Error:'),
> + _("Cannot validate the mandate '%s' without a date of "
> + "signature.")
> + % mandate.unique_mandate_reference)
> + if mandate.state == 'valid' and not mandate.partner_bank_id:
> + raise orm.except_orm(
> + _('Error:'),
> + _("Cannot validate the mandate '%s' because it is not "
> + "attached to a bank account.")
> + % mandate.unique_mandate_reference)
> +
> + if (mandate.signature_date and mandate.last_debit_date and
> + mandate.signature_date > mandate.last_debit_date):
> + raise orm.except_orm(
> + _('Error:'),
> + _("The mandate '%s' can't have a date of last debit "
> + "before the date of signature.")
> + % mandate.unique_mandate_reference)
> + return True
> +
> + _constraints = [
> + (_check_mandate, "Error msg in raise", [
> + 'last_debit_date', 'signature_date', 'state', 'partner_bank_id',
> + ]),
> + ]
> +
> + def mandate_partner_bank_change(
> + self, cr, uid, ids, partner_bank_id, last_debit_date, state):
context is missing
> + res = {'value': {}}
> + if partner_bank_id:
> + partner_bank_read = self.pool['res.partner.bank'].read(
> + cr, uid, partner_bank_id, ['partner_id'])['partner_id']
> + if partner_bank_read:
> + res['value']['partner_id'] = partner_bank_read[0]
> + return res
> +
> + def validate(self, cr, uid, ids, context=None):
> + to_validate_ids = []
> + for mandate in self.browse(cr, uid, ids, context=context):
> + assert mandate.state == 'draft', 'Mandate should be in draft state'
> + to_validate_ids.append(mandate.id)
> + self.write(
> + cr, uid, to_validate_ids, {'state': 'valid'}, context=context)
> + return True
> +
> + def cancel(self, cr, uid, ids, context=None):
> + to_cancel_ids = []
> + for mandate in self.browse(cr, uid, ids, context=context):
> + assert mandate.state in ('draft', 'valid'),\
> + 'Mandate should be in draft or valid state'
> + to_cancel_ids.append(mandate.id)
> + self.write(
> + cr, uid, to_cancel_ids, {'state': 'cancel'}, context=context)
> + return True
> +
> + def back2draft(self, cr, uid, ids, context=None):
> + to_draft_ids = []
> + for mandate in self.browse(cr, uid, ids, context=context):
> + assert mandate.state == 'cancel',\
> + 'Mandate should be in cancel state'
> + to_draft_ids.append(mandate.id)
> + self.write(
> + cr, uid, to_draft_ids, {'state': 'draft'}, context=context)
> + return True
> +
We may split in a separate module partner_bank.py
> +class res_partner_bank(orm.Model):
> + _inherit = 'res.partner.bank'
> +
> + #Add mandate references on bank account (a bank account can have several mandates)
> + _columns = {
> + 'mandate_ids': fields.one2many(
> + 'account.banking.mandate', 'partner_bank_id', 'Direct Debit Mandates'),
Banking Mandates
> + }
> +
> +class payment_line(orm.Model):
> + _inherit = 'payment.line'
> +
> + #Add mandate reference on payment line (several payment line can referer to same mandate)
> + _columns = {
> + 'mandate_id': fields.many2one(
> + 'account.banking.mandate', 'Direct Debit Mandate',
> + domain=[('state', '=', 'valid')]),
> + }
> +
> + def create(self, cr, uid, vals, context=None):
Why not use _defaults. Ok I get it context is not passed in _defaults. A comment would be nice
> + '''If the customer invoice has a mandate, take it
> + otherwise, take the first valid mandate of the bank account'''
> + if context is None:
> + context = {}
> + if not vals:
> + vals = {}
> + partner_bank_id = vals.get('bank_id')
> + move_line_id = vals.get('move_line_id')
> + if (context.get('default_payment_order_type') == 'debit'
> + and 'mandate_id' not in vals):
> + if move_line_id:
> + line = self.pool['account.move.line'].browse(
> + cr, uid, move_line_id, context=context)
> + 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:
> + mandate_ids = self.pool['account.banking.mandate'].search(cr, uid, [
> + ('partner_bank_id', '=', partner_bank_id),
> + ('state', '=', 'valid'),
> + ], context=context)
> + if mandate_ids:
> + vals['mandate_id'] = mandate_ids[0]
> + return super(payment_line, self).create(cr, uid, vals, context=context)
> +
> + def _check_mandate_bank_link(self, cr, uid, ids):
> + for payline in self.browse(cr, uid, ids):
> + if (payline.mandate_id and payline.bank_id
> + and payline.mandate_id.partner_bank_id.id !=
> + payline.bank_id.id):
> + raise orm.except_orm(
> + _('Error:'),
> + _("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').") % (
> + payline.name,
> + self.pool['res.partner.bank'].name_get(
> + cr, uid, [payline.bank_id.id])[0][1],
> + payline.mandate_id.unique_mandate_reference,
> + self.pool['res.partner.bank'].name_get(
> + cr, uid,
> + [payline.mandate_id.partner_bank_id.id])[0][1],
> + ))
> + return True
> +
> + _constraints = [
> + (_check_mandate_bank_link, 'Error msg in raise',
> + ['mandate_id', 'bank_id']),
> + ]
> +
> +
Wy may split this one into account_invoice.py
> +class account_invoice(orm.Model):
> + _inherit = 'account.invoice'
> +
> + _columns = {
> + 'mandate_id': fields.many2one(
> + 'account.banking.mandate', 'Direct Debit Mandate',
> + domain=[('state', '=', 'valid')], readonly=True,
> + states={'draft': [('readonly', False)]})
> + }
>
> === added directory 'account_banking_mandate/view'
> === renamed file 'account_banking_sepa_direct_debit/sdd_mandate_view.xml' => 'account_banking_mandate/view/account_banking_mandate_view.xml'
We may want to duplicate the view instead of moving it and inherit it.
We may break code that relies on this view. That said I prefer the actual proposition.
We may do a search or a post on mailing list to see if there is some code that inherit
those views before keeping old views. Just tell me if you want me to do it
> --- account_banking_sepa_direct_debit/sdd_mandate_view.xml 2014-06-11 22:03:21 +0000
> +++ account_banking_mandate/view/account_banking_mandate_view.xml 2014-06-25 11:54:20 +0000
> @@ -7,11 +7,11 @@
> <openerp>
> <data>
>
> -<record id="sdd_mandate_form" model="ir.ui.view">
> - <field name="name">sdd.mandate.form</field>
> - <field name="model">sdd.mandate</field>
> +<record id="dd_mandate_form" model="ir.ui.view">
> + <field name="name">dd.mandate.form</field>
> + <field name="model">account.banking.mandate</field>
> <field name="arch" type="xml">
> - <form string="SEPA Direct Debit Mandate" version="7.0">
> + <form string="Direct Debit 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"/>
> @@ -29,17 +29,13 @@
> <group name="main">
> <field name="company_id" groups="base.group_multi_company"/>
> <field name="partner_bank_id"
> - on_change="mandate_partner_bank_change(partner_bank_id, type, recurrent_sequence_type, last_debit_date, state)"
> - invisible="context.get('sdd_mandate_bank_partner_view')"
> + on_change="mandate_partner_bank_change(partner_bank_id, last_debit_date, state)"
> + invisible="context.get('dd_mandate_bank_partner_view')"
> />
> - <field name="partner_id" invisible="context.get('sdd_mandate_bank_partner_view')"/>
> - <field name="type" on_change="mandate_type_change(type)"/>
> - <field name="recurrent_sequence_type" attrs="{'invisible': [('type', '=', 'oneoff')], 'required': [('type', '=', 'recurrent')]}"/>
> + <field name="partner_id" invisible="context.get('dd_mandate_bank_partner_view')"/>
> <field name="signature_date"/>
> <field name="scan"/>
> <field name="last_debit_date"/>
> - <field name="sepa_migrated" groups="account_banking_sepa_direct_debit.group_original_mandate_required"/>
> - <field name="original_mandate_identification" attrs="{'invisible': [('sepa_migrated', '=', True)], 'required': [('sepa_migrated', '=', False)]}" groups="account_banking_sepa_direct_debit.group_original_mandate_required"/>
> </group>
> <group name="payment_lines" string="Related Payment Lines">
> <field name="payment_line_ids" nolabel="1"/>
> @@ -53,15 +49,14 @@
> </field>
> </record>
>
> -<record id="sdd_mandate_tree" model="ir.ui.view">
> - <field name="name">sdd.mandate.tree</field>
> - <field name="model">sdd.mandate</field>
> +<record id="dd_mandate_tree" model="ir.ui.view">
> + <field name="name">dd.mandate.tree</field>
> + <field name="model">account.banking.mandate</field>
> <field name="arch" type="xml">
> - <tree string="SEPA Direct Debit Mandate" colors="blue:state=='draft';black:state in ('expired', 'cancel')">
> + <tree string="Direct Debit 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('sdd_mandate_bank_partner_view')"/>
> + <field name="partner_id" invisible="context.get('dd_mandate_bank_partner_view')"/>
> <field name="unique_mandate_reference" string="Reference"/>
> - <field name="type" string="Type"/>
> <field name="signature_date" string="Signature Date"/>
> <field name="last_debit_date"/>
> <field name="state"/>
> @@ -69,83 +64,60 @@
> </field>
> </record>
>
> -<record id="sdd_mandate_search" model="ir.ui.view">
> - <field name="name">sdd.mandate.search</field>
> - <field name="model">sdd.mandate</field>
> +<record id="dd_mandate_search" model="ir.ui.view">
> + <field name="name">dd.mandate.search</field>
> + <field name="model">account.banking.mandate</field>
> <field name="arch" type="xml">
> - <search string="Search SEPA Direct Debit Mandates">
> + <search string="Search Direct Debit Mandates">
I will remove allusion to direct debit but use Banking Mandate
> <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')]" />
> - <filter name="oneoff" string="One-Off" domain="[('type', '=', 'oneoff')]" />
> - <filter name="recurrent" string="Recurrent" domain="[('type', '=', 'recurrent')]" />
> </search>
> </field>
> </record>
>
> -<record id="sdd_mandate_action" model="ir.actions.act_window">
> - <field name="name">SEPA Direct Debit Mandates</field>
> - <field name="res_model">sdd.mandate</field>
> +<record id="dd_mandate_action" model="ir.actions.act_window">
> + <field name="name">Direct Debit 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 SEPA Direct Debit Mandate.
> + Click to create a new Direct Debit Mandate.
> </p><p>
> - A SEPA Direct Debit Mandate is a document signed by your customer that gives you the autorization to do one or several direct debits on his bank account.
> + A Direct Debit Mandate is a document signed by your customer that gives you the autorization to do one or several direct debits on his bank account.
> </p>
> </field>
> </record>
>
> -<menuitem id="sdd_mandate_menu"
> +<menuitem id="dd_mandate_menu"
> parent="account_payment.menu_main_payment"
> - action="sdd_mandate_action"
> + action="dd_mandate_action"
> sequence="20"
> />
>
> -<!-- notifications in the chatter -->
> +<!-- notifications statuses in the chatter -->
> <record id="mandate_valid" model="mail.message.subtype">
> <field name="name">Mandate Validated</field>
> - <field name="res_model">sdd.mandate</field>
> + <field name="res_model">account.banking.mandate</field>
> <field name="default" eval="False"/>
> - <field name="description">SEPA Direct Debit Mandate Validated</field>
> + <field name="description">Direct Debit Mandate Validated</field>
> </record>
>
> <record id="mandate_expired" model="mail.message.subtype">
> <field name="name">Mandate Expired</field>
> - <field name="res_model">sdd.mandate</field>
> + <field name="res_model">account.banking.mandate</field>
> <field name="default" eval="False"/>
> - <field name="description">SEPA Direct Debit Mandate has Expired</field>
> + <field name="description">Direct Debit Mandate has Expired</field>
> </record>
>
> <record id="mandate_cancel" model="mail.message.subtype">
> <field name="name">Mandate Cancelled</field>
> - <field name="res_model">sdd.mandate</field>
> - <field name="default" eval="False"/>
> - <field name="description">SEPA Direct Debit Mandate Cancelled</field>
> -</record>
> -
> -<record id="recurrent_sequence_type_first" model="mail.message.subtype">
> - <field name="name">Sequence Type set to First</field>
> - <field name="res_model">sdd.mandate</field>
> - <field name="default" eval="False"/>
> - <field name="description">Sequence Type set to First</field>
> -</record>
> -
> -<record id="recurrent_sequence_type_recurring" model="mail.message.subtype">
> - <field name="name">Sequence Type set to Recurring</field>
> - <field name="res_model">sdd.mandate</field>
> - <field name="default" eval="False"/>
> - <field name="description">Sequence Type set to Recurring</field>
> -</record>
> -
> -<record id="recurrent_sequence_type_final" model="mail.message.subtype">
> - <field name="name">Sequence Type set to Final</field>
> - <field name="res_model">sdd.mandate</field>
> - <field name="default" eval="False"/>
> - <field name="description">Sequence Type set to Final</field>
> + <field name="res_model">account.banking.mandate</field>
> + <field name="default" eval="False"/>
> + <field name="description">Direct Debit Mandate Cancelled</field>
> </record>
>
> </data>
>
> === renamed file 'account_banking_sepa_direct_debit/account_invoice_view.xml' => 'account_banking_mandate/view/account_invoice_view.xml'
> --- account_banking_sepa_direct_debit/account_invoice_view.xml 2013-11-09 14:05:07 +0000
Same remark as before we should try not to break the views
> +++ account_banking_mandate/view/account_invoice_view.xml 2014-06-25 11:54:20 +0000
> @@ -8,12 +8,12 @@
> <data>
>
> <record id="invoice_form" model="ir.ui.view">
> - <field name="name">add.sdd.mandate.on.customer.invoice.form</field>
> + <field name="name">add.dd.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="sdd_mandate_id" domain="[('partner_id', '=', partner_id), ('state', '=', 'valid')]" attrs="{'invisible': [('type', '=', 'out_refund')]}"/>
> + <field name="mandate_id" domain="[('partner_id', '=', partner_id), ('state', '=', 'valid')]" attrs="{'invisible': [('type', '=', 'out_refund')]}"/>
> </field>
> </field>
> </record>
>
> === renamed file 'account_banking_sepa_direct_debit/account_payment_view.xml' => 'account_banking_mandate/view/account_payment_view.xml'
> --- account_banking_sepa_direct_debit/account_payment_view.xml 2013-11-11 10:56:49 +0000
> +++ account_banking_mandate/view/account_payment_view.xml 2014-06-25 11:54:20 +0000
> @@ -7,17 +7,17 @@
> <openerp>
> <data>
>
> -<record id="sdd_view_payment_order_form" model="ir.ui.view">
> - <field name="name">sdd.payment.order.form</field>
> +<record id="dd_view_payment_order_form" model="ir.ui.view">
> + <field name="name">dd.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="sdd_mandate_id" domain="[('partner_bank_id', '=', bank_id), ('state', '=', 'valid')]" invisible="context.get('default_payment_order_type')!='debit'" context="{'default_partner_bank_id': bank_id}"/>
> + <field name="mandate_id" domain="[('partner_bank_id', '=', bank_id), ('state', '=', 'valid')]" invisible="context.get('default_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="sdd_mandate_id" string="SDD Mandate" invisible="context.get('default_payment_order_type')!='debit'"/>
> + <field name="mandate_id" string="DD Mandate" invisible="context.get('default_payment_order_type')!='debit'"/>
> </xpath>
> </field>
> </record>
>
> === renamed file 'account_banking_sepa_direct_debit/res_partner_bank_view.xml' => 'account_banking_mandate/view/res_partner_bank_view.xml'
> --- account_banking_sepa_direct_debit/res_partner_bank_view.xml 2013-11-11 10:56:49 +0000
> +++ account_banking_mandate/view/res_partner_bank_view.xml 2014-06-25 11:54:20 +0000
> @@ -7,39 +7,38 @@
> <openerp>
> <data>
>
> -<record id="sdd_mandate_partner_bank_form" model="ir.ui.view">
> - <field name="name">sdd.mandate.res.partner.bank.form</field>
> +<record id="dd_mandate_partner_bank_form" model="ir.ui.view">
> + <field name="name">dd.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="sdd_mandates" string="SEPA Direct Debit Mandates" colspan="4">
> - <field name="sdd_mandate_ids" context="{'default_partner_bank_id': active_id, 'sdd_mandate_bank_partner_view': True}" nolabel="1"/>
> + <group name="dd_mandates" string="Direct Debit Mandates" colspan="4">
> + <field name="mandate_ids" context="{'default_partner_bank_id': active_id, 'dd_mandate_bank_partner_view': True}" nolabel="1"/>
> </group>
> </group>
> </field>
> </record>
>
> -<record id="sdd_mandate_partner_bank_tree" model="ir.ui.view">
> - <field name="name">sdd.mandate.res.partner.bank.tree</field>
> +<record id="dd_mandate_partner_bank_tree" model="ir.ui.view">
> + <field name="name">dd.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="sdd_mandate_ids" string="SDD Mandates"/>
> + <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="sdd_mandate_partner_form" model="ir.ui.view">
> - <field name="name">sdd.mandate.partner.form</field>
> +<!-- add number of mandates in this list of bank accounts on the partner form -->
> +<record id="dd_mandate_partner_form" model="ir.ui.view">
> + <field name="name">dd.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="sdd_mandate_ids" string="SDD Mandates"/>
> + <field name="mandate_ids" string="DD Mandates"/>
> </xpath>
> </field>
> </record>
>
> === modified file 'account_banking_sepa_direct_debit/__openerp__.py'
> --- account_banking_sepa_direct_debit/__openerp__.py 2014-03-12 22:18:33 +0000
> +++ account_banking_sepa_direct_debit/__openerp__.py 2014-06-25 11:54:20 +0000
> @@ -27,7 +27,7 @@
> 'author': 'Akretion',
> 'website': 'http://www.akretion.com',
> 'category': 'Banking addons',
> - 'depends': ['account_direct_debit', 'account_banking_pain_base'],
> + 'depends': ['account_banking_mandate', 'account_banking_pain_base'],
> 'external_dependencies': {
> 'python': ['unidecode', 'lxml'],
> },
> @@ -35,14 +35,10 @@
> 'security/original_mandate_required_security.xml',
> 'account_banking_sdd_view.xml',
> 'sdd_mandate_view.xml',
> - 'res_partner_bank_view.xml',
> - 'account_payment_view.xml',
> 'company_view.xml',
> 'mandate_expire_cron.xml',
> - 'account_invoice_view.xml',
> 'wizard/export_sdd_view.xml',
> 'data/payment_type_sdd.xml',
> - 'data/mandate_reference_sequence.xml',
> 'security/ir.model.access.csv',
> ],
> 'demo': ['sepa_direct_debit_demo.xml'],
>
> === modified file 'account_banking_sepa_direct_debit/account_banking_sdd.py'
> --- account_banking_sepa_direct_debit/account_banking_sdd.py 2014-06-23 09:47:01 +0000
> +++ account_banking_sepa_direct_debit/account_banking_sdd.py 2014-06-25 11:54:20 +0000
> @@ -32,7 +32,6 @@
>
> logger = logging.getLogger(__name__)
>
> -
> class banking_export_sdd(orm.Model):
> '''SEPA Direct Debit export'''
> _name = 'banking.export.sdd'
> @@ -100,23 +99,10 @@
>
> class sdd_mandate(orm.Model):
> '''SEPA Direct Debit Mandate'''
> - _name = 'sdd.mandate'
> _description = __doc__
> - _rec_name = 'unique_mandate_reference'
> - _inherit = ['mail.thread']
> - _order = 'signature_date desc'
> + _name = 'account.banking.mandate'
The _name must not be changed else code relying on it will crash and it will also require to do a migration script as table will be renamed in exisiting database.
> + _inherit = 'account.banking.mandate'
> _track = {
> - 'state': {
> - 'account_banking_sepa_direct_debit.mandate_valid':
> - lambda self, cr, uid, obj, ctx=None:
> - obj['state'] == 'valid',
> - 'account_banking_sepa_direct_debit.mandate_expired':
> - lambda self, cr, uid, obj, ctx=None:
> - obj['state'] == 'expired',
> - 'account_banking_sepa_direct_debit.mandate_cancel':
> - lambda self, cr, uid, obj, ctx=None:
> - obj['state'] == 'cancel',
> - },
> 'recurrent_sequence_type': {
> 'account_banking_sepa_direct_debit.recurrent_sequence_type_first':
> lambda self, cr, uid, obj, ctx=None:
> @@ -132,15 +118,6 @@
> }
>
> _columns = {
> - 'partner_bank_id': fields.many2one(
> - 'res.partner.bank', 'Bank Account', track_visibility='onchange'),
> - 'partner_id': fields.related(
> - 'partner_bank_id', 'partner_id', type='many2one',
> - relation='res.partner', string='Partner', readonly=True),
> - 'company_id': fields.many2one('res.company', 'Company', required=True),
> - 'unique_mandate_reference': fields.char(
> - 'Unique Mandate Reference', size=35, readonly=True,
> - track_visibility='always'),
> 'type': fields.selection([
> ('recurrent', 'Recurrent'),
> ('oneoff', 'One-Off'),
> @@ -152,24 +129,6 @@
> ], 'Sequence Type for Next Debit', track_visibility='onchange',
> help="This field is only used for Recurrent mandates, not for "
> "One-Off mandates."),
> - 'signature_date': fields.date(
> - 'Date of Signature of the Mandate', track_visibility='onchange'),
> - 'scan': fields.binary('Scan of the Mandate'),
> - 'last_debit_date': fields.date(
> - 'Date of the Last Debit', readonly=True),
> - 'state': fields.selection([
> - ('draft', 'Draft'),
> - ('valid', 'Valid'),
> - ('expired', 'Expired'),
> - ('cancel', 'Cancelled'),
> - ], 'Status',
> - help="Only valid mandates can be used in a payment line. A "
> - "cancelled mandate is a mandate that has been cancelled by "
> - "the customer. A one-off mandate expires after its first use. "
> - "A recurrent mandate expires after it's final use or if it "
> - "hasn't been used for 36 months."),
> - 'payment_line_ids': fields.one2many(
> - 'payment.line', 'sdd_mandate_id', "Related Payment Lines"),
> 'sepa_migrated': fields.boolean(
> 'Migrated to SEPA', track_visibility='onchange',
> help="If this field is not active, the mandate section of the "
> @@ -188,57 +147,11 @@
> }
>
> _defaults = {
> - 'company_id': lambda self, cr, uid, context:
> - self.pool['res.company']._company_default_get(
> - cr, uid, 'sdd.mandate', context=context),
> - 'unique_mandate_reference': '/',
> - 'state': 'draft',
> 'sepa_migrated': True,
> }
>
> - _sql_constraints = [(
> - 'mandate_ref_company_uniq',
> - 'unique(unique_mandate_reference, company_id)',
> - 'A Mandate with the same reference already exists for this company !'
> - )]
> -
> - def create(self, cr, uid, vals, context=None):
> - if vals.get('unique_mandate_reference', '/') == '/':
> - vals['unique_mandate_reference'] = \
> - self.pool['ir.sequence'].next_by_code(
> - cr, uid, 'sdd.mandate.reference', context=context)
> - return super(sdd_mandate, self).create(cr, uid, vals, context=context)
> -
> def _check_sdd_mandate(self, cr, uid, ids):
> for mandate in self.browse(cr, uid, ids):
> - if (mandate.signature_date and
> - mandate.signature_date >
> - datetime.today().strftime('%Y-%m-%d')):
> - raise orm.except_orm(
> - _('Error:'),
> - _("The date of signature of mandate '%s' is in the "
> - "future !")
> - % mandate.unique_mandate_reference)
> - if mandate.state == 'valid' and not mandate.signature_date:
> - raise orm.except_orm(
> - _('Error:'),
> - _("Cannot validate the mandate '%s' without a date of "
> - "signature.")
> - % mandate.unique_mandate_reference)
> - if mandate.state == 'valid' and not mandate.partner_bank_id:
> - raise orm.except_orm(
> - _('Error:'),
> - _("Cannot validate the mandate '%s' because it is not "
> - "attached to a bank account.")
> - % mandate.unique_mandate_reference)
> -
> - if (mandate.signature_date and mandate.last_debit_date and
> - mandate.signature_date > mandate.last_debit_date):
> - raise orm.except_orm(
> - _('Error:'),
> - _("The mandate '%s' can't have a date of last debit "
> - "before the date of signature.")
> - % mandate.unique_mandate_reference)
> if (mandate.type == 'recurrent'
> and not mandate.recurrent_sequence_type):
> raise orm.except_orm(
> @@ -265,7 +178,6 @@
>
> _constraints = [
> (_check_sdd_mandate, "Error msg in raise", [
> - 'last_debit_date', 'signature_date', 'state', 'partner_bank_id',
> 'type', 'recurrent_sequence_type', 'sepa_migrated',
> 'original_mandate_identification',
> ]),
> @@ -282,12 +194,8 @@
> def mandate_partner_bank_change(
> self, cr, uid, ids, partner_bank_id, type, recurrent_sequence_type,
> last_debit_date, state):
> - res = {'value': {}}
> - if partner_bank_id:
> - partner_bank_read = self.pool['res.partner.bank'].read(
> - cr, uid, partner_bank_id, ['partner_id'])['partner_id']
> - if partner_bank_read:
> - res['value']['partner_id'] = partner_bank_read[0]
> + res = super(sdd_mandate, self).mandate_partner_bank_change(cr, uid,
> + ids, partner_bank_id, last_debit_date, state)
> if (state == 'valid' and partner_bank_id
> and type == 'recurrent'
> and recurrent_sequence_type != 'first'):
> @@ -301,35 +209,6 @@
> }
> return res
>
> - def validate(self, cr, uid, ids, context=None):
> - to_validate_ids = []
> - for mandate in self.browse(cr, uid, ids, context=context):
> - assert mandate.state == 'draft', 'Mandate should be in draft state'
> - to_validate_ids.append(mandate.id)
> - self.write(
> - cr, uid, to_validate_ids, {'state': 'valid'}, context=context)
> - return True
> -
> - def cancel(self, cr, uid, ids, context=None):
> - to_cancel_ids = []
> - for mandate in self.browse(cr, uid, ids, context=context):
> - assert mandate.state in ('draft', 'valid'),\
> - 'Mandate should be in draft or valid state'
> - to_cancel_ids.append(mandate.id)
> - self.write(
> - cr, uid, to_cancel_ids, {'state': 'cancel'}, context=context)
> - return True
> -
> - def back2draft(self, cr, uid, ids, context=None):
> - to_draft_ids = []
> - for mandate in self.browse(cr, uid, ids, context=context):
> - assert mandate.state == 'cancel',\
> - 'Mandate should be in cancel state'
> - to_draft_ids.append(mandate.id)
> - self.write(
> - cr, uid, to_draft_ids, {'state': 'draft'}, context=context)
> - return True
> -
> def _sdd_mandate_set_state_to_expired(self, cr, uid, context=None):
> logger.info('Searching for SDD Mandates that must be set to Expired')
> expire_limit_date = datetime.today() + \
> @@ -351,90 +230,4 @@
> % expired_mandate_ids)
> else:
> logger.info('0 SDD Mandates must be set to Expired')
> - return True
> -
> -
> -class res_partner_bank(orm.Model):
> - _inherit = 'res.partner.bank'
> -
> - _columns = {
> - 'sdd_mandate_ids': fields.one2many(
> - 'sdd.mandate', 'partner_bank_id', 'SEPA Direct Debit Mandates'),
> - }
> -
> -
> -class payment_line(orm.Model):
> - _inherit = 'payment.line'
> -
> - _columns = {
> - 'sdd_mandate_id': fields.many2one(
> - 'sdd.mandate', 'SEPA Direct Debit Mandate',
> - domain=[('state', '=', 'valid')]),
> - }
> -
> - def create(self, cr, uid, vals, context=None):
> - '''If the customer invoice has a mandate, take it
> - otherwise, take the first valid mandate of the bank account'''
> - if context is None:
> - context = {}
> - if not vals:
> - vals = {}
> - partner_bank_id = vals.get('bank_id')
> - move_line_id = vals.get('move_line_id')
> - if (context.get('default_payment_order_type') == 'debit'
> - and 'sdd_mandate_id' not in vals):
> - if move_line_id:
> - line = self.pool['account.move.line'].browse(
> - cr, uid, move_line_id, context=context)
> - if (line.invoice and line.invoice.type == 'out_invoice'
> - and line.invoice.sdd_mandate_id):
> - vals.update({
> - 'sdd_mandate_id': line.invoice.sdd_mandate_id.id,
> - 'bank_id':
> - line.invoice.sdd_mandate_id.partner_bank_id.id,
> - })
> - if partner_bank_id and 'sdd_mandate_id' not in vals:
> - mandate_ids = self.pool['sdd.mandate'].search(cr, uid, [
> - ('partner_bank_id', '=', partner_bank_id),
> - ('state', '=', 'valid'),
> - ], context=context)
> - if mandate_ids:
> - vals['sdd_mandate_id'] = mandate_ids[0]
> - return super(payment_line, self).create(cr, uid, vals, context=context)
> -
> - def _check_mandate_bank_link(self, cr, uid, ids):
> - for payline in self.browse(cr, uid, ids):
> - if (payline.sdd_mandate_id and payline.bank_id
> - and payline.sdd_mandate_id.partner_bank_id.id !=
> - payline.bank_id.id):
> - raise orm.except_orm(
> - _('Error:'),
> - _("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').") % (
> - payline.name,
> - self.pool['res.partner.bank'].name_get(
> - cr, uid, [payline.bank_id.id])[0][1],
> - payline.sdd_mandate_id.unique_mandate_reference,
> - self.pool['res.partner.bank'].name_get(
> - cr, uid,
> - [payline.sdd_mandate_id.partner_bank_id.id])[0][1],
> - ))
> - return True
> -
> - _constraints = [
> - (_check_mandate_bank_link, 'Error msg in raise',
> - ['sdd_mandate_id', 'bank_id']),
> - ]
> -
> -
> -class account_invoice(orm.Model):
> - _inherit = 'account.invoice'
> -
> - _columns = {
> - 'sdd_mandate_id': fields.many2one(
> - 'sdd.mandate', 'SEPA Direct Debit Mandate',
> - domain=[('state', '=', 'valid')], readonly=True,
> - states={'draft': [('readonly', False)]})
> - }
> + return True
> \ No newline at end of file
>
> === modified file 'account_banking_sepa_direct_debit/mandate_expire_cron.xml'
> --- account_banking_sepa_direct_debit/mandate_expire_cron.xml 2013-11-07 22:22:19 +0000
> +++ account_banking_sepa_direct_debit/mandate_expire_cron.xml 2014-06-25 11:54:20 +0000
> @@ -17,7 +17,7 @@
> <field name="interval_type">days</field>
> <field name="numbercall">-1</field> <!-- don't limit the number of calls -->
> <field name="doall" eval="False"/>
> - <field name="model" eval="'sdd.mandate'"/>
> + <field name="model" eval="'account.banking.mandate'"/>
> <field name="function" eval="'_sdd_mandate_set_state_to_expired'" />
> <field name="args" eval="'()'"/>
> </record>
>
> === added file 'account_banking_sepa_direct_debit/sdd_mandate_view.xml'
> --- account_banking_sepa_direct_debit/sdd_mandate_view.xml 1970-01-01 00:00:00 +0000
> +++ account_banking_sepa_direct_debit/sdd_mandate_view.xml 2014-06-25 11:54:20 +0000
> @@ -0,0 +1,136 @@
> +<?xml version="1.0" encoding="utf-8"?>
> +<!--
> + Copyright (C) 2013 Akretion (http://www.akretion.com)
> + @author: Alexis de Lattre <alexis.delattre@xxxxxxxxxxxx>
> + The licence is in the file __openerp__.py
> +-->
> +<!--
> + Customize all mandate views (and actions) to fit SEPA mandate style
> +-->
> +<openerp>
> +<data>
indentation looks odd
> +
> +<record id="sdd_mandate_form" model="ir.ui.view">
> + <field name="name">sdd.mandate.form</field>
> + <field name="model">account.banking.mandate</field>
> + <field name="inherit_id" ref="account_banking_mandate.dd_mandate_form"/>
> + <field name="arch" type="xml">
> + <data>
> + <xpath expr="//field[@name='partner_id']" position="after">
> + <field name="type" on_change="mandate_type_change(type)"/>
> + <field name="recurrent_sequence_type" attrs="{'invisible': [('type', '=', 'oneoff')], 'required': [('type', '=', 'recurrent')]}"/>
> + </xpath>
> + <xpath expr="//field[@name='partner_bank_id']" position="attributes">
> + <attribute name="on_change">mandate_partner_bank_change(partner_bank_id, type, recurrent_sequence_type, last_debit_date, state)</attribute>
> + </xpath>
> + <xpath expr="//field[@name='last_debit_date']" position="after">
> + <field name="sepa_migrated" groups="account_banking_sepa_direct_debit.group_original_mandate_required"/>
> + <field name="original_mandate_identification" attrs="{'invisible': [('sepa_migrated', '=', True)], 'required': [('sepa_migrated', '=', False)]}" groups="account_banking_sepa_direct_debit.group_original_mandate_required"/>
> + </xpath>
> + </data>
> + </field>
> +</record>
> +
> +<record id="sdd_mandate_tree" model="ir.ui.view">
> + <field name="name">sdd.mandate.tree</field>
> + <field name="model">account.banking.mandate</field>
> + <field name="inherit_id" ref="account_banking_mandate.dd_mandate_tree"/>
> + <field name="arch" type="xml">
> + <data>
> + <xpath expr="//field[@name='unique_mandate_reference']" position="after">
> + <field name="type" string="Type"/>
> + </xpath>
> + </data>
> + </field>
> +</record>
> +
> +<record id="sdd_mandate_search" model="ir.ui.view">
> + <field name="name">sdd.mandate.search</field>
> + <field name="model">account.banking.mandate</field>
> + <field name="inherit_id" ref="account_banking_mandate.dd_mandate_search"/>
> + <field name="arch" type="xml">
> + <xpath expr="//filter[@name='expired']" position="after">
> + <filter name="oneoff" string="One-Off" domain="[('type', '=', 'oneoff')]" />
> + <filter name="recurrent" string="Recurrent" domain="[('type', '=', 'recurrent')]" />
> + </xpath>
> + </field>
> +</record>
> +
> +<record id="dd_mandate_action" model="ir.actions.act_window">
> + <field name="name">SEPA Direct Debit 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 SEPA Direct Debit Mandate.
> + </p><p>
> + A SEPA Direct Debit Mandate is a document signed by your customer that gives you the autorization to do one or several direct debits on his bank account.
> + </p>
> + </field>
> +</record>
> +
> +<menuitem id="account_banking_mandate.dd_mandate_menu"
> + parent="account_payment.menu_main_payment"
> + action="dd_mandate_action"
> + sequence="40"
> + />
> +
> +<record id="sdd_mandate_partner_bank_form" model="ir.ui.view">
> + <field name="name">sdd.mandate.res.partner.bank.form</field>
> + <field name="model">res.partner.bank</field>
> + <field name="inherit_id" ref="account_banking_mandate.dd_mandate_partner_bank_form"/>
> + <field name="arch" type="xml">
> + <xpath expr="//group[@name='dd_mandates']" position="attributes">
> + <attribute name="string">SEPA Direct Debit Mandates</attribute>
> + </xpath>
> + </field>
> +</record>
> +
> +<record id="sdd_mandate_partner_bank_tree" model="ir.ui.view">
> + <field name="name">sdd.mandate.res.partner.bank.tree</field>
> + <field name="model">res.partner.bank</field>
> + <field name="inherit_id" ref="account_banking_mandate.dd_mandate_partner_bank_tree"/>
> + <field name="arch" type="xml">
> + <xpath expr="//field[@name='mandate_ids']" position="attributes">
> + <attribute name="string">SDD Mandates</attribute>
> + </xpath>
> + </field>
> +</record>
> +
> +<record id="sdd_mandate_partner_form" model="ir.ui.view">
> + <field name="name">sdd.mandate.partner.form</field>
> + <field name="model">res.partner</field>
> + <field name="inherit_id" ref="account_banking_mandate.dd_mandate_partner_form"/>
> + <field name="arch" type="xml">
> + <xpath expr="//field[@name='bank_ids']/tree/field[@name='mandate_ids']" position="attributes">
> + <attribute name="string">SDD Mandates</attribute>
> + </xpath>
> + </field>
> +</record>
> +
> +
> +<!-- notifications in the chatter -->
> +<record id="recurrent_sequence_type_first" model="mail.message.subtype">
> + <field name="name">Sequence Type set to First</field>
> + <field name="res_model">account.banking.mandate</field>
> + <field name="default" eval="False"/>
> + <field name="description">Sequence Type set to First</field>
> +</record>
> +
> +<record id="recurrent_sequence_type_recurring" model="mail.message.subtype">
> + <field name="name">Sequence Type set to Recurring</field>
> + <field name="res_model">account.banking.mandate</field>
> + <field name="default" eval="False"/>
> + <field name="description">Sequence Type set to Recurring</field>
> +</record>
> +
> +<record id="recurrent_sequence_type_final" model="mail.message.subtype">
> + <field name="name">Sequence Type set to Final</field>
> + <field name="res_model">account.banking.mandate</field>
> + <field name="default" eval="False"/>
> + <field name="description">Sequence Type set to Final</field>
> +</record>
> +
> +</data>
> +</openerp>
>
> === modified file 'account_banking_sepa_direct_debit/security/ir.model.access.csv'
> --- account_banking_sepa_direct_debit/security/ir.model.access.csv 2013-10-15 21:29:28 +0000
> +++ account_banking_sepa_direct_debit/security/ir.model.access.csv 2014-06-25 11:54:20 +0000
> @@ -1,4 +1,4 @@
> "id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
> "access_banking_export_sdd","Full access on banking.export.sdd","model_banking_export_sdd","account_payment.group_account_payment",1,1,1,1
> -"access_sdd_mandate","Full access on sdd.mandate","model_sdd_mandate","account_payment.group_account_payment",1,1,1,1
> -"access_sdd_mandate_read","Read access on sdd.mandate","model_sdd_mandate","base.group_user",1,0,0,0
> +"access_sdd_mandate","Full access on sdd.mandate","model_account_banking_mandate","account_payment.group_account_payment",1,1,1,1
> +"access_sdd_mandate_read","Read access on sdd.mandate","model_account_banking_mandate","base.group_user",1,0,0,0
>
> === modified file 'account_banking_sepa_direct_debit/sepa_direct_debit_demo.xml'
> --- account_banking_sepa_direct_debit/sepa_direct_debit_demo.xml 2014-02-16 14:01:09 +0000
> +++ account_banking_sepa_direct_debit/sepa_direct_debit_demo.xml 2014-06-25 11:54:20 +0000
> @@ -15,7 +15,7 @@
> <field name="sepa_creditor_identifier">FR78ZZZ424242</field>
> </record>
>
> -<record id="res_partner_12_mandate" model="sdd.mandate">
> +<record id="res_partner_12_mandate" model="account.banking.mandate">
> <field name="partner_bank_id" ref="account_banking_payment_export.res_partner_12_iban"/>
> <field name="type">recurrent</field>
> <field name="recurrent_sequence_type">first</field>
>
> === modified file 'account_banking_sepa_direct_debit/wizard/export_sdd.py'
> --- account_banking_sepa_direct_debit/wizard/export_sdd.py 2014-01-05 23:51:22 +0000
> +++ account_banking_sepa_direct_debit/wizard/export_sdd.py 2014-06-25 11:54:20 +0000
> @@ -93,7 +93,7 @@
> previous_bank = False
> payline_ids = payline_obj.search(
> cr, uid, [
> - ('sdd_mandate_id', '=', payline.sdd_mandate_id.id),
> + ('mandate_id', '=', payline.mandate_id.id),
> ('bank_id', '!=', payline.bank_id.id),
> ],
> context=context)
> @@ -188,22 +188,22 @@
> requested_date = payment_order.date_scheduled or today
> else:
> requested_date = today
> - if not line.sdd_mandate_id:
> + if not line.mandate_id:
> raise orm.except_orm(
> _('Error:'),
> _("Missing SEPA Direct Debit mandate on the payment "
> "line with partner '%s' and Invoice ref '%s'.")
> % (line.partner_id.name,
> line.ml_inv_ref.number))
> - if line.sdd_mandate_id.state != 'valid':
> + if line.mandate_id.state != 'valid':
> raise orm.except_orm(
> _('Error:'),
> _("The SEPA Direct Debit mandate with reference '%s' "
> "for partner '%s' has expired.")
> - % (line.sdd_mandate_id.unique_mandate_reference,
> - line.sdd_mandate_id.partner_id.name))
> - if line.sdd_mandate_id.type == 'oneoff':
> - if not line.sdd_mandate_id.last_debit_date:
> + % (line.mandate_id.unique_mandate_reference,
> + line.mandate_id.partner_id.name))
> + if line.mandate_id.type == 'oneoff':
> + if not line.mandate_id.last_debit_date:
> seq_type = 'OOFF'
> else:
> raise orm.except_orm(
> @@ -212,17 +212,17 @@
> "'%s' has type set to 'One-Off' and it has a "
> "last debit date set to '%s', so we can't use "
> "it.")
> - % (line.sdd_mandate_id.unique_mandate_reference,
> - line.sdd_mandate_id.partner_id.name,
> - line.sdd_mandate_id.last_debit_date))
> - elif line.sdd_mandate_id.type == 'recurrent':
> + % (line.mandate_id.unique_mandate_reference,
> + line.mandate_id.partner_id.name,
> + line.mandate_id.last_debit_date))
> + elif line.mandate_id.type == 'recurrent':
> seq_type_map = {
> 'recurring': 'RCUR',
> 'first': 'FRST',
> 'final': 'FNAL',
> }
> seq_type_label = \
> - line.sdd_mandate_id.recurrent_sequence_type
> + line.mandate_id.recurrent_sequence_type
> assert seq_type_label is not False
> seq_type = seq_type_map[seq_type_label]
>
> @@ -306,22 +306,22 @@
> mandate_related_info_2_47, 'MndtId')
> mandate_identification_2_48.text = self._prepare_field(
> cr, uid, 'Unique Mandate Reference',
> - 'line.sdd_mandate_id.unique_mandate_reference',
> + 'line.mandate_id.unique_mandate_reference',
> {'line': line}, 35,
> gen_args=gen_args, context=context)
> mandate_signature_date_2_49 = etree.SubElement(
> mandate_related_info_2_47, 'DtOfSgntr')
> mandate_signature_date_2_49.text = self._prepare_field(
> cr, uid, 'Mandate Signature Date',
> - 'line.sdd_mandate_id.signature_date',
> + 'line.mandate_id.signature_date',
> {'line': line}, 10,
> gen_args=gen_args, context=context)
> if sequence_type == 'FRST' and (
> - line.sdd_mandate_id.last_debit_date or
> - not line.sdd_mandate_id.sepa_migrated):
> + line.mandate_id.last_debit_date or
> + not line.mandate_id.sepa_migrated):
> previous_bank = self._get_previous_bank(
> cr, uid, line, context=context)
> - if previous_bank or not line.sdd_mandate_id.sepa_migrated:
> + if previous_bank or not line.mandate_id.sepa_migrated:
> amendment_indicator_2_50 = etree.SubElement(
> mandate_related_info_2_47, 'AmdmntInd')
> amendment_indicator_2_50.text = 'true'
> @@ -362,13 +362,13 @@
> ori_debtor_agent_other, 'Id')
> ori_debtor_agent_other_id.text = 'SMNDA'
> # SMNDA = Same Mandate New Debtor Agent
> - elif not line.sdd_mandate_id.sepa_migrated:
> + elif not line.mandate_id.sepa_migrated:
> ori_mandate_identification_2_52 = etree.SubElement(
> amendment_info_details_2_51, 'OrgnlMndtId')
> ori_mandate_identification_2_52.text = \
> self._prepare_field(
> cr, uid, 'Original Mandate Identification',
> - 'line.sdd_mandate_id.'
> + 'line.mandate_id.'
> 'original_mandate_identification',
> {'line': line},
> gen_args=gen_args,
> @@ -425,25 +425,25 @@
> wf_service = netsvc.LocalService('workflow')
> for order in sepa_export.payment_order_ids:
> wf_service.trg_validate(uid, 'payment.order', order.id, 'done', cr)
> - mandate_ids = [line.sdd_mandate_id.id for line in order.line_ids]
> - self.pool['sdd.mandate'].write(
> + mandate_ids = [line.mandate_id.id for line in order.line_ids]
> + self.pool['account.banking.mandate'].write(
> cr, uid, mandate_ids,
> {'last_debit_date': datetime.today().strftime('%Y-%m-%d')},
> context=context)
> to_expire_ids = []
> first_mandate_ids = []
> for line in order.line_ids:
> - if line.sdd_mandate_id.type == 'oneoff':
> - to_expire_ids.append(line.sdd_mandate_id.id)
> - elif line.sdd_mandate_id.type == 'recurrent':
> - seq_type = line.sdd_mandate_id.recurrent_sequence_type
> + if line.mandate_id.type == 'oneoff':
> + to_expire_ids.append(line.mandate_id.id)
> + elif line.mandate_id.type == 'recurrent':
> + seq_type = line.mandate_id.recurrent_sequence_type
> if seq_type == 'final':
> - to_expire_ids.append(line.sdd_mandate_id.id)
> + to_expire_ids.append(line.mandate_id.id)
> elif seq_type == 'first':
> - first_mandate_ids.append(line.sdd_mandate_id.id)
> - self.pool['sdd.mandate'].write(
> + first_mandate_ids.append(line.mandate_id.id)
> + self.pool['account.banking.mandate'].write(
> cr, uid, to_expire_ids, {'state': 'expired'}, context=context)
> - self.pool['sdd.mandate'].write(
> + self.pool['account.banking.mandate'].write(
> cr, uid, first_mandate_ids, {
> 'recurrent_sequence_type': 'recurring',
> 'sepa_migrated': True,
>
--
https://code.launchpad.net/~compassion/banking-addons/banking-addons-mandate/+merge/224428
Your team Banking Addons Core Editors is subscribed to branch lp:banking-addons.
Follow ups
References