Skip to content

📋 Documentación del Módulo de Terceros

📑 Índice

  1. Descripción General
  2. Arquitectura del Sistema
  3. Base de Datos
  4. Controladores
  5. Vistas y Componentes
  6. Sistema de Departamentos y Municipios
  7. Funcionalidades Principales
  8. Validaciones y Reglas de Negocio
  9. Manejo de AJAX
  10. Reportes
  11. Guía de Uso
  12. 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()

public function 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)

public function 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)

public function 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)

public function destroy(Tercero $tercero)
- Función: Elimina un tercero - Autorización: Solo el propietario puede eliminar

getTerceros()

public function 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)

public function 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
  • 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
  • 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:

  1. Carga inicial: Departamentos vacíos
  2. Selección: Al elegir departamento, se cargan municipios correspondientes
  3. Filtrado dinámico: Solo municipios del departamento seleccionado

En Modal Editar:

  1. Pre-selección: Departamento y municipio actuales seleccionados
  2. Filtrado inicial: Solo municipios del departamento actual
  3. 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:

  1. Envío: Formulario se envía via AJAX
  2. Validación: Servidor valida y verifica duplicados
  3. Respuesta exitosa:
    {
      "success": true,
      "message": "Tercero creado exitosamente",
      "terceros": [...] // Lista actualizada
    }
    
  4. Actualización: Se actualiza la interfaz sin recargar

Manejo de Errores:

{
  "success": false,
  "message": "Ya existe un tercero con ese nombre",
  "errors": {...}
}

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:

  1. Selección: Usuario elige formato y filtros
  2. Validación: Se verifican parámetros
  3. Generación: Se crea el archivo
  4. Descarga: Descarga automática sin almacenamiento

📖 Guía de Uso

Para Usuarios Finales:

Crear un Nuevo Tercero:

  1. Hacer clic en "Agregar Tercero"
  2. Llenar todos los campos requeridos
  3. Seleccionar departamento (se cargan municipios automáticamente)
  4. Seleccionar municipio
  5. Hacer clic en "Guardar"

Editar un Tercero:

  1. Hacer clic en el ícono de editar (✏️) en la tabla
  2. Modificar los campos necesarios
  3. Cambiar departamento/municipio si es necesario
  4. Hacer clic en "Guardar Cambios"

Eliminar un Tercero:

  1. Hacer clic en el ícono de eliminar (🗑️)
  2. Confirmar la eliminación en el diálogo

Generar Reportes:

  1. Hacer clic en "Generar Reporte"
  2. Seleccionar formato (PDF o Excel)
  3. Seleccionar categorías a incluir
  4. Hacer clic en "Generar"
  5. El archivo se descarga automáticamente

Para Desarrolladores:

Agregar Nueva Validación:

// En TercerosController
$request->validate([
    'nuevo_campo' => 'required|rule1|rule2'
]);

Modificar Template de Reporte:

// resources/views/pdf/terceros-pdf.blade.php
// Agregar nuevas columnas o estilos

Extender Funcionalidad JavaScript:

// En modal-terceros.blade.php
// Agregar nuevos eventos o validaciones

🔧 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:

// En TercerosController
\Log::info('Creando tercero', ['data' => $request->all()]);

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