# Create your views here.
#!/usr/local/bin/python
# coding: utf-8
#--Importa la bilbioteca de manejo de sistema operativo python
import os
from django.conf import settings
#--Importa la biblioteca de manejo de tiempo Python
import time
#--Importa la biblioteca de manejo de base de datos Oracle
import cx_Oracle
#--Importa el manejo de respuestas de DJANGO
from django.http import HttpResponse
#--Importa el decorador para manejo de excepcion en la autenticacion
from django.views.decorators.csrf import csrf_exempt
#--Bibliotecas para el manejo del REST y de JSON
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
#--Importa los modelos en caso de necesitarlos
from consola.models import Actividad,Conexion,Modulo,Transaccion,Workflow,Workflow_Transaccion,Tabla,Campo_Valor,Grupo,Campo_Cuenta,Concepto
#--Importa lo serializadores
from consola.serializers import *
#--Clase que transforma la respuesta en JSON
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)

#--Definicion que devuelve la vigencia de acuerdo al dia
@csrf_exempt
def reporte_general_modulo(request):
    #--Crea las instancias para las consultas
    consultaModulo=""
    consultaTransaccion=""
    consultaConcepto=""
    #--Captura los valores de modulo y transaccion para hacer la busqueda correspondiente
    id_modulo=request.POST.get('id_modulo')
    id_transaccion=request.POST.get('id_transaccion')
    id_concepto=request.POST.get('id_concepto')
    #--Captura los valores de paginacion
    iniPaginacion=request.POST.get('_startRow')
    finPaginacion=request.POST.get('_endRow')
    #--Verifica los valores que vienen para la consulta
    if id_modulo is not None:
        consultaModulo=" and tab5.id_modulo="+id_modulo
    if id_transaccion is not None:
        consultaTransaccion=" and tab2.id_transaccion="+id_transaccion
    if id_concepto is not None:
        consultaConcepto=" and tab1.id_concepto="+id_concepto
    #--Verifica valores para paginacion
    if iniPaginacion is None:
        iniPaginacion=0
    if finPaginacion is None:
        finPaginacion=75
    #--Contenedor de datos de los cads ejecutados
    contenedor=[]
    #--Contenedor que maneja las respuestas construidas
    response={}
    #--Variable que retorna el resultado para serializado en JSON
    rta1={}
    #--Genera el string de conexion y genera el cursor de ejecucion en Base de datos para CX_ORACLE para contabilidad
    modulocontabilidadconexion = getattr(settings, 'RUTA_BD', 'default_value')
    modulocontabilidad = cx_Oracle.connect(modulocontabilidadconexion)
    cursormodulocontabilidad = modulocontabilidad.cursor()
    #--Se sube el sql de la consulta para el reporte correspondiente
    sql="select tab1.nombre as nombre_concepto,tab2.id_tipo_comprobante,tab6.nom_tipo_comprobante,tab7.nombre as nombre_valor,tab0.naturaleza,tab3.nombre as nombre_grupo,tab0.catalogo,tab0.auxiliar,tab0.usa_grupo,tab2.id_transaccion,tab5.id_modulo,tab8.nombre as nombre_tabla from ic_asiento tab0 join ic_concepto tab1 on tab0.id_concepto_id=tab1.id_concepto join ic_transaccion tab2 on tab1.id_transaccion_id=tab2.id_transaccion left join ic_grupo tab3 on tab0.id_grupo_id=tab3.id_grupo join ic_modulo tab5 on tab5.id_modulo=tab2.id_modulo_id join cn_tipo_comprobante tab6 on tab2.id_tipo_comprobante=tab6.id_tipo_comprobante join ic_campo tab7 on tab0.id_campo_valor_id =tab7.id_campo_valor join ic_tabla tab8 on tab7.id_tabla_id=tab8.id_tabla where 1=1"+consultaModulo+consultaTransaccion+consultaConcepto+" order by tab1.nombre"
    sqlCount="select count(*) as count from("+sql+")tabla"
    sqlPaginado="SELECT * FROM ( SELECT row_.*, ROWNUM rownum_ FROM ("+sql+") row_ WHERE ROWNUM <=  "+str(finPaginacion)+"   ) where rownum_ >  "+str(iniPaginacion)
    #--Ejecuta la consulta correspondiente
    cursormodulocontabilidad.execute(sqlPaginado)
    #--Captura los valores correspondientes a la busqueda
    resultados=cursormodulocontabilidad.fetchall()
    if len(resultados)!=0:
        for DatosReporte in resultados:
            pruebacon={}
            pruebacon['nombre_concepto']=DatosReporte[0]
            pruebacon['id_tipo_comprobante']=DatosReporte[1]
            pruebacon['nom_tipo_comprobante']=DatosReporte[2]
            pruebacon['nombre_valor']=DatosReporte[3]
            pruebacon['naturaleza']=DatosReporte[4]
            pruebacon['nombre']=DatosReporte[5]
            pruebacon['catalogo']=DatosReporte[6]
            pruebacon['auxiliar']=DatosReporte[7]
            pruebacon['usa_grupo']=DatosReporte[8]
            pruebacon['nombre_tabla']=DatosReporte[11]
            contenedor.append(pruebacon)
        #--Construye el objeto para ser serializado por JSON
        response['totalRows']=len(contenedor)
        response['startRow']=iniPaginacion
        response['endRow']=finPaginacion
        response['data']=contenedor
        rta1['response']=response
    else:
        #--Contenedor para el mensaje de error
        pruebacon={}
        #--Configura la respuesta del JSON para generar error en el GWT
        response['status']=3
        response['totalRows']=0
        response['startRow']=0
        response['endRow']=0
        pruebacon['mensaje']="No hay datos para procesar la busqueda ingresada"
        contenedor.append(pruebacon)
        response['data']=contenedor
        rta1['response']=response
        #--Retorna la lista que va a ser transformada en JSON con la respuesta de error
    return JSONResponse(rta1)

