Guest User

Untitled

a guest
Aug 22nd, 2019
92
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. # -*- coding: utf-8 -*-
  2. from __future__ import unicode_literals
  3.  
  4. # Django
  5. from django.shortcuts import render,HttpResponse,HttpResponseRedirect, reverse
  6. from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
  7. from django.shortcuts import get_object_or_404
  8. from django.core.files.storage import FileSystemStorage
  9. from django.conf import settings
  10. from django.contrib.auth.decorators import user_passes_test
  11.  
  12. # Models
  13. from RecepcionSobres.models import Nomina,Sobre,SobreReal,EstadoNomina,RechazoSobre
  14. from Cliente.models import Cliente
  15. from Documentos.models import Documento
  16.  
  17. # Forms
  18. from RecepcionSobres.forms import SubirSobre,SubirDocumentos,SobreRealForm,SubirAnexos
  19.  
  20. # Librerias internas
  21. from utils.googleCloudStorage import upload_blob_from_file
  22. from utils.irisAPI import NotifyRecepcionNomina,NotifyFaltantes,RequestUploadImageNomina
  23.  
  24. # System
  25. import time
  26. import datetime
  27.  
  28. # Permisos
  29. from RecepcionSobres.permisos import adjuntadocumento,adjuntasobre,cargasobre,digitasobre
  30.  
  31. @user_passes_test(digitasobre, login_url='/forbidden/')
  32. def lista_nominas(request):
  33. #TODO: Se crea una lista con las nóminas recibidas
  34. oNominas_list = Nomina.objects.filter().exclude(EstadoNomina__codigo="ENV").order_by('fechaCreacion')
  35. #TODO: Se crea un enlace para ingresar a las distintas nóminas
  36.  
  37. paginator = Paginator(oNominas_list, 25) # Show 25 contacts per page
  38. page = request.GET.get('page')
  39. try:
  40. oNominas = paginator.page(page)
  41. except PageNotAnInteger:
  42. # If page is not an integer, deliver first page.
  43. oNominas = paginator.page(1)
  44. except EmptyPage:
  45. # If page is out of range (e.g. 9999), deliver last page of results.
  46. oNominas = paginator.page(paginator.num_pages)
  47.  
  48. return render(request, 'recepcionsobres/lista_interna.html', { 'Nominas':oNominas})
  49.  
  50. @user_passes_test(digitasobre, login_url='/forbidden/')
  51. def lista_total_nominas(request):
  52. #TODO: Se crea una lista con las nóminas recibidas
  53. oNominas_list = Nomina.objects.filter().order_by('fechaCreacion')
  54. #TODO: Se crea un enlace para ingresar a las distintas nóminas
  55.  
  56. paginator = Paginator(oNominas_list, 25) # Show 25 contacts per page
  57. page = request.GET.get('page')
  58. try:
  59. oNominas = paginator.page(page)
  60. except PageNotAnInteger:
  61. # If page is not an integer, deliver first page.
  62. oNominas = paginator.page(1)
  63. except EmptyPage:
  64. # If page is out of range (e.g. 9999), deliver last page of results.
  65. oNominas = paginator.page(paginator.num_pages)
  66.  
  67. return render(request, 'recepcionsobres/lista_interna.html', { 'Nominas':oNominas})
  68.  
  69. @user_passes_test(cargasobre, login_url='/forbidden/')
  70. def lista_sobres(request,uuid):
  71. try:
  72. oNomina = Nomina.objects.get(codigoInterno=uuid)
  73. #TODO: Quizá más adelante sea necesario agregar paginamiento. Por ahora da lo mismo
  74. oSobres = Sobre.objects.filter(Nomina__codigoInterno=uuid).order_by('secuenciaSobreNomina')
  75. oSobresReal = SobreReal.objects.filter(Sobre__Nomina__codigoInterno=uuid).order_by('Sobre__secuenciaSobreNomina')
  76. # Redirijo sitio para que procese el siguiente documento
  77. return render(request, 'recepcionsobres/lista_sobre.html', { 'Sobres':oSobres ,'uuidNomina':uuid,'Nomina':oNomina,'SobresReales':oSobresReal})
  78. except Exception as error:
  79. print("ERROR cargarSobres !!! ",error)
  80. return HttpResponse("cargarSobres no identificado.",error)
  81.  
  82. @user_passes_test(cargasobre, login_url='/forbidden/')
  83. def vistaprevianotificarNomina(request,uuid):
  84. # Calculo los sobrantes
  85. cant_sobrantes = Sobre.objects.filter(Nomina__codigoInterno=uuid,esSobrante=True).count()
  86. # Calculo los faltantes
  87. cant_faltantes = Sobre.objects.filter(Nomina__codigoInterno=uuid,etapa="Recepcionado").count()
  88. total = Sobre.objects.filter(Nomina__codigoInterno=uuid).count()
  89. oNomina = Nomina.objects.get(codigoInterno=uuid)
  90. return render(request, 'recepcionsobres/notificar.html', { 'sobrantes':cant_sobrantes ,'uuidNomina':uuid,'faltantes':cant_faltantes,'total':total,'Nomina':oNomina})
  91.  
  92. @user_passes_test(digitasobre, login_url='/forbidden/')
  93. def lista_rechazos(request):
  94. #TODO: Se crea una lista con las nóminas recibidas
  95. oRechazos_list = RechazoSobre.objects.filter()
  96. #TODO: Se crea un enlace para ingresar a las distintas nóminas
  97.  
  98. paginator = Paginator(oRechazos_list, 100) # Show 25 contacts per page
  99. page = request.GET.get('page')
  100. try:
  101. oRechazos = paginator.page(page)
  102. except PageNotAnInteger:
  103. # If page is not an integer, deliver first page.
  104. oRechazos = paginator.page(1)
  105. except EmptyPage:
  106. # If page is out of range (e.g. 9999), deliver last page of results.
  107. oRechazos = paginator.page(paginator.num_pages)
  108.  
  109. return render(request, 'recepcionsobres/lista_rechazos.html', { 'Rechazos':oRechazos})
  110.  
  111.  
  112. @user_passes_test(cargasobre, login_url='/forbidden/')
  113. def subirImagenesNomina(request,uuid):
  114. # preparo datos para notificar nomina
  115. oNomina = Nomina.objects.get(codigoInterno=uuid)
  116. info = {
  117. "codigoNomina":oNomina.numeroNomina
  118. }
  119. # realizo notificacion
  120. RequestUploadImageNomina(**info)
  121. # cambio estado nomina
  122. oEstadoNomina = EstadoNomina.objects.get(codigo="UPL")
  123. oNomina.EstadoNomina = oEstadoNomina
  124. oNomina.save()
  125. return HttpResponseRedirect(reverse('recepcionfisica:lista_total_nominas', kwargs={}))
  126.  
  127. @user_passes_test(cargasobre, login_url='/forbidden/')
  128. def EliminarDocumento(request,uuid,uuidNomina,uuidDocumento):
  129. from Documentos.models import Documento
  130. # Super peligrosa funcion. BORRA DE VERDAD. SOLO USAR CASOS EXTREMOS
  131. rows = Documento.objects.filter(codigoDocumento=uuidDocumento).delete()
  132.  
  133. return HttpResponseRedirect(reverse('recepcionfisica:documentos_del_sobre', kwargs={'uuidNomina':uuidNomina,'uuid':uuid}))
  134. # Vuelvo a lista de nominas
  135.  
  136. @user_passes_test(cargasobre, login_url='/forbidden/')
  137. def PreclasificarDocumento(request,uuid,uuidNomina,uuidDocumento):
  138. from Documentos.models import Documento
  139. # Super peligrosa funcion. BORRA DE VERDAD. SOLO USAR CASOS EXTREMOS
  140. oDocumento = Documento.objects.get(codigoDocumento=uuidDocumento)
  141. oUsuario = request.user
  142. oDocumento.ProcessPreclasify(True,False,oUsuario)
  143.  
  144. return HttpResponseRedirect(reverse('recepcionfisica:documentos_del_sobre', kwargs={'uuidNomina':uuidNomina,'uuid':uuid}))
  145. # Vuelvo a lista de nominas
  146.  
  147.  
  148.  
  149. @user_passes_test(cargasobre, login_url='/forbidden/')
  150. def notificarNomina(request,uuid):
  151. # preparo datos para notificar nomina
  152. oNomina = Nomina.objects.get(codigoInterno=uuid)
  153. TipoRecepcion = "Completa"
  154. cant_sobrantes = Sobre.objects.filter(Nomina__codigoInterno=uuid,esSobrante=True).count()
  155. cant_faltantes = Sobre.objects.filter(Nomina__codigoInterno=uuid,etapa="Recepcionado").count()
  156. if cant_sobrantes>0:
  157. TipoRecepcion = "Incompleta"
  158. if cant_faltantes>0:
  159. TipoRecepcion = "Incompleta"
  160. fechaRecepcion = datetime.datetime.now()
  161. info = {
  162. "FechaNomina":oNomina.fechaCreacion.strftime("%d%m%Y"),
  163. "FechaRecepcion":fechaRecepcion.strftime("%d%m%Y"),
  164. "FechaTimbreNominas":fechaRecepcion.strftime("%d%m%Y"), # Averiguar que pasa con este valor
  165. "TipoRecepcion":TipoRecepcion,
  166. "NumeroNomina":oNomina.numeroNomina
  167. }
  168. # realizo notificacion
  169. NotifyRecepcionNomina(**info)
  170. # cambio estado nomina
  171. oEstadoNomina = EstadoNomina.objects.get(codigo="ENV")
  172. oNomina.EstadoNomina = oEstadoNomina
  173. oNomina.fechaRecepcion = fechaRecepcion
  174. oNomina.save()
  175. # disponibilizo los documentos en la lista de digatadores
  176. oSobres = Sobre.objects.filter(Nomina=oNomina)
  177. oDocumentos_list = Documento.objects.filter(Solicitud=oSobres[0].SolicitudReembolso).order_by('fechaRecepcion')
  178. for oDocumento in oDocumentos_list:
  179. oDocumento.updateEstado("UNK","Listo para ser digitado")
  180. # obtengo los faltantes
  181. faltantes = Sobre.objects.filter(Nomina__codigoInterno=uuid,etapa="Recepcionado")
  182. for faltante in faltantes:
  183. # por cada faltante envio notificacion
  184. data = {
  185. "FechaNomina":oNomina.fechaCreacion.strftime("%d%m%Y"),
  186. "FechaFaltante" : fechaRecepcion.strftime("%d%m%Y"),
  187. "NumeroNomina":oNomina.numeroNomina,
  188. "NumeroSobre":faltante.numeroSobre,
  189. "SecuenciaSobreNomina":faltante.secuenciaSobreNomina
  190. }
  191. NotifyFaltantes(**data)
  192.  
  193. # Vuelvo a lista de nominas
  194. return HttpResponseRedirect(reverse('recepcionfisica:lista_total_nominas', kwargs={}))
  195.  
  196.  
  197.  
  198. @user_passes_test(adjuntasobre, login_url='/forbidden/')
  199. def cargar_sobre(request,uuid,uuidNomina):
  200. if request.method == 'POST' and request.FILES['sobre']:
  201.  
  202. form = SubirSobre(request.POST,request.FILES)
  203. if form.is_valid():
  204. #TODO: Quiza la subida del archivo debiera ser asincrona
  205.  
  206. print("request.POST-> ",request.POST)
  207. myfile = request.FILES['sobre']
  208. codigoBarra = request.POST.get('codigoBarra')+".pdf"
  209. print("request.FILES-> ",myfile)
  210.  
  211. path_storage = settings.GS_PATH
  212. destination = "%s%s" % (path_storage,codigoBarra)
  213. print("rdestination-> ",destination)
  214. upload_blob_from_file(settings.GS_BUCKET_NAME,myfile,destination)
  215. form.save()
  216. return HttpResponseRedirect(reverse('recepcionfisica:lista_sobres', kwargs={'uuid':uuidNomina}))
  217. else:
  218. print("no es valido ",form.errors)
  219. else:
  220. data = {}
  221. if uuid:
  222. codigoBarra = Sobre.objects.filter(codigoInterno=uuid).values('numeroSobre')[0]
  223. print("codigoBarra-> ",codigoBarra, "uuid -> ",uuid , "codigoBarra['numeroSobre']-> ",codigoBarra['numeroSobre'])
  224. data = {'codigoBarra':codigoBarra['numeroSobre'] }
  225. if uuidNomina:
  226. data.update({'uuidNomina':uuidNomina})
  227. form = SubirSobre(initial=data)
  228.  
  229.  
  230. #print("Nomina ->",oNomina)
  231. context = {'form':form }
  232. return render(request, 'recepcionsobres/subir_sobre.html',context)
  233.  
  234. @user_passes_test(cargasobre, login_url='/forbidden/')
  235. def detalle_sobres(request,uuid):
  236. """
  237. Método que hace proceso de completar datos de la misma forma que un documento.
  238. Por ahora, no pasará nunca por un OCR ni preclasificador
  239. """
  240.  
  241. try:
  242. oSobre = get_object_or_404(Sobre, codigoInterno=uuid)
  243. oSobreReal = SobreReal.objects.filter(Sobre__codigoInterno=uuid)
  244. if request.method == 'POST':
  245. #TODO: Validar si alguien mas ya estaba modificando el documento. Si es asi, simplemente se debe pasar al siguiente
  246. print(" es post !! ",request.POST)
  247. form = SobreRealForm(request.POST)
  248. if form.is_valid():
  249. print("El formulario es valido!!!")
  250.  
  251. form.save(oSobre)
  252. return HttpResponseRedirect(reverse('recepcionfisica:lista_sobres', kwargs={'uuid':oSobre.Nomina.codigoInterno}))
  253. else:
  254. print("NO valido!!!" , form.errors)
  255. return render(request, 'recepcionsobres/detalle_sobre.html', {'Sobre':oSobre, 'form':form })
  256. # create a form instance and populate it with data from the request:
  257. else:
  258. #print(dir(oSobreReal))
  259. #print(type(oSobreReal))
  260. if oSobreReal:
  261. oSobreReal = oSobreReal[0]
  262. print("Ya hay un sobre creado aca!! ")
  263. #data = {"FechaSobre":oSobre.}
  264. data = {'FechaSobre':oSobreReal.FechaSobre, 'rutBeneficiario':oSobreReal.rutBeneficiario, 'celular':oSobreReal.celular,
  265. 'telefonoFijo':oSobreReal.telefonoFijo, 'nombre':oSobreReal.nombre, 'apellidoPaterno':oSobreReal.apellidoPaterno,
  266. 'apellidoMaterno':oSobreReal.apellidoMaterno, 'cantidadDocumentos':oSobreReal.cantidadDocumentos, 'numeroBoleta1':oSobreReal.numeroBoleta1,
  267. 'numeroBoleta2':oSobreReal.numeroBoleta2, 'numeroBoleta3':oSobreReal.numeroBoleta3, 'numeroBoleta4':oSobreReal.numeroBoleta4,
  268. 'bancoCuenta':oSobreReal.bancoCuenta, 'nombreTitularCuenta':oSobreReal.nombreTitularCuenta, 'numeroCuenta':oSobreReal.numeroCuenta,
  269. 'rutTitularCuenta':oSobreReal.rutTitularCuenta, 'nombreValeVista':oSobreReal.nombreValeVista, 'apellidoValeVista':oSobreReal.apellidoValeVista,
  270. 'rutValeVista':oSobreReal.rutValeVista, 'nombreSeguro':oSobreReal.nombreSeguro, 'opcionPago':oSobreReal.opcionPago
  271. }
  272. if oSobreReal.enfermedad:
  273. data.update({'enfermedad': 1})
  274. if oSobreReal.accidente:
  275. data.update({'accidente': 1})
  276. if oSobreReal.ordenMedica:
  277. data.update({'ordenMedica': 1})
  278. if oSobreReal.detalleCobro:
  279. data.update({'detalleCobro': 1})
  280. if oSobreReal.declaracionAccidente:
  281. data.update({'declaracionAccidente': 1})
  282. if oSobreReal.informeMedicoTratante:
  283. data.update({'informeMedicoTratante': 1})
  284. if oSobreReal.titularCuenta:
  285. data.update({'titularCuenta': 1})
  286. if oSobreReal.beneficiarioCuenta:
  287. data.update({'beneficiarioCuenta': 1})
  288. if oSobreReal.autorizaExcedentes:
  289. data.update({'autorizaExcedentes': 1})
  290. if oSobreReal.autorizaExcedentes:
  291. data.update({'tieneSeguro': 1})
  292.  
  293. """
  294. FechaSobre = forms.DateField(widget=forms.DateInput(format='%d/%m/%Y'),input_formats=('%d/%m/%Y', ))
  295. rutBeneficiario = forms.CharField(max_length=20,required=False)
  296. celular = forms.CharField(max_length=20,required=False)
  297. telefonoFijo = forms.CharField(max_length=20,required=False)
  298. nombre = forms.CharField(max_length=100,required=False)
  299. apellidoPaterno = forms.CharField(max_length=100,required=False)
  300. apellidoMaterno = forms.CharField(max_length=100,required=False)
  301. cantidadDocumentos = forms.IntegerField(required=False)
  302. numeroBoleta1 = forms.CharField(max_length=30,required=False)
  303. numeroBoleta2 = forms.CharField(max_length=30,required=False)
  304. numeroBoleta3 = forms.CharField(max_length=30,required=False)
  305. numeroBoleta4 = forms.CharField(max_length=30,required=False)
  306. enfermedad = forms.CharField(widget=forms.CheckboxInput(),required=False)
  307. accidente = forms.CharField(widget=forms.CheckboxInput(),required=False)
  308. ordenMedica = forms.CharField(widget=forms.CheckboxInput(),required=False)
  309. detalleCobro = forms.CharField(widget=forms.CheckboxInput(),required=False)
  310. declaracionAccidente = forms.CharField(widget=forms.CheckboxInput(),required=False)
  311. informeMedicoTratante = forms.CharField(widget=forms.CheckboxInput(),required=False)
  312. opcionPago = forms.CharField(max_length=30,required=False)
  313. titularCuenta = forms.CharField(widget=forms.CheckboxInput(),required=False)
  314. beneficiarioCuenta = forms.CharField(widget=forms.CheckboxInput(),required=False)
  315. bancoCuenta = forms.CharField(max_length=30,required=False)
  316. nombreTitularCuenta = forms.CharField(max_length=30,required=False)
  317. numeroCuenta = forms.CharField(max_length=30,required=False)
  318. rutTitularCuenta = forms.CharField(max_length=30,required=False)
  319. nombreValeVista = forms.CharField(max_length=30,required=False)
  320. apellidoValeVista = forms.CharField(max_length=30,required=False)
  321. rutValeVista = forms.CharField(max_length=30,required=False)
  322. autorizaExcedentes = forms.CharField(widget=forms.CheckboxInput(),required=False)
  323. tieneSeguro = forms.CharField(widget=forms.CheckboxInput(),required=False)
  324. nombreSeguro
  325. """
  326.  
  327.  
  328.  
  329. form = SobreRealForm(initial=data)
  330. except Exception as error:
  331. print("ERROR!!! ",error)
  332. return HttpResponse("Documento no identificado.",Exception)
  333. context = {'Sobre':oSobre, 'form':form }
  334. return render(request, 'recepcionsobres/detalle_sobre.html', context)
  335.  
  336.  
  337.  
  338. @user_passes_test(adjuntadocumento, login_url='/forbidden/')
  339. def subir_documentos(request,uuid,uuidNomina):
  340. if request.method == 'POST' and request.FILES['documento']:
  341.  
  342. form = SubirDocumentos(request.POST,request.FILES)
  343. if form.is_valid():
  344. myfile = request.FILES['documento']
  345. print("request.FILES-> ",myfile)
  346. tiempo = time.time()
  347. idDocumento = repr(tiempo).replace(".","")
  348. #TODO: El path no puede estar en duro. Se debe obtener desde el settings
  349. #destination = "consalud/%s" % (idDocumento+".pdf")
  350. path_storage = settings.GS_PATH
  351. destination = "%s%s" % (path_storage,idDocumento+".pdf")
  352. print("rdestination documento-> ",destination)
  353. upload_blob_from_file(settings.GS_BUCKET_NAME,myfile,destination)
  354. form.save(idDocumento)
  355. return HttpResponseRedirect(reverse('recepcionfisica:lista_sobres', kwargs={'uuid':uuidNomina}))
  356. #return render(request, 'boleta/subirboleta.html',{'form':form})
  357. else:
  358. print("no es valido ",form.errors)
  359. else:
  360. form = SubirDocumentos(initial={'uuidSobre':uuid})
  361.  
  362. context = {'form':form}
  363. return render(request, 'recepcionsobres/subir_documento.html',context)
  364.  
  365. @user_passes_test(adjuntadocumento, login_url='/forbidden/')
  366. def subir_anexo(request,uuid,uuidNomina,uuidDocumento):
  367. if request.method == 'POST' and request.FILES['anexo']:
  368.  
  369. form = SubirAnexos(request.POST,request.FILES)
  370. if form.is_valid():
  371. myfile = request.FILES['anexo']
  372. print("request.FILES-> ",myfile)
  373. tiempo = time.time()
  374. idDocumento = repr(tiempo).replace(".","")
  375. #TODO: El path no puede estar en duro. Se debe obtener desde el settings
  376. #destination = "consalud/%s" % (idDocumento+".pdf")
  377. path_storage = settings.GS_PATH
  378. destination = "%s%s" % (path_storage,idAnexo+".pdf")
  379. print("rdestination documento-> ",destination)
  380. upload_blob_from_file(settings.GS_BUCKET_NAME,myfile,destination)
  381. form.save(idAnexo)
  382. return HttpResponseRedirect(reverse('recepcionfisica:documentos_del_sobre', kwargs={'uuidNomina':uuidNomina,'uuid':uuid}))
  383. #return render(request, 'boleta/subirboleta.html',{'form':form})
  384. else:
  385. print("no es valido ",form.errors)
  386. else:
  387. form = SubirAnexos(initial={'uuidDocumento':uuidDocumento})
  388.  
  389. context = {'form':form,'uuidNomina':uuidNomina,'uuid':uuid}
  390. return render(request, 'recepcionsobres/subir_anexo.html',context)
  391.  
  392. def lista_documentos_sobre(request,uuid,uuidNomina):
  393. oSobre = get_object_or_404(Sobre, codigoInterno=uuid)
  394. oDocumentos_list = Documento.objects.filter(Solicitud=oSobre.SolicitudReembolso).order_by('fechaRecepcion')
  395. paginator = Paginator(oDocumentos_list, 25) # Show 25 contacts per page
  396. page = request.GET.get('page')
  397. try:
  398. oDocumentos = paginator.page(page)
  399. except PageNotAnInteger:
  400. # If page is not an integer, deliver first page.
  401. oDocumentos = paginator.page(1)
  402. except EmptyPage:
  403. # If page is out of range (e.g. 9999), deliver last page of results.
  404. oDocumentos = paginator.page(paginator.num_pages)
  405. print('uuidNomina:',uuidNomina,' uuid:',uuid)
  406. return render(request, 'documentos/lista_documentos_sobres.html', { 'Documentos':oDocumentos,'uuidNomina':uuidNomina,'Sobre':oSobre})
RAW Paste Data