Productos Componentes Calculadora El Proyecto
Documentación técnica

El proyecto SERVI RKA

Sistema web de gestión para un taller de reparación tecnológica: catálogo con compra real, flujo completo de servicio técnico con cotización y pago, comunidad, wiki de componentes y calculadora de compatibilidad. Proyecto productivo — Técnica en Programación de Software, SENA.

21
Tablas en la BD
17
Usuarios registrados
182
Productos en catálogo
13
Solicitudes de servicio
120
Fichas en la wiki
7
Publicaciones en el foro
Cotización con aprobación del cliente Pagos parciales registrados Chat por solicitud Galería de hasta 6 fotos por producto Calculadora con asistente de recomendación Carrito sin recarga de página
Objetivo Problemática Tecnologías Requisitos Arquitectura Flujo de servicio Base de datos Seguridad Módulos
01 — Objetivo

¿Para qué sirve este sistema?

Desarrollar una aplicación web que permita a SERVI RKA gestionar de forma digital sus procesos de reparación de equipos, venta de componentes tecnológicos, seguimiento de solicitudes y atención al cliente, reemplazando el control manual por un sistema centralizado con base de datos real.

Alcance del sistema

  • Registro y autenticación con dos roles (cliente / administrador)
  • Catálogo con ficha de producto, galería y relacionados
  • Carrito persistente y checkout con factura descargable
  • Servicio técnico: diagnóstico, cotización, aprobación, pago y chat
  • Panel administrativo con CRUD completo en todos los módulos
  • Comunidad, wiki de componentes y calculadora de compatibilidad

Fuera de alcance: pasarela de pago electrónico real (el pago se registra manualmente por el técnico, como ocurre hoy en el taller), facturación electrónica DIAN y notificaciones automáticas por correo/SMS (la comunicación se hace por el chat interno de cada solicitud).

02 — Problemática

¿Qué problema resuelve?

✕

Antes

  • Solicitudes recibidas por WhatsApp y anotadas en papel
  • El cliente debía llamar para saber el estado de su equipo
  • Cotizaciones verbales, sin respaldo si había un malentendido
  • Reparaciones iniciadas sin confirmación explícita del cliente
  • Pagos sin registro central, difíciles de auditar
  • Inventario sin control en tiempo real (riesgo de sobreventa)
✓

Con SERVI RKA

  • Solicitudes registradas con código único automático (ORD-AAAA-####)
  • El cliente consulta el estado en línea, 24/7
  • Cotización por escrito con repuestos, mano de obra y total
  • El cliente aprueba o rechaza antes de que se toque el equipo
  • Pagos (incluso parciales) quedan registrados con método y fecha
  • Stock descontado automáticamente al confirmar un pedido
03 — Stack tecnológico

Tecnologías utilizadas

Arquitectura sencilla y explicable, sin frameworks pesados, apropiada para el nivel técnico y fácil de sustentar.

Frontend

HTML5

Estructura semántica y formularios con validación nativa.

Frontend

CSS3

Variables CSS, Grid, Flexbox, animaciones y diseño responsive sin frameworks.

Frontend

JavaScript

Vanilla JS: carrusel, carrito sin recarga (Fetch API), calculadora y chat con auto-scroll.

Backend

PHP 8

Lógica de servidor, sesiones, control de acceso por rol y procesamiento de formularios.

Base de datos

MySQL

Motor InnoDB con llaves foráneas, índices y transacciones.

Conexión

PDO

Consultas preparadas reales como protección contra inyección SQL.

Entorno

XAMPP

Apache + MySQL + PHP para desarrollo y pruebas en local.

Despliegue

Hosting CWP

Servidor Linux con Apache y MySQL, dominio propio y acceso público real.

04 — Especificación de requerimientos

Requisitos del sistema (SRS)

Requerimientos funcionales

CódigoDescripción
RF01Registro y autenticación de clientes
RF02Control de acceso por rol (cliente / administrador)
RF03Registrar solicitud de servicio con código único
RF04Consultar estado de solicitudes en línea de tiempo
RF05Ver catálogo, buscar, filtrar y ver ficha de producto
RF06Carrito: agregar, modificar cantidades y eliminar
RF07Confirmar pedido, descontar stock y generar factura
RF08Registrar diagnóstico y cotización de una solicitud
RF09Aprobar o rechazar la cotización como cliente
RF10Registrar pagos (totales o parciales) de una solicitud
RF11Enviar y recibir mensajes dentro de cada solicitud
RF12CRUD de productos con galería de hasta 6 imágenes
RF13CRUD de categorías, servicios y usuarios
RF14Crear publicaciones y respuestas en la comunidad
RF15Moderación de contenido por el administrador
RF16Wiki de componentes con filtros por categoría y marca
RF17Calculadora de compatibilidad basada en reglas
RF18Asistente que arma una configuración recomendada

Requerimientos no funcionales

CódigoDescripción
RNF01Contraseñas almacenadas con hash bcrypt, nunca en texto plano
RNF02Todas las consultas mediante sentencias preparadas (PDO)
RNF03Escape de toda salida de usuario (mitigación XSS)
RNF04Rutas administrativas protegidas del lado del servidor
RNF05Interfaz responsive de 320px a 1440px+
RNF06Ejecutable en entorno estándar (Apache + PHP + MySQL)
RNF07Código organizado por carpetas con nombres descriptivos
RNF08Integridad referencial garantizada por llaves foráneas
RNF09Operaciones críticas dentro de transacciones (rollback ante error)
RNF10Accesibilidad: labels, foco visible y respeto a "reducir movimiento"
RNF11Acciones de escritura (agregar al carrito) sin recargar la página
RNF12La calculadora requiere sesión iniciada para usarse
05 — Arquitectura

Cómo está organizado el sistema

Arquitectura en tres capas sobre PHP, con la lógica de negocio separada por dominio en archivos reutilizables.

Capa 1

Presentación

Archivos .php con HTML, más assets/css/style.css y JavaScript vanilla. El layout compartido vive en includes/header.php y includes/footer.php.

↓
Capa 2

Lógica de negocio

Funciones agrupadas por dominio en /includes: auth.php (sesiones y roles), carrito_funciones.php (carrito y checkout), solicitudes_funciones.php (estados, diagnóstico, aprobación, pago y mensajería) y foro_funciones.php (publicaciones y respuestas).

↓
Capa 3

Acceso a datos

Una única función conectarBD() en config/database.php devuelve la conexión PDO reutilizable. Ningún archivo abre conexiones por su cuenta.

Estructura de carpetas

/
├── admin/                    Panel administrativo (protegido por rol)
│   ├── dashboard.php         Resumen con estadísticas reales
│   ├── productos.php         CRUD de productos + galería de hasta 6 fotos
│   ├── categorias.php        CRUD de categorías
│   ├── servicios.php         CRUD de servicios
│   ├── solicitudes.php       Diagnóstico, cotización, pagos, chat e historial
│   ├── wiki.php              CRUD de la wiki + imágenes por categoría
│   ├── pedidos.php           Gestión de pedidos
│   └── usuarios.php          CRUD de usuarios
├── assets/
│   ├── css/style.css         Estilos globales (un solo archivo, sin frameworks)
│   └── img/                  Logo, carrusel y fondos temáticos
├── config/database.php       Conexión PDO
├── includes/                 Lógica de negocio + layout compartido
├── uploads/                  productos/ wiki/ categorias/ — imágenes subidas
├── docs/                     Documentación técnica completa
├── index.php                 Inicio
├── productos.php  producto.php  agregar_carrito.php
├── carrito.php  checkout.php  mis_pedidos.php
├── mis_solicitudes.php       Seguimiento, aprobación, pago y chat del cliente
├── comunidad.php  publicacion.php
├── wiki.php  calculadora.php
├── login.php  registro.php  logout.php
└── database.sql              Script completo de la BD
06 — El flujo más elaborado del sistema

Del reporte del cliente al pago registrado

No es solo una lista de estados: cada paso cambia el comportamiento de la interfaz para el cliente y para el técnico, y queda respaldado en la base de datos.

1
Solicitud recibida
2
En diagnóstico
3
Cotización enviada
4
Esperando aprobación
5
En reparación
6
Pruebas finales
7
Listo para entregar
8
Entregado
1

El cliente reporta

Registra el problema desde el formulario de inicio. El sistema genera un código único (ORD-AAAA-####) y crea la primera entrada en el historial.

2

El técnico diagnostica

Desde el panel admin registra el hallazgo, agrega repuestos uno por uno (con cantidad y precio) y define la mano de obra. El sistema suma el costo_total automáticamente.

3

Se envía la cotización

Al guardar el diagnóstico, un mensaje automático llega al chat del cliente con el resumen completo: qué se encontró, qué cuesta y cuántos días tomará.

4

El cliente decide

Ve el desglose de repuestos y mano de obra, y aprueba o rechaza con un clic. Si rechaza, puede explicar por qué; si aprueba, la solicitud avanza sola a "En reparación".

5

Se registra el pago

El técnico anota los abonos según entran (estado_pago: pendiente, parcial o pagado). El cliente ve en todo momento cuánto ha pagado y cuánto falta.

6

Conversación permanente

En cualquier punto del proceso, cliente y taller se escriben desde la misma solicitud. Cada quien ve un contador de mensajes sin leer en su listado.

Tablas involucradas en este flujo

  • solicitudes_servicio — ampliada con diagnóstico, costos, aprobación, estado de pago y monto pagado
  • repuestos_solicitud — cada repuesto cotizado, con cantidad y precio unitario
  • mensajes_solicitud — la conversación completa, marcando quién escribió y si ya se leyó
  • historial_estados_solicitud — una fila por cada cambio de estado, con fecha y comentario
07 — Base de datos

Diseño relacional normalizado

Base relacional en MySQL con integridad referencial, normalizada hasta la tercera forma normal. 21 tablas en total.

Tablas principales

  • roles / usuarios — autenticación y control de acceso
  • categorias_producto / productos — catálogo
  • producto_imagenes — galería de hasta 6 fotos por producto
  • servicios — servicios ofrecidos
  • estados_solicitud / solicitudes_servicio — atención técnica
  • repuestos_solicitud / mensajes_solicitud — cotización y chat
  • historial_estados_solicitud — auditoría del seguimiento
  • carrito_items / pedidos / detalle_pedido — ventas
  • categorias_publicacion / publicaciones / respuestas — comunidad
  • componentes_wiki / wiki_categorias — información técnica de referencia
  • calc_componentes — catálogo genérico para la calculadora

Normalización aplicada

1FN — Todos los campos son atómicos. Los repuestos de una cotización están en repuestos_solicitud, no como texto libre dentro de la solicitud.

2FN — Todas las tablas usan clave primaria simple autoincremental, por lo que no existen dependencias parciales. precio_unitario vive en detalle_pedido porque depende del momento de la compra.

3FN — Ningún atributo no clave depende de otro no clave. El nombre de la categoría nunca se copia dentro de productos: se obtiene siempre por JOIN, evitando redundancia e inconsistencias.

Decisiones de diseño defendibles

  • Precio histórico: detalle_pedido.precio_unitario guarda el precio al momento de comprar. Si mañana sube el precio del producto, los pedidos antiguos no se alteran.
  • Estados como catálogo: estados_solicitud es una tabla con orden, no texto libre. Evita errores de escritura y permite ordenar la línea de tiempo.
  • Aprobación explícita: solicitudes_servicio.aprobacion (pendiente/aprobada/rechazada) impide que se repare algo que el cliente no autorizó.
  • Pago fraccionable: estado_pago y monto_pagado admiten abonos, no solo pago total de una vez.
  • Historial separado: cada cambio de estado inserta una fila en historial_estados_solicitud, dejando trazabilidad completa.
  • Carrito en BD, no en sesión: carrito_items está ligado al usuario, así que sobrevive al cierre del navegador.
  • Restricción UNIQUE: (id_usuario, id_producto) en el carrito impide filas duplicadas del mismo producto.
  • Galería desacoplada: producto_imagenes vive aparte de productos para no limitar a una sola foto ni forzar columnas imagen2, imagen3....
08 — Seguridad

Medidas implementadas

Hash de contraseñas

password_hash() y password_verify() con bcrypt. Ninguna contraseña se guarda ni se compara en texto plano.

Inyección SQL

PDO con ATTR_EMULATE_PREPARES => false, forzando consultas preparadas reales del lado del motor.

Protección XSS

Toda salida de datos de usuario pasa por htmlspecialchars() mediante la función limpiar().

Control de acceso

requerirAdmin() bloquea el panel a nivel de servidor: escribir la URL directamente devuelve 403.

Propiedad de los datos

Aprobar o rechazar una cotización valida que la solicitud pertenezca al usuario que hace la petición, no solo que esté logueado.

Fijación de sesión

session_regenerate_id(true) al iniciar sesión, generando un identificador nuevo.

Subida de archivos

Validación de extensión, tamaño máximo y verificación real con getimagesize(). Nombre aleatorio con random_bytes().

Redirecciones internas

El parámetro volver tras login/registro solo acepta rutas que empiecen por /, evitando redirecciones a sitios externos.

09 — Módulos

Funcionalidades implementadas

Autenticación

Registro, login y logout con sesiones PHP, dos roles diferenciados y redirección de vuelta a la página de origen.

Catálogo y ficha de producto

Búsqueda, filtro por categoría y precio, galería de hasta 6 fotos, especificaciones y productos relacionados.

Carrito sin recarga

Agregar productos actualiza el carrito con Fetch API; checkout con transacción y factura descargable.

Servicio técnico completo

Diagnóstico, cotización con repuestos, aprobación del cliente, registro de pagos y chat por solicitud.

Panel administrativo

CRUD de productos, categorías, servicios, usuarios, solicitudes, pedidos y wiki, todo protegido por rol.

Comunidad

Publicaciones por categoría, respuestas, búsqueda y moderación desde el panel.

Wiki de componentes

120 fichas técnicas con filtros por categoría, marca y gama, e imágenes editables por el administrador.

Calculadora premium

Verifica compatibilidad regla por regla y ofrece 3 configuraciones comparables a partir de una pieza que ya tengas. Requiere cuenta.

Algoritmo destacado: proceso de checkout

Ejemplo de lógica defendible en sustentación — usa una transacción para garantizar que nunca queden datos inconsistentes:

1. Obtener los items del carrito del usuario
2. INICIAR TRANSACCIÓN
3. Para cada item:
     SELECT stock ... FOR UPDATE   (bloquea la fila)
     Si stock insuficiente → ROLLBACK y avisar al cliente
4. Generar código PED-AAAA-#### sin duplicados
5. INSERT en pedidos (encabezado)
6. Para cada item:
     INSERT en detalle_pedido (con precio histórico)
     UPDATE productos SET stock = stock - cantidad
7. DELETE de carrito_items
8. COMMIT
9. Redirigir a la factura (evita reenvío accidental del formulario)

Si algo falla en cualquier punto, el ROLLBACK deshace todo: no se crea un pedido a medias ni se descuenta stock de un pedido que no se completó.

Proyecto productivo — SENA

Técnica en Programación de Software · Cúcuta, Norte de Santander · 2026

Volver al inicio
¡Escríbenos!