def _makeTable(self, table): if not self.ATRIBUTOSLISTA : columnasTablas = [p.capitalize() for p in self._obtener_atributos_names()] else: self.ATRIBUTOSLISTA_CLASSNAMES = [ self.manager.obtenerNombreAtributo( p.values()[0] ) for p in self.ATRIBUTOSLISTA] columnasTablas = [p.keys()[0] for p in self.ATRIBUTOSLISTA] self.MyTabla = MyTableWidget(table, columnasTablas, self.ALINEACIONLISTA)
def makeTableTicket(self): columnasTablas = [p.keys()[0] for p in self.ATRIBUTOSLISTA_TICKET] self.tablaTicket = MyTableWidget(self.twTicket, columnasTablas, self.ALINEACIONLISTA_TICKET, indexColumn=2, widthColumn=600)
def _makeTable(self): if not self.ATRIBUTOSLISTA : columnasTablas = [p.capitalize() for p in self._obtener_atributos_names()] else: self.ATRIBUTOSLISTA_CLASSNAMES = [ self.manager.obtenerNombreAtributo( p.values()[0] ) for p in self.ATRIBUTOSLISTA] columnasTablas = [p.keys()[0] for p in self.ATRIBUTOSLISTA] self.MyTabla = MyTableWidget(self.twDatos, columnasTablas, self.ALINEACIONLISTA, indexColumn = 2) self.connect(self.MyTabla.widget, QtCore.SIGNAL('customContextMenuRequested(const QPoint&)'), self.on_context_menu)
def _makeTable(self): if not self.ATRIBUTOSLISTA: columnasTablas = [ p.capitalize() for p in self._obtener_atributos_names() ] else: self.ATRIBUTOSLISTA_CLASSNAMES = [ self.manager.obtenerNombreAtributo(p.values()[0]) for p in self.ATRIBUTOSLISTA ] columnasTablas = [p.keys()[0] for p in self.ATRIBUTOSLISTA] self.MyTabla = MyTableWidget(self.twDatos, columnasTablas, self.ALINEACIONLISTA, indexColumn=2) self.connect( self.MyTabla.widget, QtCore.SIGNAL('customContextMenuRequested(const QPoint&)'), self.on_context_menu)
class InventarioGUI( BaseGUI ): def __init__(self, parent, windowparent, manager, managers = []): BaseGUI.__init__(self, parent, manager, managers) self.FILENAME = 'inventario/admin.ui' self.DialogAddClass = AddProducto locale.setlocale( locale.LC_ALL, '' ) self.setWindowIcon(QtGui.QIcon(':/newPrefix/logo.png')) self.ALINEACIONLISTA = ['C','L','L','C','C','C','C','C'] self.ATRI_COMBO_BUSQUEDA = [ {u'Descripcion del producto':Producto.descripcion}, {u'Codigo':Producto.codigo}, ] self.ATRIBUTOSLISTA = [ {u'Codigo':Producto.codigo}, {u'Categoria':Producto.categoria}, {u'Descripcion del producto':Producto.descripcion}, {u'Precio costo':Producto.precio_costo}, {u'Precio venta':Producto.precio_venta}, {u'Existencia':Producto.cantidad}, {u'Inv. Mínimo':Producto.minimo}, {u'Usa inventario':Producto.usa_inventario}, ] self.windowparent = windowparent self._operaciones_de_inicio() self.windowparent.hide() def _operaciones_de_inicio(self): self.loadUi() self.setWindowTitle(self.TITULO) self.lbTitulo.setText(self.manager.getClassName()) self._makeTable() self.cargarCombobox() self.cargarTabla() self._loadAppShortcuts() self.fullScreen = False self._centerOnScreen() self.setWindowState(QtCore.Qt.WindowMaximized) QtGui.QShortcut(QtGui.QKeySequence(QtCore.Qt.CTRL | QtCore.Qt.Key_B), self, self.leBusqueda.setFocus) self.setWindowTitle("Inventario - P.O.S.T.A.") self.lbTitulo.setText("Productos en inventario") self.cargarComboCategorias() self.lbProductosBajosExistencia.setText( "%s producto(s) bajo(s) en stock" % self.manager.cantidadProductosBajosEnExistencia()) menu = QtGui.QMenu(self.clbMas) menu.addAction(QtGui.QIcon(':newPrefix/drive-1934.png'), "Importar/Exportar...", self.on_btImportar_clicked) menu.addAction(QtGui.QIcon(':newPrefix/computer.png'), "Actualizar precios...", self._actualizarPrecios) self.clbMas.setMenu(menu) self.twDatos.setColumnWidth(3, 320) def close(self): BaseGUI.close(self) self.windowparent.show() def _makeTable(self): if not self.ATRIBUTOSLISTA : columnasTablas = [p.capitalize() for p in self._obtener_atributos_names()] else: self.ATRIBUTOSLISTA_CLASSNAMES = [ self.manager.obtenerNombreAtributo( p.values()[0] ) for p in self.ATRIBUTOSLISTA] columnasTablas = [p.keys()[0] for p in self.ATRIBUTOSLISTA] self.MyTabla = MyTableWidget(self.twDatos, columnasTablas, self.ALINEACIONLISTA, indexColumn = 2) self.connect(self.MyTabla.widget, QtCore.SIGNAL('customContextMenuRequested(const QPoint&)'), self.on_context_menu) # REIMPLEMENT TO USE RAM def cargarTabla(self,listadeobj = None): if listadeobj == None: listadeobj = self.manager.allItems['data'] #listadeobj = self.manager.getall() listadefilas = [self._obtenerValoresAtributos(obj) for obj in listadeobj] self.MyTabla.addItems(listadefilas) try: self.setCantidadItems(len(listadefilas)) except AttributeError : pass # REIMPLEMENT TO USE RAM def search(self, camponame, valor): objs = self.manager.allItems['data'] attr = self.manager.obtenerNombreAtributo(camponame) valor = valor.lower() QtGui.QApplication.processEvents() results = [ obj for obj in objs if obj.__getattribute__(attr) .lower().find(valor) != -1] return results def _obtenerValoresAtributos(self,obj): resultado = [] atributos_objeto = self.manager.getClassAttributesValues(obj) if not self.ATRIBUTOSLISTA : return atributos_objeto else: atributos_clase = self.manager.getClassAttributes() atributos_ordenados = self.ATRIBUTOSLISTA_CLASSNAMES for atributo in atributos_ordenados: resultado.append( atributos_objeto[ atributos_clase.index( atributo ) ] ) resultado[3] = "$ %8.2f" % float(resultado[3]) # precio costo resultado[4] = "$ %8.2f" % float(resultado[4]) # precio venta resultado[7] = 'SI' if resultado[7] else 'NO' # usa inventario return resultado def _filtrarPorCategoria(self, value): productos = [] if value != u'TODAS' and value != u'SIN CATEGORIA': categoriasManager = self.managers[1].manager unaCategoria = categoriasManager.obtenerPorNombre(value) productos = self.manager.obtenerPorCategoria(unaCategoria) elif value == u'SIN CATEGORIA': productos = self.manager.obtenerSinCategoria() else: productos = self.manager.allItems['data'] return productos def cargarComboCategorias(self): categorias = self.managers[1].manager.getall() self.cbCategorias.addItem(u'TODAS') self.cbCategorias.addItem(u'SIN CATEGORIA') categorias = [categoria.nombre for categoria in categorias] categorias.sort() [self.cbCategorias.addItem(cat) for cat in categorias] def _itemTableSelected(self): producto = self.actual_rows_to_objects() if producto: producto = producto[0] self.lbProductoNombre.setText(producto.descripcion) self.lbProductoPrecioVenta.setText("$ %8.2f" % float(producto.precio_venta)) self.lbProductoPrecioCosto.setText("$ %8.2f" % float(producto.precio_costo)) self.lbProductoExistencia.setText(str(producto.cantidad)) @QtCore.pyqtSlot() def on_btCategorias_clicked(self): _productosGUI = self.managers[0] _categoriasGUI = _productosGUI.managers[0] _categoriasGUI.show() @QtCore.pyqtSlot() def on_btImportar_clicked(self): from importar_exportar import ImportarExportar self.ie = ImportarExportar(self) self.ie.show() @QtCore.pyqtSlot() def on_btAgregarInventario_clicked(self): item = self.actual_rows_to_objects() if item : item = item[0] from addinventario import AddInventario self.ai = AddInventario(self.parent, self.manager, item) self.ai.postMethod = self.recargarLista self.ai.show() def on_btProductosBajosEnStock_toggled(self, value): if value: productos = self.manager.productosBajosEnStock() self.cargarTabla(productos) else: self.cargarTabla() @QtCore.pyqtSlot(int) def on_cbCategorias_currentIndexChanged(self , index): value = unicode(self.cbCategorias.itemText(index).toUtf8(), 'utf-8') self.cargarTabla(self._filtrarPorCategoria(value)) def on_twDatos_currentItemChanged(self , item_a, item_b): self._itemTableSelected() def on_twDatos_itemClicked(self , item): self._itemTableSelected() def _actualizarPrecios(self): from actualizar_precios import ActualizarPrecios self.ap = ActualizarPrecios(self) self.ap.show()
class ResumenGUI( BaseGUI ): def __init__(self, parent, manager, managers = []): BaseGUI.__init__(self, parent, manager, managers) self.FILENAME = 'resumen/admin.ui' self.ALINEACIONLISTA = ['C','C'] self.setWindowIcon(QtGui.QIcon(':/newPrefix/logo.png')) self._operaciones_de_inicio() self.establecerFechaHoyDateEdits() self.reflejarDatosResumenDelDia(datetime.date.today()) def _makeTable(self, table): if not self.ATRIBUTOSLISTA : columnasTablas = [p.capitalize() for p in self._obtener_atributos_names()] else: self.ATRIBUTOSLISTA_CLASSNAMES = [ self.manager.obtenerNombreAtributo( p.values()[0] ) for p in self.ATRIBUTOSLISTA] columnasTablas = [p.keys()[0] for p in self.ATRIBUTOSLISTA] self.MyTabla = MyTableWidget(table, columnasTablas, self.ALINEACIONLISTA) def _operaciones_de_inicio(self): UI_CONTENT = cStringIO.StringIO(self.parent.uis[self.FILENAME]) uic.loadUi(UI_CONTENT, self) self.setWindowTitle("Resumenes - P.O.S.T.A.") self._loadAppShortcuts() self.fullScreen = False self._centerOnScreen() def ordenarLL(self, lista,nroCampo): """Ordena la lista por el metodo burbuja mejorado. Recibe una lista de listas y un numero de campo, ordenando por el nro de campo indicado. """ intercambios=1 pasada=1 while pasada<len(lista) and intercambios==1: intercambios=0 for i in range(0,len(lista)-pasada): if lista[i][nroCampo] > lista[i+1][nroCampo]: lista[i], lista[i+1] = lista[i+1], lista[i] intercambios=1 pasada += 1 return lista def _generateDateList(self, desde, dias): dateList = [ desde + datetime.timedelta(days=x) for x in range(0,dias+1) ] dict_ventas = {} for d in dateList: dict_ventas[d] = 0 return dict_ventas def reflejarDatosResumenDelDia(self, _fecha): fecha = datetime.datetime(_fecha.year, _fecha.month, _fecha.day,0,0,0) ventas = self.manager.obtenerMontoVentasTotales(fecha) entradas = self.manager.obtenerEntradas(fecha) total_entradas = entradas + ventas autoconsumo = self.manager.obtenerSalidas(fecha, u'producto') proveedores = 0 salidas_dinero = self.manager.obtenerSalidas(fecha, u'dinero') total_salidas = salidas_dinero + proveedores en_caja = total_entradas - total_salidas # entradas self.lbVentasTotales.setText("$ %8.2f" % ventas) self.lbEntradasDinero.setText("$ %8.2f" % entradas) self.lbTotalEntradas.setText("$ %8.2f" % total_entradas) # salidas self.lbAutoConsumo.setText("$ %8.2f" % autoconsumo) self.lbProveedores.setText("$ %8.2f" % proveedores) self.lbDinero.setText("$ %8.2f" % salidas_dinero) self.lbTotalSalidas.setText("$ %8.2f" % total_salidas) # dinero en caja self.lbEntradas.setText("$ %8.2f" % total_entradas) self.lbSalidas.setText("$ %8.2f" % total_salidas) self.lbTotalDineroEnCaja.setText("$ %8.2f" % en_caja) def getAtributosListaPorDia(self): self.ATRIBUTOSLISTA = [ {u'Día':Venta.fecha}, {u'Monto vendido':Venta.total} ] def getAtributosListaPorMes(self): self.ATRIBUTOSLISTA = [ {u'Mes':Venta.fecha}, {u'Monto vendido':Venta.total} ] def getAtributosListaPorAnio(self): self.ATRIBUTOSLISTA = [ {u'Mes':Venta.fecha}, {u'Monto vendido':Venta.total} ] def actualizarTablaDia(self): desde = self.deDesde.date().toPyDate() hasta = self.deHasta.date().toPyDate() if desde != hasta: ventas = self.manager.obtenerVentasPorRangoDias(desde, hasta) dias = (hasta - desde).days dict_ventas = self._generateDateList(desde, dias) monto_total = 0 # separar ventas por dia for v in ventas: dict_ventas[v.fecha.date()] += v.total monto_total += v.total # generar lista de lista con los resultados resultados = [] for d in dict_ventas.keys(): resultados.append([d,"$ %8.2f" % dict_ventas[d]]) self.ordenarLL(resultados,0) # formatear fecha for row in resultados: row[0] = row[0].strftime('%d/%m/%Y') # generar tabla self.lbTotal.setText("$ %8.2f" % monto_total) self.getAtributosListaPorDia() self._makeTable(self.twDia) self.MyTabla.addItems(resultados) def actualizarTablaMes(self): mes = self.deMesMes.date().toPyDate().month anio = self.deMesAnio.date().toPyDate().year import calendar dias_del_mes = calendar.monthrange(anio,mes)[1] ventas = self.manager.obtenerVentasPorMes(mes, anio) dict_ventas = self._generateDateList(datetime.date(anio,mes,1), dias_del_mes-1) monto_total = 0 # separar ventas por dia for v in ventas: dict_ventas[v.fecha.date()] += v.total monto_total += v.total # generar lista de lista con los resultados resultados = [] for d in dict_ventas.keys(): resultados.append([d,"$ %8.2f" % dict_ventas[d]]) self.ordenarLL(resultados,0) # formatear fecha for row in resultados: row[0] = row[0].strftime('%d/%m/%Y') # generar tabla self.lbTotal.setText("$ %8.2f" % monto_total) self.getAtributosListaPorMes() self._makeTable(self.twMes) self.MyTabla.addItems(resultados) def actializarTablaAnio(self): anio = self.deAnio.date().toPyDate().year ventas = self.manager.obtenerVentasPorAnio(anio) resultados = [ ['ENERO',0],['FEBRERO',0],['MARZO',0],['ABRIL',0], ['MAYO',0],['JUNIO',0],['JULIO',0],['AGOSTO',0], ['SEPTIEMBRE',0],['OCTUBRE',0],['NOVIEMBRE',0], ['DICIEMBRE',0] ] monto_total = 0 # formatear fecha for idx, total in enumerate(ventas): resultados[idx][1] = "$ %8.2f" % total monto_total += total # generar tabla self.lbTotal.setText("$ %8.2f" % monto_total) self.getAtributosListaPorAnio() self._makeTable(self.twAnio) self.MyTabla.addItems(resultados) def establecerFechaHoyDateEdits(self): date_edits = [ self.dtFecha, self.deDesde, self.deHasta, self.deMesMes, self.deMesAnio, self.deAnio ] [de.setDate(datetime.datetime.today()) for de in date_edits] @QtCore.pyqtSlot() def on_btDetallesVentas_clicked(self): from pos.ventas import Ventas self.ventanita = Ventas( parent = self.parent, manager = self.managers[0], managers = [self.managers[1]] ) self.ventanita.show() @QtCore.pyqtSlot() def on_btListarPorDia_clicked(self): self.actualizarTablaDia() @QtCore.pyqtSlot() def on_btListarPorMes_clicked(self): self.actualizarTablaMes() @QtCore.pyqtSlot() def on_btListarPorAnio_clicked(self): self.actializarTablaAnio() def on_dtFecha_dateChanged(self , date): self.reflejarDatosResumenDelDia(date.toPyDate())
class InventarioGUI(BaseGUI): def __init__(self, parent, windowparent, manager, managers=[]): BaseGUI.__init__(self, parent, manager, managers) self.FILENAME = 'inventario/admin.ui' self.DialogAddClass = AddProducto locale.setlocale(locale.LC_ALL, '') self.setWindowIcon(QtGui.QIcon(':/newPrefix/logo.png')) self.ALINEACIONLISTA = ['C', 'L', 'L', 'C', 'C', 'C', 'C', 'C'] self.ATRI_COMBO_BUSQUEDA = [ { u'Descripcion del producto': Producto.descripcion }, { u'Codigo': Producto.codigo }, ] self.ATRIBUTOSLISTA = [ { u'Codigo': Producto.codigo }, { u'Categoria': Producto.categoria }, { u'Descripcion del producto': Producto.descripcion }, { u'Precio costo': Producto.precio_costo }, { u'Precio venta': Producto.precio_venta }, { u'Existencia': Producto.cantidad }, { u'Inv. Mínimo': Producto.minimo }, { u'Usa inventario': Producto.usa_inventario }, ] self.windowparent = windowparent self._operaciones_de_inicio() self.windowparent.hide() def _operaciones_de_inicio(self): self.loadUi() self.setWindowTitle(self.TITULO) self.lbTitulo.setText(self.manager.getClassName()) self._makeTable() self.cargarCombobox() self.cargarTabla() self._loadAppShortcuts() self.fullScreen = False self._centerOnScreen() self.setWindowState(QtCore.Qt.WindowMaximized) QtGui.QShortcut(QtGui.QKeySequence(QtCore.Qt.CTRL | QtCore.Qt.Key_B), self, self.leBusqueda.setFocus) self.setWindowTitle("Inventario - P.O.S.T.A.") self.lbTitulo.setText("Productos en inventario") self.cargarComboCategorias() self.lbProductosBajosExistencia.setText( "%s producto(s) bajo(s) en stock" % self.manager.cantidadProductosBajosEnExistencia()) menu = QtGui.QMenu(self.clbMas) menu.addAction(QtGui.QIcon(':newPrefix/drive-1934.png'), "Importar/Exportar...", self.on_btImportar_clicked) menu.addAction(QtGui.QIcon(':newPrefix/computer.png'), "Actualizar precios...", self._actualizarPrecios) self.clbMas.setMenu(menu) self.twDatos.setColumnWidth(3, 320) def close(self): BaseGUI.close(self) self.windowparent.show() def _makeTable(self): if not self.ATRIBUTOSLISTA: columnasTablas = [ p.capitalize() for p in self._obtener_atributos_names() ] else: self.ATRIBUTOSLISTA_CLASSNAMES = [ self.manager.obtenerNombreAtributo(p.values()[0]) for p in self.ATRIBUTOSLISTA ] columnasTablas = [p.keys()[0] for p in self.ATRIBUTOSLISTA] self.MyTabla = MyTableWidget(self.twDatos, columnasTablas, self.ALINEACIONLISTA, indexColumn=2) self.connect( self.MyTabla.widget, QtCore.SIGNAL('customContextMenuRequested(const QPoint&)'), self.on_context_menu) # REIMPLEMENT TO USE RAM def cargarTabla(self, listadeobj=None): if listadeobj == None: listadeobj = self.manager.allItems['data'] #listadeobj = self.manager.getall() listadefilas = [ self._obtenerValoresAtributos(obj) for obj in listadeobj ] self.MyTabla.addItems(listadefilas) try: self.setCantidadItems(len(listadefilas)) except AttributeError: pass # REIMPLEMENT TO USE RAM def search(self, camponame, valor): objs = self.manager.allItems['data'] attr = self.manager.obtenerNombreAtributo(camponame) valor = valor.lower() QtGui.QApplication.processEvents() results = [ obj for obj in objs if obj.__getattribute__(attr).lower().find(valor) != -1 ] return results def _obtenerValoresAtributos(self, obj): resultado = [] atributos_objeto = self.manager.getClassAttributesValues(obj) if not self.ATRIBUTOSLISTA: return atributos_objeto else: atributos_clase = self.manager.getClassAttributes() atributos_ordenados = self.ATRIBUTOSLISTA_CLASSNAMES for atributo in atributos_ordenados: resultado.append( atributos_objeto[atributos_clase.index(atributo)]) resultado[3] = "$ %8.2f" % float(resultado[3]) # precio costo resultado[4] = "$ %8.2f" % float(resultado[4]) # precio venta resultado[7] = 'SI' if resultado[7] else 'NO' # usa inventario return resultado def _filtrarPorCategoria(self, value): productos = [] if value != u'TODAS' and value != u'SIN CATEGORIA': categoriasManager = self.managers[1].manager unaCategoria = categoriasManager.obtenerPorNombre(value) productos = self.manager.obtenerPorCategoria(unaCategoria) elif value == u'SIN CATEGORIA': productos = self.manager.obtenerSinCategoria() else: productos = self.manager.allItems['data'] return productos def cargarComboCategorias(self): categorias = self.managers[1].manager.getall() self.cbCategorias.addItem(u'TODAS') self.cbCategorias.addItem(u'SIN CATEGORIA') categorias = [categoria.nombre for categoria in categorias] categorias.sort() [self.cbCategorias.addItem(cat) for cat in categorias] def _itemTableSelected(self): producto = self.actual_rows_to_objects() if producto: producto = producto[0] self.lbProductoNombre.setText(producto.descripcion) self.lbProductoPrecioVenta.setText("$ %8.2f" % float(producto.precio_venta)) self.lbProductoPrecioCosto.setText("$ %8.2f" % float(producto.precio_costo)) self.lbProductoExistencia.setText(str(producto.cantidad)) @QtCore.pyqtSlot() def on_btCategorias_clicked(self): _productosGUI = self.managers[0] _categoriasGUI = _productosGUI.managers[0] _categoriasGUI.show() @QtCore.pyqtSlot() def on_btImportar_clicked(self): from importar_exportar import ImportarExportar self.ie = ImportarExportar(self) self.ie.show() @QtCore.pyqtSlot() def on_btAgregarInventario_clicked(self): item = self.actual_rows_to_objects() if item: item = item[0] from addinventario import AddInventario self.ai = AddInventario(self.parent, self.manager, item) self.ai.postMethod = self.recargarLista self.ai.show() def on_btProductosBajosEnStock_toggled(self, value): if value: productos = self.manager.productosBajosEnStock() self.cargarTabla(productos) else: self.cargarTabla() @QtCore.pyqtSlot(int) def on_cbCategorias_currentIndexChanged(self, index): value = unicode(self.cbCategorias.itemText(index).toUtf8(), 'utf-8') self.cargarTabla(self._filtrarPorCategoria(value)) def on_twDatos_currentItemChanged(self, item_a, item_b): self._itemTableSelected() def on_twDatos_itemClicked(self, item): self._itemTableSelected() def _actualizarPrecios(self): from actualizar_precios import ActualizarPrecios self.ap = ActualizarPrecios(self) self.ap.show()
def makeTableTicket(self): columnasTablas = [p.keys()[0] for p in self.ATRIBUTOSLISTA_TICKET] self.tablaTicket = MyTableWidget(self.twTicket, columnasTablas, self.ALINEACIONLISTA_TICKET, indexColumn = 2, widthColumn = 600)
class POS ( BaseGUI ): ### ### BASE METODOS ### def __init__(self, parent, windowparent, manager, managers = []): BaseGUI.__init__(self, parent, manager, managers) self.setWindowIcon(QtGui.QIcon(':newPrefix/desktop_icon/posta_icon_128.png')) self.FILENAME = 'pos/pos.ui' self.ATRI_COMBO_BUSQUEDA = [ {u'DESCRIPCION':Producto.descripcion}, {u'CODIGO':Producto.codigo} ] self.ALINEACIONLISTA = ['C','L','C','C'] self.ALINEACIONLISTA_TICKET = ['C','C','L','C','C'] self.ATRIBUTOSLISTA = [ {u'Codigo':Producto.codigo}, {u'Descripcion del producto':Producto.descripcion}, #{u'Existencia':Producto.cantidad}, {u'Precio':Producto.precio_venta}, ] self.ATRIBUTOSLISTA_TICKET = [ {u'Codigo':Producto.codigo}, {u'Cantidad':Producto.codigo}, {u'Descripcion del producto':Producto.descripcion}, {u'Precio':Producto.precio_venta}, {u'Subtotal':Producto.precio_venta}, ] self.tablaTicket = None self.parent = parent self.windowparent = windowparent self._operaciones_de_inicio() self.windowparent.hide() # managers instance self.ventasManager = managers[0] def _operaciones_de_inicio(self): u''' operaciones necesarias para levantar las ventanas ''' self.loadUi() self._makeTable() # tabla busqueda self.makeTableTicket() self.cargarCombobox() self._loadAppShortcuts() self.menuMasAtajos() self.fullScreen = False self._centerOnScreen() self.setWindowState(QtCore.Qt.WindowMaximized) self.setWindowTitle("Punto de venta - P.O.S.T.A.") self.leBusqueda.setFocus() def _makeTable(self): if not self.ATRIBUTOSLISTA : columnasTablas = [p.capitalize() for p in self._obtener_atributos_names()] else: self.ATRIBUTOSLISTA_CLASSNAMES = [ self.manager.obtenerNombreAtributo( p.values()[0] ) for p in self.ATRIBUTOSLISTA] columnasTablas = [p.keys()[0] for p in self.ATRIBUTOSLISTA] self.MyTabla = MyTableWidget(self.twDatos, columnasTablas, self.ALINEACIONLISTA, indexColumn = 1, widthColumn = 600) def close(self): self.ventasManager.cancelarVenta() BaseGUI.close(self) self.windowparent.show() def _obtenerValoresAtributos(self,obj): resultado = [] atributos_objeto = self.manager.getClassAttributesValues(obj) if not self.ATRIBUTOSLISTA : return atributos_objeto else: atributos_clase = self.manager.getClassAttributes() atributos_ordenados = self.ATRIBUTOSLISTA_CLASSNAMES for atributo in atributos_ordenados: resultado.append( atributos_objeto[ atributos_clase.index( atributo ) ] ) # ['categoria', 'cantidad', 'precio_costo', 'minimo', 'precio_venta', 'usa_inventario', 'descripcion', 'codigo'] usa_inventario = atributos_objeto[ atributos_clase.index( 'usa_inventario' ) ] #resultado[2] = int(resultado[2]) if usa_inventario else '-' resultado[2] = "%8.2f" % float(resultado[2]) return resultado # REIMPLEMENT TO USE RAM def cargarTabla(self,listadeobj = None): if listadeobj == None: listadeobj = self.manager.allItems['data'] #listadeobj = self.manager.getall() listadefilas = [self._obtenerValoresAtributos(obj) for obj in listadeobj] self.MyTabla.addItems(listadefilas) try: self.setCantidadItems(len(listadefilas)) except AttributeError : pass # REIMPLEMENT TO USE RAM def search(self, camponame, valor): objs = self.manager.allItems['data'] attr = self.manager.obtenerNombreAtributo(camponame) valor = valor.lower() QtGui.QApplication.processEvents() results = [ obj for obj in objs if obj.__getattribute__(attr) .lower().find(valor) != -1] return results def makeTableTicket(self): columnasTablas = [p.keys()[0] for p in self.ATRIBUTOSLISTA_TICKET] self.tablaTicket = MyTableWidget(self.twTicket, columnasTablas, self.ALINEACIONLISTA_TICKET, indexColumn = 2, widthColumn = 600) def _loadAppShortcuts(self): BaseGUI._loadAppShortcuts(self) QtGui.QShortcut(QtGui.QKeySequence(QtCore.Qt.CTRL+QtCore.Qt.Key_1), self, self.focoBusqueda) QtGui.QShortcut(QtGui.QKeySequence(QtCore.Qt.CTRL+QtCore.Qt.Key_2), self, lambda: self.twDatos.setFocus()) QtGui.QShortcut(QtGui.QKeySequence(QtCore.Qt.CTRL+QtCore.Qt.Key_3), self, lambda: self.twTicket.setFocus()) QtGui.QShortcut(QtGui.QKeySequence(QtCore.Qt.Key_F12), self, self.on_cmdRegistrarVenta_clicked) QtGui.QShortcut(QtGui.QKeySequence(QtCore.Qt.Key_F10), self, self.on_cmdCancelarVenta_clicked) QtGui.QShortcut(QtGui.QKeySequence(QtCore.Qt.Key_F2), self, self.on_cmdVarios_clicked) QtGui.QShortcut(QtGui.QKeySequence(QtCore.Qt.Key_F6), self, self.on_cmdArtComun_clicked) QtGui.QShortcut(QtGui.QKeySequence(QtCore.Qt.Key_F7), self, self.on_cmdEntradas_clicked) QtGui.QShortcut(QtGui.QKeySequence(QtCore.Qt.Key_F8), self, self.on_cmdSalidas_clicked) QtGui.QShortcut(QtGui.QKeySequence(QtCore.Qt.Key_F4), self, self.on_cmdBorrarArticulo_clicked) ### ### LOGIC ATAJOS METODOS ### def menuMasAtajos(self): menu = QtGui.QMenu(self.cmdMasAtajos) #~ proveedor = menu.addAction("Proveedor") # database= menu.addAction("Database") # busqueda = menu.addAction("Busqueda") #~ menu.addSeparator() #~ menu.addAction("Mostrar productos favoritos") menu.addAction("Ver combinaciones de teclas", self.showCombTeclas) menu.addAction("Detalle de ventas", self.showDetalleVentas) # menu.addSeparator() # menu.addAction("Acerca de..") #~ menu_proveedor = QtGui.QMenu() #~ menu_proveedor.addAction("Agregar nueva deuda") #~ menu_proveedor.addAction("Registrar pago de una deuda") #~ proveedor.setMenu(menu_proveedor) self.cmdMasAtajos.setMenu(menu) def showCombTeclas(self): from comb_teclas import CombinacionesDeTeclas self.ventanita = CombinacionesDeTeclas(self.parent) self.ventanita.show() def showDetalleVentas(self): from pos.ventas import Ventas self.ventanita = Ventas( parent = self.parent, manager = self.ventasManager, managers = [self.managers[3]] ) self.ventanita.show() def focoBusqueda(self): self.leBusqueda.selectAll() self.leBusqueda.setFocus() ### ### LOGIC VENTA METODOS ### def getItemsTicket(self): # genera una lista de lista con el formato como para cargarce en la tabla items = [] productos = self.ventasManager.productosActuales() for producto in productos : cantidad = self.ventasManager.obtenerCantidadProducto(producto) subtotal = "%8.2f" % (cantidad * producto.precio_venta) items.append([ producto.codigo, cantidad, producto.descripcion, "%8.2f" % producto.precio_venta, subtotal ]) return items def agregarProductoAVenta(self, producto): self.ventasManager.agregarRenglon(producto) self.lbTotal.setText("$ %8.2f" % self.ventasManager.obtenerTotal()) self.tablaTicket.addItems(self.getItemsTicket()) self.actualizarCantidadProductos() def reestablecerCampos(self): self.lbTotal.setText('$ 00.00') self.tablaTicket.fullClear() self.actualizarCantidadProductos() self.recargarLista() self.leBusqueda.setFocus() def actualizarCantidadProductos(self): cantidad = self.ventasManager.obtenerCantidadProductos() self.lbCantidadProductos.setText("%s productos en la venta actual" % cantidad) def cambiarCantidadProducto(self, producto, cantidad): self.ventasManager.cambiarCantidadProducto(producto, cantidad) self.tablaTicket.addItems(self.getItemsTicket()) self.actualizarCantidadProductos() self.lbTotal.setText("$ %8.2f" % self.ventasManager.obtenerTotal()) ############################################################################### ###### GUI METHODS ############################################################################### ### ### TABLA BUSQUEDA METODOS ### def on_twDatos_itemActivated(self , item): producto = self.actual_rows_to_objects() if producto: producto = producto[0] if producto.usa_inventario and producto.cantidad == 0: QtGui.QMessageBox.warning(self, u" ",u"No posee mas stock en inventario de este producto.") elif self.ventasManager.obtenerCantidadProducto(producto) == producto.cantidad: if not producto.usa_inventario: self.agregarProductoAVenta(producto) else: QtGui.QMessageBox.warning(self, u" ",u"No queda mas stock de este producto, para poder agregarse a la venta.") else: self.agregarProductoAVenta(producto) ### ### ATAJOS METODOS ### @QtCore.pyqtSlot() def on_cmdRegistrarVenta_clicked(self): if self.ventasManager.obtenerCantidadProductos() > 0 : from cobrar import Cobrar self.cobrar = Cobrar(self,self.ventasManager) self.cobrar.show() @QtCore.pyqtSlot() def on_cmdCancelarVenta_clicked(self): if self.ventasManager.obtenerCantidadProductos() > 0 : result = QtGui.QMessageBox.warning(self, u"Cancelar venta ", u"¿Esta seguro que desea cancelar?", QtGui.QMessageBox.Yes, QtGui.QMessageBox.No) if result == QtGui.QMessageBox.Yes: self.ventasManager.cancelarVenta() self.reestablecerCampos() @QtCore.pyqtSlot() def on_cmdVarios_clicked(self): if self.twTicket.currentItem(): index_item = self.twTicket.currentItem().row() producto, cantidad = self.ventasManager.obtenerRenglon(index_item) if producto: from varios import Varios self.ventanita = Varios(self, producto, cantidad) self.ventanita.show() @QtCore.pyqtSlot() def on_cmdArtComun_clicked(self): from articulo_comun import ArticuloComun self.ventanita = ArticuloComun(self) self.ventanita.show() @QtCore.pyqtSlot() def on_cmdEntradas_clicked(self): entradaGUI = self.managers[1] entradaGUI.on_btAgregar_clicked() @QtCore.pyqtSlot() def on_cmdSalidas_clicked(self): salidaGUI = self.managers[2] salidaGUI.on_btAgregar_clicked() @QtCore.pyqtSlot() def on_cmdBorrarArticulo_clicked(self): if self.twTicket.currentItem() : index_item = self.twTicket.currentItem().row() producto = self.ventasManager.obtenerRenglon(index_item)[0] if producto: result = QtGui.QMessageBox.warning(self, u"Confirmar", u"¿Borrar este producto de la venta?", QtGui.QMessageBox.Yes, QtGui.QMessageBox.No) if result == QtGui.QMessageBox.Yes: self.ventasManager.quitarRenglon(producto) self.lbTotal.setText("$ %8.2f" % self.ventasManager.obtenerTotal()) self.tablaTicket.addItems(self.getItemsTicket()) self.actualizarCantidadProductos() @QtCore.pyqtSlot() def on_cmdMasAtajos_clicked(self): pass
class POS(BaseGUI): ### ### BASE METODOS ### def __init__(self, parent, windowparent, manager, managers=[]): BaseGUI.__init__(self, parent, manager, managers) self.setWindowIcon( QtGui.QIcon(':newPrefix/desktop_icon/posta_icon_128.png')) self.FILENAME = 'pos/pos.ui' self.ATRI_COMBO_BUSQUEDA = [{ u'DESCRIPCION': Producto.descripcion }, { u'CODIGO': Producto.codigo }] self.ALINEACIONLISTA = ['C', 'L', 'C', 'C'] self.ALINEACIONLISTA_TICKET = ['C', 'C', 'L', 'C', 'C'] self.ATRIBUTOSLISTA = [ { u'Codigo': Producto.codigo }, { u'Descripcion del producto': Producto.descripcion }, #{u'Existencia':Producto.cantidad}, { u'Precio': Producto.precio_venta }, ] self.ATRIBUTOSLISTA_TICKET = [ { u'Codigo': Producto.codigo }, { u'Cantidad': Producto.codigo }, { u'Descripcion del producto': Producto.descripcion }, { u'Precio': Producto.precio_venta }, { u'Subtotal': Producto.precio_venta }, ] self.tablaTicket = None self.parent = parent self.windowparent = windowparent self._operaciones_de_inicio() self.windowparent.hide() # managers instance self.ventasManager = managers[0] def _operaciones_de_inicio(self): u''' operaciones necesarias para levantar las ventanas ''' self.loadUi() self._makeTable() # tabla busqueda self.makeTableTicket() self.cargarCombobox() self._loadAppShortcuts() self.menuMasAtajos() self.fullScreen = False self._centerOnScreen() self.setWindowState(QtCore.Qt.WindowMaximized) self.setWindowTitle("Punto de venta - P.O.S.T.A.") self.leBusqueda.setFocus() def _makeTable(self): if not self.ATRIBUTOSLISTA: columnasTablas = [ p.capitalize() for p in self._obtener_atributos_names() ] else: self.ATRIBUTOSLISTA_CLASSNAMES = [ self.manager.obtenerNombreAtributo(p.values()[0]) for p in self.ATRIBUTOSLISTA ] columnasTablas = [p.keys()[0] for p in self.ATRIBUTOSLISTA] self.MyTabla = MyTableWidget(self.twDatos, columnasTablas, self.ALINEACIONLISTA, indexColumn=1, widthColumn=600) def close(self): self.ventasManager.cancelarVenta() BaseGUI.close(self) self.windowparent.show() def _obtenerValoresAtributos(self, obj): resultado = [] atributos_objeto = self.manager.getClassAttributesValues(obj) if not self.ATRIBUTOSLISTA: return atributos_objeto else: atributos_clase = self.manager.getClassAttributes() atributos_ordenados = self.ATRIBUTOSLISTA_CLASSNAMES for atributo in atributos_ordenados: resultado.append( atributos_objeto[atributos_clase.index(atributo)]) # ['categoria', 'cantidad', 'precio_costo', 'minimo', 'precio_venta', 'usa_inventario', 'descripcion', 'codigo'] usa_inventario = atributos_objeto[atributos_clase.index( 'usa_inventario')] #resultado[2] = int(resultado[2]) if usa_inventario else '-' resultado[2] = "%8.2f" % float(resultado[2]) return resultado # REIMPLEMENT TO USE RAM def cargarTabla(self, listadeobj=None): if listadeobj == None: listadeobj = self.manager.allItems['data'] #listadeobj = self.manager.getall() listadefilas = [ self._obtenerValoresAtributos(obj) for obj in listadeobj ] self.MyTabla.addItems(listadefilas) try: self.setCantidadItems(len(listadefilas)) except AttributeError: pass # REIMPLEMENT TO USE RAM def search(self, camponame, valor): objs = self.manager.allItems['data'] attr = self.manager.obtenerNombreAtributo(camponame) valor = valor.lower() QtGui.QApplication.processEvents() results = [ obj for obj in objs if obj.__getattribute__(attr).lower().find(valor) != -1 ] return results def makeTableTicket(self): columnasTablas = [p.keys()[0] for p in self.ATRIBUTOSLISTA_TICKET] self.tablaTicket = MyTableWidget(self.twTicket, columnasTablas, self.ALINEACIONLISTA_TICKET, indexColumn=2, widthColumn=600) def _loadAppShortcuts(self): BaseGUI._loadAppShortcuts(self) QtGui.QShortcut(QtGui.QKeySequence(QtCore.Qt.CTRL + QtCore.Qt.Key_1), self, self.focoBusqueda) QtGui.QShortcut(QtGui.QKeySequence(QtCore.Qt.CTRL + QtCore.Qt.Key_2), self, lambda: self.twDatos.setFocus()) QtGui.QShortcut(QtGui.QKeySequence(QtCore.Qt.CTRL + QtCore.Qt.Key_3), self, lambda: self.twTicket.setFocus()) QtGui.QShortcut(QtGui.QKeySequence(QtCore.Qt.Key_F12), self, self.on_cmdRegistrarVenta_clicked) QtGui.QShortcut(QtGui.QKeySequence(QtCore.Qt.Key_F10), self, self.on_cmdCancelarVenta_clicked) QtGui.QShortcut(QtGui.QKeySequence(QtCore.Qt.Key_F2), self, self.on_cmdVarios_clicked) QtGui.QShortcut(QtGui.QKeySequence(QtCore.Qt.Key_F6), self, self.on_cmdArtComun_clicked) QtGui.QShortcut(QtGui.QKeySequence(QtCore.Qt.Key_F7), self, self.on_cmdEntradas_clicked) QtGui.QShortcut(QtGui.QKeySequence(QtCore.Qt.Key_F8), self, self.on_cmdSalidas_clicked) QtGui.QShortcut(QtGui.QKeySequence(QtCore.Qt.Key_F4), self, self.on_cmdBorrarArticulo_clicked) ### ### LOGIC ATAJOS METODOS ### def menuMasAtajos(self): menu = QtGui.QMenu(self.cmdMasAtajos) #~ proveedor = menu.addAction("Proveedor") # database= menu.addAction("Database") # busqueda = menu.addAction("Busqueda") #~ menu.addSeparator() #~ menu.addAction("Mostrar productos favoritos") menu.addAction("Ver combinaciones de teclas", self.showCombTeclas) menu.addAction("Detalle de ventas", self.showDetalleVentas) # menu.addSeparator() # menu.addAction("Acerca de..") #~ menu_proveedor = QtGui.QMenu() #~ menu_proveedor.addAction("Agregar nueva deuda") #~ menu_proveedor.addAction("Registrar pago de una deuda") #~ proveedor.setMenu(menu_proveedor) self.cmdMasAtajos.setMenu(menu) def showCombTeclas(self): from comb_teclas import CombinacionesDeTeclas self.ventanita = CombinacionesDeTeclas(self.parent) self.ventanita.show() def showDetalleVentas(self): from pos.ventas import Ventas self.ventanita = Ventas(parent=self.parent, manager=self.ventasManager, managers=[self.managers[3]]) self.ventanita.show() def focoBusqueda(self): self.leBusqueda.selectAll() self.leBusqueda.setFocus() ### ### LOGIC VENTA METODOS ### def getItemsTicket(self): # genera una lista de lista con el formato como para cargarce en la tabla items = [] productos = self.ventasManager.productosActuales() for producto in productos: cantidad = self.ventasManager.obtenerCantidadProducto(producto) subtotal = "%8.2f" % (cantidad * producto.precio_venta) items.append([ producto.codigo, cantidad, producto.descripcion, "%8.2f" % producto.precio_venta, subtotal ]) return items def agregarProductoAVenta(self, producto): self.ventasManager.agregarRenglon(producto) self.lbTotal.setText("$ %8.2f" % self.ventasManager.obtenerTotal()) self.tablaTicket.addItems(self.getItemsTicket()) self.actualizarCantidadProductos() def reestablecerCampos(self): self.lbTotal.setText('$ 00.00') self.tablaTicket.fullClear() self.actualizarCantidadProductos() self.recargarLista() self.leBusqueda.setFocus() def actualizarCantidadProductos(self): cantidad = self.ventasManager.obtenerCantidadProductos() self.lbCantidadProductos.setText("%s productos en la venta actual" % cantidad) def cambiarCantidadProducto(self, producto, cantidad): self.ventasManager.cambiarCantidadProducto(producto, cantidad) self.tablaTicket.addItems(self.getItemsTicket()) self.actualizarCantidadProductos() self.lbTotal.setText("$ %8.2f" % self.ventasManager.obtenerTotal()) ############################################################################### ###### GUI METHODS ############################################################################### ### ### TABLA BUSQUEDA METODOS ### def on_twDatos_itemActivated(self, item): producto = self.actual_rows_to_objects() if producto: producto = producto[0] if producto.usa_inventario and producto.cantidad == 0: QtGui.QMessageBox.warning( self, u" ", u"No posee mas stock en inventario de este producto.") elif self.ventasManager.obtenerCantidadProducto( producto) == producto.cantidad: if not producto.usa_inventario: self.agregarProductoAVenta(producto) else: QtGui.QMessageBox.warning( self, u" ", u"No queda mas stock de este producto, para poder agregarse a la venta." ) else: self.agregarProductoAVenta(producto) ### ### ATAJOS METODOS ### @QtCore.pyqtSlot() def on_cmdRegistrarVenta_clicked(self): if self.ventasManager.obtenerCantidadProductos() > 0: from cobrar import Cobrar self.cobrar = Cobrar(self, self.ventasManager) self.cobrar.show() @QtCore.pyqtSlot() def on_cmdCancelarVenta_clicked(self): if self.ventasManager.obtenerCantidadProductos() > 0: result = QtGui.QMessageBox.warning( self, u"Cancelar venta ", u"¿Esta seguro que desea cancelar?", QtGui.QMessageBox.Yes, QtGui.QMessageBox.No) if result == QtGui.QMessageBox.Yes: self.ventasManager.cancelarVenta() self.reestablecerCampos() @QtCore.pyqtSlot() def on_cmdVarios_clicked(self): if self.twTicket.currentItem(): index_item = self.twTicket.currentItem().row() producto, cantidad = self.ventasManager.obtenerRenglon(index_item) if producto: from varios import Varios self.ventanita = Varios(self, producto, cantidad) self.ventanita.show() @QtCore.pyqtSlot() def on_cmdArtComun_clicked(self): from articulo_comun import ArticuloComun self.ventanita = ArticuloComun(self) self.ventanita.show() @QtCore.pyqtSlot() def on_cmdEntradas_clicked(self): entradaGUI = self.managers[1] entradaGUI.on_btAgregar_clicked() @QtCore.pyqtSlot() def on_cmdSalidas_clicked(self): salidaGUI = self.managers[2] salidaGUI.on_btAgregar_clicked() @QtCore.pyqtSlot() def on_cmdBorrarArticulo_clicked(self): if self.twTicket.currentItem(): index_item = self.twTicket.currentItem().row() producto = self.ventasManager.obtenerRenglon(index_item)[0] if producto: result = QtGui.QMessageBox.warning( self, u"Confirmar", u"¿Borrar este producto de la venta?", QtGui.QMessageBox.Yes, QtGui.QMessageBox.No) if result == QtGui.QMessageBox.Yes: self.ventasManager.quitarRenglon(producto) self.lbTotal.setText("$ %8.2f" % self.ventasManager.obtenerTotal()) self.tablaTicket.addItems(self.getItemsTicket()) self.actualizarCantidadProductos() @QtCore.pyqtSlot() def on_cmdMasAtajos_clicked(self): pass