Beispiel #1
0
def generar_pdf():
    CONFIG_FILE = "/home/web2py/pyafipws/sp/rece1.ini"

    config = SafeConfigParser()
    config.read(CONFIG_FILE)
    conf_fact = dict(config.items('FACTURA'))
    conf_pdf = dict(config.items('PDF'))

    from pyafipws.pyfepdf import FEPDF
    fepdf = FEPDF()

    # cargo el formato CSV por defecto (factura.csv)
    fepdf.CargarFormato(conf_fact.get("formato", "factura.csv"))

    # establezco formatos (cantidad de decimales) según configuración:
    fepdf.FmtCantidad = conf_fact.get("fmt_cantidad", "0.2")
    fepdf.FmtPrecio = conf_fact.get("fmt_precio", "0.2")


    # creo una factura de ejemplo
    H**O = True


    # obtengo el registro general del comprobante (encabezado y totales)
    id_comprobante = int(request.args[0])
    reg = db(db.comprobante_afip.id==id_comprobante).select().first()

    tipo_cbte = reg.tipo_cbte
    punto_vta = reg.punto_vta
    cbte_nro = reg.cbte_nro
    fecha = reg.fecha_cbte #.strftime("%Y%m%d")  # formato AAAAMMDD
    concepto = reg.concepto
    tipo_doc = reg.tipo_doc # 80: CUIT, 96: DNI
    nro_doc = reg.nro_doc.replace("-", "") # del cliente, sin rayita
    cbt_desde = cbte_nro; cbt_hasta = cbte_nro
    imp_total = reg.imp_total
    imp_tot_conc = reg.imp_tot_conc
    imp_neto = reg.imp_neto
    imp_iva = reg.impto_liq
    imp_trib = "0.00"
    imp_op_ex = reg.imp_op_ex
    fecha_cbte = fecha
    # Fechas del per�odo del servicio facturado y vencimiento de pago:
    if concepto > 1:
        fecha_venc_pago = reg.fecha_venc_pago
        fecha_serv_desde = reg.fecha_serv_desde
        fecha_serv_hasta = reg.fecha_serv_desde
    else:
        fecha_venc_pago = fecha_serv_desde = fecha_serv_hasta = None
    moneda_id = reg.moneda_id
    moneda_ctz = reg.moneda_ctz

    # datos generales del encabezado:
    incoterms = 'FOB'                   # solo exportación
    idioma_cbte = 1                     # 1: es, 2: en, 3: pt

    # datos adicionales del encabezado:
    nombre_cliente = reg.nombre_cliente
    domicilio_cliente = reg.domicilio_cliente
    pais_dst_cmp = 212                  # 200: Argentina, ver tabla
    id_impositivo = reg.id_impositivo      # cat. iva (mercado interno)
    forma_pago = reg.forma_pago

    obs_generales = reg.obs
    obs_comerciales = reg.obs_comerciales

    # datos devueltos por el webservice (WSFEv1, WSMTXCA, etc.):
    motivo_obs = "Factura individual, DocTipo: 80, DocNro 30000000007 no se encuentra registrado en los padrones de AFIP."
    cae = reg.cae
    fch_venc_cae = reg.fecha_vto

    fepdf.CrearFactura(concepto, tipo_doc, nro_doc, tipo_cbte, punto_vta,
        cbte_nro, imp_total, imp_tot_conc, imp_neto,
        imp_iva, imp_trib, imp_op_ex, fecha_cbte, fecha_venc_pago, 
        fecha_serv_desde, fecha_serv_hasta, 
        moneda_id, moneda_ctz, cae, fch_venc_cae, id_impositivo,
        nombre_cliente, domicilio_cliente, pais_dst_cmp, 
        obs_comerciales, obs_generales, forma_pago, incoterms, 
        idioma_cbte, motivo_obs)

    # completo campos extra del encabezado:
    ok = fepdf.EstablecerParametro("localidad_cliente", "Hurlingham")
    ok = fepdf.EstablecerParametro("provincia_cliente", "Buenos Aires")

    # imprimir leyenda "Comprobante Autorizado" (constatar con WSCDC!)
    ok = fepdf.EstablecerParametro("resultado", "A")

    # tributos adicionales:
    tributo_id = 99
    desc = 'Impuesto Municipal Matanza'
    base_imp = "100.00"
    alic = "1.00"
    importe = "1.00"
    fepdf.AgregarTributo(tributo_id, desc, base_imp, alic, importe)

    tributo_id = 4
    desc = 'Impuestos Internos'
    base_imp = None
    alic = None
    importe = "0.00"
    fepdf.AgregarTributo(tributo_id, desc, base_imp, alic, importe)

    # subtotales por alícuota de IVA:
    iva_id = 5 # 21%
    base_imp = 100
    importe = 21
    fepdf.AgregarIva(iva_id, base_imp, importe)

    # detalle de artículos:
    registros = db(db.detalle_afip.comprobante_id==id_comprobante).select()
    for registro in registros:
        u_mtx = 123456
        cod_mtx = 1234567890123
        codigo = registro.codigo
        ds = registro.ds
        qty = registro.qty
        umed = 7
        precio = registro.precio
        imp_iva = registro.imp_iva
        bonif = 0.00
        iva_id = registro.iva_id
        importe = registro.imp_total
        despacho = u''
        dato_a = ""
        fepdf.AgregarDetalleItem(u_mtx, cod_mtx, codigo, ds, qty, umed, 
                precio, bonif, iva_id, imp_iva, importe, despacho, dato_a)

    # descuento general (a tasa 21%):
    u_mtx = cod_mtx = codigo = None
    ds = u"Bonificación/Descuento 10%"
    qty = precio = bonif = None
    umed = 99
    iva_id = 5
    if tipo_cbte in (1, 2, 3, 4, 5, 34, 39, 51, 52, 53, 54, 60, 64):
        # discriminar IVA si es clase A / M
        imp_iva = -2.21
    else:
        imp_iva = None
    importe = -12.10
    fepdf.AgregarDetalleItem(u_mtx, cod_mtx, codigo, ds, qty, umed, 
            precio, bonif, iva_id, imp_iva, importe, "")

    # descripción (sin importes ni cantidad):
    u_mtx = cod_mtx = codigo = None
    qty = precio = bonif = iva_id = imp_iva = importe = None
    umed = 0
    ds = u"Descripción Ejemplo"
    fepdf.AgregarDetalleItem(u_mtx, cod_mtx, codigo, ds, qty, umed, 
            precio, bonif, iva_id, imp_iva, importe, "")

    # completo campos personalizados de la plantilla:
    fepdf.AgregarDato("custom-nro-cli", "Cod.123")
    fepdf.AgregarDato("custom-pedido", "1234")
    fepdf.AgregarDato("custom-remito", "12345")
    fepdf.AgregarDato("custom-transporte", "Camiones Ej.")

    # datos fijos:
    for k, v in conf_pdf.items():
        fepdf.AgregarDato(k, v)
        if k.upper() == 'CUIT':
            fepdf.CUIT = v  # CUIT del emisor para código de barras

    fepdf.CrearPlantilla(papel=conf_fact.get("papel", "legal"), 
                         orientacion=conf_fact.get("orientacion", "portrait"))
    fepdf.ProcesarPlantilla(num_copias=int(conf_fact.get("copias", 1)),
                            lineas_max=int(conf_fact.get("lineas_max", 24)),
                            qty_pos=conf_fact.get("cant_pos") or 'izq')

    salida = "/tmp/factura.pdf"
    fepdf.GenerarPDF(archivo=salida)
    fepdf.MostrarPDF(archivo=salida,imprimir=False)

    response.headers['Content-Type'] = "application/pdf"
    return open(salida, "rb")
Beispiel #2
0
def pdf():
    id = request.args[0]

    from pyafipws.pyfepdf import FEPDF
    fepdf = FEPDF()
    fepdf.CUIT = 20267565393

    # cargo el formato CSV por defecto (factura.csv)
    t = os.path.join(request.env.web2py_path, 'applications',
                     request.application, 'modules', 'pyafipws', 'factura.csv')
    fepdf.CargarFormato(t)

    f = db(db.pagos.id == id).select().first()

    if not f.cae:
        raise HTTP(500, "Debe soliticar CAE a AFIP antes de generar el PDF!")

    # creo una factura de ejemplo
    tipo_cbte = int(f.tipo_cbte)
    punto_vta = int(f.pto_vta)
    fecha = f.fecha.strftime("%Y%m%d")
    concepto = 3
    tipo_doc = int(f.tipo_doc)
    nro_doc = int(f.nro_doc)
    cbte_nro = int(f.cbte_nro)
    imp_total = f.imp_total
    imp_tot_conc = "0.00"
    imp_neto = "0.00"
    imp_iva = "0.00"
    imp_trib = "0.00"
    imp_op_ex = "0.00"
    imp_subtotal = "0.00"
    fecha_cbte = fecha
    fecha_venc_pago = fecha
    # Fechas del período del servicio facturado (solo si concepto = 1?)
    fecha_serv_desde = fecha
    fecha_serv_hasta = fecha
    moneda_id = 'PES'
    moneda_ctz = '1.000'
    obs_generales = u"EMAIL: %s" % f.email
    obs_comerciales = u"En tu resumen verás el cargo como WWW.MERCADOPAGO.COM"

    nombre_cliente = "%s, %s" % (f.last_name, f.first_name)
    domicilio_cliente = ""
    pais_dst_cmp = 16
    id_impositivo = ""
    moneda_id = 'PES'
    moneda_ctz = 1
    forma_pago = f.forma_pago
    incoterms = 'FOB'
    idioma_cbte = 1
    motivo = f.motivo

    cae = f.cae
    fch_venc_cae = f.fecha_vto

    fepdf.CrearFactura(concepto, tipo_doc, nro_doc, tipo_cbte, punto_vta,
                       cbte_nro, imp_total, imp_tot_conc, imp_neto, imp_iva,
                       imp_trib, imp_op_ex, fecha_cbte, fecha_venc_pago,
                       fecha_serv_desde, fecha_serv_hasta, moneda_id,
                       moneda_ctz, cae, fch_venc_cae, id_impositivo,
                       nombre_cliente, domicilio_cliente, pais_dst_cmp,
                       obs_comerciales, obs_generales, forma_pago, incoterms,
                       idioma_cbte, motivo)

    #tipo = 91
    #pto_vta = 2
    #nro = 1234
    #fepdf.AgregarCmpAsoc(tipo, pto_vta, nro)

    #tributo_id = 99
    #desc = 'Impuesto Municipal Matanza'
    #base_imp = "100.00"
    #alic = "1.00"
    #importe = "1.00"
    #fepdf.AgregarTributo(tributo_id, desc, base_imp, alic, importe)

    #iva_id = 5 # 21%
    #base_imp = 100
    #importe = 21
    #fepdf.AgregarIva(iva_id, base_imp, importe)

    u_mtx = 123456
    cod_mtx = 1234567890123
    codigo = "P0001"
    ds = f.ds
    qty = 1.00
    umed = 7
    precio = f.imp_total
    bonif = 0.00
    iva_id = 1
    imp_iva = 0
    importe = f.imp_total
    despacho = ""
    fepdf.AgregarDetalleItem(u_mtx, cod_mtx, codigo, ds, qty, umed, precio,
                             bonif, iva_id, imp_iva, importe, despacho)

    #fepdf.AgregarDato("pedido", "1234")

    fepdf.CrearPlantilla(papel="A4", orientacion="portrait")
    fepdf.ProcesarPlantilla(num_copias=3, lineas_max=24, qty_pos='izq')
    salida = t = os.path.join(request.env.web2py_path, 'applications',
                              request.application, 'private',
                              'factura%s.pdf' % id)
    fepdf.GenerarPDF(archivo=salida)

    response.headers['Content-Type'] = 'application/pdf'
    return open(salida).read()
    def create(self, cr, uid, ids, datas, context):
        import pooler
        pool = pooler.get_pool(cr.dbname)
        model_obj = pool.get("account.invoice")
        try:
            # import and instantiate the helper:
            from pyafipws.pyfepdf import FEPDF
            fepdf = FEPDF()

            # load CSV default format (factura.csv)
            fepdf.CargarFormato(
                os.path.join(os.path.dirname(__file__), "pyafipws",
                             "factura.csv"))
            # set the logo image
            fepdf.AgregarDato(
                "logo",
                os.path.join(os.path.dirname(__file__), "pyafipws",
                             "logo.png"))
            # set amount format (decimal places):
            fepdf.FmtCantidad = "0.2"
            fepdf.FmtPrecio = "0.2"

            # TODO: complete all fields and additional data
            for invoice in model_obj.browse(cr, uid, ids)[:1]:

                # get the electronic invoice type, point of sale and service:
                journal = invoice.journal_id
                company = journal.company_id
                tipo_cbte = journal.pyafipws_invoice_type
                punto_vta = journal.pyafipws_point_of_sale

                # set basic AFIP data:
                fepdf.CUIT = company.pyafipws_cuit

                # get the last 8 digit of the invoice number
                cbte_nro = int(invoice.number[-8:])
                cbt_desde = cbt_hasta = cbte_nro
                fecha_cbte = invoice.date_invoice
                concepto = tipo_expo = int(invoice.pyafipws_concept or 0)
                if int(concepto) != 1:
                    fecha_venc_pago = invoice.date_invoice
                    if invoice.pyafipws_billing_start_date:
                        fecha_serv_desde = invoice.pyafipws_billing_start_date
                    else:
                        fecha_serv_desde = None
                    if invoice.pyafipws_billing_end_date:
                        fecha_serv_hasta = invoice.pyafipws_billing_end_date
                    else:
                        fecha_serv_hasta = None
                else:
                    fecha_venc_pago = fecha_serv_desde = fecha_serv_hasta = None

                # customer tax number:
                if invoice.partner_id.vat:
                    nro_doc = invoice.partner_id.vat.replace("-", "")
                else:
                    nro_doc = "0"  # only "consumidor final"
                tipo_doc = 99
                if nro_doc.startswith("AR"):
                    nro_doc = nro_doc[2:]
                    if int(nro_doc) == 0:
                        tipo_doc = 99  # consumidor final
                    elif len(nro_doc) < 11:
                        tipo_doc = 96  # DNI
                    else:
                        tipo_doc = 80  # CUIT

                # invoice amount totals:
                imp_total = str("%.2f" % abs(invoice.amount_total))
                imp_tot_conc = "0.00"
                imp_neto = str("%.2f" % abs(invoice.amount_untaxed))
                imp_iva = str("%.2f" % abs(invoice.amount_tax))
                imp_subtotal = imp_neto  # TODO: not allways the case!
                imp_trib = "0.00"
                imp_op_ex = "0.00"
                if invoice.currency_id.name == 'ARS':
                    moneda_id = "PES"
                    moneda_ctz = 1
                else:
                    moneda_id = {'USD': 'DOL'}[invoice.currency_id.name]
                    moneda_ctz = str(invoice.currency_id.rate)

                # foreign trade data: export permit, country code, etc.:
                if False:  ##invoice.pyafipws_incoterms:
                    incoterms = invoice.pyafipws_incoterms.code
                    incoterms_ds = invoice.pyafipws_incoterms.name
                else:
                    incoterms = incoterms_ds = None
                if int(tipo_cbte) == 19 and tipo_expo == 1:
                    permiso_existente = "N" or "S"  # not used now
                else:
                    permiso_existente = ""
                obs_generales = invoice.comment
                if invoice.payment_term:
                    forma_pago = invoice.payment_term.name
                    obs_comerciales = invoice.payment_term.name
                else:
                    forma_pago = obs_comerciales = None
                idioma_cbte = 1  # invoice language: spanish / español

                # customer data (foreign trade):
                nombre_cliente = invoice.partner_id.name
                if invoice.partner_id.vat:
                    if invoice.partner_id.vat.startswith("AR"):
                        # use the Argentina AFIP's global CUIT for the country:
                        cuit_pais_cliente = invoice.partner_id.vat[2:]
                        id_impositivo = None
                    else:
                        # use the VAT number directly
                        id_impositivo = invoice.partner_id.vat[2:]
                        # TODO: the prefix could be used to map the customer country
                        cuit_pais_cliente = None
                else:
                    cuit_pais_cliente = id_impositivo = None
                # address_invoice_id -> partner_id
                if invoice.partner_id:
                    domicilio_cliente = " - ".join([
                        invoice.partner_id.name or '',
                        invoice.partner_id.street or '',
                        invoice.partner_id.street2 or '',
                    ])
                    localidad_cliente = " - ".join([
                        invoice.partner_id.city or '',
                        invoice.partner_id.zip or '',
                    ])
                    provincia_cliente = invoice.partner_id.state_id
                else:
                    domicilio_cliente = ""
                    localidad_cliente = ""
                    provincia_cliente = ""
                if invoice.partner_id.country_id:
                    # map ISO country code to AFIP destination country code:
                    iso_code = invoice.partner_id.country_id.code.lower()
                    pais_dst_cmp = AFIP_COUNTRY_CODE_MAP[iso_code]

                # set AFIP returned values
                cae = invoice.pyafipws_cae or ""
                fch_venc_cae = (invoice.pyafipws_cae_due_date
                                or "").replace("-", "")
                motivo = invoice.pyafipws_message or ""

                # create the invoice internally in the helper
                fepdf.CrearFactura(
                    concepto, tipo_doc, nro_doc, tipo_cbte, punto_vta,
                    cbte_nro, imp_total, imp_tot_conc, imp_neto, imp_iva,
                    imp_trib, imp_op_ex, fecha_cbte, fecha_venc_pago,
                    fecha_serv_desde, fecha_serv_hasta, moneda_id, moneda_ctz,
                    cae, fch_venc_cae, id_impositivo, nombre_cliente,
                    domicilio_cliente, pais_dst_cmp, obs_comerciales,
                    obs_generales, forma_pago, incoterms, idioma_cbte, motivo)

                # set custom extra data:
                fepdf.AgregarDato("localidad_cliente", localidad_cliente)
                fepdf.AgregarDato("provincia_cliente", provincia_cliente)

                # analyze VAT (IVA) and other taxes (tributo):
                for tax_line in invoice.tax_line:
                    if "IVA" in tax_line.name:
                        if '0%' in tax_line.name:
                            iva_id = 3
                        elif '10,5%' in tax_line.name:
                            iva_id = 4
                        elif '21%' in tax_line.name:
                            iva_id = 5
                        elif '27%' in tax_line.name:
                            iva_id = 6
                        else:
                            ivva_id = 0
                        base_imp = ("%.2f" % abs(tax_line.base))
                        importe = ("%.2f" % abs(tax_line.amount))
                        # add the vat detail in the helper
                        fepdf.AgregarIva(iva_id, base_imp, importe)
                    else:
                        if 'impuesto' in tax_line.name.lower():
                            tributo_id = 1  # nacional
                        elif 'iibbb' in tax_line.name.lower():
                            tributo_id = 3  # provincial
                        elif 'tasa' in tax_line.name.lower():
                            tributo_id = 4  # municipal
                        else:
                            tributo_id = 99
                        desc = tax_line.name
                        base_imp = ("%.2f" % abs(tax_line.base))
                        importe = ("%.2f" % abs(tax_line.amount))
                        alic = "%.2f" % tax_line.base
                        # add the other tax detail in the helper
                        fepdf.AgregarTributo(id, desc, base_imp, alic, importe)

                # analize line items - invoice detail
                for line in invoice.invoice_line:
                    codigo = line.product_id.code
                    u_mtx = 1  # TODO: get it from uom?
                    cod_mtx = line.product_id.ean13
                    ds = line.name
                    qty = line.quantity
                    umed = 7  # TODO: line.uos_id...?
                    precio = line.price_unit
                    importe = line.price_subtotal
                    bonif = line.discount or None
                    iva_id = 5  # TODO: line.tax_code_id?
                    imp_iva = importe * line.invoice_line_tax_id[0].amount
                    fepdf.AgregarDetalleItem(u_mtx,
                                             cod_mtx,
                                             codigo,
                                             ds,
                                             qty,
                                             umed,
                                             precio,
                                             bonif,
                                             iva_id,
                                             imp_iva,
                                             importe,
                                             despacho="")

            fepdf.CrearPlantilla(papel="A4", orientacion="portrait")
            fepdf.ProcesarPlantilla(num_copias=1, lineas_max=24, qty_pos='izq')
            report_type = datas.get('report_type', 'pdf')
            pdf = fepdf.GenerarPDF()
            return (pdf, report_type)
        except:
            # catch the exception and send a better message for the user:
            from pyafipws import utils
            ex = utils.exception_info()
            raise osv.except_osv(ex['msg'], ex['tb'])
Beispiel #4
0
def generar_pdf(): 
    CONFIG_FILE = "/home/rodrigo/pyafipws/rece.ini"

    config = SafeConfigParser()
    config.read(CONFIG_FILE)
    conf_fact = dict(config.items('FACTURA'))
    conf_pdf = dict(config.items('PDF'))

    fepdf = FEPDF()

    # cargo el formato CSV por defecto (factura.csv)
    fepdf.CargarFormato(conf_fact.get("formato", "factura.csv"))

    # establezco formatos (cantidad de decimales) según configuración:
    fepdf.FmtCantidad = conf_fact.get("fmt_cantidad", "0.2")
    fepdf.FmtPrecio = conf_fact.get("fmt_precio", "0.2")


    # creo una factura de ejemplo
    H**O = True

    # datos generales del encabezado:
    tipo_cbte = 1
    punto_vta = 4000
    fecha = datetime.datetime.now().strftime("%Y%m%d")
    concepto = 3
    tipo_doc = 80; nro_doc = "30000000007"
    cbte_nro = 12345678
    imp_total = "127.00"
    imp_tot_conc = "3.00"
    imp_neto = "100.00"
    imp_iva = "21.00"
    imp_trib = "1.00"
    imp_op_ex = "2.00"
    imp_subtotal = "105.00"
    fecha_cbte = fecha
    fecha_venc_pago = fecha
    # Fechas del período del servicio facturado (solo si concepto> 1)
    fecha_serv_desde = fecha
    fecha_serv_hasta = fecha
    # campos p/exportación (ej): DOL para USD, indicando cotización:
    moneda_id = 'PES'
    moneda_ctz = 1
    incoterms = 'FOB'                   # solo exportación
    idioma_cbte = 1                     # 1: es, 2: en, 3: pt

    # datos adicionales del encabezado:
    nombre_cliente = 'Juan Perez'
    domicilio_cliente = 'Rua 76 km 34.5 Alagoas'
    pais_dst_cmp = 212                  # 200: Argentina, ver tabla
    id_impositivo = 'PJ54482221-l'      # cat. iva (mercado interno)
    forma_pago = '30 dias'

    obs_generales = "Observaciones Generales<br/>linea2<br/>linea3"
    obs_comerciales = "Observaciones Comerciales<br/>texto libre"

    # datos devueltos por el webservice (WSFEv1, WSMTXCA, etc.):
    motivo_obs = "Factura individual, DocTipo: 80, DocNro 30000000007 no se encuentra registrado en los padrones de AFIP."
    cae = session.cae
    fch_venc_cae = "20110320"

    fepdf.CrearFactura(concepto, tipo_doc, nro_doc, tipo_cbte, punto_vta,
        cbte_nro, imp_total, imp_tot_conc, imp_neto,
        imp_iva, imp_trib, imp_op_ex, fecha_cbte, fecha_venc_pago, 
        fecha_serv_desde, fecha_serv_hasta, 
        moneda_id, moneda_ctz, cae, fch_venc_cae, id_impositivo,
        nombre_cliente, domicilio_cliente, pais_dst_cmp, 
        obs_comerciales, obs_generales, forma_pago, incoterms, 
        idioma_cbte, motivo_obs)

    # completo campos extra del encabezado:
    ok = fepdf.EstablecerParametro("localidad_cliente", "Hurlingham")
    ok = fepdf.EstablecerParametro("provincia_cliente", "Buenos Aires")

    # imprimir leyenda "Comprobante Autorizado" (constatar con WSCDC!)
    ok = fepdf.EstablecerParametro("resultado", "A")

    # tributos adicionales:
    tributo_id = 99
    desc = 'Impuesto Municipal Matanza'
    base_imp = "100.00"
    alic = "1.00"
    importe = "1.00"
    fepdf.AgregarTributo(tributo_id, desc, base_imp, alic, importe)

    tributo_id = 4
    desc = 'Impuestos Internos'
    base_imp = None
    alic = None
    importe = "0.00"
    fepdf.AgregarTributo(tributo_id, desc, base_imp, alic, importe)

    # subtotales por alícuota de IVA:
    iva_id = 5 # 21%
    base_imp = 100
    importe = 21
    fepdf.AgregarIva(iva_id, base_imp, importe)

    # detalle de artículos:
    u_mtx = 123456
    cod_mtx = 1234567890123
    codigo = "P0001"
    ds = "Descripcion del producto P0001\n"
    qty = 1.00
    umed = 7
    if tipo_cbte in (1, 2, 3, 4, 5, 34, 39, 51, 52, 53, 54, 60, 64):
        # discriminar IVA si es clase A / M
        precio = 110.00
        imp_iva = 23.10
    else:
        # no discriminar IVA si es clase B (importe final iva incluido)
        precio = 133.10
        imp_iva = None
    bonif = 0.00
    iva_id = 5
    importe = 133.10
    despacho = u'Nº 123456'
    dato_a = "Dato A"
    fepdf.AgregarDetalleItem(u_mtx, cod_mtx, codigo, ds, qty, umed, 
            precio, bonif, iva_id, imp_iva, importe, despacho, dato_a)

    # descuento general (a tasa 21%):
    u_mtx = cod_mtx = codigo = None
    ds = u"Bonificación/Descuento 10%"
    qty = precio = bonif = None
    umed = 99
    iva_id = 5
    if tipo_cbte in (1, 2, 3, 4, 5, 34, 39, 51, 52, 53, 54, 60, 64):
        # discriminar IVA si es clase A / M
        imp_iva = -2.21
    else:
        imp_iva = None
    importe = -12.10
    fepdf.AgregarDetalleItem(u_mtx, cod_mtx, codigo, ds, qty, umed, 
            precio, bonif, iva_id, imp_iva, importe, "")

    # descripción (sin importes ni cantidad):
    u_mtx = cod_mtx = codigo = None
    qty = precio = bonif = iva_id = imp_iva = importe = None
    umed = 0
    ds = u"Descripción Ejemplo"
    fepdf.AgregarDetalleItem(u_mtx, cod_mtx, codigo, ds, qty, umed, 
            precio, bonif, iva_id, imp_iva, importe, "")

    # completo campos personalizados de la plantilla:
    fepdf.AgregarDato("custom-nro-cli", "Cod.123")
    fepdf.AgregarDato("custom-pedido", "1234")
    fepdf.AgregarDato("custom-remito", "12345")
    fepdf.AgregarDato("custom-transporte", "Camiones Ej.")
    print "Prueba!"
    
    # datos fijos:
    for k, v in conf_pdf.items():
        fepdf.AgregarDato(k, v)
        if k.upper() == 'CUIT':
            fepdf.CUIT = v  # CUIT del emisor para código de barras

    fepdf.CrearPlantilla(papel=conf_fact.get("papel", "legal"), 
                         orientacion=conf_fact.get("orientacion", "portrait"))
    fepdf.ProcesarPlantilla(num_copias=int(conf_fact.get("copias", 1)),
                            lineas_max=int(conf_fact.get("lineas_max", 24)),
                            qty_pos=conf_fact.get("cant_pos") or 'izq')

    salida = "/tmp/factura.pdf"
    fepdf.GenerarPDF(archivo=salida)
    ##fepdf.MostrarPDF(archivo=salida,imprimir=False)

    response.headers['Content-Type'] = "application/pdf"
    return open(salida, "rb")
Beispiel #5
0
    def ImprimeFactura(self, idcabecera=None, mostrar=True, *args, **kwargs):
        if not idcabecera:
            return
        cabfact = Cabfact().get_by_id(idcabecera)
        print("imprimir factura {}".format(cabfact.numero))
        pyfpdf = FEPDF()
        #cuit del emisor
        pyfpdf.CUIT = LeerIni(clave='cuit', key='WSFEv1')
        #establezco formatos (cantidad de decimales):
        pyfpdf.FmtCantidad = "0.4"
        pyfpdf.FmtPrecio = "0.2"
        #Datos del encabezado de la factura:
        tipo_cbte = cabfact.tipocomp.codigo
        punto_vta = cabfact.numero[:4]
        cbte_nro = cabfact.numero[-8:]
        fecha = FechaMysql(cabfact.fecha)
        concepto = cabfact.concepto
        #datos del cliente:
        tipo_doc = "80" if cabfact.cliente.tiporesp_id != 3 else "96"
        nro_doc = cabfact.cliente.cuit if cabfact.cliente.tiporesp_id != 3 else str(
            cabfact.cliente.dni)
        nombre_cliente = cabfact.nombre if cabfact.nombre != '' else cabfact.cliente.nombre
        domicilio_cliente = cabfact.domicilio

        #totales del comprobante:
        imp_total = cabfact.total
        imp_tot_conc = "0.00"
        imp_neto = cabfact.neto
        imp_iva = cabfact.iva
        imp_trib = cabfact.percepciondgr
        imp_op_ex = "0.00"
        imp_subtotal = cabfact.neto
        fecha_cbte = fecha
        fecha_venc_pago = fecha
        #Fechas del período del servicio facturado
        if int(cabfact.concepto) in [
                FEv1().SERVICIOS, FEv1().PRODUCTOYSERVICIOS
        ]:
            fecha_serv_desde = FechaMysql(cabfact.desde)
            fecha_serv_hasta = FechaMysql(cabfact.hasta)
        else:
            fecha_serv_hasta = None
            fecha_serv_desde = None

        moneda_id = "PES"
        moneda_ctz = "1.000"
        obs_generales = ""
        obs_comerciales = ""
        moneda_id = ""
        moneda_ctz = 1
        cae = cabfact.cae
        fecha_vto_cae = FechaMysql(cabfact.venccae)

        #Creo la factura(internamente en la interfaz)
        ok = pyfpdf.CrearFactura(concepto, tipo_doc, nro_doc, tipo_cbte,
                                 punto_vta, cbte_nro, imp_total, imp_tot_conc,
                                 imp_neto, imp_iva, imp_trib, imp_op_ex,
                                 fecha_cbte, fecha_venc_pago, fecha_serv_desde,
                                 fecha_serv_hasta, moneda_id, moneda_ctz, cae,
                                 fecha_vto_cae, "", nombre_cliente,
                                 domicilio_cliente, 0)
        pyfpdf.EstablecerParametro("forma_pago", cabfact.formapago.detalle)
        pyfpdf.EstablecerParametro(
            "custom-nro-cli",
            "[{}]".format(str(cabfact.cliente.idcliente).zfill(5)))
        pyfpdf.EstablecerParametro("localidad_cli",
                                   cabfact.cliente.localidad.nombre)
        pyfpdf.EstablecerParametro("provincia_cli",
                                   cabfact.cliente.localidad.provincia)
        pyfpdf.EstablecerParametro("iva_cli", cabfact.cliente.tiporesp.nombre)

        #Agregar comprobantes asociados(si es una NC / ND):
        if cabfact.tipocomp.codigo in [3, 8, 13]:
            cpbterel = CpbteRel().select().where(
                CpbteRel.idcabfact == cabfact.idcabfact)
            for cp in cpbterel:
                tipo = cp.idtipocpbte.codigo
                pto_vta = cp.numero[:4]
                nro = cp.numero[-8:]
                pyfpdf.AgregarCmpAsoc(tipo, pto_vta, nro)
        # if str(self.view.cboComprobante.text()).find('credito'):
        #     tipo = 19
        #     pto_vta = 2
        #     nro = 1234
        #     pyfepdf.AgregarCmpAsoc(tipo, pto_vta, nro)

        #Agrego subtotales de IVA(uno por alicuota)
        if cabfact.netoa != 0:
            iva_id = 5  #c�digo para al�cuota del 21 %
            base_imp = cabfact.netoa  #importe neto sujeto a esta al�cuota
            importe = cabfact.netoa * 21 / 100  #importe liquidado de iva
            ok = pyfpdf.AgregarIva(iva_id, base_imp, importe)

        if cabfact.netob != 0:
            iva_id = 4  # c�digo para al�cuota del 10.5 %
            base_imp = cabfact.netob  # importe neto sujeto a esta al�cuota
            importe = cabfact.netob * 10.5 / 100  # importe liquidado de iva
            ok = pyfpdf.AgregarIva(iva_id, base_imp, importe)

        if cabfact.netoa == 0 and cabfact.netob == 0:
            iva_id = 3  # c�digo para al�cuota del 21 %
            base_imp = cabfact.netob  # importe neto sujeto a esta al�cuota
            importe = 0  # importe liquidado de iva
            ok = pyfpdf.AgregarIva(iva_id, base_imp, importe)

        if cabfact.percepciondgr != 0:
            #Agregar cada impuesto(por ej.IIBB, retenciones, percepciones, etc.):
            tributo_id = 99  #codigo para 99 - otros tributos
            Desc = cabfact.cliente.percepcion.detalle
            base_imp = cabfact.neto  #importe sujeto a estetributo
            alic = cabfact.cliente.percepcion.porcentaje  #alicuota(porcentaje) de estetributo
            importe = cabfact.percepciondgr  #importe liquidado de este tributo
            ok = pyfpdf.AgregarTributo(tributo_id, Desc, base_imp, alic,
                                       importe)

        det = Detfact().select().where(Detfact.idcabfact == cabfact.idcabfact)
        for d in det:
            #Agrego detalles de cada item de la factura:
            u_mtx = 0  #unidades
            cod_mtx = ""  #c�digo de barras
            codigo = d.idarticulo.idarticulo  #codigo interno a imprimir(ej. "articulo")
            ds = d.descad.strip()
            qty = d.cantidad  #cantidad
            umed = 7  #c�digo de unidad de medida(ej. 7 para"unidades")
            precio = d.precio  #precio neto(A) o iva incluido(B)
            bonif = 0  #importe de descuentos
            iva_id = FEv1().TASA_IVA[str(float(
                d.tipoiva.iva))]  #c�digopara al�cuota del 21 %
            imp_iva = d.montoiva  #importe liquidado deiva
            importe = d.precio * d.cantidad  #importe total del item
            despacho = ""  #numero de despacho de importaci�n
            dato_a = ""  #primer dato adicional del item
            dato_b = ""
            dato_c = ""
            dato_d = ""
            dato_e = ""  #ultimo dato adicionaldel item
            ok = pyfpdf.AgregarDetalleItem(u_mtx, cod_mtx, codigo, ds, qty,
                                           umed, precio, bonif, iva_id,
                                           imp_iva, importe, despacho, dato_a,
                                           dato_b, dato_c, dato_d, dato_e)

        #Agrego datos adicionales fijos:
        ok = pyfpdf.AgregarDato("logo",
                                ubicacion_sistema() + "plantillas/logo.png")
        fondo = ParamSist.ObtenerParametro("FONDO_FACTURA")
        if fondo:
            x1 = ParamSist.ObtenerParametro("FONDO_FACTURA_X1") or 50
            y1 = ParamSist.ObtenerParametro("FONDO_FACTURA_Y1") or 117.1
            x2 = ParamSist.ObtenerParametro("FONDO_FACTURA_X2") or 150
            y2 = ParamSist.ObtenerParametro("FONDO_FACTURA_Y2") or 232.9
            pyfpdf.AgregarCampo("fondo_factura",
                                'I',
                                x1,
                                y1,
                                x2,
                                y2,
                                foreground=0x808080,
                                priority=-1,
                                text=imagen(fondo))
        ok = pyfpdf.AgregarDato(
            "EMPRESA", "Razon social: {}".format(
                DeCodifica(LeerIni(clave='empresa', key='FACTURA'))))
        ok = pyfpdf.AgregarDato(
            "MEMBRETE1", "Domicilio Comercial: {}".format(
                DeCodifica(LeerIni(clave='membrete1', key='FACTURA'))))
        ok = pyfpdf.AgregarDato(
            "MEMBRETE2", DeCodifica(LeerIni(clave='membrete2', key='FACTURA')))
        ok = pyfpdf.AgregarDato(
            "CUIT", 'CUIT: {}'.format(LeerIni(clave='cuit', key='WSFEv1')))
        ok = pyfpdf.AgregarDato("IIBB", LeerIni(clave='iibb', key='FACTURA'))
        ok = pyfpdf.AgregarDato(
            "IVA", "Condicion frente al IVA: {}".format(
                LeerIni(clave='iva', key='FACTURA')))
        ok = pyfpdf.AgregarDato(
            "INICIO", "Fecha inicio actividades: {}".format(
                LeerIni(clave='inicio', key='FACTURA')))

        if int(cabfact.tipocomp.codigo
               ) in Constantes.COMPROBANTES_FCE:  #si es una FCE
            pyfpdf.AgregarDato('CBUFCE', LeerIni('CBUFCE', key='FACTURA'))
            pyfpdf.AgregarDato('ALIASFCE', LeerIni('ALIASFCE', key='FACTURA'))
            pyfpdf.AgregarDato('nombre_condvta', Constantes.COND_VTA['T'])
            ok = pyfpdf.CargarFormato(ubicacion_sistema() +
                                      "/plantillas/factura-fce.csv")
        else:
            #Cargo el formato desde el archivo CSV(opcional)
            #(carga todos los campos a utilizar desde la planilla)
            ok = pyfpdf.CargarFormato(ubicacion_sistema() +
                                      "/plantillas/factura.csv")
        #Creo plantilla para esta factura(papel A4vertical):

        if LeerIni(clave='h**o') == 'S':
            pyfpdf.AgregarCampo("h**o",
                                'T',
                                150,
                                350,
                                0,
                                0,
                                size=70,
                                rotate=45,
                                foreground=0x808080,
                                priority=-1,
                                text="HOMOLOGACION")
        papel = "A4"  #o "letter" para carta, "legal" para oficio
        orientacion = "portrait"  #o landscape(apaisado)
        ok = pyfpdf.CrearPlantilla(papel, orientacion)
        num_copias = int(
            LeerIni(clave='num_copias',
                    key='FACTURA'))  #original, duplicado y triplicado
        lineas_max = 24  #cantidad de linas de items porp�gina
        qty_pos = "izq"  #(cantidad a la izquierda de la descripci�n del art�culo)
        #Proceso la plantilla
        ok = pyfpdf.ProcesarPlantilla(num_copias, lineas_max, qty_pos)

        if not os.path.isdir('facturas'):
            os.mkdir('facturas')
        #Genero el PDF de salida seg�n la plantilla procesada
        salida = join(
            'facturas', "{}-{}.pdf".format(cabfact.tipocomp.nombre,
                                           cabfact.numero))
        ok = pyfpdf.GenerarPDF(salida)
        #Abro el visor de PDF y muestro lo generado
        #(es necesario tener instalado Acrobat Reader o similar)
        imprimir = False  #cambiar a True para que lo envie directo a laimpresora
        if mostrar:
            pyfpdf.MostrarPDF(salida, imprimir)

        self.facturaGenerada = salida