You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

383 lines
17 KiB

# -*- encoding: utf-8 -*-
###########################################################################
# Module Writen to OpenERP, Open Source Management Solution
# Copyright (C) OpenERP Venezuela (<http://openerp.com.ve>).
# All Rights Reserved
###############Credits######################################################
# 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 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
##############################################################################
import xml
import copy
from operator import itemgetter
import time
import datetime
from report import report_sxw
from tools import config
class account_analisis_cuentas(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context):
super(account_analisis_cuentas, self).__init__(cr, uid, name, context)
self.sum_debit = 0.00
self.sum_credit = 0.00
self.sum_balance = 0.00
self.sum_debit_fy = 0.00
self.sum_credit_fy = 0.00
self.sum_balance_fy = 0.00
self.date_lst = []
self.date_lst_string = ''
self.localcontext.update({
'time': time,
'lines': self.lines,
'get_fiscalyear_text': self.get_fiscalyear_text,
'get_periods_and_date_text': self.get_periods_and_date_text,
'get_inf_text': self.get_informe_text,
'set_fecha': self.set_fecha,
})
self.context = context
def set_fecha(self, fecha):
f = fecha.split('-')
date = datetime.date(int(f[0]),int(f[1]),int(f[2]))
return str(date.strftime("%d/%m/%Y"))
def get_fiscalyear_text(self, form):
"""
Returns the fiscal year text used on the report.
"""
fiscalyear_obj = self.pool.get('account.fiscalyear')
fiscalyear = None
if form.get('fiscalyear'):
fiscalyear = fiscalyear_obj.browse(self.cr, self.uid, form['fiscalyear'])
return fiscalyear.name or fiscalyear.code
else:
fiscalyear = fiscalyear_obj.browse(self.cr, self.uid, fiscalyear_obj.find(self.cr, self.uid))
return "%s*" % (fiscalyear.name or fiscalyear.code)
def get_informe_text(self, form):
"""
Returns the header text used on the report.
"""
inf_type = {
'bgen' : ' Balance General',
'bcom' : ' Balance de Comprobacion',
'edogp': 'Estado de Ganancias y Perdidas',
'bac': ' Analisis de Cuentas',
'bml': ' Mayor Analitico'
}
return inf_type[form['inf_type']]
def get_periods_and_date_text(self, form):
"""
Returns the text with the periods/dates used on the report.
"""
period_obj = self.pool.get('account.period')
periods_str = None
fiscalyear_id = form['fiscalyear'] or fiscalyear_obj.find(self.cr, self.uid)
period_ids = period_obj.search(self.cr, self.uid, [('fiscalyear_id','=',fiscalyear_id), ('special','=',False)])
if form['filter'] in ['byperiod', 'all']:
period_ids = form['periods']
periods_str = ', '.join([period.name or period.code for period in period_obj.browse(self.cr, self.uid, period_ids)])
dates_str = None
if form['filter'] in ['bydate', 'all']:
dates_str = self.formatLang(form['date_from'], date=True) + ' - ' + self.formatLang(form['date_to'], date=True) + ' '
return {'periods':periods_str, 'date':dates_str}
def es_especial(self, periods):
period_obj = self.pool.get('account.period')
period_brws = period_obj.browse(self.cr, self.uid, periods)
tod=0
for p_b in period_brws:
if p_b.special:
tod = tod + 1
if tod == len(periods):
return True
else:
return False
def calcular_debito_credito(self, account, form):
res = {}
if form['filter'] in ('bydate','none'):
#Para filtrar por 'fechas' o 'sin filtro', este porque se envia el año fiscal por fecha.
where = """ and aml.date between '%s' and '%s'"""%(form['date_from'],form['date_to'])
elif form['filter'] == 'byperiod':
#Para filtrar por periodos
periodos = str(form['periods']).replace("[","(").replace("]",")")
where = """ and aml.period_id in %s"""%(periodos)
else:
#Para filtrar por periodos y fechas
periodos = str(form['periods']).replace("[","(").replace("]",")")
where = """ and aml.period_id in %s and aml.date between '%s' and '%s'"""%(periodos,form['date_from'],form['date_to'])
if form.get('state'):
estado = " and am.state = '%s'"%form['state']
where = where + estado
analytic_list = str(form['analytic_list']).replace("[","(").replace("]",")")
where = where + " and aaa.id in " + analytic_list
account_list = str(account).replace("[","(").replace("]",")")
where = where + " and aa.id in " + account_list
sql_saldos = """select aml.account_id as id,
COALESCE(SUM(aml.debit), 0) as debit,
COALESCE(SUM(aml.credit), 0) as credit
from account_move_line aml
inner join account_analytic_account aaa on aml.analytic_account_id = aaa.id
inner join account_journal aj on aj.id = aml.journal_id
inner join account_account aa on aa.id = aml.account_id
inner join account_period ap on ap.id = aml.period_id
inner join account_move am on am.id = aml.move_id
where aml.state <> 'draft'""" + where + \
""" group by aml.account_id"""
self.cr.execute(sql_saldos)
resultat = self.cr.dictfetchall()
for det in resultat:
res[det['id']] = {
'debit': det['debit'],
'credit': det['credit'],
}
return res
def _get_analisis_cuenta_analitica(self, account, form):
res = []
if form['filter'] in ('bydate','none'):
#Para filtrar por 'fechas' o 'sin filtro', este porque se envia el año fiscal por fecha.
where = """ and aml.date between '%s' and '%s'"""%(form['date_from'],form['date_to'])
elif form['filter'] == 'byperiod':
#Para filtrar por periodos
periodos = str(form['periods']).replace("[","(").replace("]",")")
where = """ and aml.period_id in %s"""%(periodos)
else:
#Para filtrar por periodos y fechas
periodos = str(form['periods']).replace("[","(").replace("]",")")
where = """ and aml.period_id in %s and aml.date between '%s' and '%s'"""%(periodos,form['date_from'],form['date_to'])
if form.get('state'):
estado = " and am.state = '%s'"%form['state']
where = where + estado
where = where + " and aa.id = '%s'"%(account['id'])
analytic_list = str(form['analytic_list']).replace("[","(").replace("]",")")
where = where + " and aaa.id in " + analytic_list
sql_detalle = """select aml.id as id, aj.name as diario,
aa.name as descripcion,
(select name from res_partner where aml.partner_id = id) as partner,
aa.code as cuenta, aml.name || ' -- Ref: ' || aml.ref as ref,
case when aml.debit is null then 0.00 else aml.debit end as debit,
case when aml.credit is null then 0.00 else aml.credit end as credit,
aml.date as fecha, ap.name as periodo,
aaa.code as analitica
from account_move_line aml
inner join account_analytic_account aaa on aml.analytic_account_id = aaa.id
inner join account_journal aj on aj.id = aml.journal_id
inner join account_account aa on aa.id = aml.account_id
inner join account_period ap on ap.id = aml.period_id
inner join account_move am on am.id = aml.move_id
where aml.state <> 'draft'""" + where + \
""" order by analitica, fecha"""
self.cr.execute(sql_detalle)
resultat = self.cr.dictfetchall()
balance = account['balanceinit']
for det in resultat:
balance += det['debit'] - det['credit']
res.append({
'id': det['id'],
'date': det['fecha'],
'journal':det['diario'],
'ref': det['ref'],
'debit': det['debit'],
'credit': det['credit'],
'analytic': det['analitica'],
'period': det['periodo'],
'balance': balance,
})
return res
def lines(self, form, ids={}, done=None, level=0):
"""
Returns all the data needed for the report lines
(account info plus debit/credit/balance in the selected period
and the full year)
"""
tot_bin = 0.0
tot_deb = 0.0
tot_crd = 0.0
tot_eje = 0.0
if not ids:
ids = self.ids
if not ids:
return []
if not done:
done = {}
if form.has_key('account_list') and form['account_list']:
account_ids = form['account_list']
del form['account_list']
res = {}
result_acc = []
accounts_levels = {}
account_obj = self.pool.get('account.account')
period_obj = self.pool.get('account.period')
fiscalyear_obj = self.pool.get('account.fiscalyear')
# Get the fiscal year
fiscalyear = None
if form.get('fiscalyear'):
fiscalyear = fiscalyear_obj.browse(self.cr, self.uid, form['fiscalyear'])
else:
fiscalyear = fiscalyear_obj.browse(self.cr, self.uid, fiscalyear_obj.find(self.cr, self.uid))
#
# Get the accounts
#
def _get_children_and_consol(cr, uid, ids, level, context={}):
aa_obj = self.pool.get('account.account')
ids2=[]
temp=[]
read_data= aa_obj.read(cr, uid, ids,['id','child_id','level','type'], context)
for data in read_data:
if data['child_id'] and data['level'] < level and data['type']!='consolidation':
#ids2.append([data['id'],'Label', 'Total'])
ids2.append([data['id'],True, False])
temp=[]
for x in data['child_id']:
temp.append(x)
ids2 += _get_children_and_consol(cr, uid, temp, level, context)
ids2.append([data['id'],False,True])
else:
ids2.append([data['id'],True,True])
return ids2
child_ids = _get_children_and_consol(self.cr, self.uid, account_ids, form['display_account_level'] and form['display_account_level'] or 100,self.context)
if child_ids:
account_ids = child_ids
account_obj = self.pool.get('account.account')
period_obj = self.pool.get('account.period')
fiscalyear_obj = self.pool.get('account.fiscalyear')
#############################################################################
# Calculate the period Debit/Credit #
# (from the selected period or all the non special periods in the fy) #
#############################################################################
ctx = self.context.copy()
ctx['filter'] = form.get('filter','all')
ctx['fiscalyear'] = fiscalyear.id
if ctx['filter'] not in ['bydate','none']:
especial = self.es_especial(form['periods'])
else:
especial = False
if form['filter'] in ['byperiod', 'all']:
if especial:
ctx['periods'] = period_obj.search(self.cr, self.uid, [('id','in',form['periods'] or ctx['periods'])])
else:
ctx['periods'] = period_obj.search(self.cr, self.uid, [('id','in',form['periods'] or ctx['periods']), ('special','=',False)])
if form['filter'] in ['bydate','all','none']:
ctx['date_from'] = form['date_from']
ctx['date_to'] = form['date_to']
accounts=[]
val = account_obj.browse(self.cr, self.uid, [aa_id[0] for aa_id in account_ids], ctx)
"""DESDE AQUI VOY A COMENZAR A CAMBIAR"""
#Extraer cuentas que no son tipo vista
cuenta_ids = {}
for cue in val:
if cue.type != 'view':
cuenta_ids[cue.id] = cue
account_ids = self.calcular_debito_credito(cuenta_ids.keys(), form)
if account_ids != {}:
for acc in account_ids.keys():
new_acc = {
'id' :acc,
'type' :cuenta_ids[acc].type,
'code' :str(cuenta_ids[acc].code),
'name' :cuenta_ids[acc].name.upper(),
'parent_id' :cuenta_ids[acc].parent_id and cuenta_ids[acc].parent_id.id,
'level' :cuenta_ids[acc].level,
'label' :True,
'total' :True,
'debit' :account_ids[acc]['debit'],
'credit' :account_ids[acc]['credit'],
}
accounts.append(new_acc)
def missing_period():
ctx['fiscalyear'] = fiscalyear_obj.search(self.cr, self.uid, [('date_stop','<',fiscalyear.date_start)],order='date_stop') and \
fiscalyear_obj.search(self.cr, self.uid, [('date_stop','<',fiscalyear.date_start)],order='date_stop')[-1] or []
ctx['periods'] = period_obj.search(self.cr, self.uid, [('fiscalyear_id','=',ctx['fiscalyear']),('date_stop','<',fiscalyear.date_start)])
#############################################################################
# Calculate the period initial Balance #
# (fy balance minus the balance from the start of the selected period #
# to the end of the year) #
#############################################################################
ctx = self.context.copy()
if form.get('state'):
ctx['state'] = form['state']
if form.get('analytic_list'):
ctx['analytic_list'] = form['analytic_list']
ctx['filter'] = form.get('filter','all')
ctx['fiscalyear'] = fiscalyear.id
if form['filter'] in ['byperiod']:
ctx['periods'] = form['periods']
date_start = min([period.date_start for period in period_obj.browse(self.cr, self.uid, ctx['periods'])])
ctx['periods'] = period_obj.search(self.cr, self.uid, [('fiscalyear_id','=',fiscalyear.id),('date_stop','<=',date_start)])
if not ctx['periods']:
missing_period()
elif form['filter'] in ['bydate', 'all']:
ctx['date_from'] = fiscalyear.date_start
ctx['date_to'] = form['date_from']
ctx['periods'] = period_obj.search(self.cr, self.uid, [('fiscalyear_id','=',fiscalyear.id),('date_stop','<=',ctx['date_to'])])
elif form['filter'] == 'none':
ctx['date_from'] = form['date_from']
ctx['date_to'] = form['date_to']
ctx['periods'] = period_obj.search(self.cr, self.uid, [('fiscalyear_id','=',fiscalyear.id),('special','=',True)])
date_start = min([period.date_start for period in period_obj.browse(self.cr, self.uid, ctx['periods'])])
ctx['periods'] = period_obj.search(self.cr, self.uid, [('fiscalyear_id','=',fiscalyear.id),('date_start','<=',date_start),('special','=',True)])
for acc in accounts:
if especial:
acc['balanceinit'] = 0.0
acc['balance'] = acc['debit'] - acc['credit']
else:
account_ids_ant = self.calcular_debito_credito([acc['id']], ctx)
if account_ids_ant != {}:
acc['balanceinit'] = account_ids_ant[acc['id']]['debit'] - account_ids_ant[acc['id']]['credit']
acc['balance'] = acc['balanceinit'] + acc['debit'] - acc['credit']
else:
acc['balanceinit'] = 0.0
acc['balance'] = acc['debit'] - acc['credit']
for acc_anl in accounts:
acc_anl['analisis'] = self._get_analisis_cuenta_analitica(acc_anl,form)
accounts.sort(key=lambda x: x['code'])
return accounts
report_sxw.report_sxw('report.wizard.reporte.comprobacion.analisis.cuentas', 'wizard.reporte.comprobacion', 'l10n_ve_account_financial_report/report/analisis_cuentas.rml', parser=account_analisis_cuentas, header=False)