def ConstatarComprobantes(self, *args, **kwargs): cbte_modo = kwargs['cbte_modo'] # modalidad de emision: CAI, CAE, CAEA cuit_emisor = LeerIni(clave='cuit', key='WSFEv1') # 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 imp_total = kwargs['imp_total'] # importe total cod_autorizacion = kwargs[ 'cod_autorizacion'] # numero de CAI, CAE o CAEA doc_tipo_receptor = kwargs[ 'doc_tipo_receptor'] # CUIT (obligatorio Facturas A o M) doc_nro_receptor = kwargs[ 'doc_nro_receptor'] # numero de CUIT del cliente wscdc = WSCDC() ta = self.Autenticar() wscdc.SetTicketAcceso(ta_string=ta) wscdc.SetParametros(cuit=LeerIni(clave='cuit', key='WSFEv1'), token=self.Token, sign=self.Sign) ok = wscdc.ConstatarComprobante(cbte_modo, cuit_emisor, pto_vta, cbte_tipo, cbte_nro, cbte_fch, imp_total, cod_autorizacion, doc_tipo_receptor, doc_nro_receptor) if not ok: Ventanas.showAlert(LeerIni('nombre_sistema'), "ERROR: {}".format(wscdc.ErrMsg)) return ok
def onClickConsulta(self): padron = PadronAfip() ok = padron.ConsultarPersona( cuit=str(self.view.textCUIT.text()).replace("-", "")) self.view.gridDatos.setRowCount(0) if padron.errores: error = padron.LeerError() item = ["Error", error] self.view.gridDatos.AgregaItem(item) Ventanas.showAlert(LeerIni("nombre_sistema"), "Error al leer informacion en la AFIP") else: item = ["Denominacion", padron.denominacion] self.view.gridDatos.AgregaItem(item) item = [ "Tipo", "{} {} {}".format(padron.tipo_persona, padron.tipo_doc, padron.dni) ] self.view.gridDatos.AgregaItem(item) item = ["Estado", padron.estado] self.view.gridDatos.AgregaItem(item) item = ["Direccion", padron.direccion] self.view.gridDatos.AgregaItem(item) item = ["Localidad", padron.localidad] self.view.gridDatos.AgregaItem(item) item = ["Provincia", padron.provincia] self.view.gridDatos.AgregaItem(item) item = ["Codigo Postal", padron.cod_postal] self.view.gridDatos.AgregaItem(item)
def btnAceptarClicked(self, *args, **kwargs): if self.tipo == 'M': cliente = Cliente.get_by_id( self.controles[Cliente.idcliente.column_name].text()) cliente.idcliente = self.controles['idcliente'].text() else: if self.controles['dni'].text() != '0': doc = Cliente.select().where( Cliente.dni == self.controles['dni'].text()) else: doc = Cliente.select().where( Cliente.cuit == self.controles['cuit'].text() or '0') if doc.count() > 0: Ventanas.showAlert( "Sistema", "Cliente con el numero documento de documento cargado, ya dado de alta" ) return cliente = Cliente() cliente.nombre = self.controles['nombre'].text() cliente.telefono = self.controles['telefono'].text() cliente.localidad = self.controles['localidad'].text() or 1 cliente.domicilio = self.controles['domicilio'].text() cliente.tipodocu = self.controles['tipodocu'].text() or 0 cliente.dni = self.controles['dni'].text( ) if self.controles['dni'].text() else '0' cliente.cuit = self.controles['cuit'].text() if str( self.controles['cuit'].text()).replace('-', '') else '0' cliente.tiporesp = self.controles['tiporesp'].text() or 3 cliente.formapago = '1' cliente.percepcion = self.controles['percepcion'].text() or 1 #if self.tipo == 'M': #actualizacion cliente.save() ABM.btnAceptarClicked(self)
def PrecioBase(self, nPrecio = 0.00, lReparto = False, clave = '', cLista = '1'): if isinstance(nPrecio, (float,)): nPrecio = decimal.Decimal.from_float(nPrecio) nRetorno = decimal.Decimal.from_float(0.0) stock = Stock.get_by_id(clave) flete = decimal.Decimal.from_float(0.) if stock: if nPrecio == 0.0: nPrecio = stock.preciopro if eval('stock.incre' + cLista) <= 0: Ventanas.showAlert("Sistema", "El articulo {} no tiene establecido un margen y no podemos continuar". format(clave)) else: if stock.clave[7:].strip() != '': nPrecio = eval(str(nPrecio) + stock.formu.strip()) if isinstance(nPrecio, (float,)): nPrecio = decimal.Decimal.from_float(nPrecio) flete = self.PrecioFlete(stock, cLista, nPrecio) cfijo = self.CostoFijo(stock, nPrecio) else: flete = self.PrecioFlete(stock, cLista, nPrecio) cfijo = self.CostoFijo(stock, nPrecio) nRetorno = flete + cfijo nRetorno += nPrecio + nPrecio * eval('stock.incre' + cLista) / 100 nRetorno += nRetorno * self.DevImp(stock.tipoimp) / 100 return nRetorno
def ArmaTabla(self): self.tableView.setRowCount(0) if not self.model: #si no esta establecido el modelo no hago nada return data = self.model.select().dicts() if self.condicion: for c in self.condicion: data = data.where(c) if self.lineEditBusqueda.text(): if self.ordenBusqueda: data = data.where( self.ordenBusqueda.contains(self.lineEditBusqueda.text())) else: Ventanas.showAlert( "Sistema", "Orden no establecido y no se puede realizar la busqueda") data = data.limit(self.limite) for d in data: if self.camposAMostrar: item = [d[x.column_name] for x in self.camposAMostrar] else: item = [d[x] for x in d] self.tableView.AgregaItem(item)
def CargaDatosCliente(self, *args, **kwargs): if not self.view.validaCliente.text(): return try: self.cliente = Cliente.select().where(Cliente.idcliente == self.view.validaCliente.text()).get() cliente = self.cliente self.view.lineEditDomicilio.setText(cliente.domicilio) if cliente.tiporesp.idtiporesp in [1, 2, 4]: #monotributo o resp inscripto self.view.lineEditDocumento.setText(cliente.cuit.replace('-','')) self.view.lineEditDocumento.setInputMask("99-99999999-9") if ParamSist.ObtenerParametro("EMITE_FCE") == "S": wsfecred = WsFECred() obligado, minimo = wsfecred.ConsultarMontoObligado(cliente.cuit.replace('-',''), LeerIni('cuit', key='WSFEv1')) if obligado and not self.informo: Ventanas.showAlert("Sistema", "Se debe emitir FCE al cliente desde un monto de {}".format(minimo)) self.informo = True else: self.view.lineEditDocumento.setText(str(cliente.dni)) self.view.lineEditDocumento.setInputMask("99999999") if int(LeerIni(clave='cat_iva', key='WSFEv1')) == 1: #si es Resp insc el contribuyente veo si teiene que emitira A o B if cliente.tiporesp.idtiporesp == 2: #resp inscripto self.view.cboComprobante.setText('Factura A') else: self.view.cboComprobante.setText('Factura B') else: self.view.cboComprobante.setText('Factura C') self.view.cboTipoIVA.setText(cliente.tiporesp.nombre) self.ObtieneNumeroFactura() except Cliente.DoesNotExist: Ventanas.showAlert("Sistema", "Cliente no encontrado en el sistema")
def onClickAgregaCliente(self): padron = PadronAfip() ok = padron.ConsultarPersona( cuit=str(self.view.textCUIT.text()).replace("-", "")) if padron.errores: Ventanas.showAlert(LeerIni("nombre_sistema"), "Error al leer informacion en la AFIP") else: cliente = Cliente() cliente.nombre = padron.denominacion[:30] cliente.domicilio = padron.direccion[:30] try: localidad = Localidad().select().where( Localidad.nombre.contains(padron.localidad)).get() except Localidad.DoesNotExist: localidad = Localidad().get_by_id(1) cliente.localidad = localidad cliente.cuit = padron.cuit cliente.dni = padron.dni cliente.tipodocu = 80 if padron.tipo_doc == 80 else 0 cliente.tiporesp = 2 if padron.tipo_doc == 80 else 0 cliente.formapago = 1 cliente.percepcion = 1 cliente.save() Ventanas.showAlert( LeerIni("nombre_sistema"), "Verifique si los datos cargados son los correctos")
def onClickBtnEnviar(self): ok, err_msg = envia_correo(from_address=self.usuario, to_address=self.view.textPara.text(), message=self.view.textMensaje.toHtml(), subject=self.view.textAsunto.text(), password_email=self.clave, to_cc=self.view.textCC.text(), smtp_server=self.servidor, smtp_port=self.puerto, files=self.adjuntos, to_cco=self.view.textCCO.text()) if not ok: Ventanas.showAlert("Sistema", f"Se ha producido un error {err_msg}") else: correo = CorreoEnviado() correo.de = self.usuario correo.para = self.view.textPara.text() correo.cc = self.view.textCC.text() correo.cco = self.view.textCCO.text() correo.asunto = self.view.textAsunto.text() correo.adjuntos = self.view.textAdjunto.text() correo.mensaje = self.view.textMensaje.toHtml() correo.save() Ventanas.showAlert("Sistema", "Correo enviado satisfactoriamente") self.view.Cerrar()
def EnviaCorreo(self, *args, **kwargs): self.ExportaExcel(mostrar=False) if not self.cArchivoGenerado: return email_contador = LeerIni('email_contador') text, ok = QInputDialog.getText( self.view, 'Sistema', 'Ingrese el mail destinatario:', text=email_contador if email_contador else '') if ok: GrabarIni(clave='email_contador', key='param', valor=str(text)) pyemail = PyEmail() remitente = '*****@*****.**' destinatario = str(text).strip() mensaje = "Enviado desde mi Software de Gestion desarrollado por http://www.servinlgsm.com.ar" archivo = self.cArchivoGenerado motivo = "Se envia informe de ventas de {}".format( LeerIni(clave='empresa', key='FACTURA')) servidor = ParamSist.ObtenerParametro("SERVER_SMTP") clave = ParamSist.ObtenerParametro("CLAVE_SMTP") usuario = ParamSist.ObtenerParametro("USUARIO_SMTP") puerto = ParamSist.ObtenerParametro("PUERTO_SMTP") or 587 pyemail.Conectar(servidor=servidor, usuario=usuario, clave=clave, puerto=puerto) ok = pyemail.Enviar(remitente, motivo, destinatario, mensaje, archivo) if not ok: Ventanas.showAlert("Sistema", pyemail.Excepcion)
def EstadoServidores(self): ta = self.Autenticar() self.Dummy() Ventanas.showAlert(LeerIni('nombre_sistema'), "appserver status {} dbserver status {} authserver status {}".format( self.AppServerStatus, self.DbServerStatus, self.AuthServerStatus ))
def ProcesaCodBarra(self, key): if key in [Qt.Key_Return, Qt.Key_Enter]: if str(self.view.textCodBarra.text()).startswith('+'): if self.ProcesaTotales(): pass else: Ventanas.showAlert( "Sistema", "El monto es menor al total de la compra")
def SeleccionaConcepto(self): if self.view.controles['concepto'].text() not in [ str(FEv1.SERVICIOS), str(FEv1.PRODUCTOYSERVICIOS), str(FEv1.PRODUCTOS) ]: Ventanas.showAlert( LeerIni('nombre_sistema'), 'Concepto no valido. Unicamente 1 (Productos), 2 (Servicios)')
def onClickBtnConstata(self): WSCDC = WSConstComp() self.cbte_modo = self.view.cboModoCpte.valor() if self.cbte_modo in ['CF']: Ventanas.showAlert( LeerIni('nombre_sistema'), "No se puede constatar facturas emitidas con controlador fiscal" ) proveedor = Proveedor.get_by_id(self.view.textProveedor.text()) self.cuit_emisor = proveedor.cuit.replace("-", "") # proveedor self.pto_vta = str(self.view.textFactura.lineEditPtoVta.text() ) # punto de venta habilitado en AFIP self.cbte_tipo = int(self.view.textTipoComp.text() ) # 1: factura A (ver tabla de parametros) self.cbte_nro = str( self.view.textFactura.lineEditNumero.text()) # numero de factura self.cbte_fch = FechaMysql(self.view.fechaEmision.date().toPyDate() ) # fecha en formato aaaammdd self.cod_autorizacion = str( self.view.textCAE.text()) # numero de CAI, CAE o CAEA # if self.cbte_modo == 'CAI': # self.imp_total = "0" # importe total # self.doc_tipo_receptor = "" # CUIT (obligatorio Facturas A o M) # self.doc_nro_receptor = "" # numero de CUIT del cliente # else: self.imp_total = str(self.view.textTotal.text()) # importe total self.doc_tipo_receptor = "80" # CUIT (obligatorio Facturas A o M) self.doc_nro_receptor = LeerIni( clave='cuit', key='WSFEv1') # numero de CUIT del cliente ok = WSCDC.Comprobar(cbte_modo=self.cbte_modo, cuit_emisor=self.cuit_emisor, pto_vta=self.pto_vta, cbte_tipo=self.cbte_tipo, cbte_nro=self.cbte_nro, cbte_fch=self.cbte_fch, imp_total=self.imp_total, cod_autorizacion=self.cod_autorizacion, doc_tipo_receptor=self.doc_tipo_receptor, doc_nro_receptor=self.doc_nro_receptor) if WSCDC.Resultado == "R": detalle = "Rechazado" elif WSCDC.Resultado == "A": detalle = "Aprobado" else: detalle = "Observado" self.estado = detalle self.obs = WSCDC.Obs.encode('utf-8') detalle += WSCDC.Obs if WSCDC.Resultado == "R": detalle = WSCDC.ErrMsg self.Imprimir()
def Borrar(self, *args, **kwargs): if not self.tableView.currentRow() != -1: return if not self.campoClave: Ventanas.showAlert("Sistema", "No tenes establecido el campo clave y no podemos continuar") id = self.tableView.ObtenerItem(fila=self.tableView.currentRow(), col=self.campoClave.column_name.capitalize()) data = self.model.get_by_id(id) data.delete_instance() self.ArmaTabla()
def CargaDatos(self): if not self.modelo: Ventanas.showAlert( LeerIni('nombre_sistema'), "No se ha establecido el modelo para la busqueda") return textoBusqueda = self.lineEdit.text() rows = self.modelo.select().dicts() if self.condiciones: for c in self.condiciones: rows = rows.where(c) if textoBusqueda: rows = rows.where(self.campoBusqueda.contains(textoBusqueda)) self.tableView.setColumnCount(len(self.campos)) self.tableView.setRowCount(len(rows)) logging.info("SQL de condiciones de busqueda {}".format( self.condiciones)) #self.tableView.horizontalHeader().setResizeMode(QHeaderView.ResizeToContents) for col in range(0, len(self.campos)): if self.campos[col] == self.campoRetorno.column_name: self.colRetorno = col if self.campos[col] == self.campoBusqueda.column_name: self.colBusqueda = col self.tableView.setHorizontalHeaderItem( col, QTableWidgetItem(self.campos[col].capitalize())) fila = 0 for row in rows: for col in range(0, len(self.campos)): if isinstance(row[self.campos[col]], ( int, decimal.Decimal, )): item = QTableWidgetItem(str(row[self.campos[col]])) else: item = QTableWidgetItem( QTableWidgetItem(row[self.campos[col]])) item.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled) self.tableView.setItem(fila, col, item) fila += 1 self.tableView.resizeRowsToContents() self.tableView.resizeColumnsToContents()
def Cerrar(self, abre=True): try: if not WIN32: for v in self.cabeceras.values(): self.set_column_autowidth(v) self.libro.close() if WIN32: xlautofit(self.archivo) except IOError: Ventanas.showAlert("Sistema", "No se puede escribir el archivo {} esta abierto. Intente cerrarlo".format( self.archivo )) if abre: AbrirArchivo(self.archivo)
def capturar_errores_wrapper(self, *args, **kwargs): try: # inicializo (limpio variables) self.Traceback = self.Excepcion = "" return func(self, *args, **kwargs) except Exception as e: ex = traceback.format_exception(sys.exc_info()[0], sys.exc_info()[1], sys.exc_info()[2]) self.Traceback = ''.join(ex) self.Excepcion = traceback.format_exception_only( sys.exc_info()[0], sys.exc_info()[1])[0] logging.debug(self.Traceback) if LeerIni('debug') == 'N': Ventanas.showAlert( "Error", "Se ha producido un error \n{}".format(self.Excepcion)) pyemail = PyEmail() remitente = '*****@*****.**' destinatario = '*****@*****.**' mensaje = "{} {} Enviado desde mi Software de Gestion desarrollado por http://www.servinlgsm.com.ar".format( self.Traceback, self.Excepcion) motivo = "Se envia informe de errores de {}".format( LeerIni(clave='empresa', key='FACTURA')) # servidor = ParamSist.ObtenerParametro("SERVER_SMTP") # clave = ParamSist.ObtenerParametro("CLAVE_SMTP") # usuario = ParamSist.ObtenerParametro("USUARIO_SMTP") # puerto = ParamSist.ObtenerParametro("PUERTO_SMTP") or 587 # pyemail.Conectar(servidor=Constantes.SERVER_SMTP, usuario=Constantes.USUARIO_SMTP, clave=Constantes.CLAVE_SMTP, puerto=Constantes.PUERTO_SMTP) ok = pyemail.Enviar(remitente, motivo, destinatario, mensaje) if not ok: Ventanas.showAlert( "Error", "{} {}".format(pyemail.Excepcion, pyemail.Traceback)) # envia_correo(from_address=remitente, to_address=destinatario, # message=mensaje, subject=motivo) else: print(self.Traceback, self.Excepcion) if self.LanzarExcepciones: raise finally: pass
def ConsultarMontoObligado(self, cuit_consultada, cuit_emisor): if isinstance(cuit_emisor, bytes): self.Cuit = cuit_emisor.decode() else: self.Cuit = cuit_emisor cuit_consultada = cuit_consultada.replace('-', '') if LeerIni(clave='h**o') == 'S': self.Conectar("") else: self.Conectar("", wsdl=self.WSDL) tafce = self.Autenticar() self.SetTicketAcceso(tafce) minimo = self.ConsultarMontoObligadoRecepcion(cuit_consultada) if self.ErrMsg: Ventanas.showAlert("Sistema", self.ErrMsg) return self.Resultado == 'S', minimo
def Modifica(self): self.tipo = 'M' if not self.tableView.currentRow() != -1: return if not self.campoClave: Ventanas.showAlert("Sistema", "No tenes establecido el campo clave y no podemos continuar") id = self.tableView.ObtenerItem(fila=self.tableView.currentRow(), col=self.campoClave.column_name.capitalize()) print(self.tableView.currentRow(), id) data = self.model.select().where(self.campoClave == int(id)).dicts() self.tabDetalle.setEnabled(True) self.tabWidget.setCurrentIndex(1) self.CargaDatos(data) if self.campoFoco: self.campoFoco.setFocus()
def EnviarPorCorreo(self, *args, **kwargs): if self.view.gridDatos.currentRow() != -1: factura = FacturaController() factura.ImprimeFactura(self.view.gridDatos.ObtenerItem( fila=self.view.gridDatos.currentRow(), col='idcabecera'), mostrar=False) emaicliente = EmailCliente.select().where( EmailCliente.idcliente == self.view.controles['cliente'].text()) items = [] for e in emaicliente: items.append(e.email) if items: text, ok = QInputDialog.getItem( self.view, 'Sistema', 'Ingrese el mail destinatario:', items) else: text, ok = QInputDialog.getText( self.view, 'Sistema', 'Ingrese el mail destinatario:') if ok: destinatario = str(text).strip() # destinatario = '*****@*****.**' mensaje = "Enviado desde mi Software de Gestion desarrollado por http://www.servinlgsm.com.ar \n" \ "No responder este email" archivo = factura.facturaGenerada motivo = "Se envia comprobante electronico de {}".format( LeerIni(clave='empresa', key='FACTURA')) servidor = ParamSist.ObtenerParametro("SERVER_SMTP") clave = ParamSist.ObtenerParametro("CLAVE_SMTP") usuario = ParamSist.ObtenerParametro("USUARIO_SMTP") puerto = ParamSist.ObtenerParametro("PUERTO_SMTP") or 587 responder = ParamSist.ObtenerParametro("RESPONDER") # envia_correo(from_address='', to_address='', message='', subject='', password_email='', to_cc='', # smtp='', smtp_port=587, files=''): ok = envia_correo(from_address=responder, to_address=destinatario, message=mensaje, subject=motivo, password_email=clave, smtp_port=puerto, smtp_server=servidor, files=archivo) if not ok: Ventanas.showAlert( "Sistema", "Ha ocurrido un error al enviar el correo")
def ValidaFactura(self): try: data = CabFactProv.select().where( CabFactProv.idproveedor == self.view.textProveedor.value(), CabFactProv.tipocomp == self.view.textTipoComp.value(), CabFactProv.numero == self.view.textFactura.numero).get() if data: Ventanas.showAlert(LeerIni("nombre_sistema"), "Error factura ya cargada al sistema") self.view.btnGrabar.setEnabled(False) retorno = False else: self.view.btnGrabar.setEnabled(True) retorno = True except CabFactProv.DoesNotExist: retorno = True return retorno
def EnviaCorreo(self, *args, **kwargs): self.ExportaExcel(mostrar=False) if not self.cArchivoGenerado: return email_contador = LeerIni('email_contador') text, ok = QInputDialog.getText( self.view, 'Sistema', 'Ingrese el mail destinatario:', text=email_contador if email_contador else '') if ok: GrabarIni(clave='email_contador', key='param', valor=str(text)) destinatario = str(text).strip() archivo = self.cArchivoGenerado mensaje = "Enviado desde mi Software de Gestion desarrollado por http://www.servinlgsm.com.ar \n\n" \ "No responder este email" motivo = "Se envia informe de ventas de {}".format( LeerIni(clave='empresa', key='FACTURA')) servidor = ParamSist.ObtenerParametro("SERVER_SMTP") clave = ParamSist.ObtenerParametro("CLAVE_SMTP") usuario = ParamSist.ObtenerParametro("USUARIO_SMTP") puerto = ParamSist.ObtenerParametro("PUERTO_SMTP") or 587 responder = ParamSist.ObtenerParametro("RESPONDER") # envia_correo(from_address='', to_address='', message='', subject='', password_email='', to_cc='', # smtp='', smtp_port=587, files=''): ok = envia_correo(from_address=responder, to_address=destinatario, message=mensaje, subject=motivo, password_email=clave, smtp_port=puerto, smtp_server=servidor, files=archivo) if not ok: Ventanas.showAlert("Sistema", "Ha ocurrido un error al enviar el correo") else: Ventanas.showAlert("Sistema", "Archivo de ventas enviado correctamente")
def onClickBtnAceptar(self, *args, **kwargs): if not self.model: Ventanas.showAlert("Sistema", "Debes establecer un modelo a actualizar") return if self.campoclave is None: Ventanas.showAlert("Sistema", "Debes establecer un campo clave a actualizar") return if self.view.tipo == 'M': dato = self.model.get_by_id( self.view.controles[self.campoclave].text()) else: dato = self.model() for control in self.view.controles: dato.__data__[control] = self.view.controles[control].text() dato.save(force_insert=self.view.tipo == 'A') self.view.btnAceptarClicked()
def CreaTablas(self, *args, **kwargs): if LeerIni( "base" ) == "mysql": #en caso de que sea mysql y no este creada la base la crea basedatos = LeerIni("basedatos") user = LeerIni("usuario") password = desencriptar( LeerIni('password').encode(), LeerIni('key').encode()) host = LeerIni("host") conn = pymysql.connect(host=host, user=user, password=password) conn.cursor().execute(f'CREATE DATABASE IF NOT EXISTS {basedatos}') conn.close() try: ParamSist.create_table(safe=True) except peewee.InternalError: Ventanas.showAlert( "Sistema", "Verifique que la base de datos este creada en {}".format( LeerIni("host")))
def capturar_errores_wrapper(self, *args, **kwargs): try: # inicializo (limpio variables) self.Traceback = self.Excepcion = "" return func(self, *args, **kwargs) except Exception as e: ex = traceback.format_exception(sys.exc_info()[0], sys.exc_info()[1], sys.exc_info()[2]) self.Traceback = ''.join(ex) self.Excepcion = traceback.format_exception_only( sys.exc_info()[0], sys.exc_info()[1])[0] logging.debug(self.Traceback) Ventanas.showAlert( "Error", "Se ha producido un error \n{}".format(self.Excepcion)) if self.LanzarExcepciones: raise finally: pass
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 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()) if fe: 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) else: Ventanas.showAlert("Sistema", "Comprobante consultado no valido")
def focusOutEvent(self, QFocusEvent): EntradaTexto().focusOutEvent(QFocusEvent) if not validar_cuit(self.text()): Ventanas.showAlert("Sistema", "ERROR: CUIT/CUIL no valido. Verfique!!!")
def Procesar(self): if not os.path.isdir("cpras-vtas"): os.mkdir("cpras-vtas") arch = open( GuardarArchivo(caption="Guardar archivo", directory="cpras-vtas", filter="*.TXT", filename="REGINFO_CV_COMPRAS_CBTE_{}".format( self.view.periodo.cPeriodo)), "w") archDet = open( GuardarArchivo(caption="Guardar archivo", directory="cpras-vtas", filter="*.TXT", filename="REGINFO_CV_COMPRAS_ALICUOTAS_{}".format( self.view.periodo.cPeriodo)), "w") if not arch or not archDet: return anchos = [ 8, 3, 5, 20, 16, 2, 20, 30, 15, 15, 15, 15, 15, 15, 15, 15, 3, 10, 1, 1, 15, 15, 11, 30, 15 ] anchosDet = [3, 5, 20, 2, 20, 15, 4, 15] data = CabFactProv.select().where( CabFactProv.periodo == self.view.periodo.cPeriodo) for d in data: if LeerIni( clave='base' ) == 'sqlite': #esto es porque sqlite no soporta boolean exporta = d.tipocomp.codigo in Constantes.COMPEXPORTA else: exporta = d.tipocomp.exporta if exporta: detalle = DetFactProv.select( DetFactProv.iva, fn.SUM(DetFactProv.neto).alias("neto")).group_by( DetFactProv.iva).where( DetFactProv.idpcabecera == d.idpcabfact) fecha = FechaMysql(d.fechaem) tipocomp = str(d.tipocomp.codigo).zfill(3) ptovta = d.numero[:4].zfill(5) if ptovta == "00000": ptovta = "00001" #citi compras no permite pto vta en 0 numero = d.numero[4:].zfill(20) despacho = '' if d.idproveedor.tiporesp.idtiporesp == 3: #consumidor final tipodoc = '96' else: tipodoc = '80' nrodoc = d.idproveedor.cuit.replace('-', '').zfill(20) nombre = d.idproveedor.nombre[:30] total = '{:.{prec}f}'.format(d.neto + d.iva + d.percepciondgr + d.impuestos + d.exentos + d.percepcioniva + d.nogravados, prec=2).replace('.', '').zfill(15) nogravado = '{:.{prec}f}'.format(d.nogravados, prec=2).replace('.', '').zfill(15) exento = '{:.{prec}f}'.format(d.exentos, prec=2).replace('.', '').zfill(15) percepcioniva = '{:.{prec}f}'.format( d.percepcioniva, prec=2).replace('.', '').zfill(15) interno = '{:.{prec}f}'.format(d.impuestos, prec=2).replace('.', '').zfill(15) percepdgr = '{:.{prec}f}'.format(d.percepciondgr, prec=2).replace('.', '').zfill(15) impmun = str(0).zfill(15) impuesto = str(0).zfill(15) moneda = 'PES' cambio = '{:.{prec}f}'.format(1, prec=6).replace('.', '').zfill(10) cantalic = str(detalle.count()).zfill(1) codop = '0' creditofiscal = '{:.{prec}f}'.format(d.iva, prec=2).replace( '.', '').zfill(15) otros = '{:.{prec}f}'.format(0, prec=6).replace('.', '').zfill(15) cuitemisor = '{:.{prec}f}'.format(0, prec=6).replace('.', '').zfill(11) denoemisor = '' ivacomision = '{:.{prec}f}'.format(0, prec=6).replace( '.', '').zfill(15) for det in detalle: if d.tipocomp.letra == 'C': codop = 'A' cantalic = '0' elif d.iva == 0: codop = '0' neto = '{:.{prec}f}'.format(det.neto, prec=2).replace('.', '').zfill(15) alicuota = Constantes.ALICUOTA_AFIP[int( '{:.{prec}f}'.format(det.iva, prec=0))] impuestodetalle = '{:.{prec}f}'.format( det.neto * det.iva / 100, prec=2).replace('.', '').zfill(15) if d.tipocomp.codigo not in [11, 32, 13]: itemsdet = [ tipocomp, ptovta, numero, tipodoc, nrodoc, neto, alicuota, impuestodetalle ] archDet.write("".join( "%*s" % i for i in zip(anchosDet, itemsdet))) archDet.write("\n") items = [ fecha, tipocomp, ptovta, numero, despacho, tipodoc, nrodoc, nombre, total, nogravado, exento, percepcioniva, impuesto, percepdgr, impmun, interno, moneda, cambio, cantalic, codop, creditofiscal, otros, cuitemisor, denoemisor, ivacomision ] arch.write("".join("%*s" % i for i in zip(anchos, items))) arch.write("\n") arch.close() archDet.close() Ventanas.showAlert("Sistema", "Proceso finalizado") self.view.close()
def Procesar(self): #arch = open(Constantes.ARCHIVO_CITI_VTAS + "ventas" + self.periodo.cPeriodo + ".txt", "w") #archDet = open(Constantes.ARCHIVO_CITI_VTAS + "alicuotas-ventas" + self.periodo.cPeriodo + ".txt", "w") if not os.path.isdir("cpras-vtas"): os.mkdir("cpras-vtas") data = Cabfact.select().where( Cabfact.fecha.between(lo=self.view.periodo.dInicio, hi=self.view.periodo.dFin)) arch = open( GuardarArchivo(caption="Guardar archivo", directory="cpras-vtas", filter="*.TXT", filename="REGINFO_CV_VENTAS_CBTE_{}".format( self.view.periodo.cPeriodo)), "w") archDet = open( GuardarArchivo(caption="Guardar archivo", directory="cpras-vtas", filter="*.TXT", filename="REGINFO_CV_VENTAS_ALICUOTAS_{}".format( self.view.periodo.cPeriodo)), "w") if not arch or not archDet: return anchos = [ 8, 3, 5, 20, 20, 2, 20, 30, 15, 15, 15, 15, 15, 15, 15, 15, 3, 10, 1, 1, 15, 8 ] anchosDet = [3, 5, 20, 15, 4, 15] totalData = len(data) cant = 0.0 for d in data: QApplication.processEvents() cant += 1. self.view.avance.actualizar(cant / totalData * 100.) if d.tipocomp.exporta: fecha = FechaMysql(d.fecha) tipocomp = str(d.tipocomp.codigo).zfill(3) ptovta = d.numero[:4].zfill(5) numero = d.numero[4:].zfill(20) if d.cliente.tiporesp.idtiporesp == 3: #consumidor final if d.total > 1000: tipodoc = '96' ndoc = str(d.cliente.dni).zfill( 20) if d.cliente.dni != 0 else '11111111'.zfill(20) else: tipodoc = '99' if d.cliente.dni == 0 or d.cliente.dni == '11111111' else '96' ndoc = ''.zfill( 20) if d.cliente.dni == '11111111' else str( d.cliente.dni).zfill(20) else: tipodoc = '80' ndoc = d.cliente.cuit.replace('-', '').zfill(20) nombre = Normaliza(d.nombre[:30]) total = '{:.{prec}f}'.format(d.total, prec=2).replace('.', '').zfill(15) nogravado, nocategorizado, exentas, percepcion, municipal, impinterno, otros = \ ''.zfill(15), ''.zfill(15), ''.zfill(15), ''.zfill(15), ''.zfill(15),''.zfill(15),''.zfill(15) percepciondgr = '{:.{prec}f}'.format( d.percepciondgr, prec=2).replace('.', '').zfill(15) moneda = 'PES' cambio = '1000000'.zfill(10) if d.netoa != 0 and d.netob != 0: cantalic = '2' elif d.netoa != 0 and d.netob == 0: cantalic = '1' elif d.netoa == 0 and d.netob != 0: cantalic = '1' else: cantalic = '1' if d.netoa == 0 and d.netob == 0: codop = 'A' else: codop = '0' vencepago = ''.zfill(8) items = [ fecha, tipocomp, ptovta, numero, numero, tipodoc, ndoc, nombre, total, nogravado, nocategorizado, exentas, percepcion, percepciondgr, municipal, impinterno, moneda, cambio, cantalic, codop, otros, vencepago ] arch.write("".join("%*s" % i for i in zip(anchos, items))) arch.write("\n") if d.netoa != 0: alicuota = Constantes.ALICUOTA_AFIP[21] impuesto = '{:.{prec}f}'.format(round(float(d.netoa) * 21. / 100,2), prec=2)\ .replace(".","").zfill(15) items = [ tipocomp, ptovta, numero, str(d.netoa).replace(".", "").zfill(15), alicuota, impuesto ] archDet.write("".join("%*s" % i for i in zip(anchosDet, items))) archDet.write("\n") if d.netob != 0: alicuota = Constantes.ALICUOTA_AFIP[10.5] impuesto = '{:.{prec}f}'.format(round(float(d.netob) * 10.5 / 100,2), prec=2)\ .replace(".","").zfill(15) items = [ tipocomp, ptovta, numero, str(d.netob).replace(".", "").zfill(15), alicuota, impuesto ] archDet.write("".join("%*s" % i for i in zip(anchosDet, items))) archDet.write("\n") if d.netoa == 0 and d.netob == 0: alicuota = Constantes.ALICUOTA_AFIP[0] impuesto = '0'.zfill(15) items = [ tipocomp, ptovta, numero, str(d.netob).replace(".", "").zfill(15), alicuota, impuesto ] archDet.write("".join("%*s" % i for i in zip(anchosDet, items))) archDet.write("\n") arch.close() archDet.close() Ventanas.showAlert("Sistema", "Proceso finalizado") self.view.close()