def Validacion(self): retorno = True if not self.view.validaCliente.text(): Ventanas.showAlert( LeerIni('nombre_sistema'), "ERROR: No se ha especificado un cliente valido") retorno = False for x in range(self.view.gridFactura.rowCount()): iva = float(self.view.gridFactura.ObtenerItem(fila=x, col='IVA')) if str(iva) not in FEv1().TASA_IVA: Ventanas.showAlert( LeerIni('nombre_sistema'), "Error el item {} no tiene un IVA valido".format(x + 1)) retorno = False codigo = self.view.gridFactura.ObtenerItem(fila=x, col='Codigo') try: articulo = Articulo.get_by_id(codigo) except Articulo.DoesNotExist: Ventanas.showAlert( LeerIni('nombre_sistema'), "Error el item {} tiene un articulo no valido".format(x + 1)) retorno = False return retorno
def ObtieneNumeroFactura(self): self.view.layoutFactura.lineEditPtoVta.setText(LeerIni(clave='pto_vta', key='WSFEv1').zfill(4)) # tipos = Tipocomprobantes.ComboTipoComp(tiporesp=int(LeerIni(clave='cat_iva', key='WSFEv1'))) # tipo_cpte = [k for (k, v) in tipos.valores.iteritems() if v == self.view.cboComprobante.text()][0] tipo_cpte = self.view.cboComprobante.text() nro = FEv1().UltimoComprobante(tipo=tipo_cpte, ptovta=self.view.layoutFactura.lineEditPtoVta.text()) self.tipo_cpte = tipo_cpte self.view.layoutFactura.lineEditNumero.setText(str(int(nro)+1).zfill(8)) self.SumaTodo()
def Comprobar(self, *args, **kwargs): cbte_modo = kwargs['cbte_modo'] # modalidad de emision: CAI, CAE, CAEA cuit_emisor = kwargs['cuit_emisor'].replace('-', '') # proveedor pto_vta = kwargs['pto_vta'] # punto de venta habilitado en AFIP cbte_tipo = kwargs[ 'cbte_tipo'] # 1: factura A (ver tabla de parametros) cbte_nro = kwargs['cbte_nro'] # numero de factura cbte_fch = kwargs['cbte_fch'] # fecha en formato aaaammdd cod_autorizacion = kwargs[ 'cod_autorizacion'] # numero de CAI, CAE o CAEA # if cbte_modo == 'CAI': # imp_total = "0" # importe total # doc_tipo_receptor = "" # CUIT (obligatorio Facturas A o M) # doc_nro_receptor = "" # numero de CUIT del cliente # else: imp_total = kwargs['imp_total'] # importe total doc_tipo_receptor = kwargs[ 'doc_tipo_receptor'] # CUIT (obligatorio Facturas A o M) doc_nro_receptor = kwargs['doc_nro_receptor'].replace( '-', '') # numero de CUIT del cliente wsfev1 = FEv1() ta = wsfev1.Autenticar(service='wscdc') self.SetTicketAcceso(ta_string=ta) self.Cuit = LeerIni(clave='cuit', key='WSCDC') #cuit de la empresa/persona if LeerIni(clave='h**o') == 'N': self.WSDL = LeerIni(clave='url_prod', key='WSCDC') self.Conectar("", self.WSDL) else: self.Conectar() # if cbte_modo == 'CAI': # ok = self.ConstatarComprobante(cbte_modo, cuit_emisor, pto_vta, cbte_tipo, # cbte_nro, cbte_fch, imp_total, cod_autorizacion) # else: ok = self.ConstatarComprobante(cbte_modo, cuit_emisor, pto_vta, cbte_tipo, cbte_nro, cbte_fch, imp_total, cod_autorizacion, doc_tipo_receptor, doc_nro_receptor) return ok
def ConsultarPersona(self, cuit=''): self.H**O = True if LeerIni(clave='h**o') == 'S' else False wsfev1 = FEv1() ta = wsfev1.Autenticar(service='ws_sr_padron_a5') # ta = wsfev1.Autenticar(service='ws_sr_padron_a13') self.SetTicketAcceso(ta_string=ta) self.Cuit = LeerIni(clave='cuit', key='WSFEv1') #cuit de la empresa/persona if LeerIni(clave='h**o') == 'N': self.WSDL = "https://aws.afip.gov.ar/sr-padron/webservices/personaServiceA5?wsdl" # self.WSDL = "https://aws.afip.gov.ar/sr-padron/webservices/personaServiceA13?wsdl" self.Conectar("", self.WSDL) else: self.Conectar() ok = self.Consultar(id_persona=cuit) # ok = self.Consultar(id_persona=23347203) return ok
def ConsultaCAE(self): fe = FEv1() # tipocbte = [k for (k, v) in self.view.cboTipoComp.valores.iteritems() if v == self.view.cboTipoComp.text()][0] tipocbte = self.view.cboTipoComp.text() fe.ConsultarCAE(tipocbte=tipocbte, puntoventa=self.view.layoutFactura.lineEditPtoVta.text(), numero=self.view.layoutFactura.lineEditNumero.text()) self.view.textCAE.setText(fe.CAE) self.view.textTotal.setText(str(fe.ImpTotal)) self.view.textNeto.setText(str(fe.ImpNeto)) self.view.textIVA.setText(str(fe.ImpIVA)) self.view.textDGR.setText(str(fe.ImpTrib)) self.view.textTipoDoc.setText(str(fe.factura["tipo_doc"])) self.view.textDocCli.setText(str(fe.factura["nro_doc"])) self.view.textFecha.setText(fe.FechaCbte) self.view.gridIVA.setRowCount(0) for iva in fe.factura['iva']: item = [ iva['iva_id'], iva['base_imp'], iva['importe'] ] self.view.gridIVA.AgregaItem(items=item)
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
def CreaFE(self, *args, **kwargs): ok = True self.ObtieneNumeroFactura() wsfev1 = FEv1() ta = wsfev1.Autenticar() #Setear tocken y sign de autorizacion(ticket de accesso, pasos previos) wsfev1.SetTicketAcceso(ta) wsfev1.Cuit = LeerIni( clave='cuit', key='WSFEv1') #CUIT del emisor (debe estar registrado en la AFIP) #Conectar al Servicio Web de Facturacion #Produccion usar: *-- ok = WSFE.Conectar("", "https://servicios1.afip.gov.ar/wsfev1/service.asmx?WSDL") & & Producción if LeerIni(clave='h**o') == "S": ok = wsfev1.Conectar("") #Homologacion else: cacert = LeerIni(clave='cacert', key='WSFEv1') ok = wsfev1.Conectar("", LeerIni(clave="url_prod", key="WSFEv1"), cacert=cacert) if self.view.checkBoxServicios.isChecked() \ and self.view.checkBoxProductos.isChecked(): #si es productoso y servicios concepto = wsfev1.PRODUCTOYSERVICIOS elif self.view.checkBoxServicios.isChecked(): concepto = wsfev1.SERVICIOS else: concepto = wsfev1.PRODUCTOS self.concepto = concepto if self.cliente.tiporesp.idtiporesp == 3: #consumidor final if str(self.view.lineEditDocumento.text()).strip() in ['0', '']: tipo_doc = 99 else: tipo_doc = 96 else: tipo_doc = 80 punto_vta = int(self.view.layoutFactura.lineEditPtoVta.value()) tipo_cbte = self.tipo_cpte nro_doc = str(self.view.lineEditDocumento.text()).strip().replace( '-', '') cbt_desde = int(self.view.layoutFactura.lineEditNumero.value()) cbt_hasta = cbt_desde imp_total = self.view.lineEditTotal.text() imp_tot_conc = "0.00" if int(LeerIni(clave='cat_iva', key='WSFEv1')) == 1: # si es Resp insc el contribuyente imp_neto = str(round(float(self.view.lineEditTotal.text()) - \ float(self.view.lineEditTributos.text()) - \ float(self.view.lineEditTotalIVA.text()), 2)) else: imp_neto = str(round(float(self.view.lineEditTotal.text()), 2)) imp_iva = str(round(float(self.view.lineEditTotalIVA.text()), 2)) imp_trib = str(round(float(self.view.lineEditTributos.text()), 2)) impto_liq_rni = "0.00" imp_op_ex = "0.00" fecha_cbte = self.view.lineEditFecha.getFechaSql() #Fechas del periodo del servicio facturado(solo siconcepto > 1) if concepto in [wsfev1.SERVICIOS, wsfev1.PRODUCTOYSERVICIOS]: fecha_serv_desde = self.view.fechaDesde.getFechaSql() fecha_serv_hasta = self.view.fechaHasta.getFechaSql() fecha_venc_pago = self.view.lineEditFecha.getFechaSql() else: fecha_serv_desde = "" fecha_serv_hasta = "" fecha_venc_pago = "" moneda_id = "PES" moneda_ctz = "1.000" if self.tipo_cpte in Constantes.COMPROBANTES_FCE: #FCE fecha_venc_pago = self.view.lineEditFecha.getFechaSql() #Llamo al WebService de Autorizacion para obtener el CAE ok = wsfev1.CrearFactura(concepto, tipo_doc, nro_doc, tipo_cbte, punto_vta, cbt_desde, cbt_hasta, 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) # Agregar comprobantes asociados(si es una NC / ND): if self.tipo_cpte in [3, 8, 13]: # if str(self.view.cboComprobante.text()).find('credito'): tipo = tipo_cbte pto_vta = self.view.layoutCpbteRelacionado.lineEditPtoVta.text() nro = self.view.layoutCpbteRelacionado.lineEditNumero.text() wsfev1.AgregarCmpAsoc(tipo, pto_vta, nro) if self.tipo_cpte in Constantes.COMPROBANTES_FCE: #homologacion wsfev1.AgregarOpcional(2101, LeerIni("CBUFCE", key='FACTURA')) #CBU wsfev1.AgregarOpcional(2102, LeerIni("ALIASFCE", key='FACTURA')) # alias #cargo los remitos relacionados, por ahora cargo la fecha actual #habria q ver de hacer una tabla de remitos if self.view.layoutCpbteRelacionado.numero: tipo_cbte_rem = 91 pto_vta_rem = self.view.layoutCpbteRelacionado.lineEditPtoVta.text( ) nro_comp_rem = self.view.layoutCpbteRelacionado.lineEditNumero.text( ) wsfev1.AgregarCmpAsoc(tipo_cbte_rem, pto_vta_rem, nro_comp_rem, LeerIni(clave='cat_iva', key='cuit'), FechaMysql()) if round(float(self.view.lineEditTributos.text()), 3) != 0: idimp = wsfev1.ID_IMP_PCIAL detalle = self.cliente.percepcion.detalle base_imp = round(float(self.view.lineEditTotal.text()) - \ float(self.view.lineEditTributos.text()) - \ float(self.view.lineEditTotalIVA.text()),2) alicuota = self.cliente.percepcion.porcentaje importe = str(round(float(self.view.lineEditTributos.text()), 2)) wsfev1.AgregarTributo(tributo_id=idimp, desc=detalle, base_imp=base_imp, alic=alicuota, importe=importe) if int(LeerIni( clave='cat_iva', key='WSFEv1')) == 1: #◘unicamente si es RI se informa los IVA #agrego todos los iva for k, v in self.netos.items(): if v != 0: id = FEv1().TASA_IVA[str(float(k))] base_imp = round(v, 2) iva = round(k, 2) importe = round(base_imp * iva / 100, 2) ok = wsfev1.AgregarIva(id, base_imp, importe) #SolicitoCAE: cae = wsfev1.CAESolicitar() if wsfev1.ErrMsg: Ventanas.showAlert("Sistema", "ERROR {}".format(DeCodifica(wsfev1.ErrMsg))) ok = False else: if wsfev1.Resultado == 'R': Ventanas.showAlert( "Sistema", "Motivo de rechazo {}".format(DeCodifica(wsfev1.Obs))) ok = False else: self.view.lineditCAE.setText(cae) self.view.lineEditResultado.setText(wsfev1.Resultado) self.view.fechaVencCAE.setFecha(wsfev1.Vencimiento, format="Ymd") return ok