#--Importa libreria de sistema operativo Python
import os
#--Importa libreria de tiempo Python
import time
#--Importa libreria manejo Oracle
import cx_Oracle
#--Importa respuesta http de DJANGO
from django.http import HttpResponse
#--Importa decorador para autenticacion
from django.views.decorators.csrf import csrf_exempt
#--Importa librerias para el manejo de REST y 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 Modelos de las clases que se van a utilizar
from conceptos.models import Concepto
from transacciones.models import Transaccion
from campo_valor.models import Campo_Valor
from grupos.models import Grupo
from asientos.models import Asiento
#--Importa serializador en caso de necesitarse
from conceptos.serializers import *

#--Clase que transforma una respuesta HTTP 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)

#--Metodo para la accion LIST
#--Entrada: 
#---request: Requerimiento Http de entrada
#--Salida:
#---JSON con el listado
@csrf_exempt
def asiento_list(request):
    #--Revisa si el requerimiento viene desde GET o POST
    if request.method == 'GET':
        #--Captura el valor de filtrado
        id_concepto = request.GET.get('id_concepto')
        #--Revisa si viene o no un valor para filtrar
        if id_concepto is None:
            #--Trae un listado con todos los elementos organizados por el nombre
            actividades = sorted(Asiento.objects.all(), key=lambda a: a.nombre)
        else:
            #--Filtra las actividades por el concepto organizandolas por el nombre
            actividades = sorted(Asiento.objects.filter(id_concepto=id_concepto), key=lambda a: a.nombre)
        #--Se construiye un contenedor para almacenar los objetos
        contenedor=[]
        #--Contador de elementos en la busqueda
        fila=1
        #--Recorre los elementos para almacenarlos
        for actividad in actividades:
            #--Contenedor que almacena los datos del objeto
            info={}
            #--Se cargan los objetos con los atributos
            info["id_asiento"] = actividad.id_asiento
            info["id_concepto"] = actividad.id_concepto.id_concepto
            info["nombre_con"] = actividad.id_concepto.nombre
            campo_valor = actividad.id_campo_valor
            #--Revisa si tiene una instancia de campo valor para agregarlos
            if isinstance(campo_valor, Campo_Valor):
                info["id_campo_valor"] = actividad.id_campo_valor.id_campo_valor
                info["nombre_cam"] = actividad.id_campo_valor.nombre 
            else:
                info["id_campo_valor"] = actividad.id_campo_valor
            grupo = actividad.id_grupo
            #--Revisa si existe una instancia de grupo para agregarlos
            if isinstance(grupo, Grupo):
                info["id_grupo"] = actividad.id_grupo.id_grupo
                info["nombre_gru"] = actividad.id_grupo.nombre 
            else:
                info["id_grupo"] = actividad.id_grupo
            if actividad.id_concepto.cod_concepto_generico is not None:
                info["cod_concep"]=actividad.id_concepto.cod_concepto_generico
            else:
                info["cod_concep"]=None
            info["nombre"] = actividad.nombre
            info["descripcion"] = actividad.descripcion
            info["catalogo"] = actividad.catalogo
            info["auxiliar"] = actividad.auxiliar
            info["naturaleza"] = actividad.naturaleza
            #--Se revisa si esta o no activo el uso del grupo para devolver el valor
            if actividad.usa_grupo == 1:
                info["usa_grupo"] = "true"
            else:
                info["usa_grupo"] = "false"
            info["formula"] = actividad.formula
            info["rownum_"] = fila
            #--Agrega el objeto al contenedor
            contenedor.append(info)
            #--Sube en uno el contador de objetos
            fila+=1
        #--Construye el JSON de respuesta para GWT   
        response={}
        total={}
        response['status']=0
        response['totalRows']=len(actividades)
        response['startRow']=0
        response['endRow']=len(actividades)
        response['data']=contenedor
        total['response']=response
        #--Devuelve el JSON
        return JSONResponse(total)
    elif request.method == 'POST':
        #--Captura el valor de filtrado
        id_concepto = request.POST.get('id_concepto')
        #--Revisa si viene o no un valor para filtrar
        if id_concepto is None:
            #--Trae un listado con todos los elementos organizados por el nombre
            actividades = sorted(Asiento.objects.all(), key=lambda a: a.nombre)
        else:
            #--Filtra las actividades por el concepto organizandolas por el nombre
            actividades = sorted(Asiento.objects.filter(id_concepto=id_concepto), key=lambda a: a.nombre)
        #--Se construiye un contenedor para almacenar los objetos
        contenedor=[]
        #--Contador de elementos en la busqueda
        fila=1
        #--Recorre los elementos para almacenarlos
        for actividad in actividades:
            #--Contenedor que almacena los datos del objeto
            info={}
            #--Se cargan los objetos con los atributos
            info["id_asiento"] = actividad.id_asiento
            info["id_concepto"] = actividad.id_concepto.id_concepto
            info["nombre_con"] = actividad.id_concepto.nombre
            campo_valor = actividad.id_campo_valor
            #--Revisa si tiene una instancia de campo valor para agregarlos
            if isinstance(campo_valor, Campo_Valor):
                info["id_campo_valor"] = actividad.id_campo_valor.id_campo_valor
                info["nombre_cam"] = actividad.id_campo_valor.nombre 
            else:
                info["id_campo_valor"] = actividad.id_campo_valor
            grupo = actividad.id_grupo
            #--Revisa si existe una instancia de grupo para agregarlos
            if isinstance(grupo, Grupo):
                info["id_grupo"] = actividad.id_grupo.id_grupo
                info["nombre_gru"] = actividad.id_grupo.nombre 
            else:
                info["id_grupo"] = actividad.id_grupo
            if actividad.id_concepto.cod_concepto_generico is not None:
                info["cod_concep"]=actividad.id_concepto.cod_concepto_generico
            else:
                info["cod_concep"]=None
            info["nombre"] = actividad.nombre
            info["descripcion"] = actividad.descripcion
            info["catalogo"] = actividad.catalogo
            info["auxiliar"] = actividad.auxiliar
            info["naturaleza"] = actividad.naturaleza
            #--Se revisa si esta o no activo el uso del grupo para devolver el valor
            if actividad.usa_grupo == 1:
                info["usa_grupo"] = "true"
            else:
                info["usa_grupo"] = "false"
            info["formula"] = actividad.formula
            info["rownum_"] = fila
            #--Agrega el objeto al contenedor
            contenedor.append(info)
            #--Sube en uno el contador de objetos
            fila+=1
        #--Construye el JSON de respuesta para GWT
        response={}
        total={}
        response['status']=0
        response['totalRows']=len(actividades)
        response['startRow']=0
        response['endRow']=len(actividades)
        response['data']=contenedor
        total['response']=response
        #--Devuelve el JSON
        return JSONResponse(total)

#--Metodo para la accion ADD
#--Entrada: 
#---request: Requerimiento Http de entrada
#--Salida:
#---JSON con el listado
@csrf_exempt
def asiento_ingresa(request):
    #--Revisa si el requerimiento viene desde GET o POST
    if request.method == 'GET':
        #--Captura los datos para almacenarlos por GET
        id_concepto = request.GET.get('id_concepto')
        id_campo_valor = request.GET.get('id_campo_valor')
        id_grupo = request.GET.get('id_grupo')
        nombre = request.GET.get('nombre')
        descripcion = request.GET.get('descripcion')
        catalogo = request.GET.get('catalogo')
        auxiliar = request.GET.get('auxiliar')
        naturaleza = request.GET.get('naturaleza')
        usa_grupo = request.GET.get('usa_grupo')
        formula = request.GET.get('formula')
        #--Verifica si la variable de uso de grupo esta activa para ingresar el valor
        if(usa_grupo == "true"):
            usa_grupo = "1"
        else:
            usa_grupo = "0"
        #--Verifica si la descripcion esta vacia
        if descripcion is None:
            descripcion=""
        #--Verifica si el catalogo esta vacio
        if catalogo is None:
            catalogo=""
        #--Verifica si el auxiliar esta vacio
        if auxiliar is None:
            auxiliar=""
        #--Verifica si la formula esta vacia
        if formula is None:
            formula=""
        #--Verifica si el id_campo_valor esta vacio, de lo contrario carga el modelo
        if id_campo_valor is None:
            campo_valor=None
        else:
            campo_valor=Campo_Valor.objects.get(id_campo_valor=id_campo_valor)
        #--Verifica si el id_grupo esta vacio, de lo contrario carga el modelo
        if id_grupo is None:
            grupo=None
        else:
            grupo=Grupo(id_grupo=id_grupo)
        #--Busca el concepto en el modelo
        concepto=Concepto(id_concepto=id_concepto)
        #--Construye el objeto a almacenar
        a=Asiento(id_concepto=concepto,id_campo_valor=campo_valor,id_grupo=grupo,nombre=nombre,descripcion=descripcion,catalogo=catalogo,auxiliar=auxiliar,naturaleza=naturaleza,usa_grupo=usa_grupo) 
        #--Graba el objeto
        a.save() 
        #--Busca el objeto almacenado
        actividades = Asiento.objects.get(id_asiento=a.id_asiento)
        #--Contenedor para almacenar el objeto para el JSON
        contenedor=[]
        #--Contenedor para almacenar los datos del objeto
        info={}
        #--Almacena los datos del objeto
        info["id_asiento"] = actividades.id_asiento
        info["id_concepto"] = actividades.id_concepto.id_concepto
        if id_campo_valor is None:
            info["id_campo_valor"] = ""
        else:
            info["id_campo_valor"] = actividades.id_campo_valor.id_campo_valor
        if id_grupo is None:
            info["id_grupo"] = ""
        else:
            info["id_grupo"] = actividades.id_grupo.id_grupo
        if formula is None:
            info["formula"] = ""
        else:
            info["formula"] = actividades.formula
        info["nombre"] = actividades.nombre
        info["descripcion"] = actividades.descripcion
        info["catalogo"] = actividades.catalogo
        info["auxiliar"] = actividades.auxiliar
        info["naturaleza"] = actividades.naturaleza
        info["usa_grupo"] = actividades.usa_grupo
        #--Alamcena el objeto en el contenedor
        contenedor.append(info)
        #--Cuadra la respuesta JSON
        response={}
        total={}
        response['status']=0
        response['totalRows']=1
        response['startRow']=0
        response['endRow']=0
        response['data']=contenedor
        total['response']=response
        #--Devuelve la respuesta en JSON
        return JSONResponse(total)
    if request.method == 'POST':
        #--Captura los datos para almacenarlos por POST
        id_concepto = request.POST.get('id_concepto')
        id_campo_valor = request.POST.get('id_campo_valor')
        id_grupo = request.POST.get('id_grupo')
        nombre = request.POST.get('nombre')
        descripcion = request.POST.get('descripcion')
        catalogo = request.POST.get('catalogo')
        auxiliar = request.POST.get('auxiliar')
        naturaleza = request.POST.get('naturaleza')
        usa_grupo = request.POST.get('usa_grupo')
        formula = request.POST.get('formula')
        #--Verifica si la variable de uso de grupo esta activa para ingresar el valor
        if(usa_grupo == "true"):
            usa_grupo = "1"
        else:
            usa_grupo = "0"
        #--Verifica si la descripcion esta vacia
        if descripcion is None:
        	descripcion=""
        #--Verifica si el catalogo esta vacio
        if catalogo is None:
        	catalogo=""
        #--Verifica si el auxiliar esta vacio
        if auxiliar is None:
        	auxiliar=""
        #--Verifica si la formula esta vacia
        if formula is None:
            formula=""
        #--Verifica si el id_campo_valor esta vacio, de lo contrario carga el modelo
        if id_campo_valor is None:
        	campo_valor=None
        else:
        	campo_valor=Campo_Valor.objects.get(id_campo_valor=id_campo_valor)
        #--Verifica si el id_grupo esta vacio, de lo contrario carga el modelo
        if id_grupo is None:
        	grupo=None
        else:
        	grupo=Grupo(id_grupo=id_grupo)
        #--Busca el concepto en el modelo
        concepto=Concepto(id_concepto=id_concepto)
        #--Construye el objeto a almacenar
        a=Asiento(id_concepto=concepto,id_campo_valor=campo_valor,id_grupo=grupo,nombre=nombre,descripcion=descripcion,catalogo=catalogo,auxiliar=auxiliar,naturaleza=naturaleza,usa_grupo=usa_grupo,formula=formula) 
        #--Graba el objeto
        a.save() 
        #--Busca el objeto almacenado
        actividades = Asiento.objects.get(id_asiento=a.id_asiento)
        #--Contenedor para almacenar el objeto para el JSON
        contenedor=[]
        #--Contenedor para almacenar los datos del objeto
        info={}
        #--Almacena los datos del objeto
        info["id_asiento"] = actividades.id_asiento
        info["id_concepto"] = actividades.id_concepto.id_concepto
        if id_campo_valor is None:
            info["id_campo_valor"] = ""
        else:
            info["id_campo_valor"] = actividades.id_campo_valor.id_campo_valor
        if id_grupo is None:
            info["id_grupo"] = ""
        else:
            info["id_grupo"] = actividades.id_grupo.id_grupo
        if formula is None:
            info["formula"] = ""
        else:
            info["formula"] = actividades.formula
        info["nombre"] = actividades.nombre
        info["descripcion"] = actividades.descripcion
        info["catalogo"] = actividades.catalogo
        info["auxiliar"] = actividades.auxiliar
        info["naturaleza"] = actividades.naturaleza
        info["usa_grupo"] = actividades.usa_grupo
        #--Alamcena el objeto en el contenedor
        contenedor.append(info)
        #--Cuadra la respuesta JSON
        response={}
        total={}
        response['status']=0
        response['totalRows']=1
        response['startRow']=0
        response['endRow']=0
        response['data']=contenedor
        total['response']=response
        #--Devuelve la respuesta en JSON
        return JSONResponse(total)

#--Metodo para la accion UPDATE
#--Entrada: 
#---request: Requerimiento Http de entrada
#--Salida:
#---JSON con el listado
@csrf_exempt
def asiento_actualiza(request):
    #--Revisa si el requerimiento viene desde GET o POST
    if request.method == 'GET':
        #--Captura los datos para almacenarlos por GET
        id_asiento = request.GET.get('id_asiento')
        id_concepto = request.GET.get('id_concepto')
        id_campo_valor = request.GET.get('id_campo_valor')
        id_grupo = request.GET.get('id_grupo')
        nombre = request.GET.get('nombre')
        descripcion = request.GET.get('descripcion')
        catalogo = request.GET.get('catalogo')
        auxiliar = request.GET.get('auxiliar')
        naturaleza = request.GET.get('naturaleza')
        usa_grupo = request.GET.get('usa_grupo')
        formula = request.GET.get('formula')
        #--Verifica si la variable de uso de grupo esta activa para ingresar el valor
        if(usa_grupo == "true"):
            usa_grupo = "1"
        else:
            usa_grupo = "0"
        #--Verifica si la descripcion esta vacia
        if descripcion is None:
            descripcion=""
        #--Verifica si el catalogo esta vacio
        if catalogo is None:
            catalogo=""
        #--Verifica si la formula esta vacia
        if formula is None:
            formula=""
        #--Verifica si el auxiliar esta vacio
        if auxiliar is None:
            auxiliar=""
        #--Verifica si el id_campo_valor esta vacio, de lo contrario carga el modelo
        if id_campo_valor is None:
            campo_valor=None
        else:
            campo_valor=Campo_Valor.objects.get(id_campo_valor=id_campo_valor)
        #--Verifica si el id_grupo esta vacio, de lo contrario carga el modelo
        if id_grupo is None:
            grupo=None
        else:
            grupo=Grupo(id_grupo=id_grupo)
        #--Busca el concepto en el modelo
        concepto=Concepto(id_concepto=id_concepto)
        #--Consulta el objeto a almacenar
        actividades = Asiento.objects.get(id_asiento=id_asiento)
        #--Ingresa los valores a actualizar
        actividades.id_concepto=concepto
        if id_campo_valor is None:
            actividades.id_campo_valor=campo_valor
        else:
            actividades.id_campo_valor=campo_valor
        if id_grupo is None:
            actividades.id_grupo=grupo
        else:
            actividades.id_grupo=grupo
        actividades.nombre=nombre
        actividades.descripcion=descripcion
        actividades.catalogo=catalogo
        actividades.auxiliar=auxiliar
        actividades.naturaleza=naturaleza
        actividades.usa_grupo=usa_grupo
        actividades.formula=formula
        #--Graba el objeto
        actividades.save()
        #--Contenedor para almacenar el objeto para el JSON
        contenedor=[]
        #--Contenedor para almacenar los datos del objeto
        info={}
        #--Almacena los datos del objeto
        info["id_asiento"] = actividades.id_asiento
        info["id_concepto"] = actividades.id_concepto.id_concepto
        if id_campo_valor is None:
            info["id_campo_valor"] = ""
        else:
            info["id_campo_valor"] = actividades.id_campo_valor.id_campo_valor
        if id_grupo is None:
            info["id_grupo"] = ""
        else:
            info["id_grupo"] = actividades.id_grupo.id_grupo
        if formula is None:
            info["formula"] = ""
        else:
            info["formula"] = actividades.formula
        info["nombre"] = actividades.nombre
        info["descripcion"] = actividades.descripcion
        info["catalogo"] = actividades.catalogo
        info["auxiliar"] = actividades.auxiliar
        info["naturaleza"] = actividades.naturaleza
        info["usa_grupo"] = actividades.usa_grupo
        #--Guarda el objeto en el contenedor
        contenedor.append(info)
        #--Construye el JSON
        response={}
        total={}
        response['status']=0
        response['totalRows']=1
        response['startRow']=0
        response['endRow']=0
        response['data']=contenedor
        total['response']=response
        #--Devuelve el JSON
        return JSONResponse(total)
    if request.method == 'POST':
        #--Captura los datos para almacenarlos por POST
        id_asiento = request.POST.get('id_asiento')
        id_concepto = request.POST.get('id_concepto')
        id_campo_valor = request.POST.get('id_campo_valor')
        id_grupo = request.POST.get('id_grupo')
        nombre = request.POST.get('nombre')
        descripcion = request.POST.get('descripcion')
        catalogo = request.POST.get('catalogo')
        auxiliar = request.POST.get('auxiliar')
        naturaleza = request.POST.get('naturaleza')
        usa_grupo = request.POST.get('usa_grupo')
        formula = request.POST.get('formula')
        #--Verifica si la variable de uso de grupo esta activa para ingresar el valor
        if(usa_grupo == "true"):
            usa_grupo = "1"
        else:
            usa_grupo = "0"
        #--Verifica si la descripcion esta vacia
        if descripcion is None:
            descripcion=""
        #--Verifica si el catalogo esta vacio
        if catalogo is None:
            catalogo=""
        #--Verifica si el auxiliar esta vacio
        if auxiliar is None:
            auxiliar=""
        #--Verifica si la formula esta vacia
        if formula is None:
            formula=""
        #--Verifica si el id_campo_valor esta vacio, de lo contrario carga el modelo
        if id_campo_valor is None:
            campo_valor=None
        else:
            campo_valor=Campo_Valor.objects.get(id_campo_valor=id_campo_valor)
        #--Verifica si el id_grupo esta vacio, de lo contrario carga el modelo
        if id_grupo is None:
            grupo=None
        else:
            grupo=Grupo(id_grupo=id_grupo)
        #--Busca el concepto en el modelo
        concepto=Concepto(id_concepto=id_concepto)
        #--Consulta el objeto a almacenar
        actividades = Asiento.objects.get(id_asiento=id_asiento)
        #--Ingresa los valores a actualizar
        actividades.id_concepto=concepto
        if id_campo_valor is None:
            actividades.id_campo_valor=campo_valor
        else:
            actividades.id_campo_valor=campo_valor
        if id_grupo is None:
            actividades.id_grupo=grupo
        else:
            actividades.id_grupo=grupo
        actividades.nombre=nombre
        actividades.descripcion=descripcion
        actividades.catalogo=catalogo
        actividades.auxiliar=auxiliar
        actividades.naturaleza=naturaleza
        actividades.usa_grupo=usa_grupo
        actividades.formula=formula
        #--Graba el objeto
        actividades.save()
        #--Contenedor para almacenar el objeto para el JSON
        """contenedor=[]
        #--Contenedor para almacenar los datos del objeto
        info={}
        #--Almacena los datos del objeto
        info["id_asiento"] = actividades.id_asiento
        info["id_concepto"] = actividades.id_concepto.id_concepto
        if id_campo_valor is None:
            info["id_campo_valor"] = ""
        else:
            info["id_campo_valor"] = actividades.id_campo_valor.id_campo_valor
        if id_grupo is None:
            info["id_grupo"] = ""
        else:
            info["id_grupo"] = actividades.id_grupo.id_grupo
        if formula is None:
            info["formula"] = ""
        else:
            info["formula"] = actividades.formula
        info["nombre"] = actividades.nombre
        info["descripcion"] = actividades.descripcion
        info["catalogo"] = actividades.catalogo
        info["auxiliar"] = actividades.auxiliar
        info["naturaleza"] = actividades.naturaleza
        info["usa_grupo"] = actividades.usa_grupo
        #--Guarda el objeto en el contenedor
        contenedor.append(info)
        #--Construye el JSON
        response={}
        total={}
        response['status']=0
        response['totalRows']=1
        response['startRow']=0
        response['endRow']=0
        response['data']=contenedor
        total['response']=response
        #--Devuelve el JSON"""
        return JSONResponse("Ejecuta")

#--Metodo para la accion REMOVE
#--Entrada: 
#---request: Requerimiento Http de entrada
#--Salida:
#---JSON con el listado
@csrf_exempt
def asiento_elimina(request):
    #--Revisa si el requerimiento viene desde GET o POST
    if request.method == 'GET':
        #--Captura los datos para almacenarlos por GET
        id_asiento = request.GET.get('id_asiento')
        #--Busca el asiento a elminiar
        work = Asiento.objects.get(id_asiento=id_asiento)
        #--Elimina el Asiento
        work.delete()
        #--Prepara el JSON
        borro={}
        devuelve={}
        borro['id_asiento']=id_asiento
        devuelve['response']=borro
        #--Devuelve el asiento
        return JSONResponse(devuelve)
    if request.method == 'POST':
        #--Captura los datos para almacenarlos por POST
        id_asiento = request.POST.get('id_asiento')
        #--Busca el asiento a elminiar
        work = Asiento.objects.get(id_asiento=id_asiento)
        #--Elimina el Asiento
        work.delete()
        #--Prepara el JSON
        borro={}
        devuelve={}
        borro['id_asiento']=id_asiento
        devuelve['response']=borro
        #--Devuelve el asiento
        return JSONResponse(devuelve)
