Esempio n. 1
0
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)
Esempio n. 2
0
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)
Esempio n. 3
0
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)
Esempio n. 4
0
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)
Esempio n. 5
0
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)
Esempio n. 6
0
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'))
Esempio n. 7
0
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)
Esempio n. 8
0
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)
Esempio n. 9
0
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)
Esempio n. 10
0
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)
Esempio n. 11
0
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)
Esempio n. 12
0
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)
Esempio n. 13
0
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)