def perfiles(canvas, y, practicas, hasta, dias):
    fecha = hasta - timedelta(days=dias)
    antes, despues = clasificarRealizaciones(practicas, fecha)
    cantidadesAntes = contarRealizaciones(antes)
    cantidadesDespues = contarRealizaciones(despues)
    da = datosPerfiles(cantidadesAntes,
                       "Hasta el día " + fecha.strftime("%d/%m/%y"))
    dd = datosPerfiles(cantidadesDespues,
                       "Desde el día " + fecha.strftime("%d/%m/%y"))

    y = -10 + pdf.titulo(
        canvas, y,
        "Perfil del tipo de atención en prácticas realizadas (últimos %d días)"
        % dias)
    if dd is not None:
        g = [pdf.torta(dd)]
        if da is not None:
            g.insert(0, pdf.torta(da))
        y = -10 + pdf.graficos(canvas, y, *g)
        y = pdf.referencias(canvas, pdf.MARGEN, y,
                            pdf.A4[0] - (2 * pdf.MARGEN), 20, dd)
    else:
        y = -5 + pdf.texto(
            canvas, y, "No hay prácticas realizadas desde el día %s." %
            fecha.strftime("%d/%m/%y"))
    return y
def tiposDeAtencion(canvas, y, practicas, hasta, dias):
    fecha = hasta - timedelta(days=dias)
    tdas = buscarTDA(practicas, fecha)
    y = -10 + pdf.titulo(
        canvas, y, "Tipos de atención más frecuentes (últimos %d días)" % dias)
    if tdas:
        habilitados = tdas.filter(baja=False)
        deshabilitados = tdas.filter(baja=True)
        if deshabilitados:
            y = -5 + pdf.texto(
                canvas, y,
                "Hay registradas %d prácticas con tipos de atención deshabilitados facturadas desde el día %s."
                % (sum(tda.cantidad_practicas
                       for tda in deshabilitados), fecha.strftime("%d/%m/%y")))
        if habilitados:
            normales, raros, descarte = clasificar(preparar(habilitados))
            if raros:
                y = -5 + pdf.texto(
                    canvas, y,
                    "Se analizan por separado %d de los tipos de atención por presentar menor frecuencia de uso (Otros TDA)."
                    % len(excepcionales))
            if descarte:
                y = -5 + pdf.texto(
                    canvas, y,
                    "Se limita el reporte a %d de los tipos de atención con mayor frecuencia de uso."
                    % (len(regulares) + len(excepcionales)))
            datos = datosTiposDeAtencion(normales, "Tipos de atención")
            grafico = graficar(datos)
            if grafico:
                y = -10 + pdf.graficos(canvas, y, grafico)
                y = -10 + pdf.referencias(canvas, pdf.MARGEN, y, pdf.A4[0] -
                                          (2 * pdf.MARGEN), 20, datos)
            y = -45 + tabular(canvas, y, normales)
            if raros:
                datos = datosTiposDeAtencion(raros, "Otros tipos de atención")
                grafico = graficar(datos)
                if grafico:
                    y = -10 + pdf.graficos(canvas, y, grafico)
                    y = -10 + pdf.referencias(canvas, pdf.MARGEN, y,
                                              pdf.A4[0] -
                                              (2 * pdf.MARGEN), 20, datos)
                y = -45 + tabular(canvas, y, raros)
            if descarte:
                y = -5 + pdf.texto(canvas, y,
                                   "Los tipos de atención sin analizar son:")
                y = -45 + tabular(canvas, y, descarte)
        else:
            y = -5 + pdf.texto(
                canvas, y,
                "No se han facturado prácticas con ninguno de los tipos de atención habilitados desde el día %s."
                % fecha.strftime("%d/%m/%y"))
    else:
        y = -5 + pdf.texto(
            canvas, y, "No se han facturado prácticas desde el día %s." %
            fecha.strftime("%d/%m/%y"))
    return y
def reportePdf(practicas, hoy, dias):

    canvas = pdf.crear()

    y = pdf.A4[1] - pdf.MARGEN
    y = -54 + pdf.titulo(canvas, y, "Reporte de cirugias al %s" % hoy.strftime("%d/%m/%Y"), 15, 0.5)
    y = -54 + reportes.perfiles(canvas, y, practicas, hoy, dias["perfiles"])
    y = -54 + reportes.realizacionesPorDia(canvas, y, practicas, hoy, dias["realizaciones"])
    y = -54 + reportes.porcentajesActualizacion(canvas, y, practicas, Areas.Q, hoy, dias["actualizaciones"])
    y = -54 + reportes.tiposDeAtencion(canvas, y, practicas, hoy, dias["tiposdeatencion"])

    return pdf.terminar(canvas)
def realizacionesPorDia(canvas, y, practicas, hasta, dias):
    desde = hasta - timedelta(days=dias)
    cantidades = realizacionesEntre(practicas, desde, hasta)
    datos = datosRealizacionesPorDia(cantidades)

    y = -10 + pdf.titulo(
        canvas, y,
        "Número diario de prácticas realizadas (últimos %d días)" % dias)
    if datos:
        g = pdf.cartesiano(datos)
        y = pdf.graficos(canvas, y, g)
    else:
        y = -5 + pdf.texto(
            canvas, y, "No hay prácticas realizadas desde el día %s." %
            desde.strftime("%d/%m/%y"))
    return y
def porcentajesActualizacion(canvas, y, practicas, area, hasta, dias):
    desde = hasta - timedelta(days=dias)
    practicas = creadasEntre(practicas, desde, hasta)

    y = -10 + pdf.titulo(
        canvas, y,
        "Prácticas actualizadas según estado (últimos %d días)" % dias)
    if practicas:
        niveles = calcularNiveles(practicas, area)
        datos = datosPorcentajesActualizacion(niveles)
        g = pdf.barras(datos)
        y = pdf.graficos(canvas, y, g)
    else:
        y = -5 + pdf.texto(
            canvas, y, "No hay prácticas creadas desde el día %s." %
            desde.strftime("%d/%m/%y"))
    return y