def __init__(self, *args, **kwargs): request = kwargs.pop("request", None) super(AusentismoForm, self).__init__(*args, **kwargs) empresas = empresas_habilitadas(request) self.fields["empleado"].queryset = ent_empleado.objects.filter( baja=False, empresa__pk__in=empresas) self.fields["empresa"].queryset = ent_empresa.objects.filter( baja=False, pk__in=empresas) usuario = usuario_actual(request) # Si es médico no vé los últimos tipos if usuario.tipoUsr == 1: self.fields["tipo_ausentismo"].choices = TIPO_AUSENCIA_MEDICOS if not tiene_permiso(request, "pat_pantalla"): self.fields["aus_grupop"].queryset = aus_patologia.objects.filter( baja=False) self.fields["aus_grupop"].label = u"Grupo Patológico" if not tiene_permiso(request, "diag_pantalla"): self.fields["aus_diagn"].queryset = aus_diagnostico.objects.filter( baja=False) self.fields["aus_diagn"].label = u"Diagnóstico" if not tiene_permiso(request, "med_pantalla"): self.fields[ "aus_medico"].queryset = ent_medico_prof.objects.filter( baja=False) self.fields["aus_medico"].label = u"Médico Tratante/ART"
def TareasDeleteView(request, id): t = get_object_or_404(gral_tareas, id=id) if not tiene_permiso(request, 'gral_tareas'): return redirect(reverse('tareas_listado')) t.delete() messages.success(request, u'Los datos se guardaron con éxito!') return redirect('tareas_listado')
def empresa_baja_alta(request,id): if not tiene_permiso(request,'emp_pantalla'): return redirect(reverse('principal')) ent = ent_empresa.objects.get(pk=id) ent.baja = not ent.baja ent.save() messages.success(request, u'¡Los datos se guardaron con éxito!') return HttpResponseRedirect(reverse("empresa_listado"))
def art_baja_alta(request,id): if not tiene_permiso(request,'art_pantalla'): return redirect(reverse('principal')) art = ent_art.objects.get(pk=id) art.baja = not art.baja art.save() messages.success(request, u'¡Los datos se guardaron con éxito!') return HttpResponseRedirect(reverse("art_listado"))
def turno_estado(request, id, estado): if not tiene_permiso(request, 'turnos_pantalla'): return redirect(reverse('principal')) ent = turnos.objects.get(pk=id) ent.estado = estado ent.save() messages.success(request, u'¡Los datos se guardaron con éxito!') return HttpResponseRedirect(reverse("turnos_listado"))
def ausentismo_eliminar_masivo(request): if not tiene_permiso(request, "aus_abm"): return redirect(reverse("principal")) listado = request.GET.getlist("id") ausentismos = ausentismo.objects.filter( id__in=listado, empleado__empresa__pk__in=empresas_habilitadas(request) ).delete() messages.success(request, "¡Los datos se eliminaron con éxito!") return HttpResponse(json.dumps(len(listado)), content_type="application/json")
def VendedoresDeleteView(request, id): try: objeto = get_object_or_404(cpb_cuenta, id=id) if not tiene_permiso(request,'ent_vendedores_abm'): return redirect(reverse('principal')) objeto.delete() messages.success(request, u'¡Los datos se guardaron con éxito!') except: messages.error(request, u'¡Los datos no pudieron eliminarse!') return redirect('vendedores_listado')
def empleado_eliminar_masivo(request): if not tiene_permiso(request,'empl_pantalla'): return redirect(reverse('principal')) listado = request.GET.getlist('id') try: empleados = ent_empleado.objects.filter(id__in=listado).delete() messages.success(request, u'¡Los datos se eliminaron con éxito!') recalcular_cantidad_empleados(self.object.empresa) except: messages.error(request, u'¡El Empleado no debe tener cargado Ausentismos a su nombre!<br>(elimínelos y vuelva a intentar)') return HttpResponse(json.dumps(len(listado)), content_type = "application/json")
def empleado_baja_alta(request,id): if not tiene_permiso(request,'empl_pantalla'): return redirect(reverse('principal')) try: ent = ent_empleado.objects.get(pk=id) ent.baja = not ent.baja if ent.baja: ent.trab_fbaja=hoy() else: ent.trab_fbaja=None ent.save() recalcular_cantidad_empleados(ent.empresa) messages.success(request, u'¡Los datos se guardaron con éxito!') except: pass return HttpResponseRedirect(reverse("empleado_listado"))
def dispatch(self, *args, **kwargs): if not tiene_permiso(self.request, "pat_pantalla"): return redirect(reverse("principal")) return super(PatologiaEditView, self).dispatch(*args, **kwargs)
def dispatch(self, *args, **kwargs): if not tiene_permiso(self.request,'ent_proveedores'): return redirect(reverse('principal')) return super(ProveedoresView, self).dispatch(*args, **kwargs)
def dispatch(self, *args, **kwargs): limpiar_sesion(self.request) if not tiene_permiso(self.request, 'gral_tareas'): return redirect(reverse('principal')) return super(TareasView, self).dispatch(*args, **kwargs)
def dispatch(self, *args, **kwargs): if not tiene_permiso(self.request, 'gral_tareas'): return redirect(reverse('tareas_listado')) return super(TareasEditView, self).dispatch(*args, **kwargs)
def dispatch(self, *args, **kwargs): if not tiene_permiso(self.request, 'trab_pedidos'): return redirect(reverse('principal')) return super(OPCreateView, self).dispatch(*args, **kwargs)
def dispatch(self, *args, **kwargs): if not tiene_permiso(self.request, 'gral_configuracion'): return redirect(reverse('prod_stock_listado')) return super(ProdStockEditView, self).dispatch(*args, **kwargs)
def dispatch(self, *args, **kwargs): if not tiene_permiso(self.request, "aus_pantalla"): return redirect(reverse("principal")) return super(AusentismoView, self).dispatch(*args, **kwargs)
def dispatch(self, *args, **kwargs): if not tiene_permiso(self.request,'ent_clientes_abm'): return redirect(reverse('principal')) return super(ClientesCreateView, self).dispatch(*args, **kwargs)
def dispatch(self, *args, **kwargs): if not tiene_permiso(self.request,'empl_pantalla'): return redirect(reverse('principal')) return super(EmpleadoCreateView, self).dispatch(*args, **kwargs)
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 dispatch(self, *args, **kwargs): if not tiene_permiso(self.request, "diag_pantalla"): return redirect(reverse("principal")) return super(DiagnosticoEditView, self).dispatch(*args, **kwargs)
def dispatch(self, *args, **kwargs): if not tiene_permiso(self.request,'esp_pantalla'): return redirect(reverse('principal')) return super(EspecialidadView, self).dispatch(*args, **kwargs)
def dispatch(self, *args, **kwargs): if not tiene_permiso(self.request, 'prod_productos_abm'): return redirect(reverse('principal')) return super(ProductosCreateViewModal, self).dispatch(*args, **kwargs)
def dispatch(self, *args, **kwargs): if not tiene_permiso(self.request,'ent_vendedores_abm'): return redirect(reverse('principal')) return super(VendedoresEditView, self).dispatch(*args, **kwargs)
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 ausentismo_eliminar(request, id): if not tiene_permiso(request, "aus_abm"): return redirect(reverse("principal")) aus = ausentismo.objects.get(pk=id, empleado__empresa__pk__in=empresas_habilitadas(request)).delete() messages.success(request, "¡Los datos se eliminaron con éxito!") return HttpResponseRedirect(reverse("ausentismo_listado"))
def dispatch(self, *args, **kwargs): if not tiene_permiso(self.request,'art_pantalla'): return redirect(reverse('principal')) return super(ARTEditView, self).dispatch(*args, **kwargs)
def dispatch(self, *args, **kwargs): if not tiene_permiso(self.request, "aus_abm"): return redirect(reverse("ausentismo_listado")) return super(SeguimControlCreateView, self).dispatch(*args, **kwargs)
def dispatch(self, *args, **kwargs): if not tiene_permiso(self.request, 'gral_configuracion'): return redirect(reverse('principal')) return super(EmpresaEditView, self).dispatch(*args, **kwargs)
def dispatch(self, *args, **kwargs): if not tiene_permiso(self.request, 'trab_colocacion'): return redirect(reverse('principal')) return super(OCEstadoEditView, self).dispatch(*args, **kwargs)
def dispatch(self, *args, **kwargs): limpiar_sesion(self.request) if not tiene_permiso(self.request, 'gral_configuracion'): return redirect(reverse('principal')) return super(ProdStockView, self).dispatch(*args, **kwargs)