Esempio n. 1
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. 2
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. 3
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()