Sistema integral de gestión para clínicas veterinarias
Comprehensive management system for veterinary clinics
📹 Demo completa del sistema / Full system demo
Veterinaria SOS es un sistema de gestión empresarial (ERP) diseñado para clínicas veterinarias. Fue desarrollado como MVP académico para la materia de Ingeniería de Software (4to semestre) en la Universidad Pontificia Bolivariana (UPB), obteniendo una calificación de 5.0/5.0.
El sistema permite administrar clientes, mascotas, inventario (medicamentos, alimentos, accesorios, material quirúrgico), proveedores, ventas (POS), historial clínico, usuarios con permisos modulares y recuperación de contraseña por email con código OTP.
| Capa | Tecnología |
|---|---|
| Lenguaje | Java 23 |
| UI Framework | JavaFX 17 (FXML + CSS) |
| Build Tool | Apache Maven 3.9 |
| Base de Datos | PostgreSQL 15+ |
| Connection Pool | HikariCP 5.0 |
| Migraciones | Flyway |
| Seguridad | BCrypt (hashing de contraseñas) |
| JavaMail API (SMTP / Gmail) | |
| Patrón de Datos | DAO con JDBC |
| Arquitectura | MVC (Model-View-Controller) |
graph TD
subgraph "🖥️ Capa de Presentación (View)"
V1[FXML Views]
V2[CSS Stylesheets]
end
subgraph "🧠 Capa de Control (Controller)"
C1[LoginController]
C2[DashboardController]
C3[InventoryController]
C4[SalesController]
C5[ClientController]
C6[UserController]
end
subgraph "⚙️ Capa de Servicio (Service)"
S1[UsuarioService]
S2[ProductoService]
S3[VentaService]
S4[ClienteMascotaService]
S5[EmailService]
S6[HistorialClinicaService]
end
subgraph "🗄️ Capa de Datos (Repository / DAO)"
R1[UsuarioRepository]
R2[ProductoRepository]
R3[VentaRepository]
R4[ClienteRepository]
R5[MascotaRepository]
R6[ProveedorRepository]
end
subgraph "🐘 Base de Datos"
DB[(PostgreSQL<br/>Schema: veterinaria)]
end
V1 --> C1 & C2 & C3 & C4 & C5 & C6
C1 --> S1 & S5
C2 --> S1
C3 --> S2
C4 --> S3
C5 --> S4
C6 --> S1
S1 --> R1
S2 --> R2
S3 --> R3
S4 --> R4 & R5
S6 --> R4
R1 & R2 & R3 & R4 & R5 & R6 --> DB
erDiagram
USUARIO {
int idusuario PK
varchar cc
varchar nombre
varchar apellidos
varchar usuario UK
varchar email UK
varchar contrasena
varchar telefono
varchar direccion
}
MODULO {
int idmodulo PK
varchar nombremodulo
varchar descripcion
varchar icono
int orden
}
USUARIO_MODULO {
int idusuario_modulo PK
int usuario_idusuario FK
int modulo_idmodulo FK
timestamp fecha_asignacion
}
PASSWORD_RESET_TOKEN {
int idtoken PK
int usuario_idusuario FK
varchar email
varchar codigo_otp
timestamp fecha_creacion
timestamp fecha_expiracion
boolean usado
}
CLIENTE {
int idcliente PK
varchar nombre
varchar apellidos
varchar tipopersona
varchar cc
date fechanacimiento
varchar email
varchar direccion
varchar telefono
varchar nombrecontactoemergencia
varchar telefonocontactoemergencia
varchar ciudad
varchar tipodocumento
}
MASCOTA {
int idmascota PK
varchar nombre
varchar raza
varchar especie
varchar sexo
varchar numerochip
int edad
int cliente_idcliente FK
}
HISTORIALCLINICA {
int idhistorialclinica PK
text observaciones
int mascota_idmascota FK
}
SERVICIO {
int idservicio PK
varchar nombreservicio
numeric precio
text descripcion
}
HISTORIALCLINICA_HAS_SERVICIO {
int id PK
int historialclinica_idhistorialclinica FK
int servicio_idservicio FK
}
MARCA {
int idmarca PK
varchar nombremarca
varchar descripcion
}
UNIDADMEDIDA {
int idunidadmedida PK
varchar nombre
}
TIPOPRODUCTO {
int idtipoproducto PK
varchar nombretipo
}
PRODUCTO {
int idproducto PK
varchar nombre
varchar referencia
varchar codigobarras
numeric precio
numeric costo
text descripcion
numeric stock
int unidadesingresadas
bytea imagenproducto
varchar estado
varchar lote
date fechaVencimiento
int semanaalerta
boolean fraccionable
boolean fraccionado
numeric contenido
varchar dosisUnidad
int marca_idmarca FK
int usuario_idusuario FK
int unidadmedida_idunidadmedida FK
int tipoproducto_idtipoproducto FK
}
PROVEEDOR {
int idproveedor PK
varchar tipopersona
varchar tipodocumento
varchar nit_rut
varchar nombre
varchar apellido
varchar telefono
varchar direccion
varchar email
varchar ciudad
}
PROVEEDOR_HAS_PRODUCTO {
int id PK
int producto_idproducto FK
int proveedor_idproveedor FK
}
ALERTA {
int idalerta PK
boolean pendiente
varchar motivo
date fechaobjetivo
date fechacreacion
int producto_idproducto FK
}
VENTA {
int idventa PK
int cliente_idcliente FK
timestamp fecha
numeric totalventa
int usuario_idusuario FK
}
LINEAVENTA {
int idlineaventa PK
int venta_idventa FK
int producto_idproducto FK
int servicio_idservicio FK
int cantidad
numeric subtotal
numeric valor
}
USUARIO ||--o{ USUARIO_MODULO : "tiene permisos"
MODULO ||--o{ USUARIO_MODULO : "asignado a"
USUARIO ||--o{ PASSWORD_RESET_TOKEN : "solicita reset"
USUARIO ||--o{ PRODUCTO : "registra"
USUARIO ||--o{ VENTA : "realiza"
CLIENTE ||--o{ MASCOTA : "tiene"
CLIENTE ||--o{ VENTA : "compra"
MASCOTA ||--o| HISTORIALCLINICA : "posee"
HISTORIALCLINICA ||--o{ HISTORIALCLINICA_HAS_SERVICIO : "incluye"
SERVICIO ||--o{ HISTORIALCLINICA_HAS_SERVICIO : "aplicado en"
MARCA ||--o{ PRODUCTO : "categoriza"
TIPOPRODUCTO ||--o{ PRODUCTO : "clasifica"
UNIDADMEDIDA ||--o{ PRODUCTO : "mide"
PRODUCTO ||--o{ PROVEEDOR_HAS_PRODUCTO : "suministrado por"
PROVEEDOR ||--o{ PROVEEDOR_HAS_PRODUCTO : "suministra"
PRODUCTO ||--o{ ALERTA : "genera"
VENTA ||--o{ LINEAVENTA : "contiene"
PRODUCTO ||--o{ LINEAVENTA : "vendido en"
SERVICIO ||--o{ LINEAVENTA : "facturado en"
Para instrucciones detalladas de configuración de la base de datos, por favor consulta la Guía de Base de Datos (DATABASE_SETUP.md).
El script DDL completo se encuentra en sql/init_schema.sql. Los datos de prueba están en sql/seed_data.sql.
Veterinaria/
├── src/main/java/co/edu/upb/veterinaria/
│ ├── app/ # Punto de entrada (Principal.java)
│ ├── config/ # Configuración (DatabaseConfig)
│ ├── controllers/ # Controladores JavaFX (MVC)
│ ├── models/ # Modelos / Entidades (POJOs)
│ ├── repositories/ # Capa DAO (acceso a BD con JDBC)
│ └── services/ # Lógica de negocio
├── src/main/resources/
│ └── co/edu/upb/veterinaria/
│ ├── views/ # Archivos FXML
│ ├── styles/ # Hojas de estilo CSS
│ └── images/ # Recursos gráficos
├── sql/
│ ├── init_schema.sql # DDL completo de la base de datos
│ └── seed_data.sql # Datos de prueba reales
├── docs/assets/ # Capturas de pantalla del sistema
├── .env.example # Plantilla de variables de entorno
├── DATABASE_SETUP.md # Guía de configuración de BD
├── CONTRIBUTING.md # Guía de contribución
├── CODE_OF_CONDUCT.md # Código de conducta
├── SECURITY.md # Política de seguridad
├── CHANGELOG.md # Registro de cambios
├── LICENSE # Licencia MIT
└── pom.xml # Configuración Maven
- Java JDK 23 o superior
- Maven 3.9+
- PostgreSQL 15+ en ejecución
# 1. Clonar el repositorio
git clone https://github.com/tu-usuario/Veterinaria.git
cd Veterinaria
# 2. Configurar la base de datos (ver DATABASE_SETUP.md)
psql -U postgres -d postgres -f sql/init_schema.sql
# 3. Configurar variables de entorno
cp .env.example .env
# Editar .env con tus credenciales
# 4. Compilar y ejecutar
./mvnw clean javafx:run- Autenticación segura con BCrypt y recuperación por email (OTP)
- Gestión de usuarios con permisos modulares granulares
- Registro de clientes con contacto de emergencia y mascotas asociadas
- Inventario completo (Medicamentos, Alimentos, Material Quirúrgico, Accesorios)
- Punto de Venta (POS) con líneas de venta para productos y servicios
- Historial Clínico por mascota con servicios asociados
- Alertas automáticas de vencimiento y stock bajo
- Gestión de Proveedores con relación N:N a productos
Las contribuciones son bienvenidas. Sigue estos pasos:
- Crea un fork del repositorio.
- Crea una rama para tu feature:
git checkout -b feature/mi-feature. - Haz commit de tus cambios:
git commit -m "feat: descripción del cambio". - Sube tu rama:
git push origin feature/mi-feature. - Abre un Pull Request describiendo tus cambios.
📖 Consulta la Guía de Contribución para convenciones de código, commits y flujo de trabajo.
🤝 Lee nuestro Código de Conducta antes de participar.
Si descubres una vulnerabilidad de seguridad, NO abras un issue público. Consulta nuestra Política de Seguridad para el proceso de reporte responsable.
Este proyecto está licenciado bajo la Licencia MIT — libre para uso, modificación y distribución. Ver LICENSE para más información.
Hecho con ❤️ por el equipo de desarrollo
Universidad Pontificia Bolivariana
Proyecto de Aula · Ingeniería de Software · Ingeniería de Sistemas e Informática · 2025-2026
Veterinaria SOS is an enterprise resource planning (ERP) system designed for veterinary clinics. It was developed as an academic MVP for the Software Engineering course (4th semester) at Universidad Pontificia Bolivariana (UPB), achieving a grade of 5.0/5.0.
The system manages clients, pets, inventory (medications, food, accessories, surgical materials), suppliers, sales (POS), clinical history, users with modular permissions, and email-based password recovery with OTP codes.
| Layer | Technology |
|---|---|
| Language | Java 23 |
| UI Framework | JavaFX 17 (FXML + CSS) |
| Build Tool | Apache Maven 3.9 |
| Database | PostgreSQL 15+ |
| Connection Pool | HikariCP 5.0 |
| Migrations | Flyway |
| Security | BCrypt (password hashing) |
| JavaMail API (SMTP / Gmail) | |
| Data Pattern | DAO with JDBC |
| Architecture | MVC (Model-View-Controller) |
graph TD
subgraph "Presentation Layer - View"
V1[FXML Views]
V2[CSS Stylesheets]
end
subgraph "Control Layer - Controller"
C1[LoginController]
C2[DashboardController]
C3[InventoryController]
C4[SalesController]
C5[ClientController]
C6[UserController]
end
subgraph "Service Layer"
S1[UsuarioService]
S2[ProductoService]
S3[VentaService]
S4[ClienteMascotaService]
S5[EmailService]
S6[HistorialClinicaService]
end
subgraph "Data Layer - Repository / DAO"
R1[UsuarioRepository]
R2[ProductoRepository]
R3[VentaRepository]
R4[ClienteRepository]
R5[MascotaRepository]
R6[ProveedorRepository]
end
subgraph "Database"
DB[(PostgreSQL<br/>Schema: veterinaria)]
end
V1 --> C1 & C2 & C3 & C4 & C5 & C6
C1 --> S1 & S5
C2 --> S1
C3 --> S2
C4 --> S3
C5 --> S4
C6 --> S1
S1 --> R1
S2 --> R2
S3 --> R3
S4 --> R4 & R5
S6 --> R4
R1 & R2 & R3 & R4 & R5 & R6 --> DB
erDiagram
USUARIO {
int idusuario PK
varchar cc
varchar nombre
varchar apellidos
varchar usuario UK
varchar email UK
varchar contrasena
varchar telefono
varchar direccion
}
MODULO {
int idmodulo PK
varchar nombremodulo
varchar descripcion
varchar icono
int orden
}
USUARIO_MODULO {
int idusuario_modulo PK
int usuario_idusuario FK
int modulo_idmodulo FK
timestamp fecha_asignacion
}
PASSWORD_RESET_TOKEN {
int idtoken PK
int usuario_idusuario FK
varchar email
varchar codigo_otp
timestamp fecha_creacion
timestamp fecha_expiracion
boolean usado
}
CLIENTE {
int idcliente PK
varchar nombre
varchar apellidos
varchar tipopersona
varchar cc
date fechanacimiento
varchar email
varchar direccion
varchar telefono
varchar nombrecontactoemergencia
varchar telefonocontactoemergencia
varchar ciudad
varchar tipodocumento
}
MASCOTA {
int idmascota PK
varchar nombre
varchar raza
varchar especie
varchar sexo
varchar numerochip
int edad
int cliente_idcliente FK
}
HISTORIALCLINICA {
int idhistorialclinica PK
text observaciones
int mascota_idmascota FK
}
SERVICIO {
int idservicio PK
varchar nombreservicio
numeric precio
text descripcion
}
HISTORIALCLINICA_HAS_SERVICIO {
int id PK
int historialclinica_idhistorialclinica FK
int servicio_idservicio FK
}
MARCA {
int idmarca PK
varchar nombremarca
varchar descripcion
}
UNIDADMEDIDA {
int idunidadmedida PK
varchar nombre
}
TIPOPRODUCTO {
int idtipoproducto PK
varchar nombretipo
}
PRODUCTO {
int idproducto PK
varchar nombre
varchar referencia
varchar codigobarras
numeric precio
numeric costo
text descripcion
numeric stock
int unidadesingresadas
bytea imagenproducto
varchar estado
varchar lote
date fechaVencimiento
int semanaalerta
boolean fraccionable
boolean fraccionado
numeric contenido
varchar dosisUnidad
int marca_idmarca FK
int usuario_idusuario FK
int unidadmedida_idunidadmedida FK
int tipoproducto_idtipoproducto FK
}
PROVEEDOR {
int idproveedor PK
varchar tipopersona
varchar tipodocumento
varchar nit_rut
varchar nombre
varchar apellido
varchar telefono
varchar direccion
varchar email
varchar ciudad
}
PROVEEDOR_HAS_PRODUCTO {
int id PK
int producto_idproducto FK
int proveedor_idproveedor FK
}
ALERTA {
int idalerta PK
boolean pendiente
varchar motivo
date fechaobjetivo
date fechacreacion
int producto_idproducto FK
}
VENTA {
int idventa PK
int cliente_idcliente FK
timestamp fecha
numeric totalventa
int usuario_idusuario FK
}
LINEAVENTA {
int idlineaventa PK
int venta_idventa FK
int producto_idproducto FK
int servicio_idservicio FK
int cantidad
numeric subtotal
numeric valor
}
USUARIO ||--o{ USUARIO_MODULO : "has permissions"
MODULO ||--o{ USUARIO_MODULO : "assigned to"
USUARIO ||--o{ PASSWORD_RESET_TOKEN : "requests reset"
USUARIO ||--o{ PRODUCTO : "registers"
USUARIO ||--o{ VENTA : "makes"
CLIENTE ||--o{ MASCOTA : "owns"
CLIENTE ||--o{ VENTA : "purchases"
MASCOTA ||--o| HISTORIALCLINICA : "has"
HISTORIALCLINICA ||--o{ HISTORIALCLINICA_HAS_SERVICIO : "includes"
SERVICIO ||--o{ HISTORIALCLINICA_HAS_SERVICIO : "applied in"
MARCA ||--o{ PRODUCTO : "categorizes"
TIPOPRODUCTO ||--o{ PRODUCTO : "classifies"
UNIDADMEDIDA ||--o{ PRODUCTO : "measures"
PRODUCTO ||--o{ PROVEEDOR_HAS_PRODUCTO : "supplied by"
PROVEEDOR ||--o{ PROVEEDOR_HAS_PRODUCTO : "supplies"
PRODUCTO ||--o{ ALERTA : "triggers"
VENTA ||--o{ LINEAVENTA : "contains"
PRODUCTO ||--o{ LINEAVENTA : "sold in"
SERVICIO ||--o{ LINEAVENTA : "billed in"
For detailed database setup instructions, please refer to the Database Setup Guide (DATABASE_SETUP.md).
The complete DDL script is available at sql/init_schema.sql. Test data is in sql/seed_data.sql.
Veterinaria/
├── src/main/java/co/edu/upb/veterinaria/
│ ├── app/ # Entry point (Principal.java)
│ ├── config/ # Configuration (DatabaseConfig)
│ ├── controllers/ # JavaFX Controllers (MVC)
│ ├── models/ # Models / Entities (POJOs)
│ ├── repositories/ # DAO Layer (DB access with JDBC)
│ └── services/ # Business logic
├── src/main/resources/
│ └── co/edu/upb/veterinaria/
│ ├── views/ # FXML files
│ ├── styles/ # CSS stylesheets
│ └── images/ # Graphic resources
├── sql/
│ ├── init_schema.sql # Full database DDL
│ └── seed_data.sql # Real test data
├── docs/assets/ # System screenshots
├── .env.example # Environment variables template
├── DATABASE_SETUP.md # Database setup guide
├── CONTRIBUTING.md # Contribution guide
├── CODE_OF_CONDUCT.md # Code of conduct
├── SECURITY.md # Security policy
├── CHANGELOG.md # Changelog
├── LICENSE # MIT License
└── pom.xml # Maven configuration
- Java JDK 23 or higher
- Maven 3.9+
- PostgreSQL 15+ running
# 1. Clone the repository
git clone https://github.com/your-user/Veterinaria.git
cd Veterinaria
# 2. Set up the database (see DATABASE_SETUP.md)
psql -U postgres -d postgres -f sql/init_schema.sql
# 3. Configure environment variables
cp .env.example .env
# Edit .env with your credentials
# 4. Build and run
./mvnw clean javafx:run- Secure authentication with BCrypt and email recovery (OTP)
- User management with granular modular permissions
- Client registration with emergency contacts and associated pets
- Complete inventory (Medications, Food, Surgical Materials, Accessories)
- Point of Sale (POS) with sale lines for products and services
- Clinical History per pet with associated services
- Automatic alerts for expiration and low stock
- Supplier management with N:N product relationships
Contributions are welcome. Follow these steps:
- Fork the repository.
- Create a branch for your feature:
git checkout -b feature/my-feature. - Commit your changes:
git commit -m "feat: description of change". - Push your branch:
git push origin feature/my-feature. - Open a Pull Request describing your changes.
📖 Check the Contribution Guide for code conventions, commits, and workflow.
🤝 Read our Code of Conduct before participating.
If you discover a security vulnerability, DO NOT open a public issue. See our Security Policy for the responsible disclosure process.
This project is licensed under the MIT License — free for use, modification, and distribution. See LICENSE for more information.
Made with ❤️ by the development team
Universidad Pontificia Bolivariana
Classroom Project · Software Engineering · Systems and Informatics Engineering · 2025-2026












