Sistema moderno de registro de mascotas para condominios
Características • Instalación • API • Arquitectura • Contribuir
- Descripción General
- Características
- Stack Tecnológico
- Arquitectura
- Instalación
- Uso
- API
- Desarrollo
- Troubleshooting
- Roadmap
- Contribuir
- Licencia
Mascotas Salitrera María Elena es una aplicación web de propósito específico diseñada para facilitar el registro y administración de mascotas en el condominio Salitrera María Elena (región de Antofagasta, Chile).
- 🏘️ Registros desorganizados: Mantener un control centralizado de mascotas por departamento
- 📱 Acceso rápido: Consultar contactos de dueños de mascotas instantáneamente
- 🔍 Búsqueda eficiente: Encontrar mascotas por nombre, departamento o tipo
- ✏️ Administración flexible: Actualizar información de mascotas sin perder historial
✅ Zero Dependencies Frontend - No requiere frameworks pesados
✅ Instalación Rápida - Setup en menos de 5 minutos
✅ Offline Capable - Funciona sin internet después del primer uso (datos locales)
✅ Seguro para Intranet - Diseñado para uso interno del condominio
✅ Completamente Documentado - Código limpio y fácil de mantener
Ubicado en la región de Antofagasta, Chile
| Entrada principal | Edificio Salitrera Alemania |
|---|---|
![]() |
![]() |
| Accesos interiores | Vista general |
|---|---|
![]() |
![]() |
| Dashboard | Formulario | Edición |
|---|---|---|
![]() |
![]() |
![]() |
Panel de búsqueda y filtros | Gestión de mascotas | Notificaciones en tiempo real |
| Backend | Frontend | Database | DevTools |
|
🟢 Node.js v16+ 📦 Express 4.19 🔄 CORS 2.8 🛠️ SQLite3 5.1 |
📄 HTML5 🎨 CSS3 (Custom) ⚡ Vanilla JS ✨ Fetch API |
🗄️ SQLite3 📊 Table: mascotas 🔐 Constraints CHECK ⏱️ Timestamps |
📋 npm 7+ 🚀 Git 2.0 🔧 VS Code 🌐 Live Server |
Gestión total del ciclo de vida de registros:
- ✅ Create (POST /mascotas) - Agregar nuevas mascotas con validación
- 📖 Read (GET /mascotas) - Listar todas las mascotas registradas
- ✏️ Update (PUT /mascotas/:id) - Editar información existente
- 🗑️ Delete (DELETE /mascotas/:id) - Eliminar registros con confirmación
🔍 Búsqueda en tiempo real por:
├─ Nombre de mascota
├─ Número de departamento
└─ Contacto del dueño
🏷️ Filtros:
├─ Tipo: Perro / Gato / Todos
└─ Ordenamiento: 5 opciones personalizables
📊 Contador dinámico:
└─ "Mostrando 3 de 12 mascotas"
- 📱 Responsive Design: Funciona perfecto en mobile, tablet y desktop
- 🎨 Diseño SaaS: Gradientes modernos, bordes redondeados, sombras suaves
- ⚡ Animaciones Fluidas: Transiciones de 300ms para mejor UX
- 🔔 Toast Notifications: Feedback visual de todas las acciones
- ⏳ Loading States: Spinner durante operaciones API
- 🎭 Modales Accesibles: Editar y confirmar con overlay claro
Frontend:
├─ Minlength (2 caracteres)
├─ Campos requeridos (*)
├─ Validación en tiempo real
└─ Mensajes de error claros
Backend:
├─ Revalidación de todos los campos
├─ Check de tipo válido (perro|gato)
├─ ID existence check
└─ Error handling completo
- ✅ Respuestas JSON consistentes
- ✅ Códigos HTTP semánticos (201, 400, 404, 500)
- ✅ CORS configurado para desarrollo
- ✅ Documentación integrada
- ✅ Ejemplos con curl incluidos
┌─────────────────────────────────────────────┐
│ NAVEGADOR DEL USUARIO │
│ (Chrome, Firefox, Safari, Edge) │
└────────────┬────────────────────────────────┘
│
│ HTTP/REST (JSON)
│
┌───────▼─────────┐
│ FRONTEND │
│ │
│ ┌─────────────┐ │
│ │ index.html │ │ Estructura semántica
│ ├─────────────┤ │
│ │ styles.css │ │ Diseño responsivo
│ ├─────────────┤ │
│ │ app.js │ │ Lógica interactiva
│ └─────────────┘ │
│ │
│ Puerto 5500 │
│ (Live Server) │
└────────┬────────┘
│
│ fetch() → GET, POST, PUT, DELETE
│
┌────────▼──────────────────┐
│ BACKEND (Express) │
│ │
│ ┌──────────────────────┐ │
│ │ src/index.js │ │
│ │ API REST Routes │ │
│ │ CORS Middleware │ │
│ └──────────────────────┘ │
│ │
│ ┌──────────────────────┐ │
│ │ src/db.js │ │
│ │ SQLite Connection │ │
│ │ Table Init │ │
│ └──────────────────────┘ │
│ │
│ Puerto 3000 │
│ Node.js v16+ │
└────────┬───────────────────┘
│
│ File I/O
│
┌────────▼──────────────┐
│ SQLite Database │
│ │
│ data/mascotas.db │
│ │
│ ┌─────────────────┐ │
│ │ TABLE: mascotas │ │
│ │ ├─ id (PK) │ │
│ │ ├─ nombre │ │
│ │ ├─ tipo │ │
│ │ ├─ departamento │ │
│ │ ├─ contacto │ │
│ │ └─ created_at │ │
│ └─────────────────┘ │
└───────────────────────┘
Usuario en Frontend
↓
Completa formulario (nombre, tipo, depto, contacto)
↓
Hace clic en "Agregar Mascota"
↓
JavaScript valida campos localmente
↓
Muestra spinner "Guardando..."
↓
fetch(POST /mascotas) con JSON
↓
Backend Express recibe request
↓
Re-valida datos + tipo ENUM
↓
Inserta en SQLite DB
↓
Retorna 201 + id
↓
Frontend recibe respuesta
↓
Toast "✓ Mascota agregada!"
↓
Recarga lista con nueva mascota
↓
Limpia formulario
- Node.js v16 o superior (descargar)
- npm 7 o superior (viene con Node.js)
- Git 2.0+ (opcional, para clonar)
- Editor de código (VS Code recomendado)
# Opción A: Clonar desde GitHub
git clone https://github.com/Robi2025/mascotas-salitrera.git
cd mascotas-salitrera
# Opción B: Descargar ZIP
# https://github.com/Robi2025/mascotas-salitrera/archive/refs/heads/main.zip
# Descomprimiry abrir carpetacd backend
npm installOutput esperado:
added 63 packages in 8s
# Solo si necesitas valores diferentes a los defaults
cp .env.example .env
# Editar .env:
# PORT=3000
# DB_PATH=./data/mascotas.dbnpm run devOutput esperado:
[14:32:15] API Mascotas Salitrera escuchando en puerto 3000
[14:32:15] DB inicializado en: ./data/mascotas.dbOpción A: Live Server (VS Code)
- Instalar extensión "Live Server" (ID: ritwickdey.LiveServer)
- Click derecho en
frontend/index.html→ "Open with Live Server" - Se abre automáticamente en http://localhost:5500
Opción B: Python (si tienes Python 3)
cd frontend
python -m http.server 5500Opción C: Node (sin dependencias extra)
cd frontend
npx http-server -p 5500✅ ¡Listo! Abre http://localhost:5500 en tu navegador
- Completa el formulario en la parte superior:
- Nombre: mín. 2 caracteres
- Tipo: Selecciona "Perro" o "Gato"
- Departamento: Número (ej: 401)
- Contacto: Teléfono o email del dueño
- Haz clic en "➕ Agregar Mascota"
- Recibirás una notificación verde confirmando
- La mascota aparecerá al tope de la lista
- Escribe en el campo Buscar (arriba de la lista)
- Búsqueda en tiempo real por:
- Nombre de la mascota
- Número de departamento
- Contacto del dueño
- La búsqueda es case-insensitive
Filtro por tipo:
- Todos (reset)
- Perros (solo tipo='perro')
- Gatos (solo tipo='gato')
Ordenamiento (5 opciones):
- Más reciente: Agregadas recientemente primero
- Nombre A→Z: Orden alfabético ascendente
- Nombre Z→A: Orden alfabético descendente
- Depto ↑: Número de departamento ascendente
- Depto ↓: Número de departamento descendente
- Haz clic en el botón ✏️ Editar en la mascota
- Se abre un modal con los datos actuales
- Modifica lo que necesites
- Haz clic en Guardar cambios
- Recibe confirmación "✓ Mascota actualizada"
- Haz clic en 🗑️ Eliminar en la mascota
- Se abre modal de confirmación
- Revisa el nombre mostrado
- Haz clic en Confirmar eliminación
- Recibe confirmación "✓ Mascota eliminada"
- Haz clic en 🔄 Limpiar para resetear búsqueda y filtros
Base URL: http://localhost:3000
GET /healthRespuesta:
{
"ok": true
}Caso de uso: Verificar que el servidor esté activo.
GET /mascotasRespuesta (200 OK):
[
{
"id": 5,
"nombre": "Max",
"tipo": "perro",
"departamento": "301",
"contacto": "912345678",
"created_at": "2024-02-13 14:32:10"
},
{
"id": 4,
"nombre": "Misi",
"tipo": "gato",
"departamento": "205",
"contacto": "998765432",
"created_at": "2024-02-12 10:15:45"
}
]Con curl:
curl -X GET http://localhost:3000/mascotasPOST /mascotas
Content-Type: application/json
{
"nombre": "Bella",
"tipo": "gato",
"departamento": "502",
"contacto": "987654321"
}Respuesta (201 Created):
{
"id": 6,
"nombre": "Bella",
"tipo": "gato",
"departamento": "502",
"contacto": "987654321",
"created_at": "2024-02-13 15:45:22"
}Error (400 Bad Request):
{
"error": "missing_fields",
"message": "Falta: nombre, contacto"
}Error (400 Invalid Tipo):
{
"error": "invalid_tipo",
"message": "Tipo debe ser 'perro' o 'gato'"
}Con curl:
curl -X POST http://localhost:3000/mascotas \
-H "Content-Type: application/json" \
-d '{
"nombre": "Bella",
"tipo": "gato",
"departamento": "502",
"contacto": "987654321"
}'PUT /mascotas/6
Content-Type: application/json
{
"nombre": "Bella Actualizada",
"tipo": "gato",
"departamento": "503",
"contacto": "987654321"
}Respuesta (200 OK):
{
"id": 6,
"nombre": "Bella Actualizada",
"tipo": "gato",
"departamento": "503",
"contacto": "987654321",
"created_at": "2024-02-13 15:45:22",
"updated_at": "2024-02-13 16:20:00"
}Error (404 Not Found):
{
"error": "not_found",
"message": "Mascota con ID 999 no existe"
}Con curl:
curl -X PUT http://localhost:3000/mascotas/6 \
-H "Content-Type: application/json" \
-d '{
"nombre": "Bella Actualizada",
"tipo": "gato",
"departamento": "503",
"contacto": "987654321"
}'DELETE /mascotas/6Respuesta (200 OK):
{
"success": true,
"id": 6,
"message": "Mascota eliminada correctamente"
}Error (404 Not Found):
{
"error": "not_found",
"message": "Mascota con ID 999 no existe"
}Con curl:
curl -X DELETE http://localhost:3000/mascotas/6GET /Respuesta (200 OK):
API Mascotas Salitrera funcionando 🐶🐱
# Backend
cd backend
npm run dev # Inicia servidor con auto-reload (nodemon recomendado)
npm start # Inicia servidor (sin reload)
# Frontend
cd frontend
# Just open index.html with Live Server o:
npx http-server -p 5500mascotas-salitrera/
│
├── 📄 README.md # Documentación (este archivo)
├── 📄 SETUP.md # Guía de instalación paso a paso
├── 📄 CONTRIBUTING.md # Guía para contribuidores
├── 📄 LICENSE # MIT License
├── .editorconfig # Configuración de editor unificada
├── .gitignore # Git ignore patterns
│
├── backend/ # 🔧 Servidor Node.js/Express
│ ├── src/
│ │ ├── index.js # API REST endpoints + middleware
│ │ └── db.js # SQLite setup y schema
│ ├── data/
│ │ └── mascotas.db # Base de datos (generada automáticamente)
│ ├── package.json # Dependencias backend
│ ├── .env.example # Plantilla de variables de entorno
│ └── .env # Variables reales (no en git)
│
└── frontend/ # 🎨 HTML/CSS/JS puro
├── index.html # Estructura (170 líneas)
├── styles.css # Diseño moderno SaaS (632 líneas)
├── app.js # Lógica interactiva (500 líneas)
└── .editorconfig # Para evitar tabs/spaces
JavaScript:
- ✅ Usar
constpor defecto,letsi es necesario - ✅ Arrow functions para callbacks
- ✅ Template literals para strings
- ✅ Comentarios para lógica compleja
- ❌ No minificar (mantener legible)
CSS:
- ✅ Usar CSS variables para colores
- ✅ Mobile-first approach
- ✅ BEM para clases cuando sea aplicable
- ❌ Evitar clases genéricas (no usar .red, .big)
HTML:
- ✅ IDs para JavaScript, clases para CSS
- ✅ Elementos semánticos (, ,
) - ✅ ARIA labels para accesibilidad
- ❌ No usar onclick inline
# backend/.env
PORT=3000 # Puerto del servidor
DB_PATH=./data/mascotas.db # Ruta de la BD
NODE_ENV=development # development|production
FRONTEND_ORIGIN=http://localhost:5500 # CORS originMás detalles en backend/.env.example
❌ Error: Cannot find module 'express'
✅ Solución:
cd backend
npm install
❌ El puerto 3000 ya está en uso
✅ Soluciones:
1. Termina el proceso que use el puerto:
Windows: netstat -ano | findstr :3000
taskkill /PID <PID> /F
2. Cambia el puerto en .env:
PORT=3001
3. Espera 1 minuto (el puerto se libera automáticamente)
Error: "Failed to fetch from http://localhost:3000"
❌ El frontend no puede conectar con el backend
✅ Verifica:
1. Backend está corriendo:
cd backend && npm run dev
2. Abre en navegador: http://localhost:3000/health
Debe responder: {"ok": true}
3. Revisa CORS en backend/.env o src/index.js
Asegúrate que tu origen esté permitido
4. Console del navegador (F12):
Busca errores CORS en pestañaNetwork
❌ Error: database disk image malformed
✅ Soluciones:
1. Borra la BD:
rm backend/data/mascotas.db
2. Reinicia backend:
npm run dev
3. Se creará nueva BD automáticamente
❌ Edité una mascota pero no cambió
✅ Verifica:
1. La notificación toast dice "✓ Mascota actualizada"?
Si no, hay error en API
2. Abre F12 > Network
Haz clic en Edit
Revisa la request PUT /mascotas/:id
3. ¿Status 200?
Check respuesta en JSON
4. Si falla, revisa backend logs:
cd backend && npm run dev
❌ Puedo enviar campos vacíos
✅ El navegador debe soportar HTML5 validation:
- Chrome 5+
- Firefox 4+
- Safari 5+
- Edge/IE 10+
Si usas navegador muy antiguo, actualiza.
❌ Error: EACCES: permission denied
✅ Soluciones (Linux/Mac):
sudo chown -R $USER:$USER backend/data/
chmod -R 755 backend/data/
WindowsEl propietario de la carpeta debe ser tu usuario
- CRUD básico
- Búsqueda y filtros
- Interfaz HTML/CSS/JS
- API REST
- Documentación
- Exportar a CSV
- Búsqueda avanzada (regex)
- Historial de cambios
- Backup automático
- Dark mode
- Multidioma (ES/EN)
- Autenticación + roles
- PostgreSQL en lugar de SQLite
- Docker + deployment
- Notificaciones por email
- Sincronización en tiempo real
- Móvil (React Native)
- User testing con residentes
- Feedback y iteración
- Documentación en video
- Chat de soporte
¿Quieres mejorar este proyecto? ¡Bienvenido!
Lee la guía completa: CONTRIBUTING.md
Pasos rápidos:
- Fork el repositorio
- Crea rama:
git checkout -b feature/tu-idea - Realiza cambios + pruebas
- Commit:
git commit -m "feat: descripción" - Push:
git push origin feature/tu-idea - Pull Request a
main
Áreas donde podemos ayuda:
- 🐛 Reportar bugs
- 🎨 Mejoras de diseño
- 📝 Documentación
- 🌐 Traducciones
- ⚡ Performance
- 🔒 Seguridad
MIT License © 2024 Robi2025
Eres libre de usar, modificar y distribuir este software bajo los términos de la MIT License.
Ver LICENSE para detalles completos.
- Email: contacto@salitreramariahellena.cl
- Responsable: Equipo de Residentes
- Ubicación: Antofagasta, Región de Antofagasta, Chile
Desarrolladores:
- Diseño & Código: Robi2025 🎨💻
Stack Inspirado en:
- Express.js Best Practices
- SQLite3 Production Patterns
- Web Components Standards
Testeado en:
- ✅ Chrome 120
- ✅ Firefox 121
- ✅ Safari 17
- ✅ Edge 120
| Métrica | Valor |
|---|---|
| Líneas de Código | ~1,300 |
| Dependencias Backend | 3 |
| Dependencias Frontend | 0 |
| Tamaño Mínimo | ~450 KB (con BD vacía) |
| Endpoints | 6 |
| Campos por Registro | 5 |
| Tiempo Instalación | ~3 minutos |
| Supported Browsers | 99%+ |
⭐ Si este proyecto te fue útil, no olvides dejar una estrella en GitHub ⭐
Hecho con ❤️ para la comunidad de Salitrera María Elena
# Opción A: Desarrollo (modo watch)
npm run dev
# Opción B: Producción
npm startDeberías ver:
╔════════════════════════════════════════════╗
║ API Mascotas Salitrera escuchando ║
║ 🚀 http://localhost:3000 ║
║ ✅ CORS habilitado para: ║
║ - http://127.0.0.1:5500 ║
║ - http://localhost:5500 ║
╚════════════════════════════════════════════╝
Opción A: Con VS Code + Live Server (recomendado)
- Abre
frontend/index.htmlen VS Code - Click derecho → "Open with Live Server"
- Se abre automáticamente en http://127.0.0.1:5500
Opción B: Con Python (si tienes instalado)
cd frontend
python -m http.server 5500Luego abre http://localhost:5500
Base URL: http://localhost:3000
Prueba básica de conexión
Respuesta: "API Mascotas Salitrera funcionando 🐶🐱"
Health check
Respuesta: { "ok": true }Listar todas las mascotas
Respuesta: [
{
"id": 1,
"nombre": "Max",
"tipo": "perro",
"departamento": "Depto 101",
"contacto": "+56912345678",
"created_at": "2026-02-13T10:30:00.000Z"
},
...
]Crear nueva mascota
Body: {
"nombre": "Max",
"tipo": "perro",
"departamento": "Depto 101",
"contacto": "+56912345678"
}
Respuesta: { "id": 1, "nombre": "Max", ... }
Status: 201 CreatedActualizar mascota
Body: {
"nombre": "Max Rosa",
"tipo": "perro",
"departamento": "Depto 202",
"contacto": "+56987654321"
}
Respuesta: { "id": 1, "nombre": "Max Rosa", ... }
Status: 200 OKEliminar mascota
Respuesta: { "success": true, "id": 1 }
Status: 200 OK# Desarrollo (modo watch, auto-reinicia)
npm run dev
# Producción (sin watch)
npm startmascotas-salitrera/
├── backend/
│ ├── data/
│ │ └── mascotas.db # Base de datos SQLite
│ ├── src/
│ │ ├── index.js # Servidor Express
│ │ └── db.js # Inicialización SQLite
│ ├── package.json
│ ├── .env.example # Variables de entorno
│ └── .env # Variables reales (no commit)
│
├── frontend/
│ ├── index.html # Estructura HTML
│ ├── app.js # Lógica JS (CRUD + filtros)
│ ├── styles.css # Estilos CSS3
│
└── README.md # Este archivo
Si necesitas cambiar puertos o ruta de BD, crea backend/.env:
# Puerto del servidor (default: 3000)
PORT=3000
# Ruta de la base de datos (default: ./data/mascotas.db)
DB_PATH=./data/mascotas.db
# Origen del frontend para CORS (desarrollo)
FRONTEND_ORIGIN=http://127.0.0.1:5500Nota: Los valores por defecto funcionan bien para desarrollo local. Solo cambia si necesitas algo específico.
-
npm installenbackend/completó sin errores - Backend levantado con
npm run dev - Frontend abierto en http://127.0.0.1:5500
- Puedo crear una mascota en el formulario
- La mascota aparece en el listado
- Puedo editar la mascota
- Puedo eliminar la mascota
- Búsqueda y filtros funcionan
- Console (F12) no muestra errores
Problema: El frontend no encuentra el backend en http://localhost:3000
Soluciones:
- Verifica que el backend esté corriendo (
npm run deven terminal) - Revisa que no haya otro proceso en puerto 3000:
netstat -ano | findstr :3000 # Windows lsof -i :3000 # Mac/Linux
- Recarga la página del frontend (F5)
Problema: El frontend está en un origen que no está permitido
Solución:
Verifica que tu origin esté en la lista de allowedOrigins en backend/src/index.js:
const allowedOrigins = [
"http://127.0.0.1:5500", // ← Tu origen debe estar aquí
"http://localhost:5500",
]Problema: SQLite crea una BD nueva cada vez
Nota: Es normal. Los datos se persisten en backend/data/mascotas.db. Si limpias eso, pierdes datos.
# Crear mascota
curl -X POST http://localhost:3000/mascotas \
-H "Content-Type: application/json" \
-d '{
"nombre": "Fluffy",
"tipo": "gato",
"departamento": "Depto 101",
"contacto": "+56912345678"
}'
# Listar mascotas
curl http://localhost:3000/mascotas
# Actualizar mascota (id=1)
curl -X PUT http://localhost:3000/mascotas/1 \
-H "Content-Type: application/json" \
-d '{
"nombre": "Fluffy Rosa",
"tipo": "gato",
"departamento": "Depto 202",
"contacto": "+56987654321"
}'
# Eliminar mascota (id=1)
curl -X DELETE http://localhost:3000/mascotas/1Los datos se guardan en backend/data/mascotas.db (SQLite).
Para hacer backup:
cp backend/data/mascotas.db backend/data/mascotas.backup.dbPara restaurar:
cp backend/data/mascotas.backup.db backend/data/mascotas.db- Prepara tus fotos (JPG o PNG, máx 5MB)
- Renómalas como:
fachada.jpg- Foto de la fachada principaledificio-alemania.jpg- Vista del edificio Salitrera Alemaniainterior-condominio.jpg- Pasillo o acceso interiorvista-general.jpg- Vista general del condominio desde la calle
- Coloca en carpeta:
assets/condominio/ - Haz commit y push:
git add assets/condominio/ git commit -m "assets: agregar fotos del condominio" git push origin main
- Toma capturas de pantalla:
dashboard.png- Vista principal con mascotasformulario.png- Vista del formulario de registroeditar.png- Modal de edición
- Coloca en:
assets/screenshots/ - Haz commit y push:
git add assets/screenshots/ git commit -m "assets: agregar capturas de la aplicación" git push origin main
Las fotos se mostrarán automáticamente en la sección de Galería del README.
Backend:
express- Framework web minimalistacors- Soporte para CORSsqlite3- Base de datos local
Frontend:
- HTML5 + CSS3 + Vanilla JavaScript (sin dependencias)
Proyecto interno para el condominio Salitrera María Elena.
Licencia: MIT
Ver archivo LICENSE para detalles completos.
¿Quieres mejorar este proyecto? Consulta CONTRIBUTING.md
Formas de contribuir:
- 📸 Agregar fotos del condominio (sistema > Galería)
- 🐛 Reportar bugs en Issues
- 💡 Sugerir funcionalidades nuevas
- 📝 Mejorar documentación
- 🎨 Mejoras de diseño
- 🌐 Traducciones
- Revisa la consola del navegador (F12)
- Revisa los logs del backend (terminal)
- Consulta la sección Troubleshooting
- Abre un Issue en GitHub
- Organización: Condominio Salitrera María Elena
- Ubicación: Antofagasta, Chile
- Desarrollador: Robi2025
- Email: [Tu email]
- Teléfono: [Tu teléfono]
- 💬 Discussions en GitHub
- 📧 Puedes contactar directamente a administración
- 🔔 Star el proyecto si te gustó ⭐
Este proyecto es un esfuerzo comunitario. Si encuentras valor en él:
- ⭐ Dale una estrella en GitHub
- 📸 Comparte fotos del condominio
- 🐛 Reporta bugs que encuentres
- 💡 Sugiere ideas para mejorar
- 👥 Invita a otros residentes a usarlo
Última actualización: 13 de febrero de 2026
Versión: 1.0.0
Estado: Production Ready ✅
Hecho con ❤️ para Salitrera María Elena






