UNIVERSIDAD PRIVADA FRANZ TAMAYO
FACULTAD DE INGENIERIA
CARRERA DE INGENIERIA EN SISTEMAS
SISTEMA DE GESTION PARA TIENDAS
Docente:
Carmen Rosa Mollinedo Laura
MATERIA:
Base de Datos II
NOMBRES:
• COPAÑA CONDORI BIANCA ISABEL
• BRIZEYDA ALZIRA AGUILAR FERNANDEZ
EL ALTO – BOLIVIA
2025
INDICE GENERAL
I. RESUMEN DEL PROYECTO .................................................................................... 6
PROJECT SUMMARY....................................................................................................... 6
II. CAPÍTULO I - CONSIDERACIONES GENERALES .................................................. 1
1.1. Introducción.......................................................................................................... 1
1.2. Antecedentes ....................................................................................................... 2
1.2.1. Estudios previos ............................................................................................ 2
1.2.2. Proyectos institucionales relacionados .......................................................... 3
1.3. Planteamiento del Problema ................................................................................ 4
1.3.1. Pregunta de investigación ............................................................................. 4
1.3.2. Problemas específicos ................................................................................... 4
1.4. Objetivos .............................................................................................................. 5
1.4.1. Objetivo General ............................................................................................ 5
1.4.2. Objetivos Específicos .................................................................................... 5
1.5. Justificación .......................................................................................................... 5
1.5.1. Justificación Social ........................................................................................ 5
1.5.2. Justificación Técnica ...................................................................................... 5
1.5.3. Justificación Económica ................................................................................ 5
1.6. Aportes ................................................................................................................. 5
1.6.1. Aporte Tecnológico ........................................................................................ 5
1.7. Alcances y Límites ............................................................................................... 6
1.7.1. Alcances ........................................................................................................ 6
1.7.2. Límites ........................................................................................................... 6
1.8. Metodologías y Herramientas .............................................................................. 6
1.8.1. Metodologías y Paradigmas .......................................................................... 6
1.8.2. Herramientas ................................................................................................. 7
III. CAPÍTULO II - MARCO TEÓRICO............................................................................. 8
2.1. Definición de Variables Categóricas ..................................................................... 8
2.1.1. Gestión .......................................................................................................... 8
2.1.2. Importancia del Control de Inventarios .......................................................... 8
2.1.3. Métodos de Gestión de Inventarios ............................................................... 8
2.1.4. Problemas Comunes en la Gestión de Inventarios ........................................ 9
2.2. Bases de Datos en la Gestión de Inventarios ...................................................... 9
2.2.1. Definición de Base de Datos ......................................................................... 9
2.2.2. Bases de Datos Relacionales ........................................................................ 9
2.2.3. Ventajas del Uso de Bases de Datos en Inventarios ................................... 10
2.2.4. Normalización de Bases de Datos ............................................................... 10
2.3. Tecnologías Utilizadas en el Sistema ................................................................. 10
2.3.1. Lenguajes de Programación ........................................................................ 10
2.3.2. Arquitectura del Sistema .............................................................................. 11
2.3.3. Seguridad en la Base de Datos ................................................................... 11
2.3.4. Metodologías de Desarrollo ......................................................................... 11
2.3.5. Sistemas de Gestión de Inventarios Existentes ........................................... 12
2.3.6. Impacto de un Sistema de Inventario Automatizado .................................... 12
IV. CAPÍTULO III - INGENIERÍA DEL PROYECTO .................................................... 13
3.1. Análisis ............................................................................................................... 13
3.1.1. Descripción detallada del Caso de Estudio ................................................. 14
3.1.2. Requisitos del Sistema ................................................................................ 14
3.2. Diseño de la Base de Datos ............................................................................... 17
3.2.1. Modelo Conceptual ...................................................................................... 17
3.2.2. Modelo Lógico ............................................................................................. 18
3.2.3. Modelo Físico .............................................................................................. 21
3.3. Aplicación cliente servidor. ................................................................................. 60
3.3.1. Capturas de pantalla de: .............................................................................. 60
3.4. Seguridad de la base de datos ........................................................................... 68
• CREACION DE USUARIOS .................................................................................. 73
• ASIGNACION DE ROLES. .................................................................................... 74
3.5. Diseño de base de datos distribuida .................................................................. 78
3.6. Diseño de ETLs .................................................................................................. 78
3.7. Conclusión ......................................................................................................... 82
INDICE DE TABLAS
Tabla 1. Requisitos del Sistema ....................................................................................................... 14
Tabla 2. Tabla Categorías ................................................................................................................. 22
Tabla 3. Tabla Proveedores .............................................................................................................. 23
Tabla 4. Tabla Productos .................................................................................................................. 24
Tabla 5. Tabla Clientes ..................................................................................................................... 25
Tabla 6. Tabla Ventas ....................................................................................................................... 26
Tabla 7. Tabla Detalle Venta ............................................................................................................ 27
Tabla 8. Tabla Compras ................................................................................................................... 28
Tabla 9. Tabla Detalles Compra ....................................................................................................... 29
Tabla 10. Tabla Personal .................................................................................................................. 30
Tabla 11. Tabla Asistencia ............................................................................................................... 31
Tabla 12. Tabla Tipo Producto ......................................................................................................... 32
Tabla 13. Tabla Estado Venta ........................................................................................................... 33
Tabla 14. Tabla Metodos Pago ......................................................................................................... 34
Tabla 15. Tabla Roles Personal ........................................................................................................ 35
Tabla 16. Tabla Turnos ..................................................................................................................... 36
Tabla 17. Diccionario de Datos........................................................................................................ 37
Tabla 18. Instancias de Tabla ........................................................................................................... 37
INDICE DE FIGURAS
Figura 1. Diagrama de Caso de Usos............................................................................................... 13
Figura 2. Diagrama ER Esqueleto ................................................................................................... 17
Figura 3. Diagrama ER Refinado .................................................................................................... 18
Figura 4. Diagrama Modelo Relacional........................................................................................... 21
Figura 5. Ejemplo de Modelo Relacional ........................................................................................ 38
Figura 6. Modelo Orientado a Objetos ............................................................................................ 38
I. RESUMEN DEL PROYECTO
El presente proyecto tiene como objetivo desarrollar un Sistema Gestor de Inventario para
una tienda, permitiendo un control eficiente de los productos mediante una base de datos en
SQL Server y una interfaz en Visual Studio. La gestión del inventario es fundamental para
evitar pérdidas económicas, optimizar la disponibilidad de productos y mejorar la
administración de stock en tiempo real.
Actualmente, muchas tiendas manejan sus inventarios de manera manual o en hojas de
cálculo, lo que genera errores, desactualización de datos y dificultad para realizar
seguimiento de productos. Para solucionar estos problemas, el sistema permitirá registrar
productos, gestionar entradas y salidas de stock, generar reportes y emitir alertas cuando un
producto esté próximo a agotarse.
El diseño del sistema sigue un enfoque basado en bases de datos relacionales, asegurando
integridad y normalización de la información. Se aplicará la metodología ágil Scrum,
permitiendo un desarrollo iterativo con mejoras continuas.
Entre los beneficios esperados del sistema se incluyen la reducción de pérdidas por errores
de inventario, mayor eficiencia en la administración de productos y mejor toma de
decisiones mediante reportes precisos. Este sistema será especialmente útil para pequeños y
medianos negocios que buscan una solución accesible y efectiva para la gestión de su
inventario.
PROJECT SUMMARY
This project aims to develop an Inventory Management System for a retail store, enabling
efficient product control through a SQL Server database and a Visual Studio interface.
Inventory management is essential for avoiding financial losses, optimizing product
availability, and improving real-time stock management.
Currently, many stores manage their inventories manually or using spreadsheets, which
leads to errors, outdated data, and difficulty tracking products. To solve these problems, the
system will allow product registration, manage stock inflows and outflows, generate
reports, and issue alerts when a product is close to running out of stock.
The system design follows a relational database-based approach, ensuring data integrity and
standardization. The agile Scrum methodology will be applied, allowing for iterative
development with continuous improvements.
The expected benefits of the system include reduced losses due to inventory errors,
increased efficiency in product management, and improved decision-making through
accurate reporting. This system will be especially useful for small and medium-sized
businesses looking for an affordable and effective solution for managing their inventory.
1
II. CAPÍTULO I - CONSIDERACIONES GENERALES
1.1. Introducción
El control eficiente del inventario es un pilar fundamental para el funcionamiento adecuado
de cualquier tienda o establecimiento comercial. Una gestión de inventario precisa permite
no solo evitar pérdidas económicas por exceso o falta de productos, sino también garantizar
una mayor disponibilidad de artículos, lo que se traduce en una experiencia de compra más
satisfactoria para los clientes.
Este proyecto tiene como objetivo desarrollar un sistema gestor de inventario integral, capaz
de automatizar el registro, seguimiento y actualización de los productos en una base de datos
centralizada. A través de esta automatización, se busca optimizar la gestión de stock, reducir
errores humanos en el manejo de mercancía, mejorar el control sobre los niveles de
inventario y permitir una respuesta rápida ante cambios en la demanda del mercado.
El sistema propuesto utilizará tecnologías modernas tanto en el diseño de bases de datos
como en la implementación de interfaces de usuario amigables, accesibles desde diferentes
dispositivos. Incluirá funcionalidades como el ingreso y edición de productos, control de
entradas y salidas de inventario, generación de reportes automáticos, alertas por bajo stock,
códigos de barras, y posiblemente integración con sistemas de facturación y ventas.
Uno de los principales beneficios de este sistema será su capacidad para mantener
información precisa y actualizada sobre las existencias, lo cual es clave para una adecuada
planificación de compras, reducción de pérdidas por caducidad o deterioro de productos, y
toma de decisiones estratégicas basadas en datos reales. Además, facilitará el trabajo del
personal al disminuir la carga operativa y minimizar el riesgo de errores en el conteo o
registro de productos.
Este proyecto está orientado especialmente a pequeños y medianos negocios, quienes
muchas veces no cuentan con herramientas tecnológicas avanzadas debido a su alto costo o
complejidad. Por ello, se desarrollará una solución accesible, de bajo costo y fácil
implementación, que permita a estos comercios modernizar su operación, mejorar su
eficiencia y competir en mejores condiciones en un mercado cada vez más exigente.
En resumen, el desarrollo de este sistema gestor de inventario contribuirá significativamente
a mejorar los procesos internos de las tiendas, aumentar su rentabilidad y ofrecer un mejor
servicio al cliente final, posicionándose como una herramienta clave para la transformación
digital de los negocios locales.
2
1.2. Antecedentes
Para sustentar el desarrollo del sistema, se han analizado estudios previos y proyectos
similares:
1.2.1. Estudios previos
A. "Sistemas de Gestión de Inventario en PYMEs"
Autor: Juan Carlos Chuquimia
Institución: UPEA
Año de publicación: 2019
Resumen: Este estudio analiza el impacto del uso de sistemas digitales en la
administración de inventarios en pequeñas y medianas empresas, demostrando una
reducción del 30% en pérdidas de productos debido a desactualización de stock.
B. "Automatización en el Control de Inventarios"
Autor: Liliana Apaza Medina
Institución: INCOS
Año de publicación: 2021
Resumen: Se presenta un análisis sobre la implementación de sistemas automatizados
en comercios, destacando beneficios como el acceso remoto a datos y la optimización
de la cadena de suministro.
C. "Implementación de Sistemas ERP en Tiendas Minoristas"
Autor: María Fernanda López
Institución: Universidad Mayor de San Andrés (UMSA)
Año de publicación: 2020
Resumen: La investigación demuestra cómo los sistemas ERP han mejorado la
integración de procesos en tiendas minoristas, incrementando en un 25% la eficiencia
operativa. El estudio concluye que una adecuada implementación permite mayor
control sobre ventas, compras e inventarios.
D. "Automatización de Procesos Comerciales en Microempresas"
Autor: Luis Alberto Vargas
Institución: Universidad Católica Boliviana "San Pablo"
Año de publicación: 2018
3
Resumen: Este estudio evalúa cómo la automatización mediante software especializado
reduce errores humanos en procesos de facturación y control de stock. Las
microempresas participantes reportaron una mejora del 40% en la precisión del
inventario.
E. "Sistemas de Punto de Venta (POS) como Herramienta de Control Comercial"
Autor: Rocío Mendoza Paredes
Institución: Universidad Técnica de Oruro (UTO)
Año de publicación: 2021
Resumen: El trabajo analiza la aplicación de sistemas POS en tiendas de abarrotes,
revelando una optimización en los tiempos de atención al cliente y una reducción de
pérdidas por ventas no registradas. Se destaca además la facilidad de integración con
otros sistemas contables.
F. "Software de Gestión Comercial para Negocios Locales"
Autor: Javier Quispe Mamani
Institución: Universidad Privada del Valle (UNIVALLE)
Año de publicación: 2022
Resumen: Esta investigación presenta el diseño e implementación de un sistema de
gestión adaptado a tiendas locales, con módulos de clientes, productos, ventas e
informes. Los resultados indican una mejora del 35% en la toma de decisiones gracias
a la disponibilidad de reportes en tiempo real.
G. "Uso de Tecnología Informática en la Administración de Tiendas
Multiservicio"
Autor: Gabriela Callisaya Nina
Institución: Universidad del Valle (UNIVALLE)
Año de publicación: 2019
Resumen: El estudio documenta los beneficios del uso de sistemas informáticos
personalizados en tiendas multiservicio. Se observó una mayor fidelización de clientes
y un control más riguroso del inventario, lo que generó un aumento del 20% en las
utilidades netas.
1.2.2. Proyectos institucionales relacionados
Existen diversas plataformas empresariales reconocidas a nivel mundial, como SAP y
Odoo, que han desarrollado completos módulos de gestión de inventario. Estos
sistemas ofrecen funcionalidades avanzadas que permiten controlar en detalle las
operaciones logísticas y comerciales. Sin embargo, su implementación suele implicar
4
altos costos, tanto en licencias como en capacitación del personal, además de requerir
infraestructura tecnológica especializada. Esto los convierte en soluciones poco viables
para pequeños negocios o tiendas locales, que generalmente cuentan con recursos
limitados.
En este contexto, nuestro sistema se plantea como una alternativa accesible, funcional
y fácil de usar, especialmente diseñada para cubrir las necesidades básicas de gestión
sin caer en la complejidad de los grandes ERP. La propuesta busca optimizar el control
de inventario, ventas y productos, mediante una interfaz intuitiva y herramientas
eficientes, permitiendo así que los pequeños comerciantes puedan mejorar sus procesos
sin depender de soluciones costosas o difíciles de manejar.
1.3. Planteamiento del Problema
Actualmente, muchas tiendas manejan su inventario de forma manual o en hojas de
cálculo, lo que genera problemas como:
Errores en el registro de productos debido a la falta de un sistema automatizado.
Falta de actualización en tiempo real, provocando sobreventa o falta de stock.
Dificultad en el seguimiento de movimientos de productos.
Pérdida de productos por vencimiento o deterioro.
1.3.1. Pregunta de investigación
¿Cómo puede un sistema gestor de inventario mejorar la eficiencia y precisión en la
gestión de productos en una tienda?
1.3.2. Problemas específicos
• ¿Cómo reducir errores en el registro de productos?
• ¿Cómo actualizar el inventario en tiempo real?
• ¿Cómo optimizar el seguimiento de entradas y salidas de productos?
5
1.4. Objetivos
1.4.1. Objetivo General
Desarrollar un sistema de gestión que permita administrar de manera eficiente la base de
datos de una tienda, optimizando los procesos internos y facilitando el control de la
información.
1.4.2. Objetivos Específicos
• Diseñar una base de datos que almacene información detallada de los
productos.
• Implementar una interfaz para el registro y consulta de inventario.
• Generar reportes sobre ventas, productos en stock y tendencias de compra.
1.5. Justificación
1.5.1. Justificación Social
El sistema facilitará la gestión del inventario, beneficiando a dueños de tiendas,
empleados y clientes, asegurando la disponibilidad de productos y mejorando la
experiencia de compra.
1.5.2. Justificación Técnica
Se aplicarán tecnologías modernas como bases de datos relacionales (SQL Server) y
programación orientada a objetos en Visual Studio, garantizando un sistema robusto y
escalable.
1.5.3. Justificación Económica
La reducción de errores en el control de stock disminuirá pérdidas y optimizará la
inversión en nuevos productos, aumentando la rentabilidad del negocio.
1.6. Aportes
1.6.1. Aporte Tecnológico
El desarrollo de este sistema proporcionará una solución accesible y eficiente para la
gestión de inventarios en pequeños y medianos negocios, integrando herramientas
tecnológicas modernas.
6
1.7. Alcances y Límites
1.7.1. Alcances
• Registro y control de productos.
• Gestión de entradas y salidas de stock.
• Generación de reportes sobre el inventario.
• Alertas para productos con bajo stock.
1.7.2. Límites
• No incluirá un módulo contable.
• No manejará facturación electrónica.
1.8. Metodologías y Herramientas
1.8.1. Metodologías y Paradigmas
Para el desarrollo del sistema se aplicará una metodología ágil, específicamente el
marco de trabajo Scrum, que permite trabajar de forma organizada y flexible. Esta
metodología se basa en dividir el desarrollo del sistema en etapas cortas llamadas
sprints, donde en cada una se desarrolla una parte funcional del sistema, se prueba y se
mejora en base a la retroalimentación recibida.
Scrum es ideal para este tipo de proyectos porque permite ir adaptando el sistema
según las necesidades reales del negocio, sin tener que esperar a que todo el desarrollo
esté terminado. Esto significa que, por ejemplo, primero se puede trabajar en el módulo
de registro de productos, luego en el módulo de ventas, y así sucesivamente,
permitiendo que los usuarios vayan probando y dando su opinión en cada etapa.
Además, este enfoque promueve el trabajo en equipo, la comunicación constante y la
mejora continua, lo que asegura que el sistema final se ajuste mejor a los objetivos del
proyecto: ofrecer una solución simple, útil y eficiente para la gestión de una tienda.
7
1.8.2. Herramientas
Software: SQL Server, Visual Studio (C#).
Hardware: Computadora con Windows.
8
III. CAPÍTULO II - MARCO TEÓRICO
2.1. Definición de Variables Categóricas
2.1.1. Gestión
La gestión es el proceso mediante el cual se planifican, organizan, dirigen y controlan
los recursos de una organización con el fin de alcanzar objetivos previamente
establecidos de manera eficiente y eficaz. Este concepto abarca una serie de actividades
que permiten tomar decisiones, coordinar esfuerzos y optimizar el uso de recursos
como el tiempo, el dinero, el personal y la tecnología.
En el contexto de una tienda o negocio, la gestión implica controlar adecuadamente
aspectos clave como las ventas, las compras, la atención al cliente y la administración
financiera. Una buena gestión permite mejorar el rendimiento general del negocio,
reducir pérdidas y aprovechar mejor las oportunidades del mercado.
2.1.1.1. Definición de Inventario
El inventario se define como el conjunto de bienes y productos disponibles en una
empresa para su venta o uso en la producción. Su adecuada administración permite
mantener el equilibrio entre la oferta y la demanda, evitando excesos o faltantes de
productos.
2.1.2. Importancia del Control de Inventarios
Una gestión eficiente del inventario permite:
• Evitar pérdidas económicas por productos vencidos o dañados.
• Mantener un control exacto de los niveles de stock.
• Agilizar la toma de decisiones sobre compras y ventas.
• Mejorar la satisfacción del cliente al garantizar la disponibilidad de productos.
2.1.3. Métodos de Gestión de Inventarios
Existen diferentes métodos para controlar el inventario, entre los más utilizados están:
FIFO (First In, First Out): Los productos más antiguos se venden primero, evitando
pérdidas por obsolescencia.
9
LIFO (Last In, First Out): Los productos más recientes se venden primero, lo que
puede ser útil en mercados con inflación.
Método ABC: Clasifica los productos en tres categorías según su importancia:
A: Productos de alto valor y baja cantidad.
B: Productos de valor y cantidad intermedia.
C: Productos de bajo valor y alta cantidad.
2.1.4. Problemas Comunes en la Gestión de Inventarios
• Algunas de las dificultades que enfrentan las empresas en el control de inventarios
incluyen:
• Errores en el registro manual, lo que genera inconsistencias en los datos.
• Falta de actualización en tiempo real, afectando la planificación de compras.
• Sobrestock o desabastecimiento, lo que incrementa costos operativos o reduce ventas.
2.2. Bases de Datos en la Gestión de Inventarios
2.2.1. Definición de Base de Datos
Una base de datos es un conjunto organizado de datos almacenados electrónicamente
que permite gestionar y recuperar información de manera eficiente.
2.2.2. Bases de Datos Relacionales
El modelo relacional es una estructura lógica utilizada en el diseño de bases de datos,
en la cual los datos se organizan en tablas o relaciones. Cada tabla representa una
entidad específica (como productos, clientes o personal) y está compuesta por filas
(registros) y columnas (atributos) que almacenan información relacionada. Una de las
principales características del modelo relacional es el uso de claves primarias, que
permiten identificar de manera única cada registro dentro de una tabla, y claves
foráneas, que se utilizan para establecer conexiones entre diferentes tablas.
Estas relaciones bien definidas permiten que la información esté normalizada y
organizada, evitando la duplicación de datos y facilitando su consulta, actualización y
eliminación. Además, el modelo relacional garantiza la integridad referencial, es decir,
que los datos relacionados entre tablas sean consistentes y coherentes. Gracias a estas
propiedades, este modelo es ampliamente utilizado en sistemas de gestión, ya que
10
proporciona una forma eficiente y estructurada de almacenar y manipular grandes
volúmenes de información de manera segura.
2.2.3. Ventajas del Uso de Bases de Datos en Inventarios
• Automatización del registro de productos.
• Acceso rápido a información actualizada.
• Generación de reportes sobre el estado del inventario.
• Reducción de errores humanos en el registro de datos.
2.2.4. Normalización de Bases de Datos
La normalización es el proceso de estructurar una base de datos para eliminar
redundancias y mejorar su eficiencia. Existen diferentes niveles de normalización:
1FN: Elimina grupos repetitivos y garantiza que cada celda tenga un solo valor.
2FN: Elimina dependencias parciales, asegurando que cada atributo dependa
completamente de la clave primaria.
3FN: Elimina dependencias transitivas, reduciendo la redundancia.
2.3. Tecnologías Utilizadas en el Sistema
2.3.1. Lenguajes de Programación
El sistema será desarrollado utilizando:
• C# en Visual Studio: Un lenguaje de programación robusto y eficiente para el
desarrollo de aplicaciones de escritorio.
• SQL Server: Un sistema de gestión de bases de datos que permite el almacenamiento
y recuperación eficiente de la información.
11
2.3.2. Arquitectura del Sistema
El sistema se basará en una arquitectura cliente-servidor:
Cliente: La interfaz gráfica en C# que permite al usuario interactuar con el sistema.
Servidor: SQL Server almacenará la información del inventario y responderá a las
consultas.
2.3.3. Seguridad en la Base de Datos
Para proteger los datos del sistema, se implementarán medidas de seguridad como:
• Autenticación de usuarios mediante credenciales.
• Control de acceso basado en roles.
• Copias de seguridad periódicas para evitar pérdida de datos.
2.3.4. Metodologías de Desarrollo
2.3.4.1. Metodología Ágil (Scrum)
Scrum es un marco de trabajo iterativo que permite desarrollar software en ciclos
cortos, mejorando la calidad del producto final. Sus principales componentes son:
• Sprint: Ciclos de trabajo de 2 a 4 semanas donde se desarrollan funcionalidades
específicas.
• Product Backlog: Lista de tareas y requisitos del sistema.
• Scrum Master: Persona encargada de facilitar el proceso y eliminar obstáculos.
2.3.4.2. Ventajas de Utilizar Scrum
• Mayor flexibilidad para adaptarse a cambios.
• Desarrollo incremental del sistema.
• Mejora continua basada en retroalimentación.
12
2.3.5. Sistemas de Gestión de Inventarios Existentes
2.3.5.1. Comparación con Soluciones Comerciales
Existen diversas herramientas en el mercado, como:
• SAP Business One: Software robusto pero costoso, orientado a grandes empresas.
• Odoo: Plataforma de código abierto, pero requiere configuración avanzada.
• Inventoria Stock Manager: Software simple pero con funcionalidades limitadas.
El sistema propuesto se diferencia al ofrecer una solución personalizada para tiendas
pequeñas y medianas, sin costos elevados ni configuraciones complejas.
2.3.6. Impacto de un Sistema de Inventario Automatizado
2.3.6.1. Impacto Económico
• Reducción de pérdidas por errores humanos.
• Mejora en la planificación de compras y ventas.
• Aumento de la rentabilidad al optimizar el uso de los recursos.
2.3.6.2. Impacto Organizacional
• Mayor eficiencia en la gestión de productos.
• Facilita el trabajo del personal al automatizar tareas repetitivas.
• Permite la toma de decisiones basada en datos reales.
2.3.6.3. Impacto en la Satisfacción del Cliente
• Garantiza la disponibilidad de productos esenciales.
• Reduce tiempos de espera en la reposición de stock.
• Mejora la experiencia de compra.
13
IV. CAPÍTULO III - INGENIERÍA DEL PROYECTO
Este capítulo detalla el diseño y desarrollo del sistema gestor de inventario.
3.1. Análisis
El sistema permitirá registrar productos, gestionar el stock en tiempo real, generar
reportes de inventario y alertar sobre productos con bajo stock.
Figura 1. Diagrama de Caso de Usos
14
3.1.1. Descripción detallada del Caso de Estudio
Sistema Antiguo (Manual o en Excel)
Muchas tiendas manejan el inventario mediante anotaciones manuales o hojas de
cálculo, lo que genera problemas como:
• Pérdida de registros debido a errores humanos.
• Falta de actualización en tiempo real.
• Dificultad para controlar la rotación de productos.
Sistema Propuesto
Se implementará un sistema informático que automatice la gestión del inventario
mediante una base de datos relacional en SQL Server y una interfaz en Visual Studio.
3.1.2. Requisitos del Sistema
Tabla 1. Requisitos del Sistema
Nro. Descripción Tipo Origen
R1 Realizar un Funcional Gerente
seguimiento de
los productos
que tiene en
stock
R2 El sistema debe No funcional Diseño
tener una
interfaz sencilla
y funcional
R3 Realizará las Funcional Cliente
operaciones de
registrar a los
clientes que
compraron los
productos nota
de venta
R4 Agregar Funcional Proveedor
productos que
recién están
adquiriendo
15
R5 El sistema tiene No funcional Gerente
que tener un
Login para los
administradores
R6 Tiene que tener Funcional Gerente
una buena
velocidad el
sistema web
R7 Registrar Funcional Gerente
productos con
nombre,
categoría,
precio y stock
R8 Modificar y Funcional Gerente
eliminar
productos
registrados
R9 Alertar cuando Funcional Gerente
un producto
tenga bajo
R10 Permitir registro Funcional Gerente
de clientes con
usuario y
contraseña
R11 Iniciar sesión y Funcional Gerente
actualizar datos
personales
R12 Registrar Funcional Proveedores
proveedores y
asociar los con
productos
R13 Compatible con No funcional Diseño
dispositivos
móviles
R14 Proteger datos Funcional Diseño
con cifrado
R15 Soportar hasta No funcional Gerente
1000
R16 Confirmaciones Funcional Gerente
de compra
R17 Gestionar Funcional Gerente
ventas diarias,
16
semanales y
mensuales
R18 Permitir Funcional Cliente
comentarios del
sistema web
R19 Visualización Funcional Cliente
de productos en
stock
R20 Funciona con Funcional Cliente /
cualquier Gerente
dispositivo
R21 Registrar No funcional Diseño
historia de
compras de
clientes
R22 Aplicar Funcional Gerente
descuentos y
promociones
R23 Ver cantidad de Funcional Gerente
ingresos y
egresos
R24 Integrarse con No funcional Gerente
software
contable
R25 Autenticación No funcional Gerente
de dos factores
para admins
R26 Cumplir con Funcional Diseño
normativas de
protección de
datos
R27 Diseño fácil de No funcional Diseño
entender
R28 Verificar las Funcional Gerente
fechas de
vencimiento de
productos
R29 Copias de datos No funcional Gerente
de venta
R30 Búsqueda Funcional Gerente
avanzada de
productos
17
3.2. Diseño de la Base de Datos
El sistema utilizará una base de datos relacional en SQL Server con las siguientes
estructuras:
3.2.1. Modelo Conceptual
3.2.1.1. Diagrama ER Esqueleto
Figura 2. Diagrama ER Esqueleto
18
3.2.2. Modelo Lógico
3.2.2.1. Modelo ER Refinado
Figura 3. Diagrama ER Refinado
3.2.2.2. Mapeo al Modelo Relacional
A continuación se presenta el mapeo realizado para el sistema gestor de inventario:
✓ La entidad "Categoría" se transforma en una tabla con los atributos:
id_categoria (PK), nombre_categoria.
✓ La entidad "Producto" se transforma en una tabla con los atributos:
id_producto (PK), nombre, id_categoria (FK), precio, stock.
✓ La entidad "Proveedor" se transforma en una tabla con los atributos:
id_proveedor (PK), nombre, contacto.
✓ La entidad "Venta" se transforma en una tabla con los atributos:
id_venta (PK), id_producto (FK), cantidad, fecha_venta.
19
✓ La entidad "Detalle de Venta" se transforma en una tabla con los atributos:
id_detalle_venta (PK), id_venta (FK), id_producto (FK), cantidad,
precio_unitario, subtotal.
✓ La entidad "Compra" se transforma en una tabla con los atributos:
id_compra (PK), id_proveedor (FK), fecha_compra, total.
✓ La entidad "Detalle de Compra" se transforma en una tabla con los
atributos:
id_detalle_compra (PK), id_compra (FK), id_producto (FK), cantidad,
precio_compra, subtotal.
✓ La entidad "Cliente" se transforma en una tabla con los atributos: id_cliente
(PK), nombre_empresa, contacto, telefono, direccion, region.
✓ La entidad "Personal" se transforma en una tabla con los atributos:
id_personal (PK), nombre, cargo, telefono.
✓ La entidad "Asistencia" se transforma en una tabla con los atributos:
id_asistencia (PK), id_personal (FK), fecha, hora_entrada, hora_salida.
3.2.2.3. Normalización
La normalización es un proceso en el diseño de bases de datos relacionales que
consiste en organizar los datos de manera eficiente para eliminar redundancias y
garantizar la integridad de la información. Se lleva a cabo mediante la aplicación de
una serie de reglas llamadas formas normales, que permiten descomponer una tabla
compleja en varias tablas más simples y relacionadas entre sí.
En el desarrollo del presente sistema de gestión para una tienda, se aplicó la
normalización con el fin de estructurar adecuadamente la base de datos. Inicialmente,
la información de productos, clientes, personal y ventas se encontraba combinada en
pocas tablas, lo cual generaba repetición de datos y dificultaba su mantenimiento.
A través del análisis, se identificaron dependencias funcionales y se aplicaron las tres
primeras formas normales (1FN, 2FN y 3FN):
• En la Primera Forma Normal (1FN) se eliminaron grupos repetitivos, garantizando que cada
campo contuviera un solo valor por registro.
• En la Segunda Forma Normal (2FN) se eliminaron las dependencias parciales en tablas con
claves compuestas, dividiendo la información en entidades separadas como Clientes,
Productos y Personal.
• Finalmente, en la Tercera Forma Normal (3FN) se eliminaron las dependencias transitivas,
asegurando que cada campo dependiera únicamente de la clave primaria.
20
Gracias a este proceso, la base de datos resultante es más ordenada, flexible y fácil de
mantener, y facilita la generación de reportes y consultas complejas sin inconsistencias.
3.2.2.4. Modelo Relacional
El modelo relacional representa la estructura lógica de la base de datos mediante tablas
interconectadas por relaciones bien definidas. En este sistema de gestión para tiendas, se han
diseñado múltiples entidades que reflejan los distintos elementos del negocio, como
productos, clientes, personal, compras, ventas, entre otros.
Cada tabla posee una clave primaria, que identifica de forma única a cada registro, y en
muchos casos, claves foráneas que permiten establecer relaciones entre entidades. Estas
relaciones garantizan la integridad de los datos y evitan la duplicación de información.
A continuación, se describen las principales relaciones del modelo:
• Productos se relaciona con:
o Categorias mediante id_categoria.
o Proveedores mediante id_proveedor.
o TipoProducto mediante id_tipo.
• Ventas se relaciona con:
o DetallesVenta, que indica qué productos se vendieron y en qué cantidad.
o Aunque cliente es un campo tipo texto, puede ser reemplazado por una
relación con la tabla Clientes para mayor consistencia.
o MetodosPago y EstadoVenta se pueden usar para normalizar los campos
metodo_pago y estado.
• DetallesVenta se relaciona con:
o Ventas, a través de IdVenta.
o Productos, mediante IdProducto.
• Compras se relaciona con:
o Proveedores, mediante id_proveedor.
o DetallesCompra, que contiene los productos comprados.
• DetallesCompra se relaciona con:
o Compras, mediante id_compra.
o Productos, mediante id_producto.
• Personal se relaciona con:
o RolesPersonal, mediante id_rol.
• AsistenciaPersonal se relaciona con:
o Personal, mediante id_personal.
o Turnos, mediante id_turno.
21
3.2.3. Modelo Físico
Figura 4. Diagrama Modelo Relacional
22
3.2.3.1. Diccionario de Datos
Se definirán atributos, tipos de datos y restricciones de cada tabla.
TABLA CATEGORIAS:
Tabla 2. Tabla Categorías
Restricciones Semánticas
✓ El IdCategoria es único.
✓ El Nombre no debe repetirse entre categorías.
23
✓ La Descripcion debe corresponder lógicamente al nombre (coherencia
temática).
TABLA PROVEEDORES.
Tabla 3. Tabla Proveedores
Restricciones Semánticas
✓ El IdProveedor es único.
✓ El Nombre del proveedor no debe repetirse (o debe ser claramente
distinguible).
✓ El Email debe tener un formato válido (ej.: [email protected]).
24
✓ El Teléfono debe tener al menos 7 caracteres válidos si es ingresado.
✓ Debe existir al menos un dato de contacto (dirección, teléfono o email).
TABLA PRODUCTOS:
Tabla 4. Tabla Productos
Restricciones Semánticas
✓ El IdProducto es único.
✓ El Nombre del producto debe ser único dentro de una categoría.
✓ El Precio debe ser mayor a 0.
✓ El Stock no puede ser negativo.
25
✓ El IdCategoria y IdProveedor deben existir previamente en sus respectivas
tablas.
TABLA CLIENTE:
Tabla 5. Tabla Clientes
Restricciones Semánticas
✓ El IdCliente es único.
✓ El Número de teléfono debe tener exactamente 8 dígitos y comenzar con 6 o 7
(según normativa boliviana).
✓ El Email debe ser válido si se registra.
26
✓ Debe existir al menos un dato de contacto (email, teléfono o dirección).
TABLA VENTAS:
Tabla 6. Tabla Ventas
Restricciones Semánticas
✓ El IdVenta es único.
✓ El Total debe ser igual a la suma de los subtotales de sus detalles asociados.
✓ La Fecha de venta no puede estar en el futuro.
✓ El IdCliente debe referenciar a un cliente válido.
27
✓ No debe existir una venta sin detalles (DetallesVenta).
TABLA DETALLE DE VENTA:
Tabla 7. Tabla Detalle Venta
Restricciones Semánticas
✓ El IdDetalle es único.
✓ La Cantidad debe ser mayor que 0.
✓ El PrecioUnitario no debe ser menor que 0.
✓ El Subtotal debe ser igual a: Cantidad * PrecioUnitario.
28
✓ No se puede vender un producto con stock insuficiente (si se controla stock
TABLA COMPRAS:
Tabla 8. Tabla Compras
Restricciones Semánticas
✓ El IdCompra es único.
✓ El Total debe coincidir con la suma de los subtotales en DetallesCompra.
✓ La Fecha no debe estar en el futuro.
29
✓ El IdProveedor debe existir en la tabla Proveedores.
TABLA DETALLESCOMPRA:
Tabla 9. Tabla Detalles Compra
Restricciones Semánticas
✓ El IdDetalle es único.
✓ La Cantidad debe ser mayor que 0.
✓ El PrecioCompra debe ser mayor que 0.
30
✓ El Subtotal debe ser igual a: Cantidad * PrecioCompra.
TABLA PERSONAL:
Tabla 10. Tabla Personal
Restricciones Semánticas
✓ El IdPersonal es único.
✓ El Nombre no debe estar vacío.
✓ El Cargo debe tener sentido lógico (ej.: “Cajero”, “Administrador”, etc.).
31
✓ El Email, si se usa como identificador, debe ser único.
TABLA ASISTENCIA:
Tabla 11. Tabla Asistencia
Restricciones Semánticas
✓ El IdAsistencia es único.
✓ La HoraSalida no puede ser anterior a la HoraEntrada.
✓ No puede existir más de un registro de asistencia para la misma persona en la
misma Fecha.
32
✓ El IdPersonal debe existir en la tabla Personal.
TABLA TIPO PRODUCTO:
Tabla 12. Tabla Tipo Producto
Restricciones Semánticas
✓ El IdTipo es único.
✓ El Nombre no debe repetirse entre tipos.
33
✓ Se espera que un tipo de producto esté relacionado con al menos un producto
si es usado.
TABLA ESTADOVENTA:
Tabla 13. Tabla Estado Venta
Restricciones Semánticas
✓ El IdEstado es único.
34
✓ El Nombre debe representar un estado válido del proceso de venta (ej.:
“Pendiente”, “Pagado”, “Cancelado”).
✓ No debe haber ventas sin un estado definido si el negocio así lo requiere.
TABLA METODOSPAGO:
Tabla 14. Tabla Metodos Pago
Restricciones Semánticas
35
✓ El IdMetodo es único.
✓ El Nombre debe representar un método de pago válido (ej.: “Efectivo”,
“Tarjeta”, “Transferencia”).
✓ No deben repetirse métodos con el mismo nombre.
TABLA ROLES PERSONAL.
Tabla 15. Tabla Roles Personal
Restricciones Semánticas
36
✓ El IdRol es único.
✓ El NombreRol no debe repetirse.
✓ Cada personal puede estar relacionado con un único rol, pero puede haber
roles no asignados aún.
TABLA TURNOS:
Tabla 16. Tabla Turnos
Restricciones Semánticas
✓ El IdTurno es único.
37
✓ La HoraFin debe ser posterior a la HoraInicio.
✓ El Nombre del turno debe ser descriptivo (ej.: “Mañana”, “Noche”).
✓ No se deben solapar turnos para el mismo personal si se lleva control estricto.
DICCIONARIO DE DATOS
Tabla 17. Diccionario de Datos
INSTANCIAS DE TABLAS
Tabla 18. Instancias de Tabla
38
EJEMPLO DE MODELO RELACIONAL
Figura 5. Ejemplo de Modelo Relacional
MODELO ORIENTADO A OBJETOS
Figura 6. Modelo Orientado a Objetos
39
3.2.3.2. Creación de la BD en DDL.
A continuación se presenta el script en SQL para la creación de la base de datos del
sistema, utilizando instrucciones DDL
CREATE TABLE Categorias (
IdCategoria INT PRIMARY KEY IDENTITY(1,1),
Nombre NVARCHAR(100) NOT NULL,
Descripcion NVARCHAR(255)
);
CREATE TABLE Proveedores (
IdProveedor INT PRIMARY KEY IDENTITY(1,1),
Nombre NVARCHAR(100) NOT NULL,
Direccion NVARCHAR(255),
Telefono NVARCHAR(20),
Email NVARCHAR(100)
);
CREATE TABLE TipoProducto (
IdTipo INT PRIMARY KEY IDENTITY(1,1),
Nombre NVARCHAR(50) NOT NULL
);
CREATE TABLE Productos (
IdProducto INT PRIMARY KEY IDENTITY(1,1),
Nombre NVARCHAR(100) NOT NULL,
Descripcion NVARCHAR(255),
Precio DECIMAL(10,2) NOT NULL,
Stock INT NOT NULL DEFAULT 0,
IdCategoria INT NOT NULL,
IdProveedor INT NOT NULL,
IdTipo INT,
FOREIGN KEY (IdCategoria) REFERENCES Categorias(IdCategoria),
FOREIGN KEY (IdProveedor) REFERENCES Proveedores(IdProveedor),
FOREIGN KEY (IdTipo) REFERENCES TipoProducto(IdTipo)
);
CREATE TABLE Clientes (
IdCliente INT PRIMARY KEY IDENTITY(1,1),
Nombre NVARCHAR(100) NOT NULL,
Telefono NVARCHAR(20),
Email NVARCHAR(100),
Direccion NVARCHAR(255)
);
CREATE TABLE EstadoVenta (
IdEstado INT PRIMARY KEY IDENTITY(1,1),
Nombre NVARCHAR(50) NOT NULL
);
CREATE TABLE MetodosPago (
IdMetodo INT PRIMARY KEY IDENTITY(1,1),
Nombre NVARCHAR(50) NOT NULL
);
CREATE TABLE Ventas (
IdVenta INT PRIMARY KEY IDENTITY(1,1),
40
Fecha DATETIME NOT NULL,
IdCliente INT NOT NULL,
Total DECIMAL(10,2) NOT NULL,
IdEstado INT,
IdMetodo INT,
FOREIGN KEY (IdCliente) REFERENCES Clientes(IdCliente),
FOREIGN KEY (IdEstado) REFERENCES EstadoVenta(IdEstado),
FOREIGN KEY (IdMetodo) REFERENCES MetodosPago(IdMetodo)
);
CREATE TABLE DetallesVenta (
IdDetalle INT PRIMARY KEY IDENTITY(1,1),
IdVenta INT NOT NULL,
IdProducto INT NOT NULL,
Cantidad INT NOT NULL,
PrecioUnitario DECIMAL(10,2) NOT NULL,
Subtotal DECIMAL(10,2),
FOREIGN KEY (IdVenta) REFERENCES Ventas(IdVenta),
FOREIGN KEY (IdProducto) REFERENCES Productos(IdProducto)
);
CREATE TABLE Compras (
IdCompra INT PRIMARY KEY IDENTITY(1,1),
Fecha DATETIME NOT NULL,
IdProveedor INT NOT NULL,
Total DECIMAL(10,2) NOT NULL,
FOREIGN KEY (IdProveedor) REFERENCES Proveedores(IdProveedor)
);
CREATE TABLE DetallesCompra (
IdDetalle INT PRIMARY KEY IDENTITY(1,1),
IdCompra INT NOT NULL,
IdProducto INT NOT NULL,
Cantidad INT NOT NULL,
PrecioCompra DECIMAL(10,2) NOT NULL,
Subtotal DECIMAL(10,2),
FOREIGN KEY (IdCompra) REFERENCES Compras(IdCompra),
FOREIGN KEY (IdProducto) REFERENCES Productos(IdProducto)
);
CREATE TABLE RolesPersonal (
IdRol INT PRIMARY KEY IDENTITY(1,1),
NombreRol NVARCHAR(50) NOT NULL
);
CREATE TABLE Personal (
IdPersonal INT PRIMARY KEY IDENTITY(1,1),
Nombre NVARCHAR(100) NOT NULL,
Cargo NVARCHAR(50),
Telefono NVARCHAR(20),
Email NVARCHAR(100),
IdRol INT,
FOREIGN KEY (IdRol) REFERENCES RolesPersonal(IdRol)
);
CREATE TABLE Turnos (
IdTurno INT PRIMARY KEY IDENTITY(1,1),
Nombre NVARCHAR(50) NOT NULL,
HoraInicio TIME,
HoraFin TIME
41
);
CREATE TABLE AsistenciaPersonal (
IdAsistencia INT PRIMARY KEY IDENTITY(1,1),
IdPersonal INT NOT NULL,
Fecha DATETIME NOT NULL,
HoraEntrada TIME,
HoraSalida TIME,
IdTurno INT,
FOREIGN KEY (IdPersonal) REFERENCES Personal(IdPersonal),
FOREIGN KEY (IdTurno) REFERENCES Turnos(IdTurno)
);
3.2.4 Validación
Consultas de Validación 01
- 1. Productos con stock menor o igual al mínimo permitido
SELECT *
FROM Productos
WHERE Stock <= StockMinimo;
-- 2. Productos no vendidos en los últimos 60 días
SELECT *
FROM Productos
WHERE IdProducto NOT IN (
SELECT DISTINCT IdProducto
FROM DetallesVenta DV
JOIN Ventas V ON DV.IdVenta = V.IdVenta
WHERE V.Fecha >= DATEADD(DAY, -60, GETDATE())
);
-- 3. Total de productos vendidos por categoría en el último mes
SELECT C.Nombre AS Categoria, SUM(DV.Cantidad) AS TotalVendidos
FROM DetallesVenta DV
JOIN Ventas V ON DV.IdVenta = V.IdVenta
JOIN Productos P ON DV.IdProducto = P.IdProducto
JOIN Categorias C ON P.IdCategoria = C.IdCategoria
WHERE V.Fecha >= DATEADD(MONTH, -1, GETDATE())
GROUP BY C.Nombre;
-- 4. Ingreso total por producto durante el último trimestre
SELECT P.Nombre, SUM(DV.Cantidad * DV.PrecioUnitario) AS IngresoTotal
FROM DetallesVenta DV
JOIN Ventas V ON DV.IdVenta = V.IdVenta
JOIN Productos P ON DV.IdProducto = P.IdProducto
WHERE V.Fecha >= DATEADD(MONTH, -3, GETDATE())
GROUP BY P.Nombre;
-- 5. Proveedor principal por categoría (mayor número de productos)
SELECT Categoria, NombreProveedor, MAX(NumProductos) AS
ProductosSuministrados
FROM (
SELECT C.Nombre AS Categoria, PR.Nombre AS NombreProveedor, COUNT(*) AS NumProductos
FROM Productos P
JOIN Proveedores PR ON P.IdProveedor = PR.IdProveedor
JOIN Categorias C ON P.IdCategoria = C.IdCategoria
GROUP BY C.Nombre, PR.Nombre
) AS Sub
GROUP BY Categoria, NombreProveedor;
42
-- 6. Productos con precios superiores al promedio de su categoría
SELECT Categoria, NombreProveedor, MAX(NumProductos) AS
ProductosSuministrados
FROM (
SELECT C.Nombre AS Categoria, PR.Nombre AS NombreProveedor, COUNT(*) AS NumProductos
FROM Productos P
JOIN Proveedores PR ON P.IdProveedor = PR.IdProveedor
JOIN Categorias C ON P.IdCategoria = C.IdCategoria
GROUP BY C.Nombre, PR.Nombre
) AS Sub
GROUP BY Categoria, NombreProveedor;
-- 7. Productos cuyo stock actual supere el doble de su stock mínimo
SELECT *
FROM Productos
WHERE Stock > 2 * StockMinimo;
-- 8. Los 5 productos más vendidos en el año
SELECT TOP 5 P.Nombre, SUM(DV.Cantidad) AS TotalVendido
FROM DetallesVenta DV
JOIN Ventas V ON DV.IdVenta = V.IdVenta
JOIN Productos P ON DV.IdProducto = P.IdProducto
WHERE YEAR(V.Fecha) = YEAR(GETDATE())
GROUP BY P.Nombre
ORDER BY TotalVendido DESC;
-- 9. Promedio de días entre reposiciones de un producto específico
-- Reemplaza @IdProducto con el ID del producto deseado
SELECT AVG(DATEDIFF(DAY, LAG(Fecha) OVER (ORDER BY Fecha),
Fecha)) AS PromedioDias
FROM Compras C
JOIN DetallesCompra DC ON C.IdCompra = DC.IdCompra
WHERE DC.IdProducto = @IdProducto;
-- 10. Rotación de inventario por categoría en el último semestre
SELECT C.Nombre AS Categoria,
SUM(DV.Cantidad) / NULLIF(SUM(P.Stock), 0) AS Rotacion
FROM DetallesVenta DV
JOIN Ventas V ON DV.IdVenta = V.IdVenta
JOIN Productos P ON DV.IdProducto = P.IdProducto
JOIN Categorias C ON P.IdCategoria = C.IdCategoria
WHERE V.Fecha >= DATEADD(MONTH, -6, GETDATE())
GROUP BY C.Nombre;
-- 11. Órdenes de compra pendientes y su antigüedad en días
SELECT IdCompra, DATEDIFF(DAY, Fecha, GETDATE()) AS AntiguedadDias
FROM Compras
WHERE Estado = 'Pendiente';
-- 12. Porcentaje de productos que requieren reabastecimiento urgente (stock = 0)
SELECT CAST(COUNT() * 100.0 / (SELECT COUNT() FROM Productos) AS
DECIMAL(5,2)) AS PorcentajeReabastecimiento
FROM Productos
WHERE Stock = 0;
-- 13. Productos que cambiaron de precio en el último mes
SELECT P.Nombre, HP.PrecioAnterior, HP.PrecioNuevo, HP.FechaCambio
FROM HistorialPrecios HP
JOIN Productos P ON HP.IdProducto = P.IdProducto
43
WHERE HP.FechaCambio >= DATEADD(MONTH, -1, GETDATE());
-- 14. Productos que han generado pérdidas por ventas por debajo del costo
SELECT P.Nombre, DV.PrecioUnitario, DC.PrecioCompra
FROM DetallesVenta DV
JOIN Ventas V ON DV.IdVenta = V.IdVenta
JOIN Productos P ON DV.IdProducto = P.IdProducto
JOIN DetallesCompra DC ON DC.IdProducto = P.IdProducto
WHERE DV.PrecioUnitario < DC.PrecioCompra;
-- 15. Margen de ganancia promedio por categoría
SELECT C.Nombre AS Categoria,
AVG(DV.PrecioUnitario - DC.PrecioCompra) AS MargenPromedio
FROM DetallesVenta DV
JOIN Ventas V ON DV.IdVenta = V.IdVenta
JOIN Productos P ON DV.IdProducto = P.IdProducto
JOIN DetallesCompra DC ON DC.IdProducto = P.IdProducto
JOIN Categorias C ON P.IdCategoria = C.IdCategoria
GROUP BY C.Nombre;
-- 16. Productos devueltos más de una vez y la razón más común
SELECT P.Nombre, COUNT(*) AS VecesDevuelto,
M.Razon
FROM Devoluciones D
JOIN Productos P ON D.IdProducto = P.IdProducto
JOIN MotivosDevolucion M ON D.IdMotivo = M.IdMotivo
GROUP BY P.Nombre, M.Razon
HAVING COUNT(*) > 1;
44
Consultas de validación 02 (20 PROCEDIMIENTOS ALMACENADOS)
-- 1 insertar clientes
CREATE PROCEDURE InsertarCliente
@CI NVARCHAR(20), @Nombre NVARCHAR(100), @Paterno NVARCHAR(100), @Materno
NVARCHAR(100),
@FechaNacimiento DATE, @Direccion NVARCHAR(255), @Departamento NVARCHAR(100),
@Genero NVARCHAR(20), @EstadoCivil NVARCHAR(50), @DeporteFavorito NVARCHAR(100),
@Telefono NVARCHAR(20), @Email NVARCHAR(100)
AS
BEGIN
INSERT INTO Clientes (CI, Nombre, Paterno, Materno, Fecha_Nacimiento, Direccion,
Departamento, Genero, Estado_Civil, Deporte_Favorito, Telefono, Email)
VALUES (@CI, @Nombre, @Paterno, @Materno, @FechaNacimiento, @Direccion,
@Departamento, @Genero, @EstadoCivil, @DeporteFavorito, @Telefono, @Email)
END;
-- 2 Listar clientes
CREATE PROCEDURE ListarClientes
AS
BEGIN
SELECT * FROM Clientes
END;
45
--3 Buscar Cliente por CI
CREATE PROCEDURE BuscarClientePorCI
@CI NVARCHAR(20)
AS
BEGIN
SELECT * FROM Clientes WHERE CI = @CI
END;
--4. Actualizar Dirección del Cliente
CREATE PROCEDURE ActualizarDireccionCliente
@IdCliente INT, @NuevaDireccion NVARCHAR(255)
AS
BEGIN
UPDATE Clientes SET Direccion = @NuevaDireccion WHERE IdCliente = @IdCliente
END;
--5. Eliminar Cliente validacion para solo eliminar clientes que no tengan ventas
CREATE PROCEDURE EliminarCliente
@IdCliente INT
AS
BEGIN
IF EXISTS (SELECT 1 FROM Ventas WHERE IdCliente = @IdCliente)
BEGIN
RAISERROR('No se puede eliminar el cliente porque tiene ventas registradas.', 16,
1)
RETURN
END
DELETE FROM Clientes WHERE IdCliente = @IdCliente
END;
46
EXEC EliminarCliente 16;
-- 6. Insertar Producto
CREATE PROCEDURE InsertarProducto
@Nombre NVARCHAR(100), @Descripcion NVARCHAR(255), @Precio DECIMAL(10,2),
@Stock INT, @IdCategoria INT, @IdProveedor INT, @IdTipo INT
AS
BEGIN
INSERT INTO Productos (Nombre, Descripcion, Precio, Stock, IdCategoria,
IdProveedor, IdTipo)
VALUES (@Nombre, @Descripcion, @Precio, @Stock, @IdCategoria, @IdProveedor,
@IdTipo)
END;
--7. LISTAR PRODUCTOS
CREATE PROCEDURE ListarProductos
AS
BEGIN
SELECT * FROM Productos
END;
47
--8. Buscar Producto por Nombre
CREATE PROCEDURE BuscarProductoPorNombre
@Nombre NVARCHAR(100)
AS
BEGIN
SELECT * FROM Productos WHERE Nombre LIKE '%' + @Nombre + '%'
END;
--9. Actualizar Stock de Producto
CREATE PROCEDURE ActualizarStockProducto
@IdProducto INT, @NuevoStock INT
AS
BEGIN
UPDATE Productos SET Stock = @NuevoStock WHERE IdProducto = @IdProducto
END;
48
-- 10. Eliminar Producto
CREATE PROCEDURE EliminarProducto
@IdProducto INT
AS
BEGIN
DELETE FROM Productos WHERE IdProducto = @IdProducto
END;
--11. Insertar Venta
CREATE PROCEDURE InsertarVenta
@Fecha DATETIME, @Total DECIMAL(10,2), @IdCliente INT, @IdMetodo INT, @IdEstado INT
AS
BEGIN
INSERT INTO Ventas (Fecha, Total, IdCliente, IdMetodo, IdEstado)
VALUES (@Fecha, @Total, @IdCliente, @IdMetodo, @IdEstado)
END;
49
-- 12. Listar Ventas
CREATE PROCEDURE ListarVentas
AS
BEGIN
SELECT * FROM Ventas
END;
--13. Listar Ventas por Cliente
CREATE PROCEDURE ListarVentasPorCliente
@IdCliente INT
AS
BEGIN
SELECT * FROM Ventas WHERE IdCliente = @IdCliente
END;
50
-- 14. Obtener Total de Ventas por Cliente
CREATE PROCEDURE ObtenerTotalVentasPorCliente
@IdCliente INT
AS
BEGIN
SELECT
C.Nombre + ' ' + C.Paterno + ' ' + C.Materno AS Cliente,
SUM(V.Total) AS Total_Ventas
FROM Ventas V
INNER JOIN Clientes C ON V.IdCliente = C.IdCliente
WHERE V.IdCliente = @IdCliente
GROUP BY C.Nombre, C.Paterno, C.Materno
END;
--15: Contar Productos en Stock Bajo un Límite
CREATE PROCEDURE ContarProductosBajoStock
@Limite INT
AS
BEGIN
SELECT COUNT(*) AS ProductosBajoStock
FROM Productos
WHERE Stock < @Limite
END;
51
--16: Actualizar Precio de un Producto
CREATE PROCEDURE ActualizarPrecioProducto
@IdProducto INT,
@NuevoPrecio DECIMAL(10,2)
AS
BEGIN
UPDATE Productos
SET Precio = @NuevoPrecio
WHERE IdProducto = @IdProducto
END;
--17: Listar Clientes por Departamento
CREATE PROCEDURE ListarClientesPorDepartamento
@Departamento NVARCHAR(100)
AS
BEGIN
SELECT * FROM Clientes WHERE Departamento = @Departamento
END;
--18: Buscar Producto por Rango de Precio
CREATE PROCEDURE BuscarProductosPorPrecio
52
@PrecioMin DECIMAL(10,2),
@PrecioMax DECIMAL(10,2)
AS
BEGIN
SELECT * FROM Productos
WHERE Precio BETWEEN @PrecioMin AND @PrecioMax
END;
--19: Obtener Total de Ventas por Cliente
CREATE PROCEDURE TotalVentasPorCliente
@IdCliente INT
AS
BEGIN
SELECT SUM(Total) AS TotalGastado
FROM Ventas
WHERE IdCliente = @IdCliente
END;
--20: Listar Productos con Stock Agotado
CREATE PROCEDURE ListarProductosAgotados
AS
BEGIN
SELECT * FROM Productos
WHERE Stock = 0
END;
53
Consultas de validación 03 (10 TRIGGERS)
-- 1. Clientes – Convertir a minúsculas el deporte favorito
CREATE TRIGGER trg_Clientes_DeporteMinusculas
ON Clientes
INSTEAD OF INSERT
AS
BEGIN
INSERT INTO Clientes (ci, nombre, paterno, materno, fecha_nacimiento, direccion,
departamento, genero, estado_civil, deporte_favorito)
SELECT ci, nombre, paterno, materno, fecha_nacimiento, direccion, departamento,
genero, estado_civil, LOWER(deporte_favorito)
FROM inserted;
END;
--2. Productos – Validar que el precio no sea negativo
CREATE TRIGGER trg_Productos_ValidarPrecio
ON Productos
FOR INSERT, UPDATE
AS
BEGIN
IF EXISTS (SELECT * FROM inserted WHERE Precio < 0)
BEGIN
RAISERROR('El precio no puede ser negativo.', 16, 1);
ROLLBACK TRANSACTION;
END
END;
54
-- 3. Ventas – Fecha automática si es NULL
CREATE TRIGGER trg_Ventas_FechaDefault
ON Ventas
INSTEAD OF INSERT
AS
BEGIN
INSERT INTO Ventas (Fecha, IdCliente, Total, IdEstado, IdMetodo)
SELECT ISNULL(Fecha, GETDATE()), IdCliente, Total, IdEstado, IdMetodo
FROM inserted;
END;
--4. Convertir el nombre del estado a mayúsculas automáticamente.
CREATE TRIGGER trg_EstadoVenta_Mayusculas
ON EstadoVenta
INSTEAD OF INSERT
AS
BEGIN
INSERT INTO EstadoVenta (Nombre)
SELECT UPPER(Nombre)
FROM inserted;
END;
55
--5. Compras – Validar total mayor que cero
CREATE TRIGGER trg_Compras_TotalPositivo
ON Compras
FOR INSERT, UPDATE
AS
BEGIN
IF EXISTS (SELECT * FROM inserted WHERE Total <= 0)
BEGIN
RAISERROR('El total debe ser mayor que cero.', 16, 1);
ROLLBACK TRANSACTION;
END
END;
56
--6. Proveedores – Evitar email duplicado
CREATE TRIGGER trg_Proveedores_EvitarDuplicadoEmail
ON Proveedores
INSTEAD OF INSERT
AS
BEGIN
IF EXISTS (
SELECT 1
FROM inserted i
INNER JOIN Proveedores p ON i.Email = p.Email
)
BEGIN
RAISERROR('Ya existe un proveedor con ese email.', 16, 1);
ROLLBACK TRANSACTION;
RETURN;
END;
INSERT INTO Proveedores (Nombre, Direccion, Telefono, Email)
SELECT Nombre, Direccion, Telefono, Email
FROM inserted;
END;
57
--7. Personal – Rellenar cargo si es NULL
CREATE TRIGGER trg_Personal_ValidarRolYCargo
ON Personal
INSTEAD OF INSERT
AS
BEGIN
IF EXISTS (
SELECT i.IdRol
FROM inserted i
LEFT JOIN RolesPersonal r ON i.IdRol = r.IdRol
WHERE r.IdRol IS NULL
)
BEGIN
RAISERROR('El IdRol especificado no existe en RolesPersonal.', 16, 1);
ROLLBACK TRANSACTION;
RETURN;
END;
INSERT INTO Personal (Nombre, Cargo, Telefono, Email, IdRol)
SELECT
Nombre,
ISNULL(Cargo, 'Sin especificar'),
Telefono,
Email,
IdRol
FROM inserted;
END;
58
--8. AsistenciaPersonal – Registrar hora entrada automática
CREATE TRIGGER trg_Asistencia_HoraEntrada
ON AsistenciaPersonal
INSTEAD OF INSERT
AS
BEGIN
INSERT INTO AsistenciaPersonal (IdPersonal, Fecha, HoraEntrada, HoraSalida,
IdTurno)
SELECT IdPersonal, Fecha,
ISNULL(HoraEntrada, CONVERT(TIME, GETDATE())),
HoraSalida,
IdTurno
FROM inserted;
END;
--9. MetodosPago – Convertir a mayúsculas el nombre
CREATE TRIGGER trg_MetodosPago_NombreMayus
ON MetodosPago
INSTEAD OF INSERT
AS
BEGIN
INSERT INTO MetodosPago (Nombre)
SELECT UPPER(Nombre)
FROM inserted;
END;
59
--10. Categorias – Validar que el nombre no sea vacío
CREATE TRIGGER trg_Categorias_NombreObligatorio
ON Categorias
FOR INSERT
AS
BEGIN
IF EXISTS (SELECT * FROM inserted WHERE Nombre IS NULL OR LTRIM(RTRIM(Nombre)) =
'')
BEGIN
RAISERROR('El nombre de la categoría no puede estar vacío.', 16, 1);
ROLLBACK TRANSACTION;
END
END;
60
3.3. Aplicación cliente servidor.
3.3.1. Capturas de pantalla de:
INSERCIONES
Insertar clientes
61
Insertar productos
62
Formulario de clientes
LISTADO
Listado de clientes
63
Listado de productos:
BUSQUEDA
64
REPORTE EN PDF
Reporte de clientes en pdf
Reporte de productos en pdf.
65
TRES CONSULTAS
Consulta 1; stock minimo.
Consulta 2: Productos mas vendidos
66
Consulta 3: Porcentaje de productos sin stock
MODIFICAR Y ELIMINAR
ELIMINAR
67
MODIFICAR
68
3.4. Seguridad de la base de datos
• DESCRIPCION DEL PROYECTO
DESCRIBE Categorias:
DESCRIBE Proveedores:
69
DESCRIBE TipoProducto;
DESCRIBE Productos;
DESCRIBE Clientes:
70
DESCRIBE EstadoVenta;
DESCRIBE MetodosPago;
DESCRIBE Ventas;
71
DESCRIBE DetalleVentas;
DESCRIBE Compras;
DESCRIBE DetalleCompra;
72
DESCRIBE RolesPersonal;
DESCRIBE Personal;
DESCRIBE Turnos;
73
DESCRIBE AsistenciaPersonal;
• CREACION DE USUARIOS
1. Creacion de cuenta de Administador de ventas
2. Creación de cuenta de empleado de la tienda
74
3. Creacion de cuenta de SuperAdmin para tener acceso
• ASIGNACION DE ROLES.
1. Roles de Administrador de ventas
75
2. Roles de cuenta de empleado de la tienda
3. Roles de SuperAdmin
• VISTAS:
1.Vista de tabla Vista_Personal_Roles
2.Vista de tabla Vista_Productos_Detalles
76
3.Vista de tabla Vista_Ventas_Clientes
77
FUNCIONES DE ENCRIPTACION.
En este caso de nuestro proyecto vamos a hacer la prueba con el empleado_admin
una vez ingresado con la contraseña que nos pusimos el ventas solo tenía acceso a la tabla
Producto pero si tratamos de hacer una nueva inserción de otra tabla que está permitida nos
sale error.
78
3.5. Diseño de base de datos distribuida
3.6. Diseño de ETLs
1. Extract (Extracción)
Obtención de datos desde tablas operativas como Ventas, Productos, Clientes, Compras, etc.
2. Transform (Transformación)
Limpieza de datos, cálculos, uniones entre tablas, y creación de indicadores útiles para el
análisis.
Ejemplo: agrupar ventas por mes, calcular stock total, detectar productos más vendidos.
3. Load (Carga)
Inserción de los resultados en tablas de resumen, vistas, archivos CSV o sistemas de
Business Intelligence (BI).
Análisis de ventas por categoría y mes
Objetivo: conocer cuánto se vendió por categoría de producto durante el año actual.
Extracción:
Desde las tablas Ventas, DetallesVenta, Productos y Categorias.
79
Transformación:
Unir las tablas mediante claves foráneas.
Calcular el total vendido por categoría y mes.
Filtrar ventas del año actual.
Carga:
Insertar los datos transformados en una tabla de resumen llamada ResumenVentasMensuales.
CREATE TABLE ResumenVentasMensuales (
Mes INT,
Categoria NVARCHAR(100),
TotalVendido DECIMAL(10,2)
);
Algoritmo resumido
1. Definir el año actual (YEAR(GETDATE())).
2. Extraer Fecha, IdProducto, Cantidad, Subtotal, IdCategoria.
3. Unir con Categorias para obtener el nombre de la categoría.
4. Agrupar por mes y categoría, calcular SUM(Subtotal).
5. Validar que los campos no estén vacíos.
6. Cargar los resultados en la tabla resumen
80
Productos más vendidos por región del cliente
Objetivo: identificar productos populares según la región del cliente.
SELECT C.Direccion AS Region, P.Nombre AS Producto, SUM(DV.Cantidad) AS
TotalVendida
FROM DetallesVenta DV
JOIN Ventas V ON DV.IdVenta = V.IdVenta
JOIN Clientes C ON V.IdCliente = C.IdCliente
JOIN Productos P ON DV.IdProducto = P.IdProducto
GROUP BY C.Direccion, P.Nombre;
Caso 2: Compras por proveedor en el trimestre actual
Objetivo: evaluar cuánto se ha comprado a cada proveedor por trimestre.
SELECT PR.Nombre AS Proveedor, DATEPART(QUARTER, C.Fecha) AS Trimestre,
SUM(DC.Subtotal) AS TotalComprado
FROM Compras C
JOIN DetallesCompra DC ON C.IdCompra = DC.IdCompra
JOIN Proveedores PR ON C.IdProveedor = PR.IdProveedor
WHERE YEAR(C.Fecha) = YEAR(GETDATE())
GROUP BY PR.Nombre, DATEPART(QUARTER, C.Fecha);
Caso 3: Productos con rotación alta y stock bajo
81
Objetivo: detectar productos que se venden mucho pero tienen poco stock.
SELECT P.Nombre, P.Stock, SUM(DV.Cantidad) AS TotalVendido
FROM DetallesVenta DV
JOIN Productos P ON DV.IdProducto = P.IdProducto
GROUP BY P.Nombre, P.Stock
HAVING P.Stock < 10 AND SUM(DV.Cantidad) > 50;
82
3.7. Conclusión
El desarrollo e implementación del sistema gestor de inventario para una tienda representa
una solución eficiente a los problemas que enfrentan los negocios al deficiencias de los
métodos tradicionales de control de inventarios, como la gestión manual o el uso de hojas de
cálculo, que conllevan errores humanos, desactualización de datos y dificultades en la toma
de decisiones.
La solución propuesta automatiza el proceso de registro, actualización y seguimiento del
stock en tiempo real, reduciendo pérdidas por sobrealmacenamiento o falta de productos.
Además, la integración de alertas y reportes permite a los administradores tomar decisiones
informadas sobre compras y ventas, optimizando la gestión de recursos.
Desde un punto de vista técnico, el uso de SQL Server como base de datos garantiza una
estructura relacional bien organizada, asegurando la integridad y consistencia de la
información. Asimismo, la implementación de una interfaz en Visual Studio facilita la
interacción del usuario con el sistema, haciéndolo accesible para cualquier comerciante sin
conocimientos avanzados en tecnología.
Económicamente, este sistema reduce costos operativos al minimizar pérdidas y mejorar la
rotación de productos, lo que se traduce en una mayor rentabilidad para la tienda.
Socialmente, facilita la gestión para los empleados y mejora la experiencia del cliente al
asegurar la disponibilidad de productos en todo momento.
En conclusión, este sistema no solo moderniza la administración del inventario de una
tienda, sino que también sienta las bases para futuras mejoras, como la integración con otros
módulos de ventas y facturación. Su desarrollo con
metodologías ágiles permite una evolución constante, adaptándose a las necesidades
del negocio y garantizando su escalabilidad.
83
4. BIBLIOGRAFÍA
• Chuquimia, J. C. (2019). Sistemas de Gestión de Inventario en PYMEs. Universidad
Pública de El Alto (UPEA).
• Apaza Medina, L. (2021). Automatización en el Control de Inventarios. Instituto
Técnico INCOS.
• López, M. F. (2020). Implementación de Sistemas ERP en Tiendas Minoristas.
Universidad Mayor de San Andrés (UMSA).
• Vargas, L. A. (2018). Automatización de Procesos Comerciales en Microempresas.
Universidad Católica Boliviana “San Pablo”.
• Mendoza Paredes, R. (2021). Sistemas de Punto de Venta (POS) como Herramienta
de Control Comercial. Universidad Técnica de Oruro (UTO).
• Quispe Mamani, J. (2022). Software de Gestión Comercial para Negocios Locales.
Universidad Privada del Valle (UNIVALLE).
• Callisaya Nina, G. (2019). Uso de Tecnología Informática en la Administración de
Tiendas Multiservicio. Universidad del Valle (UNIVALLE).
• Pressman, R. S. (2010). Ingeniería del Software: Un Enfoque Práctico (7ma ed.).
McGraw-Hill.
• Sommerville, I. (2011). Ingeniería de Software (9na ed.). Pearson Educación.
• Connolly, T., & Begg, C. (2015). Bases de Datos: Diseño, Implementación y
Administración (6ta ed.). Pearson Educación.
• Microsoft. (2024). SQL Server Documentation. Recuperado de:
https://learn.microsoft.com/en-us/sql/sql-server/
• Visual Studio. (2024). Documentación oficial de Visual Studio. Microsoft.
Recuperado de: https://learn.microsoft.com/es-es/visualstudio/
• Schwaber, K., & Sutherland, J. (2020). The Scrum Guide: The Definitive Guide to
Scrum. Scrum.org. Recuperado de: https://scrumguides.org/