from django.shortcuts import render
from django.contrib.auth.decorators import login_required, permission_required
from django.contrib.auth.models import User, Group
from django.db.models import Sum,Q
from django.http import HttpResponseRedirect
from django.http import HttpResponse
from django.db  import  IntegrityError ,  transaction 
import json
import sys
from django.core import serializers
from Consult.models import *
from Main.models import *
from Process.models import *
from Maintenance.models import *
from datetime import datetime, date, time, timedelta
import time

def poner_coma(numero):
	cadena=numero
	n= len(cadena)
	resul=''
	p=n
	while p>3:
		p= p-3
		p1=cadena[:p]
		p2=cadena[p:]
		resul= ','+p2+resul
		cadena= p1
	return (cadena+resul)
def normalizar(numero):
	cadena=str(numero)
	part= cadena.split('.')
	num= part[0]
	dec= part[1]
	cade= poner_coma(num)
	return cade+'.'+dec


def notificaciones_Recibidas_Gerente():
	num=0
	try: 	
		num = Notificacion.objects.filter(Q(estado='')|Q(estado=None)).count()
	except:
		num=0
	return num


def notificaciones_Recibidas_Operador():
	num=0
	try: 	
		num = Notificacion.objects.filter(Q(permisos='todos',estado='')|Q(permisos='todos',estado=None)).count()
	except:
		num=0
	return num

"""
def peticiones_Autorizadas(usr):
	C= Cajas.objects.get(id_usuario__usuario=usr)
	num=0
	try: 	
		num = PeticionesCtaCtes.objects.filter(estado='CONFIRMADO',id_personal=C.id_usuario).count()
	except:
		num=0
	return num
"""

def saldo_recibido_oficina(usr):
	aux_saldo=0
	try:
		C= Cajas.objects.get(id_usuario__usuario=usr)
		aux3 = EnvioCajaCaja.objects.filter(id_CajaDestino= C.pk,estado='enviado').count()
		aux_saldo= aux3
	except:
		aux_saldo=0
	return aux_saldo
"""
def mat_recibido_oficina(usr):
	aux_mat=0
	try:
		C= Cajas.objects.get(id_usuario__usuario=usr)
		if C.id_usuario.pk == C.id_oficina.id_usuario.pk:#caja prinsipal	
			aux1 = DepositoCajaMaterial.objects.filter(id_caja= C.pk,estado='enviado').count()
			aux2 = EnvioMaterialOficinaOficina.objects.filter(id_oficinaDestino= C.id_oficina.pk,estado='enviado').count()
			aux3 = EnvioMaterialCajaCaja.objects.filter(id_CajaDestino= C.pk,estado='enviado').count()
			aux_mat= aux1 + aux2 + aux3
		else:
			aux1 = EnvioMaterialCajaCaja.objects.filter(id_CajaDestino= C.pk,estado='enviado').count()
			aux_mat= aux1
	except:
		aux_mat=0
	return aux_mat
"""
def data_global(request):
	usr= request.user.username
	url_foto=''
	titu=''
	F1=date.today()
	res=''
	base_url='http://localhost:8000'
	try:
		u= User.objects.get(username=usr)
		if u.has_perm('Main.add_oficina'):
			sub=""
			usu_nom_c='GERENCIA'
			oficina=''
			G= Gerente.objects.get(usuario=usr)
			C= Cajas.objects.get(id_usuario=G.id_usuario.pk)
			usu_nom_c= C.id_usuario.nombre.upper() + " " +C.id_usuario.Apellido_paterno.upper() + " " +C.id_usuario.Apellido_materno.upper()
			if Gerente_conf.objects.filter(id_gerente__usuario=usr,subGerente="si").exists():
				sub="si" 
				oficina ="SUBGERENCIA"
			dict = {
				'SubG':sub,
				'usu_n_c':usu_nom_c,
				'SITE_URL': oficina,
				'caja': C.nombre,
				'nombre_usuario':usu_nom_c
				}
		else:
			C=Cajas.objects.get(id_usuario__usuario=usr)
			alterna=''
			nombre_usuario=''
			nombre_usuario=  C.id_usuario.nombre.capitalize()
			usu_nom_c= C.id_usuario.nombre.upper() + " " +C.id_usuario.Apellido_paterno.upper() + " " +C.id_usuario.Apellido_materno.upper()
			
			if Foto.objects.filter(id_usuario=C.id_usuario,estado=True).exists():
				f= Foto.objects.get(id_usuario=C.id_usuario,estado=True)
				url_foto=f.foto
				titu=f.titulo

			tipoSis=''
			cajaDo=''
			baseExt=''
			cajaTe=''
			compra_material_tactil=''
			if TConfiguracionSistema.objects.filter(id_caja=C.pk).exists():
				ts=TConfiguracionSistema.objects.get(id_caja=C.pk)
				tipoSis=ts.tipoSistema
				cajaDo=ts.cajaDolar
				baseExt=ts.conf2
				cajaTe = ts.conf3
				compra_material_tactil= ts.compra_tactil
			if C.id_usuario.pk != C.id_oficina.id_usuario.pk:
				alterna='si'
			#*****************************************
			es_va_ca=''
			des_va_ca=''
			if Log_EstadoCaja.objects.filter(id_caja=C.pk).exists():
				ul=Log_EstadoCaja.objects.filter(id_caja=C.pk).latest("fecha")
				es_va_ca=ul.estado
				des_va_ca=ul.descripcion
			#*****************************************
			if tipoSis!='':
				if tipoSis=='transferencia':
					q=CajaCierre.objects.filter(fechaHasta__gte=F1,id_caja=C.pk,estado="cerrado")
				else:
					if tipoSis=='material':
						q=CajaCierreMaterial.objects.filter(fechaHasta__gte=F1,id_caja=C.pk,estado="cerrado")
					else:
						q=CajaCierre.objects.filter(fechaHasta__gte=F1,id_caja=C.pk,estado="cerrado")
			else:
				q=CajaCierre.objects.filter(fechaHasta__gte=F1,id_caja=C.pk,estado="cerrado")

			TM= ConfiguracionExtra_caja.objects.get(id_caja=C.pk)
			#latest_log = LogBook_audit.objects.filter(logbook_id=pk, status=undo_rec.status).latest('fecha')
			#CE=autorizacion_Extorno_completo.objects.get(id_oficina=C.id_oficina.pk)
			transfGlobal=''
			transfGlobalC=''
			c_egr=TM.aux3
			saldoalt=TM.aux6
			c_egres_sub=TM.aux7
			c_pt_sin_dni=TM.aux8
			if (TM.aux5!='') and (TM.aux5!=None):
				transfGlobalC=TM.aux5
			else:
				transfGlobalC='no'
			caja_ind='no'
			if caja_independiente.objects.filter(id_caja=C.pk,independiente='si').exists():
				caja_ind='si'
			if conf_permisos_Cajas.objects.filter(id_caja=C.pk).exists():
				aux_tg= conf_permisos_Cajas.objects.get(id_caja=C.pk)
				transfGlobal=aux_tg.Trans_global

			ofiAso=''
			if asociado.objects.filter(id_caja=C.pk).exists():
				ofiAso='si'

			fActual= date.today()
			f = fActual - timedelta(days=1)
			faltaCierre=""
			FechaCierre=""

			if tipoSis=='transferencia' or tipoSis=='' or tipoSis=='hibrido':
				if CajaCierre.objects.filter(id_caja=C.pk,estado="cerrado").exists():
					ConfigT= ConfiguracionExtra_caja.objects.get(id_oficina=C.id_oficina.pk,id_caja=C.pk)
					Uc= CajaCierre.objects.filter(id_caja=C.pk,estado="cerrado").latest("fechaHasta")
					if Uc.fechaHasta < f and ConfigT.cierreObligatorio=="si":
						faltaCierre= "si"
					FechaCierre= str(Uc.fechaHasta + timedelta(days=1))
			#else:
			#	if tipoSis=='material':
			#		if CajaCierreMaterial.objects.filter(id_caja=C.pk,estado="cerrado").exists():
			#			ConfigT= ConfiguracionExtra_caja.objects.get(id_oficina=C.id_oficina.pk,id_caja=C.pk)
			#			Uc= CajaCierreMaterial.objects.filter(id_caja=C.pk,estado="cerrado").latest("fechaHasta")
			#			if Uc.fechaHasta < f and ConfigT.cierreObligatorio=="si":
			#				faltaCierre= "si"
			#			FechaCierre= str(Uc.fechaHasta + timedelta(days=1))

			S= SaldoDisponibleCajas.objects.get(id_caja=C.pk)
			#SM= SaldoDisponibleCajaMaterial.objects.get(id_caja=C.pk)
			est=''
			msj=''
			autSobregiro=''
			if (TM.aux4!='') and (TM.aux4!=None):
				autSobregiro=TM.aux4
			else:
				autSobregiro='no'

			if (S.saldo_soles > TM.monto_tope) or (S.saldo_dolares>TM.monto_tope):
				est='danger'
				msj='Por favor haga el envio del capital- Usted ya paso el monto tope'
			elif (S.saldo_soles >= (TM.monto_tope-2000)) or (S.saldo_dolares >= (TM.monto_tope-2000)):
				est='warning'
				msj='Envie el Capital a tiempo'
			else:
				est='success'
			
			if q.count()>0:
				res='cerrado'
			oficina=C.id_oficina.nombre_oficina
			caja_nombre = C.nombre
			infoPhone = C.id_oficina.observaciones
			#------------oficina central-------------------
			oficinaCentral='no'
			
			if Oficina.objects.filter(categoria_oficina="central").exists():
				OO=Oficina.objects.get(categoria_oficina='central')
				#infoPhone=OO.observaciones
				if OO.pk == C.id_oficina.pk:
					oficinaCentral = 'si'
					est='success'
					msj=''
			ofEx=''
			#--------------------------------------------------------
			dinero_ingreso= str(saldo_recibido_oficina(usr))
			#--------------------------------------------------------
			#--------------permiso de autorizacion retiro transferencias--------------
			perAutRetST= 'no'
			if conf_permisos_Cajas.objects.filter(id_caja=C.pk).exists():
				cpc= conf_permisos_Cajas.objects.get(id_caja=C.pk)
				perAutRetST=cpc.aux3
			#-------------------------------------------------------------------------
			s_cms=0
			s_cmd=0
			if SaldoDisponibleCajaCambio.objects.filter(id_caja=C.pk).exists():
				s_cm =SaldoDisponibleCajaCambio.objects.get(id_caja=C.pk)
				s_cms = normalizar(s_cm.saldo_soles)
				s_cmd = normalizar(s_cm.saldo_dolares)
			#---material
			s_ms=0
			s_md=0
			s_mm=0
			if SaldoDisponibleCajaMaterial.objects.filter(id_caja=C.pk).exists():
				s_m =SaldoDisponibleCajaMaterial.objects.get(id_caja=C.pk)
				s_ms = normalizar(s_m.saldo_soles)
				s_md = normalizar(s_m.saldo_dolares)
				s_mm = normalizar(s_m.saldo_material)
			#saldo recibido material
			re_material= EnvioMaterialCajaCaja.objects.filter(id_CajaDestino= C.pk,estado='enviado').count()
			re_dinero_m = EnvioCajaCajaM.objects.filter(id_CajaDestino= C.pk,estado='enviado').count()
			re_dinero_do = EnvioCajaCajaD.objects.filter(id_CajaDestino= C.pk,estado='enviado').count()
			
			re_st_procesar = SolicitudTransferenciaBancoa.objects.filter(estado_transferencia='activo').count()
			re_st_procesar_caja = SolicitudTransferenciaBancoa.objects.filter(idCajaDebe__id_caja=C.pk,estado_transferencia='activo').count()

			dict = {
				'BASE_URL':base_url,
				'ObsOficina':infoPhone,
				'SITE_URL': oficina,
				'caja': caja_nombre,
				'urlfoto':url_foto,
				'AlertCi':res,
				'estado':est,
				'msj':msj,
				'ss':normalizar(S.saldo_soles),
				'sd':normalizar(S.saldo_dolares),
				'FCierre':faltaCierre,
				'FechaCierre':FechaCierre,
				'OfCentral':oficinaCentral,
				'alterna':alterna,
				'nombre_usuario':nombre_usuario,
				'dinero_re':dinero_ingreso,
				'ofiEx':ofEx,
				'tg':transfGlobal,
				'tgc':transfGlobalC,
				'tipoSis':tipoSis,
				'cajaDo':cajaDo,
				'baseExt':baseExt,
				'cajaTe':cajaTe,
				'perAutorizarRet':perAutRetST,
				'num_noti':str(notificaciones_Recibidas_Operador()),
				'x_st_to':TM.extorno_total,
				'ofiAso':ofiAso,
				'vso':TM.aux1,
				'as':autSobregiro,
				'es_va_ca':es_va_ca,
				'des_va_ca':des_va_ca,
				'egre':c_egr,
				'egre_sub':c_egres_sub,
				'pt_sin_dni':c_pt_sin_dni,
				'saldoalt':saldoalt,
				'caja_inde':caja_ind,
				'usu_n_c':usu_nom_c,
				'usu_tel_c':C.id_usuario.telefono,
				'DCambioOfi':TM.cambioO,
				'FilDesdeReR':TM.aux9,
				'Egreso_pt':TM.aux10,
				'Egreso_hb':TM.egreso_hab,#egreso habilitaciones
				'compra_tactil':compra_material_tactil,
				'ver_inter_re':TM.aux11,
				's_cms':s_cms,#saldos
				's_cmd':s_cmd,
				's_ms':s_ms,
				's_md':s_md,
				's_mm':s_mm,
				'material_re':str(re_material),
				'dinero_re_m':str(re_dinero_m),
				'dinero_re_do':str(re_dinero_do),
				'st_procesar':str(re_st_procesar),
				'st_procesar_ca':str(re_st_procesar_caja),
				'procesar_St': TM.procesa_st,
				'procesar_agente': TM.procesa_agente,
				'retiro_st': TM.retiro_st_banco,
				'st_banco': TM.st_banco,
			}
	except:
		dict = {
			'SITE_URL': "",'fail':str(sys.exc_info()[1])
		}
	return dict