diff --git a/addons/account/account_invoice.py b/addons/account/account_invoice.py index 1d34dd86596..f2481d88f08 100644 --- a/addons/account/account_invoice.py +++ b/addons/account/account_invoice.py @@ -1381,7 +1381,7 @@ class account_invoice_line(osv.osv): 'quantity': fields.float('Quantity', digits_compute= dp.get_precision('Product Unit of Measure'), required=True), 'discount': fields.float('Discount (%)', digits_compute= dp.get_precision('Discount')), 'invoice_line_tax_id': fields.many2many('account.tax', 'account_invoice_line_tax', 'invoice_line_id', 'tax_id', 'Taxes', domain=[('parent_id','=',False)]), - 'account_analytic_id': fields.many2one('account.analytic.account', 'Analytic Account'), + 'account_analytic_id': fields.many2one('account.analytic.account', 'Analytic Account'), 'company_id': fields.related('invoice_id','company_id',type='many2one',relation='res.company',string='Company', store=True, readonly=True), 'partner_id': fields.related('invoice_id','partner_id',type='many2one',relation='res.partner',string='Partner',store=True) } diff --git a/addons/account_followup/account_followup.py b/addons/account_followup/account_followup.py index 13c903605e8..ccf049d6367 100644 --- a/addons/account_followup/account_followup.py +++ b/addons/account_followup/account_followup.py @@ -39,8 +39,6 @@ class followup(osv.osv): } _sql_constraints = [('company_uniq', 'unique(company_id)', 'Only one follow-up per company is allowed')] -followup() - class followup_line(osv.osv): @@ -96,7 +94,6 @@ Best Regards, (_check_description, 'Your description is invalid, use the right legend or %% if you want to use the percent character.', ['description']), ] -followup_line() class account_move_line(osv.osv): @@ -111,14 +108,10 @@ class account_move_line(osv.osv): 'followup_line_id': fields.many2one('account_followup.followup.line', 'Follow-up Level', ondelete='restrict'), #restrict deletion of the followup line 'followup_date': fields.date('Latest Follow-up', select=True), - 'payment_commitment':fields.text('Commitment'), - 'payment_date':fields.date('Date'), - 'payment_next_action':fields.text('Next Action'), 'result':fields.function(_get_result, type='float', method=True, string="Balance") #'balance' field is not the same } -account_move_line() class email_template(osv.osv): @@ -130,7 +123,6 @@ class email_template(osv.osv): context['current_date'] = fields.date.context_today(cr, uid, context) return super(email_template, self).render_template(cr, uid, template, model, res_id, context=context) -email_template() class res_partner(osv.osv): @@ -149,7 +141,7 @@ class res_partner(osv.osv): - def get_latest_from_company(self, cr, uid, ids, names, arg, context=None, company_id=None): + def _get_latest(self, cr, uid, ids, names, arg, context=None, company_id=None): res={} if company_id == None: company = self.pool.get('res.users').browse(cr, uid, uid, context=context).company_id @@ -176,37 +168,6 @@ class res_partner(osv.osv): 'latest_followup_level_id': latest_level, 'latest_followup_level_id_without_lit': latest_level_without_lit} return res - - def _get_latest(self, cr, uid, ids, names, arg, context=None): - return self.get_latest_from_company(cr, uid, ids, names, arg, context=context) - - - #Not used, but works, field next_followup_level_id - def _get_next_followup_level_id(self, cr, uid, ids, name, arg, context=None): - company = self.pool.get("res.users").browse(cr, uid, uid, context=context).company_id - res = {} - for partner in self.browse(cr, uid, ids, context=context): - #Get latest - latest_id = partner.latest_followup_level_id_without_lit.id - latest = latest_id and self.pool.get('account_followup.followup.line').browse(cr, uid, latest_id, context=context) or False - old_delay = latest and latest.delay or False - print "Old Delay", old_delay - newlevel = latest and latest.id or False - delay = False - #Search next - fl_ar = self.pool.get('account_followup.followup.line').search(cr, uid, [('followup_id.company_id.id','=', company.id)]) - for fl_obj in self.pool.get('account_followup.followup.line').browse(cr, uid, fl_ar, context=context): - if not old_delay: - if not delay or fl_obj.delay < delay: - delay = fl_obj.delay - newlevel = fl_obj.id - else: - if (not delay and (fl_obj.delay > old_delay)) or ((fl_obj.delay < delay) and (fl_obj.delay > old_delay)): - delay = fl_obj.delay - newlevel = fl_obj.id - res[partner.id] = newlevel - return res - def do_partner_manual_action(self, cr, uid, partner_ids, context=None): @@ -281,7 +242,7 @@ class res_partner(osv.osv): return unknown_mails def action_done(self, cr, uid, ids, context=None): - self.write(cr, uid, ids, {'payment_next_action_date': False, 'payment_next_action':'', 'payment_responsible_id': False}, context=context) + return self.write(cr, uid, ids, {'payment_next_action_date': False, 'payment_next_action':'', 'payment_responsible_id': False}, context=context) def do_button_print(self, cr, uid, ids, context=None): assert(len(ids) == 1) @@ -303,16 +264,10 @@ class res_partner(osv.osv): self.do_partner_mail(cr, uid, ids, context=context) - def _get_aml_storeids(self, cr, uid, ids, context=None): - partnerlist = [] - for aml in self.pool.get("account.move.line").browse(cr, uid, ids, context=context): - if aml.partner_id.id not in partnerlist: - partnerlist.append(aml.partner_id.id) - return partnerlist - _inherit = "res.partner" _columns = { - 'payment_responsible_id':fields.many2one('res.users', ondelete='set null', string='Follow-up Responsible', help="Responsible for making sure the action happens."), #TODO find better name for field + 'payment_responsible_id':fields.many2one('res.users', ondelete='set null', string='Follow-up Responsible', + help="Responsible for making sure the action happens."), 'payment_note':fields.text('Customer Payment Promise', help="Payment Note"), 'payment_next_action':fields.text('Next Action', help="This is the next action to be taken by the user. It will automatically be set when the action fields are empty and the partner gets a follow-up level that requires a manual action. "), @@ -334,12 +289,8 @@ class res_partner(osv.osv): help="The maximum follow-up level without taking into account the account move lines with litigation", store=False, multi="latest"), - 'next_followup_level_id':fields.function(_get_next_followup_level_id, method=True, type='many2one', relation='account_followup.followup.line', - string="Next Level", help="The next follow-up level to come when the customer still refuses to pay", - store=False), + 'payment_amount_due':fields.related('credit', type='float', string="Total amount due", readonly=True), } -res_partner() - # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account_followup/test/account_followup.yml b/addons/account_followup/test/account_followup.yml index b5613db9fbd..54dd3280984 100644 --- a/addons/account_followup/test/account_followup.yml +++ b/addons/account_followup/test/account_followup.yml @@ -16,10 +16,10 @@ - I create a follow-up. - - !record {model: account.followup.print, id: account_followup_print_0}: + !record {model: account_followup.print, id: account_followup_print_0}: {} - I will process follow-ups - - !python {model: account.followup.print}: | + !python {model: account_followup.print}: | self.do_process(cr, uid, [ref("account_followup_print_0")], {"active_ids": [ref("account_followup.account_followup_print_menu")], "active_id": ref("account_followup.account_followup_print_menu"),}) \ No newline at end of file diff --git a/addons/account_followup/tests/__init__.py b/addons/account_followup/tests/__init__.py new file mode 100644 index 00000000000..cf0ea3acbe6 --- /dev/null +++ b/addons/account_followup/tests/__init__.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Business Applications +# Copyright (c) 2012-TODAY OpenERP S.A. +# +# 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 . +# +############################################################################## +from . import test_account_followup + +checks = [ + test_account_followup, +] + +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file diff --git a/addons/account_followup/tests/test_account_followup.py b/addons/account_followup/tests/test_account_followup.py new file mode 100644 index 00000000000..e9c5984c3a5 --- /dev/null +++ b/addons/account_followup/tests/test_account_followup.py @@ -0,0 +1,62 @@ + + +from datetime import datetime + +import tools +from openerp.tests.common import TransactionCase + +class TestAccountFollowup(TransactionCase): + def setUp(self): + """ setUp ***""" + super(TestAccountFollowup, self).setUp() + cr, uid = self.cr, self.uid + + self.user = self.registry('res.users') + self.user_id = self.user.browse(cr, uid, uid) + self.partner = self.registry('res.partner') + self.invoice = self.registry('account.invoice') + self.invoice_line = self.registry('account.invoice.line') + self.wizard = self.registry('account_followup.print') + self.followup_id = self.registry('account_followup.followup') + + self.partner_id = self.partner.create(cr, uid, {'name':'Test Company', + 'email':'test@localhost', + 'is_company': True,}, + context=None) + self.followup_id = self.registry("ir.model.data").get_object_reference(cr, uid, "account_followup", "demo_followup1")[1] + self.account_id = self.registry("ir.model.data").get_object_reference(cr, uid, "account", "a_sale")[1] + self.invoice_id = self.invoice.create(cr, uid, {'partner_id': self.partner_id, + 'account_id': self.account_id, + }, context=None) + #self.invoice_line_id = self.invoice_line.create(cr, uid, {'name': 'Product A', +# 'quantity': 5, +# 'price':251.21, +# 'invoice_id':self.invoice_id}, +# context=None) + #self.invoice.write(cr, uid, self.invoice_id, {'invoice_line': (4, self.invoice_line_id, {})}) +# self.invoice.action_date_assign(cr, uid, self.invoice_id) +# self.invoice.action_move_create(cr, uid, self.invoice_id, context=None) +# self.invoice.action_number(cr, uid, self.invoice_id, context=None) +# self.invoice.invoice_validate(cr, uid, self.invoice_id, context=None) + + + + def test_00_send_followup_after_3_days(self): + cr, uid = self.cr, self.uid + self.wizard_id = self.wizard.create(cr, uid, { + 'date':datetime.now().strftime("%Y-%m-%d"), + 'followup_id': self.followup_id + }, context={"followup_id": self.followup_id}) + self.wizard.do_process(cr, uid, [self.wizard_id], context={"followup_id": self.followup_id}) + self.assertFalse(self.partner.browse(cr, uid, self.partner_id).latest_followup_level_id) + self.wizard_id = self.wizard.create(cr, uid, { + 'date':(datetime.now() + datetime.timedelta(days=15)).strftime("%Y-%m-%d"), + 'followup_id': self.followup_id + }, context={"followup_id": self.followup_id}) + self.wizard.do_process(cr, uid, [self.wizard_id], context={"followup_id": self.followup_id}) + self.assertTrue(self.partner.browse(cr, uid, self.partner_id).latest_followup_level_id) + + + + + \ No newline at end of file diff --git a/addons/account_followup/wizard/account_followup_print.py b/addons/account_followup/wizard/account_followup_print.py index 554d37e2df2..78514018786 100644 --- a/addons/account_followup/wizard/account_followup_print.py +++ b/addons/account_followup/wizard/account_followup_print.py @@ -77,7 +77,6 @@ account_followup_stat_by_partner() class account_followup_sending_results(osv.osv_memory): - def do_report(self, cr, uid, ids, context=None): return context['report_data'] @@ -97,7 +96,7 @@ class account_followup_sending_results(osv.osv_memory): res = context['needprinting'] return res - _name = 'account.followup.sending.results' + _name = 'account_followup.sending.results' _description = 'Results from the sending of the different letters and emails' _columns = { 'description':fields.text("Description", required=False, readonly=True), @@ -113,7 +112,7 @@ account_followup_sending_results() class account_followup_print(osv.osv_memory): - _name = 'account.followup.print' + _name = 'account_followup.print' _description = 'Print Follow-up & Send Mail to Customers' _columns = { 'date': fields.date('Follow-up Sending Date', required=True, @@ -156,7 +155,7 @@ class account_followup_print(osv.osv_memory): resulttext = " " for partner in self.pool.get('account_followup.stat.by.partner').browse(cr, uid, partner_ids, context=context): if partner.max_followup_id.manual_action: - partner_obj.do_partner_manual_action(cr, uid, [partner.partner_id.id], context) + partner_obj.do_partner_manual_action(cr, uid, [partner.partner_id.id], context=context) nbmanuals = nbmanuals + 1 key = partner.partner_id.payment_responsible_id.name or _("Nobody") if not key in manuals.keys(): @@ -164,7 +163,7 @@ class account_followup_print(osv.osv_memory): else: manuals[key] = manuals[key] + 1 if partner.max_followup_id.send_email: - nbunknownmails += partner_obj.do_partner_mail(cr, uid, [partner.partner_id.id], context) + nbunknownmails += partner_obj.do_partner_mail(cr, uid, [partner.partner_id.id], context=context) nbmails += 1 if partner.max_followup_id.send_letter: partner_ids_to_print.append(partner.id) @@ -184,7 +183,7 @@ class account_followup_print(osv.osv_memory): resulttext = resulttext + "
  • " + item + ":" + str(manuals[item]) + "\n
  • " resulttext += "

    " result = {} - action = partner_obj.do_partner_print(cr, uid, partner_ids_to_print, data, context) + action = partner_obj.do_partner_print(cr, uid, partner_ids_to_print, data, context=context) result['needprinting'] = needprinting result['resulttext'] = resulttext result['action'] = action or {} @@ -196,16 +195,35 @@ class account_followup_print(osv.osv_memory): if to_update[id]['partner_id'] in partner_list: self.pool.get('account.move.line').write(cr, uid, [int(id)], {'followup_line_id': to_update[id]['level'], 'followup_date': date}) + + def clear_manual_actions(self, cr, uid, partner_list, context=None): + #Partnerlist is list to exclude + + partner_list_ids = [partner.partner_id.id for partner in self.pool.get('account_followup.stat.by.partner').browse(cr, uid, partner_list, context=context)] + print "Clear Manual actions ids" + print partner_list_ids + parts = self.pool.get('res.partner').browse(cr, uid, partner_list_ids, context=context) + for part in parts: + print part.name, part.payment_responsible_id + ids = self.pool.get('res.partner').search(cr, uid, ['&', ('credit', '<=', 0), '&', ('id','not in',partner_list_ids), '|', ('payment_responsible_id', '!=', False), + ('payment_next_action_date', '!=', False)]) + parts = self.pool.get('res.partner').browse(cr, uid, ids, context=context) + print ids + self.pool.get('res.partner').action_done(cr, uid, ids, context=context) + def do_process(self, cr, uid, ids, context=None): + #Get partners tmp = self._get_partners_followp(cr, uid, ids, context=context) partner_list = tmp['partner_ids'] to_update = tmp['to_update'] - date = self.browse(cr, uid, ids, context)[0].date - data = self.read(cr, uid, ids, [], context)[0] + date = self.browse(cr, uid, ids, context=context)[0].date + data = self.read(cr, uid, ids, [], context=context)[0] data['followup_id'] = data['followup_id'][0] + #Update and process partners self.do_update_followup_level(cr, uid, to_update, partner_list, date, context=context) restot = self.process_partners(cr, uid, partner_list, data, context=context) - res = restot['action'] + self.clear_manual_actions(cr, uid, partner_list, context=context) + res = restot['action'] mod_obj = self.pool.get('ir.model.data') if context is None: context = {} diff --git a/addons/account_followup/wizard/account_followup_print_view.xml b/addons/account_followup/wizard/account_followup_print_view.xml index 21e37f03eb4..2def3550533 100644 --- a/addons/account_followup/wizard/account_followup_print_view.xml +++ b/addons/account_followup/wizard/account_followup_print_view.xml @@ -4,7 +4,7 @@ account.followup.print.form - account.followup.print + account_followup.print
    @@ -27,7 +27,7 @@ Send Follow-Ups - account.followup.print + account_followup.print form form new @@ -70,8 +70,8 @@ - account.followup.sending.results.form - account.followup.sending.results + account_followup.sending.results.form + account_followup.sending.results
    diff --git a/addons/lunch/tests/test_lunch.py b/addons/lunch/tests/test_lunch.py index 128e4796611..51672881d06 100644 --- a/addons/lunch/tests/test_lunch.py +++ b/addons/lunch/tests/test_lunch.py @@ -23,7 +23,6 @@ import tools from openerp.tests import common class Test_Lunch(common.TransactionCase): - def setUp(self): """*****setUp*****""" super(Test_Lunch, self).setUp()