Una API REST robusta y moderna para la gestión de cobros y pagos de clientes, construida con FastAPI y diseñada para operar en entornos de producción serverless.
- Características
- Arquitectura
- Requisitos
- Instalación
- Configuración
- Estructura del Proyecto
- Endpoints API
- Sistema de Multi-Tenancy
- Ejemplos de Uso
- Testing
- Deployment
- Contacto
- 🔐 Autenticación JWT: Tokens seguros con expiración configurable y refresh tokens
- 🏢 Multi-Tenancy: Sistema de múltiples empresas por usuario con switch de tenant
- 👥 Gestión de Clientes: Búsqueda y consulta de deudores con cuotas vencidas
- 💳 Registro de Pagos: Control completo de transacciones con generación de recibos PDF
- 👤 Gestión de Usuarios: Sistema de usuarios protegido con roles (admin/standard)
- 📊 Administración: Endpoints para gestión de usuarios, empresas y bases de datos
- 🛡️ Rate Limiting: Protección contra abuse con límites por IP
- ✅ Validaciones: Datos validados con Pydantic
- 📝 Documentación Auto-generada: Swagger UI disponible
- 🧪 Testing Unitario: Cobertura completa con pytest
- 🌐 Serverless Ready: Optimizado para Vercel
El proyecto sigue la arquitectura recomendada por FastAPI:
app/
├── main.py # Entry point de la aplicación
├── config.py # Configuración centralizada (Pydantic Settings)
├── dependencies.py # Dependencias reutilizables (JWT, DB)
├── database.py # Conexiones a MySQL
├── mysql_db.py # Funciones de base de datos
├── auth_utils.py # Utilidades de autenticación
├── limiter.py # Configuración de rate limiting
├── routers/ # Endpoints de la API
│ ├── auth.py
│ ├── clientes.py
│ ├── pagos.py
│ ├── usuarios.py
│ └── admin.py
├── schemas/ # Modelos Pydantic
├── services/ # Lógica de negocio
├── middleware/ # Middleware personalizado
└── models/ # Modelos de datos
- Python 3.11+
- MySQL 8.0+
- PostgreSQL (opcional, para token blocklist)
- pip
git clone https://github.com/ElvinCooper/fast-payment.git
cd fast-paymentpython -m venv venv
# Windows
venv\Scripts\activate
# Unix/MacOS
source venv/bin/activatepip install -r requirements.txtcp .env.example .env
# Editar .env con tus credenciales| Variable | Descripción | Ejemplo |
|---|---|---|
HOST |
Host del servidor MySQL | localhost |
PORT |
Puerto MySQL | 3306 |
DATABASE |
Base de datos por defecto | finanzasprueba |
USER |
Usuario MySQL | root |
DBPASSWORD |
Contraseña MySQL | password123 |
SECRET_KEY |
Clave secreta para JWT | tu_clave_segura |
EXPIRE_HOURS |
Horas de expiración del token | 2 |
POSTGRES_BD |
URL de PostgreSQL (opcional) | postgresql://... |
El sistema requiere una base de datos central ciadatabase con las siguientes tablas:
-- Empresas configuradas
CREATE TABLE ciasetup (
idcia INT PRIMARY KEY,
cidescripcion VARCHAR(255),
descbd VARCHAR(255)
);
-- Usuarios del sistema
CREATE TABLE ciausers (
idusers INT PRIMARY KEY,
usuario VARCHAR(45) UNIQUE NOT NULL,
clave VARCHAR(255) NOT NULL,
estatus VARCHAR(10),
tipouser VARCHAR(20),
empresa_id INT,
idcia INT
);
-- Relación usuario-empresa
CREATE TABLE userempresa (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT,
empresa_id INT
);
-- Token blocklist (PostgreSQL)
CREATE TABLE token_blocklist (
id SERIAL PRIMARY KEY,
jti VARCHAR(255) UNIQUE NOT NULL,
fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
idusuario INT
);| Método | Endpoint | Descripción |
|---|---|---|
POST |
/api/v1/auth/login |
Iniciar sesión y obtener token |
POST |
/api/v1/auth/switch-tenant |
Cambiar de empresa activa |
POST |
/api/v1/auth/refresh |
Refrescar token de acceso |
| Método | Endpoint | Descripción |
|---|---|---|
GET |
/api/v1/clientes/ |
Listar clientes |
GET |
/api/v1/clientes/buscar |
Buscar clientes por nombre |
GET |
/api/v1/clientes/{idcliente} |
Obtener cliente por ID |
GET |
/api/v1/clientes/{idcliente}/cuotas-vencidas |
Cuotas vencidas del cliente |
| Método | Endpoint | Descripción |
|---|---|---|
POST |
/api/v1/pagos/ |
Registrar nuevo pago |
GET |
/api/v1/pagos/generar-recibo |
Generar recibo PDF |
| Método | Endpoint | Descripción |
|---|---|---|
GET |
/api/v1/usuarios/me |
Obtener usuario actual |
POST |
/api/v1/usuarios/logout |
Cerrar sesión (revocar token) |
POST |
/api/v1/usuarios/refresh |
Refrescar token |
| Método | Endpoint | Descripción |
|---|---|---|
GET |
/api/v1/admin/users |
Listar usuarios de la empresa |
PUT |
/api/v1/admin/user/cia |
Actualizar usuario (admin) |
GET |
/api/v1/admin/user/tipos |
Listar tipos de usuario |
GET |
/api/v1/admin/server/databases |
Listar bases de datos (admin) |
GET |
/api/v1/admin/empresas |
Listar empresas del usuario |
🔒 Requiere token JWT en el header: Authorization: Bearer <token>
El sistema soporta múltiples empresas por usuario:
- Login: El usuario inicia sesión y recibe un token con la empresa por defecto
- Empresas: Un usuario puede tener acceso a múltiples empresas
- Switch Tenant: Cambio dinámico de empresa mediante
/auth/switch-tenant - Selección Obligatoria: Si el usuario tiene >1 empresa, debe seleccionar una
1. Login → Token con empresa_id y db_name
2. Si tiene >1 empresa → requiere_selection: true
3. /auth/switch-tenant → Cambia empresa activa
4. Todas las queries usan la empresa seleccionada
curl -X POST "http://localhost:8000/api/v1/auth/login" \
-H "Content-Type: application/json" \
-d '{
"usuario": "admin",
"password": "admin123"
}'Respuesta:
{
"idusuario": 1,
"username": "admin",
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
"token_type": "bearer",
"db_name": "finanzasprueba",
"empresa": "Bio Finanzas Prueba"
}curl -X GET "http://localhost:8000/api/v1/clientes/buscar?nombre=Juan" \
-H "Authorization: Bearer <tu_token>"curl -X POST "http://localhost:8000/api/v1/pagos/" \
-H "Authorization: Bearer <tu_token>" \
-H "Content-Type: application/json" \
-d '{
"idcliente": 724353,
"cliente_nombre": "Juan Pérez",
"monto": 2500.00,
"idusuario": 9,
"usuario_nombre": "Andrew"
}'curl -X POST "http://localhost:8000/api/v1/auth/switch-tenant" \
-H "Authorization: Bearer <tu_token>" \
-H "Content-Type: application/json" \
-d '{
"empresa_id": 2
}'Ejecutar todos los tests:
pytestEjecutar tests con cobertura:
pytest --cov=app tests/ --cov-report=htmlEjecutar test específico:
pytest tests/test_pagos.py -v- Conectar repositorio a Vercel
- Configurar variables de entorno en Vercel dashboard
- Desplegar automáticamente con cada push
fastapi dev
# o
uvicorn app.main:app --reload --host 0.0.0.0 --port 8000La documentación estará disponible en: http://localhost:8000/docs
🔒 Proyecto privado - Todos los derechos reservados