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")
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")
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