Sistema de Gestión de Inventarios

  Cesar Gabriel   ⁣   5 febrero, 2025

Desarrollé un sistema de gestión de inventarios en Python aplicando principios de Programación Orientada a Objetos (POO). Este programa permite registrar productos, gestionar stock, calcular métricas clave y almacenar datos en un archivo. Además, implementa validaciones y manejo de excepciones para garantizar la integridad de la información.

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.

Manejo de Errores y Validaciones:

⚠️​ Se implementan validaciones y excepciones para evitar errores comunes, como:
    • Impedir la creación de productos con código duplicado.
    • Garantizar que el stock no sea negativo.
    • Asegurar que los precios sean valores positivos.

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}'

¿Querés ver los detalles por tu cuenta?

Accedé al material relacionado con este proyecto en OneDrive o GitHub, o ejecútalo directamente en Google Colab. Hacé clic en el ícono de descarga para obtener los archivos.

📌 Créditos de imágenes: Jcomp en Freepik.

guest
0 Comentarios
Más viejo
Más nuevo Más votado
Feedbacks de Inline
Ver todos los comentarios

hola