Пример #1
0
 def crear(self):
     """
     Da de alta un lote nuevo y lo almacena en la base de datos.
     :return:
     """
     if self.producto == None:
         QtGui.QMessageBox.warning(self, 'Atención', 'No se ha seleccionado ningun Producto de la tabla.',
                                   'Aceptar')
     else:
         if ValidarDatos.validarCamposVacios(self.camposRequeridos):
             if self.dateFechVenc.dateTime().toPyDateTime().date() > date.today():
                 lote = LoteModel(str(self.lineCodigo.text()), str(self.dateFechVenc.text()))
                 if lote.guardar(self.sesion):
                     QtGui.QMessageBox.information(self, 'Info', 'El Lote fue dado de alta.', 'Aceptar')
                     loteProducto = LoteProductoModel(lote.getCodigo(), self.producto,
                                                      int(self.spinCantidad.value()))
                     loteProducto.guardar(self.sesion)
                     self.limpiarCampos()
                     self.objectCreated.emit()
                 else:
                     QtGui.QMessageBox.critical(self, 'Error', 'El Lote ya existe.', 'Aceptar')
             else:
                 QtGui.QMessageBox.critical(self, 'Error',
                                            'La fecha de vencimiento debe ser mayor a la fecha actual.', 'Aceptar')
         else:
             QtGui.QMessageBox.warning(self, 'Atención', 'Hay datos obligatorios que no fueron completados.',
                                   'Aceptar')
Пример #2
0
 def crear(self):
     """
     Da de alta un lote nuevo y lo almacena en la base de datos.
     :return:
     """
     if self.producto == None:
         self.showMsjEstado(
             "No se ha seleccionado ningun Producto de la tabla")
     else:
         if ValidarDatos.validarCamposVacios(self.camposRequeridos):
             lote = LoteModel(str(self.lineCodigo.text()),
                              str(self.dateFechVenc.text()))
             if lote.guardar(self.sesion):
                 self.showMsjEstado("El Lote fue dado de alta.")
                 loteProducto = LoteProductoModel(
                     lote.getCodigo(), self.producto,
                     int(self.spinCantidad.value()))
                 if loteProducto.guardar(self.sesion):
                     self.showMsjEstado("Lote/Producto fue dado de alta.")
                 else:
                     self.showMsjEstado("Lote/Producto ya existe.")
                 self.limpiarCampos()
                 self.objectCreated.emit()
             else:
                 QtGui.QMessageBox.critical(self, 'Error',
                                            'El Lote ya existe.', 'Aceptar')
         else:
             self.showMsjEstado(
                 "Hay datos obligatorios que no fueron completados.")
Пример #3
0
 def crear(self):
     """
     Da de alta un lote nuevo y lo almacena en la base de datos.
     :return:
     """
     if self.producto == None:
         self.showMsjEstado("No se ha seleccionado ningun Producto de la tabla")
     else:
         if ValidarDatos.validarCamposVacios(self.camposRequeridos):
             lote = LoteModel(str(self.lineCodigo.text()), str(self.dateFechVenc.text()))
             if lote.guardar(self.sesion):
                 self.showMsjEstado("El Lote fue dado de alta.")
                 loteProducto = LoteProductoModel(lote.getCodigo(), self.producto,
                                                          int(self.spinCantidad.value()))
                 if loteProducto.guardar(self.sesion):
                     self.showMsjEstado("Lote/Producto fue dado de alta.")
                 else:
                     self.showMsjEstado("Lote/Producto ya existe.")
                 self.limpiarCampos()
                 self.objectCreated.emit()
             else:
                 QtGui.QMessageBox.critical(self, 'Error', 'El Lote ya existe.', 'Aceptar')
         else:
             self.showMsjEstado("Hay datos obligatorios que no fueron completados.")
Пример #4
0
class Producto(CRUDWidget, Ui_vtnProducto):
    """
    Lógica del ABM de producto.
    """
    def __init__(self, mdi):
        """
        Constructor de la clase Producto.
        :param mdi:
        :return:
        """
        MdiWidget.__init__(self, mdi)
        self.sesion = self.mdi().window().getSesionBD()
        self.validadores(ProductoModel)
        self.lote = None
        self.cantLoteProd = False

    def cargarProductos(self):
        """
        Carga los datos de los productos en la tabla de la ventana.
        :return:
        """
        self.cargarObjetos(self.tablaProducto,
            ProductoModel.buscarTodos("codigo_barra", self.sesion).all(),
            ("codigo_barra", "id_medicamento", "id_presentacion", "importe")
        )

    def crear(self):
        """
        Da de alta un producto nuevo y lo almacena en la base de datos.
        :return:
        """
        itemActualMed = self.tablaMedicamento.currentItem()
        if itemActualMed == None:
            QtGui.QMessageBox.warning(self, 'Atención', 'No se ha seleccionado ningun Medicamento de la tabla.', 'Aceptar')
        else:
            row = itemActualMed.row()
            medicamento = str(self.tablaMedicamento.item(row, 0).text())
            itemActualPres = self.tablaPresentacion.currentItem()
            if itemActualPres == None:
                QtGui.QMessageBox.warning(self, 'Atención', 'No se ha seleccionado ninguna Presentación de la tabla.',
                                          'Aceptar')
            else:
                row = itemActualPres.row()
                presentacion = str(self.tablaPresentacion.item(row, 0).text())
                if ValidarDatos.validarCamposVacios(self.camposRequeridos):
                    if not self.productoExiste(presentacion, medicamento, str(self.lineCodigo_Barra.text())):
                        if self.cantLoteProd:
                            producto = ProductoModel(str(self.lineCodigo_Barra.text()), medicamento,
                                                     presentacion, str(self.lineImporte.text()))
                            if self.validarLote(producto):
                                if producto.guardar(self.sesion):
                                    QtGui.QMessageBox.information(self, 'Info', 'El Producto fue dado de alta.',
                                                                  'Aceptar')
                                    producto.setDescuento(self.sesion)
                                    if self.lote == None:
                                        self.lote = LoteModel(str(self.lineCod_Lote.text()),
                                                              str(self.dateFechVenc.text()))
                                        if self.lote.guardar(self.sesion):
                                            QtGui.QMessageBox.information(self, 'Info', 'El Lote fue dado de alta.',
                                                                          'Aceptar')
                                        else:
                                            QtGui.QMessageBox.critical(self, 'Error', 'El Lote ya existe.', 'Aceptar')
                                    loteProducto = LoteProductoModel(self.lote.getCodigo(),
                                                                     str(self.lineCodigo_Barra.text()),
                                                                     int(self.spinCantidad.value()))
                                    loteProducto.guardar(self.sesion)
                                    self.actualizar()
                                    self.objectCreated.emit()
                                else:
                                    QtGui.QMessageBox.critical(self, 'Error', 'El Producto ya existe.', 'Aceptar')
                            else:
                                QtGui.QMessageBox.critical(self, 'Error', 'El Producto no puedo asociarse a un lote '
                                                                          'asociado a otro tipo de producto (distinto '
                                                                          'medicamento).', 'Aceptar')
                        else:
                            QtGui.QMessageBox.critical(self, 'Error', 'El Lote ya fue asignado a dos productos.',
                                                      'Aceptar')
                    else:
                        QtGui.QMessageBox.critical(self, 'Error', 'Ya existe un Producto con dicha Presentación '
                                                                  'y Medicamento.', 'Aceptar')
                else:
                    QtGui.QMessageBox.warning(self, 'Atención', 'Hay datos obligatorios que no fueron completados.',
                                              'Aceptar')

    def productoExiste(self, presentacion, medicamento, cod_barra):
        producto = ProductoModel.buscarProductoPresMed(self.sesion, ProductoModel, presentacion, medicamento).all()
        for prod in producto:
            if prod[0] != cod_barra:
                return True
        return False

    def validarLote(self, producto):
        if self.lote != None:
            loteProd = LoteProductoModel.buscar(LoteProductoModel.id_lote, self.sesion, self.lote.getCodigo()).all()
            if loteProd.__len__() == 1:
                for lp in loteProd:
                    prod = ProductoModel.buscar(ProductoModel.codigo_barra, self.sesion, lp.getIdProducto()).first()
                    if prod.getIdMedicamento() != producto.getIdMedicamento():
                        return False
        return True

    def eliminar(self):
        """
        Da de baja el producto seleccionado.
        :return:
        """
        itemActual = self.tablaProducto.currentItem()
        if itemActual == None:
            QtGui.QMessageBox.warning(self, 'Atención', 'No se ha seleccionado ningun Producto de la tabla.', 'Aceptar')
        else:
            row = itemActual.row()
            codigo_barra = str(self.tablaProducto.item(row, 0).text())
            if (self.stock(codigo_barra)):
                if self.bajaValida(codigo_barra):
                    self.producto = ProductoModel.buscarAlta(ProductoModel.codigo_barra,
                                                             self.sesion, codigo_barra).first()
                    self.actualizarLoteProd(self.producto.getCodigoBarra())
                    self.producto.borrar(self.sesion)
                    QtGui.QMessageBox.information(self, 'Info', 'El Producto ha sido dado de baja.', 'Aceptar')
                    self.tablaProducto.removeRow(row)
                    self.objectDeleted.emit()
                    self.actualizar()
            else:
                QtGui.QMessageBox.critical(self, 'Error', 'Existe stock para el Producto seleccionado. '
                                                          'No puede ser dado de baja', 'Aceptar')

    def stock(self, cod_barra):
        lote_producto = LoteProductoModel.buscar(LoteProductoModel.id_producto, self.sesion, cod_barra).all()
        for lp in lote_producto:
            if (lp.getCantidad() > 0):
                return False
        return True

    def actualizarLoteProd(self, producto):
        """
        Actualiza la cantidad de un producto para un lote determinado.
        :param producto: referencia del producto al cual se le actualiza la cantidad.
        :return:
        """
        lote_producto = LoteProductoModel.buscar(LoteProductoModel.id_producto,
                                                 self.sesion, producto).all()
        for lp in lote_producto:
            lp.setCantidad(0)
            lp.modificar(self.sesion)

    def modificar(self):
        """
        Modifica los datos del producto seleccionada.
        :return:
        """
        itemActual = self.tablaProducto.currentItem()
        if itemActual != None:
            if ValidarDatos.validarCamposVacios([self.lineImporte]):
                row = itemActual.row()
                codigo_barra = str(self.tablaProducto.item(row, 0).text())
                self.producto = ProductoModel.buscarAlta(ProductoModel.codigo_barra,
                                                         self.sesion, codigo_barra).first()
                self.producto.setImporte(str(self.lineImporte.text()))
                self.producto.modificar(self.sesion)
                QtGui.QMessageBox.information(self, 'Info', 'El Producto fue modificado.', 'Aceptar')
                self.objectModified.emit()
                self.actualizar()
            else:
                QtGui.QMessageBox.warning(self, 'Atención', 'Hay datos obligatorios que no fueron completados.', 'Aceptar')
        else:
            QtGui.QMessageBox.warning(self, 'Atención', 'No se ha seleccionado un Producto de la tabla.', 'Aceptar')

    def bajaValida(self, codigo_barra):
        """
        Verifica que el producto no figure en remitos pendientes de pago, facturas liquidadas pendientes de pago o
        facturas pendientes de liquidación.
        :param codigo_barra:
        :return:
        """
        detalleRemito = DetalleRemitoModel.buscarAlta(DetalleRemitoModel.producto,
                                                      self.sesion, codigo_barra).all()
        for dr in detalleRemito:
            remito = RemitoModel.buscarAlta(RemitoModel.numero, self.sesion, dr.getIdRemito()).first()
            if not (remito.getAnulado()):
                if not remito.getCobrado():
                    QtGui.QMessageBox.critical(self, 'Error', 'Existen remitos pendientes de pago '
                                                              'en los que figura dicho Producto.', 'Aceptar')
                    return False
        detalleFactura = DetalleFacturaModel.buscar(DetalleFacturaModel.producto,
                                                      self.sesion, codigo_barra).all()
        for df in detalleFactura:
            factura = FacturaModel.buscar(FacturaModel.numero, self.sesion, df.getIdFactura()).first()
            if not (factura.getAnulado()):
                if df.getDescuento() > 0:
                    facturaLiquidacion = FacturaLiquidacionModel.buscar(FacturaLiquidacionModel.nro_factura,
                                                        self.sesion, df.getIdFactura()).first()
                    if facturaLiquidacion:
                        cobroObraSocial = CobroObraSocialModel.buscar(
                                                        CobroObraSocialModel.id_factura_liquidacion, self.sesion,
                                                        facturaLiquidacion.getNumero()).first()
                        if cobroObraSocial == None:
                            QtGui.QMessageBox.critical(self, 'Error', 'Existen facturas liquidadas pendientes'
                                                                ' de cobro a la obra social en las que figura '
                                                                'dicho Producto.', 'Aceptar')
                            return False
                    else:
                        QtGui.QMessageBox.critical(self, 'Error', 'Existen facturas pendientes de liquidación'
                                                                ' en las que figura dicho Producto.', 'Aceptar')
                        return False
                elif factura.getFechaEmision() + timedelta(days=7) >= date.today():
                    QtGui.QMessageBox.critical(self, 'Error', 'El plazo de devolución de la factura no ha vencido.',
                                               'Aceptar')
                    return False
        return True

    def cargarCamposBaja(self):
        """
        Carga los campos con los datos del producto seleccionado.
        :return:
        """
        self.spinCantidad.setEnabled(False)
        self.lineNomb_Med.setEnabled(False)
        self.lineTipo_Pres.setEnabled(False)
        self.lineImporte.setEnabled(False)
        self.dateFechVenc.setEnabled(False)
        self.lineCod_Lote.setEnabled(False)
        self.cargarCamposMod()

    def buscarProducto(self):
        """
        Busca y carga en la tabla los datos de un producto para un código de barra ingresado.
        :return:
        """
        cod_barra = str(self.lineCodigo_Barra.text())
        data = self.getAllTabla(self.tablaProducto)

        if cod_barra != "":
            dataProd = filter(lambda x: x[0].upper() == cod_barra.upper(), data.values())
        else:
            dataProd = data.values()

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

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

    def buscarPresentacion(self):
        """
        Busca y carga en la tabla los datos de una presentación para un tipo ingresado.
        :return:
        """
        tipo = str(self.lineTipo_Pres.text())
        data = self.getAllTabla(self.tablaPresentacion)

        if tipo != "":
            dataPres = filter(lambda x: x[0].upper() == tipo.upper(), data.values())
        else:
            dataPres = data.values()

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

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

    def buscarMedicamento(self):
        """
        Busca y carga en la tabla los datos de un medicamento para un nombre comercial ingresado.
        :return:
        """
        nomb = str(self.lineNomb_Med.text())
        data = self.getAllTabla(self.tablaMedicamento)

        if nomb != "":
            dataMed = filter(lambda x: x[0].upper() == nomb.upper(), data.values())
        else:
            dataMed = data.values()

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

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

    def buscarLote(self):
        """
        Busca y carga en la tabla los datos de un lote para un código ingresado.
        :return:
        """
        self.lote = LoteModel.buscar(LoteModel.codigo, self.sesion, str(self.lineCod_Lote.text())).first()
        if self.lote != None:
            loteProducto = LoteProductoModel.buscar(LoteProductoModel.id_lote, self.sesion,
                                                              str(self.lineCod_Lote.text())).all()
            if loteProducto.__len__() < 2:
                self.cantLoteProd = True
            else:
                self.cantLoteProd = False
            self.dateFechVenc.setEnabled(False)
            formato = "%Y-%m-%d"
            fechaVenc = datetime.strptime(str(self.lote.fecha_vencimiento), formato)
            formato = "%d/%m/%y"
            f = fechaVenc.strftime(formato)
            formato = "dd/MM/yy"
            fecha = QtCore.QDate.fromString(str(f), formato)
            self.dateFechVenc.setDate(fecha)
        else:
            self.cantLoteProd = True
            self.setFecha()
            self.dateFechVenc.setEnabled(True)

    def setFecha(self):
        """
        Setea la fecha del Date Edit (campo de la fecha) con la fecha actual.
        :return:
        """
        formato = "%d/%m/%y"  # Asigna un formato dia mes año
        fechaAct = datetime.today()
        fechaVenc = fechaAct.strftime(formato)
        formato = "dd/MM/yy"
        fecha = QtCore.QDate.fromString(fechaVenc, formato)
        self.dateFechVenc.setDate(fecha)

    def actualizar(self):
        """
        Actualiza la ventana (campos y tablas).
        :return:
        """
        self.limpiarCampos()
        self.limpiarTabla(self.tablaProducto)
        self.cargarProductos()
        self.actualizarInfoMed()
        self.actualizarInfoPres()

    def actualizarInfoPres(self):
        """
        Actualiza la tabla de las presentaciones con los datos modificados.
        :return:
        """
        self.limpiarTabla(self.tablaPresentacion)
        self.cargarPresentaciones()

    def actualizarInfoMed(self):
        """
        Actualiza la tabla de los medicamentos con los datos modificados.
        :return:
        """
        self.limpiarTabla(self.tablaMedicamento)
        self.cargarMedicamentos()

    def limpiarCampos(self):
        """
        Vacia los campos de la ventana.
        :return:
        """
        self.lineCodigo_Barra.clear()
        self.lineCodigo_Barra.setEnabled(True)
        self.lineImporte.clear()
        self.lineNomb_Med.clear()
        self.lineTipo_Pres.clear()
        self.spinCantidad.setValue(1)
        self.setFecha()
        self.lineCod_Lote.clear()
        self.tablaMedicamento.setCurrentItem(None)
        self.tablaProducto.setCurrentItem(None)
        self.tablaPresentacion.setCurrentItem(None)
        self.lote = None
        self.cantLoteProd = False
        self.dateFechVenc.setEnabled(False)

    def cargarCamposMod(self):
        """
        Carga los campos con los datos del producto seleccionado.
        :return:
        """
        self.lineCodigo_Barra.setEnabled(False)
        row = self.tablaProducto.currentItem().row()
        infoItem = []
        for col in range(0, self.tablaProducto.columnCount()):
            infoItem.append(self.tablaProducto.item(row, col).text())
        #Cargar la info del item en los lines
        self.lineCodigo_Barra.setText(infoItem[0])
        self.lineImporte.setText(infoItem[3])

    def cargarPresentaciones(self):
        """
        Carga la tabla de las presentaciones con los datos de todos las presentaciones disponibles.
        :return:
        """
        self.cargarObjetos(self.tablaPresentacion,
            PresentacionModel.buscarTodos("tipo", self.sesion).all(),
            ("tipo", "unidad_medida", "cantidad_fracciones", "sub_presentacion")
        )

    def cargarMedicamentos(self):
        """
        Carga la tabla de los medicamentos con los datos de todos los medicamentos disponibles.
        :return:
        """
        self.cargarObjetos(self.tablaMedicamento,
            MedicamentoModel.buscarTodos("nombre_comercial", self.sesion).all(),
            ("nombre_comercial", "id_monodroga", "cantidad_monodroga")
        )

    def setMedicamento(self):
        """
        Setea la referencia al medicamento con el medicamento seleccionado.
        :return:
        """
        row = self.tablaMedicamento.currentItem().row()
        self.medicamento = str(self.tablaMedicamento.item(row, 0).text())
        self.lineNomb_Med.setText(self.medicamento)

    def setPresentacion(self):
        """
        Setea la referencia a la presentación con la presentación seleccionada.
        :return:
        """
        row = self.tablaPresentacion.currentItem().row()
        self.presentacion = str(self.tablaPresentacion.item(row, 0).text())
        self.lineTipo_Pres.setText(self.presentacion)

    @classmethod
    def create(cls, mdi):
        """
        Configuración de la ventana Alta Producto.
        :param mdi: referencia a la ventana Alta Producto.
        :return: gui
        """
        gui = super(Producto, cls).create(mdi)
        gui.tablaProducto.hide()
        gui.btnBuscarProd.hide()
        gui.dateFechVenc.setEnabled(False)
        gui.cargarPresentaciones()
        gui.cargarMedicamentos()
        gui.setFecha()
        gui.lineCod_Lote.returnPressed.connect(gui.buscarLote)
        gui.btnBuscarLote.pressed.connect(gui.buscarLote)
        gui.lineNomb_Med.returnPressed.connect(gui.buscarMedicamento)
        gui.btnBuscarMed.pressed.connect(gui.buscarMedicamento)
        gui.lineTipo_Pres.returnPressed.connect(gui.buscarPresentacion)
        gui.btnBuscarPres.pressed.connect(gui.buscarPresentacion)
        gui.tablaMedicamento.itemClicked.connect(gui.setMedicamento)
        gui.tablaPresentacion.itemClicked.connect(gui.setPresentacion)
        gui.btnAceptar.pressed.connect(gui.crear)
        gui.btnCancelar.pressed.connect(gui.cancelar)
        return gui

    @classmethod
    def delete(cls, mdi):
        """
        Configuración de la ventana Baja Producto.
        :param mdi: referencia a la ventana Baja Producto.
        :return: gui
        """
        gui = super(Producto, cls).delete(mdi)
        gui.lineImporte.setHidden(True)
        gui.label_imp.setHidden(True)
        gui.gbMedicamento.hide()
        gui.gbPresentacion.hide()
        gui.gbLote.hide()
        gui.linea1.hide()
        gui.linea2.hide()
        gui.linea3.hide()
        gui.lineCodigo_Barra.returnPressed.connect(gui.buscarProducto)
        gui.btnBuscarProd.pressed.connect(gui.buscarProducto)
        gui.cargarProductos()
        gui.btnAceptar.pressed.connect(gui.eliminar)
        gui.btnCancelar.pressed.connect(gui.cancelar)
        gui.tablaProducto.itemClicked.connect(gui.cargarCamposBaja)
        return gui

    @classmethod
    def update(cls, mdi):
        """
        Configuración de la ventana Modificación Producto.
        :param mdi: referencia a la ventana Modificación Producto.
        :return: gui
        """
        gui = super(Producto, cls).update(mdi)
        gui.cargarProductos()
        gui.tablaProducto.itemClicked.connect(gui.cargarCamposMod)
        gui.gbMedicamento.hide()
        gui.gbPresentacion.hide()
        gui.gbLote.hide()
        gui.linea1.hide()
        gui.linea2.hide()
        gui.linea3.hide()
        gui.lineCodigo_Barra.returnPressed.connect(gui.buscarProducto)
        gui.btnBuscarProd.pressed.connect(gui.buscarProducto)
        gui.btnAceptar.pressed.connect(gui.modificar)
        gui.btnCancelar.pressed.connect(gui.cancelar)
        return gui

    def addHandlerSignal(self):

        self.sender = PoolOfWindows.getVentana("AltaMedicamento")
        self.sender.objectCreated.connect(self.actualizarInfoMed)
        self.sender1 = PoolOfWindows.getVentana("BajaMedicamento")
        self.sender1.objectDeleted.connect(self.actualizarInfoMed)
        self.sender2 = PoolOfWindows.getVentana("ModificarMedicamento")
        self.sender2.objectModified.connect(self.actualizarInfoMed)
        self.sender3 = PoolOfWindows.getVentana("AltaPresentacion")
        self.sender3.objectCreated.connect(self.actualizarInfoPres)
        self.sender4 = PoolOfWindows.getVentana("BajaPresentacion")
        self.sender4.objectDeleted.connect(self.actualizarInfoPres)
        self.sender5 = PoolOfWindows.getVentana("ModificarPresentacion")
        self.sender5.objectModified.connect(self.actualizarInfoPres)

    def cancelarVentana(self):
        self.actualizar()
Пример #5
0
class Producto(CRUDWidget, Ui_vtnProducto):
    """
    Lógica del ABM de producto.
    """
    def __init__(self, mdi):
        """
        Constructor de la clase Producto.
        :param mdi:
        :return:
        """
        MdiWidget.__init__(self, mdi)
        self.sesion = self.mdi().window().getSesionBD()
        self.validadores(ProductoModel)
        self.lote = None
        self.cantLoteProd = False

    def cargarProductos(self):
        """
        Carga los datos de los productos en la tabla de la ventana.
        :return:
        """
        self.cargarObjetos(
            self.tablaProducto,
            ProductoModel.buscarTodos("codigo_barra", self.sesion).all(),
            ("codigo_barra", "id_medicamento", "id_presentacion", "importe"))

    def crear(self):
        """
        Da de alta un producto nuevo y lo almacena en la base de datos.
        :return:
        """
        itemActualMed = self.tablaMedicamento.currentItem()
        if itemActualMed == None:
            self.showMsjEstado(
                "No se ha seleccionado ningun Medicamento de la tabla")
        else:
            row = itemActualMed.row()
            medicamento = str(self.tablaMedicamento.item(row, 0).text())
            itemActualPres = self.tablaPresentacion.currentItem()
            if itemActualPres == None:
                self.showMsjEstado(
                    "No se ha seleccionado ninguna Presentación de la tabla")
            else:
                row = itemActualPres.row()
                presentacion = str(self.tablaPresentacion.item(row, 0).text())
                if ValidarDatos.validarCamposVacios(self.camposRequeridos):
                    if self.cantLoteProd:
                        producto = ProductoModel(
                            str(self.lineCodigo_Barra.text()), medicamento,
                            presentacion, str(self.lineImporte.text()))
                        if producto.guardar(self.sesion):
                            self.showMsjEstado("El Producto fue dado de alta.")
                            if self.lote == None:
                                self.lote = LoteModel(
                                    str(self.lineCod_Lote.text()),
                                    str(self.dateFechVenc.text()))
                                if self.lote.guardar(self.sesion):
                                    self.showMsjEstado(
                                        "El Lote fue dado de alta.")
                                else:
                                    self.showMsjEstado("El Lote ya existe.")
                            loteProducto = LoteProductoModel(
                                self.lote.getCodigo(),
                                str(self.lineCodigo_Barra.text()),
                                int(self.spinCantidad.value()))
                            if loteProducto.guardar(self.sesion):
                                self.showMsjEstado(
                                    "Lote/Producto fue dado de alta.")
                            else:
                                self.showMsjEstado("Lote/Producto ya existe.")
                            self.actualizar()
                            self.objectCreated.emit()
                        else:
                            self.showMsjEstado("El Producto ya existe.")
                    else:
                        self.showMsjEstado(
                            "El Lote ya fue asignado a dos productos.")
                else:
                    self.showMsjEstado(
                        "Hay datos obligatorios que no fueron completados.")

    def eliminar(self):
        """
        Da de baja el producto seleccionado.
        :return:
        """
        #TODO consultar si hay stock antes de dar de baja.
        itemActual = self.tablaProducto.currentItem()
        if itemActual == None:
            self.showMsjEstado(
                "No se ha seleccionado ningun Producto de la tabla")
        else:
            row = itemActual.row()
            codigo_barra = str(self.tablaProducto.item(row, 0).text())
            if self.bajaValida(codigo_barra):
                self.producto = ProductoModel.buscarAlta(
                    ProductoModel.codigo_barra, self.sesion,
                    codigo_barra).first()
                self.actualizarLoteProd(self.producto.getCodigoBarra())
                self.producto.borrar(self.sesion)
                self.showMsjEstado("El Producto ha sido dado de baja")
                self.tablaProducto.removeRow(row)
                self.objectDeleted.emit()
                self.actualizar()

    def actualizarLoteProd(self, producto):
        """
        Actualiza la cantidad de un producto para un lote determinado.
        :param producto: referencia del producto al cual se le actualiza la cantidad.
        :return:
        """
        lote_producto = LoteProductoModel.buscar(LoteProductoModel.id_producto,
                                                 self.sesion, producto).all()
        for lp in lote_producto:
            lp.setCantidad(0)
            lp.modificar(self.sesion)

    def modificar(self):
        """
        Modifica los datos del producto seleccionada.
        :return:
        """
        itemActual = self.tablaProducto.currentItem()
        if itemActual != None:
            if ValidarDatos.validarCamposVacios([self.lineImporte]):
                row = itemActual.row()
                codigo_barra = str(self.tablaProducto.item(row, 0).text())
                self.producto = ProductoModel.buscarAlta(
                    ProductoModel.codigo_barra, self.sesion,
                    codigo_barra).first()
                self.producto.setImporte(str(self.lineImporte.text()))
                self.producto.modificar(self.sesion)
                self.showMsjEstado("El Producto fue modificado")
                self.objectModified.emit()
                self.actualizar()
            else:
                self.showMsjEstado(
                    "Hay datos obligatorios que no fueron completados.")
        else:
            self.showMsjEstado("No se ha seleccionado un Producto de la tabla")

    def bajaValida(self, codigo_barra):
        """
        Verifica que el producto no figure en remitos pendientes de pago, facturas liquidadas pendientes de pago o
        facturas pendientes de liquidación.
        :param codigo_barra:
        :return:
        """
        detalleRemito = DetalleRemitoModel.buscarAlta(
            DetalleRemitoModel.producto, self.sesion, codigo_barra).all()
        for dr in detalleRemito:
            remito = RemitoModel.buscarAlta(RemitoModel.numero, self.sesion,
                                            dr.getIdRemito()).first()
            if remito.getCobrado() == None:
                QtGui.QMessageBox.critical(
                    self, 'Error', 'Existen remitos pendientes de pago '
                    'en los que figura dicho Producto.', 'Aceptar')
                return False
        detalleFactura = DetalleFacturaModel.buscar(
            DetalleFacturaModel.producto, self.sesion, codigo_barra).all()
        for df in detalleFactura:
            if df.getDescuento() > 0:
                facturaLiquidacion = FacturaLiquidacionModel.buscar(
                    FacturaLiquidacionModel.nro_factura, self.sesion,
                    df.getIdFactura()).first()
                if facturaLiquidacion:
                    cobroObraSocial = CobroObraSocialModel.buscar(
                        CobroObraSocialModel.id_factura_liquidacion,
                        self.sesion, facturaLiquidacion.getNumero()).first()
                    if cobroObraSocial == None:
                        QtGui.QMessageBox.critical(
                            self, 'Error',
                            'Existen facturas liquidadas pendientes'
                            ' de cobro a la obra social en las que figura '
                            'dicho Producto.', 'Aceptar')
                        return False
                else:
                    QtGui.QMessageBox.critical(
                        self, 'Error',
                        'Existen facturas pendientes de liquidación'
                        ' en las que figura dicho Producto.', 'Aceptar')
                    return False
        return True

    def cargarCamposBaja(self):
        """
        Carga los campos con los datos del producto seleccionado.
        :return:
        """
        self.spinCantidad.setEnabled(False)
        self.lineNomb_Med.setEnabled(False)
        self.lineTipo_Pres.setEnabled(False)
        self.lineImporte.setEnabled(False)
        self.dateFechVenc.setEnabled(False)
        self.lineCod_Lote.setEnabled(False)
        self.cargarCamposMod()

    def buscarProducto(self):
        """
        Busca y carga en la tabla los datos de un producto para un código de barra ingresado.
        :return:
        """
        self.limpiarTabla(self.tablaProducto)
        self.cargarObjetos(
            self.tablaProducto,
            ProductoModel.buscarAlta(ProductoModel.codigo_barra, self.sesion,
                                     str(self.lineCodigo_Barra.text())).all(),
            ("codigo_barra", "id_medicamento", "id_presentacion", "importe"))

    def buscarPresentacion(self):
        """
        Busca y carga en la tabla los datos de una presentación para un tipo ingresado.
        :return:
        """
        self.limpiarTabla(self.tablaPresentacion)
        self.cargarObjetos(
            self.tablaPresentacion,
            PresentacionModel.buscarLike(PresentacionModel.tipo, self.sesion,
                                         str(self.lineTipo_Pres.text())).all(),
            ("tipo", "unidad_medida", "cantidad_fracciones",
             "sub_presentacion"))

    def buscarMedicamento(self):
        """
        Busca y carga en la tabla los datos de un medicamento para un nombre comercial ingresado.
        :return:
        """
        self.limpiarTabla(self.tablaMedicamento)
        self.cargarObjetos(
            self.tablaMedicamento,
            MedicamentoModel.buscarLike(MedicamentoModel.nombre_comercial,
                                        self.sesion,
                                        str(self.lineNomb_Med.text())).all(),
            ("nombre_comercial", "id_monodroga", "cantidad_monodroga"))

    def buscarLote(self):
        """
        Busca y carga en la tabla los datos de un lote para un código ingresado.
        :return:
        """
        self.lote = LoteModel.buscar(LoteModel.codigo, self.sesion,
                                     str(self.lineCod_Lote.text())).first()
        if self.lote != None:
            loteProducto = LoteProductoModel.buscar(
                LoteProductoModel.id_lote, self.sesion,
                str(self.lineCod_Lote.text())).all()
            if loteProducto.__len__() < 2:
                self.cantLoteProd = True
            else:
                self.cantLoteProd = False
            self.dateFechVenc.setEnabled(False)
            formato = "%Y-%m-%d"
            fechaVenc = datetime.strptime(str(self.lote.fecha_vencimiento),
                                          formato)
            formato = "%d/%m/%y"
            f = fechaVenc.strftime(formato)
            formato = "dd/MM/yy"
            fecha = QtCore.QDate.fromString(str(f), formato)
            self.dateFechVenc.setDate(fecha)
        else:
            self.cantLoteProd = True
            self.setFecha()
            self.dateFechVenc.setEnabled(True)

    def setFecha(self):
        """
        Setea la fecha del Date Edit (campo de la fecha) con la fecha actual.
        :return:
        """
        formato = "%d/%m/%y"  # Asigna un formato dia mes año
        fechaAct = datetime.today()
        fechaVenc = fechaAct.strftime(formato)
        formato = "dd/MM/yy"
        fecha = QtCore.QDate.fromString(fechaVenc, formato)
        self.dateFechVenc.setDate(fecha)

    def actualizar(self):
        """
        Actualiza la ventana (campos y tablas).
        :return:
        """
        self.limpiarCampos()
        self.limpiarTabla(self.tablaProducto)
        self.cargarProductos()
        self.actualizarInfoMed()
        self.actualizarInfoPres()

    def actualizarInfoPres(self):
        """
        Actualiza la tabla de las presentaciones con los datos modificados.
        :return:
        """
        self.limpiarTabla(self.tablaPresentacion)
        self.cargarPresentaciones()

    def actualizarInfoMed(self):
        """
        Actualiza la tabla de los medicamentos con los datos modificados.
        :return:
        """
        self.limpiarTabla(self.tablaMedicamento)
        self.cargarMedicamentos()

    def limpiarCampos(self):
        """
        Vacia los campos de la ventana.
        :return:
        """
        self.lineCodigo_Barra.clear()
        self.lineCodigo_Barra.setEnabled(True)
        self.lineImporte.clear()
        self.lineNomb_Med.clear()
        self.lineTipo_Pres.clear()
        self.spinCantidad.setValue(1)
        self.setFecha()
        self.lineCod_Lote.clear()
        self.tablaMedicamento.setCurrentItem(None)
        self.tablaProducto.setCurrentItem(None)
        self.tablaPresentacion.setCurrentItem(None)
        self.lote = None
        self.cantLoteProd = False
        self.dateFechVenc.setEnabled(False)

    def cargarCamposMod(self):
        """
        Carga los campos con los datos del producto seleccionado.
        :return:
        """
        self.lineCodigo_Barra.setEnabled(False)
        row = self.tablaProducto.currentItem().row()
        infoItem = []
        for col in range(0, self.tablaProducto.columnCount()):
            infoItem.append(self.tablaProducto.item(row, col).text())
        #Cargar la info del item en los lines
        self.lineCodigo_Barra.setText(infoItem[0])
        self.lineImporte.setText(infoItem[3])

    def cargarPresentaciones(self):
        """
        Carga la tabla de las presentaciones con los datos de todos las presentaciones disponibles.
        :return:
        """
        self.cargarObjetos(
            self.tablaPresentacion,
            PresentacionModel.buscarTodos("tipo", self.sesion).all(),
            ("tipo", "unidad_medida", "cantidad_fracciones",
             "sub_presentacion"))

    def cargarMedicamentos(self):
        """
        Carga la tabla de los medicamentos con los datos de todos los medicamentos disponibles.
        :return:
        """
        self.cargarObjetos(
            self.tablaMedicamento,
            MedicamentoModel.buscarTodos("nombre_comercial",
                                         self.sesion).all(),
            ("nombre_comercial", "id_monodroga", "cantidad_monodroga"))

    def setMedicamento(self):
        """
        Setea la referencia al medicamento con el medicamento seleccionado.
        :return:
        """
        row = self.tablaMedicamento.currentItem().row()
        self.medicamento = str(self.tablaMedicamento.item(row, 0).text())
        self.lineNomb_Med.setText(self.medicamento)

    def setPresentacion(self):
        """
        Setea la referencia a la presentación con la presentación seleccionada.
        :return:
        """
        row = self.tablaPresentacion.currentItem().row()
        self.presentacion = str(self.tablaPresentacion.item(row, 0).text())
        self.lineTipo_Pres.setText(self.presentacion)

    @classmethod
    def create(cls, mdi):
        """
        Configuración de la ventana Alta Producto.
        :param mdi: referencia a la ventana Alta Producto.
        :return: gui
        """
        gui = super(Producto, cls).create(mdi)
        gui.tablaProducto.hide()
        gui.btnBuscarProd.hide()
        gui.dateFechVenc.setEnabled(False)
        gui.cargarPresentaciones()
        gui.cargarMedicamentos()
        gui.setFecha()
        gui.lineCod_Lote.returnPressed.connect(gui.buscarLote)
        gui.btnBuscarLote.pressed.connect(gui.buscarLote)
        gui.lineNomb_Med.returnPressed.connect(gui.buscarMedicamento)
        gui.btnBuscarMed.pressed.connect(gui.buscarMedicamento)
        gui.lineTipo_Pres.returnPressed.connect(gui.buscarPresentacion)
        gui.btnBuscarPres.pressed.connect(gui.buscarPresentacion)
        gui.tablaMedicamento.itemClicked.connect(gui.setMedicamento)
        gui.tablaPresentacion.itemClicked.connect(gui.setPresentacion)
        gui.btnActualizarMed.pressed.connect(gui.actualizarInfoMed)
        gui.btnActualizarPres.pressed.connect(gui.actualizarInfoPres)
        gui.btnAceptar.pressed.connect(gui.crear)
        gui.btnCancelar.pressed.connect(gui.actualizar)
        return gui

    @classmethod
    def delete(cls, mdi):
        """
        Configuración de la ventana Baja Producto.
        :param mdi: referencia a la ventana Baja Producto.
        :return: gui
        """
        gui = super(Producto, cls).delete(mdi)
        gui.lineImporte.setEnabled(False)
        gui.gbMedicamento.hide()
        gui.gbPresentacion.hide()
        gui.gbLote.hide()
        gui.linea1.hide()
        gui.linea2.hide()
        gui.linea3.hide()
        gui.lineCodigo_Barra.returnPressed.connect(gui.buscarProducto)
        gui.btnBuscarProd.pressed.connect(gui.buscarProducto)
        gui.cargarProductos()
        gui.btnAceptar.pressed.connect(gui.eliminar)
        gui.btnCancelar.pressed.connect(gui.actualizar)
        gui.tablaProducto.itemClicked.connect(gui.cargarCamposBaja)
        return gui

    @classmethod
    def update(cls, mdi):
        """
        Configuración de la ventana Modificación Producto.
        :param mdi: referencia a la ventana Modificación Producto.
        :return: gui
        """
        gui = super(Producto, cls).update(mdi)
        gui.cargarProductos()
        gui.tablaProducto.itemClicked.connect(gui.cargarCamposMod)
        gui.gbMedicamento.hide()
        gui.gbPresentacion.hide()
        gui.gbLote.hide()
        gui.linea1.hide()
        gui.linea2.hide()
        gui.linea3.hide()
        gui.lineCodigo_Barra.returnPressed.connect(gui.buscarProducto)
        gui.btnBuscarProd.pressed.connect(gui.buscarProducto)
        gui.btnAceptar.pressed.connect(gui.modificar)
        gui.btnCancelar.pressed.connect(gui.actualizar)
        return gui