def imprimir_informe(request): if request.method == "POST": form = ImprimirInformeAusenciasForm(request.POST or None) if form.is_valid(): template = "ausentismos/informe_ausentismos.html" fecha = form.cleaned_data["fecha"] lista = request.session.get("lista_ausentismos", None) observaciones_finales = form.cleaned_data["observaciones"] ausencias = ( ausentismo.objects.filter(id__in=lista, empleado__empresa__pk__in=empresas_habilitadas(request)) .order_by("fecha_creacion", "aus_fcrondesde", "aus_fcronhasta", "empleado__empresa") .select_related("empleado", "empleado__empresa", "aus_diagn", "empleado__trab_cargo") ) cant = len(ausencias) context = {} context = getVariablesMixin(request) try: config = configuracion.objects.all().first() except configuracion.DoesNotExist: raise ValueError context["ausencias"] = ausencias context["observaciones_finales"] = observaciones_finales context["cant"] = cant context["config"] = config context["fecha"] = fecha return render_to_pdf_response(request, template, context) else: lista = request.GET.getlist("id") request.session["lista_ausentismos"] = lista form = ImprimirInformeAusenciasForm(initial={"lista": lista}) variables = locals() return render(request, "ausentismos/imprimir_informe_ausentismos_form.html", variables)
def UsuarioEditView(request, id): if not tiene_permiso(request, 'gral_configuracion'): return redirect(reverse('usuarios')) context = {} context = getVariablesMixin(request) try: empresa = empresa_actual(request) except gral_empresa.DoesNotExist: empresa = None usuario = usuario_actual(request) usr = get_object_or_404(usu_usuario, id_usuario=id) if request.method == 'POST': form = UsuarioForm(request, usuario, request.POST, request.FILES, instance=usr) if form.is_valid(): post = form.save(commit=False) post.save() form.save_m2m() messages.success(request, u'Los datos se guardaron con éxito!') return HttpResponseRedirect(reverse('usuarios')) else: form = UsuarioForm(request, usuario, instance=usr) context['form'] = form return render(request, 'usuarios/usuario_form.html', context)
def imprimir_ausentismo(request, id): template = "ausentismos/ausentismo_impresion.html" try: ausencia = ausentismo.objects.get(pk=id) controles = ausentismo_controles.objects.filter(ausentismo=ausencia).exclude( Q(fecha__isnull=True, detalle__isnull=True) | Q(fecha__isnull=True, detalle="") ) controles_pat = ausentismo_controles_patologias.objects.filter(ausentismo=ausencia).exclude( Q(fecha__isnull=True, detalle__isnull=True) | Q(fecha__isnull=True, detalle="") ) except Exception as e: ausencia = None controles_pat = None controles = None messages.error(request, e) context = {} context = getVariablesMixin(request) try: config = configuracion.objects.all().first() except Exception as e: messages.error(request, e) context["a"] = ausencia context["controles"] = controles context["controles_pat"] = controles_pat context["config"] = config fecha = hoy() context["fecha"] = fecha return render_to_pdf_response(request, template, context)
def UsuarioEditView(request, id): if not esAdmin(request): return redirect(reverse('principal')) context = {} context = getVariablesMixin(request) usuario = usuario_actual(request) usr = get_object_or_404(UsuUsuario, id_usuario=id) if request.method == 'POST': form = UsuarioForm(request, usuario, request.POST, request.FILES, instance=usr) if form.is_valid(): post = form.save(commit=False) post.save() form.save_m2m() messages.success(request, u'Los datos se guardaron con éxito!') return HttpResponseRedirect(reverse('usuarios')) else: form = UsuarioForm(request, usuario, instance=usr) context['form'] = form return render(request, 'usuarios/usuario_form.html', context)
def UsuarioCreateView(request): if not esAdmin(request): return redirect(reverse('principal')) context = {} context = getVariablesMixin(request) try: empresa = empresa_actual(request) except gral_empresa.DoesNotExist: empresa = None usuario = usuario_actual(request) if request.method == 'POST': form = UsuarioForm(request, usuario, request.POST, request.FILES) if form.is_valid(): form.instance.password = make_password( password=form.instance.usuario, salt=None) post = form.save(commit=False) post.save() form.save_m2m() messages.success(request, u'Los datos se guardaron con éxito!') return HttpResponseRedirect(reverse('usuarios')) else: form = UsuarioForm(request, usuario=usuario) context['form'] = form return render(request, 'usuarios/usuario_form.html', context)
def prod_precios_imprimirCBS(request): limpiar_sesion(request) lista = request.GET.getlist('id') try: cantidad = int(request.GET.get('cantidad', 0)) if cantidad > 0: mostrar_precio = False mostrar_detalle = False try: empresa = empresa_actual(request) mostrar_precio = empresa.codbar_precio mostrar_detalle = empresa.codbar_detalle except: empresa = None mostrar_precio = False mostrar_detalle = False precios = prod_producto_lprecios.objects.filter( id__in=lista).exclude( Q(producto__codigo_barras__isnull=True) | Q(producto__codigo_barras__exact='')) lista_precios = [{ 'codbar': p.get_codbar, 'codigo_barras': p.producto.codigo_barras, 'detalle': p.producto.__unicode__(), 'precio': p.precio_venta } for p in precios] lista_precios = [x for x in lista_precios for i in range(cantidad)] context = {} context = getVariablesMixin(request) context['precios'] = lista_precios context['mostrar_precio'] = mostrar_precio context['mostrar_detalle'] = mostrar_detalle fecha = datetime.now() context['fecha'] = fecha template = 'productos/precios_codbars.html' from easy_pdf.rendering import render_to_pdf_response return render_to_pdf_response(request, template, context) except: messages.error(request, u'¡No se pudieron imprimir los CBs seleccionados!') return HttpResponseRedirect(reverse('prod_precios_listado'))
def imprimir_historial(request, id): template = "ausentismos/historia_clinica_impresion.html" empleado = ent_empleado.objects.get(pk=id) historial = ausentismo.objects.filter(empleado=empleado, empleado__empresa__pk__in=empresas_habilitadas(request)) # try: # empleado = ent_empleado.objects.get(pk=id) # historial = ausentismo.objects.filter(empleado=empleado,empleado__empresa__pk__in=empresas_habilitadas(request)) # except Exception as e: # raise Htt context = {} context = getVariablesMixin(request) try: config = configuracion.objects.all().first() except Exception as e: messages.error(request, e) context["empleado"] = empleado context["historial"] = historial context["config"] = config fecha = hoy() context["fecha"] = fecha return render_to_pdf_response(request, template, context)
def importar_entidades(request): context = {} context = getVariablesMixin(request) if request.method == 'POST': form = ImportarEntidadesForm(request.POST, request.FILES, request=request) if form.is_valid(): csv_file = form.cleaned_data['archivo'] sobreescribir = form.cleaned_data['sobreescribir'] == 'S' empresa = form.cleaned_data['empresa'] tipo_entidad = form.cleaned_data['tipo_entidad'] if not csv_file.name.endswith('.csv'): messages.error(request, '¡El archivo debe tener extensión .CSV!') return HttpResponseRedirect(reverse("importar_empleados")) if csv_file.multiple_chunks(): messages.error( request, "El archivo es demasiado grande (%.2f MB)." % (csv_file.size / (1000 * 1000), )) return HttpResponseRedirect(reverse("importar_empleados")) decoded_file = csv_file.read().decode("latin1").replace( ",", "").replace("'", "") io_string = io.StringIO(decoded_file) reader = unicode_csv_reader(io_string) #Id;Cliente;Email;Tel;Tel2;Direcci¢n;DNI;CUIT;Condici¢n de IVA;Raz¢n Social;Domicilio Fiscal;Localidad Fiscal;Provincia Fiscal;C¢digo Postal Fiscal;Usuario de Mercado Libre;Observaciones;Creado #Id;Proveedor;Email;Tel;Tel2;Direcci¢n;DNI;CUIT;Condici¢n de IVA;Raz¢n Social;Domicilio Fiscal;Localidad Fiscal;Provincia Fiscal;C¢digo Postal Fiscal;Observaciones;Creado;NombreProv cant = 0 next(reader) #Omito el Encabezado for index, line in enumerate(reader): campos = line[0].split(";") cod = campos[0].strip().zfill(4) if cod == '': continue #Salta al siguiente empl = egr_entidad.objects.filter( codigo=cod, tipo_entidad=tipo_entidad).exists() if empl and not sobreescribir: continue nombre = campos[9].strip().upper() email = campos[2].strip() #EMAIL telefono = campos[3].strip() #telefono telefono2 = campos[4].strip() #telefono2 domicilio = campos[5].strip().upper() #DOMICILIO dni = campos[6].strip().upper() #DOMICILIO cuit = campos[7].strip().upper().replace("-", "").replace(".", "") #ART cond_iva = campos[8].strip() if cond_iva == 'Consumidor Final': cond_iva = 5 elif cond_iva == 'Responsable Inscripto': cond_iva = 1 elif cond_iva == 'Exento': cond_iva = 4 else: cond_iva = 5 tipo_doc = 99 if cuit <> '': tipo_doc = 80 fact_razon_social = campos[9].strip().upper() fact_direccion = campos[10].strip().upper() localidad = campos[11].strip().upper() cp = campos[12].strip() #CP egr_entidad.objects.update_or_create(codigo=cod, tipo_entidad=tipo_entidad, empresa=empresa, defaults={ 'apellido_y_nombre': nombre, 'fact_razon_social': fact_razon_social, 'fact_direccion': fact_direccion, 'fact_telefono': telefono2, 'tipo_doc': tipo_doc, 'fact_cuit': cuit, 'domicilio': domicilio, 'nro_doc': dni, 'telefono': telefono, 'email': email, 'cod_postal': cp, 'localidad': localidad, 'fact_categFiscal': cond_iva }) cant += 1 messages.success( request, u'Se importó el archivo con éxito!<br>(%s Clientes creados/actualizados)' % cant) else: form = ImportarEntidadesForm(None, None, request=request) context['form'] = form return render(request, 'entidades/importar_entidades.html', context)
def importar_empleados(request): if not tiene_permiso(request,'empl_pantalla'): return redirect(reverse('principal')) ctx = {} ctx = getVariablesMixin(request) if request.method == 'POST': form = ImportarEmpleadosForm(request.POST,request.FILES,request=request) if form.is_valid(): csv_file = form.cleaned_data['archivo'] empresa = form.cleaned_data['empresa'] sobreescribir = form.cleaned_data['sobreescribir'] == 'S' if not csv_file.name.endswith('.csv'): messages.error(request,'¡El archivo debe tener extensión .CSV!') return HttpResponseRedirect(reverse("importar_empleados")) if csv_file.multiple_chunks(): messages.error(request,"El archivo es demasiado grande (%.2f MB)." % (csv_file.size/(1000*1000),)) return HttpResponseRedirect(reverse("importar_empleados")) decoded_file = csv_file.read().decode("latin1").replace(",", "").replace("'", "") io_string = io.StringIO(decoded_file) reader = unicode_csv_reader(io_string) #DNI;LEGAJO/NRO;APELLIDO;NOMBRE;FECHA_NAC;DOMICILIO;CELULAR;TELEFONO;EMAIL;CP;LOCALIDAD;FECHA_INGR;ART;PUESTO cant=0 try: next(reader) #Omito el Encabezado for index,line in enumerate(reader): campos = line[0].split(";") cant_campos = len(campos) if cant_campos<>14: raise Exception(u'La cantidad de campos para el registro es incorrecta!(verifique que no existan ";" ni ")') dni = campos[0].strip() # dni = str(random.randrange(29000000,40000000)) if dni=='': continue #Salta al siguiente empl = ent_empleado.objects.filter(nro_doc=dni,empresa=empresa).exists() if empl and not sobreescribir: continue legajo = campos[1].strip() #nro_legajo apellido = campos[2].strip()#apellido if apellido=='': raise Exception(u'El apellido no puede estar vacío!') nombre = campos[3].strip() # nombre if nombre=='': raise Exception(u'El nombre no puede estar vacío!') nombre = apellido+' '+nombre fecha=campos[4].strip() if fecha=='': fecha_nac=None else: fecha_nac = datetime.datetime.strptime(fecha, "%d/%m/%Y").date() #fecha_nacim domicilio = campos[5].strip() #DOMICILIO celular = campos[6].strip() #celular telefono = campos[7].strip() #telefono email = campos[8].strip() #EMAIL cp = campos[9].strip() #CP localidad = campos[10].strip() #LOCALIDAD fecha=campos[11].strip() if fecha=='': fecha_ingr=None else: fecha_ingr = datetime.datetime.strptime(fecha, "%d/%m/%Y").date() #FECHA_INGR art = campos[12].strip().upper().replace(",", "").replace(".", "") #ART if art=='': art=None else: art = ent_art.objects.get_or_create(nombre=art)[0] puesto = campos[13].strip().upper().replace(",", "").replace(".", "") #Puesto if puesto=='': puesto=None else: puesto = ent_cargo.objects.get_or_create(cargo=puesto)[0] try: ent_empleado.objects.update_or_create(nro_doc=dni,empresa=empresa,defaults={'legajo':legajo,'apellido_y_nombre':nombre,'fecha_nac':fecha_nac,'art':art,'trab_cargo':puesto, 'domicilio':domicilio,'celular':celular,'telefono':telefono,'email':email,'cod_postal':cp,'localidad':localidad,'empr_fingreso':fecha_ingr}) cant+=1 except Exception as e: error = u"Línea:%s -> %s" %(index,e) messages.error(request,error) recalcular_cantidad_empleados(empresa) messages.success(request, u'Se importó el archivo con éxito!<br>(%s empleados creados/actualizados)'% cant ) except Exception as e: messages.error(request,u"Línea:%s -> %s" %(index,e)) else: form = ImportarEmpleadosForm(None,None,request=request) ctx.update(form=form) return render(request, 'entidades/importar_empleados.html',context=ctx)
def importar_productos(request): context = {} context = getVariablesMixin(request) if request.method == 'POST': form = ImportarProductosForm(request.POST, request.FILES, request=request) if form.is_valid(): csv_file = form.cleaned_data['archivo'] sobreescribir = form.cleaned_data['sobreescribir'] == 'S' empresa = form.cleaned_data['empresa'] if not csv_file.name.endswith('.csv'): messages.error(request, '¡El archivo debe tener extensión .CSV!') return HttpResponseRedirect(reverse("importar_empleados")) if csv_file.multiple_chunks(): messages.error( request, "El archivo es demasiado grande (%.2f MB)." % (csv_file.size / (1000 * 1000), )) return HttpResponseRedirect(reverse("importar_empleados")) decoded_file = csv_file.read().decode("latin1").replace( ",", "").replace("'", "") io_string = io.StringIO(decoded_file) reader = unicode_csv_reader(io_string) #Id;Nombre;Tipo de Producto;Proveedor;C¢digo;Stock;PC;IVA;MARGEN;;Precio de Venta;EFECTIVO cant = 0 next(reader) #Omito el Encabezado for index, line in enumerate(reader): campos = line[0].split(";") nombre = campos[1].strip().upper() if nombre == '': continue #Salta al siguiente codbar = campos[4].strip() if codbar == '': cod = str(ultimoNroId(prod_productos) + 1).zfill(12) cod += str(digVerificador(cod)) codbar = cod cod = codbar try: categoria = prod_categoria.objects.get( nombre=campos[2].strip().upper()) except: categoria = None #import pdb; pdb.set_trace() try: stock = int(campos[5].strip()) except: stock = 0 try: pcosto = Decimal(campos[6].strip()) except: pcosto = Decimal(0) try: piva = Decimal(campos[7].strip()) except: piva = Decimal(0) try: pventa1 = Decimal(campos[10].strip()) except: pventa1 = Decimal(0) try: pventa2 = Decimal(campos[11].strip()) except: pventa2 = Decimal(0) pimp = pcosto + piva try: tasa_iva = gral_tipo_iva.objects.get(id=5) except: tasa_iva = None prod = prod_productos.objects.create(codigo=cod, categoria=categoria, empresa=empresa, nombre=nombre, codigo_barras=codbar, tipo_producto=1, mostrar_en=3, unidad=0, llevar_stock=False, stock_negativo=True, tasa_iva=tasa_iva) if prod: lp1 = prod_lista_precios.objects.filter(pk=1).first() lp2 = prod_lista_precios.objects.filter(pk=2).first() prod_producto_lprecios.objects.create(producto=prod, lista_precios=lp1, precio_costo=pcosto, precio_cimp=pimp, precio_venta=pventa1) prod_producto_lprecios.objects.create(producto=prod, lista_precios=lp2, precio_costo=pcosto, precio_cimp=pimp, precio_venta=pventa2) ubi = prod_ubicacion.objects.filter(default=True).first() prod_producto_ubicac.objects.create(producto=prod, ubicacion=ubi, punto_pedido=0.00) actualizar_stock(request, prod, ubi, 21, stock) cant += 1 messages.success( request, u'Se importó el archivo con éxito!<br>(%s Productos creados/actualizados)' % cant) else: form = ImportarProductosForm(None, None, request=request) context['form'] = form return render(request, 'productos/importar_productos.html', context)
def ausencias_importar(request): context = {} context = getVariablesMixin(request) if request.method == "POST": form = ImportarAusentismosForm(request.POST, request.FILES, request=request) if form.is_valid(): csv_file = form.cleaned_data["archivo"] empresa = form.cleaned_data["empresa"] if not csv_file.name.endswith(".csv"): messages.error(request, "¡El archivo debe tener extensión .CSV!") return HttpResponseRedirect(reverse("importar_empleados")) if csv_file.multiple_chunks(): messages.error(request, "El archivo es demasiado grande (%.2f MB)." % (csv_file.size / (1000 * 1000),)) return HttpResponseRedirect(reverse("importar_empleados")) decoded_file = csv_file.read().decode("latin1").replace(",", "").replace("'", "") # decoded_file=decoded_file.decode("latin1") io_string = io.StringIO(decoded_file) reader = unicode_csv_reader(io_string) # DNI;TIPO_AUSENCIA;aus_control;aus_fcontrol;aus_certificado;aus_fcertif;aus_fentrega_certif;aus_fcrondesde;aus_fcronhasta;aus_diascaidos; # aus_diasjustif;aus_freintegro;aus_falta;TIPO_ALTA;aus_medico;aus_grupop;aus_diagn;TIPO_ACCIDENTE;art_ndenuncia;art_faccidente; # art_fdenuncia;observaciones;descr_altaparc;detalle_acc_art;estudios_partic;estudios_art;recalificac_art cant = 0 try: next(reader) # Omito el Encabezado for index, line in enumerate(reader): campos = line[0].split(";") dni = campos[0].strip() if dni == "": continue # Salta al siguiente try: empl = ent_empleado.objects.get(nro_doc=dni) except: messages.error(request, "Empleado no existente! (%s)" % dni) continue tipoa = campos[1].strip() if tipoa == "": tipoa = None else: ta = dict(TIPO_AUSENCIA) tipoa = [k for k, v in ta.items() if v.upper() == tipoa.upper()][0] if campos[2].strip().upper() == "SI": aus_control = "S" else: aus_control = "N" if campos[3].strip() == "": aus_fcontrol = None else: aus_fcontrol = datetime.datetime.strptime(campos[3], "%d/%m/%Y").date() if campos[4].strip().upper() == "SI": aus_certificado = "S" else: aus_certificado = "N" if campos[5] == "": aus_fcertif = None else: aus_fcertif = datetime.datetime.strptime(campos[5], "%d/%m/%Y").date() if campos[6] == "": aus_fentrega_certif = None else: aus_fentrega_certif = datetime.datetime.strptime(campos[6], "%d/%m/%Y").date() if campos[7] == "": aus_fcrondesde = None else: aus_fcrondesde = datetime.datetime.strptime(campos[7], "%d/%m/%Y").date() if campos[8] == "": aus_fcronhasta = None else: aus_fcronhasta = datetime.datetime.strptime(campos[8], "%d/%m/%Y").date() if campos[9] == "": aus_diascaidos = None else: aus_diascaidos = campos[9].strip() if campos[10] == "": aus_diasjustif = None else: aus_diasjustif = campos[10].strip() if campos[11] == "": aus_freintegro = None else: aus_freintegro = datetime.datetime.strptime(campos[11], "%d/%m/%Y").date() if campos[12] == "": aus_falta = None else: aus_falta = datetime.datetime.strptime(campos[12], "%d/%m/%Y").date() austa = campos[13].strip() if austa == "": aus_tipo_alta = None else: aus_tipo_alta = dict(TIPO_ALTA) aus_tipo_alta = [k for k, v in aus_tipo_alta.items() if v.upper() == austa.upper()][0] aus_medico = campos[14].strip().upper() if aus_medico == "": aus_medico = None else: aus_medico = ent_medico_prof.objects.get_or_create(apellido_y_nombre=aus_medico)[0] aus_grupop = campos[15].strip().upper() if aus_grupop == "": aus_grupop = None else: aus_grupop = aus_patologia.objects.get_or_create(patologia=aus_grupop)[0] aus_diagn = campos[16].strip().upper() if aus_diagn == "": aus_diagn = None else: aus_diagn = aus_diagnostico.objects.get_or_create(diagnostico=aus_diagn)[0] tacc = campos[17].strip() if tacc == "": art_tipo_accidente = None else: art_tipo_accidente = dict(TIPO_ACCIDENTE) art_tipo_accidente = [k for k, v in art_tipo_accidente.items() if v.upper() == tacc.upper()][0] if campos[18] == "": art_ndenuncia = None else: art_ndenuncia = campos[20].strip() if campos[19] == "": art_faccidente = None else: art_faccidente = datetime.datetime.strptime(campos[19], "%d/%m/%Y").date() if campos[20] == "": art_fdenuncia = None else: art_fdenuncia = datetime.datetime.strptime(campos[20], "%d/%m/%Y").date() observaciones = campos[21].strip() descr_altaparc = campos[22].strip() detalle_acc_art = campos[23].strip() estudios_partic = campos[24].strip() estudios_art = campos[25].strip() recalificac_art = campos[26].strip() try: obj, created = ausentismo.objects.update_or_create( empleado=empl, tipo_ausentismo=tipoa, aus_fcrondesde=aus_fcrondesde, aus_fcronhasta=aus_fcronhasta, defaults={ "aus_control": aus_control, "aus_fcontrol": aus_fcontrol, "aus_certificado": aus_certificado, "aus_fcertif": aus_fcertif, "aus_fentrega_certif": aus_fentrega_certif, "aus_diascaidos": aus_diascaidos, "aus_diasjustif": aus_diasjustif, "aus_freintegro": aus_freintegro, "aus_falta": aus_falta, "aus_tipo_alta": aus_tipo_alta, "aus_medico": aus_medico, "aus_grupop": aus_grupop, "aus_diagn": aus_diagn, "art_tipo_accidente": art_tipo_accidente, "art_ndenuncia": art_ndenuncia, "art_faccidente": art_faccidente, "art_fdenuncia": art_fdenuncia, "observaciones": observaciones, "descr_altaparc": descr_altaparc, "detalle_acc_art": detalle_acc_art, "estudios_partic": estudios_partic, "estudios_art": estudios_art, "recalificac_art": recalificac_art, }, ) if created: cant += 1 except Exception as e: error = "Línea:%s -> %s " % (index, e) messages.error(request, error) messages.success(request, "Se importó el archivo con éxito!<br>(%s ausentismos creados)" % cant) except Exception as e: print e messages.error(request, "Línea:%s -> %s" % (index, e)) else: form = ImportarAusentismosForm(None, None, request=request) context["form"] = form return render(request, "ausentismos/importar_ausentismos.html", context)
def reporte_resumen_periodo(request): if not tiene_permiso(request,'indic_pantalla'): return redirect(reverse('principal')) template = 'reportes/resumen_periodo.html' form = ConsultaPeriodo(request.POST or None,request=request) fecha = date.today() fdesde = ultimo_anio() fhasta = hoy() context = {} context = getVariablesMixin(request) empresa = None filtro = u"" if form.is_valid(): periodo = form.cleaned_data['periodo'] # fdesde = form.cleaned_data['fdesde'] # fhasta = form.cleaned_data['fhasta'] empresa = form.cleaned_data['empresa'] empleado= form.cleaned_data['empleado'] tipo_ausentismo = form.cleaned_data['tipo_ausentismo'] trab_cargo= form.cleaned_data['trab_cargo'] fdesde = date(periodo.year,periodo.month,1) fhasta = date(periodo.year,periodo.month,calendar.monthrange(periodo.year, periodo.month)[1]) ausentismos = ausentismo.objects.filter(baja=False) filtro = u"Período: %s " % (periodo.strftime("%m/%Y")) if empresa: if empresa.casa_central: ausentismos= ausentismos.filter(empleado__empresa=empresa) else: ausentismos= ausentismos.filter(Q(empleado__empresa=empresa)|Q(empleado__empresa__casa_central=empresa)) else: ausentismos= ausentismos.filter(empleado__empresa__pk__in=empresas_habilitadas(self.request)) if empleado: ausentismos= ausentismos.filter(Q(empleado__apellido_y_nombre__icontains=empleado)|Q(empleado__nro_doc__icontains=empleado)) filtro = filtro+u" - Empleado: %s" % (empleado) if trab_cargo: ausentismos= ausentismos.filter(empleado__trab_cargo=trab_cargo) filtro = filtro+u" - Puesto de Trabajo: %s" % (trab_cargo) if int(tipo_ausentismo) > 0: ausentismos = ausentismos.filter(tipo_ausentismo=int(tipo_ausentismo)) ausentismos = ausentismos.filter(Q(aus_fcrondesde__gte=fdesde,aus_fcrondesde__lte=fhasta)|Q(aus_fcronhasta__gte=fdesde,aus_fcronhasta__lte=fhasta) |Q(aus_fcrondesde__lt=fdesde,aus_fcronhasta__gt=fhasta)) else: ausentismos = None context['form'] = form context['fecha'] = fecha context['fdesde'] = fdesde context['fhasta'] = fhasta context['ausentismos'] = ausentismos context['empresa'] = empresa context['titulo_reporte'] = u"REPORTE INDICADORES: %s - %s"%(empresa,filtro) context['filtro'] = filtro context['pie_pagina'] = "Sistemas Laboral Salud - %s" % (fecha.strftime("%d/%m/%Y")) dias_laborales = 0 dias_caidos_tot = 0 empleados_tot = 0 dias_trab_tot = 0 tasa_ausentismo = 0 aus_total = None aus_inc = None aus_acc = None aus_acc2 = None aus_x_grupop = None max_grupop = 0 dias_laborables = int((fhasta-fdesde).days+1) empl_mas_faltadores = [] porc_dias_trab_tot = 100 if empresa: empleados_tot = empresa.cantidad_empleados() if ausentismos: dias_caidos_tot=dias_ausentes(fdesde,fhasta,ausentismos) dias_trab_tot = (dias_laborables * empleados_tot)-dias_caidos_tot tasa_ausentismo = calcular_tasa_ausentismo(dias_caidos_tot,dias_laborables,empleados_tot) porc_dias_trab_tot = 100 - tasa_ausentismo ta_cant_empls = ausentismos.values('empleado').distinct().count() tp_cant_empls = empleados_tot- ta_cant_empls aus_total = {'dias_caidos_tot':dias_caidos_tot,'empleados_tot':empleados_tot,'dias_trab_tot':dias_trab_tot,'tasa_ausentismo':tasa_ausentismo, 'dias_laborables':dias_laborables,'porc_dias_trab_tot':porc_dias_trab_tot, 'ta_cant_empls':ta_cant_empls,'tp_cant_empls':tp_cant_empls} #F('college_start_date') - F('school_passout_date') #AUSENTISMO INCULPABLE ausentismos_inc = ausentismos.filter(tipo_ausentismo=1) if ausentismos_inc: empleados_inc = ausentismos_inc.values('empleado').distinct().count() # empleados_tot = 77 totales = tot_ausentes_inc(fdesde,fhasta,ausentismos_inc) dias_caidos_tot=totales[0] # dias_caidos_tot = 67 dias_trab_tot = (dias_laborables * empleados_tot)-dias_caidos_tot tasa_ausentismo = calcular_tasa_ausentismo(dias_caidos_tot,dias_laborables,empleados_tot) # agudos = ausentismos_inc.filter(aus_diascaidos__lte=30).aggregate(dias_caidos=Sum(Coalesce('aus_diascaidos', 0)))['dias_caidos'] or 0 # graves = ausentismos_inc.filter(aus_diascaidos__gt=30).aggregate(dias_caidos=Sum(Coalesce('aus_diascaidos', 0)))['dias_caidos'] or 0 agudos=totales[1] graves=totales[2] empl_agudos=totales[3] empl_graves=totales[4] porc_agudos = (Decimal(agudos) / Decimal(dias_caidos_tot))*100 porc_cronicos = (Decimal(graves) / Decimal(dias_caidos_tot))*100 tot_agudos = int(empl_agudos) tot_cronicos = int(empl_graves) porc_agudos = Decimal(porc_agudos).quantize(Decimal("0.01"), decimal.ROUND_HALF_UP) porc_cronicos = Decimal(porc_cronicos).quantize(Decimal("0.01"), decimal.ROUND_HALF_UP) porc_dias_trab_tot = 100 - tasa_ausentismo inc_cant_empls = empleados_inc noinc_cant_empls = empleados_tot- inc_cant_empls aus_inc = {'dias_caidos_tot':dias_caidos_tot,'empleados_tot':empleados_tot,'dias_trab_tot':dias_trab_tot,'tasa_ausentismo':tasa_ausentismo, 'dias_laborables':dias_laborables,'porc_dias_trab_tot':porc_dias_trab_tot,'porc_agudos':porc_agudos,'porc_cronicos':porc_cronicos, 'inc_cant_empls':inc_cant_empls,'noinc_cant_empls':noinc_cant_empls,'tot_agudos':tot_agudos,'tot_cronicos':tot_cronicos} #AUSENTISMO ACCIDENTES ausentismos_acc = ausentismos.filter(tipo_ausentismo=2) if ausentismos_acc: #empleados_tot = ausentismos_acc.values('empleado').distinct().count() # empleados_tot = 77 dias_caidos_tot=dias_ausentes(fdesde,fhasta,ausentismos_acc) # dias_caidos_tot = 67 dias_trab_tot = (dias_laborables * empleados_tot)-dias_caidos_tot tasa_ausentismo = calcular_tasa_ausentismo(dias_caidos_tot,dias_laborables,empleados_tot) if tasa_ausentismo > 0: porc_dias_trab_tot = 100 - tasa_ausentismo tot_accidentes = ausentismos_acc.count() acc_empls = ausentismos_acc.values('empleado').distinct().count() noacc_empls = empleados_tot- acc_empls acc_denunciados = ausentismos_acc.exclude(Q(art_ndenuncia__isnull=True)|Q(art_ndenuncia__exact='')) denunciados_empl = acc_denunciados.values('empleado').distinct().count() acc_denunciados = (Decimal(acc_denunciados.count()) / Decimal(tot_accidentes))*100 acc_sin_denunciar = ausentismos_acc.filter(Q(art_ndenuncia__isnull=True)|Q(art_ndenuncia__exact='')) if not acc_sin_denunciar: aus_acc2 = None else: sin_denunciar_empl = acc_sin_denunciar.values('empleado').distinct().count() acc_sin_denunciar = (Decimal(acc_sin_denunciar.count()) / Decimal(tot_accidentes))*100 aus_acc2 = {'acc_denunciados':acc_denunciados,'acc_sin_denunciar':acc_sin_denunciar,'denunciados_empl':denunciados_empl,'sin_denunciar_empl':sin_denunciar_empl} acc_itinere = ausentismos_acc.filter(art_tipo_accidente=2) itinere_empl = acc_itinere.values('empleado').distinct().count() acc_itinere = (Decimal(acc_itinere.count()) / Decimal(tot_accidentes))*100 acc_trabajo = ausentismos_acc.filter(art_tipo_accidente=1) trabajo_empl = acc_trabajo.values('empleado').distinct().count() acc_trabajo = (Decimal(acc_trabajo.count()) / Decimal(tot_accidentes))*100 aus_acc = {'dias_caidos_tot':dias_caidos_tot,'empleados_tot':empleados_tot,'dias_trab_tot':dias_trab_tot,'tasa_ausentismo':tasa_ausentismo, 'dias_laborables':dias_laborables,'porc_dias_trab_tot':porc_dias_trab_tot,'tot_accidentes':tot_accidentes, 'acc_itinere':acc_itinere,'acc_trabajo':acc_trabajo,'acc_empls':acc_empls,'noacc_empls':noacc_empls,'itinere_empl':itinere_empl,'trabajo_empl':trabajo_empl} else: aus_acc = None aus_x_grupop = ausentismos.values('aus_grupop__patologia').annotate(total=Count('aus_grupop')).order_by('-total')[:5] max_grupop = aus_x_grupop[0]['total']+1 empl_mas_faltadores = [] for a in ausentismos.select_related('empleado'): dias = dias_ausentes_empl(fdesde,fhasta,a) empl_mas_faltadores.append({'empleado':a.empleado,'dias':dias}) empl_mas_faltadores = sorted(empl_mas_faltadores, key = lambda i: i['dias'],reverse=True) context['aus_total']= aus_total context['aus_inc']= aus_inc context['aus_acc']= aus_acc context['aus_acc2']= aus_acc2 context['aus_x_grupop']= aus_x_grupop context['max_grupop']= max_grupop context['dias_laborables']= dias_laborables context['empl_mas_faltadores']= empl_mas_faltadores[:10] if ('pdf' in request.POST)and(aus_total): aus_tot_image = request.POST.get('aus_tot_image',None) aus_inc_image = request.POST.get('aus_inc_image',None) aus_inc2_image = request.POST.get('aus_inc2_image',None) aus_acc_image = request.POST.get('aus_acc_image',None) aus_acc2_image = request.POST.get('aus_acc2_image',None) aus_acc3_image = request.POST.get('aus_acc3_image',None) aus_grp_image = request.POST.get('aus_grp_image',None) template = 'reportes/reporte_periodo.html' context['aus_tot_image'] = aus_tot_image context['aus_inc_image'] = aus_inc_image context['aus_inc2_image'] = aus_inc2_image context['aus_acc_image'] = aus_acc_image context['aus_acc2_image'] = aus_acc2_image context['aus_acc3_image'] = aus_acc3_image context['aus_grp_image'] = aus_grp_image return render_to_pdf_response(request,template, context) return render(request,template,context)
def reporteResumenAnual(request): if not tiene_permiso(request,'indic_pantalla'): return redirect(reverse('principal')) template_name = 'reportes/resumen_anual.html' form = ConsultaAnual(request.POST or None,request=request) fecha = date.today() fdesde = ultimo_anio() fhasta = hoy() context = {} context = getVariablesMixin(request) empresa = None filtro = u"" max_grupop = 20 if form.is_valid(): periodo_desde = form.cleaned_data['periodo_desde'] periodo_hasta = form.cleaned_data['periodo_hasta'] empresa = form.cleaned_data['empresa'] empleado= form.cleaned_data['empleado'] tipo_ausentismo = form.cleaned_data['tipo_ausentismo'] trab_cargo= form.cleaned_data['trab_cargo'] fdesde = date(periodo_desde.year,periodo_desde.month,1) fhasta = date(periodo_hasta.year,periodo_hasta.month,calendar.monthrange(periodo_hasta.year, periodo_hasta.month)[1]) ausentismos = ausentismo.objects.filter(baja=False) filtro = u"Período desde %s al %s" % (fdesde.strftime("%m/%Y"),fhasta.strftime("%m/%Y")) if empresa: if empresa.casa_central: ausentismos= ausentismos.filter(empleado__empresa=empresa) else: ausentismos= ausentismos.filter(Q(empleado__empresa=empresa)|Q(empleado__empresa__casa_central=empresa)) else: ausentismos= ausentismos.filter(empleado__empresa__pk__in=empresas_habilitadas(self.request)) if empleado: ausentismos= ausentismos.filter(Q(empleado__apellido_y_nombre__icontains=empleado)|Q(empleado__nro_doc__icontains=empleado)) if trab_cargo: ausentismos= ausentismos.filter(empleado__trab_cargo=trab_cargo) if int(tipo_ausentismo) > 0: ausentismos = ausentismos.filter(tipo_ausentismo=int(tipo_ausentismo)) ausentismos = ausentismos.filter(Q(aus_fcrondesde__gte=fdesde,aus_fcrondesde__lte=fhasta)|Q(aus_fcronhasta__gte=fdesde,aus_fcronhasta__lte=fhasta) |Q(aus_fcrondesde__lt=fdesde,aus_fcronhasta__gt=fhasta)) else: ausentismos = None context['form'] = form context['fecha'] = fecha context['fdesde'] = fdesde context['fhasta'] = fhasta context['ausentismos'] = ausentismos context['empresa'] = empresa dias_laborales = 0 dias_caidos_tot = 0 empleados_tot = 0 dias_trab_tot = 0 tasa_ausentismo = 0 aus_total = None aus_inc = None aus_acc = None dias_laborables = 0 porc_dias_trab_tot = 100 totales = [] inculpables = [] accidentes = [] enfermos = [] datos_tabla = [] import time from dateutil.rrule import rrule, MONTHLY meses = [[int(dt.strftime("%m")),int(dt.strftime("%Y"))] for dt in rrule(MONTHLY, dtstart=fdesde, until=fhasta)] # import locale # locale.setlocale(locale.LC_ALL, '') listado_meses = ["%s%s" % (MESES[int(dt.strftime("%m"))-1][1].upper(),(dt.strftime("%Y"))) for dt in rrule(MONTHLY, dtstart=fdesde, until=fhasta)] if empresa: empleados_tot = empresa.cantidad_empleados() if ausentismos: for m in meses: dias_laborables = int(dias_mes(m[0],m[1],fdesde,fhasta)) ausencias = en_mes_anio(m[0],m[1],ausentismos) qs_totales = ausencias ausenc_totales = dias_ausentes_mes(m[0],m[1],ausencias) empl_totales = empleados_tot dias_trab_tot = (dias_laborables * empl_totales)-ausenc_totales if ausenc_totales >0: tasa_total = calcular_tasa_ausentismo(ausenc_totales,dias_laborables,empl_totales) else: tasa_total = 0 ta_cant_empls = qs_totales.values('empleado').distinct().count() totales.append({'y':tasa_total,'custom':{'empleados':ta_cant_empls}}) qs_inculpables = ausencias.filter(tipo_ausentismo=1) ausenc_inculp = dias_ausentes_mes(m[0],m[1],qs_inculpables) # empl_tot_inculp= qs_inculpables.values('empleado').distinct().count() empl_tot_inculp = empleados_tot dias_trab_tot = (dias_laborables * empl_tot_inculp)-ausenc_inculp if ausenc_inculp >0: tasa_inclup = calcular_tasa_ausentismo(ausenc_inculp,dias_laborables,empl_tot_inculp) else: tasa_inclup = 0 empl_inculp = qs_inculpables.values('empleado').distinct().count() inculpables.append({'y':tasa_inclup,'custom':{'empleados':empl_inculp}}) qs_accidentes = ausencias.filter(tipo_ausentismo=2) ausenc_acc = dias_ausentes_mes(m[0],m[1],qs_accidentes) # ausenc_acc = qs_accidentes.count() # empl_tot_acc= qs_accidentes.values('empleado').distinct().count() empl_tot_acc = empleados_tot dias_trab_tot = (dias_laborables * empl_tot_acc)-ausenc_acc if ausenc_acc >0: tasa_acc = calcular_tasa_ausentismo(ausenc_acc,dias_laborables,empl_tot_acc) else: tasa_acc = 0 empl_acc = qs_accidentes.values('empleado').distinct().count() accidentes.append({'y':tasa_acc,'custom':{'empleados':empl_acc}}) qs_enfermos = ausencias.filter(tipo_ausentismo=3) ausenc_enf = dias_ausentes_mes(m[0],m[1],qs_enfermos) # ausenc_enf = qs_enfermos.count() # empl_tot_enf= qs_enfermos.values('empleado').distinct().count() empl_tot_enf = empleados_tot dias_trab_tot = (dias_laborables * empl_tot_enf)-ausenc_enf if ausenc_enf >0: tasa_enf = calcular_tasa_ausentismo(ausenc_enf,dias_laborables,empl_tot_enf) else: tasa_enf = 0 enfermos.append(tasa_enf) datos_tabla.append({'mes':m,'tasa_total':tasa_total,'ta_cant_empls':ta_cant_empls,\ 'tasa_inclup':tasa_inclup,'empl_inculp':empl_inculp,'tasa_acc':tasa_acc,'empl_acc':empl_acc }) aus_x_grupop_tot = ausentismos.values('aus_grupop__pk','aus_grupop__patologia').annotate(total=Count('aus_grupop')).order_by('-total')[:4] id_grupos = [int(x['aus_grupop__pk']) for x in aus_x_grupop_tot] listado=[] for x in aus_x_grupop_tot: nombre=x['aus_grupop__patologia'] id=x['aus_grupop__pk'] datos=[] for m in meses: ausencias = en_mes_anio(m[0],m[1],ausentismos) aus_x_grupop = list(ausencias.filter(aus_grupop__pk__in=id_grupos).values('aus_grupop__patologia','aus_grupop__pk')\ .annotate(total=Count('aus_grupop')).order_by('-total').values('aus_grupop__patologia','aus_grupop__pk','total')) total=sum([int(p['total']) for p in aus_x_grupop if id==p['aus_grupop__pk']]) datos.append(total) listado.append(dict(name=nombre,data=datos)) if aus_x_grupop: max_grupop = max([max(l['data']) for l in listado]) context['max_grupop']= max_grupop context['inculpables']= json.dumps(inculpables,cls=DecimalEncoder) context['accidentes']= json.dumps(accidentes,cls=DecimalEncoder) context['enfermos']= json.dumps(enfermos,cls=DecimalEncoder) context['totales']= json.dumps(totales,cls=DecimalEncoder) context['grupop']= listado else: context['inculpables']= None context['accidentes']= None context['enfermos']= None context['totales']= None context['grupop']= None context['listado_meses']= json.dumps(listado_meses,cls=DecimalEncoder) context['datos_tabla']= datos_tabla context['empresa'] = empresa context['titulo_reporte'] = u"REPORTE INDICADORES : %s %s"%(empresa,filtro) context['filtro'] = filtro context['pie_pagina'] = "Sistemas Laboral Salud - %s" % (fecha.strftime("%d/%m/%Y")) if ('pdf' in request.POST)and(ausentismos): aus_tot_image = request.POST.get('aus_tot_image',None) aus_grupop_image = request.POST.get('aus_grupop_image',None) template_name = 'reportes/reporte_anual.html' context['aus_tot_image'] = aus_tot_image context['aus_grupop_image'] = aus_grupop_image return render_to_pdf_response(request,template_name, context) return render(request,template_name,context)