Skip to content

Dabji/Veterinaria

SOS Veterinaria Logo

🐾 Veterinaria SOS — Enterprise Management System

Sistema integral de gestión para clínicas veterinarias
Comprehensive management system for veterinary clinics

Java 23 JavaFX 17 PostgreSQL Maven HikariCP BCrypt MIT License Grade 5.0

Español · English


Veterinaria SOS Demo
📹 Demo completa del sistema / Full system demo


🇪🇸 Español

Acerca del Proyecto

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.

Galería de Interfaces (UI Showcase)

Login
Inicio de Sesión
Password Recovery
Recuperación de Contraseña (OTP)
Dashboard
Panel Principal / Dashboard
Product Registration
Registro de Productos
Inventory Filters
Inventario con Filtros Avanzados
Client Registration
Registro de Clientes
Pet Registration
Registro de Mascotas
Supplier Registration
Registro de Proveedores
User Management
Gestión de Usuarios
User Permissions
Permisos por Módulo
Clinical Services
Servicios e Historial Clínico
OTP Email
Email OTP Recibido

Stack Tecnológico

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)
Email JavaMail API (SMTP / Gmail)
Patrón de Datos DAO con JDBC
Arquitectura MVC (Model-View-Controller)

Arquitectura del Sistema

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
Loading

Modelo Entidad-Relación (ERD)

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"
Loading

Base de Datos

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.

Estructura del Proyecto

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

Inicio Rápido

Prerrequisitos

  • Java JDK 23 o superior
  • Maven 3.9+
  • PostgreSQL 15+ en ejecución

Instalació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

Funcionalidades Principales

  • 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

🤝 Contribuir

Las contribuciones son bienvenidas. Sigue estos pasos:

  1. Crea un fork del repositorio.
  2. Crea una rama para tu feature: git checkout -b feature/mi-feature.
  3. Haz commit de tus cambios: git commit -m "feat: descripción del cambio".
  4. Sube tu rama: git push origin feature/mi-feature.
  5. 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.

🔒 Seguridad

Si descubres una vulnerabilidad de seguridad, NO abras un issue público. Consulta nuestra Política de Seguridad para el proceso de reporte responsable.

📄 Licencia

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



🇺🇸 English

About the Project

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.

UI Showcase Gallery

Login
Login Screen
Password Recovery
Password Recovery (OTP)
Dashboard
Main Dashboard
Product Registration
Product Registration
Inventory Filters
Inventory with Advanced Filters
Client Registration
Client Registration
Pet Registration
Pet Registration
Supplier Registration
Supplier Registration
User Management
User Management
User Permissions
Module Permissions
Clinical Services
Services & Clinical History
OTP Email
OTP Email Received

Technology Stack

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)
Email JavaMail API (SMTP / Gmail)
Data Pattern DAO with JDBC
Architecture MVC (Model-View-Controller)

System Architecture

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
Loading

Entity-Relationship Diagram (ERD)

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"
Loading

Database

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.

Project Structure

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

Quick Start

Prerequisites

  • Java JDK 23 or higher
  • Maven 3.9+
  • PostgreSQL 15+ running

Installation

# 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

Key Features

  • 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

🤝 Contributing

Contributions are welcome. Follow these steps:

  1. Fork the repository.
  2. Create a branch for your feature: git checkout -b feature/my-feature.
  3. Commit your changes: git commit -m "feat: description of change".
  4. Push your branch: git push origin feature/my-feature.
  5. Open a Pull Request describing your changes.

📖 Check the Contribution Guide for code conventions, commits, and workflow.

🤝 Read our Code of Conduct before participating.

🔒 Security

If you discover a security vulnerability, DO NOT open a public issue. See our Security Policy for the responsible disclosure process.

📄 License

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

About

🐾 Veterinaria SOS: Sistema de gestión clínica (POS, Inventario, Historial). Proyecto MVP de Ingeniería de Software (UPB) desarrollado con JavaFX, JDBC puro y PostgreSQL.

Topics

Resources

License

Code of conduct

Contributing

Security policy

Stars

Watchers

Forks

Contributors