예제 #1
0
def process_invoices(invoices, selling_point):
    """Generate the invoices in PDF using AFIP API resources."""
    wsfev1 = _get_afip()

    # init PDF builder
    fepdf = FEPDF()
    fepdf.CargarFormato(
        os.path.join(settings.BASE_DIR, "templates", "factura.csv"))
    fepdf.FmtCantidad = "0.2"
    fepdf.FmtPrecio = "0.2"
    fepdf.CUIT = settings.AFIP['cuit']
    for k, v in CONFIG_PDF.items():
        fepdf.AgregarDato(k, v)

    # safeguard when using test webservice endpoints
    if "h**o" in settings.AFIP['url_wsaa']:
        fepdf.AgregarCampo("DEMO",
                           'T',
                           120,
                           260,
                           0,
                           0,
                           text="DEMOSTRACION",
                           size=70,
                           rotate=45,
                           foreground=0x808080,
                           priority=-1)
        fepdf.AgregarDato("motivos_obs", "Ejemplo Sin Validez Fiscal")

    # get CAE for each record and generate corresponding PDF
    results = {}
    for invoice in invoices:
        authorized_ok = invoice.autorizar(wsfev1)
        invoice_number = invoice.header["cbte_nro"]
        print("    invoice generated: number={} CAE={} authorized={}".format(
            invoice_number, invoice.header["cae"], authorized_ok))
        results[invoice_number] = {'invoice_ok': authorized_ok}
        if not authorized_ok:
            print("WARNING not auth")
            return

        # another safeguard
        if "h**o" in settings.AFIP['url_wsfev1']:
            invoice.header["motivos_obs"] = "Ejemplo Sin validez fiscal"

        # generate the PDF
        pdf_name = "FacturaPyArAC-{:04d}-{:08d}.pdf".format(
            selling_point, invoice_number)
        pdf_path = os.path.join(PDF_PATH, pdf_name)
        invoice.generate_pdf(fepdf, pdf_path)
        print("    PDF generated {!r}".format(pdf_path))
        results[invoice_number]['pdf_path'] = pdf_path

    return results
예제 #2
0
def facturar(registros):
    """Rutina para emitir facturas electrónicas en PDF c/CAE AFIP Argentina"""

    # inicialización AFIP:
    wsaa = WSAA()
    wsfev1 = WSFEv1()
    # obtener ticket de acceso (token y sign):
    ta = wsaa.Autenticar(
        "wsfe", CERT, PRIVATEKEY, wsdl=URL_WSAA, cache=CACHE, debug=True
    )
    wsfev1.Cuit = CUIT
    wsfev1.SetTicketAcceso(ta)
    wsfev1.Conectar(CACHE, URL_WSFEv1)

    # inicialización PDF
    fepdf = FEPDF()
    fepdf.CargarFormato("factura.csv")
    fepdf.FmtCantidad = "0.2"
    fepdf.FmtPrecio = "0.2"
    fepdf.CUIT = CUIT
    for k, v in CONF_PDF.items():
        fepdf.AgregarDato(k, v)

    if "h**o" in URL_WSAA:
        fepdf.AgregarCampo(
            "DEMO",
            "T",
            120,
            260,
            0,
            0,
            text="DEMOSTRACION",
            size=70,
            rotate=45,
            foreground=0x808080,
            priority=-1,
        )
        fepdf.AgregarDato("motivos_obs", "Ejemplo Sin validez fiscal")

    # recorrer los registros a facturar, solicitar CAE y generar el PDF:
    for reg in registros:
        hoy = datetime.date.today().strftime("%Y%m%d")
        cbte = Comprobante(
            tipo_cbte=6,
            punto_vta=4000,
            fecha_cbte=hoy,
            cbte_nro=reg.get("nro"),
            tipo_doc=96,
            nro_doc=reg["dni"],
            nombre_cliente=reg["nombre"],  # "Juan Perez"
            domicilio_cliente=reg["domicilio"],  # "Balcarce 50"
            fecha_serv_desde=reg.get("periodo_desde"),
            fecha_serv_hasta=reg.get("periodo_hasta"),
            fecha_venc_pago=reg.get("venc_pago", hoy),
        )
        cbte.agregar_item(
            ds=reg["descripcion"],
            qty=reg.get("cantidad", 1),
            precio=reg.get("precio", 0),
            tasa_iva=reg.get("tasa_iva", 21.0),
        )
        ok = cbte.autorizar(wsfev1)
        nro = cbte.encabezado["cbte_nro"]
        print("Factura autorizada", nro, cbte.encabezado["cae"])
        if "h**o" in URL_WSFEv1:
            cbte.encabezado["motivos_obs"] = "Ejemplo Sin validez fiscal"
        ok = cbte.generar_pdf(fepdf, "/tmp/factura_{}.pdf".format(nro))
        print("PDF generado", ok)
예제 #3
0
def generate_invoices(records):
    """Generate the invoices in PDF using AFIP API resources."""
    wsfev1 = _get_afip()

    # init PDF builder
    fepdf = FEPDF()
    fepdf.CargarFormato("factura.csv")
    fepdf.FmtCantidad = "0.2"
    fepdf.FmtPrecio = "0.2"
    fepdf.CUIT = settings.AFIP['cuit']
    for k, v in CONFIG_PDF.items():
        fepdf.AgregarDato(k, v)

    # safeguard when using test webservice endpoints
    if "h**o" in settings.AFIP['url_wsaa']:
        fepdf.AgregarCampo("DEMO",
                           'T',
                           120,
                           260,
                           0,
                           0,
                           text="DEMOSTRACION",
                           size=70,
                           rotate=45,
                           foreground=0x808080,
                           priority=-1)
        fepdf.AgregarDato("motivos_obs", "Ejemplo Sin Validez Fiscal")

    # get CAE for each record and generate corresponding PDF
    results = {}
    for record in records:
        invoice = MemberInvoice(document_number=record['dni'],
                                fullname=record['fullname'],
                                address=record['address'],
                                city=record['city'],
                                zip_code=record['zip_code'],
                                province=record['province'],
                                invoice_date=record['invoice_date'],
                                invoice_number=record['invoice'],
                                service_date_from=record['service_date_from'],
                                service_date_to=record['service_date_to'])
        invoice.add_item(description=record['description'],
                         quantity=record['quantity'],
                         amount=record['amount'],
                         comment=record['payment_comment'])

        authorized_ok = invoice.autorizar(wsfev1)
        invoice_number = invoice.header["cbte_nro"]
        print("    invoice generated: number={} CAE={} authorized={}".format(
            invoice_number, invoice.header["cae"], authorized_ok))
        results[invoice_number] = {'invoice_ok': authorized_ok}
        if not authorized_ok:
            print("WARNING not auth")
            return

        # another safeguard
        if "h**o" in settings.AFIP['url_wsfev1']:
            invoice.header["motivos_obs"] = "Ejemplo Sin validez fiscal"

        # generate the PDF
        pdf_name = "FacturaPyArAC-{:04d}-{:08d}.pdf".format(
            settings.AFIP['selling_point'], invoice_number)
        pdf_path = os.path.join(PDF_PATH, pdf_name)
        invoice.generate_pdf(fepdf, pdf_path)
        print("    PDF generated {!r}".format(pdf_path))
        results[invoice_number]['pdf_path'] = pdf_path

    return results
예제 #4
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
예제 #5
0
def generate_invoices(records):
    """Generate the invoices in PDF using AFIP API resources."""
    # AFIP init
    wsaa = WSAA()
    wsfev1 = WSFEv1()

    # get access ticket (token y sign)
    certificate = settings.AFIP['auth_cert_path']
    private_key = settings.AFIP['auth_key_path']
    if not os.path.exists(certificate):
        raise ValueError(
            "Auth certificate can not be found (got {!r})".format(certificate))
    if not os.path.exists(private_key):
        raise ValueError(
            "Auth key can not be found (got {!r})".format(private_key))
    ta = wsaa.Autenticar("wsfe",
                         certificate,
                         private_key,
                         wsdl=settings.AFIP['url_wsaa'],
                         cache=CACHE,
                         debug=True)
    wsfev1.Cuit = settings.AFIP['cuit']
    wsfev1.SetTicketAcceso(ta)
    wsfev1.Conectar(CACHE, settings.AFIP['url_wsfev1'])

    # init PDF builder
    fepdf = FEPDF()
    fepdf.CargarFormato("factura.csv")
    fepdf.FmtCantidad = "0.2"
    fepdf.FmtPrecio = "0.2"
    fepdf.CUIT = settings.AFIP['cuit']
    for k, v in CONFIG_PDF.items():
        fepdf.AgregarDato(k, v)

    # safeguard when using test webservice endpoints
    if "h**o" in settings.AFIP['url_wsaa']:
        fepdf.AgregarCampo("DEMO",
                           'T',
                           120,
                           260,
                           0,
                           0,
                           text="DEMOSTRACION",
                           size=70,
                           rotate=45,
                           foreground=0x808080,
                           priority=-1)
        fepdf.AgregarDato("motivos_obs", "Ejemplo Sin Validez Fiscal")

    # get CAE for each record and generate corresponding PDF
    results = {}
    for record in records:
        invoice = MemberInvoice(document_number=record['dni'],
                                fullname=record['fullname'],
                                address=record['address'],
                                city=record['city'],
                                zip_code=record['zip_code'],
                                province=record['province'],
                                invoice_date=record['invoice_date'],
                                invoice_number=record['invoice'],
                                service_date_from=record['service_date_from'],
                                service_date_to=record['service_date_to'])
        invoice.add_item(description=record['description'],
                         quantity=record['quantity'],
                         amount=record['amount'],
                         comment=record['payment_comment'])

        authorized_ok = invoice.autorizar(wsfev1)
        invoice_number = invoice.header["cbte_nro"]
        print("    invoice generated: number={} CAE={} authorized={}".format(
            invoice_number, invoice.header["cae"], authorized_ok))
        results[invoice_number] = {'invoice_ok': authorized_ok}
        if not authorized_ok:
            print("WARNING not auth")
            return

        # another safeguard
        if "h**o" in settings.AFIP['url_wsfev1']:
            invoice.header["motivos_obs"] = "Ejemplo Sin validez fiscal"

        # generate the PDF
        pdf_name = "FacturaPyArAC-{:04d}-{:08d}.pdf".format(
            settings.AFIP['selling_point'], invoice_number)
        pdf_path = os.path.join(PDF_PATH, pdf_name)
        invoice.generate_pdf(fepdf, pdf_path)
        print("    PDF generated {!r}".format(pdf_path))
        results[invoice_number]['pdf_path'] = pdf_path

    return results