#!/usr/local/bin/python
# coding: utf-8
import os
import time
from datetime import datetime
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)
#---Metodo para procesar datos por batch
@csrf_exempt
def batch_procesar(request):
	global contenedorcampovalor
	global contenedorgrupos
	global transaccion
	global conceptos
	global modulo
	global moduloconexion
	global cursormoduloconexion
	global modulocontabilidad
	global cursormodulocontabilidad
	global fecha_ini
	global fecha_fin 
	global transaccion
	global user
	if request.method == "GET":
		fecha_ini = request.GET.get('fecha_ini')
		fecha_fin = request.GET.get('fecha_fin')
		id_transaccion = request.GET.get('id_transaccion')
		id_modulo = request.GET.get('id_modulo')
		contenedorcampovalor = []
		contenedorgrupos= []
		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()
		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 JSONResponse("Cargado y listo para utilizar")
	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')
		contenedorcampovalor = []
		contenedorgrupos= []
		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()
		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)
		relacionworktrans=Workflow_Transaccion.objects.get(id_transaccion=id_transaccion)
		workflow=relacionworktrans.id_workflow
		relaciones = Rel_Actividad.objects.filter(id_workflow=workflow.id_workflow)
		pruebacon={}
		errores={}
		contenedor=[]
		contenedorerror=[]
		response={}
		rta={}
		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)
				ejecucion=ejecutarAccion(relacioninicio.id_actividad_hijo)
				id_padre=relacioninicio.id_actividad_hijo.id_actividad
		if ejecucion == -3:
			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
		if ejecucion == -2:
			response['status']=3
			response['totalRows']=0
			response['startRow']=0
			response['endRow']=0
			pruebacon['mensaje']="No a parametrizado conceptos en la consola"
			contenedor.append(pruebacon)
			response['data']=contenedor
			rta['response']=response
		if ejecucion == -1:
			response['status']= 3
			response['totalRows']=0
			response['startRow']=0
			response['endRow']=0
			pruebacon['mensaje']="No a ingresado parametrización contable para los datos suministrados"
			contenedor.append(pruebacon)
			response['data']=contenedor
			rta['response']=response
		else:
			consultacadingresado="SELECT FECHA_CAD, TOT_DEBITO, TOT_CREDITO FROM CN_CONTROL_CAD WHERE ID_CAD="+str(ejecucion)
			cursormodulocontabilidad.execute(consultacadingresado)
			datoscad=cursormodulocontabilidad.fetchone()
			fecha=datoscad[0].date()
			response['status']=0
			response['totalRows']=1
			response['startRow']=0
			response['endRow']=0
			pruebacon['id_cad']=ejecucion
			pruebacon['fecha_cad']=fecha
			pruebacon['tot_debito']=datoscad[1]
			pruebacon['tot_credito']=datoscad[2]
			contenedor.append(pruebacon)
			response['data']=contenedor
			rta['response']=response
		return JSONResponse(rta)

def ejecutarAccion(Actividad):
	global idcontrolcad
	global tsmovbancid
	global tsmovbanctrabajar
	global ejecutar
	global cuantosejecutados
	if Actividad.programa == "traerMov()":
		tsmovbancid=[]
		cursormoduloconexion.execute("SELECT ID from TS_MOV_BANC WHERE FECHA BETWEEN to_date(\'"+fecha_ini+"','YYYY-MM-DD') AND to_date('"+fecha_fin+"','YYYY-MM-DD')")
		for col1 in cursormoduloconexion.fetchall():
			tsmovbancid.append(col1)
		ejecutar=-1
		#return "Termine de traer los MOV"
	if Actividad.programa == "crearCAD()":
		now = datetime.now().date()
		vigencia = now.year
		cen_op=16
		cia=1
		periodo_contable=now.month
		tipo_comprobante=transaccion.id_tipo_comprobante
		fecha=str(now)
		totcredito=0
		totdebito=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()
		idcontrolcad=idcontrolcad[0]+1
		consultacad = "INSERT INTO WS_CONTAB.CN_CONTROL_CAD VALUES ( \'"+str(idcontrolcad)+"','"+str(vigencia)+"','"+str(cen_op)+"','"+str(cia)+"','"+str(periodo_contable)+"','"+str(tipo_comprobante)+"',to_date('"+fecha+"','YYYY-MM-DD'),'"+str(totcredito)+"','"+str(totdebito)+"','','','')"
		cursormodulocontabilidad.execute(consultacad)
		#modulocontabilidad.commit()
		ejecutar=-1
		#return "Termine de ejecutar la cracion del CAD, id del cad "+str(idcontrolcad)
	if Actividad.programa == "crearMOV()":
		tsmovbanctrabajar=[]
		cuantosejecutados=0
		id_cad=idcontrolcad
		now = datetime.now().date()
		vigencia = now.year
		cen_op=16
		cia=1
		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
		for idmovbanc in tsmovbancid:
			cursormoduloconexion.execute("SELECT * from TS_MOV_BANC WHERE ID="+str(idmovbanc[0]))
			nombre=cursormoduloconexion.fetchone()
			id_ts_td=nombre[4]
			ejecucion=-2
			for concepto in conceptos:
				ejecucion=-1
				if concepto.id_tipo_documento == id_ts_td:
					cuantosejecutados=cuantosejecutados+1
					ejecutar=1
					sqlinserciondocumento="INSERT INTO CN_DOCUMENTO VALUES("+str(nombre[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)
					#modulocontabilidad.commit()
					iddocumento=nombre[0]
					#tsmovbanctrabajar.append("Id del documento generado: "+str(iddocumento)+" El concepto es: "+concepto.nombre+" El id del CAD que entra es: "+str(id_cad)+" el id del tipo de documento del concepto es: "+str(concepto.id_tipo_documento)+" Y el id del tipo que viene en el ts_mov_banc es: "+str(id_ts_td))
					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:
						#tsmovbanctrabajar.append(asiento.usa_grupo)
						if asiento.usa_grupo==1:
							#tsmovbanctrabajar.append("Entra por grupo")
							grupo=asiento.id_grupo
							campovalor=asiento.id_campo_valor
							tabla=campovalor.id_tabla
							campocuenta=Campo_Cuenta.objects.filter(id_grupo=grupo.id_grupo)
							for campoestablecido in campocuenta:
								if campoestablecido.auxiliar is None:
									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()
									cursormoduloconexion.execute("SELECT VALOR_IMPUESTO from TS_MB_DEDUCCIONES WHERE ID_MOV_BANC="+str(idmovbanc[0]))
									retencion=cursormoduloconexion.fetchone()
									#tsmovbanctrabajar.append(datoscuenta)
									#tsmovbanctrabajar.append(retencion)
									if retencion is None:
										cursormoduloconexion.execute("SELECT "+campovalor.nombre+" from "+tabla.nombre+" WHERE ID="+str(idmovbanc[0]))
										val=cursormoduloconexion.fetchone()
										valormovbanc=val[0]
										#tsmovbanctrabajar.append("No tiene retencion")
									else:
										valormovbanc=retencion[0]
										#tsmovbanctrabajar.append("Tiene retencion")
									#tsmovbanctrabajar.append("No tiene auxiliar")
									#tsmovbanctrabajar.append(idmovcontab)
									#tsmovbanctrabajar.append(valormovbanc)
									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(valormovbanc)+"','')"
										cursormodulocontabilidad.execute(querymovimientobancario)
										#modulocontabilidad.commit()
									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(valormovbanc)+"','0','')"
										cursormodulocontabilidad.execute(querymovimientobancario)
										#modulocontabilidad.commit()
								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()
									cursormoduloconexion.execute("SELECT VALOR_IMPUESTO from TS_MB_DEDUCCIONES WHERE ID_MOV_BANC="+str(idmovbanc[0]))
									retencion=cursormoduloconexion.fetchone()
									#tsmovbanctrabajar.append(datoscuenta)
									#tsmovbanctrabajar.append(retencion)
									if retencion is None:
										cursormoduloconexion.execute("SELECT "+campovalor.nombre+" from "+tabla.nombre+" WHERE ID="+str(idmovbanc[0]))
										val=cursormoduloconexion.fetchone()
										valormovbanc=val[0]
										#tsmovbanctrabajar.append("No tiene retencion")
									else:
										valormovbanc=retencion[0]
										#tsmovbanctrabajar.append("Tiene retencion")
									#tsmovbanctrabajar.append("Si tiene auxiliar")
									#tsmovbanctrabajar.append(idmovcontab)
									#tsmovbanctrabajar.append(valormovbanc)
									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(valormovbanc)+"','')"
										cursormodulocontabilidad.execute(querymovimientobancario)
										#modulocontabilidad.commit()
									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(valormovbanc)+"','0','')"
										cursormodulocontabilidad.execute(querymovimientobancario)
										#modulocontabilidad.commit()
								idmovcontab=idmovcontab+1
						else:
							#tsmovbanctrabajar.append("No entra por grupo")
							campovalor=asiento.id_campo_valor
							tabla=campovalor.id_tabla
							if asiento.auxiliar is None:
								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()
								cursormoduloconexion.execute("SELECT VALOR_IMPUESTO from TS_MB_DEDUCCIONES WHERE ID_MOV_BANC="+str(idmovbanc[0]))
								retencion=cursormoduloconexion.fetchone()
								#tsmovbanctrabajar.append(datoscuenta)
								#tsmovbanctrabajar.append(retencion)
								if retencion is None:
									cursormoduloconexion.execute("SELECT "+campovalor.nombre+" from "+tabla.nombre+" WHERE ID="+str(idmovbanc[0]))
									val=cursormoduloconexion.fetchone()
									valormovbanc=val[0]
									#tsmovbanctrabajar.append("No tiene retencion")
								else:
									valormovbanc=retencion[0]
									#tsmovbanctrabajar.append("Tiene retencion")
								#tsmovbanctrabajar.append("No tiene auxiliar")
								#tsmovbanctrabajar.append(idmovcontab)
								#tsmovbanctrabajar.append(valormovbanc)
								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(valormovbanc)+"','')"
									cursormodulocontabilidad.execute(querymovimientobancario)
									#modulocontabilidad.commit()
								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(valormovbanc)+"','0','')"
									cursormodulocontabilidad.execute(querymovimientobancario)
									#modulocontabilidad.commit()
							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()
								cursormoduloconexion.execute("SELECT VALOR_IMPUESTO from TS_MB_DEDUCCIONES WHERE ID_MOV_BANC="+str(idmovbanc[0]))
								retencion=cursormoduloconexion.fetchone()
								#tsmovbanctrabajar.append(datoscuenta)
								#tsmovbanctrabajar.append(retencion)
								if retencion is None:
									cursormoduloconexion.execute("SELECT "+campovalor.nombre+" from "+tabla.nombre+" WHERE ID="+str(idmovbanc[0]))
									val=cursormoduloconexion.fetchone()
									valormovbanc=val[0]
									#tsmovbanctrabajar.append("No tiene retencion")
								else:
									valormovbanc=retencion[0]
									#tsmovbanctrabajar.append("Tiene retencion")
								#tsmovbanctrabajar.append("No tiene auxiliar")
								#tsmovbanctrabajar.append(idmovcontab)
								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(valormovbanc)+"','')"
									cursormodulocontabilidad.execute(querymovimientobancario)
									#modulocontabilidad.commit()
								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(valormovbanc)+"','0,'')"
									cursormodulocontabilidad.execute(querymovimientobancario)
									#modulocontabilidad.commit()
							idmovcontab=idmovcontab+1
		return tsmovbanctrabajar
	if Actividad.programa == "actualizarCAD()":
		#return "Entre a actualizar valores en la tabla de acuerdo al storedProcedure, la cantidad de dtaos procesados es de : "+str(cuantosejecutados)
		if ejecutar == 1:
			#return "Ejecuta el storedProcedure, hubo ejecucion de parametrizacion contable"
			return idcontrolcad
		else:
			#return "Borra el CAD ingresado, no actualiza, no hubo ejecucion"
			return ejecutar
