Пример #1
0
def go(titulo, 
       ruta_archivo, 
       datos_cliente, 
       datos_albaran, 
       lineas_contenido, 
       totales, 
       datos_de_la_empresa):
    """
    Recibe el título del documento y la ruta completa del archivo PDF, 
    los datos del cliente en un diccionario, los del albarán también como 
    diccionario, las líneas como lista de listas, los totales como lista 
    y otra lista con la ruta al logotipo como primer elemento y tantas líneas 
    como datos de la empresa se quieran mostrar junto al logo.
    Devuelve uno o dos nombres de ficheros en PDF con el albarán/carta de 
    porte y (opcionalmente) el documento de recogida de envases.
    """
    doc = SimpleDocTemplate(ruta_archivo, 
                            title = titulo, 
                            topMargin = 4.30*cm, 
                            bottomMargin = 2*cm) 
                            #leftMargin = 1*cm, 
                            #rigthMargin = 1*cm)
    contenido = build_tabla_contenido(lineas_contenido)
    totales = build_tabla_totales(totales)
    #texto = build_texto()
    story = [#Spacer(1, 1.60 * cm),   # Chispa más o menos los datos de cliente.
             #encabezado, 
             Spacer(1, 3.50 * cm), 
             contenido, 
             Linea((1.05*cm, 24.5*cm - 3*cm), 
                   (1.05*cm, 2.5*cm + 0.25*cm)), 
             Linea((PAGE_WIDTH - 1.05*cm, 24.5*cm - 3*cm), 
                   (PAGE_WIDTH - 1.05*cm, 2.5*cm + 0.25*cm)), 
             Spacer(1, 0.15 * cm), 
             totales, 
             lastPageNumberFlowable(0.9*PAGE_WIDTH - 0.5*cm + 1, 1.0*cm)] 
            #Spacer(1, 0.15 * cm), 
            # Línea doble.
            #KeepTogether([LineaHorizontal(0.9 * PAGE_WIDTH), 
            #              Spacer(1, 0.05 * cm), 
            #              LineaHorizontal(0.9 * PAGE_WIDTH)]), 
            #Spacer(1, 0.15 * cm), 
            #CondPageBreak(13*cm), 
            #logo_y_empresa, 
            #Spacer(1, 0.25 * cm), 
            #texto]
    story = utils.aplanar([i for i in story if i])
    _cabecera_y_cliente = lambda c, d: cabecera_y_cliente(c, 
                                                          d, 
                                                          datos_cliente, 
                                                          datos_de_la_empresa, 
                                                          datos_albaran)
    _solo_cabecera = lambda c, d: solo_cabecera(c, 
                                                d, 
                                                datos_de_la_empresa, 
                                                datos_albaran)
    doc.build(story, 
              onFirstPage = _cabecera_y_cliente, 
              onLaterPages = _solo_cabecera)
    return ruta_archivo
Пример #2
0
def go(titulo, 
       ruta_archivo, 
       lineas_datos_empresa, 
       datos_cliente, 
       ref_obra, 
       datos_comercial, 
       fecha = None, 
       ruta_logo = None, 
       datos_fiscales = "", 
       logo_marcado = None,
       idioma = "es"
      ):
    """
    Recibe el título del documento y la ruta completa del archivo.
    """
    doc = SimpleDocTemplate(ruta_archivo, title = titulo)
    # Secciones
    encabezado = build_encabezado(idioma = idioma) # Logos y "título"
    datos_cliente = build_datos_cliente(datos_cliente, idioma)  # Datos cliente
    par_fecha = build_fecha(fecha, idioma)  # Fecha a la derecha
    datos_obra = build_datos_obra(ref_obra, idioma) # Cuadro con datos de obra
    texto = build_texto(idioma)   # El texto es fijo.
    despedida = build_despedida(datos_comercial, idioma)
    story = [Spacer(1, 4 * cm), 
             encabezado, 
             datos_cliente, 
             par_fecha, 
             Spacer(1, 0.2 * cm), 
             datos_obra, 
             Spacer(1, 0.4 * cm), 
             texto, 
             Spacer(1, 1 * cm), 
             despedida
            ]
    story = utils.aplanar([i for i in story if i])
    _dibujar_logo = lambda c, d: dibujar_logo(c, d, ruta_logo, 
                                              lineas_datos_empresa, 
                                              datos_fiscales, 
                                              logo_marcado,
                                              idioma)
    _dibujar_pie = lambda c, d: dibujar_pie(c, d, lineas_datos_empresa, 
                                            datos_fiscales)
    doc.build(story, onFirstPage = _dibujar_logo) #, onLaterPages = _dibujar_pie)
    return ruta_archivo
Пример #3
0
def go(ruta_archivo, producto, dic_valores, datos_de_la_empresa, albaran, 
       orden = None):
    """
    Genera, a partir de los datos recibidos, el PDF del certificado de calidad.
    Solo un producto.

    IN:
        ruta_archivo: Nombre del PDF que se generará.
        producto : Objeto pclases del producto.
        dic_valores: diccionario con las características a mostrar, el 
                     método de ensayo, la unidad y el valor numérico (como 
                     texto).
        albaran: Albarán de salida implicado en el certificado.
        datos_de_la_empresa: Registro de pclases con los datos de la empresa.

    OUT: 
        ruta_archivo: La ruta completa en el dir. temp. del archivo generado.
    """
    ruta_archivo = os.path.join(gettempdir(), ruta_archivo)
    doc = SimpleDocTemplate(ruta_archivo, 
                            title = "CERTIFICADO DE CALIDAD", 
                            topMargin = 2.5*cm, 
                            bottomMargin = 3*cm) 
                            #leftMargin = 1*cm, 
                            #rigthMargin = 1*cm)
    denominacion = build_denominacion(producto, albaran)
    marcado = build_marcado(datos_de_la_empresa)
    caracteristicas = build_caracteristicas(dic_valores, orden)
    pie = build_pie(datos_de_la_empresa)
    story = [denominacion, 
             Spacer(1, 0.30 * cm), 
             marcado, 
             Spacer(1, 0.30 * cm), 
             caracteristicas, 
             Spacer(1, 1.00 * cm), 
             pie]
    story = utils.aplanar([i for i in story if i])
    _encabezado = lambda c, d: cabecera(c, datos_de_la_empresa)
    _pie = lambda c, d: pie(c, datos_de_la_empresa)
    doc.build(story, 
              onFirstPage = _encabezado, 
              onLaterPages = _pie)
    return ruta_archivo
Пример #4
0
def go(titulo, 
       ruta_archivo, 
       lineas_datos_empresa, 
       datos_cliente, 
       lineas_contenido, 
       fecha_entradilla, 
       totales = {}, 
       texto = None, 
       despedida = None, 
       ruta_logo = None, 
       validez = None, 
       numpresupuesto = ""):
    """
    Recibe el título del documento y la ruta completa del archivo.
    Si validez != None escribe una frase con la validez del presupuesto.
    """
    doc = SimpleDocTemplate(ruta_archivo, title = titulo)
    encabezado = build_encabezado(lineas_datos_empresa)
    datos_cliente = build_datos_cliente(datos_cliente)
    entradilla = build_entradilla(fecha_entradilla, numpresupuesto)
    texto = build_texto(texto)
    contenido = build_tabla_contenido(lineas_contenido)
    totales = build_tabla_totales(totales)
    despedida = build_texto(despedida)
    story = [encabezado, 
             datos_cliente, 
             entradilla, 
             Spacer(1, 0.2 * cm), 
             texto, 
             Spacer(1, 0.2 * cm), 
             contenido, 
             Spacer(1, 0.25 * cm), 
             totales, 
             Spacer(1, 2 * cm), 
             despedida]
    if validez:
        story.insert(9, build_validez(validez))
    story = utils.aplanar([i for i in story if i])
    _dibujar_logo = lambda c, d: dibujar_logo(c, d, ruta_logo)
    doc.build(story, onFirstPage = _dibujar_logo)
    return ruta_archivo
Пример #5
0
def go(titulo, 
       ruta_archivo, 
       lineas_datos_empresa, 
       datos_cliente, 
       lineas_contenido, 
       fecha_entradilla, 
       totales = {}, 
       texto = None, 
       despedida = None, 
       ruta_logo = None, 
       validez = None, 
       condicionado = None, 
       texto_riesgo = None, 
       numpresupuesto = "", 
       incluir_condicionado_general = True, 
       forma_de_pago = None, 
       dir_fiscal = None, 
       firma_comercial = None, 
       para_estudio = False,
       idioma = "es"):
    """
    Recibe el título del documento y la ruta completa del archivo.
    Si validez != None escribe una frase con la validez del presupuesto.
    """
    if idioma not in ("en", "es"):
        raise NotImplementedError,\
                __file__ + ": Idioma '%s' no implementado." % idioma
    doc = SimpleDocTemplate(ruta_archivo, title = titulo)
    encabezado = build_encabezado(lineas_datos_empresa)
    try:
        nombrecliente = datos_cliente[0].replace(" ", "_")
    except:
        nombrecliente = ""
    datos_cliente = build_datos_cliente(datos_cliente)
    entradilla = build_entradilla(fecha_entradilla, numpresupuesto, 
                                  para_estudio, 
                                  lang = idioma)
    texto = build_texto(texto)
    contenido = build_tabla_contenido(lineas_contenido, lang = idioma)
    totales = build_tabla_totales(totales)
    despedida = build_texto(despedida)
    forma_pago = build_texto(forma_de_pago)
    comercial = build_texto(firma_comercial)
    story = [encabezado, 
             datos_cliente, 
             entradilla, 
             Spacer(1, 0.2 * cm), 
             contenido, 
             Spacer(1, 0.25 * cm), 
             totales, 
             Spacer(1, 1 * cm),
             forma_pago, 
             Spacer(1, 2 * cm), 
             texto, 
             Spacer(1, 0.2 * cm), 
             despedida, 
             Spacer(1, 0.5 * cm), 
             comercial]
    #if validez:
        #story.insert(9, build_validez(validez))
    if texto_riesgo:
        story.insert(-8, build_texto_riesgo(texto_riesgo))
    #if condicionado: # El condicionado es el texto en sí.
    #    story.insert(-2, Spacer(1, 2 * cm))
    #    story.insert(-2, build_condicionado(condicionado))
    story = utils.aplanar([i for i in story if i])
    _dibujar_logo = lambda c, d: dibujar_logo(c, d, ruta_logo, idioma)
    _dibujar_dir_fiscal = lambda c, d: dibujar_dir_fiscal(c, d, dir_fiscal)
    def dibujar_logo_y_dir_fiscal(c, d):
        _dibujar_logo(c, d)
        _dibujar_dir_fiscal(c, d)
    doc.build(story, onFirstPage = dibujar_logo_y_dir_fiscal, 
                     onLaterPages = _dibujar_dir_fiscal)
    # Agrego condiciones generales:
    if incluir_condicionado_general:
        from lib.PyPDF2 import PyPDF2
        pdf_presupuesto = open(ruta_archivo, "rb")
        if idioma == "en":
            fcond = "condiciones_generales_en.pdf"
        else:
            fcond = "condiciones_generales.pdf"
        pdf_condiciones = open(
            os.path.join(os.path.dirname(os.path.abspath(__file__)), 
                         fcond), 
            "rb")
        merger = PyPDF2.PdfFileMerger()
        merger.append(pdf_presupuesto)
        merger.append(pdf_condiciones)
        combinado = os.path.join(gettempdir(),
                    "oferta_%d_%s_%s.pdf" % (numpresupuesto, 
                        sanitize(nombrecliente, strict = True), 
                        give_me_the_name_baby()))
        merger.write(open(combinado, "wb"))
        ruta_archivo = combinado
    return ruta_archivo
Пример #6
0
def go(titulo, 
       ruta_archivo, 
       datos_cliente, 
       datos_albaran, 
       lineas_contenido, 
       totales, 
       datos_de_la_empresa, 
       titular, 
       recogida = True):
    """
    Recibe el título del documento y la ruta completa del archivo PDF, 
    los datos del cliente en un diccionario, los del albarán también como 
    diccionario, las líneas como lista de listas, los totales como lista 
    y otra lista con la ruta al logotipo como primer elemento y tantas líneas 
    como datos de la empresa se quieran mostrar junto al logo.
    Devuelve uno o dos nombres de ficheros en PDF con el albarán/carta de 
    porte y (opcionalmente) el documento de recogida de envases.
    «titular» es el nombre legal del responsable de la mercancía.
    """
    # CWT: ¡JODER! Lo juro, en el CVS hay una versión de este fichero que era 
    # una joyita y usaba ReportLab/Platypus en todo su esplendor para 
    # construir una más que decente carta de portes. 
    doc = SimpleDocTemplate(ruta_archivo, 
                            title = titulo, 
                            topMargin = 6.00*cm, 
                            bottomMargin = 13.2*cm) 
                            #leftMargin = 1*cm, 
                            #rigthMargin = 1*cm)
    #encabezado = build_encabezado(datos_albaran)
    contenido = build_tabla_contenido(lineas_contenido)
    totales = build_tabla_totales(totales)
    #texto = build_texto()
    story = [#Spacer(1, 1.60 * cm),   # Chispa más o menos los datos de cliente.
             #encabezado, 
             #Spacer(1, 0.15 * cm), 
             contenido, 
             Spacer(1, 0.15 * cm), 
             totales, 
             lastPageNumberFlowable(PAGE_WIDTH - 1.5*cm, 12.7*cm)] 
            #Spacer(1, 0.15 * cm), 
            # Línea doble.
            #KeepTogether([LineaHorizontal(0.9 * PAGE_WIDTH), 
            #              Spacer(1, 0.05 * cm), 
            #              LineaHorizontal(0.9 * PAGE_WIDTH)]), 
            #Spacer(1, 0.15 * cm), 
            #CondPageBreak(13*cm), 
            #logo_y_empresa, 
            #Spacer(1, 0.25 * cm), 
            #texto]
    story = utils.aplanar([i for i in story if i])
    _cabecera_y_cliente = lambda c, d: cabecera_y_cliente(c, 
                                                          d, 
                                                          datos_cliente, 
                                                          datos_de_la_empresa, 
                                                          titular, 
                                                          datos_albaran)
    doc.build(story, 
              onFirstPage = _cabecera_y_cliente, 
              onLaterPages = _cabecera_y_cliente)
    if recogida:
        ruta_archivo_envases = ruta_archivo[::-1].replace(".pdf"[::-1], 
                                                          "_env.pdf"[::-1], 
                                                          1)[::-1] 
        doc2 = SimpleDocTemplate(ruta_archivo_envases, 
                                 title = titulo + " (doc. recogida envases)") 
        mas_texto = build_mas_texto(titular)
        logo_y_empresa = build_marco_logo_y_empresa(datos_de_la_empresa)
        story = [#Última página: más texto genérico y cosas rellenables a mano.
                 #PageBreak(), 
                 logo_y_empresa, 
                 mas_texto, 
                 Spacer(1, 4 * cm), # firmas, 
                 KeepTogether([LineaHorizontal(0.9 * PAGE_WIDTH), 
                               Spacer(1, 0.05 * cm), 
                               LineaHorizontal(0.9 * PAGE_WIDTH)]), 
                 cuadritos_en_ruta(), 
                 Spacer(1, 2*cm), 
                 build_todavia_mas_texto(), 
                ]
        story = utils.aplanar([i for i in story if i])
        doc2.build(story) 
    else:
        ruta_archivo_envases = None
    return ruta_archivo, ruta_archivo_envases
Пример #7
0
def go(titulo,
       ruta_archivo,
       datos_cliente,
       datos_factura,
       lineas_contenido,
       totales,
       datos_de_la_empresa,
       observaciones = "",
       vencimientos = [],
       forma_de_pago = ""):
    """
    Recibe el título del documento y la ruta completa del archivo PDF,
    los datos del cliente en un diccionario, los del factura también como
    diccionario, las líneas como lista de listas, los totales como lista
    y otra lista con la ruta al logotipo como primer elemento y tantas líneas
    como datos de la empresa se quieran mostrar junto al logo.
    """
    doc = SimpleDocTemplate(ruta_archivo,
                            title = titulo,
                            topMargin = 4.30*cm,
                            #bottomMargin = 2*cm)
                            bottomMargin = 4*cm)
                            #leftMargin = 1*cm,
                            #rigthMargin = 1*cm)
    contenido = build_tabla_contenido(lineas_contenido)
    tabla_totales = build_tabla_totales(totales)
    vencimientos = build_tabla_vencimientos(observaciones,
                                            vencimientos,
                                            forma_de_pago)
    #texto = build_texto()
    story = [#Spacer(1, 1.60 * cm),   # Chispa más o menos los datos de cliente.
             #encabezado,
             Spacer(1, 3.50 * cm),
             contenido,
             Linea((1.05*cm, 24.5*cm - 3*cm),
                   (1.05*cm, 2.5*cm + 3*cm + 0.25*cm)),
             Linea((PAGE_WIDTH - 1.05*cm, 24.5*cm - 3*cm),
                   (PAGE_WIDTH - 1.05*cm, 2.5*cm + 3*cm + 0.25*cm)),
             Spacer(1, 0.15 * cm),
             tabla_totales,
             Spacer(1, 0.25 * cm),
             vencimientos,
             lastPageNumberFlowable(0.9*PAGE_WIDTH - 0.5*cm + 1, 1.0*cm)]
                #Spacer(1, 0.15 * cm),
                # Línea doble.
                #KeepTogether([LineaHorizontal(0.9 * PAGE_WIDTH),
                #              Spacer(1, 0.05 * cm),
                #              LineaHorizontal(0.9 * PAGE_WIDTH)]),
                #Spacer(1, 0.15 * cm),
                #CondPageBreak(13*cm),
                #logo_y_empresa,
                #Spacer(1, 0.25 * cm),
                #texto]
    story = utils.aplanar([i for i in story if i])
    _cabecera_y_cliente = lambda c, d: cabecera_y_cliente(c,
                                                          d,
                                                          datos_cliente,
                                                          datos_de_la_empresa,
                                                          datos_factura)
    _solo_cabecera = lambda c, d: solo_cabecera(c,
                                                d,
                                                datos_de_la_empresa,
                                                datos_factura)
    doc.build(story,
              onFirstPage = _cabecera_y_cliente,
              onLaterPages = _solo_cabecera)
    return ruta_archivo