def imprimir_recibo(self, widget): (model, itera) = self.vistaPagos.get_selection().get_selected() if itera != None: # Se asocian a los campos de edición los valores seleccionados fila = list(model[itera]) cliente = fila[1] + " " + fila[2] monto = int(fila[3]) montoLetras = to_word(monto) ciudad = 'Asunción' fecha = datetime.strptime(fila[4], '%Y-%m-%d %H:%M:%S') dia = fecha.day mes = fecha.month year = fecha.year sql = 'SELECT numero FROM numeroRecibo' self.cursor.execute(sql, ) resultado = self.cursor.fetchone() if resultado: numeroRecibo = resultado[0] imprimir = ImprimirRecibo(numeroRecibo, monto, ciudad, dia, self.meses[int(mes)], year, cliente, montoLetras, self.conexion, self.cursor, self.ventanaPagos) else: print resultado else: ventana_mensaje(self.ventanaPagos, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, 'Debe seleccionar una fila.')
def click_eliminar(self, widget): (model, itera) = self.vistaClientes.get_selection().get_selected() if itera != None: conf = ventana_mensaje( self.ventanaClientes, gtk.MESSAGE_QUESTION, gtk.BUTTONS_YES_NO, '¿Desea realmente eliminar el registro seleccionado?') if conf: # Se recupera el ID, único campo necesario para eliminar fila = list(model[itera]) #eliminamos el cliente de la base de datos sql = 'delete from clientes where ci = %s' self.cursor.execute(sql % (fila[0])) self.conexion.commit() #eliminamos la foto del cliente sql = 'delete from fotos where ci = %s' self.cursor.execute(sql % (fila[0])) self.conexion.commit() #eliminamos los pagos del cliente para que no quede basura en la BD sql = 'delete from pagos where ci = %s' self.cursor.execute(sql % (fila[0])) self.conexion.commit() self.cargarVista( 'Eliminado' ) # Se llena la vista con los registros (False indica que no es la carga inicial) else: ventana_mensaje(self.ventanaClientes, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, 'Debe seleccionar un cliente.')
def imprimir_recibo(self, widget): (model,itera) = self.vistaPagos.get_selection().get_selected() if itera != None: # Se asocian a los campos de edición los valores seleccionados fila = list(model[itera]) cliente = fila[1]+" "+fila[2] monto = int(fila[3]) montoLetras = to_word(monto) ciudad = 'Asunción' fecha = datetime.strptime(fila[4] , '%Y-%m-%d %H:%M:%S') dia = fecha.day mes = fecha.month year = fecha.year sql='SELECT numero FROM numeroRecibo' self.cursor.execute(sql,) resultado = self.cursor.fetchone() if resultado: numeroRecibo = resultado[0] imprimir = ImprimirRecibo(numeroRecibo, monto, ciudad, dia, self.meses[int(mes)], year, cliente, montoLetras, self.conexion, self.cursor, self.ventanaPagos) else: print resultado else: ventana_mensaje(self.ventanaPagos, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, 'Debe seleccionar una fila.')
def agregar_pago(self, widget): (model,itera) = self.vistaPagos.get_selection().get_selected() if itera != None: # Se asocian a los campos de edición los valores seleccionados fila = list(model[itera]) pago = AgregarPago(fila, self.cursor, self.conexion,self.ventanaPagos, True, self.vistaPagos) else: ventana_mensaje(self.ventanaPagos, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, 'Debe seleccionar una fila.')
def ver_pagos(self, widget): (model, itera) = self.vistaClientes.get_selection().get_selected() if itera != None: filaPagos = list(model[itera]) Pagos(filaPagos, self.cursor, self.conexion, self.ventanaClientes) else: ventana_mensaje(self.ventanaClientes, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, 'Debe seleccionar un cliente.')
def agregar_foto(self, widget): (model, itera) = self.vistaClientes.get_selection().get_selected() if itera != None: # Se asocian a los campos de edición los valores seleccionados fila = list(model[itera]) foto = FileSelection(fila, self.cursor, self.conexion) else: ventana_mensaje(self.ventanaClientes, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, 'Debe seleccionar un cliente.')
def agregar_pago(self, widget): (model, itera) = self.vistaPagos.get_selection().get_selected() if itera != None: # Se asocian a los campos de edición los valores seleccionados fila = list(model[itera]) pago = AgregarPago(fila, self.cursor, self.conexion, self.ventanaPagos, True, self.vistaPagos) else: ventana_mensaje(self.ventanaPagos, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, 'Debe seleccionar una fila.')
def borrar_foto(self, widget): conf = ventana_mensaje( self.ventanaClientes, gtk.MESSAGE_QUESTION, gtk.BUTTONS_YES_NO, '¿Desea realmente eliminar la foto de este usuario?') if conf: sql = "DELETE FROM fotos WHERE ci = '%s'" self.cursor.execute(sql % (self.idFoto)) self.cursor.execute(sql) self.conexion.commit() self.conexion.commit() self.ventanaFoto.destroy() ventana_mensaje(self.ventanaFoto, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, 'La foto fue eliminada correctamente!')
def click_ok(self, w): monto = self.monto.get_text() if monto.isdigit() and monto != '': fecha = datetime.fromtimestamp(time()).strftime('%Y-%m-%d %H:%M:%S') self.cursor.execute("INSERT INTO pagos (ci, nombre, apellido, monto, fechaPago) VALUES(%s, '%s', '%s', %s, '%s') " % (self.ci.get_text(), self.nombre.get_text(), self.apellido.get_text(), monto, fecha))#ejecuta sentencia de ingreso de imagen self.conexion.commit()#cierra transaccion gtk.Object.destroy(self.ventanaPago) ventana_mensaje(self.ventanaPago, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, 'El pago fue cargado correctamente.') if self.actualizar: self.cargarVista() else: ventana_mensaje(self.ventanaPago, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, 'El campo monto no debe estar vacío y debe ser numérico.')
def click_modificar(self, widget): self.nuevo = False (model, itera) = self.vistaClientes.get_selection().get_selected() if itera != None: # Se asocian a los campos de edición los valores seleccionados fila = list(model[itera]) agregarCliente( self.conexion, self.cursor, self.nuevo, fila, self.vistaClientes, self.ventanaClientes) # Ventana de edición de los datos else: ventana_mensaje(self.ventanaClientes, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, 'Debe seleccionar un cliente.')
def file_ok_sel(self, w): archivo = unicode(self.filew.get_filename(),"utf-8") print archivo gtk.Object.destroy(self.filew) if archivo: tipoImg = tipo.what(archivo) if tipoImg == None: ventana_mensaje(self.filew, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE, 'El archivo seleccionado no es una imagen') else: try: # fin = open(archivo,"r")#abre archivo ingresar a base de datos # img = sqlite3.Binary(fin.read()) # fin.close() #cierra el archivo imgdata = open(archivo, "rb").read() print len(imgdata) buff = sqlite3.Binary(imgdata) except IOError: #excepcion en caso de error ventana_mensaje(self.filew, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE, 'No se puede abrir archivo %s' % self.foto.get_filename()) sql='SELECT * FROM fotos WHERE ci = %s' self.cursor.execute(sql%self.fila[0]) resultado = self.cursor.fetchall() if not resultado: self.cursor.execute('INSERT INTO fotos VALUES(?,?);', (self.fila[0],buff))#ejecuta sentencia de ingreso de imagen self.conexion.commit()#cierra transaccion ventana_mensaje(self.filew, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, 'La foto fue agregada correctamente.') else: self.cursor.execute('UPDATE fotos SET foto = ? WHERE ci = ?;',(buff,self.fila[0]))#ejecuta sentencia de ingreso de imagen self.conexion.commit()#cierra transaccion ventana_mensaje(self.filew, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, 'Foto actualizada correctamente.')
def cargarVista(self, inicial): # Tipos de dato de cada columna. CI, Nombre, Telefono, Movil, email, Direccion, Ciudad, Tipo dde pago lista = gtk.ListStore(str,str,str,str,str,str,str,str,str) render = gtk.CellRendererText() # Objeto que se encarga de dibujar cada celda # Columnas de la vista columna0 = gtk.TreeViewColumn('CI', render, text=0) columna1 = gtk.TreeViewColumn('Nombres', render, text=1) columna2 = gtk.TreeViewColumn('Apellidos', render, text=2) columna3 = gtk.TreeViewColumn('Telefono', render, text=3) columna4 = gtk.TreeViewColumn('Movil', render, text=4) columna5 = gtk.TreeViewColumn('Correo Electronico', render, text=5) columna6 = gtk.TreeViewColumn('Direccion', render, text=6) columna7 = gtk.TreeViewColumn('Ciudad', render, text=7) columna8 = gtk.TreeViewColumn('Tipo de Pago', render, text=8) try: sql='SELECT * FROM clientes' self.cursor.execute(sql) resultado = self.cursor.fetchall() for registro in resultado: lista.append([registro[0],registro[1],registro[2],registro[3],registro[4],registro[5],registro[6],registro[7],registro[8]]) # Arma la vista con las columas y lista de elementos self.vistaClientes.set_model(lista) if inicial: self.vistaClientes.append_column(columna0) self.vistaClientes.append_column(columna1) self.vistaClientes.append_column(columna2) self.vistaClientes.append_column(columna3) self.vistaClientes.append_column(columna4) self.vistaClientes.append_column(columna5) self.vistaClientes.append_column(columna6) self.vistaClientes.append_column(columna7) self.vistaClientes.append_column(columna8) # Permite ordenar por columnas columna0.set_sort_column_id(0) columna1.set_sort_column_id(1) columna2.set_sort_column_id(2) columna8.set_sort_column_id(3) self.vistaClientes.show() except: #muestra una venta de error si no se puede conectar a la base de datos ventana_mensaje(self.ventanaClientes, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE, 'No se ha podido conectar a la base de datos')
def __init__(self, fila, cursor, conexion, padre): sql = 'SELECT * FROM pagos WHERE ci = %s' cursor.execute(sql % fila[0]) resultado = cursor.fetchall() if resultado: self.meses = [ "", "Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre" ] self.sistemaop = sys.platform #detectamos el sistema operativo para saber como pasar la ruta de archivos correctamente # Se carga el archivo glade con la ventana principal self.builderPagos = gtk.Builder() if self.sistemaop == 'linux2': self.builderPagos.add_from_file("views/payments.glade") else: self.builderPagos.add_from_file("views\\payments.glade") # Se recuperan los widget a usar self.ventanaPagos = self.builderPagos.get_object("ventanaPagos") self.ventanaPagos.set_title('Gestion de Pagos') self.ventanaPagos.set_transient_for(padre) self.vistaPagos = self.builderPagos.get_object("vista") self.botonAgregarPago = self.builderPagos.get_object( "botonAgregarPago") self.botonImprimir = self.builderPagos.get_object("botonImprimir") box1 = imgAndLabel(self.ventanaPagos, gtk.STOCK_ADD, "Agregar pago") box2 = imgAndLabel(self.ventanaPagos, gtk.STOCK_PRINT, "Imprimir recibo") self.botonAgregarPago.add(box1) self.botonImprimir.add(box2) box1.show() box2.show() self.fila = fila self.cursor = cursor self.conexion = conexion # Se asocian las señales del archivo glade a metodos de la clase self.builderPagos.connect_signals(self) self.cargarVista() self.ventanaPagos.maximize() self.ventanaPagos.show() else: ventana_mensaje(padre, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, 'Esta persona no posee ningun pago registrado.')
def click_ok(self, w): monto = self.monto.get_text() if monto.isdigit() and monto != '': fecha = datetime.fromtimestamp( time()).strftime('%Y-%m-%d %H:%M:%S') self.cursor.execute( "INSERT INTO pagos (ci, nombre, apellido, monto, fechaPago) VALUES(%s, '%s', '%s', %s, '%s') " % (self.ci.get_text(), self.nombre.get_text(), self.apellido.get_text(), monto, fecha)) #ejecuta sentencia de ingreso de imagen self.conexion.commit() #cierra transaccion gtk.Object.destroy(self.ventanaPago) ventana_mensaje(self.ventanaPago, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, 'El pago fue cargado correctamente.') if self.actualizar: self.cargarVista() else: ventana_mensaje( self.ventanaPago, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, 'El campo monto no debe estar vacío y debe ser numérico.')
def __init__(self, fila, cursor, conexion, padre): sql='SELECT * FROM pagos WHERE ci = %s' cursor.execute(sql%fila[0]) resultado = cursor.fetchall() if resultado: self.meses = ["","Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"] self.sistemaop = sys.platform#detectamos el sistema operativo para saber como pasar la ruta de archivos correctamente # Se carga el archivo glade con la ventana principal self.builderPagos = gtk.Builder() if self.sistemaop == 'linux2': self.builderPagos.add_from_file("views/payments.glade") else: self.builderPagos.add_from_file("views\\payments.glade") # Se recuperan los widget a usar self.ventanaPagos = self.builderPagos.get_object("ventanaPagos") self.ventanaPagos.set_title('Gestion de Pagos') self.ventanaPagos.set_transient_for(padre) self.vistaPagos = self.builderPagos.get_object("vista") self.botonAgregarPago = self.builderPagos.get_object("botonAgregarPago") self.botonImprimir = self.builderPagos.get_object("botonImprimir") box1 = imgAndLabel(self.ventanaPagos, gtk.STOCK_ADD, "Agregar pago") box2 = imgAndLabel(self.ventanaPagos, gtk.STOCK_PRINT, "Imprimir recibo") self.botonAgregarPago.add(box1) self.botonImprimir.add(box2) box1.show() box2.show() self.fila = fila self.cursor = cursor self.conexion = conexion # Se asocian las señales del archivo glade a metodos de la clase self.builderPagos.connect_signals(self) self.cargarVista() self.ventanaPagos.maximize() self.ventanaPagos.show() else: ventana_mensaje(padre, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, 'Esta persona no posee ningun pago registrado.')
def leer_imagen(self, widget): (model, itera) = self.vistaClientes.get_selection().get_selected() if itera != None: self.ventana_foto() # Ventana de edición de los datos # Se asocian a los campos de edición los valores seleccionados fila = list(model[itera]) sql = "SELECT foto FROM fotos WHERE ci = %s" self.cursor.execute( sql % (fila[0]) ) #sentencia que recupera la foto a travez del numero de ci del cliente resultado = self.cursor.fetchone() if resultado: if self.sistemaop == 'linux2': self.ruta = 'pictures/' + fila[0] + '_' + fila[1] else: self.ruta = 'pictures\\' + fila[0] + '_' + fila[1] print self.ruta salida = open( self.ruta, 'wb' ) #nombre del archivo que se va a guardar (cualquier nombre) en el archivo de salida self.archivo = fila[0] + fila[1] salida.write(resultado[0] ) #escribe el resultado en el archivo de salida salida.close() #cerrar archivo self.idFoto = fila[0] self.etiquetaFoto.set_text('Cliente ' + fila[1] + ' ' + fila[2]) self.imagenFoto.set_from_file(self.ruta) self.ventanaFoto.show() else: ventana_mensaje(self.ventanaClientes, gtk.MESSAGE_WARNING, gtk.BUTTONS_CLOSE, 'La persona seleccionada no posee una foto') else: ventana_mensaje(self.ventanaClientes, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, 'Debe seleccionar un cliente.')
def click_OK(self, widget): try: int(self.ci.get_text()) except: ventana_mensaje(self.ventanaAgregarCliente, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE, 'El campo de CI debe ser numerico') return # verificamos que los datos no esten vacios if (self.ci.get_text() == '') or (self.nombre.get_text() == ''): ventana_mensaje(self.ventanaAgregarCliente, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE, 'Los campos ''CI'' y ''Nombre'' no pueden estar vacios') else: if self.nuevo: # Se recuperan todos los datos, para ver si el usuario ya existe sql='SELECT ci FROM clientes where ci = %s' self.cursor.execute(sql%(self.ci.get_text())) resultado = self.cursor.fetchall() if resultado: ventana_mensaje(self.ventanaAgregarCliente, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE, 'Ya existe un usuario con esa CI') else: entry = gtk.Bin.get_child(self.comboTipoPago) sql="INSERT INTO clientes (ci, nombre, apellido, telefono, movil, email, direccion, ciudad,tipopago) VALUES ('%s','%s','%s','%s','%s','%s','%s','%s','%s')" self.cursor.execute(sql%(self.ci.get_text(),self.nombre.get_text(),self.apellido.get_text(),self.tel.get_text(), self.cel.get_text(),self.email.get_text(),self.dir.get_text(),self.ciudad.get_text(),entry.get_text())) self.conexion.commit() gtk.Object.destroy(self.ventanaAgregarCliente) if self.vistaClientes: self.cargarVista(False) # Se llena la vista con los registros (False indica que no es la carga inicial) else: # Se recuperan todos los datos, para ver si ya existe un usuario con ese ruc sql='SELECT ci FROM clientes WHERE ci = %s AND ci != %s' self.cursor.execute(sql%(self.ci.get_text(),self.ciAnt)) resultado = self.cursor.fetchall() if resultado: ventana_mensaje(self.ventanaAgregarCliente, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE, 'Ya existe un usuario con ese CI') else: entry = gtk.Bin.get_child(self.comboTipoPago) sql = '''UPDATE clientes SET ci = %s , nombre = %s,apellido = %s, telefono = %s, movil = %s, email = %s, direccion = %s, ciudad = %s, tipopago = %s WHERE ci = %s''' self.cursor.execute(sql%(self.ci.get_text(),self.nombre.get_text(),self.apellido.get_text(),self.tel.get_text(), self.cel.get_text(),self.email.get_text(),self.dir.get_text(),self.ciudad.get_text(),entry.get_text(),self.ciAnt)) self.conexion.commit() gtk.Object.destroy(self.ventanaAgregarCliente) self.cargarVista(False) # Se llena la vista con los registros (False indica que no es la carga inicial)
def file_ok_sel(self, w): archivo = unicode(self.filew.get_filename(), "utf-8") print archivo gtk.Object.destroy(self.filew) if archivo: tipoImg = tipo.what(archivo) if tipoImg == None: ventana_mensaje(self.filew, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE, 'El archivo seleccionado no es una imagen') else: try: # fin = open(archivo,"r")#abre archivo ingresar a base de datos # img = sqlite3.Binary(fin.read()) # fin.close() #cierra el archivo imgdata = open(archivo, "rb").read() print len(imgdata) buff = sqlite3.Binary(imgdata) except IOError: #excepcion en caso de error ventana_mensaje( self.filew, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE, 'No se puede abrir archivo %s' % self.foto.get_filename()) sql = 'SELECT * FROM fotos WHERE ci = %s' self.cursor.execute(sql % self.fila[0]) resultado = self.cursor.fetchall() if not resultado: self.cursor.execute( 'INSERT INTO fotos VALUES(?,?);', (self.fila[0], buff)) #ejecuta sentencia de ingreso de imagen self.conexion.commit() #cierra transaccion ventana_mensaje(self.filew, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, 'La foto fue agregada correctamente.') else: self.cursor.execute( 'UPDATE fotos SET foto = ? WHERE ci = ?;', (buff, self.fila[0] )) #ejecuta sentencia de ingreso de imagen self.conexion.commit() #cierra transaccion ventana_mensaje(self.filew, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, 'Foto actualizada correctamente.')
def click_aceptar(self, widget): self.usuario = self.usuarioEntry.get_text() self.passwd = self.passwordEntry.get_text() if self.usuario == '' or self.passwd == '': ventana_mensaje(self.ventanaLogin, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, 'Debe ingresar usuario y contraseña') else: sql="SELECT password FROM usuarios WHERE user = '******'" self.cursor.execute(sql % (self.usuario)) resultado = self.cursor.fetchone() if not resultado: ventana_mensaje(self.ventanaLogin, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, 'Combinación erronea de usuario y password!') else: if md5.new(self.passwd).hexdigest() == resultado[0]: self.ventanaLogin.hide() #ventana_mensaje(self.ventanaLogin, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, 'Bienvenido al sistema %s!' % self.usuario) Clientes() else: ventana_mensaje(self.ventanaLogin, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, 'Combinación erronea de usuario y password!')