Ejemplo n.º 1
0
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()
Ejemplo n.º 2
0
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())
Ejemplo n.º 3
0
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
Ejemplo n.º 4
0
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()
Ejemplo n.º 5
0
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