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 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 listarProductos(self, lote_producto): """ Genera el html usado para generar el pdf final del listado de los productos en stock. :param lote_producto: arreglo que contiene todos los productos y sus diferentes lotes. :return: """ archivo = open("PlantillasListados/productosStock.html", "r") contenido = archivo.read() archivo.close() body = "" i = 0 for lp in lote_producto: if (lp.getCantidad() > 0): i += 1 producto = Producto.buscar(Producto.codigo_barra, self.sesion, lp.getIdProducto()).first() nr_prod = str(i) id_lote = str(lp.getIdLote()) desc = str(producto.getIdMedicamento()) + """ """ + str(producto.getIdPresentacion()) cant = str(lp.getCantidad()) cadena = """<tr> <td><strong>{producto}</strong></td> <td class="text-right">{lote}</td> <td><strong>{descripcion}</strong></td> <td class="text-right">{cantidad}</td> </tr>""".format(producto=nr_prod, lote=id_lote, descripcion=desc, cantidad=cant) body += cadena contenido_nuevo = contenido.format(contenido=body) archivo = open("reportes/listadoProductosStock.html", "w") archivo.write(contenido_nuevo) archivo.close()
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 cargarProductos(self): """ Carga la tabla de los productos con los datos de todos los productos disponibles. :return: """ self.cargarObjetos( self.tablaProducto, ProductoModel.buscarTodos("codigo_barra", self.sesion).all(), ("codigo_barra", "id_medicamento", "id_presentacion", "importe"))
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 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 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 buscarProducto(self): """ Busca y carga en la tabla los datos de un producto para un codigo de barra ingresado. :return: """ self.limpiarTabla(self.tablaProducto) self.cargarObjetos( self.tablaProducto, ProductoModel.buscarAlta(ProductoModel.codigo_barra, self.sesion, str(self.lineCod_Barra.text())).all(), ("codigo_barra", "id_medicamento", "id_presentacion", "importe"))
def buscarProducto(self): """ Busca y carga en la tabla los datos de un producto para un codigo de barra ingresado. :return: """ self.limpiarTabla(self.tablaProducto) self.cargarObjetos(self.tablaProducto, ProductoModel.buscarAlta(ProductoModel.codigo_barra, self.sesion, str(self.lineCod_Barra.text())).all(), ("codigo_barra", "id_medicamento", "id_presentacion", "importe") )
def productosStock(self, lote_producto): """ Devuelve un los datos de los productos y su/s lote/s de aquellos que tengan una cantidad mayor a 0 en stock. :param lote_producto: arreglo de todos los lotes/productos almacenados en la base de datos. :return: data """ data = [] for lp in lote_producto: if (lp.getCantidad() > 0): producto = Producto.buscar(Producto.codigo_barra, self.sesion, lp.getIdProducto()).first() descripcion = str(producto.getIdMedicamento()) + " " + str (producto.getIdPresentacion()) data.append((descripcion, lp.getCantidad())) return data
def cantidadFracciones(self, codigo, cantidad): """ Calcula y devuelve la cantidad del poducto (subproducto, fracciones del producto fraccionable), número de fracciones * cantidad a fraccionar. :param codigo: Código del producto a fraccionar. :param cantidad: Cantidad a fraccionar. :return: resultado """ producto = ProductoModel.buscarAlta(ProductoModel.codigo_barra, self.sesion, codigo).first() presentacion = PresentacionModel.buscarAlta(PresentacionModel.tipo, self.sesion, producto.id_presentacion).first() resultado = int(presentacion.getCantidadFracciones()) * cantidad return resultado
def cantidadFracciones(self, codigo, cantidad): """ Calcula y devuelve la cantidad del poducto (subproducto, fracciones del producto fraccionable), número de fracciones * cantidad a fraccionar. :param codigo: Código del producto a fraccionar. :param cantidad: Cantidad a fraccionar. :return: resultado """ producto = ProductoModel.buscarAlta(ProductoModel.codigo_barra, self.sesion, codigo).first() presentacion = PresentacionModel.buscarAlta( PresentacionModel.tipo, self.sesion, producto.id_presentacion).first() resultado = int(presentacion.getCantidadFracciones()) * cantidad return resultado
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_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 generarExcelProductos(self): """ Crea el listado en Excel correspondiente al total de los productos en stock en la farmacia :return None: """ data={} lotesProductos={} for producto in (ProductoModel.buscarTodos("codigo_barra",self.sesion).all()): nombreProducto = '%(medicamento)s %(presentacion)s' % \ {"medicamento":producto.id_medicamento, "presentacion":producto.id_presentacion} data[nombreProducto.upper()]=producto.getCantidad(self.sesion) lotesProductos[nombreProducto]=producto.buscarLotes(self.sesion) documento=xlsxwriter.Workbook(Listar.path_excel_files + "/StockProductos.xlsx") hoja=documento.add_worksheet('General') bold = documento.add_format({'bold': 1,}) bold.set_align('center') hoja.set_column(0,0,45) hoja.set_column(1,1,15) ##Añado un grafico al documento grafico = documento.add_chart({'type':'column'}) productos=list(data.keys()) cantidades=list(data.values()) hoja.write('A1','Producto',bold) hoja.write('B1','Cantidad',bold) hoja.write_column('A2',productos) hoja.write_column('B2',cantidades) grafico.add_series({ 'categories':[hoja.name,1,0,len(productos),0], 'values': [hoja.name,1,1,len(cantidades),1] }) grafico.set_x_axis({ 'name':'Productos', 'name-font':{'size':16,'bold':True}, 'num_font':{'italic':True}, }) hoja.insert_chart('E3', grafico) for producto in lotesProductos: self.generarHojaProducto(documento,producto,lotesProductos[producto]) documento.close() QtGui.QMessageBox.information(self, "Listado" , "El listado ha sido generado con exito")
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 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 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 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 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 htmlProductosStock(self, lote_producto): """ Genera el html usado para generar el pdf final del listado de los productos en stock. :param lote_producto: arreglo que contiene todos los productos y sus diferentes lotes. :return: hmtl """ #TODO esta bien q se de de baja un producto para el q hay stock??? # hay q listar los dados de baja?? esto depende de la resp a la preg anterior. i = 0 html = """<html> <head> </head> <body> <div id="contenedor"> <header id="encabezado"> <h1 align="center">Listado Productos en Stock</h1> </header> <div id="items"> <table border width="100%"> <th bgcolor="#38B0DE">Producto</th> <th bgcolor="#38B0DE">Nro Lote</th> <th bgcolor="#38B0DE">Descripción</th> <th bgcolor="#38B0DE">Cantidad</th>""" for lp in lote_producto: if (lp.getCantidad() > 0): i += 1 producto = Producto.buscar(Producto.codigo_barra, self.sesion, lp.getIdProducto()).first() html += """<tr><td width="10%">""" + str(i) html += """</td><td width="10%">""" + str(lp.getIdLote()) html += """</td><td width="70%">""" + str(producto.getIdMedicamento()) \ + """ """ + str(producto.getIdPresentacion()) html += """</td><td width="10%">""" + str(lp.getCantidad()) html += """</td></tr>""" html += """</table></div></div></body></html>""" html += """<img src="diagBarra.png">""" return html
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 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