Esempio n. 1
0
 def agregarProducto(self):
     itemActual=self.tableProductos.currentItem()
     if itemActual==None:
         self.showMsjEstado("No se ha seleccionado ningun producto para agregar")
     else:
         cantidad, ok = QtGui.QInputDialog.getInt(self,"Cantidad","Ingrese cantidad del producto",1,1,2000,5)
         if not ok:
             self.showMsjEstado("No se ha seleccionado cantidad del producto")
         else:
             if cantidad>int(self.tableProductos.item(itemActual.row(),4).text()):
                 self.showMsjEstado("La cantidad seleccionada es mayor a la actual")
             else:
                 rowItemActual=itemActual.row()
                 rows=self.tableRemito.rowCount()
                 if self.productosAgregados==0:
                     self.remito=RemitoModel(RemitoModel.obtenerNumero(self.sesion),int(self.lineDni.text()))
                     self.remito.guardar(self.sesion)
                 self.productosAgregados+=1
                 self.tableRemito.insertRow(rows)
                 self.tableRemito.setItem(rows, 0, QtGui.QTableWidgetItem(str(self.tableProductos.item(rowItemActual,0).text())))
                 self.tableRemito.setItem(rows, 1, QtGui.QTableWidgetItem(str(cantidad)))
                 self.tableRemito.setItem(rows, 2, QtGui.QTableWidgetItem(str(cantidad*float(self.tableProductos.item(rowItemActual,5).text()))))
                 self.detalle=DetalleRemitoModel(self.remito.numero,self.productosAgregados,
                     int(self.tableProductos.item(rowItemActual,0).text()),cantidad)
                 self.descontarCantidad(self.detalle,int(self.tableProductos.item(rowItemActual,0).text()),cantidad)
                 self.detalle.guardar(self.sesion)
                 self.limpiarTabla(self.tableProductos)
                 self.cargar_productos()
Esempio n. 2
0
 def buscarRemito(self):
     if self.lineNumero.isEnabled():
         numeroRemito=self.lineNumero.text()
         if len(numeroRemito)==0:
             self.showMsjEstado("No se ha ingresado numero de remito")
         else:
             self.remitoActual=RemitoModel.existeRemito(int(numeroRemito),self.sesion)
             if self.remitoActual== None:
                 QtGui.QMessageBox.warning(self,"Advertencia","El remito ingresado no existe")
             else:
                 if self.remitoActual.estoyCobrado()!=None:
                     QtGui.QMessageBox.information(self,"Aviso","El remito ingresado ya sido cobrado")
                 else:
                     detallesRemitos=RemitoModel.buscarDetalles(int(numeroRemito),self.sesion)
                     self.limpiarTabla(self.tableRemitos)
                     self.cargarObjetos(self.tableRemitos,
                         detallesRemitos,("producto","cantidad")
                     )
                     importes=[]
                     for a in detallesRemitos:
                         for b in self.sesion.query(ProductoModel).filter(ProductoModel.codigo_barra==a.producto):
                             importes.append(b.importe * a.cantidad)
                     for row in range(0,self.tableRemitos.rowCount()):
                         self.tableRemitos.setItem(row, 2, QtGui.QTableWidgetItem(str(importes[row])))
                     self.lineNumero.setEnabled(False)
     else:
         self.lineNumero.clear()
         self.lineNumero.setEnabled(True)
         self.limpiarTabla(self.tableRemitos)
Esempio n. 3
0
 def agregarProducto(self):
     itemActual = self.tableProductos.currentItem()
     if itemActual == None:
         self.showMsjEstado(
             "No se ha seleccionado ningun producto para agregar")
     else:
         cantidad, ok = QtGui.QInputDialog.getInt(
             self, "Cantidad", "Ingrese cantidad del producto", 1, 1, 2000,
             5)
         if not ok:
             self.showMsjEstado(
                 "No se ha seleccionado cantidad del producto")
         else:
             if cantidad > int(
                     self.tableProductos.item(itemActual.row(), 4).text()):
                 self.showMsjEstado(
                     "La cantidad seleccionada es mayor a la actual")
             else:
                 rowItemActual = itemActual.row()
                 rows = self.tableRemito.rowCount()
                 if self.productosAgregados == 0:
                     self.remito = RemitoModel(
                         RemitoModel.obtenerNumero(self.sesion),
                         int(self.lineDni.text()))
                     self.remito.guardar(self.sesion)
                 self.productosAgregados += 1
                 self.tableRemito.insertRow(rows)
                 self.tableRemito.setItem(
                     rows, 0,
                     QtGui.QTableWidgetItem(
                         str(
                             self.tableProductos.item(rowItemActual,
                                                      0).text())))
                 self.tableRemito.setItem(
                     rows, 1, QtGui.QTableWidgetItem(str(cantidad)))
                 self.tableRemito.setItem(
                     rows, 2,
                     QtGui.QTableWidgetItem(
                         str(cantidad * float(
                             self.tableProductos.item(rowItemActual,
                                                      5).text()))))
                 self.detalle = DetalleRemitoModel(
                     self.remito.numero, self.productosAgregados,
                     int(self.tableProductos.item(rowItemActual, 0).text()),
                     cantidad)
                 self.descontarCantidad(
                     self.detalle,
                     int(self.tableProductos.item(rowItemActual, 0).text()),
                     cantidad)
                 self.detalle.guardar(self.sesion)
                 self.limpiarTabla(self.tableProductos)
                 self.cargar_productos()
Esempio n. 4
0
 def cargar_remitos(self):
     """
         Carga los remitos que se encuentran en el sistema
         en la tabla correspondiente
     :return:
     """
     self.limpiarTabla(self.tableRemito)
     self.cargarObjetos(self.tableRemito,
         RemitoModel.obtenerTodosRemitos(self.sesion).all(),
         ("numero", "cliente", "fecha_emision")
     )
Esempio n. 5
0
    def eliminarDetalle(self):
        itemActual = self.tableDetalles.currentItem()
        ok = QtGui.QMessageBox.information(self, "Confirmacion",
                                           "¿Desea eliminar este item?")
        if ok:
            linea = int(self.tableDetalles.item(itemActual.row(), 0).text())
            producto = int(self.tableDetalles.item(itemActual.row(), 1).text())
            cantidadRemito = int(
                self.tableDetalles.item(itemActual.row(), 2).text())
            finalizeActualizacion = False
            while not finalizeActualizacion:
                cantidad, ok = QtGui.QInputDialog.getInt(
                    self, "Cantidad", "Ingrese cantidad del producto", 1, 1,
                    2000, 5)
                if not ok:
                    QtGui.QMessageBox.information(self, "Aviso",
                                                  "No se ingreso cantidad")
                else:
                    if cantidad > cantidadRemito:
                        QtGui.QMessageBox.information(
                            self, "Aviso",
                            "La cantidad ingresada supera la esperada")
                    else:
                        lote, ok = QtGui.QInputDialog.getText(
                            self, "Lote", "Ingrese lote")
                        if not ok:
                            QtGui.QMessageBox.information(
                                self, "Aviso", "No se ingreso lote")
                        else:
                            loteP = LoteProductoModel.buscarLoteProducto(
                                self.sesion, producto, str(lote)).first()
                            if loteP == None:
                                QtGui.QMessageBox.information(
                                    self, "Aviso",
                                    "El lote ingresado no se corresponde con el producto"
                                )
                            else:
                                loteP.aumentarCantidad(cantidad)
                                loteP.modificar(self.sesion)
                                cantidadRemito -= cantidad
                                self.tableDetalles.item(
                                    itemActual.row(),
                                    2).setText(str(cantidadRemito))
                                if cantidadRemito == 0:
                                    finalizeActualizacion = True
            detalle = RemitoModel.getDetalle(int(self.lineNumero.text()),
                                             int(linea), self.sesion).first()
            detalle.borrar(self.sesion)
            self.tableDetalles.removeRow(itemActual.row())

        else:
            return
Esempio n. 6
0
 def eliminar(self):
     itemActual=self.tableRemito.currentItem()
     if itemActual==None:
         self.showMsjEstado("No se ha seleccionado remito para eliminar")
     else:
         numeroRemito=int(self.tableRemito.item(itemActual.row(),0).text())
         remitoSeleccionado=RemitoModel.buscar(RemitoModel.numero,self.sesion,numeroRemito).first()
         if self.tableDetalles.rowCount()==0:
             remitoSeleccionado.borrar(self.sesion)
             self.tableRemito.removeRow(itemActual.row())
             self.objectDeleted.emit()
             self.limpiarVentana()
         else:
             QtGui.QMessageBox.information(self,"Aviso","Debe dar de baja cada detalle")
Esempio n. 7
0
    def eliminarDetalle(self):
        """
            Elimina un detalle especifico del remito seleccionado por el usuario
        :return:
        """
        rowActual=self.tableDetalles.currentItem().row()
        signal = QtGui.QMessageBox.information(self,"Confirmacion","¿Desea eliminar este item?",\
                                               QtGui.QMessageBox.Close | QtGui.QMessageBox.Ok)

        if signal == QtGui.QMessageBox.Ok:

            cantidad_detalle = int(self.tableDetalles.item(rowActual,2).text())
            linea = int(self.tableDetalles.item(rowActual,0).text())
            nro_remito = int(self.lineNumero.text())
            detalle = RemitoModel.getDetalle(nro_remito,linea,self.sesion)
            lotes_detalle = detalle.devolverLotes(self.sesion)
            temp = lotes_detalle

            finalize_actualizacion = False
            cantidad_restante = cantidad_detalle

            while not finalize_actualizacion:

                cantidad, ok = QtGui.QInputDialog.getInt(self,"Cantidad","Ingrese cantidad del producto",1,1,2000,5)
                if ok == False:
                    finalize_actualizacion = True
                    self.tableDetalles.item(rowActual,2).setText(str(cantidad_detalle))
                    break
                lote, ok=QtGui.QInputDialog.getText(self,"Lote","Ingrese lote")
                if ok == False:
                    finalize_actualizacion = True
                    self.tableDetalles.item(rowActual,2).setText(str(cantidad_detalle))
                    break
                if not lote in lotes_detalle.keys():
                    QtGui.QMessageBox.information(self,"Aviso","El lote ingresado no es valido para este detalle")
                elif lotes_detalle[str(lote)] == 0:
                    QtGui.QMessageBox.information(self,"Aviso","Los productos de este lote ya han sido devueltos")
                elif cantidad > lotes_detalle[str(lote)]:
                    QtGui.QMessageBox.information(self,"Aviso","La cantidad ingresada es mayor a la esperada para este lote")
                else:
                    temp[str(lote)] -= cantidad
                    cantidad_restante -= cantidad
                    self.tableDetalles.item(rowActual,2).setText(str(cantidad_restante))

                    if sum(map(lambda x: temp[x],temp)) == 0:
                        detalle.devolver(self.sesion)
                        self.tableDetalles.removeRow(rowActual)
                        self.objectModified.emit()
                        QtGui.QMessageBox.information(self,"Aviso","Detalle Eliminado Exitosamente")
                        finalize_actualizacion = True
Esempio n. 8
0
    def buscarRemito(self):
        """
            Busca el remito ingresado por el usuario. Si existe carga los detalles
            del mismo. Si existe pero ya fue cobrado o si no existe, se le notifica
            al usuario.
        :return:
        """

        if self.lineNumero.isEnabled():
            numeroRemito=self.lineNumero.text()
            if len(numeroRemito)==0:
                QtGui.QMessageBox.information(self,"Aviso","No se ha ingresado numero de remito")
            else:
                self.remitoActual = RemitoModel.existeRemito(int(numeroRemito),self.sesion)
                if self.remitoActual== None:
                    QtGui.QMessageBox.warning(self,"Aviso","El remito ingresado no existe")
                elif self.remitoActual.getCobrado() == True:
                    QtGui.QMessageBox.information(self,"Aviso","El remito ya ha sido cobrado")
                elif self.remitoActual in self.remitosCobrados:
                    QtGui.QMessageBox.information(self,"Aviso","El remito ya ha sido agregado a la factura")
                else:
                    detallesRemitos=RemitoModel.buscarDetalles(int(numeroRemito),self.sesion)
                    self.limpiarTabla(self.tableRemitos)
                    self.cargarObjetos(self.tableRemitos,
                        detallesRemitos,("producto","cantidad")
                    )
                    importes=[]
                    for a in detallesRemitos:
                        for b in self.sesion.query(ProductoModel).filter(ProductoModel.codigo_barra==a.producto):
                            importes.append(b.importe * a.cantidad)
                    for row in range(0,self.tableRemitos.rowCount()):
                        self.tableRemitos.setItem(row, 2, QtGui.QTableWidgetItem(str(importes[row])))
                    self.lineNumero.setEnabled(False)
        else:
            self.lineNumero.clear()
            self.lineNumero.setEnabled(True)
            self.limpiarTabla(self.tableRemitos)
Esempio n. 9
0
    def agregarProducto(self):
        """
            Agrega un producto seleccionado al Remito creado
        :return:
        """
        itemActual=self.tableProductos.currentItem()
        if itemActual==None:
            QtGui.QMessageBox.information(self,"Aviso", "No se ha seleccionado ningun producto para agregar")
        else:
            cantidad, ok = QtGui.QInputDialog.getInt(self,"Cantidad","Ingrese cantidad del producto",1,1,2000,5)
            if not ok:
                self.showMsjEstado("No se ha seleccionado cantidad del producto")
            else:
                if cantidad>int(self.tableProductos.item(itemActual.row(),4).text()):
                    self.showMsjEstado("La cantidad seleccionada es mayor a la actual")
                else:
                    rowItemActual=itemActual.row()
                    rows=self.tableRemito.rowCount()
                    if self.productosAgregados==0 and self.remito == None:
                        self.remito=RemitoModel(RemitoModel.obtenerNumero(self.sesion),int(self.lineDni.text()))
                        self.remito.guardar(self.sesion)

                    self.productosAgregados+=1

                    codigo = int(self.tableProductos.item(rowItemActual,0).text())

                    self.tableRemito.insertRow(rows)
                    self.tableRemito.setItem(rows, 0, QtGui.QTableWidgetItem(str(codigo)))
                    self.tableRemito.setItem(rows, 1, QtGui.QTableWidgetItem(str(cantidad)))

                    detalle = DetalleRemitoModel(self.remito.numero,self.productosAgregados,
                        int(self.tableProductos.item(rowItemActual,0).text()),cantidad)
                    self.descontarCantidad(detalle,int(self.tableProductos.item(rowItemActual,0).text()),cantidad)
                    detalle.guardar(self.sesion)
                    self.detallesTabla[rows] = detalle
                    self.cargar_productos()
                    self.objectModified.emit()
Esempio n. 10
0
 def buscarRemito(self):
     if self.lineNumero.isEnabled():
         numeroRemito = self.lineNumero.text()
         if len(numeroRemito) == 0:
             self.showMsjEstado("No se ha ingresado numero de remito")
         else:
             self.remitoActual = RemitoModel.existeRemito(
                 int(numeroRemito), self.sesion)
             if self.remitoActual == None:
                 QtGui.QMessageBox.warning(self, "Advertencia",
                                           "El remito ingresado no existe")
             else:
                 if self.remitoActual.estoyCobrado() != None:
                     QtGui.QMessageBox.information(
                         self, "Aviso",
                         "El remito ingresado ya sido cobrado")
                 else:
                     detallesRemitos = RemitoModel.buscarDetalles(
                         int(numeroRemito), self.sesion)
                     self.limpiarTabla(self.tableRemitos)
                     self.cargarObjetos(self.tableRemitos, detallesRemitos,
                                        ("producto", "cantidad"))
                     importes = []
                     for a in detallesRemitos:
                         for b in self.sesion.query(ProductoModel).filter(
                                 ProductoModel.codigo_barra == a.producto):
                             importes.append(b.importe * a.cantidad)
                     for row in range(0, self.tableRemitos.rowCount()):
                         self.tableRemitos.setItem(
                             row, 2,
                             QtGui.QTableWidgetItem(str(importes[row])))
                     self.lineNumero.setEnabled(False)
     else:
         self.lineNumero.clear()
         self.lineNumero.setEnabled(True)
         self.limpiarTabla(self.tableRemitos)
Esempio n. 11
0
 def eliminar(self):
     itemActual = self.tableRemito.currentItem()
     if itemActual == None:
         self.showMsjEstado("No se ha seleccionado remito para eliminar")
     else:
         numeroRemito = int(
             self.tableRemito.item(itemActual.row(), 0).text())
         remitoSeleccionado = RemitoModel.buscar(RemitoModel.numero,
                                                 self.sesion,
                                                 numeroRemito).first()
         if self.tableDetalles.rowCount() == 0:
             remitoSeleccionado.borrar(self.sesion)
             self.tableRemito.removeRow(itemActual.row())
             self.objectDeleted.emit()
             self.limpiarVentana()
         else:
             QtGui.QMessageBox.information(self, "Aviso",
                                           "Debe dar de baja cada detalle")
Esempio n. 12
0
 def eliminar(self):
     """
         Elimina un remito seleccionado, una vez que fueron dado de baja todos
         sus detalles
     :return:
     """
     itemActual=self.tableRemito.currentItem()
     if itemActual==None:
         QtGui.QMessageBox.information(self,"Aviso","No se ha seleccionado remito para eliminar")
     else:
         numeroRemito=int(self.tableRemito.item(itemActual.row(),0).text())
         remitoSeleccionado=RemitoModel.buscar(RemitoModel.numero,self.sesion,numeroRemito).first()
         if self.tableDetalles.rowCount()==0:
             remitoSeleccionado.borrar(self.sesion)
             self.tableRemito.removeRow(itemActual.row())
             self.objectDeleted.emit()
             QtGui.QMessageBox.information(self,"Aviso","Remito Eliminado Exitosamente")
         else:
             QtGui.QMessageBox.information(self,"Aviso","Debe dar de baja cada detalle")
Esempio n. 13
0
 def cargarDetalles(self):
     self.limpiarTabla(self.tableDetalles)
     self.tableDetalles.setVisible(True)
     self.lblDetalles.setVisible(True)
     self.lineNumero.setEnabled(False)
     itemActual=self.tableRemito.currentItem()
     valor=int(self.tableRemito.item(itemActual.row(),0).text())
     self.lineNumero.setText(str(valor))
     self.cargarObjetos(self.tableDetalles,
         RemitoModel.buscarDetalles(valor,self.sesion),
         ("nro_linea","producto","cantidad")
     )
     ##Para el calculo de subtotal. Como el subtotal es una dato calculado, no se puede hacer explicita la carga
     ##como sucede en el cargarObjetos
     importes=[]
     for a in self.sesion.query(DetalleRemitoModel).filter(DetalleRemitoModel.id_remito==valor):
         for b in self.sesion.query(ProductoModel).filter(ProductoModel.codigo_barra==a.producto):
             importes.append(b.importe * a.cantidad)
     for row in range(0,self.tableDetalles.rowCount()):
         self.tableDetalles.setItem(row, 3, QtGui.QTableWidgetItem(str(importes[row])))
Esempio n. 14
0
 def cargarDetalles(self):
     self.limpiarTabla(self.tableDetalles)
     self.tableDetalles.setVisible(True)
     self.lblDetalles.setVisible(True)
     self.lineNumero.setEnabled(False)
     itemActual = self.tableRemito.currentItem()
     valor = int(self.tableRemito.item(itemActual.row(), 0).text())
     self.lineNumero.setText(str(valor))
     self.cargarObjetos(self.tableDetalles,
                        RemitoModel.buscarDetalles(valor, self.sesion),
                        ("nro_linea", "producto", "cantidad"))
     ##Para el calculo de subtotal. Como el subtotal es una dato calculado, no se puede hacer explicita la carga
     ##como sucede en el cargarObjetos
     importes = []
     for a in self.sesion.query(DetalleRemitoModel).filter(
             DetalleRemitoModel.id_remito == valor):
         for b in self.sesion.query(ProductoModel).filter(
                 ProductoModel.codigo_barra == a.producto):
             importes.append(b.importe * a.cantidad)
     for row in range(0, self.tableDetalles.rowCount()):
         self.tableDetalles.setItem(
             row, 3, QtGui.QTableWidgetItem(str(importes[row])))
Esempio n. 15
0
    def eliminarDetalle(self):
        itemActual=self.tableDetalles.currentItem()
        ok=QtGui.QMessageBox.information(self,"Confirmacion","¿Desea eliminar este item?")
        if ok:
            linea=int(self.tableDetalles.item(itemActual.row(),0).text())
            producto=int(self.tableDetalles.item(itemActual.row(),1).text())
            cantidadRemito=int(self.tableDetalles.item(itemActual.row(),2).text())
            finalizeActualizacion=False
            while not finalizeActualizacion:
                cantidad, ok=QtGui.QInputDialog.getInt(self,"Cantidad","Ingrese cantidad del producto",1,1,2000,5)
                if not ok:
                    QtGui.QMessageBox.information(self,"Aviso","No se ingreso cantidad")
                else:
                    if cantidad > cantidadRemito:
                        QtGui.QMessageBox.information(self,"Aviso","La cantidad ingresada supera la esperada")
                    else:
                        lote, ok=QtGui.QInputDialog.getText(self,"Lote","Ingrese lote")
                        if not ok:
                            QtGui.QMessageBox.information(self,"Aviso","No se ingreso lote")
                        else:
                            loteP=LoteProductoModel.buscarLoteProducto(self.sesion,producto,str(lote)).first()
                            if loteP==None:
                                QtGui.QMessageBox.information(self,"Aviso","El lote ingresado no se corresponde con el producto")
                            else:
                                loteP.aumentarCantidad(cantidad)
                                loteP.modificar(self.sesion)
                                cantidadRemito-=cantidad
                                self.tableDetalles.item(itemActual.row(),2).setText(str(cantidadRemito))
                                if cantidadRemito==0:
                                    finalizeActualizacion=True
            detalle=RemitoModel.getDetalle(int(self.lineNumero.text()),int(linea),self.sesion).first()
            detalle.borrar(self.sesion)
            self.tableDetalles.removeRow(itemActual.row())

        else:
            return
Esempio n. 16
0
 def cargar_remitos(self):
     self.cargarObjetos(self.tableRemito,
         RemitoModel.obtenerTodosRemitos(self.sesion).all(),
         ("numero", "cliente", "fecha_emision")
     )
Esempio n. 17
0
class VentaConRemito(CRUDWidget, Ui_vtnVentaConRemito):
    """
        Clase que modela la logica de la operacion
        de Venta con Remito
    """

    def __init__(self, mdi):
        """
            Setea las propiedades de la ventana y variables
        :param mdi Ventana Contenedora:
        :return:
        """
        MdiWidget.__init__(self, mdi)
        self.sesion = self.mdi().window().getSesionBD()
        self.validadores()
        self.btnBuscarCliente.pressed.connect(self.buscarCliente)
        self.lineDni.returnPressed.connect(self.buscarClt)
        self.lineApellido.returnPressed.connect(self.buscarClt)
        self.lineNombre.returnPressed.connect(self.buscarClt)
        self.lineMedicamento.returnPressed.connect(self.buscarProd)
        self.lineMonodroga.returnPressed.connect(self.buscarProd)
        self.tableClientes.itemDoubleClicked.connect(self.cargarLines)
        self.tableProductos.itemDoubleClicked.connect(self.agregarProducto)
        self.btnEliminar.pressed.connect(self.eliminarDetalle)
        self.btnAceptar.pressed.connect(self.aceptar)
        self.btnCancelar.pressed.connect(self.cancelar)
        self.cargar_clientes()
        self.cargar_productos()
        self.gbProducto.setEnabled(False)
        self.gbRemito.setEnabled(False)
        self.remito=None
        self.productosAgregados=0
        self.lotesVentas = {}
        self.dniCliente = None
        self.detallesTabla = {} #Diccionario que vincula el row de la tabla con el obj DetalleRemito Correspondiente


    def cancelarVentana(self):

        if self.remito!=None:
            self.remito.anular()
        for detalle in self.lotesVentas:
            for loteVenta in self.lotesVentas[detalle]:
                loteVenta[0].aumentarCantidad(loteVenta[1])
                loteVenta[0].modificar(self.sesion)
            detalle.eliminarLotesAsociados(self.sesion)
            detalle.borrar(self.sesion)
        self.limpiarVentana()
        self.objectModified.emit()


    def cargar_productos(self):
        """
            Carga los productos que se encuentran en el
            sistema en la Tabla de Productos
        :return:
        """

        self.limpiarTabla(self.tableProductos)
        for n, obj in enumerate(ProductoModel.buscarTodos("codigo_barra",self.sesion).all()):
            self.tableProductos.insertRow(n)
            self.tableProductos.setItem(n, 0, QtGui.QTableWidgetItem(str(obj.codigo_barra)))
            self.tableProductos.setItem(n, 1, QtGui.QTableWidgetItem(str(obj.id_medicamento)))
            self.tableProductos.setItem(n, 2, QtGui.QTableWidgetItem(str(obj.id_presentacion)))
            self.tableProductos.setItem(n, 3, QtGui.QTableWidgetItem(obj.getNombreMonodroga(self.sesion)))
            self.tableProductos.setItem(n, 4, QtGui.QTableWidgetItem(str(obj.getCantidad(self.sesion))))

    def cargar_clientes(self):
        """
            Carga los clientes cargados en el sistema
            en la Tabla de Clientes
        :return:
        """
        self.limpiarTabla(self.tableClientes)
        self.cargarObjetos(self.tableClientes,
            ClienteModel.buscarTodos("dni", self.sesion).all(),
            ("dni", "nombre", "apellido")
        )

    def validadores(self):
        """
            Setea los validadores correspondientes
            para los campos de la ventana
        :return:
        """
         ##Esta parte analiza los campos requeridos para el cliente
        requeridos = ["nombre", "apellido", "dni"]
        camposRequeridos = [ getattr(self, "line%s" % campo.title()) for campo in requeridos ]
        ValidarDatos.setValidador(camposRequeridos)

        camposRequeridos = [getattr(self,"lineMonodroga")]
        ValidarDatos.setValidador(camposRequeridos)

        camposRequeridos = [getattr(self,"lineMedicamento")]
        ValidarDatos.setValidador(camposRequeridos)

    def buscarCliente(self):
        """
            Busca los clientes de acuerdo al criterio de
            busqueda establecido por el usuario
        :return:
        """
        if self.lineDni.isEnabled():
            self.buscarClt()
        elif self.productosAgregados != 0:
            QtGui.QMessageBox.information(self,"Aviso","No se puede cambiar Cliente. Ya hay productos agregados")
        else:
            self.lineDni.setEnabled(True)
            self.lineApellido.setEnabled(True)
            self.lineNombre.setEnabled(True)
            self.lineNombre.clear()
            self.lineDni.clear()
            self.lineApellido.clear()
            self.limpiarTabla(self.tableClientes)
            self.tableClientes.setVisible(True)
            self.cargar_clientes()
            self.gbProducto.setEnabled(False)
            self.gbRemito.setEnabled(False)

    def buscarClt(self):
        """
            Filtra la tabla de Clientes de acuerdo a los
            criterios de busqueda impuestos
        :return:
        """
        dni = str(self.lineDni.text())
        nombre = str(self.lineNombre.text())
        apellido = str(self.lineApellido.text())
        data = self.getAllTabla(self.tableClientes)


        if dni != "":
            dataDni = filter(lambda x: x[0].upper() == dni.upper(), data.values())
        else:
            dataDni = data.values()
        if nombre != "":
            dataNomb = filter(lambda x: x[1].upper() == nombre.upper(), dataDni)
        else:
            dataNomb = dataDni
        if apellido != "":
            dataApell = filter(lambda x: x[2].upper() == apellido.upper(), dataNomb)
        else:
            dataApell = dataNomb

        for dato in data:
            self.tableClientes.setRowHidden(dato,False)

        for dato in data:
            if not data[dato] in dataApell:
                self.tableClientes.setRowHidden(dato,True)

    def buscarProd(self):
        """
            Filtra la tabla de Productos de acuerdo
            a los criterios de busqueda impuestos
        :return:
        """
        medicamento = str(self.lineMedicamento.text())
        monodroga = str(self.lineMonodroga.text())
        data = self.getAllTabla(self.tableProductos)

        if medicamento != "":
            dataMedic = filter(lambda x: x[1].upper() == medicamento.upper(), data.values())
        else:
            dataMedic = data.values()
        if monodroga != "":
            dataMono = filter(lambda x: x[3].upper() == monodroga.upper(), dataMedic)
        else:
            dataMono = dataMedic

        for dato in data:
            self.tableProductos.setRowHidden(dato,False)

        for dato in data:
            if not data[dato] in dataMono:
                self.tableProductos.setRowHidden(dato,True)

    def cargarLines(self):
        """
            Carga los lines correspondientes con la informacion
            del cliente seleccionado
        :return:
        """
        self.lineDni.setEnabled(False)
        self.lineNombre.setEnabled(False)
        self.lineApellido.setEnabled(False)
        #Recuperar la informacion de un item
        row=self.tableClientes.currentItem().row()
        infoItem=[]
        for col in range(0,self.tableClientes.columnCount()):
            infoItem.append(self.tableClientes.item(row,col).text())

        self.dniCliente = int(infoItem[0])

        #Cargar la info del item en los lines
        self.lineDni.setText(infoItem[0])
        self.lineNombre.setText(infoItem[1])
        self.lineApellido.setText(infoItem[2])
        self.tableClientes.hide()
        self.gbProducto.setEnabled(True)
        self.gbRemito.setEnabled(True)

    def descontarCantidad(self,detalle,producto,cantidad):
        """
            Descuenta la cantidad especificada de un
            determinado producto
        :param detalle Detalle Remito:
        :param producto Codigo de Barra del producto:
        :param cantidad Cantidad del Producto:
        :return:
        """
        query=LoteModel.obtenerLoteProducto(producto,self.sesion)
        valores=[]
        for a in query:
            loteProducto=LoteProductoModel.buscarLoteProducto(self.sesion,producto,a.codigo).first()
            if cantidad<=loteProducto.cantidad:
                loteProducto.descontarCantidad(cantidad)
                loteProducto.modificar(self.sesion)
                valores.append([loteProducto,cantidad])
                break
            else:
                cantidad-=loteProducto.cantidad
                valores.append([loteProducto,loteProducto.cantidad])
                loteProducto.descontarCantidad(loteProducto.cantidad)
                loteProducto.modificar(self.sesion)
        self.lotesVentas[detalle]=valores
        detalle.agregarLotes(self.sesion,self.lotesVentas[detalle])

    def agregarProducto(self):
        """
            Agrega un producto seleccionado al Remito creado
        :return:
        """
        itemActual=self.tableProductos.currentItem()
        if itemActual==None:
            QtGui.QMessageBox.information(self,"Aviso", "No se ha seleccionado ningun producto para agregar")
        else:
            cantidad, ok = QtGui.QInputDialog.getInt(self,"Cantidad","Ingrese cantidad del producto",1,1,2000,5)
            if not ok:
                self.showMsjEstado("No se ha seleccionado cantidad del producto")
            else:
                if cantidad>int(self.tableProductos.item(itemActual.row(),4).text()):
                    self.showMsjEstado("La cantidad seleccionada es mayor a la actual")
                else:
                    rowItemActual=itemActual.row()
                    rows=self.tableRemito.rowCount()
                    if self.productosAgregados==0 and self.remito == None:
                        self.remito=RemitoModel(RemitoModel.obtenerNumero(self.sesion),int(self.lineDni.text()))
                        self.remito.guardar(self.sesion)

                    self.productosAgregados+=1

                    codigo = int(self.tableProductos.item(rowItemActual,0).text())

                    self.tableRemito.insertRow(rows)
                    self.tableRemito.setItem(rows, 0, QtGui.QTableWidgetItem(str(codigo)))
                    self.tableRemito.setItem(rows, 1, QtGui.QTableWidgetItem(str(cantidad)))

                    detalle = DetalleRemitoModel(self.remito.numero,self.productosAgregados,
                        int(self.tableProductos.item(rowItemActual,0).text()),cantidad)
                    self.descontarCantidad(detalle,int(self.tableProductos.item(rowItemActual,0).text()),cantidad)
                    detalle.guardar(self.sesion)
                    self.detallesTabla[rows] = detalle
                    self.cargar_productos()
                    self.objectModified.emit()

    def eliminarDetalle(self):
        """
            Elimina el detalle seleccionado por el usuario y actualiza
            el stock del producto en particular.
        :return:
        """

        itemActual = self.tableRemito.currentItem()
        if itemActual == None:
            self.showMsjEstado("Debe seleccionar un item para dar de baja")
        else:
            detalle = self.detallesTabla[itemActual.row()]
            for loteVenta in self.lotesVentas[detalle]:
                loteVenta[0].aumentarCantidad(loteVenta[1])
                loteVenta[0].modificar(self.sesion)
            detalle.eliminarLotesAsociados(self.sesion)
            detalle.bajaFisica(self.sesion)
            del self.lotesVentas[detalle]
            del self.detallesTabla[itemActual.row()]
            self.tableRemito.hideRow(itemActual.row())
            self.cargar_productos()
            self.productosAgregados -=1
            self.objectModified.emit()

    def limpiarVentana(self):
        """
            Limpia la ventana actual
        :return:
        """

        self.remito=None
        self.productosAgregados=0
        self.dniCliente = None
        self.lotesVentas = {}
        self.detallesTabla = {}
        self.lineDni.setEnabled(True)
        self.lineDni.clear()
        self.lineNombre.setEnabled(True)
        self.lineNombre.clear()
        self.lineApellido.setEnabled(True)
        self.lineApellido.clear()
        self.lineMedicamento.clear()
        self.lineMonodroga.clear()
        self.limpiarTabla(self.tableClientes)
        self.limpiarTabla(self.tableProductos)
        self.limpiarTabla(self.tableRemito)
        self.tableClientes.setVisible(True)
        self.gbRemito.setEnabled(False)
        self.gbProducto.setEnabled(False)
        self.cargar_clientes()
        self.cargar_productos()

    def aceptar(self):
        """
            Confirma la operacion en curso, y envia
            la informacion necesaria para imprimir el comprobante.
            Si no se ha efectuado ninguna venta, se notifica
        :return:
        """

        if self.remito==None:
            QtGui.QMessageBox.information(self,"Aviso","No se ha efectuado ninguna venta")
        elif self.productosAgregados == 0:
            QtGui.QMessageBox.information(self,"Aviso","No se ha agregado ningun producto al remito")

        else:
            self.objectCreated.emit()
            QtGui.QMessageBox.information(None,"Venta","La venta se ha realizado con exito")
            ##Se envian los datos necesarios para generar el comprobante
            data = {}
            data["numero"] = self.remito.numero
            data["fecha"] = self.remito.fecha_emision
            data["datosCliente"] = ClienteModel.getDatosCliente(self.sesion,self.dniCliente)
            data["detalles"] = self.getContenidoTabla(self.tableRemito).values()
            generarRremito(data)
            self.limpiarVentana()

    def cancelar(self):
        """
            Cancela la operacion en curso, anulando el
            Remito creado y restaurando el stock de los productos a
            sus valores originales.
        :return:
        """

        ok=QtGui.QMessageBox.warning(self,"Aviso","¿Desea cancelar la operacion?",\
                                     QtGui.QMessageBox.Cancel | QtGui.QMessageBox.Ok)
        if ok == QtGui.QMessageBox.Ok:
            if self.remito!=None:
                self.remito.anular()
            for detalle in self.lotesVentas:
                for loteVenta in self.lotesVentas[detalle]:
                    loteVenta[0].aumentarCantidad(loteVenta[1])
                    loteVenta[0].modificar(self.sesion)
                detalle.eliminarLotesAsociados(self.sesion)
                detalle.borrar(self.sesion)
            self.limpiarVentana()
            self.objectModified.emit()

    def addHandlerSignal(self):

        self.sender = PoolOfWindows.getVentana("AltaCliente")
        self.sender.objectCreated.connect(self.cargar_clientes)
        self.sender1 = PoolOfWindows.getVentana("BajaCliente")
        self.sender1.objectDeleted.connect(self.cargar_clientes)
        self.sender2 = PoolOfWindows.getVentana("ModificarCliente")
        self.sender2.objectModified.connect(self.cargar_clientes)
        self.sender3 = PoolOfWindows.getVentana("VentaContado")
        self.sender3.objectModified.connect(self.cargar_productos)
        self.sender4 = PoolOfWindows.getVentana("AltaProducto")
        self.sender4.objectCreated.connect(self.cargar_productos)
        self.sender5 = PoolOfWindows.getVentana("BajaProducto")
        self.sender5.objectDeleted.connect(self.cargar_productos)
        self.sender6 = PoolOfWindows.getVentana("ModificarProducto")
        self.sender6.objectModified.connect(self.cargar_productos)
        self.sender7 = PoolOfWindows.getVentana("DevolucionDeCliente")
        self.sender7.objectModified.connect(self.cargar_productos)
        self.sender8 = PoolOfWindows.getVentana("ModificarRemito")
        self.sender8.objectModified.connect(self.cargar_productos)
        self.sender9 = PoolOfWindows.getVentana("BajaRemito")
        self.sender9.objectModified.connect(self.cargar_productos)
        self.sender10 = PoolOfWindows.getVentana("FraccionarProducto")
        self.sender10.objectModified.connect(self.cargar_productos)
        self.sender11 = PoolOfWindows.getVentana("AltaLote")
        self.sender11.objectCreated.connect(self.cargar_productos)
        self.sender12 = PoolOfWindows.getVentana("ModificarLote")
        self.sender12.objectModified.connect(self.cargar_productos)
Esempio n. 18
0
class VentaConRemito(MdiWidget, Ui_vtnVentaConRemito):
    def __init__(self, mdi):
        MdiWidget.__init__(self, mdi)
        self.sesion = self.mdi().window().getSesionBD()
        self.validadores()
        self.btnBuscarCliente.pressed.connect(self.buscarCliente)
        self.tableClientes.itemDoubleClicked.connect(self.cargarLines)
        self.btnBuscarProducto.pressed.connect(self.buscarProducto)
        self.tableProductos.itemDoubleClicked.connect(self.agregarProducto)
        self.tableRemito.itemDoubleClicked.connect(self.cambiarCantidad)
        self.btnEliminar.pressed.connect(self.eliminarDetalle)
        self.btnAceptar.pressed.connect(self.aceptar)
        self.btnCancelar.pressed.connect(self.cancelar)
        self.cargar_clientes()
        self.cargar_productos()
        self.gbProducto.hide()
        self.gbRemito.hide()
        self.remito = None
        self.productosAgregados = 0
        self.lotesVentas = {}

    def cargar_productos(self):
        for n, obj in enumerate(
                ProductoModel.buscarTodos("codigo_barra", self.sesion).all()):
            self.tableProductos.insertRow(n)
            self.tableProductos.setItem(
                n, 0, QtGui.QTableWidgetItem(str(obj.codigo_barra)))
            self.tableProductos.setItem(
                n, 1, QtGui.QTableWidgetItem(str(obj.id_medicamento)))
            self.tableProductos.setItem(
                n, 2, QtGui.QTableWidgetItem(str(obj.id_presentacion)))
            self.tableProductos.setItem(
                n, 3,
                QtGui.QTableWidgetItem(obj.getNombreMonodroga(self.sesion)))
            self.tableProductos.setItem(
                n, 4,
                QtGui.QTableWidgetItem(str(obj.getCantidad(self.sesion))))
            self.tableProductos.setItem(
                n, 5, QtGui.QTableWidgetItem(str(obj.importe)))

    def cargar_clientes(self):
        self.cargarObjetos(self.tableClientes,
                           ClienteModel.buscarTodos("dni", self.sesion).all(),
                           ("dni", "nombre", "apellido"))

    def validadores(self):
        pass
        #TODO HACER ESTO
        ##Esta parte analiza los campos requeridos para el cliente
        #self.camposRequeridos = [ getattr(self, "line%s" % campo.title()) for campo in ClienteModel.requeridos ]
        #self.validarDatos = ValidarDatos()
        #ValidarDatos.setValidador(self.camposRequeridos)

    def buscarCliente(self):
        if self.lineDni.isEnabled():
            print("busqueda con filtrado")
        else:
            self.lineDni.setEnabled(True)
            self.lineApellido.setEnabled(True)
            self.lineNombre.setEnabled(True)
            self.lineNombre.clear()
            self.lineDni.clear()
            self.lineApellido.clear()
            self.limpiarTabla(self.tableClientes)
            self.tableClientes.setVisible(True)
            self.cargar_clientes()

    def cargarLines(self):
        self.lineDni.setEnabled(False)
        self.lineNombre.setEnabled(False)
        self.lineApellido.setEnabled(False)
        #Recuperar la informacion de un item
        row = self.tableClientes.currentItem().row()
        infoItem = []
        for col in range(0, self.tableClientes.columnCount()):
            infoItem.append(self.tableClientes.item(row, col).text())
        #Cargar la info del item en los lines
        self.lineDni.setText(infoItem[0])
        self.lineNombre.setText(infoItem[1])
        self.lineApellido.setText(infoItem[2])
        self.tableClientes.hide()
        self.gbProducto.setVisible(True)
        self.gbRemito.setVisible(True)

    def buscarProducto(self):
        print("Buscando producto")

    def descontarCantidad(self, detalle, producto, cantidad):
        query = LoteModel.obtenerLoteProducto(producto, self.sesion)
        valores = []
        for a in query:
            loteProducto = LoteProductoModel.buscarLoteProducto(
                self.sesion, producto, a.codigo).first()
            if cantidad <= loteProducto.cantidad:
                loteProducto.descontarCantidad(cantidad)
                loteProducto.modificar(self.sesion)
                valores.append([loteProducto, cantidad])
                break
            else:
                cantidad -= loteProducto.cantidad
                valores.append([loteProducto, loteProducto.cantidad])
                loteProducto.descontarCantidad(loteProducto.cantidad)
                loteProducto.modificar(self.sesion)
        self.lotesVentas[detalle] = valores

    def agregarProducto(self):
        itemActual = self.tableProductos.currentItem()
        if itemActual == None:
            self.showMsjEstado(
                "No se ha seleccionado ningun producto para agregar")
        else:
            cantidad, ok = QtGui.QInputDialog.getInt(
                self, "Cantidad", "Ingrese cantidad del producto", 1, 1, 2000,
                5)
            if not ok:
                self.showMsjEstado(
                    "No se ha seleccionado cantidad del producto")
            else:
                if cantidad > int(
                        self.tableProductos.item(itemActual.row(), 4).text()):
                    self.showMsjEstado(
                        "La cantidad seleccionada es mayor a la actual")
                else:
                    rowItemActual = itemActual.row()
                    rows = self.tableRemito.rowCount()
                    if self.productosAgregados == 0:
                        self.remito = RemitoModel(
                            RemitoModel.obtenerNumero(self.sesion),
                            int(self.lineDni.text()))
                        self.remito.guardar(self.sesion)
                    self.productosAgregados += 1
                    self.tableRemito.insertRow(rows)
                    self.tableRemito.setItem(
                        rows, 0,
                        QtGui.QTableWidgetItem(
                            str(
                                self.tableProductos.item(rowItemActual,
                                                         0).text())))
                    self.tableRemito.setItem(
                        rows, 1, QtGui.QTableWidgetItem(str(cantidad)))
                    self.tableRemito.setItem(
                        rows, 2,
                        QtGui.QTableWidgetItem(
                            str(cantidad * float(
                                self.tableProductos.item(rowItemActual,
                                                         5).text()))))
                    self.detalle = DetalleRemitoModel(
                        self.remito.numero, self.productosAgregados,
                        int(self.tableProductos.item(rowItemActual, 0).text()),
                        cantidad)
                    self.descontarCantidad(
                        self.detalle,
                        int(self.tableProductos.item(rowItemActual, 0).text()),
                        cantidad)
                    self.detalle.guardar(self.sesion)
                    self.limpiarTabla(self.tableProductos)
                    self.cargar_productos()

    def cambiarCantidad(self):
        itemActual = self.tableRemito.currentItem()
        cantidad, ok = QtGui.QInputDialog.getInt(
            self, "Cantidad", "Ingrese cantidad del producto", 1, 1, 2000, 5)
        #TODO Checkear que la cantidad no sea mayor a la que esta en la base
        #TODO ACTUALIZAR LA CANTIDAD
        if ok:
            importeUnitario = float(
                self.tableRemito.item(itemActual.row(), 2).text()) / int(
                    self.tableRemito.item(itemActual.row(), 1).text())
            itemCantidad = self.tableRemito.item(itemActual.row(), 1)
            itemCantidad.setText(str(cantidad))
            itemImporte = self.tableRemito.item(itemActual.row(), 2)
            itemImporte.setText(str(int(cantidad) * importeUnitario))

    def eliminarDetalle(self):
        print("Eliminando Detalle")

    def limpiarVentana(self):
        self.lineDni.setEnabled(True)
        self.lineDni.clear()
        self.lineNombre.setEnabled(True)
        self.lineNombre.clear()
        self.lineApellido.setEnabled(True)
        self.lineApellido.clear()
        self.lineEdit_3.clear()
        self.lineEdit_4.clear()
        self.lineEdit_3.setEnabled(True)
        self.lineEdit_4.setEnabled(True)
        self.limpiarTabla(self.tableClientes)
        self.limpiarTabla(self.tableProductos)
        self.limpiarTabla(self.tableRemito)
        self.tableClientes.setVisible(True)
        self.cargar_clientes()
        self.cargar_productos()

    def aceptar(self):
        if self.remito == None:
            QtGui.QMessageBox.information(self, "Venta con Remito",
                                          "No se ha efectuado ninguna venta")
        else:
            QtGui.QMessageBox.information(
                None, "Venta", "La venta se ha realizado con exito")
            self.limpiarTabla(self.tableRemito)
        self.remito = None
        self.productosAgregados = 0
        self.limpiarVentana()

    def cancelar(self):
        if self.remito != None:
            ok = QtGui.QMessageBox.warning(self, "Aviso",
                                           "¿Desea anular el remito creado?")
            if ok:
                self.remito.anular()
                QtGui.QMessageBox.information(self, "Aviso", "Remito Anulado")
                for detalle in self.lotesVentas:
                    for loteVenta in self.lotesVentas[detalle]:
                        loteVenta[0].aumentarCantidad(loteVenta[1])
                        loteVenta[0].modificar(self.sesion)
                self.lotesVentas = {}
                self.cargar_productos()
        self.remito = None
        self.productosAgregados = 0
        self.limpiarVentana()
Esempio n. 19
0
 def cargar_remitos(self):
     self.cargarObjetos(self.tableRemito,
                        RemitoModel.obtenerTodosRemitos(self.sesion).all(),
                        ("numero", "cliente", "fecha_emision"))
Esempio n. 20
0
class VentaConRemito(MdiWidget, Ui_vtnVentaConRemito):
    def __init__(self, mdi):
        MdiWidget.__init__(self, mdi)
        self.sesion = self.mdi().window().getSesionBD()
        self.validadores()
        self.btnBuscarCliente.pressed.connect(self.buscarCliente)
        self.tableClientes.itemDoubleClicked.connect(self.cargarLines)
        self.btnBuscarProducto.pressed.connect(self.buscarProducto)
        self.tableProductos.itemDoubleClicked.connect(self.agregarProducto)
        self.tableRemito.itemDoubleClicked.connect(self.cambiarCantidad)
        self.btnEliminar.pressed.connect(self.eliminarDetalle)
        self.btnAceptar.pressed.connect(self.aceptar)
        self.btnCancelar.pressed.connect(self.cancelar)
        self.cargar_clientes()
        self.cargar_productos()
        self.gbProducto.hide()
        self.gbRemito.hide()
        self.remito=None
        self.productosAgregados=0
        self.lotesVentas={}

    def cargar_productos(self):
        for n, obj in enumerate(ProductoModel.buscarTodos("codigo_barra",self.sesion).all()):
            self.tableProductos.insertRow(n)
            self.tableProductos.setItem(n, 0, QtGui.QTableWidgetItem(str(obj.codigo_barra)))
            self.tableProductos.setItem(n, 1, QtGui.QTableWidgetItem(str(obj.id_medicamento)))
            self.tableProductos.setItem(n, 2, QtGui.QTableWidgetItem(str(obj.id_presentacion)))
            self.tableProductos.setItem(n, 3, QtGui.QTableWidgetItem(obj.getNombreMonodroga(self.sesion)))
            self.tableProductos.setItem(n, 4, QtGui.QTableWidgetItem(str(obj.getCantidad(self.sesion))))
            self.tableProductos.setItem(n, 5, QtGui.QTableWidgetItem(str(obj.importe)))

    def cargar_clientes(self):
        self.cargarObjetos(self.tableClientes,
            ClienteModel.buscarTodos("dni", self.sesion).all(),
            ("dni", "nombre", "apellido")
        )

    def validadores(self):
        pass
        #TODO HACER ESTO
        ##Esta parte analiza los campos requeridos para el cliente
        #self.camposRequeridos = [ getattr(self, "line%s" % campo.title()) for campo in ClienteModel.requeridos ]
        #self.validarDatos = ValidarDatos()
        #ValidarDatos.setValidador(self.camposRequeridos)

    def buscarCliente(self):
        if self.lineDni.isEnabled():
            print("busqueda con filtrado")
        else:
            self.lineDni.setEnabled(True)
            self.lineApellido.setEnabled(True)
            self.lineNombre.setEnabled(True)
            self.lineNombre.clear()
            self.lineDni.clear()
            self.lineApellido.clear()
            self.limpiarTabla(self.tableClientes)
            self.tableClientes.setVisible(True)
            self.cargar_clientes()

    def cargarLines(self):
        self.lineDni.setEnabled(False)
        self.lineNombre.setEnabled(False)
        self.lineApellido.setEnabled(False)
        #Recuperar la informacion de un item
        row=self.tableClientes.currentItem().row()
        infoItem=[]
        for col in range(0,self.tableClientes.columnCount()):
            infoItem.append(self.tableClientes.item(row,col).text())
        #Cargar la info del item en los lines
        self.lineDni.setText(infoItem[0])
        self.lineNombre.setText(infoItem[1])
        self.lineApellido.setText(infoItem[2])
        self.tableClientes.hide()
        self.gbProducto.setVisible(True)
        self.gbRemito.setVisible(True)

    def buscarProducto(self):
        print("Buscando producto")

    def descontarCantidad(self,detalle,producto,cantidad):
        query=LoteModel.obtenerLoteProducto(producto,self.sesion)
        valores=[]
        for a in query:
            loteProducto=LoteProductoModel.buscarLoteProducto(self.sesion,producto,a.codigo).first()
            if cantidad<=loteProducto.cantidad:
                loteProducto.descontarCantidad(cantidad)
                loteProducto.modificar(self.sesion)
                valores.append([loteProducto,cantidad])
                break
            else:
                cantidad-=loteProducto.cantidad
                valores.append([loteProducto,loteProducto.cantidad])
                loteProducto.descontarCantidad(loteProducto.cantidad)
                loteProducto.modificar(self.sesion)
        self.lotesVentas[detalle]=valores

    def agregarProducto(self):
        itemActual=self.tableProductos.currentItem()
        if itemActual==None:
            self.showMsjEstado("No se ha seleccionado ningun producto para agregar")
        else:
            cantidad, ok = QtGui.QInputDialog.getInt(self,"Cantidad","Ingrese cantidad del producto",1,1,2000,5)
            if not ok:
                self.showMsjEstado("No se ha seleccionado cantidad del producto")
            else:
                if cantidad>int(self.tableProductos.item(itemActual.row(),4).text()):
                    self.showMsjEstado("La cantidad seleccionada es mayor a la actual")
                else:
                    rowItemActual=itemActual.row()
                    rows=self.tableRemito.rowCount()
                    if self.productosAgregados==0:
                        self.remito=RemitoModel(RemitoModel.obtenerNumero(self.sesion),int(self.lineDni.text()))
                        self.remito.guardar(self.sesion)
                    self.productosAgregados+=1
                    self.tableRemito.insertRow(rows)
                    self.tableRemito.setItem(rows, 0, QtGui.QTableWidgetItem(str(self.tableProductos.item(rowItemActual,0).text())))
                    self.tableRemito.setItem(rows, 1, QtGui.QTableWidgetItem(str(cantidad)))
                    self.tableRemito.setItem(rows, 2, QtGui.QTableWidgetItem(str(cantidad*float(self.tableProductos.item(rowItemActual,5).text()))))
                    self.detalle=DetalleRemitoModel(self.remito.numero,self.productosAgregados,
                        int(self.tableProductos.item(rowItemActual,0).text()),cantidad)
                    self.descontarCantidad(self.detalle,int(self.tableProductos.item(rowItemActual,0).text()),cantidad)
                    self.detalle.guardar(self.sesion)
                    self.limpiarTabla(self.tableProductos)
                    self.cargar_productos()

    def cambiarCantidad(self):
        itemActual=self.tableRemito.currentItem()
        cantidad, ok=QtGui.QInputDialog.getInt(self,"Cantidad","Ingrese cantidad del producto",1,1,2000,5)
        #TODO Checkear que la cantidad no sea mayor a la que esta en la base
        #TODO ACTUALIZAR LA CANTIDAD
        if ok:
            importeUnitario=float(self.tableRemito.item(itemActual.row(),2).text())/int(self.tableRemito.item(itemActual.row(),1).text())
            itemCantidad=self.tableRemito.item(itemActual.row(),1)
            itemCantidad.setText(str(cantidad))
            itemImporte=self.tableRemito.item(itemActual.row(),2)
            itemImporte.setText(str(int(cantidad)*importeUnitario))

    def eliminarDetalle(self):
        print("Eliminando Detalle")

    def limpiarVentana(self):
        self.lineDni.setEnabled(True)
        self.lineDni.clear()
        self.lineNombre.setEnabled(True)
        self.lineNombre.clear()
        self.lineApellido.setEnabled(True)
        self.lineApellido.clear()
        self.lineEdit_3.clear()
        self.lineEdit_4.clear()
        self.lineEdit_3.setEnabled(True)
        self.lineEdit_4.setEnabled(True)
        self.limpiarTabla(self.tableClientes)
        self.limpiarTabla(self.tableProductos)
        self.limpiarTabla(self.tableRemito)
        self.tableClientes.setVisible(True)
        self.cargar_clientes()
        self.cargar_productos()

    def aceptar(self):
        if self.remito==None:
            QtGui.QMessageBox.information(self,"Venta con Remito","No se ha efectuado ninguna venta")
        else:
            QtGui.QMessageBox.information(None,"Venta","La venta se ha realizado con exito")
            self.limpiarTabla(self.tableRemito)
        self.remito=None
        self.productosAgregados=0
        self.limpiarVentana()

    def cancelar(self):
        if self.remito!=None:
            ok=QtGui.QMessageBox.warning(self,"Aviso","¿Desea anular el remito creado?")
            if ok:
                self.remito.anular()
                QtGui.QMessageBox.information(self,"Aviso","Remito Anulado")
                for detalle in self.lotesVentas:
                    for loteVenta in self.lotesVentas[detalle]:
                        loteVenta[0].aumentarCantidad(loteVenta[1])
                        loteVenta[0].modificar(self.sesion)
                self.lotesVentas={}
                self.cargar_productos()
        self.remito=None
        self.productosAgregados=0
        self.limpiarVentana()