odoo/addons/account_followup/wizard/wizard_followup_print.py

140 lines
4.9 KiB
Python
Raw Normal View History

##############################################################################
#
# Copyright (c) 2006 TINY SPRL. (http://tiny.be) All Rights Reserved.
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsability of assessing all potential
# consequences resulting from its eventual inadequacies and bugs
# End users who are looking for a ready-to-use solution with commercial
# garantees and support are strongly adviced to contract a Free Software
# Service Company
#
# This program is Free Software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
##############################################################################
import wizard
import datetime
import pooler
class followup_all_print(wizard.interface):
# _followup_wizard_all_form = """<?xml version="1.0"?>
#<form string="Parameters" colspan="4">
# <field name="type"/>
#</form>"""
#
# _followup_wizard_all_fields = {
# 'type': {
# 'string': "Follow up base on",
# 'type': 'selection',
# 'selection': [('maturity', 'Maturity date'),
# ('date', 'Creation Date')]
# },
# }
# this method gets the list of all partners who need a follow up of any
# level AND marks the movelines of thoses partners with the current date
# and the level of followup reached
#CHECKME: shouldn't we also make sure that partners owe us money, and not the
# opposite?
def _get_all_partners(self, cr, uid, data, context):
cr.execute(
"SELECT l.partner_id, l.followup_line_id, l.date, l.id "\
"FROM account_move_line AS l LEFT JOIN account_account AS a "\
"ON (l.account_id=a.id) "\
"WHERE (l.reconcile_id IS NULL) "\
"AND (a.type='receivable') AND (l.debit > 0) "\
"AND (l.state<>'draft') "\
"ORDER BY l.date")
move_lines = cr.fetchall()
old = None
fups = {}
fup_ids = pooler.get_pool(cr.dbname).get('account_followup.followup').search(cr, uid, [])
if not fup_ids:
raise wizard.except_wizard('No Follow up Defined',
'You must define at least one follow up for your company !')
#Ged> DUH!
fup_id = fup_ids[0]
# fups = {
# previous fup line id: (limit date for current fup line,
# current fup line id),
# ...
# }
current_date = datetime.date.today()
cr.execute(
"SELECT * "\
"FROM account_followup_followup_line "\
"WHERE followup_id=%d "\
"ORDER BY sequence", (fup_id,))
for result in cr.dictfetchall():
# compute date from when move lines entered earlier than it need
# a follow up
delay = datetime.timedelta(days=result['delay'])
fups[old] = (current_date - delay, result['id'])
if result['start'] == 'end_of_month':
#CHECKME: I have a bad feeling about this...
# but it depends on the semantic of the field, which I don't
# know
fups[old][0].replace(day=1)
# old = id of previous fup line
old = result['id']
# we don't want any followup after the last one
fups[old] = (datetime.date(datetime.MAXYEAR, 12, 31), old)
partner_list = []
for partner_id, followup_line_id, date, id in move_lines:
if (partner_id in partner_list) or (not partner_id):
continue
# if the move line has already a followup line but it is invalid,
# we just skip the move line.
# Note that having no follow-up line *is* valid because of the way
# fups is constructed (fups[None] = ...)
if followup_line_id not in fups:
continue
# if the move_line happened before the limit date for this level
# of followup, we mark the partner as needing a follow up, and
# mark the line has having had this level of follow up
if date <= fups[followup_line_id][0].strftime('%Y-%m-%d'):
partner_list.append(partner_id)
cr.execute(
"UPDATE account_move_line "\
"SET followup_line_id=%d, followup_date=%s "\
"WHERE id=%d",
(fups[followup_line_id][1],
current_date.strftime('%Y-%m-%d'), id,))
return {'partner_id': partner_list}
states = {
#'init' : {
# 'actions': [],
# 'result': {'type': 'form', 'arch':_followup_wizard_all_form, 'fields':_followup_wizard_all_fields, 'state':[('end','Cancel'),('print','Print Follow Ups')]},
#},
#'print' : {
'init': {
'actions': [_get_all_partners],
'result': {'type':'print', 'report':'account_followup.followup.print', 'state':'end'},
},
}
followup_all_print('account_followup.followup.print.all')