Files
ciec2026/condominio_coyoacan/procesos.py
2025-12-21 15:14:34 -06:00

383 lines
17 KiB
Python

from django.db import transaction
from django.db import connection
from .models import AcumuladoMes, Registro, CuotasCondominio, Movimiento, Condomino, CuentaBanco, Asiento
from catalogos.models import CuentaContable, PeriodoCorte
from ciec.procesos import dictfetchall, execsql, styles_workbook
from datetime import datetime, timedelta
import pandas as pd
def run_estado_cuenta(condominos, filename):
consulta = '''
select r.id, c.depto, c.poseedor, r.fecha as FECHA, r.descripcion as DESCRIPCION,
r.haber as CARGOS, r.debe as DEPOSITOS, r.saldo as SALDO
from condominio_coyoacan_registro r,
condominio_coyoacan_condomino c
where r.condomino_id = c.id
and c.id = {id}
order by r.fecha desc, r.id desc
'''
writer = pd.ExcelWriter(filename,
engine='xlsxwriter',
datetime_format='dd/mmm/yyyy',
date_format='dd/mmm/yyyy')
for c in condominos:
q = consulta.format(id = c['id'])
rows = execsql(q)
df = pd.DataFrame(rows)
df['cargos'] = df['cargos'].astype(float)
df['depositos'] = df['depositos'].astype(float)
df['saldo'] = df['saldo'].astype(float)
df = df.drop(columns = ['id', 'depto', 'poseedor'])
df = df.rename(columns = {'fecha' : 'Fecha',
'descripcion' : 'Descripcion',
'cargos' : 'Cargos',
'depositos' : 'Depositos',
'saldo' : 'Saldo'
})
hoja = c['depto']
dfR = df.rename_axis(None)
i = len(dfR.index) + 10
j = len(dfR.index) + 7
dfR.to_excel(writer, sheet_name = hoja, startrow = 5)
titulo = " CONDOMINIO COYOACAN 1045 "
subtitulo = " ESTADO DE CUENTA DEL DEPARTAMENTO {depto} {poseedor} ".format(depto = hoja,
poseedor = c['poseedor'])
subtitulob = " SALDO AL {} POR $ {:,}".format('CORTE', c['adeudo'])
workbook = writer.book
worksheet = writer.sheets[hoja]
#formatos = styles_workbook(workbook)
f_titulos = workbook.add_format({'bold': True, 'align': 'center', 'valign': 'vcenter'})
f_celdas = workbook.add_format({'align': 'center', 'valign': 'vcenter'})
f_bordes = workbook.add_format({'bottom': 1})
f_descripcion = workbook.add_format({'align': 'left', 'valign': 'vjustify'})
f_numeros = workbook.add_format({'num_format': '#,##0.00', 'valign': 'vcenter'})
f_fechas = workbook.add_format({'align': 'center', 'valign': 'vcenter', 'num_format' : 'dd/mmm/yyyy' })
f_cabeceras = workbook.add_format({'bold': True, 'text_wrap': True, 'valign': 'top', 'align' : 'center', 'fg_color': '#D7E4BC', 'border': 1})
f_condicion1 = workbook.add_format({'bold': True, 'bg_color': '#FFC7CE', 'font_color': '#9C0006'})
f_condicion2 = workbook.add_format({'bold': True, 'bg_color': '#C6EFCE', 'font_color': '#006100'})
f_ocultar = workbook.add_format({'font_color': '#FFFFFF'})
worksheet.set_column('B:B', 15, f_fechas)
worksheet.set_column('D:F', 15, f_numeros)
worksheet.set_column('C:C', 50, f_descripcion)
worksheet.merge_range('B2:F2', titulo, f_titulos)
worksheet.merge_range('B3:F3', subtitulo, f_titulos)
worksheet.merge_range('B4:F4', subtitulob, f_titulos)
worksheet.conditional_format('D7:D' + str(i),
{'type' : 'cell',
'criteria' : '=',
'value' : 0,
'format' : f_ocultar
})
worksheet.conditional_format('E7:E' + str(i),
{'type' : 'cell',
'criteria' : '=',
'value' : 0,
'format' : f_ocultar
})
worksheet.conditional_format('B7:C' + str(i),
{'type' : 'formula',
'criteria' : '=$E7>0',
'format' : f_condicion2
})
worksheet.conditional_format('B4:B4',
{'type' : 'formula',
'criteria' : '=$F$7>0',
'format' : f_condicion1
})
worksheet.conditional_format('B4:B4',
{'type' : 'formula',
'criteria' : '=$F$7<=0',
'format' : f_condicion2
})
for col_num, value in enumerate(dfR.columns.values):
worksheet.write(5, col_num + 1, value, f_cabeceras)
worksheet.conditional_format('B7:N' + str(i),
{'type': 'cell',
'criteria': '<>',
'value': '""',
'format': f_bordes})
worksheet.set_portrait()
worksheet.set_paper(1)
worksheet.center_horizontally()
#worksheet.center_vertically()
worksheet.repeat_rows(0, 5)
worksheet.print_area('B7:G' + str(i))
worksheet.fit_to_pages(1, 0)
#worksheet.hide_gridlines(0)
worksheet.set_header('&LCIEC Cuotas, Ingresos y Egresos Condominales &Rciec.adanisoft.com')
worksheet.set_footer('&CPágina &P de &N &RImpreso el &D')
writer.close()
return filename.getvalue()
def run_detalle_ingresos_egresos(fecha_inicial, fecha_final, filename):
consulta = '''
select min(fecha_movimiento) as fecha_inicio,
max(fecha_movimiento) as fecha_fin,
count(cc.num_cuenta) as cuantos,
cc.num_cuenta as cuenta,
cc.descripcion as conepto,
comentario as subconcepto,
case when sum(m.deposito) > 0 then sum(d.monto) else 0 end as deposito,
case when sum(m.retiro) > 0 then sum(d.monto) else 0 end as retiro
from condominio_coyoacan_detalle_movimiento d,
condominio_coyoacan_movimiento m,
cuenta_contable cc
where d.movimiento_id = m.id
and d.cuenta_contable_id = cc.id
and m.fecha_movimiento >= '{ini}'
and m.fecha_movimiento <= '{fin}'
group by cc.descripcion, comentario, cc.num_cuenta order by 4,5,6
'''
consulta = consulta.format(ini = fecha_inicial.strftime('%Y-%m-%d'), fin = fecha_final.strftime('%Y-%m-%d'))
rows = execsql(consulta)
df = pd.DataFrame(rows)
df['deposito'] = df['deposito'].astype(float)
df['retiro'] = df['retiro'].astype(float)
df = df.drop(columns = ['cuenta'])
df = df.rename(columns = { 'fecha_inicio': 'Fecha inicio',
'fecha_fin' : 'Fecha final',
'cuantos' : 'Cantidad',
'concepto' : 'Concepto',
'subconcepto' : 'subConcepto',
'deposito' : 'Deposito',
'retiro' : 'Retiro'
})
writer = pd.ExcelWriter(filename, engine='xlsxwriter', datetime_format='dd/mm/yyyy', date_format='dd/mm/yyyy')
titulo = "CONDOMINIO COYOACAN 1045"
subtitulo = "DETALLE DE INGRESOS Y EGRESOS DESDE EL {} HASTA EL {}".format(fecha_inicial.strftime('%d/%m/%Y'), fecha_final.strftime('%d/%m/%Y'))
dfR = df.rename_axis(None)
dfR.to_excel(writer, sheet_name = 'HOJA', startrow = 5)
i = len(dfR.index) + 10
j = len(dfR.index) + 7
workbook = writer.book
worksheet = writer.sheets['HOJA']
#
f_titulos = workbook.add_format({'bold': True, 'align': 'center', 'valign': 'vcenter'})
f_celdas = workbook.add_format({'align': 'center', 'valign': 'vcenter'})
f_bordes = workbook.add_format({'bottom': 1})
f_descripcion = workbook.add_format({'align': 'left', 'valign': 'vjustify'})
f_numeros = workbook.add_format({'num_format': '#,##0.00', 'valign': 'vcenter'})
f_fechas = workbook.add_format({'align': 'center', 'valign': 'vcenter', 'num_format' : 'dd/mmm/yyyy' })
f_cabeceras = workbook.add_format({'bold': True, 'text_wrap': True, 'valign': 'top', 'align' : 'center', 'fg_color': '#D7E4BC', 'border': 1})
f_condicion1 = workbook.add_format({'bold': True, 'bg_color': '#FFC7CE', 'font_color': '#9C0006'})
f_condicion2 = workbook.add_format({'bold': True, 'bg_color': '#C6EFCE', 'font_color': '#006100'})
f_ocultar = workbook.add_format({'font_color': '#FFFFFF'})
worksheet.set_column('B:C', 15, f_fechas )
worksheet.set_column('G:H', 15, f_numeros )
worksheet.set_column('E:E', 40)
worksheet.set_column('F:F', 20)
worksheet.set_column('D:D', 10, f_celdas)
worksheet.merge_range('B2:I2', titulo, f_titulos)
worksheet.merge_range('B3:I3', subtitulo, f_titulos)
worksheet.write('G' + str(j), '=SUM(G7:G{row})'.format(row=j-1))
worksheet.write('H' + str(j), '=SUM(H7:H{row})'.format(row=j-1))
for col_num, value in enumerate(dfR.columns.values):
worksheet.write(5, col_num + 1, value, f_cabeceras )
worksheet.conditional_format('B7:N' + str(i),
{'type': 'cell',
'criteria': '<>',
'value': '""',
'format': f_bordes})
worksheet.set_portrait()
worksheet.set_paper(1)
worksheet.center_horizontally()
#worksheet.center_vertically()
worksheet.repeat_rows(0, 5)
worksheet.print_area('B7:I' + str(i))
worksheet.fit_to_pages(1, 0)
#worksheet.hide_gridlines(0)
worksheet.set_header('&LCIEC Cuotas, Ingresos y Egresos Condominales &Rciec.adanisoft.com')
worksheet.set_footer('&CPágina &P de &N &RImpreso el &D')
writer.close()
return filename.getvalue()
def run_acum_coyoacan(condominio, shortname):
print(" generando acumulados %s " % shortname)
with transaction.atomic():
borrado = ''
nq1 = ''
nq2 = ''
#
# Borra acumulados
if shortname == "COYOACAN":
borrado = 'delete from condominio_coyoacan_acumulado_mes'
nq1 = '''
select nombre, clabe as cuenta, cb.saldo_inicial, min(fecha_movimiento) as fecha
from condominio_coyoacan_movimiento m,
condominio_coyoacan_cuenta_banco cb,
periodo_corte p,
condominio c
where cb.id = m.cuenta_banco_id
and m.fecha_movimiento >= p.fecha_inicial
and m.fecha_movimiento <= p.fecha_final
and c.nombre = 'COYOACAN'
and p.id = 10
group by 1,2,3
order by 4,2
'''
nq2 = '''
select 'Condominio' as nombre, clabe as cuenta, to_char(fecha_movimiento,'MM-YYYY') as mes,
min(fecha_movimiento) as fec_ini,
max(fecha_movimiento) as fec_fin,
round(sum(deposito),2) as depositos,
round(sum(retiro),2) as retiros,
round(sum(deposito)-sum(retiro),2) as diferencia
from condominio_coyoacan_movimiento m,
condominio_coyoacan_cuenta_banco cb,
periodo_corte p
where cb.id = m.cuenta_banco_id
and fecha_movimiento >= p.fecha_inicial
and fecha_movimiento <= p.fecha_final
and p.id = 10
group by 1,2,3
order by 2,4,3
'''
#print(borrado,nq1,nq2)
n = execsql(borrado)
#
# Trae saldo inicial de cada cuenta
saldo_condominio = 0
rows = execsql(nq1)
print(rows)
#
# Por cada cuenta
for r in rows:
saldo = float(r['saldo_inicial'])
#
# Agrega depositos y retiros por cuenta y mes
rows2 = execsql(nq2)
for r2 in rows2:
if r2['cuenta'] == r['cuenta']:
saldo = round(saldo + float(r2['depositos']) - float(r2['retiros']), 2)
print(r2['cuenta'], r2['mes'], r2['depositos'], r2['retiros'], saldo)
reg = AcumuladoMes(cuenta_banco=r2['cuenta'], \
mes=r2['mes'], \
fecha_inicial=r2['fec_ini'], \
fecha_final=r2['fec_fin'], \
depositos=r2['depositos'], \
retiros=r2['retiros'], \
saldo=saldo)
reg.save()
if r['cuenta'] != '000000000000000000':
saldo_condominio = saldo_condominio + saldo
# print(saldo_condominio)
#
# Actualiza saldo en periodos
oPer = PeriodoCorte.objects.get(id=10)
oPer.saldo_final = saldo_condominio
oPer.save()
def run_determinacionSaldos_coyoacan(condomino):
print(" determinando saldos %s " % condomino.depto)
with transaction.atomic():
# tipo = TipoMovimiento.objects.get(id=21)
# prop = TipoMovimiento.objects.get(id=30)
cuenta = CuentaContable.objects.get(id=82)
# prove = Proveedore.objects.get(id=1)
#
# Borra asientos
n = execsql('delete from condominio_coyoacan_registro where condomino_id = %s' % condomino.id)
#
# Agrega adeudo inicial
if not condomino.depto == '0000':
ade = condomino.adeudo_inicial
sal = 0
deb = 0
sal = sal + deb - ade
# adeudo = condomino.adeudo_inicial
reg_i = Registro(fecha=condomino.fecha_adeudo_inicial, \
descripcion='SALDO INICIAL A LA FECHA', \
debe=deb, \
haber=ade, \
saldo=sal, \
cuenta_contable=cuenta, \
condomino=condomino)
reg_i.save()
#
# Agrega adeudos por cuotas
rows = CuotasCondominio.objects.all().order_by('mes_inicial')
for r in rows:
delta = (r.mes_final - r.mes_inicial)
# print(r.descripcion,r.mes_inicial,r.mes_final,r.monto,r.cuenta_contable,delta.days)
condom = r.condomino.filter(depto__contains=condomino.depto)
if condom:
base = r.mes_inicial
for x in range(0, delta.days + 1):
fecha = base + timedelta(days=x)
if fecha.day == 1:
reg_a = Registro(fecha=fecha, \
descripcion='CARGO {}'.format(r.descripcion), \
debe=0, \
haber=r.monto, \
saldo=0, \
cuenta_contable=r.cuenta_contable, \
condomino=condomino)
reg_a.save()
#
# Agrega depositos por movimiento de banco
if not condomino.depto == '0000':
movtos = Movimiento.objects.filter(condomino__id=condomino.id).order_by('fecha_movimiento', 'id')
for m in movtos:
reg_m = Registro(fecha=m.fecha_movimiento, \
descripcion=m.descripcion, \
debe=m.deposito, \
haber=0, \
saldo=0, \
cuenta_contable=r.cuenta_contable, \
condomino=condomino)
reg_m.save()
asientos = Asiento.objects.filter(condomino_id=condomino.id).order_by('fecha', 'id')
for a in asientos:
reg_a = Registro(fecha=a.fecha, \
descripcion=a.descripcion, \
debe=a.debe, \
haber=a.haber, \
saldo=a.saldo, \
cuenta_contable=a.cuenta_contable, \
condomino=condomino)
reg_a.save()
# Recalcula saldos
if not condomino.depto == '0000':
sal = 0
car = 0
dep = 0
rec = Registro.objects.filter(condomino__id=condomino.id).order_by('fecha', 'id')
for rr in rec:
car = car + rr.haber
dep = dep + rr.debe
sal = sal + rr.haber - rr.debe
rr.saldo = sal
rr.save()
reg_c = Condomino.objects.get(id=condomino.id)
reg_c.cargos = car
reg_c.abonos = dep
reg_c.saldo = sal
reg_c.save()