micrositios/pqrdeadline

Cálculo simple de fecha de vencimiento de PQR para Colombia

1.1.0 2025-09-05 03:30 UTC

This package is auto-updated.

Last update: 2025-09-05 03:32:06 UTC


README

Biblioteca PHP para el cálculo simple de fechas de vencimiento de PQR (Peticiones, Quejas y Reclamos) para Colombia.

Características

  • Múltiples estrategias de cálculo: Días hábiles, días calendario y horas
  • Soporte para festivos colombianos: Integración con cmixin/business-day
  • Manejo de suspensiones: Cálculo dinámico con traslapes y validaciones
  • Identificadores únicos: Soporte opcional para ULID en suspensiones
  • Tipos de PQR predefinidos: 14 tipos según normativa colombiana
  • Duplicación de plazos: Soporte para segunda instancia
  • Validaciones robustas: Control de errores y casos edge
  • Documentación completa: Lógica de negocio detallada en código
  • Cobertura total: 42 tests, 59 assertions

Instalación

composer require micrositios/pqrdeadline

Requisitos

  • PHP >= 8.1
  • nesbot/carbon ^3.0
  • cmixin/business-day ^1.16

Uso Básico

use Micrositios\PqrDeadline\DeadlineWrapper;
use Carbon\Carbon;

// Crear PQR
$createdAt = Carbon::now();
$requestType = 'peticion_general';
$doubleTerm = false;

// Calcular deadline
$wrapper = DeadlineWrapper::setup($requestType, $createdAt, $doubleTerm);
$deadline = $wrapper->calculateDeadline();

echo "Vencimiento: " . $deadline->format('Y-m-d H:i:s');

Estrategias de Cálculo

1. Días Hábiles (BusinessDaysDeadlineCalculator)

  • Uso: Mayoría de PQR (peticiones, quejas, reclamos, etc.)
  • Características: Excluye fines de semana y festivos colombianos
  • Inicio: Siguiente día hábil a la radicación

2. Días Calendario (CalendarDaysDeadlineCalculator)

  • Uso: Informes de congresistas
  • Características: Incluye todos los días (laborables, fines de semana, festivos)
  • Inicio: Día siguiente a la radicación

3. Horas (HoursDeadlineCalculator)

  • Uso: Reclamos de salud de riesgo vital, priorizado y simple
  • Características: Cálculo en horas exactas, independiente de días laborables
  • Inicio: Inmediato desde la hora de radicación

Tipos de PQR Soportados

Tipo String Plazo Estrategia Días Hábiles
Informe Congresistas informe_congresistas 5 días Calendario No
Petición General peticion_general 15 días Hábiles
Petición Autoridades peticion_autoridades 10 días Hábiles
Consulta consulta 30 días Hábiles
Información Pública informacion_publica 10 días Hábiles
Copia Historia Clínica copia_historia_clinica 3 días Hábiles
Reclamo reclamo 15 días Hábiles
Queja queja 15 días Hábiles
Salud Riesgo Simple salud_riesgo_simple 72 horas Horas No
Salud Riesgo Priorizado salud_riesgo_priorizado 48 horas Horas No
Salud Riesgo Vital salud_riesgo_vital 24 horas Horas No
Denuncia denuncia 15 días Hábiles
Sugerencia sugerencia 15 días Hábiles
Felicitación felicitacion 15 días Hábiles

Tests

Para ejecutar los tests y ver la documentación completa de pruebas, consulta tests/README.md.

# Ejecutar todos los tests
vendor/bin/phpunit

# Con formato legible
vendor/bin/phpunit --testdox

Total: 42 tests, 59 assertions cubriendo las 3 estrategias de cálculo.

Ejemplos de Uso

Forma Automática: Usando String

La forma más simple de usar la librería es con el método DeadlineWrapper::setup():

use Micrositios\PqrDeadline\DeadlineWrapper;
use Carbon\Carbon;

// Petición general (15 días hábiles)
$wrapper = DeadlineWrapper::setup(
    'peticion_general',
    Carbon::create(2024, 1, 15, 10, 30),
    false // no duplicar
);

$deadline = $wrapper->calculateDeadline();
// Resultado: 2024-02-05 23:59:59

Forma Automática: Con Suspensiones

use Micrositios\PqrDeadline\DeadlineWrapper;
use Carbon\Carbon;

// Petición general con suspensiones
$wrapper = DeadlineWrapper::setup(
    'peticion_general',
    Carbon::create(2024, 1, 15, 10, 30),
    false
);

// Agregar suspensiones usando injectSuspensions
$suspensions = [
    [
        'start_at' => Carbon::create(2024, 1, 20, 8, 0),
        'end_at' => Carbon::create(2024, 1, 22, 17, 0)
    ]
];

$deadline = $wrapper->injectSuspensions($suspensions)->calculateDeadline();

Forma Manual: Parámetros Explícitos

Para casos que requieren mayor control, pasa un array de parámetros a DeadlineWrapper::setup():

use Micrositios\PqrDeadline\DeadlineWrapper;
use Carbon\Carbon;

$params = [
    'created_at' => Carbon::create(2024, 1, 15, 9, 0),
    'base_days' => 15,
    'double_term' => false,
    'strategy' => 'business_days'
];

$wrapper = DeadlineWrapper::setup($params);
$deadline = $wrapper->calculateDeadline();

Forma Manual: Con Suspensiones

use Micrositios\PqrDeadline\DeadlineWrapper;
use Carbon\Carbon;

$params = [
    'created_at' => Carbon::create(2024, 1, 15, 9, 0),
    'base_days' => 15,
    'double_term' => false,
    'strategy' => 'business_days'
];

$suspensions = [
    [
        'start_at' => Carbon::create(2024, 1, 20, 8, 0),
        'end_at' => Carbon::create(2024, 1, 22, 17, 0)
    ]
];

$wrapper = DeadlineWrapper::setup($params);
$deadline = $wrapper->injectSuspensions($suspensions)->calculateDeadline();

Forma Avanzada: Estrategias Directas

Para máximo control, usa directamente las estrategias:

use Micrositios\PqrDeadline\Strategies\BusinessDaysDeadlineCalculator;
use Carbon\Carbon;

$calculator = new BusinessDaysDeadlineCalculator();

$params = [
    'created_at' => Carbon::create(2024, 1, 15, 9, 0),
    'base_days' => 15,
    'double_term' => false,
    'approximate_end_of_day' => true
];

$deadline = $calculator->calculate($params);

Forma Avanzada: Con Suspensiones

use Micrositios\PqrDeadline\Strategies\BusinessDaysDeadlineCalculator;
use Carbon\Carbon;

$calculator = new BusinessDaysDeadlineCalculator();

$params = [
    'created_at' => Carbon::create(2024, 1, 15, 9, 0),
    'base_days' => 15,
    'double_term' => false,
    'approximate_end_of_day' => true,
    'suspensions' => [
        [
            'start_at' => Carbon::create(2024, 1, 20, 8, 0),
            'end_at' => Carbon::create(2024, 1, 22, 17, 0)
        ]
    ]
];

$deadline = $calculator->calculate($params);

Arquitectura

src/
├── Contracts/
│   └── DeadlineCalculator.php          # Interface principal
├── Enums/
│   └── RequestType.php                 # Tipos de PQR
├── Strategies/
│   ├── BusinessDaysDeadlineCalculator.php     # Días hábiles
│   ├── CalendarDaysDeadlineCalculator.php     # Días calendario
│   ├── HoursDeadlineCalculator.php            # Horas
│   ├── AppliesDynamicSuspensions.php          # Trait suspensiones
│   └── StrategyFactory.php                    # Factory estrategias
└── DeadlineWrapper.php                # Wrapper principal

Contribuir

  1. Fork el proyecto
  2. Crear branch para feature (git checkout -b feature/nueva-funcionalidad)
  3. Escribir tests para los cambios
  4. Ejecutar tests (vendor/bin/phpunit)
  5. Commit cambios (git commit -am 'Agregar nueva funcionalidad')
  6. Push al branch (git push origin feature/nueva-funcionalidad)
  7. Crear Pull Request

Estándares de Código

  • PSR-4 autoloading
  • PSR-12 coding style
  • PHPUnit para testing
  • Documentación en español
  • Cobertura de tests > 90%

Licencia

MIT License. Ver archivo LICENSE para más detalles.

Changelog

v1.1.0 (2025-09-04) 📅

  • Upgrade Carbon 3: Actualización a nesbot/carbon ^3.0 para mejor rendimiento
  • Compatibilidad mantenida: Todos los tests siguen pasando (42 tests, 59 assertions)
  • Dependencias actualizadas: Symfony Clock 7.3 y polyfills actualizados
  • API sin cambios: Misma interfaz pública, solo mejoras internas

v1.0.0 (2025-09-04) 🎉

  • Release estable oficial: Sistema completo de cálculo de deadlines para PQR
  • Documentación de lógica de negocio: Reglas específicas documentadas en todas las estrategias
  • Identificadores únicos: Soporte opcional para ULID en suspensiones
  • Cobertura completa: 42 tests, 59 assertions con 100% de éxito
  • Arquitectura madura: Tres estrategias consolidadas con manejo avanzado de traslapes
  • Reglas de negocio claras: BusinessDays (8AM-5PM, 8h=1día), CalendarDays (consecutivos), Hours (continuo)

v0.2.1

  • Reestructuración: DeadlineWrapper movido a directorio raíz
  • Eliminación de carpeta Support innecesaria
  • Namespace simplificado: Micrositios\PqrDeadline\DeadlineWrapper
  • Actualización de todas las referencias en documentación y ejemplos

v0.2.0

  • Limpieza y optimización del código base
  • Eliminación de clases no utilizadas (ErrorFactory, DomainException, validadores)
  • Simplificación de la arquitectura manteniendo funcionalidad completa
  • Actualización de documentación y ejemplos
  • 42 tests, 59 assertions con 100% de éxito

v0.1.0

  • Implementación inicial con 3 estrategias de cálculo
  • 14 tipos de PQR predefinidos
  • Soporte para festivos colombianos
  • Manejo avanzado de suspensiones
  • Suite completa de tests
  • Documentación completa

Mantenido por: Micrositios Versión: 1.1.0 PHP: >= 8.1