Descripción y objetivo
E ste proyecto tiene como objetivo desarrollar un sistema de gestión de inventarios eficiente, con una interfaz basada en consola que permita a los usuarios realizar operaciones clave, como agregar, buscar, eliminar y listar productos. Además, se incluyen cálculos para el valor total del inventario y validaciones que aseguran la correcta manipulación de los datos.
Funcionalidades Principales
✅ Gestión de productos: Carga, búsqueda y eliminación de productos mediante un identificador único.
✅ Cálculo de métricas: Determinación del valor total del inventario y promedio de precios.
✅ Control de stock: Listado de productos con niveles bajos de inventario.
✅ Persistencia de datos: Opción para guardar la información en un archivo de texto.
✅ Interfaz basada en menú: Sistema interactivo que funciona hasta que el usuario decide salir.
Enfoque en Programación Orientada a Objetos (POO)
-
- Encapsulamiento: Métodos get y set para acceder y modificar atributos.
- Herencia: Clase Artículo como base y Producto como subclase.
- Polimorfismo: Métodos sobrescritos para mostrar información de cada producto.
- Abstracción: Métodos abstractos que garantizan la implementación de ciertas funcionalidades.
- Encapsulamiento: Métodos get y set para acceder y modificar atributos.
Código
A continuación, se muestra un fragmento del código Python del proyecto, ya que es extenso y no se visualiza bien en dispositivos móviles. Se recomienda verlo en Google Colab, GitHub o descargar el notebook para acceder al código completo, los comentarios y realizar pruebas.
from abc import ABC, abstractmethod # Importamos el modulo 're' para trabajar con expresiones regulares import re class Articulo(ABC): # Inicializamos el metodo constructor de la clase 'Articulo' def __init__(self, nombre, categoria, proveedor): # Asignamos el valor del argumento 'Nombre' a la variable de instancia '_nombre' self._nombre = nombre # Asignamos el valor del argumento 'Categoria' a la variable de instancia '_categoria' self._categoria = categoria # Asignamos el valor del argumento 'Proveedor' a la variable de instancia '_proveedor' self._proveedor = proveedor # Metodo Getter para el atributo 'Nombre' que # Permite Obtener el nombre del Articulo @property def nombre(self): return self._nombre # Metodo Setter para el atributo 'Nombre' que # Permite establecer un nuevo nombre para el Articulo @nombre.setter def nombre(self, ingresar_nuevo_nombre): self._nombre = ingresar_nuevo_nombre # Metodo Getter para el atributo 'Categoria' que # Permite Obtener la Categoria del Articulo @property def categoria(self): return self._categoria # Metodo Setter para el atributo 'Categoria' que # Permite establecer una nueva Categoria para el Articulo @categoria.setter def categoria(self, ingresar_nueva_categoria): self._categoria = ingresar_nueva_categoria # Metodo Getter para el atributo 'Proveedor' que # Permite Obtener el Proveedor del Articulo @property def proveedor(self): return self._proveedor # Metodo Setter para el atributo 'Proveedor' que # Permite establecer un Nuevo Proveedor para el Articulo @proveedor.setter def proveedor(self, ingresar_nuevo_proveedor): self._proveedor = ingresar_nuevo_proveedor @abstractmethod def mostrar_informacion(self): pass
# Creamos una subclase 'Producto'de la clase base 'Articulo' class Producto(Articulo): def __init__(self, nombre, categoria, proveedor, codigo, cantidad_stock, precio): # Llamamos al metodo constructor de la clase base (Articulo) # para inicializar 'nombre', 'categoria' y 'proveedor' super().__init__(nombre, categoria, proveedor) # Asignamos el valor del argumento 'Codigo' a la variable de instancia '_codigo' self._codigo = codigo # Asignamos el valor del argumento 'Cantidad_Stock' a la variable de instancia '_cantidad_stock' self._cantidad_stock = cantidad_stock # Asignamos el valor del argumento 'Precio' a la variable de instancia '_precio' self._precio = precio # Metodo Getter para el atributo 'codigo' que # Permite Obtener el Codigo del Articulo @property def codigo(self): return self._codigo # Metodo Setter para el atributo 'Codigo' que # Permite establecer un Nuevo Codigo para el Articulo @codigo.setter def codigo(self, ingresar_nuevo_codigo): self._codigo = ingresar_nuevo_codigo # Metodo Getter para el atributo 'Cantidad_Stock' que # Permite Obtener la Cantidad de Stock del Articulo @property def cantidad_stock(self): return self._cantidad_stock # Metodo Setter para el atributo 'Cantidad_Stock' que # Permite establecer una nueva Cantidad de Stock para el Articulo @cantidad_stock.setter def cantidad_stock(self, ingresar_nuevo_stock): self._cantidad_stock = ingresar_nuevo_stock # Metodo Getter para el atributo 'Precio' que # Permite Obtener el Precio del Articulo @property def precio(self): return self._precio # Metodo Setter para el atributo 'Precio' que # Permite establecer un nuevo Precio para el Articulo @precio.setter def precio(self, ingresar_nuevo_precio): self._precio = ingresar_nuevo_precio # Creamos el metodo informacion para la subclase Producto def mostrar_informacion(self): return f'Codigo de Producto: {self.codigo} - Nombre del producto: {self._nombre} - Categoria: {self.categoria} - Precio: ${self.precio} - Stock: {self.cantidad_stock} Unidades - Proveedor: {self.proveedor}'