# 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_grupos(request):
    #--Instancia las busquedas
    consultaGrupo=""
    consultaCuenta=""
    #--Captura los valores de grupo y campo cuenta para hacer la busqueda correspondiente
    id_grupo=request.POST.get('id_grupo')
    id_campo_cuenta=request.POST.get('id_campo_cuenta')
    #--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_grupo is not None:
        consultaGrupo=" and tab0.id_grupo="+id_grupo
    if id_campo_cuenta is not None:
        consultaCuenta=" and tab1.id_campo_cuenta="+id_campo_cuenta
    #--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 tab0.ID_GRUPO,tab0.NOMBRE,tab1.ID_CAMPO_CUENTA,tab1.VALOR,tab1.VALOR_DESCRIPCION,tab1.CATALOGO,tab1.AUXILIAR,tab2.NOMBRE as nombre_cuenta,tab3.NOM_AUX as nombre_auxiliar from IC_GRUPO tab0 join IC_CAMPO_CUENTA tab1 on tab0.id_grupo=tab1.ID_GRUPO_ID left join CN_SUBC_DIGITOS tab2 on tab2.DIGITOS=tab1.CATALOGO left join CN_SUBC_DIGITOS_AUX tab3 on tab3.DIGITOS=tab1.CATALOGO AND tab3.COD_AUX=tab1.AUXILIAR where 1=1"+consultaGrupo+consultaCuenta+" ORDER BY tab0.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['id_grupo']=DatosReporte[0]
            pruebacon['nombre']=DatosReporte[1]
            pruebacon['id_campo_cuenta']=DatosReporte[2]
            pruebacon['valor']=DatosReporte[3]
            pruebacon['valor_descripcion']=DatosReporte[4]
            pruebacon['catalogo']=DatosReporte[5]
            pruebacon['auxiliar']=DatosReporte[6]
            pruebacon['nombre_cuenta']=DatosReporte[7]
            pruebacon['nombre_auxiliar']=DatosReporte[8]
            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
    return JSONResponse(rta1)