#!/usr/local/bin/python
# coding: utf-8
import os
import time
import math
from django.core.cache import cache
from datetime import datetime, date, timedelta
import cx_Oracle
from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
from rest_framework.renderers import JSONRenderer
from rest_framework.parsers import JSONParser
from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response
from modulos.models import Modulo
from transacciones.models import Transaccion
from conexiones.models import Conexion
from conceptos.models import Concepto
from campo_valor.models import Campo_Valor
from grupos.models import Grupo
from asientos.models import Asiento
from tablas.models import Tabla
from campo_cuenta.models import Campo_Cuenta
from workflow_transaccion.models import Workflow_Transaccion
from rel_actividad.models import Rel_Actividad
class JSONResponse(HttpResponse):
    """
    An HttpResponse that renders it's content into JSON.
    """
    def __init__(self, data, **kwargs):
        content = JSONRenderer().render(data)
        kwargs['content_type'] = 'application/json'
        super(JSONResponse, self).__init__(content, **kwargs)

@csrf_exempt
def batch_procesar(request):
	global fecha_ini
	global fecha_fin 
	global id_transaccion
	global user
	global id_modulo
	global id_cen_op
	global id_cia
	global quehace
	quehace=[]
	if request.method == 'POST':
		fecha_ini = request.POST.get('fecha_ini')
		fecha_fin = request.POST.get('fecha_fin')
		id_transaccion = request.POST.get('id_transaccion')
		id_modulo = request.POST.get('id_modulo')
		user=request.GET.get('id_username')
		id_cen_op=request.POST.get('id_cen_op')
		id_cia=request.POST.get('id_cia')
		contenedorrespuesta=[]
		relacionworktrans=Workflow_Transaccion.objects.get(id_transaccion=id_transaccion)
		workflow=relacionworktrans.id_workflow
		relaciones = Rel_Actividad.objects.filter(id_workflow=workflow.id_workflow)
		devuelveinfo=[]
		for i in range(len(relaciones)-1):
			if i == 0:
				relacioninicio = Rel_Actividad.objects.get(id_workflow=workflow.id_workflow,id_actividad_padre=0)
				ejecutarAccion(relacioninicio.id_actividad_hijo)
				id_padre=relacioninicio.id_actividad_hijo.id_actividad
			else:
				relacioninicio = Rel_Actividad.objects.get(id_workflow=workflow.id_workflow,id_actividad_padre=id_padre)
				res=ejecutarAccion(relacioninicio.id_actividad_hijo)
				id_padre=relacioninicio.id_actividad_hijo.id_actividad
		return JSONResponse(quehace)

def ejecutarAccion(Actividad):
	global transaccion
	global modulo
	global conexion
	global ejecutar
	global cuantosejecutados
	global contenedorcampovalor
	global contenedorgrupos
	global moduloconexion
	global cursormoduloconexion
	global modulocontabilidad
	global cursormodulocontabilidad
	global conceptos
	global error
	global idscadsejecutados
	error=0
	cache.set("oper", None)
	cache.set("foo", None)
	if Actividad.programa == "cargarIni()":
		transaccion = Transaccion.objects.get(id_transaccion=id_transaccion)
		modulo = Modulo.objects.get(id_modulo=id_modulo)
		conexion = modulo.id_conexion
		moduloconexionstring=conexion.username+"/"+conexion.password+"@"+conexion.host+":"+str(conexion.puerto)+"/"+conexion.esquema
		moduloconexion = cx_Oracle.connect(moduloconexionstring)
		cursormoduloconexion = moduloconexion.cursor()
		modulocontabilidadconexion = "ws_contab/Sistemas@192.168.2.45:1521/websafiINGEO"
		modulocontabilidad = cx_Oracle.connect(modulocontabilidadconexion)
		cursormodulocontabilidad = modulocontabilidad.cursor()
		contenedorcampovalor = []
		contenedorgrupos= []
		conceptos = Concepto.objects.filter(id_transaccion=id_transaccion)
		for concepto  in conceptos:
			asientos = Asiento.objects.filter(id_concepto=concepto.id_concepto)
			for asiento in asientos:
				camposvalores = {}
				grupos = {}
				camposvalores["campovalor_"+asiento.nombre]=asiento.id_campo_valor
				contenedorcampovalor.append(camposvalores)
				if asiento.usa_grupo == 1:
					grupos["grupo_"+asiento.nombre]=asiento.id_grupo
					contenedorgrupos.append(grupos)
		return "Carga los datos iniciales"
	if Actividad.programa == "ejecutarMovTesoreria()":
		cen_op=id_cen_op
		cia=id_cia
		contadorcads=0
		tipo_comprobante=transaccion.id_tipo_comprobante
		totcredito=0
		totdebito=0
		formatofecha="%Y-%m-%d"
		fechainicio=datetime.strptime(fecha_ini,formatofecha)
		fechafin=datetime.strptime(fecha_fin,formatofecha)
		delta = fechafin-fechainicio
		cantidaddias=delta.days
		listadodefechas=[]
		idscadsejecutados=[]
		idgen=0
		for i in range(cantidaddias):
			d=fechainicio+timedelta(days=i)
			buscafestivo="SELECT ID_FESTIVO FROM INFESTIVO WHERE FECHA=to_date(\'"+str(d.date())+"','YYYY-MM-DD')"
			cursormoduloconexion.execute(buscafestivo)
			estafecha=cursormoduloconexion.fetchone()
			if estafecha is None:
				listadodefechas.append(d.date())
		d=fechainicio+timedelta(days=cantidaddias)
		listadodefechas.append(d.date())
		total=float(len(listadodefechas))
		total=float(98)/total
		for fechaatrabajar in listadodefechas:
			#---Consulta CAD a ver si esta o no en el sistema
			now = fechaatrabajar
			vigencia = now.year
			periodo_contable=now.month
			fecha=str(now)
			res=cache.get("oper")
			if res is None:
				cache.set("oper", total)
				valorbar=math.floor(total)
				cache.set("foo", int(valorbar))
			else:
				oper=cache.get("oper")
				valorbar=total+oper
				cache.set("oper", valorbar)
				valorbar=math.floor(valorbar)
				cache.set("foo", int(valorbar))
			if contadorcads == 0:
				consultaconsecutivo="SELECT SEQ FROM CN_TABLE_VIG_SEQ WHERE ID_VIGENCIA="+str(vigencia)+"AND NOM_ENTIDAD='CN_CONTROL_CAD'"
				cursormodulocontabilidad.execute(consultaconsecutivo)
				idcontrolcad=cursormodulocontabilidad.fetchone()
				idgen=idcontrolcad[0]+1
			buscacad="SELECT ID_CAD FROM CN_CONTROL_CAD WHERE FECHA_CAD=to_date(\'"+str(fechaatrabajar)+"','YYYY-MM-DD') AND ID_TIPO_COMPROBANTE="+str(tipo_comprobante)
			cursormodulocontabilidad.execute(buscacad)
			existecad=cursormodulocontabilidad.fetchone()
			if existecad is None:
				rta=verificaMovimiento(fechaatrabajar)
				if len(rta)!=0:
					consultacad = "INSERT INTO WS_CONTAB.CN_CONTROL_CAD VALUES ( \'"+str(idgen)+"','"+str(vigencia)+"','"+str(cen_op)+"','"+str(cia)+"','"+str(periodo_contable)+"','"+str(tipo_comprobante)+"',to_date('"+str(fechaatrabajar)+"','YYYY-MM-DD'),'"+str(totcredito)+"','"+str(totdebito)+"','','','')"
					cursormodulocontabilidad.execute(consultacad)
					ejecutaMovimiento(idgen, fechaatrabajar, rta)
					idscadsejecutados.append(str(idgen)+","+str(vigencia))
				idgen+=1
			else:
				rta=verificaMovimiento(fechaatrabajar)
				if len(rta)!=0:
					eliminamovimientos="DELETE FROM CN_MOVIMIENTO_CONTABLE WHERE ID_CAD="+str(existecad[0])+" AND ID_VIGENCIA="+str(vigencia)
					cursormodulocontabilidad.execute(eliminamovimientos)
					eliminadocumentos="DELETE FROM CN_DOCUMENTO WHERE ID_CAD="+str(existecad[0])+" AND ID_VIGENCIA="+str(vigencia)
					cursormodulocontabilidad.execute(eliminadocumentos)
					ejecutaMovimiento(existecad[0], fechaatrabajar, rta)
					idscadsejecutados.append(str(existecad[0])+","+str(vigencia))
			contadorcads=contadorcads+1
		#modulocontabilidad.commit()
	if Actividad.programa == "retornaResul()":
		cantidadprocesados=0
		errores={}
		contenedor=[]
		contenedorerror=[]
		response={}
		rta={}
		if error==-1:
			pruebacon={}
			response['status']=3
			response['totalRows']=0
			response['startRow']=0
			response['endRow']=0
			pruebacon['mensaje']="No hay datos para procesar en la selección ingresada"
			contenedor.append(pruebacon)
			response['data']=contenedor
			rta['response']=response
			return rta
		else:
			response['status']=0
			response['startRow']=0
			response['endRow']=len(idscadsejecutados)
			for indicador in idscadsejecutados:
				cantidadprocesados+=1
				pruebacon={}
				dato=indicador.split(",")
				consultacadingresado="SELECT FECHA_CAD, TOT_DEBITO, TOT_CREDITO, ID_TIPO_COMPROBANTE FROM CN_CONTROL_CAD WHERE ID_CAD="+str(dato[0])+" AND ID_VIGENCIA="+str(dato[1])
				cursormodulocontabilidad.execute(consultacadingresado)
				datoscad=cursormodulocontabilidad.fetchone()
				buscadescripcion="SELECT NOM_TIPO_COMPROBANTE FROM CN_TIPO_COMPROBANTE WHERE ID_TIPO_COMPROBANTE="+str(datoscad[3])
				cursormodulocontabilidad.execute(buscadescripcion)
				nom=cursormodulocontabilidad.fetchone()
				fecha=datoscad[0].date()
				pruebacon['id_cad']=dato[0]
				pruebacon['fecha_cad']=fecha
				pruebacon['tot_debito']=datoscad[1]
				pruebacon['tot_credito']=datoscad[2]
				pruebacon['nom_tipo_comprobante']=nom[0]
				contenedor.append(pruebacon)
			response['totalRows']=len(idscadsejecutados)
			response['data']=contenedor
			rta['response']=response
			r=cursormodulocontabilidad.callproc("WS_CONTAB.RESET_VIG_SEQ",[1,])
			modulocontabilidad.commit()
		return rta;
	if Actividad.programa == "ejecutarMovVentasPOS()":
		estacad=[]
		cen_op=id_cen_op
		cia=id_cia
		contadorcads=0
		tipo_comprobante=transaccion.id_tipo_comprobante
		totcredito=0
		totdebito=0
		formatofecha="%Y-%m-%d"
		fechainicio=datetime.strptime(fecha_ini,formatofecha)
		fechafin=datetime.strptime(fecha_fin,formatofecha)
		delta = fechafin-fechainicio
		cantidaddias=delta.days
		listadodefechas=[]
		idscadsejecutados=[]
		idgen=0
		for i in range(cantidaddias):
			d=fechainicio+timedelta(days=i)
			buscafestivo="SELECT ID_FESTIVO FROM INFESTIVO WHERE FECHA=to_date(\'"+str(d.date())+"','YYYY-MM-DD')"
			cursormoduloconexion.execute(buscafestivo)
			estafecha=cursormoduloconexion.fetchone()
			if estafecha is None:
				listadodefechas.append(d.date())
		d=fechainicio+timedelta(days=cantidaddias)
		listadodefechas.append(d.date())
		total=float(len(listadodefechas))
		total=float(98)/total
		for fechaatrabajar in listadodefechas:
			now = fechaatrabajar
			vigencia = now.year
			periodo_contable=now.month
			fecha=str(now)
			res=cache.get("oper")
			if res is None:
				cache.set("oper", total)
				valorbar=math.floor(total)
				cache.set("foo", int(valorbar))
			else:
				oper=cache.get("oper")
				valorbar=total+oper
				cache.set("oper", valorbar)
				valorbar=math.floor(valorbar)
				cache.set("foo", int(valorbar))
			if contadorcads == 0:
				consultaconsecutivo="SELECT SEQ FROM CN_TABLE_VIG_SEQ WHERE ID_VIGENCIA="+str(vigencia)+"AND NOM_ENTIDAD='CN_CONTROL_CAD'"
				cursormodulocontabilidad.execute(consultaconsecutivo)
				idcontrolcad=cursormodulocontabilidad.fetchone()
				idgen=idcontrolcad[0]+1
			buscacad="SELECT ID_CAD FROM CN_CONTROL_CAD WHERE FECHA_CAD=to_date(\'"+str(fechaatrabajar)+"','YYYY-MM-DD') AND ID_TIPO_COMPROBANTE="+str(tipo_comprobante)
			cursormodulocontabilidad.execute(buscacad)
			existecad=cursormodulocontabilidad.fetchone()
			dat=verificaFacturaPos(fechaatrabajar)
			if existecad is None:
				if len(dat)!=0:
					consultacad = "INSERT INTO WS_CONTAB.CN_CONTROL_CAD VALUES ( \'"+str(idgen)+"','"+str(vigencia)+"','"+str(cen_op)+"','"+str(cia)+"','"+str(periodo_contable)+"','"+str(tipo_comprobante)+"',to_date('"+str(fechaatrabajar)+"','YYYY-MM-DD'),'"+str(totcredito)+"','"+str(totdebito)+"','','','')"
					cursormodulocontabilidad.execute(consultacad)
					idscadsejecutados.append(str(idgen)+","+str(vigencia))
					ejecutaMovimientoCarteraPos(idgen,fechaatrabajar,dat)
				idgen+=1
			else:
				if len(dat)!=0:
					eliminamovimientos="DELETE FROM CN_MOVIMIENTO_CONTABLE WHERE ID_CAD="+str(existecad[0])+" AND ID_VIGENCIA="+str(vigencia)
					cursormodulocontabilidad.execute(eliminamovimientos)
					eliminadocumentos="DELETE FROM CN_DOCUMENTO WHERE ID_CAD="+str(existecad[0])+" AND ID_VIGENCIA="+str(vigencia)
					cursormodulocontabilidad.execute(eliminadocumentos)
					idscadsejecutados.append(str(existecad[0])+","+str(vigencia))
					ejecutaMovimientoCarteraPos(existecad[0],fechaatrabajar,dat)
			contadorcads=contadorcads+1
		#modulocontabilidad.commit()

def verificaMovimiento(fechaEjecucion):
	tsmovbancactual=[]
	cursormoduloconexion.execute("SELECT ID,VALOR,ID_TS_TD,ESTADO,FECHA from TS_MOV_BANC WHERE FECHA=to_date(\'"+str(fechaEjecucion)+"','YYYY-MM-DD')")
	tsmovbancid=cursormoduloconexion.fetchall()
	for idmovbanc in tsmovbancid:
		tsmovbancactual.append(idmovbanc)
	return tsmovbancactual


def verificaFacturaPos(fechaEjecucion):
	datosfacturactualpos=[]
	cursormoduloconexion.execute("SELECT * from CA_FACTURA_POS WHERE trunc(FECHA_FACTURACION) = to_date(\'"+str(fechaEjecucion)+"','YYYY-MM-DD')")
	facturapos=cursormoduloconexion.fetchall()
	for factu in facturapos:
		datosfacturactualpos.append(factu)
	return datosfacturactualpos

def ejecutaMovimientoCarteraPos(idCAD,fechaEjecucion,facturaPOS):
	tsmovbanctrabajar=[]
	cuantosejecutados=0
	id_cad=idCAD
	now = fechaEjecucion
	vigencia = now.year
	cen_op=id_cen_op
	cia=id_cia
	fecha=str(now)
	consultaconsecutivomov="SELECT SEQ FROM CN_TABLE_VIG_SEQ WHERE ID_VIGENCIA="+str(vigencia)+"AND NOM_ENTIDAD='CN_MOVIMIENTO_CONTABLE'"
	cursormodulocontabilidad.execute(consultaconsecutivomov)
	idmovcontab=cursormodulocontabilidad.fetchone()
	idmovcontab=idmovcontab[0]+1
	ejecucion=-3
	idbusqueda="ID_FACTURA"
	for factura in facturaPOS:
		iddocumento=factura[0]
		idcad=id_cad
		id_vigencia=vigencia
		idcenop=cen_op
		idcia=cia
		id_maeter=user
		cursormoduloconexion.execute("SELECT ID_TS_PC_FP from CA_FACTURA_PAGO WHERE "+idbusqueda+"="+str(iddocumento))
		idtspcfp=cursormoduloconexion.fetchone()
		idtspcfp=idtspcfp[0]
		cursormoduloconexion.execute("SELECT APLICA_BN from TS_PC_FP WHERE ID="+str(idtspcfp))
		tspcfp=cursormoduloconexion.fetchone()
		tspcfp=tspcfp[0]
		anula=0
		for concepto in conceptos:
			ejecucion=1
			sqlinserciondocumento="INSERT INTO CN_DOCUMENTO VALUES("+str(factura[0])+",'"+str(id_cad)+"','"+str(vigencia)+"','"+str(cen_op)+"','"+str(cia)+"','"+str(concepto.id_tipo_documento)+"','"+user+"','"+concepto.descripcion+"','',to_date('"+fecha+"','YYYY-MM-DD'),'0','0')"
			cursormodulocontabilidad.execute(sqlinserciondocumento)
			iddocumento=factura[0]
			idcad=id_cad
			id_vigencia=vigencia
			idcenop=cen_op
			idcia=cia
			id_maeter=user
			asientosconcepto=Asiento.objects.filter(id_concepto=concepto.id_concepto)
			for asiento in asientosconcepto:
				campovalor=asiento.id_campo_valor
				tabla=campovalor.id_tabla
				nombretabla=tabla.nombre
				quehace.append("Campos de la factura para anulacion: estado:"+str(factura[12])+"fecha: "+str(factura[13]))
				if nombretabla.find("PAGO")>=0:
					formu=asiento.formula
					if len(formu)!=0:
						evaluacion=evaluaFuncion(formu)
					else:
						evaluacion=None
					nombreasiento=asiento.nombre
					if tspcfp==0 and nombreasiento.find("SIN")>0:
						if(asiento.usa_grupo==1):
							idmovcontab=ejecutaMovimientoGrupo(asiento,iddocumento,idcad,id_vigencia,idcenop,idcia,id_maeter,idmovcontab,evaluacion,idbusqueda,anula)
						else:
							ejecutaMovimientoSinGrupo(asiento,iddocumento,idcad,id_vigencia,idcenop,idcia,id_maeter,idmovcontab,evaluacion,idbusqueda,anula)
							idmovcontab=idmovcontab+1
					elif tspcfp==1 and nombreasiento.find("SIN")<0:
						if(asiento.usa_grupo==1):
							idmovcontab=ejecutaMovimientoGrupo(asiento,iddocumento,idcad,id_vigencia,idcenop,idcia,id_maeter,idmovcontab,evaluacion,idbusqueda,anula)
						else:
							ejecutaMovimientoSinGrupo(asiento,iddocumento,idcad,id_vigencia,idcenop,idcia,id_maeter,idmovcontab,evaluacion,idbusqueda,anula)
							idmovcontab=idmovcontab+1
				else:
					formu=asiento.formula
					if len(formu)!=0:
						evaluacion=evaluaFuncion(formu,iddocumento)
					else:
						evaluacion=None
					if(asiento.usa_grupo==1):
						idmovcontab=ejecutaMovimientoGrupo(asiento,iddocumento,idcad,id_vigencia,idcenop,idcia,id_maeter,idmovcontab,evaluacion,idbusqueda,anula)
					else:
						ejecutaMovimientoSinGrupo(asiento,iddocumento,idcad,id_vigencia,idcenop,idcia,id_maeter,idmovcontab,evaluacion,idbusqueda,anula)
						idmovcontab=idmovcontab+1
	return tsmovbanctrabajar

def evaluaFuncion(formula,iddocumento):
	cont=0
	variable=""
	ids=[]
	respar=[]
	for val in formula:
		variable="$"
		if val=="$":
			buscadigitos=formula[cont+1::]
			for digi in buscadigitos:
				try:
					a=int(digi)
					variable+=str(a)
				except ValueError:
					break
			try:
				posicion=ids.index(variable)
			except:
				ids.append(variable)
		cont+=1
	for idcampovalor in ids:
		separavalor=idcampovalor.split("$")
		#----Logica para la busqueda desde django
		campovalorestablecido=Campo_Valor.objects.get(id_campo_valor=int(separavalor[1]))
		tabla=campovalorestablecido.id_tabla
		cursormoduloconexion.execute("SELECT "+campovalorestablecido.nombre+" from "+tabla.nombre+" WHERE ID_FACTURA="+str(iddocumento))
		campoformula=cursormoduloconexion.fetchone()
		respar.append(campoformula[0])
		#----------------------------------------
		formula=formula.replace(idcampovalor, str(campoformula[0]))
	result=eval(formula)
	return result

def ejecutaMovimientoGrupo(asiento,iddocumento,idcad,id_vigencia,idcenop,idcia,id_maeter,idmovcontab,evaluacion,idbusqueda,anula):
	campovalor=asiento.id_campo_valor
	tabla=campovalor.id_tabla
	nombretabla=tabla.nombre
	grupo=asiento.id_grupo
	if evaluacion is None:
		cursormoduloconexion.execute("SELECT "+campovalor.nombre+" from "+tabla.nombre+" WHERE "+idbusqueda+"="+str(iddocumento))
		valori=cursormoduloconexion.fetchone()
	else:
		valori=[]
		valori.append(evaluacion)
	campocuenta=Campo_Cuenta.objects.filter(id_grupo=grupo.id_grupo)
	for campoestablecido in campocuenta:
		prueba=str(campoestablecido.auxiliar)
		if len(prueba)==0:
			querydatanoaux="SELECT ID_CATALOGO, ID_CUENTA_MAYOR, ID_GRUPO_CUENTA, ID_CLASE_CUENTA FROM CN_SUBC_DIGITOS WHERE DIGITOS="+campoestablecido.catalogo
			cursormodulocontabilidad.execute(querydatanoaux)
			datoscuenta=cursormodulocontabilidad.fetchone()
			if anula==0:
				if asiento.naturaleza == "C":
					querymovimientobancario="INSERT INTO CN_MOVIMIENTO_CONTABLE VALUES(\'"+str(idmovcontab)+"','"+str(iddocumento)+"','"+str(idcad)+"','"+str(id_vigencia)+"','"+str(idcenop)+"','"+str(idcia)+"','"+str(datoscuenta[0])+"','"+str(datoscuenta[1])+"','"+str(datoscuenta[2])+"','"+str(datoscuenta[3])+"','"+str(id_maeter)+"','','','','','0','"+str(valori[0])+"','')"
					cursormodulocontabilidad.execute(querymovimientobancario)
					quehace.append("Ejecuta con auxiliar y naturaleza Credito sin anular"+querymovimientobancario)
				else:
					querymovimientobancario="INSERT INTO CN_MOVIMIENTO_CONTABLE VALUES(\'"+str(idmovcontab)+"','"+str(iddocumento)+"','"+str(idcad)+"','"+str(id_vigencia)+"','"+str(idcenop)+"','"+str(idcia)+"','"+str(datoscuenta[0])+"','"+str(datoscuenta[1])+"','"+str(datoscuenta[2])+"','"+str(datoscuenta[3])+"','"+str(id_maeter)+"','','','','','"+str(valori[0])+"','0','')"
					cursormodulocontabilidad.execute(querymovimientobancario)
					quehace.append("Ejecuta con auxiliar y naturaleza Debito sin anular"+querymovimientobancario)
			else:
					querymovimientobancario="INSERT INTO CN_MOVIMIENTO_CONTABLE VALUES(\'"+str(idmovcontab)+"','"+str(iddocumento)+"','"+str(idcad)+"','"+str(id_vigencia)+"','"+str(idcenop)+"','"+str(idcia)+"','"+str(datoscuenta[0])+"','"+str(datoscuenta[1])+"','"+str(datoscuenta[2])+"','"+str(datoscuenta[3])+"','"+str(id_maeter)+"','','','','','0','"+str(valori[0])+"','')"
					cursormodulocontabilidad.execute(querymovimientobancario)
					quehace.append("Ejecuta con auxiliar y naturaleza credito anulando"+querymovimientobancario)
					idmovcontab=idmovcontab+1
					querymovimientobancario="INSERT INTO CN_MOVIMIENTO_CONTABLE VALUES(\'"+str(idmovcontab)+"','"+str(iddocumento)+"','"+str(idcad)+"','"+str(id_vigencia)+"','"+str(idcenop)+"','"+str(idcia)+"','"+str(datoscuenta[0])+"','"+str(datoscuenta[1])+"','"+str(datoscuenta[2])+"','"+str(datoscuenta[3])+"','"+str(id_maeter)+"','','','','','"+str(valori[0])+"','0','')"
					cursormodulocontabilidad.execute(querymovimientobancario)
					quehace.append("Ejecuta con auxiliar y naturaleza Debito anulando"+querymovimientobancario)
		else:
			querydatanoaux="SELECT ID_CATALOGO, ID_CUENTA_MAYOR, ID_GRUPO_CUENTA, ID_CLASE_CUENTA, ID_AUXILIAR FROM CN_SUBC_DIGITOS_AUX WHERE DIGITOS="+campoestablecido.catalogo+"AND COD_AUX="+campoestablecido.auxiliar
			cursormodulocontabilidad.execute(querydatanoaux)
			datoscuenta=cursormodulocontabilidad.fetchone()
			if anula==0:
				if asiento.naturaleza == "C":
					querymovimientobancario="INSERT INTO CN_MOVIMIENTO_CONTABLE VALUES(\'"+str(idmovcontab)+"','"+str(iddocumento)+"','"+str(idcad)+"','"+str(id_vigencia)+"','"+str(idcenop)+"','"+str(idcia)+"','"+str(datoscuenta[0])+"','"+str(datoscuenta[1])+"','"+str(datoscuenta[2])+"','"+str(datoscuenta[3])+"','"+str(id_maeter)+"','"+str(datoscuenta[4])+"','','','','0','"+str(valori[0])+"','')"
					cursormodulocontabilidad.execute(querymovimientobancario)
					quehace.append("Ejecuta sin auxiliar y naturaleza credito sin anular"+querymovimientobancario)
				else:
					querymovimientobancario="INSERT INTO CN_MOVIMIENTO_CONTABLE VALUES(\'"+str(idmovcontab)+"','"+str(iddocumento)+"','"+str(idcad)+"','"+str(id_vigencia)+"','"+str(idcenop)+"','"+str(idcia)+"','"+str(datoscuenta[0])+"','"+str(datoscuenta[1])+"','"+str(datoscuenta[2])+"','"+str(datoscuenta[3])+"','"+str(id_maeter)+"','"+str(datoscuenta[4])+"','','','','"+str(valori[0])+"','0','')"
					cursormodulocontabilidad.execute(querymovimientobancario)
					quehace.append("Ejecuta sin auxiliar y naturaleza Debito sin anular"+querymovimientobancario)
			else:
				querymovimientobancario="INSERT INTO CN_MOVIMIENTO_CONTABLE VALUES(\'"+str(idmovcontab)+"','"+str(iddocumento)+"','"+str(idcad)+"','"+str(id_vigencia)+"','"+str(idcenop)+"','"+str(idcia)+"','"+str(datoscuenta[0])+"','"+str(datoscuenta[1])+"','"+str(datoscuenta[2])+"','"+str(datoscuenta[3])+"','"+str(id_maeter)+"','"+str(datoscuenta[4])+"','','','','0','"+str(valori[0])+"','')"
				cursormodulocontabilidad.execute(querymovimientobancario)
				quehace.append("Ejecuta sin auxiliar y naturaleza credito anulando"+querymovimientobancario)
				idmovcontab=idmovcontab+1
				querymovimientobancario="INSERT INTO CN_MOVIMIENTO_CONTABLE VALUES(\'"+str(idmovcontab)+"','"+str(iddocumento)+"','"+str(idcad)+"','"+str(id_vigencia)+"','"+str(idcenop)+"','"+str(idcia)+"','"+str(datoscuenta[0])+"','"+str(datoscuenta[1])+"','"+str(datoscuenta[2])+"','"+str(datoscuenta[3])+"','"+str(id_maeter)+"','"+str(datoscuenta[4])+"','','','','"+str(valori[0])+"','0','')"
				cursormodulocontabilidad.execute(querymovimientobancario)
				quehace.append("Ejecuta sin auxiliar y naturaleza Debito anulando"+querymovimientobancario)
		idmovcontab=idmovcontab+1
	return idmovcontab

def ejecutaMovimientoSinGrupo(asiento,iddocumento,idcad,id_vigencia,idcenop,idcia,id_maeter,idmovcontab,evaluacion,idbusqueda,anula):
	campovalor=asiento.id_campo_valor
	tabla=campovalor.id_tabla
	nombretabla=tabla.nombre
	grupo=asiento.id_grupo
	quehace.append("Naturaleza del asiento "+asiento.naturaleza)
	if evaluacion is None:
		cursormoduloconexion.execute("SELECT "+campovalor.nombre+" from "+tabla.nombre+" WHERE "+idbusqueda+"="+str(iddocumento))
		valori=cursormoduloconexion.fetchone()
	else:
		valori=[]
		valori.append(evaluacion)
	auxasiento=str(asiento.auxiliar)
	if len(asiento.auxiliar)==0:
		querydatanoaux="SELECT ID_CATALOGO, ID_CUENTA_MAYOR, ID_GRUPO_CUENTA, ID_CLASE_CUENTA FROM CN_SUBC_DIGITOS WHERE DIGITOS="+asiento.catalogo
		cursormodulocontabilidad.execute(querydatanoaux)
		datoscuenta=cursormodulocontabilidad.fetchone()
		if anula==0:
			if asiento.naturaleza == "C":
				querymovimientobancario="INSERT INTO CN_MOVIMIENTO_CONTABLE VALUES(\'"+str(idmovcontab)+"','"+str(iddocumento)+"','"+str(idcad)+"','"+str(id_vigencia)+"','"+str(idcenop)+"','"+str(idcia)+"','"+str(datoscuenta[0])+"','"+str(datoscuenta[1])+"','"+str(datoscuenta[2])+"','"+str(datoscuenta[3])+"','"+str(id_maeter)+"','','','','','0','"+str(valori[0])+"','')"
				cursormodulocontabilidad.execute(querymovimientobancario)
				quehace.append("Ejecuta con auxiliar y naturaleza credito sin anular"+querymovimientobancario)
			else:
				querymovimientobancario="INSERT INTO CN_MOVIMIENTO_CONTABLE VALUES(\'"+str(idmovcontab)+"','"+str(iddocumento)+"','"+str(idcad)+"','"+str(id_vigencia)+"','"+str(idcenop)+"','"+str(idcia)+"','"+str(datoscuenta[0])+"','"+str(datoscuenta[1])+"','"+str(datoscuenta[2])+"','"+str(datoscuenta[3])+"','"+str(id_maeter)+"','','','','','"+str(valori[0])+"','0','')"
				cursormodulocontabilidad.execute(querymovimientobancario)
				quehace.append("Ejecuta con auxiliar y naturaleza debito sin anular"+querymovimientobancario)
		else:
			querymovimientobancario="INSERT INTO CN_MOVIMIENTO_CONTABLE VALUES(\'"+str(idmovcontab)+"','"+str(iddocumento)+"','"+str(idcad)+"','"+str(id_vigencia)+"','"+str(idcenop)+"','"+str(idcia)+"','"+str(datoscuenta[0])+"','"+str(datoscuenta[1])+"','"+str(datoscuenta[2])+"','"+str(datoscuenta[3])+"','"+str(id_maeter)+"','','','','','0','"+str(valori[0])+"','')"
			cursormodulocontabilidad.execute(querymovimientobancario)
			quehace.append("Ejecuta sin auxiliar y naturaleza credito anulando"+querymovimientobancario)
			idmovcontab=idmovcontab+1
			querymovimientobancario="INSERT INTO CN_MOVIMIENTO_CONTABLE VALUES(\'"+str(idmovcontab)+"','"+str(iddocumento)+"','"+str(idcad)+"','"+str(id_vigencia)+"','"+str(idcenop)+"','"+str(idcia)+"','"+str(datoscuenta[0])+"','"+str(datoscuenta[1])+"','"+str(datoscuenta[2])+"','"+str(datoscuenta[3])+"','"+str(id_maeter)+"','','','','','"+str(valori[0])+"','0','')"
			cursormodulocontabilidad.execute(querymovimientobancario)
			quehace.append("Ejecuta sin auxiliar y naturaleza debito anulando"+querymovimientobancario)
	else:
		querydatanoaux="SELECT ID_CATALOGO, ID_CUENTA_MAYOR, ID_GRUPO_CUENTA, ID_CLASE_CUENTA, ID_AUXILIAR FROM CN_SUBC_DIGITOS_AUX WHERE DIGITOS="+asiento.catalogo+"AND COD_AUX="+asiento.auxiliar
		cursormodulocontabilidad.execute(querydatanoaux)
		datoscuenta=cursormodulocontabilidad.fetchone()
		if anula==0:
			if asiento.naturaleza == "C":
				querymovimientobancario="INSERT INTO CN_MOVIMIENTO_CONTABLE VALUES(\'"+str(idmovcontab)+"','"+str(iddocumento)+"','"+str(idcad)+"','"+str(id_vigencia)+"','"+str(idcenop)+"','"+str(idcia)+"','"+str(datoscuenta[0])+"','"+str(datoscuenta[1])+"','"+str(datoscuenta[2])+"','"+str(datoscuenta[3])+"','"+str(id_maeter)+"','"+str(datoscuenta[4])+"','','','','0','"+str(valori[0])+"','')"
				cursormodulocontabilidad.execute(querymovimientobancario)
				quehace.append("Ejecuta sin auxiliar y naturaleza credito sin anular"+querymovimientobancario)
			else:
				querymovimientobancario="INSERT INTO CN_MOVIMIENTO_CONTABLE VALUES(\'"+str(idmovcontab)+"','"+str(iddocumento)+"','"+str(idcad)+"','"+str(id_vigencia)+"','"+str(idcenop)+"','"+str(idcia)+"','"+str(datoscuenta[0])+"','"+str(datoscuenta[1])+"','"+str(datoscuenta[2])+"','"+str(datoscuenta[3])+"','"+str(id_maeter)+"','"+str(datoscuenta[4])+"','','','','"+str(valori[0])+"','0,'')"
				cursormodulocontabilidad.execute(querymovimientobancario)
				quehace.append("Ejecuta sin auxiliar y naturaleza debito sin anular"+querymovimientobancario)
		else:
			querymovimientobancario="INSERT INTO CN_MOVIMIENTO_CONTABLE VALUES(\'"+str(idmovcontab)+"','"+str(iddocumento)+"','"+str(idcad)+"','"+str(id_vigencia)+"','"+str(idcenop)+"','"+str(idcia)+"','"+str(datoscuenta[0])+"','"+str(datoscuenta[1])+"','"+str(datoscuenta[2])+"','"+str(datoscuenta[3])+"','"+str(id_maeter)+"','"+str(datoscuenta[4])+"','','','','0','"+str(valori[0])+"','')"
			cursormodulocontabilidad.execute(querymovimientobancario)
			quehace.append("Ejecuta con auxiliar y naturaleza credito anulando - primerqa insercion"+querymovimientobancario)
			idmovcontab=idmovcontab+1
			querymovimientobancario="INSERT INTO CN_MOVIMIENTO_CONTABLE VALUES(\'"+str(idmovcontab)+"','"+str(iddocumento)+"','"+str(idcad)+"','"+str(id_vigencia)+"','"+str(idcenop)+"','"+str(idcia)+"','"+str(datoscuenta[0])+"','"+str(datoscuenta[1])+"','"+str(datoscuenta[2])+"','"+str(datoscuenta[3])+"','"+str(id_maeter)+"','"+str(datoscuenta[4])+"','','','','"+str(valori[0])+"','0','')"
			cursormodulocontabilidad.execute(querymovimientobancario)
			quehace.append("Ejecuta con auxiliar y naturaleza debito anulando"+querymovimientobancario)
	return idmovcontab

def ejecutaMovimiento(idCAD, fechaEjecucion, movimientosBancos):
	global monitoreoasiento
	tsmovbanctrabajar=[]
	cuantosejecutados=0
	id_cad=idCAD
	now = fechaEjecucion
	vigencia = now.year
	me=now.month
	cen_op=id_cen_op
	cia=id_cia
	fecha=str(now)
	consultaconsecutivomov="SELECT SEQ FROM CN_TABLE_VIG_SEQ WHERE ID_VIGENCIA="+str(vigencia)+"AND NOM_ENTIDAD='CN_MOVIMIENTO_CONTABLE'"
	cursormodulocontabilidad.execute(consultaconsecutivomov)
	idmovcontab=cursormodulocontabilidad.fetchone()
	idmovcontab=idmovcontab[0]+1
	ejecucion=-3
	idbusqueda="ID_MOV_BANC"
	for movimiento in movimientosBancos:
		id_ts_td=movimiento[2]
		ejecucion=-2
		for concepto in conceptos:
			if concepto.id_tipo_documento == id_ts_td:
				ejecutar=1
				sqlinserciondocumento="INSERT INTO CN_DOCUMENTO VALUES("+str(movimiento[0])+",'"+str(id_cad)+"','"+str(vigencia)+"','"+str(cen_op)+"','"+str(cia)+"','"+str(concepto.id_tipo_documento)+"','"+user+"','"+concepto.descripcion+"','',to_date('"+fecha+"','YYYY-MM-DD'),'0','0')"
				cursormodulocontabilidad.execute(sqlinserciondocumento)
				iddocumento=movimiento[0]
				idcad=id_cad
				id_vigencia=vigencia
				idcenop=cen_op
				idcia=cia
				id_maeter=user
				asientosconcepto=Asiento.objects.filter(id_concepto=concepto.id_concepto)
				for asiento in asientosconcepto:
					anula=0
					campovalor=asiento.id_campo_valor
					tabla=campovalor.id_tabla
					nombretabla=tabla.nombre
					formu=asiento.formula
					if len(formu)!=0:
						evaluacion=evaluaFuncion(formu,iddocumento)
					else:
						cursormoduloconexion.execute("SELECT VALOR_IMPUESTO from TS_MB_DEDUCCIONES WHERE "+idbusqueda+"="+str(movimiento[0]))
						retencion=cursormoduloconexion.fetchone()
						if retencion is None:
							cursormoduloconexion.execute("SELECT "+campovalor.nombre+" from "+tabla.nombre+" WHERE ID="+str(movimiento[0]))
							val=cursormoduloconexion.fetchone()
							valormovbanc=val[0]
						else:
							valormovbanc=retencion[0]
						evaluacion=valormovbanc
					if(asiento.usa_grupo==1):
						if movimiento[3] == 1:	
							cursormoduloconexion.execute("SELECT FECHA_ANUL from TS_ANU_MOV_BANC WHERE "+idbusqueda+"="+str(movimiento[0]))
							fechaanulacion=cursormoduloconexion.fetchone()
							fechaanulacion=fechaanulacion[0].date()
							mesanulacion=fechaanulacion.month
							anioanulacion=fechaanulacion.year
							quehace.append(fechaanulacion)
							if(mesanulacion==me and anioanulacion==vigencia):
								quehace.append("Anula el movimiento usando grupo")
								anula=1
						else:
							anula=0
						idmovcontab=ejecutaMovimientoGrupo(asiento,iddocumento,idcad,id_vigencia,idcenop,idcia,id_maeter,idmovcontab,evaluacion,idbusqueda,anula)
					else:
						if movimiento[3] == 1:	
							cursormoduloconexion.execute("SELECT FECHA_ANUL from TS_ANU_MOV_BANC WHERE "+idbusqueda+"="+str(movimiento[0]))
							fechaanulacion=cursormoduloconexion.fetchone()
							fechaanulacion=fechaanulacion[0].date()
							mesanulacion=fechaanulacion.month
							anioanulacion=fechaanulacion.year
							quehace.append(fechaanulacion)
							if(mesanulacion==me and anioanulacion==vigencia):
								quehace.append("Anula el movimiento sin usar grupo")
								anula=1
						else:
							anula=0	
						idmovcontab=ejecutaMovimientoSinGrupo(asiento,iddocumento,idcad,id_vigencia,idcenop,idcia,id_maeter,idmovcontab,evaluacion,idbusqueda,anula)

@csrf_exempt
def batch_devuelve(request):
	errores={}
	contenedor=[]
	contenedorerror=[]
	response={}
	rta1={}
	fecha_ini = request.POST.get('fecha_ini')
	fecha_fin = request.POST.get('fecha_fin')
	id_transaccion= request.POST.get('id_transaccion')
	transaccion = Transaccion.objects.get(id_transaccion=id_transaccion)
	tipo_comprobante=transaccion.id_tipo_comprobante
	modulocontabilidadconexion = "ws_contab/Sistemas@192.168.2.45:1521/websafiINGEO"
	modulocontabilidad = cx_Oracle.connect(modulocontabilidadconexion)
	cursormodulocontabilidad = modulocontabilidad.cursor()
	buscacad="SELECT ID_CAD, FECHA_CAD, TOT_DEBITO, TOT_CREDITO, ID_TIPO_COMPROBANTE FROM CN_CONTROL_CAD WHERE FECHA_CAD BETWEEN to_date(\'"+fecha_ini+"','YYYY-MM-DD') AND to_date('"+fecha_fin+"','YYYY-MM-DD') and ID_TIPO_COMPROBANTE="+str(tipo_comprobante)
	cursormodulocontabilidad.execute(buscacad)
	for cad in cursormodulocontabilidad.fetchall():
		buscadescripcion="SELECT NOM_TIPO_COMPROBANTE FROM CN_TIPO_COMPROBANTE WHERE ID_TIPO_COMPROBANTE="+str(cad[4])
		cursormodulocontabilidad.execute(buscadescripcion)
		nombrecomprobante=cursormodulocontabilidad.fetchone()
		pruebacon={}
		fecha=cad[1].date()
		pruebacon['id_cad']=cad[0]
		pruebacon['fecha_cad']=fecha
		pruebacon['tot_debito']=cad[2]
		pruebacon['tot_credito']=cad[3]
		pruebacon['nom_tipo_comprobante']=nombrecomprobante[0]
		contenedor.append(pruebacon)
	response['totalRows']=len(contenedor)
	response['data']=contenedor
	rta1['response']=response
	return JSONResponse(rta1)