diff --git a/addons/account_analytic_analysis/__init__.py b/addons/account_analytic_analysis/__init__.py
index a7bdb11ad67..429aa011f31 100644
--- a/addons/account_analytic_analysis/__init__.py
+++ b/addons/account_analytic_analysis/__init__.py
@@ -20,6 +20,7 @@
##############################################################################
import account_analytic_analysis
+import cron_account_analytic_account
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account_analytic_analysis/__openerp__.py b/addons/account_analytic_analysis/__openerp__.py
index 588055b3741..f5dea6e77e0 100644
--- a/addons/account_analytic_analysis/__openerp__.py
+++ b/addons/account_analytic_analysis/__openerp__.py
@@ -41,6 +41,7 @@ user-wise as well as month wise.
"security/ir.model.access.csv",
"account_analytic_analysis_view.xml",
"account_analytic_analysis_menu.xml",
+ "account_analytic_analysis_cron.xml",
],
'demo_xml' : [],
'installable': True,
diff --git a/addons/account_analytic_analysis/account_analytic_analysis.py b/addons/account_analytic_analysis/account_analytic_analysis.py
index 11f92614b73..03dea210396 100644
--- a/addons/account_analytic_analysis/account_analytic_analysis.py
+++ b/addons/account_analytic_analysis/account_analytic_analysis.py
@@ -374,7 +374,25 @@ class account_analytic_account(osv.osv):
res[id] = round(res.get(id, 0.0),2)
return res
- _columns ={
+ def _is_overdue_quantity(self, cr, uid, ids, fieldnames, args, context=None):
+ result = dict.fromkeys(ids, 0)
+
+ for record in self.browse(cr, uid, ids, context=context):
+ result[record.id] = int(record.quantity >= record.quantity_max)
+
+ return result
+
+ def _get_analytic_account(self, cr, uid, ids, context=None):
+ result = set()
+ for line in self.pool.get('account.analytic.line').browse(cr, uid, ids, context=context):
+ result.add(line.account_id.id)
+ return list(result)
+
+ _columns = {
+ 'is_overdue_quantity' : fields.function(_is_overdue_quantity, method=True, type='boolean', string='Overdue Quantity',
+ store={
+ 'account.analytic.line' : (_get_analytic_account, None, 20),
+ }),
'ca_invoiced': fields.function(_ca_invoiced_calc, method=True, type='float', string='Invoiced Amount',
help="Total customer invoiced amount for this account.",
digits_compute=dp.get_precision('Account')),
diff --git a/addons/account_analytic_analysis/account_analytic_analysis_cron.xml b/addons/account_analytic_analysis/account_analytic_analysis_cron.xml
new file mode 100644
index 00000000000..7134d59414b
--- /dev/null
+++ b/addons/account_analytic_analysis/account_analytic_analysis_cron.xml
@@ -0,0 +1,15 @@
+
+
+
+
+ Analytic Account Report for Sales
+ 1
+ weeks
+ -1
+
+
+
+
+
+
+
diff --git a/addons/account_analytic_analysis/account_analytic_analysis_menu.xml b/addons/account_analytic_analysis/account_analytic_analysis_menu.xml
index badd7e1816a..a564db17dfc 100644
--- a/addons/account_analytic_analysis/account_analytic_analysis_menu.xml
+++ b/addons/account_analytic_analysis/account_analytic_analysis_menu.xml
@@ -21,5 +21,63 @@
[('date','<=',time.strftime('%Y-%m-%d')),('state','=','open')]
+
+
+ account.analytic.account.search
+ account.analytic.account
+ search
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Overdue Accounts
+ account.analytic.account
+ form
+ tree,form,graph
+ {'search_default_has_partner' : 1, 'search_default_current' : 1}
+
+
+
+
+
diff --git a/addons/account_analytic_analysis/cron_account_analytic_account.py b/addons/account_analytic_analysis/cron_account_analytic_account.py
new file mode 100644
index 00000000000..2bc8e0f98b1
--- /dev/null
+++ b/addons/account_analytic_analysis/cron_account_analytic_account.py
@@ -0,0 +1,79 @@
+#!/usr/bin/env python
+from osv import osv
+from mako.template import Template
+import time
+try:
+ import cStringIO as StringIO
+except ImportError:
+ import StringIO
+
+import tools
+
+MAKO_TEMPLATE = u"""Hello ${user.name},
+
+Here is a list of contracts that have to be renewed for two
+possible reasons:
+ - the end of contract date is passed
+ - the customer consumed more support hours than expected
+
+Can you contact the customer in order to sell a new or renew its contract.
+the contract has been set with a pending state, can you update the status
+of the analytic account following this rule:
+ - Set Done: if the customer does not want to renew
+ - Set Open: if the customer purchased an extra contract
+
+Here is the list of contracts to renew:
+% for partner, accounts in partners.iteritems():
+ * ${partner.name}
+ % for account in accounts:
+ - Name: ${account.name}
+ % if account.quantity_max != 0.0:
+ - Quantity: ${account.quantity}/${account.quantity_max} hours
+ % endif
+ - Dates: ${account.date_start} to ${account.date and account.date or '???'}
+ - Contacts:
+ % for address in account.partner_id.address:
+ . ${address.name}, ${address.phone}, ${address.email}
+ % endfor
+
+ % endfor
+% endfor
+
+You can use the report in the menu: Sales > Invoicing > Overdue Accounts
+
+Regards,
+
+--
+OpenERP
+"""
+
+class analytic_account(osv.osv):
+ _inherit = 'account.analytic.account'
+
+ def cron_account_analytic_account(self, cr, uid, context=None):
+ domain = [
+ ('name', 'not ilike', 'maintenance'),
+ ('partner_id', '!=', False),
+ ('user_id', '!=', False),
+ ('user_id.user_email', '!=', False),
+ ('state', 'in', ('draft', 'open')),
+ '|', ('date', '<', time.strftime('%Y-%m-%d')), ('date', '=', False),
+ ]
+
+ account_ids = self.search(cr, uid, domain, context=context, order='name asc')
+ accounts = self.browse(cr, uid, account_ids, context=context)
+
+ users = dict()
+ for account in accounts:
+ users.setdefault(account.user_id, dict()).setdefault(account.partner_id, []).append(account)
+
+ account.write({'state' : 'pending'}, context=context)
+
+ for user, data in users.iteritems():
+ subject = '[OPENERP] Reporting: Analytic Accounts'
+ body = Template(MAKO_TEMPLATE).render_unicode(user=user, partners=data)
+ tools.email_send('noreply@openerp.com', [user.user_email, ], subject, body)
+
+ return True
+
+analytic_account()