diff --git a/addons/account/__openerp__.py b/addons/account/__openerp__.py
index d4408d63bfe..39e40555f39 100644
--- a/addons/account/__openerp__.py
+++ b/addons/account/__openerp__.py
@@ -34,14 +34,15 @@
Budgets
Customer and Supplier Invoices
Bank statements
+ Reconciliation process by partner
Creates a dashboards for accountants that includes:
* List of uninvoiced quotations
* Graph of aged receivables
- * Graph of aged incomes
+ * Graph of aged incomes
The processes like maintaining of general ledger is done through the defined financial Journals (entry move line or
grouping is maintained through journal) for a particular financial year and for preparation of vouchers there is a
-module named account_voucherss
+module named account_vouchers
""",
'website': 'http://www.openerp.com',
'init_xml': [],
@@ -85,6 +86,7 @@ module named account_voucherss
'wizard/account_compare_account_balance_report_view.xml',
'wizard/account_third_party_ledger.xml',
'wizard/account_reconcile_view.xml',
+ 'wizard/account_reconcile_partner_process_view.xml',
'wizard/account_automatic_reconcile_view.xml',
'project/wizard/project_account_analytic_line_view.xml',
'account_end_fy.xml',
diff --git a/addons/account/account.py b/addons/account/account.py
index f946723e350..87eb6dfd2a8 100644
--- a/addons/account/account.py
+++ b/addons/account/account.py
@@ -81,7 +81,7 @@ class account_payment_term(osv.osv):
if amt:
next_date = datetime.strptime(date_ref, '%Y-%m-%d') + relativedelta(days=line.days)
if line.days2 < 0:
- next_date += relativedelta(day=line.days2)
+ next_date += relativedelta(day=31)
if line.days2 > 0:
next_date += relativedelta(day=line.days2, months=1)
result.append( (next_date.strftime('%Y-%m-%d'), amt) )
@@ -616,17 +616,17 @@ class account_journal(osv.osv):
'type_control_ids': fields.many2many('account.account.type', 'account_journal_type_rel', 'journal_id','type_id', 'Type Controls', domain=[('code','<>','view'), ('code', '<>', 'closed')]),
'account_control_ids': fields.many2many('account.account', 'account_account_type_rel', 'journal_id','account_id', 'Account', domain=[('type','<>','view'), ('type', '<>', 'closed')]),
'view_id': fields.many2one('account.journal.view', 'Display Mode', required=True, help="Gives the view used when writing or browsing entries in this journal. The view tells Open ERP which fields should be visible, required or readonly and in which order. You can create your own view for a faster encoding in each journal."),
- 'default_credit_account_id': fields.many2one('account.account', 'Default Credit Account', domain="[('type','!=','view')]",help="It acts as a default account for credit amount"),
- 'default_debit_account_id': fields.many2one('account.account', 'Default Debit Account', domain="[('type','!=','view')]",help="It acts as a default account for debit amount"),
+ 'default_credit_account_id': fields.many2one('account.account', 'Default Credit Account', domain="[('type','!=','view')]", help="It acts as a default account for credit amount"),
+ 'default_debit_account_id': fields.many2one('account.account', 'Default Debit Account', domain="[('type','!=','view')]", help="It acts as a default account for debit amount"),
'centralisation': fields.boolean('Centralised counterpart', help="Check this box to determine that each entry of this journal won't create a new counterpart but will share the same counterpart. This is used in fiscal year closing."),
- 'update_posted': fields.boolean('Allow Cancelling Entries',help="Check this box if you want to cancel the entries related to this journal or want to cancel the invoice related to this journal"),
+ 'update_posted': fields.boolean('Allow Cancelling Entries', help="Check this box if you want to allow the cancellation the entries related to this journal or of the invoice related to this journal"),
'group_invoice_lines': fields.boolean('Group invoice lines', help="If this box is checked, the system will try to group the accounting lines when generating them from invoices."),
'sequence_id': fields.many2one('ir.sequence', 'Entry Sequence', help="The sequence gives the display order for a list of journals", required=True),
'user_id': fields.many2one('res.users', 'User', help="The user responsible for this journal"),
'groups_id': fields.many2many('res.groups', 'account_journal_group_rel', 'journal_id', 'group_id', 'Groups'),
'currency': fields.many2one('res.currency', 'Currency', help='The currency used to enter statement'),
'entry_posted': fields.boolean('Skip \'Draft\' State for Created Entries', help='Check this box if you don\'t want new account moves to pass through the \'draft\' state and instead goes directly to the \'posted state\' without any manual validation.'),
- 'company_id': fields.many2one('res.company', 'Company', required=True,select=1,help="Company associated with a journal"),
+ 'company_id': fields.many2one('res.company', 'Company', required=True, select=1, help="Company related to this journal"),
'invoice_sequence_id': fields.many2one('ir.sequence', 'Invoice Sequence', \
help="The sequence used for invoice numbers in this journal."),
'allow_date':fields.boolean('Check Date not in the Period', help= 'If set to True then do not accept the entry if the entry date is not into the period dates'),
@@ -678,7 +678,6 @@ class account_journal(osv.osv):
res= {'value':{'centralisation': False}}
return res
-
account_journal()
class account_fiscalyear(osv.osv):
@@ -772,7 +771,7 @@ class account_period(osv.osv):
'fiscalyear_id': fields.many2one('account.fiscalyear', 'Fiscal Year', required=True, states={'done':[('readonly',True)]}, select=True),
'state': fields.selection([('draft','Draft'), ('done','Done')], 'State', readonly=True,
help='When monthly periods are created. The state is \'Draft\'. At the end of monthly period it is in \'Done\' state.'),
- 'company_id': fields.related('fiscalyear_id','company_id',type='many2one',relation='res.company',string='Company',store=True)
+ 'company_id': fields.related('fiscalyear_id', 'company_id', type='many2one', relation='res.company', string='Company', store=True)
}
_defaults = {
'state': lambda *a: 'draft',
@@ -878,7 +877,7 @@ class account_journal_period(osv.osv):
'state': fields.selection([('draft','Draft'), ('printed','Printed'), ('done','Done')], 'State', required=True, readonly=True,
help='When journal period is created. The state is \'Draft\'. If a report is printed it comes to \'Printed\' state. When all transactions are done, it comes in \'Done\' state.'),
'fiscalyear_id': fields.related('period_id', 'fiscalyear_id', string='Fiscal Year', type='many2one', relation='account.fiscalyear'),
- 'company_id': fields.related('journal_id','company_id',type='many2one',relation='res.company',string='Company')
+ 'company_id': fields.related('journal_id', 'company_id', type='many2one', relation='res.company', string='Company')
}
def _check(self, cr, uid, ids, context={}):
@@ -2122,7 +2121,7 @@ class account_tax_code_template(osv.osv):
'info': fields.text('Description'),
'parent_id': fields.many2one('account.tax.code.template', 'Parent Code', select=True),
'child_ids': fields.one2many('account.tax.code.template', 'parent_id', 'Child Codes'),
- 'sign': fields.float('Sign for parent', required=True),
+ 'sign': fields.float('Sign for parent', required=True, help="Choose 1.00 to add the total to the parent account or -1.00 to subtract it"),
'notprintable':fields.boolean("Not Printable in Invoice", help="Check this box if you don't want any VAT related to this Tax Code to appear on invoices"),
}
@@ -2154,7 +2153,7 @@ class account_chart_template(osv.osv):
_columns={
'name': fields.char('Name', size=64, required=True),
- 'account_root_id': fields.many2one('account.account.template','Root Account',required=True,domain=[('parent_id','=',False)]),
+ 'account_root_id': fields.many2one('account.account.template','Root Account',required=True,domain=[('parent_id','=',False)], help=""),
'tax_code_root_id': fields.many2one('account.tax.code.template','Root Tax Code',required=True,domain=[('parent_id','=',False)]),
'tax_template_ids': fields.one2many('account.tax.template', 'chart_template_id', 'Tax Template List', help='List of all the taxes that have to be installed by the wizard'),
'bank_account_view_id': fields.many2one('account.account.template','Bank Account',required=True),
diff --git a/addons/account/account_move_line.py b/addons/account/account_move_line.py
index 45edefe6082..b8719f26242 100644
--- a/addons/account/account_move_line.py
+++ b/addons/account/account_move_line.py
@@ -577,6 +577,39 @@ class account_move_line(osv.osv):
# writeoff; entry generated for the difference between the lines
#
+ def search(self, cr, uid, args, offset=0, limit=None, order=None, context=None, count=False):
+ if context is None:
+ context = {}
+ if context and context.get('next_partner_only', False):
+ if not context.get('partner_id', False):
+ partner = self.get_next_partner_only(cr, uid, offset, context)
+ else:
+ partner = context.get('partner_id', False)
+ if not partner:
+ return []
+ args.append(('partner_id', '=', partner[0]))
+ return super(account_move_line, self).search(cr, uid, args, offset, limit, order, context, count)
+
+ def get_next_partner_only(self, cr, uid, offset=0, context=None):
+ cr.execute(
+ """
+ SELECT p.id
+ FROM res_partner p
+ RIGHT JOIN (
+ SELECT l.partner_id as partner_id, SUM(l.debit) as debit, SUM(l.credit) as credit
+ FROM account_move_line l
+ LEFT JOIN account_account a ON (a.id = l.account_id)
+ LEFT JOIN res_partner p ON (l.partner_id = p.id)
+ WHERE a.reconcile IS TRUE
+ AND l.reconcile_id IS NULL
+ AND (p.last_reconciliation_date IS NULL OR l.date > p.last_reconciliation_date)
+ AND l.state <> 'draft'
+ GROUP BY l.partner_id
+ ) AS s ON (p.id = s.partner_id)
+ ORDER BY p.last_reconciliation_date LIMIT 1 OFFSET %s""", (offset,)
+ )
+ return cr.fetchone()
+
def reconcile_partial(self, cr, uid, ids, type='auto', context=None):
merges = []
unmerge = []
@@ -730,6 +763,11 @@ class account_move_line(osv.osv):
# because of the way the line_id are defined: (4, x, False)
for id in ids:
wf_service.trg_trigger(uid, 'account.move.line', id, cr)
+
+ if lines and lines[0]:
+ partner_id = lines[0].partner_id.id
+ if context and context.get('stop_reconcile', False):
+ self.pool.get('res.partner').write(cr, uid, [partner_id], {'last_reconciliation_date': time.strftime('%Y-%m-%d %H:%M:%S')})
return r_id
def view_header_get(self, cr, user, view_id, view_type, context):
@@ -838,13 +876,14 @@ class account_move_line(osv.osv):
journal_id = m.journal_id.id
period_id = m.period_id.id
else:
- journal_id = context['journal_id']
- period_id = context['period_id']
- journal = self.pool.get('account.journal').browse(cr, uid, [journal_id])[0]
- if journal.allow_date:
- period = self.pool.get('account.period').browse(cr, uid, [period_id])[0]
- if not time.strptime(vals['date'],'%Y-%m-%d')>=time.strptime(period.date_start,'%Y-%m-%d') or not time.strptime(vals['date'],'%Y-%m-%d')<=time.strptime(period.date_stop,'%Y-%m-%d'):
- raise osv.except_osv(_('Error'),_('The date of your Ledger Posting is not in the defined period !'))
+ journal_id = context.get('journal_id',False)
+ period_id = context.get('period_id',False)
+ if journal_id:
+ journal = self.pool.get('account.journal').browse(cr, uid, [journal_id])[0]
+ if journal.allow_date and period_id:
+ period = self.pool.get('account.period').browse(cr, uid, [period_id])[0]
+ if not time.strptime(vals['date'],'%Y-%m-%d')>=time.strptime(period.date_start,'%Y-%m-%d') or not time.strptime(vals['date'],'%Y-%m-%d')<=time.strptime(period.date_stop,'%Y-%m-%d'):
+ raise osv.except_osv(_('Error'),_('The date of your Ledger Posting is not in the defined period !'))
else:
return True
diff --git a/addons/account/account_view.xml b/addons/account/account_view.xml
index 694a48177d9..82781b45ab0 100644
--- a/addons/account/account_view.xml
+++ b/addons/account/account_view.xml
@@ -12,12 +12,14 @@
form
+
+ account.period.search
+ account.period
+ search
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Periodsaccount.periodform
- tree,form
+ tree,form,search
@@ -154,10 +198,21 @@
search
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -262,7 +317,28 @@
-
+
+ account.journal.search
+ account.journal
+ search
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ account.journal.formaccount.journal
@@ -351,16 +427,38 @@
-
+
+ account.bank.statement.search
+ account.bank.statement
+ search
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ account.bank.statement.formaccount.bank.statementform
diff --git a/addons/account/wizard/account_move_line_reconcile_select_view.xml b/addons/account/wizard/account_move_line_reconcile_select_view.xml
index 220c9e541de..4f88f618727 100644
--- a/addons/account/wizard/account_move_line_reconcile_select_view.xml
+++ b/addons/account/wizard/account_move_line_reconcile_select_view.xml
@@ -31,8 +31,8 @@
new
-
+
\ No newline at end of file
diff --git a/addons/account/wizard/account_move_line_select.py b/addons/account/wizard/account_move_line_select.py
index 32ecf85f375..546bb08c754 100644
--- a/addons/account/wizard/account_move_line_select.py
+++ b/addons/account/wizard/account_move_line_select.py
@@ -43,7 +43,6 @@ class account_move_line_select(osv.osv_memory):
else:
fiscalyear_ids = [context['fiscalyear']]
-# fiscalyear_ids = fiscalyear_obj.search(cr, uid, [('state', '=', 'draft')])
fiscalyears = fiscalyear_obj.browse(cr, uid, fiscalyear_ids)
period_ids = []
diff --git a/addons/account/wizard/account_move_line_unreconcile_select_view.xml b/addons/account/wizard/account_move_line_unreconcile_select_view.xml
index 1daae353725..f2a3882db91 100644
--- a/addons/account/wizard/account_move_line_unreconcile_select_view.xml
+++ b/addons/account/wizard/account_move_line_unreconcile_select_view.xml
@@ -31,8 +31,8 @@
new
-
+
\ No newline at end of file
diff --git a/addons/account/wizard/account_reconcile.py b/addons/account/wizard/account_reconcile.py
index e8db687edf7..59ea16b2c23 100644
--- a/addons/account/wizard/account_reconcile.py
+++ b/addons/account/wizard/account_reconcile.py
@@ -23,19 +23,19 @@ import time
from osv import fields, osv
from tools.translate import _
-class account_move_line_reconcile_prompt(osv.osv_memory):
- """
- Asks user he wants to reconcile entries or not.
- """
- _name = 'account.move.line.reconcile.prompt'
- _description = 'Account move line reconcile'
- _columns = {
- }
-
- def ask_reconcilation(self, cr, uid, ids, context):
- return self.pool.get('account.move.line.reconcile').partial_check(cr, uid, ids, context)
-
-account_move_line_reconcile_prompt()
+#class account_move_line_reconcile_prompt(osv.osv_memory):
+# """
+# Asks user he wants to reconcile entries or not.
+# """
+# _name = 'account.move.line.reconcile.prompt'
+# _description = 'Account move line reconcile'
+# _columns = {
+# }
+#
+# def ask_reconcilation(self, cr, uid, ids, context):
+# return self.pool.get('account.move.line.reconcile').partial_check(cr, uid, ids, context)
+#
+#account_move_line_reconcile_prompt()
class account_move_line_reconcile(osv.osv_memory):
"""
diff --git a/addons/account/wizard/account_reconcile_partner_process.py b/addons/account/wizard/account_reconcile_partner_process.py
new file mode 100644
index 00000000000..6a1e354837d
--- /dev/null
+++ b/addons/account/wizard/account_reconcile_partner_process.py
@@ -0,0 +1,100 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2010 Tiny SPRL ().
+#
+# 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 .
+#
+##############################################################################
+import time
+
+from osv import osv, fields
+from tools.translate import _
+
+class account_partner_reconcile_process(osv.osv_memory):
+ _name = 'account.partner.reconcile.process'
+ _description = 'Reconcilation Process partner by partner'
+
+ def _get_to_reconcile(self, cr, uid, context=None):
+ cr.execute(
+ "SELECT l.partner_id " \
+ "FROM account_move_line AS l LEFT JOIN res_partner p ON (p.id = l.partner_id) " \
+ "WHERE l.reconcile_id IS NULL " \
+ "AND (%s > to_char(p.last_reconciliation_date, 'YYYY-MM-DD') " \
+ "OR p.last_reconciliation_date IS NULL ) " \
+ "AND l.state <> 'draft' " \
+ "GROUP BY l.partner_id ",(time.strftime('%Y-%m-%d'),)
+ )
+ return len(map(lambda x: x[0], cr.fetchall())) - 1
+
+ def _get_today_reconciled(self, cr, uid, context=None):
+ cr.execute(
+ "SELECT l.partner_id " \
+ "FROM account_move_line AS l LEFT JOIN res_partner p ON (p.id = l.partner_id) " \
+ "WHERE l.reconcile_id IS NULL " \
+ "AND %s = to_char(p.last_reconciliation_date, 'YYYY-MM-DD') " \
+ "AND l.state <> 'draft' " \
+ "GROUP BY l.partner_id ",(time.strftime('%Y-%m-%d'),)
+ )
+ return len(map(lambda x: x[0], cr.fetchall())) + 1
+
+ def _get_partner(self, cr, uid, context=None):
+ partner = self.pool.get('account.move.line').get_next_partner_only(cr, uid, offset=1, context=context)
+ if not partner:
+ return False
+ return partner[0]
+
+ def data_get(self, cr, uid, to_reconcile, today_reconciled, context=None):
+ return {'progress': (100 / float(to_reconcile + today_reconciled)) * today_reconciled}
+
+ def default_get(self, cr, uid, fields, context=None):
+ res = super(account_partner_reconcile_process, self).default_get(cr, uid, fields, context=context)
+ if 'to_reconcile' in res and 'today_reconciled' in res:
+ data = self.data_get(cr, uid, res['to_reconcile'], res['today_reconciled'], context)
+ res.update(data)
+ return res
+
+ def next_partner(self, cr, uid, ids, context=None):
+ partner_id = self.pool.get('account.move.line').read(cr, uid, context['active_id'], ['partner_id'])['partner_id'][0]
+ self.pool.get('res.partner').write(cr, uid, partner_id, {'last_reconciliation_date': time.strftime('%Y-%m-%d')}, context)
+ #TODO: we have to find a way to update the context of the current tab (we could open a new tab with the context but it's not really handy)
+ #TODO: remove that comments when the client side dev is done
+ #context.update({'partner_id': self.browse(cr, uid, ids, context)[0].next_partner_id})
+ #return {'context': context,
+ # 'target': 'opener',
+ # 'name': 'reconciliation process',
+ # 'view_type': 'form',
+ # 'view_mode': 'tree,form',
+ # 'res_model': 'account.move.line',
+ # 'type': 'ir.actions.act_window'
+ #}
+ return {}
+
+ _columns = {
+ 'to_reconcile': fields.float('Remaining Partners', readonly=True, help='This is the remaining partners for who you should check if there is something to reconcile or not. This figure already count the current partner as reconciled.'),
+ 'today_reconciled': fields.float('Partners Reconciled Today', readonly=True, help='This figure depicts the total number of partners that have gone throught the reconciliation process today. The current partner is counted as already processed.'),
+ 'progress': fields.float('Progress', readonly=True, help='Shows you the progress made today on the reconciliation process. Given by \nPartners Reconciled Today \ (Remaining Partners + Partners Reconciled Today)'),
+ 'next_partner_id': fields.many2one('res.partner', 'Next Partner to Reconcile', readonly=True, help='This field shows you the next partner that will be automatically chosen by the system to go through the reconciliation process, based on the latest day it have been reconciled.'), # TODO: remove the readonly=True when teh client side will allow to update the context of existing tab, so that the user can change this value if he doesn't want to follow openerp proposal
+ }
+
+ _defaults = {
+ 'to_reconcile': _get_to_reconcile,
+ 'today_reconciled': _get_today_reconciled,
+ 'next_partner_id': _get_partner,
+ }
+
+account_partner_reconcile_process()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/wizard/account_reconcile_partner_process_view.xml b/addons/account/wizard/account_reconcile_partner_process_view.xml
new file mode 100644
index 00000000000..f119243a470
--- /dev/null
+++ b/addons/account/wizard/account_reconcile_partner_process_view.xml
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+ Partner Reconcilation Process
+ account.partner.reconcile.process
+ form
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Reconciliation: Go to Next Partner
+ account.partner.reconcile.process
+ ir.actions.act_window
+ form
+ tree,form
+
+ {'record_id':active_id}
+ new
+
+
+
+
+ Partner reconciliation
+ client_action_multi
+
+ action
+ account.move.line
+
+
+
+
+
diff --git a/addons/account/wizard/account_reconcile_view.xml b/addons/account/wizard/account_reconcile_view.xml
index 1bed69d45fe..5ce124bfcc7 100644
--- a/addons/account/wizard/account_reconcile_view.xml
+++ b/addons/account/wizard/account_reconcile_view.xml
@@ -2,86 +2,130 @@
-
- account.move.line.reconcile.prompt.form
- account.move.line.reconcile.prompt
- form
-
-
diff --git a/addons/account_coda/coda.py b/addons/account_coda/coda.py
index 26c216583a3..a9321b43906 100644
--- a/addons/account_coda/coda.py
+++ b/addons/account_coda/coda.py
@@ -1,6 +1,6 @@
# -*- encoding: utf-8 -*-
##############################################################################
-#
+#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 Tiny SPRL ().
#
@@ -15,7 +15,7 @@
# 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 .
+# along with this program. If not, see .
#
##############################################################################
@@ -27,7 +27,7 @@ class account_coda(osv.osv):
_description = "coda for an Account"
_columns = {
'name': fields.binary('Coda file', readonly=True),
- 'statement_ids': fields.one2many('account.bank.statement','coda_id','Generated Bank Statement', readonly=True),
+ 'statement_ids': fields.one2many('account.bank.statement','coda_id','Generated Bank Statements', readonly=True),
'note': fields.text('Import log', readonly=True),
'journal_id': fields.many2one('account.journal','Bank Journal', readonly=True, select=True),
'date': fields.date('Import Date', readonly=True, select=True),
diff --git a/addons/account_coda/coda_view.xml b/addons/account_coda/coda_view.xml
index 3813fe40bf0..0a61c36d5a8 100644
--- a/addons/account_coda/coda_view.xml
+++ b/addons/account_coda/coda_view.xml
@@ -12,14 +12,14 @@
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
diff --git a/addons/account_coda/wizard/coda_import.py b/addons/account_coda/wizard/coda_import.py
index 34054bc5009..7fb1e2d005e 100644
--- a/addons/account_coda/wizard/coda_import.py
+++ b/addons/account_coda/wizard/coda_import.py
@@ -124,7 +124,7 @@ def _coda_parsing(self, cr, uid, data, context):
bank_statement['date'] = str2date(line[5:11])
bank_statement['journal_id']=data['form']['journal_id']
period_id = pool.get('account.period').search(cr, uid, [('date_start','<=',time.strftime('%Y-%m-%d',time.strptime(bank_statement['date'],"%y/%m/%d"))),('date_stop','>=',time.strftime('%Y-%m-%d',time.strptime(bank_statement['date'],"%y/%m/%d")))])
- bank_statement['period_id'] = period_id[0]
+ bank_statement['period_id'] = period_id and period_id[0] or False
bank_statement['state']='draft'
elif line[0] == '1':
# old balance data
@@ -221,7 +221,7 @@ def _coda_parsing(self, cr, uid, data, context):
bk_st_id = pool.get('account.bank.statement').create(cr,uid,{
'journal_id': statement['journal_id'],
'date':time.strftime('%Y-%m-%d',time.strptime(statement['date'],"%y/%m/%d")),
-# 'period_id':statement['period_id'],
+ 'period_id':statement['period_id'],
'balance_start': statement["balance_start"],
'balance_end_real': statement["balance_end_real"],
'state': 'draft',
diff --git a/addons/account_followup/__openerp__.py b/addons/account_followup/__openerp__.py
index df3955d8180..81a5cb79cee 100644
--- a/addons/account_followup/__openerp__.py
+++ b/addons/account_followup/__openerp__.py
@@ -28,11 +28,11 @@
Modules to automate letters for unpaid invoices, with multi-level recalls.
You can define your multiple levels of recall through the menu:
- Financial Management/Configuration/Payment Terms/Follow-Ups
+ Financial Management/Configuration/Follow-Ups
Once it's defined, you can automatically print recalls every day
through simply clicking on the menu:
- Financial_Management/Periodical_Processing/Print_Follow-Ups
+ Financial Management/Periodical Processing/Send followups
It will generate a PDF with all the letters according the the
different levels of recall defined. You can define different policies
@@ -40,7 +40,7 @@
Note that if you want to change the followup level for a given partner/account entry, you can do it in the menu:
- Financial_Management/Reporting/Follow-Ups/All Receivable Entries
+ Financial Management/Reporting/Follow-Ups/All receivable entries
""",
'author': 'Tiny',
diff --git a/addons/account_followup/wizard/account_followup_print.py b/addons/account_followup/wizard/account_followup_print.py
index 3ba9301a365..f49ae945cca 100644
--- a/addons/account_followup/wizard/account_followup_print.py
+++ b/addons/account_followup/wizard/account_followup_print.py
@@ -171,14 +171,13 @@ class account_followup_print_all(osv.osv_memory):
data = self.read(cr, uid, ids, [])[0]
model_data_ids = mod_obj.search(cr, uid, [('model','=','ir.ui.view'),('name','=','view_account_followup_print_all_msg')], context=context)
resource_id = mod_obj.read(cr, uid, model_data_ids, fields=['res_id'], context=context)[0]['res_id']
-
if data['email_conf']:
mail_notsent = ''
msg_sent = ''
msg_unsent = ''
count = 0
data_user = user_obj.browse(cr, uid, uid)
- move_lines = line_obj.browse(cr, uid, data['partner_ids'][0][2])
+ move_lines = line_obj.browse(cr, uid, data['partner_ids'])
partners = []
dict_lines = {}
for line in move_lines:
diff --git a/addons/account_payment/account_payment_view.xml b/addons/account_payment/account_payment_view.xml
index d238fe952fc..cb6c29aa47f 100644
--- a/addons/account_payment/account_payment_view.xml
+++ b/addons/account_payment/account_payment_view.xml
@@ -45,11 +45,11 @@
payment.typeform
-