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')
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.")
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.")
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()
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