📋 Documentación del Módulo de Terceros
📑 Índice
- Descripción General
- Arquitectura del Sistema
- Base de Datos
- Controladores
- Vistas y Componentes
- Sistema de Departamentos y Municipios
- Funcionalidades Principales
- Validaciones y Reglas de Negocio
- Manejo de AJAX
- Reportes
- Guía de Uso
- Troubleshooting
📖 Descripción General
El Módulo de Terceros es un sistema integral para la gestión de entidades externas en el sistema LyP Consultores Empresariales. Permite administrar clientes, proveedores, empleados y otras entidades con sus datos completos incluyendo información geográfica de Colombia.
Características Principales:
- ✅ Gestión completa de terceros (CRUD)
- ✅ Categorización por tipo (cliente, proveedor, empleado, otro)
- ✅ Sistema integrado de departamentos y municipios de Colombia
- ✅ Validación de duplicados
- ✅ Interfaz modal para creación y edición
- ✅ Generación de reportes en PDF y Excel
- ✅ Integración con otros módulos del sistema
🏗️ Arquitectura del Sistema
Estructura de Archivos
app/
├── Http/Controllers/
│ └── TercerosController.php # Controlador principal
├── Models/
│ └── Tercero.php # Modelo Eloquent
└── Exports/
└── TercerosExport.php # Exportación a Excel
resources/views/
├── cliente/
│ └── terceros.blade.php # Vista principal
├── components/
│ ├── modal-terceros.blade.php # Modal crear tercero
│ └── modal-editar-terceros.blade.php # Modal editar tercero
└── pdf/
└── terceros-pdf.blade.php # Template PDF
public/
├── js/terceros/
│ └── departamentos-municipios.json # Datos geográficos
└── css/terceros/
└── departamentos-municipios.css # Estilos específicos
database/migrations/
└── create_terceros_table.php # Migración de BD
Tecnologías Utilizadas:
- Backend: Laravel 10+
- Frontend: Blade Templates, Bootstrap 4/5
- JavaScript: jQuery, SweetAlert2
- Reportes: Laravel Excel, DomPDF
- Base de Datos: MySQL
🗄️ Base de Datos
Tabla: terceros
| Campo | Tipo | Descripción | Restricciones |
|---|---|---|---|
id |
BIGINT | Clave primaria | AUTO_INCREMENT |
user_id |
BIGINT | ID del usuario propietario | FK, NOT NULL |
nombre |
VARCHAR(255) | Nombre o razón social | NOT NULL |
num_iden |
VARCHAR(20) | Número de documento | NOT NULL |
tipo_iden |
ENUM | Tipo de documento | NOT NULL |
correo |
VARCHAR(255) | Correo electrónico | NOT NULL, UNIQUE |
num_contact |
VARCHAR(20) | Número de contacto | NOT NULL |
direccion |
VARCHAR(255) | Dirección | NOT NULL |
ciudad |
VARCHAR(100) | Municipio/Ciudad | NOT NULL |
departamento |
VARCHAR(100) | Departamento | NOT NULL |
tipo_persona |
ENUM | natural/juridica | NOT NULL |
categoria |
ENUM | cliente/proveedor/empleado/otro | NOT NULL |
created_at |
TIMESTAMP | Fecha de creación | |
updated_at |
TIMESTAMP | Fecha de actualización |
Tipos de Documento Soportados:
- NIT
- Cédula de ciudadanía
- Carnet diplomático
- Cédula extranjera
- Permiso por protección temporal
- Permiso especial de permanencia
- Pasaporte
- Salvoconducto
- Tarjeta de identidad
Relaciones:
- BelongsTo:
User(user_id)
🎛️ Controladores
TercerosController
Métodos Principales:
index()
- Función: Lista todos los terceros del usuario autenticado
- Retorna: Vista con terceros y datos de departamentos
- Datos cargados:
- Terceros ordenados por nombre
- JSON de departamentos y municipios
store(Request $request)
- Función: Crea un nuevo tercero
- Validaciones: Campos requeridos y formatos
- Verificaciones: Duplicados por nombre y documento
- Soporte: AJAX y formulario tradicional
update(Request $request, Tercero $tercero)
- Función: Actualiza un tercero existente
- Validaciones: Campos requeridos y formatos
- Verificaciones: Duplicados excluyendo el actual
- Manejo de errores: Try-catch para operaciones BD
destroy(Tercero $tercero)
- Función: Elimina un tercero
- Autorización: Solo el propietario puede eliminar
getTerceros()
- Función: API para obtener terceros via AJAX
- Formato: JSON con lista de terceros
- Uso: Actualización dinámica de selectores
generarReporte(Request $request)
- Función: Genera reportes en PDF o Excel
- Filtros: Por categorías de terceros
- Formatos: PDF (DomPDF) y Excel (Laravel Excel)
🖼️ Vistas y Componentes
Vista Principal: terceros.blade.php
- Ubicación:
resources/views/cliente/terceros.blade.php - Función: Página principal del módulo
- Componentes:
- Tabla de terceros
- Botones de acción (crear, editar, eliminar)
- Filtros y búsqueda
- Generación de reportes
Modal Crear: modal-terceros.blade.php
- Ubicación:
resources/views/components/modal-terceros.blade.php - Función: Formulario para crear nuevos terceros
- Características:
- Validación en tiempo real
- Sistema de departamentos/municipios dinámico
- Envío por AJAX
- Integración con SweetAlert2
Modal Editar: modal-editar-terceros.blade.php
- Ubicación:
resources/views/components/modal-editar-terceros.blade.php - Función: Formulario para editar terceros existentes
- Características:
- Pre-carga de datos existentes
- Sistema de departamentos/municipios con valores seleccionados
- Validación de duplicados
- Manejo de errores
🗺️ Sistema de Departamentos y Municipios
Arquitectura
El sistema utiliza un archivo JSON con la estructura geográfica completa de Colombia.
Archivo de Datos: departamentos-municipios.json
{
"departamentos": [
{
"codigo": "05",
"nombre": "Antioquia",
"municipios": [
{
"codigo": "05001",
"nombre": "Medellín"
}
]
}
]
}
Funcionalidades:
En Modal Crear:
- Carga inicial: Departamentos vacíos
- Selección: Al elegir departamento, se cargan municipios correspondientes
- Filtrado dinámico: Solo municipios del departamento seleccionado
En Modal Editar:
- Pre-selección: Departamento y municipio actuales seleccionados
- Filtrado inicial: Solo municipios del departamento actual
- Cambio dinámico: Al cambiar departamento, se actualizan municipios
JavaScript Integrado:
Función Principal:
function actualizarMunicipios(terceroId, departamentoSeleccionado) {
// Obtiene el select de ciudades
// Limpia opciones existentes
// Busca departamento en datos
// Agrega municipios correspondientes
}
Configuración de Eventos:
// Para cada tercero, configura evento onChange
deptSelect.addEventListener('change', function() {
actualizarMunicipios(terceroId, this.value);
});
⚙️ Funcionalidades Principales
1. Gestión de Terceros
- Crear: Modal con formulario completo y validaciones
- Listar: Tabla paginada con filtros y búsqueda
- Editar: Modal pre-cargado con datos existentes
- Eliminar: Confirmación con SweetAlert2
2. Categorización
- Tipos: Cliente, Proveedor, Empleado, Otro
- Filtrado: Por categoría en listado y reportes
- Identificación visual: Badges por categoría
3. Validaciones
- Campos requeridos: Todos los campos obligatorios
- Formatos: Email, números de contacto
- Duplicados: Por nombre y número de documento
- Geográficas: Departamento y municipio válidos
4. Integración Geográfica
- Datos completos: Todos los departamentos y municipios de Colombia
- Actualización dinámica: Municipios según departamento
- Validación: Solo combinaciones válidas
5. Reportes
- Formatos: PDF y Excel
- Filtros: Por categorías específicas o todas
- Personalización: Datos del usuario y fecha
- Descarga directa: Sin almacenamiento en servidor
✅ Validaciones y Reglas de Negocio
Validaciones de Servidor (Laravel)
Campos Requeridos:
$request->validate([
'nombre' => 'required|string|max:255',
'num_iden' => 'required|string|max:20',
'tipo_iden' => 'required|in:NIT,Cédula de ciudadania,...',
'correo' => 'required|email',
'num_contact' => 'required|string|max:20',
'direccion' => 'required|string|max:255',
'ciudad' => 'required|string|max:100',
'departamento' => 'required|string|max:100',
'tipo_persona' => 'required|in:natural,juridica',
'categoria' => 'required|in:cliente,proveedor,empleado,otro',
]);
Reglas de Negocio:
1. Unicidad de Terceros
- Por nombre: No puede haber dos terceros con el mismo nombre
- Por documento: No puede haber dos terceros con mismo número y tipo de documento
- Excepción en edición: Se excluye el tercero actual de la validación
2. Seguridad
- Propietario: Solo el usuario propietario puede ver/editar sus terceros
- Aislamiento: Los terceros de un usuario no son visibles para otros
3. Integridad Geográfica
- Departamento válido: Debe existir en el archivo JSON
- Municipio válido: Debe pertenecer al departamento seleccionado
🔄 Manejo de AJAX
Creación de Terceros
Flujo AJAX:
- Envío: Formulario se envía via AJAX
- Validación: Servidor valida y verifica duplicados
- Respuesta exitosa:
- Actualización: Se actualiza la interfaz sin recargar
Manejo de Errores:
Obtención de Terceros
Endpoint: /terceros/get-terceros
// Respuesta
{
"success": true,
"count": 25,
"terceros": [
{
"id": 1,
"nombre": "Juan Pérez",
"categoria": "cliente",
"num_iden": "12345678"
}
]
}
Integración con Otros Módulos:
- Ingresos: Actualización automática de selectores
- Event dispatch: Notificación de terceros creados
- Cache: Gestión inteligente de datos
📊 Reportes
Tipos de Reportes:
1. Reporte PDF
- Librería: DomPDF
- Template:
resources/views/pdf/terceros-pdf.blade.php - Características:
- Header con información del usuario
- Tabla completa de terceros
- Filtros aplicados
- Fecha de generación
2. Reporte Excel
- Librería: Laravel Excel (Maatwebsite)
- Clase:
App\Exports\TercerosExport - Características:
- Múltiples hojas por categoría
- Formato profesional
- Fórmulas y totales
Generación de Reportes:
Filtros Disponibles:
- Todas las categorías: Incluye todos los terceros
- Por categoría específica: Cliente, Proveedor, Empleado, Otro
- Múltiples categorías: Combinación de categorías
Proceso:
- Selección: Usuario elige formato y filtros
- Validación: Se verifican parámetros
- Generación: Se crea el archivo
- Descarga: Descarga automática sin almacenamiento
📖 Guía de Uso
Para Usuarios Finales:
Crear un Nuevo Tercero:
- Hacer clic en "Agregar Tercero"
- Llenar todos los campos requeridos
- Seleccionar departamento (se cargan municipios automáticamente)
- Seleccionar municipio
- Hacer clic en "Guardar"
Editar un Tercero:
- Hacer clic en el ícono de editar (✏️) en la tabla
- Modificar los campos necesarios
- Cambiar departamento/municipio si es necesario
- Hacer clic en "Guardar Cambios"
Eliminar un Tercero:
- Hacer clic en el ícono de eliminar (🗑️)
- Confirmar la eliminación en el diálogo
Generar Reportes:
- Hacer clic en "Generar Reporte"
- Seleccionar formato (PDF o Excel)
- Seleccionar categorías a incluir
- Hacer clic en "Generar"
- El archivo se descarga automáticamente
Para Desarrolladores:
Agregar Nueva Validación:
Modificar Template de Reporte:
Extender Funcionalidad JavaScript:
🔧 Troubleshooting
Problemas Comunes:
1. No se cargan los municipios
Síntomas: Al seleccionar departamento, el select de municipios queda vacío
Posibles causas: - Archivo JSON corrupto o no encontrado - JavaScript no está cargando - Errores en consola del navegador
Soluciones:
# Verificar existencia del archivo JSON
ls public/js/terceros/departamentos-municipios.json
# Verificar permisos
chmod 644 public/js/terceros/departamentos-municipios.json
# Limpiar cache
php artisan cache:clear
2. Error de duplicados falsos
Síntomas: Sistema reporta duplicado cuando no existe
Causa: Espacios en blanco o diferencias de mayúsculas
Solución:
// Usar trim() y strtolower() en comparaciones
if (strtolower(trim($tercero->nombre)) === strtolower(trim($request->nombre)))
3. Modal no se abre
Síntomas: Al hacer clic en editar, el modal no aparece
Posibles causas: - JavaScript de Bootstrap no cargado - Conflictos de ID en elementos - Errores en consola
Soluciones:
// Verificar que Bootstrap esté cargado
console.log(typeof $.fn.modal); // Debe retornar 'function'
// Forzar apertura del modal
$('#editarTerceroModal-' + id).modal('show');
4. Reportes no se generan
Síntomas: Error al generar PDF o Excel
Posibles causas: - Librerías no instaladas - Permisos de escritura - Memoria insuficiente
Soluciones:
# Reinstalar dependencias
composer require barryvdh/laravel-dompdf
composer require maatwebsite/excel
# Verificar configuración de memoria
ini_set('memory_limit', '256M');
Logs y Debugging:
Habilitar Logs de Terceros:
Verificar Estado del Sistema:
# Ver logs de Laravel
tail -f storage/logs/laravel.log
# Verificar configuración
php artisan config:show
# Limpiar y optimizar
php artisan optimize:clear
📚 Referencias y Recursos
Documentación Técnica:
Estructura de Datos Geográficos:
- Fuente: DANE (Departamento Administrativo Nacional de Estadística)
- Formato: JSON estándar
- Actualización: Según cambios oficiales del DANE
Convenciones de Código:
- PSR-12: Estándar de codificación PHP
- Laravel Conventions: Nomenclatura de modelos, controladores y vistas
- JavaScript: Estilo ES6+ con compatibilidad jQuery
🔄 Historial de Versiones
Versión 1.0.0 (Actual)
- ✅ CRUD completo de terceros
- ✅ Sistema de departamentos y municipios
- ✅ Validación de duplicados
- ✅ Reportes PDF y Excel
- ✅ Interfaz AJAX
- ✅ Integración con otros módulos
Futuras Mejoras:
- 🔄 Importación masiva desde Excel
- 🔄 API REST para integración externa
- 🔄 Histórico de cambios
- 🔄 Filtros avanzados
- 🔄 Dashboard de estadísticas
📝 Última actualización: Diciembre 2024
👨💻 Desarrollado por: Equipo LyP Consultores Empresariales
📧 Soporte: soporte@lypconsultores.com