def __init__(self,parent,texto='',en=1,campos=['Ref','Descripcion','Precio'],tabla='',multi=False): #texto= texto inicial de busqueda, en=campo a buscar, campos=campos q se desplegaran, tabla=nombre de la tabla de la DB, multi=modo de seleccion de retorno QtGui.QDialog.__init__(self,parent) self.setupUi(self) self.cursor=parent.cursor self.parent=parent self.en=en self.campos=campos self.tabla=tabla self.modelo=QModeloTablaSql(self.parent.cursor,self) self.tvResulta.setModel(self.modelo) self.leFiltro.setText(str(texto)) self.leFiltro.setFocus() #for k,i in campos.iteritems(): #self.head.append(k) #self.campos.append(i) self.producto={} self.seleccionados=[] self.multi=multi #Indica si require seleccionar multiples productos if self.multi: self.tvResulta.setSelectionMode(QAbstractItemView.ExtendedSelection) self.connect(self.leFiltro, QtCore.SIGNAL("returnPressed()"), self.listar) self.connect(self.pbBuscar, QtCore.SIGNAL("clicked()"), self.listar) self.connect(self.tvResulta,QtCore.SIGNAL('activated(const QModelIndex&)'),self.accept) #self.connect(self.tbDone,QtCore.SIGNAL('clicked()'),self.retornar) self.connect(self.tbCancelar,QtCore.SIGNAL('clicked()'),self.reject) #self.connect(self,QtCore.SIGNAL('accepted()'),self.retornar) self.listar(texto)
class Selector(QDialog,Ui_Seleccion): def __init__(self,parent, entidad,tablename=False,columnas=False,heads=False,filtros=True,inicial=""): #I.E. Selector(self,'proveedores','clientes','id,nombre,email','Id,Nombre del proveedor,E-Mail',"`nombre` like '%%%s%%' order by nombre desc limit 100") #Tablename, columnas y filtros vienen dadas por una cadena de elementos separados por comas y es lo que se pasa al query QDialog.__init__(self) self.setupUi(self) self.parent=parent self.nombre=entidad.capitalize() self.tablename=tablename.lower() self.columnas=columnas self.filtros=filtros if heads: self.heads=heads.split(',') else: self.heads=columnas.split(',') #print self.heads self.leEntidad.setText(self.nombre+':') self.setWindowTitle("Seleccionador de {0}".format(self.nombre)) self.modelo=QModeloTablaSql(self.parent.cursor,self) self.tabla.setModel(self.modelo) self.connect(self.texto,SIGNAL("textChanged(QString)"),self.buscar) self.connect(self.tabla,SIGNAL("activated(const QModelIndex&)"),self.seleccionado) self.texto.setText(inicial) def buscar(self,texto=False): texto=str(texto) if len(texto)>2 or texto=='*': if texto=='*': sql="SELECT {0} FROM {1};".format(self.columnas,self.tablename) else: sql="SELECT {0} FROM {1} where {2} ;".format(self.columnas,self.tablename,self.filtros.format(texto)) #print sql self.modelo.query(sql,self.heads) self.tabla.resizeColumnsToContents() def seleccionado(self): if len(self.tabla.selectedIndexes())>0: nrow=(len(self.tabla.selectedIndexes())/self.modelo.columnCount(self)) ret = [range(self.modelo.columnCount(self)) for i in range(nrow)] offset=self.tabla.selectedIndexes()[0].row() for index in self.tabla.selectedIndexes(): #print index.row(),index.column() ret[index.row()-offset][index.column()]=str(index.data().toString()) self.retorno=ret self.done(1)
class Pendientes(QWidget, Ui_Form): def __init__(self,parent,id): QWidget.__init__(self) self.setupUi(self) self.datos={'nombre':"Pendientes",'descripcion':"Control de cuentas pendientes",'version':"0.7",'id':id,'nivel':3} self.id=id self.action = QAction(self) self.parent=parent self.action.setIcon(QIcon(":/modulos/images/png/elegant/pending.png")) self.action.setIconVisibleInMenu(True) self.action.setText(self.datos['nombre']) self.connect(self.action, SIGNAL("triggered()"), self.ver ) self.modelo=QModeloTablaSql(parent.cursor,self) self.tvCuentas.setModel(self.modelo) self.init() self.setupEvents() def init(self): self.ids=False self.cliente=False def ver(self): self.parent.move(self.datos['nombre']) self.listar() def listar(self): if self.cbTipo.currentIndex()==1: #Cuando se seleccione "Notas" head=['Id','Total','Fecha','Cliente','Vendedor','Caja'] sql="""SELECT notas.id,total , fecha, SUBSTR(clientes.nombre,1,12), usuarios.usuario, caja FROM notas, clientes, usuarios where notas.usuario=usuarios.id_usuario and cliente=clientes.id and status=0 and tipo=0 order by fecha""" else: #Cuando se seleccione "Todas las ventas" sql="""SELECT notas.id, total,fecha,ELT(notas.tipo+1,'Nota','Factura'),SUBSTR(clientes.nombre,1,12), usuarios.usuario, caja FROM notas, clientes, usuarios where notas.usuario=usuarios.id_usuario and cliente=clientes.id and status=0 order by fecha""" head=['Id','Total','Fecha','Tipo','Cliente','Vendedor','Caja'] self.modelo.query(sql,head) self.tvCuentas.resizeColumnsToContents() def setupEvents(self): self.connect(self.ncactualizar,SIGNAL("clicked()"), self.listar)
def __init__(self,conexion,ventas,usuario,cliente,caja): #I.E. Selector(self,'proveedores','clientes','id,nombre,email','Id,Nombre del proveedor,E-Mail',"`nombre` like '%%%s%%' order by nombre desc limit 100") #Tablename, columnas y filtros vienen dadas por una cadena de elementos separados por comas y es lo que se pasa al query QDialog.__init__(self) self.setupUi(self) self.conexion=conexion self.wCambio.setVisible(False) self.ventas=ventas self.modelo=QModeloTablaSql(self.conexion.cursor,self) self.tabla.setModel(self.modelo) self.connect(self.leRecibo,SIGNAL("returnPressed()"),self.cobrar) self.connect(self.tbCobrar,SIGNAL("clicked()"),self.cobrar) self.iniciar()
def __init__(self,parent,id): QWidget.__init__(self) self.setupUi(self) self.datos={'nombre':"Pendientes",'descripcion':"Control de cuentas pendientes",'version':"0.7",'id':id,'nivel':3} self.id=id self.action = QAction(self) self.parent=parent self.action.setIcon(QIcon(":/modulos/images/png/elegant/pending.png")) self.action.setIconVisibleInMenu(True) self.action.setText(self.datos['nombre']) self.connect(self.action, SIGNAL("triggered()"), self.ver ) self.modelo=QModeloTablaSql(parent.cursor,self) self.tvCuentas.setModel(self.modelo) self.init() self.setupEvents()
def __init__(self,parent, entidad,tablename=False,columnas=False,heads=False,filtros=True,inicial=""): #I.E. Selector(self,'proveedores','clientes','id,nombre,email','Id,Nombre del proveedor,E-Mail',"`nombre` like '%%%s%%' order by nombre desc limit 100") #Tablename, columnas y filtros vienen dadas por una cadena de elementos separados por comas y es lo que se pasa al query QDialog.__init__(self) self.setupUi(self) self.parent=parent self.nombre=entidad.capitalize() self.tablename=tablename.lower() self.columnas=columnas self.filtros=filtros if heads: self.heads=heads.split(',') else: self.heads=columnas.split(',') #print self.heads self.leEntidad.setText(self.nombre+':') self.setWindowTitle("Seleccionador de {0}".format(self.nombre)) self.modelo=QModeloTablaSql(self.parent.cursor,self) self.tabla.setModel(self.modelo) self.connect(self.texto,SIGNAL("textChanged(QString)"),self.buscar) self.connect(self.tabla,SIGNAL("activated(const QModelIndex&)"),self.seleccionado) self.texto.setText(inicial)
def __init__(self,parent): self.ui=parent self.index=7 self.ui.tvOfertas.setContextMenuPolicy(Qt.CustomContextMenu) self.modelo=QModeloTablaSql(parent.cursor,parent) self.ui.tvOfertas.setModel(self.modelo) self.ui.connect(self.ui.tOfertas, SIGNAL("clicked()"), self.ver) self.ui.connect(self.ui.tboHome, SIGNAL("clicked()"), self.ver) self.ui.connect(self.ui.tbOfertas, SIGNAL("clicked()"), self.ver) self.ui.connect(self.ui.verOfertas, SIGNAL("triggered()"), self.ver) self.ui.productos.popMenu.addAction(self.ui.verOfertas) #self.ui.tbrProductos.addAction(self.ui.verOfertas) action=self.ui.menuHerramientas.addAction("Calcular precios") self.ui.connect(action, SIGNAL("triggered()"), self.calcularPrecio) self.ui.connect(self.ui.leOFIltro, SIGNAL("returnPressed()"), lambda:self.listar(str(self.ui.leOFIltro.text()))) self.ui.connect(self.ui.tboAgregar, SIGNAL("clicked()"), self.agregar) self.ui.connect(self.ui.pboBuscar, SIGNAL("clicked()"), self.buscarProd) self.ui.connect(self.ui.tvOfertas,SIGNAL('customContextMenuRequested(const QPoint)'),self.ocm) #self.ui.connect(self.ui.deInicio, SIGNAL("dateChanged ( const QDate)"), self.listar) self.ui.connect(self.ui.deFecha, SIGNAL("dateChanged ( const QDate)"), self.listar) self.ui.connect(self.ui.tvOfertas,SIGNAL('activated(const QModelIndex&)'),self.editar) self.ui.deFecha.setDate(QDate.currentDate()) self.iniciarActions()
class buscadorPop(QtGui.QDialog, Ui_Dialog): def __init__(self,parent,texto='',en=1,campos=['Ref','Descripcion','Precio'],tabla='',multi=False): #texto= texto inicial de busqueda, en=campo a buscar, campos=campos q se desplegaran, tabla=nombre de la tabla de la DB, multi=modo de seleccion de retorno QtGui.QDialog.__init__(self,parent) self.setupUi(self) self.cursor=parent.cursor self.parent=parent self.en=en self.campos=campos self.tabla=tabla self.modelo=QModeloTablaSql(self.parent.cursor,self) self.tvResulta.setModel(self.modelo) self.leFiltro.setText(str(texto)) self.leFiltro.setFocus() #for k,i in campos.iteritems(): #self.head.append(k) #self.campos.append(i) self.producto={} self.seleccionados=[] self.multi=multi #Indica si require seleccionar multiples productos if self.multi: self.tvResulta.setSelectionMode(QAbstractItemView.ExtendedSelection) self.connect(self.leFiltro, QtCore.SIGNAL("returnPressed()"), self.listar) self.connect(self.pbBuscar, QtCore.SIGNAL("clicked()"), self.listar) self.connect(self.tvResulta,QtCore.SIGNAL('activated(const QModelIndex&)'),self.accept) #self.connect(self.tbDone,QtCore.SIGNAL('clicked()'),self.retornar) self.connect(self.tbCancelar,QtCore.SIGNAL('clicked()'),self.reject) #self.connect(self,QtCore.SIGNAL('accepted()'),self.retornar) self.listar(texto) def listar(self,texto=False): if not texto: texto=str(self.leFiltro.text()) where='' if len(texto)>0: where=" WHERE `%s` like '%%%s%%' "%(self.campos[self.en],texto) sql="SELECT %s from %s %s "%(','.join(self.campos), self.tabla, where) #print sql self.modelo.query(sql,self.campos) self.tvResulta.resizeColumnsToContents() def selected(self,cols=()): #cols es un conjunto de numeros de columnas que se retornara indices=self.tvResulta.selectedIndexes() dic={} for index in indices: if index.column()==0: dic[index.row()]=[str(index.data().toString())] elif index.column() in cols: dic[index.row()].append(str(index.data().toString())) return [item for key,item in dic.iteritems()] def getFilas(self): return libutil.seleccionarFilas(self.tvResulta, self.modelo) def retornar(self): self.done(1)
class Oferta: def __init__(self,parent): self.ui=parent self.index=7 self.ui.tvOfertas.setContextMenuPolicy(Qt.CustomContextMenu) self.modelo=QModeloTablaSql(parent.cursor,parent) self.ui.tvOfertas.setModel(self.modelo) self.ui.connect(self.ui.tOfertas, SIGNAL("clicked()"), self.ver) self.ui.connect(self.ui.tboHome, SIGNAL("clicked()"), self.ver) self.ui.connect(self.ui.tbOfertas, SIGNAL("clicked()"), self.ver) self.ui.connect(self.ui.verOfertas, SIGNAL("triggered()"), self.ver) self.ui.productos.popMenu.addAction(self.ui.verOfertas) #self.ui.tbrProductos.addAction(self.ui.verOfertas) action=self.ui.menuHerramientas.addAction("Calcular precios") self.ui.connect(action, SIGNAL("triggered()"), self.calcularPrecio) self.ui.connect(self.ui.leOFIltro, SIGNAL("returnPressed()"), lambda:self.listar(str(self.ui.leOFIltro.text()))) self.ui.connect(self.ui.tboAgregar, SIGNAL("clicked()"), self.agregar) self.ui.connect(self.ui.pboBuscar, SIGNAL("clicked()"), self.buscarProd) self.ui.connect(self.ui.tvOfertas,SIGNAL('customContextMenuRequested(const QPoint)'),self.ocm) #self.ui.connect(self.ui.deInicio, SIGNAL("dateChanged ( const QDate)"), self.listar) self.ui.connect(self.ui.deFecha, SIGNAL("dateChanged ( const QDate)"), self.listar) self.ui.connect(self.ui.tvOfertas,SIGNAL('activated(const QModelIndex&)'),self.editar) self.ui.deFecha.setDate(QDate.currentDate()) self.iniciarActions() def iniciar(self): #self.ui.ocultarTools() #self.ui.tbrProductos.show() self.ui.lboProducto.setText("") self.listar() def ver(self): self.ui.stack.setCurrentIndex(self.index) def iniciarActions(self): self.popMenu = QMenu(self.ui) #action=self.popMenu.addAction(QIcon("/usr/share/pyventa/images/16/plus_16.png"),"Nuevo impuesto") #self.ui.connect(action, SIGNAL("triggered()"), self.agregar) #self.ui.menuImpuestos.addAction(action) action= self.popMenu.addAction(QIcon(":/actions/images/actions/black_18/pencil.png"),"Editar") action.setIconVisibleInMenu(True) self.ui.connect(action, SIGNAL("triggered()"), self.editar) action=self.popMenu.addAction(QIcon(":/actions/images/actions/black_18/delete.png"),"Eliminar") action.setIconVisibleInMenu(True) self.ui.connect(action, SIGNAL("triggered()"), self.eliminar) def listar(self,nombre=''): if isinstance(nombre,QDate): nombre='' fecha=str(self.ui.deFecha.date().toString('yyyy-MM-dd')) head=['Id','Nombre de la promocion', 'Descuento','Inicia','Caduca','U. Minimas','U. Maximas'] if len(nombre)>0: nombre=" and nombre like '%{0}%' ".format(nombre) sql="SELECT id,nombre, descuento,inicio,fin,minimo, maximo FROM promociones WHERE DATE('{0}') between inicio and fin {1}; ".format(fecha,nombre) self.modelo.query(sql,head) self.ui.tvOfertas.resizeColumnsToContents() #self.modelo=self.ui.entabla(self.ui.tvOfertas,head,sql,self.modelo) def buscarProd(self): dlg=buscador(self.ui,'',['Ref','Descripcion','Familia']) if dlg.exec_()>0: producto=dlg.producto #print producto self.ui.lboProducto.setText("Ofertas de "+producto['Descripcion']) try: self.ui.cursor.execute("""SELECT departamento from familias where id=%s"""%producto['Familia']) except: print "Hay un problema en la base de datos los campos del producto %s estan incompletos o corruptos."%producto['Ref'] else: row=self.ui.cursor.fetchone() if row!=None: producto['Dep']=row[0] self.checkPromos(producto) else: print "El producto %s no tiene una referencia hacia un departamento, verfique su familia."%producto['Ref'] def agregar(self): self.iniciar() editor=EditorOferta(self.ui) if editor.exec_()>0: print " Promocion agregada " self.listar() #self.ui.iniciarCombos() #def showEditor(self): def eliminar(self,index=None): if index==None: index=self.ui.tvOfertas.selectedIndexes()[1] if isinstance(index,QModelIndex): key=str(index.sibling(index.row(),0).data().toString()) msgBox=QMessageBox(QMessageBox.Question,"Eliminar promocion","Confirma eliminar la promocion %s?"%key,QMessageBox.Yes|QMessageBox.No,self.ui, Qt.WindowStaysOnTopHint) ret=msgBox.exec_() if ret==QMessageBox.Yes: self.ui.cursor.execute("""DELETE FROM ofertas where promocion=%s"""%key) self.ui.cursor.execute("delete from promociones where id="+str(key)) self.listar() def editar(self,index=None): if index==None: index=self.ui.tvOfertas.selectedIndexes()[1] if isinstance(index,QModelIndex): key=str(index.sibling(index.row(),0).data().toString()) editor=EditorOferta(self.ui,key) if editor.exec_()>0: self.listar() def ocm(self, point): point.setY(point.y()+25) point.setX(point.x()+30) self.popMenu.exec_(self.ui.tvOfertas.mapToGlobal(point) ) def checkPromos(self,prod): head=['id','nombre', 'descuento','Precio Pub.','Precio c/Desc','inicio','fin','minimo','maximo'] sql="SELECT P.id,P.nombre, P.descuento,precio, precio-(P.descuento*precio*.1),P.inicio,P.fin,P.minimo, maximo FROM ofertas as O,promociones as P, productos WHERE ref=conjunto and tipo=0 and (conjunto=%s OR conjunto=%s OR conjunto=%s) AND O.promocion=P.id AND CURDATE() BETWEEN P.inicio AND P.fin"%(prod['Ref'],prod['Familia'],prod['Dep']) self.ui.entabla(self.ui.tvOfertas,head,sql) def calcularPrecio(self): CP=CalculaDescuentos(self.ui) CP.exec_()
class Cobrador(QDialog,Ui_Cobrador): def __init__(self,conexion,ventas,usuario,cliente,caja): #I.E. Selector(self,'proveedores','clientes','id,nombre,email','Id,Nombre del proveedor,E-Mail',"`nombre` like '%%%s%%' order by nombre desc limit 100") #Tablename, columnas y filtros vienen dadas por una cadena de elementos separados por comas y es lo que se pasa al query QDialog.__init__(self) self.setupUi(self) self.conexion=conexion self.wCambio.setVisible(False) self.ventas=ventas self.modelo=QModeloTablaSql(self.conexion.cursor,self) self.tabla.setModel(self.modelo) self.connect(self.leRecibo,SIGNAL("returnPressed()"),self.cobrar) self.connect(self.tbCobrar,SIGNAL("clicked()"),self.cobrar) self.iniciar() def iniciar(self): self.retorno=False venta=Venta(self.conexion) total=venta.sumaTotales(" id in ({ide}) and status=0".format(ide=",".join(self.ventas))) if total!=None: if total[0]==None: print "Todas las ventas ya estan pagadas" self.reject() else: self.total=float(total[0]) self.dsbTotal.setValue(self.total) self.modelo.query("""Select notas.id, usuarios.usuario, cajas.nombre,total from notas,usuarios,cajas where status=0 and notas.id in ({ide}) and id_usuario=notas.usuario and cajas.num_caja=caja """.format(ide=",".join(self.ventas)), "id,usuario,caja,total".split(',')) self.tabla.resizeColumnsToContents() self.leRecibo.selectAll() def cobrar(self): if len(str(self.leRecibo.text()))>0: recibo=float(self.leRecibo.text()) cambio=recibo-self.total if cambio<0: self.leRecibo.selectAll() else: venta=Venta(self.conexion) self.retorno=venta.cambiarEstado(self.ventas,1) if self.retorno: self.dsbCambio.setValue(cambio) self.wCambio.setVisible(True) self.leRecibo.setEnabled(False) self.tbCobrar.setEnabled(False) #self.tbCerrar.setFocus(True) QTimer.singleShot(10000,self.accept) #def seleccionado(self): #if len(self.tabla.selectedIndexes())>0: #nrow=(len(self.tabla.selectedIndexes())/self.modelo.columnCount(self)) #ret = [range(self.modelo.columnCount(self)) for i in range(nrow)] #offset=self.tabla.selectedIndexes()[0].row() #for index in self.tabla.selectedIndexes(): ##print index.row(),index.column() #ret[index.row()-offset][index.column()]=str(index.data().toString()) #self.retorno=ret #self.done(1)