PHPackages                             micrositios/pqrdeadline - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. micrositios/pqrdeadline

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

micrositios/pqrdeadline
=======================

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

1.1.0(8mo ago)06MITPHPPHP &gt;=8.1

Since Sep 4Pushed 8mo agoCompare

[ Source](https://github.com/micros/pqrdeadline)[ Packagist](https://packagist.org/packages/micrositios/pqrdeadline)[ RSS](/packages/micrositios-pqrdeadline/feed)WikiDiscussions master Synced 1mo ago

READMEChangelogDependencies (3)Versions (3)Used By (0)

PQR Deadline Calculator
=======================

[](#pqr-deadline-calculator)

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

Características
---------------

[](#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
-----------

[](#instalación)

```
composer require micrositios/pqrdeadline
```

Requisitos
----------

[](#requisitos)

- PHP &gt;= 8.1
- nesbot/carbon ^3.0
- cmixin/business-day ^1.16

Uso Básico
----------

[](#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
----------------------

[](#estrategias-de-cálculo)

### 1. Días Hábiles (BusinessDaysDeadlineCalculator)

[](#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)

[](#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)

[](#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
-----------------------

[](#tipos-de-pqr-soportados)

TipoStringPlazoEstrategiaDías HábilesInforme Congresistas`informe_congresistas`5 díasCalendarioNoPetición General`peticion_general`15 díasHábilesSíPetición Autoridades`peticion_autoridades`10 díasHábilesSíConsulta`consulta`30 díasHábilesSíInformación Pública`informacion_publica`10 díasHábilesSíCopia Historia Clínica`copia_historia_clinica`3 díasHábilesSíReclamo`reclamo`15 díasHábilesSíQueja`queja`15 díasHábilesSíSalud Riesgo Simple`salud_riesgo_simple`72 horasHorasNoSalud Riesgo Priorizado`salud_riesgo_priorizado`48 horasHorasNoSalud Riesgo Vital`salud_riesgo_vital`24 horasHorasNoDenuncia`denuncia`15 díasHábilesSíSugerencia`sugerencia`15 díasHábilesSíFelicitación`felicitacion`15 díasHábilesSíTests
-----

[](#tests)

Para ejecutar los tests y ver la documentación completa de pruebas, consulta [tests/README.md](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
---------------

[](#ejemplos-de-uso)

### Forma Automática: Usando String

[](#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

[](#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

[](#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

[](#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

[](#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

[](#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
------------

[](#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
----------

[](#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

[](#estándares-de-código)

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

Licencia
--------

[](#licencia)

MIT License. Ver archivo [LICENSE](LICENSE) para más detalles.

Changelog
---------

[](#changelog)

### v1.1.0 (2025-09-04) 📅

[](#v110-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) 🎉

[](#v100-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

[](#v021)

- 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

[](#v020)

- 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

[](#v010)

- 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**: &gt;= 8.1

###  Health Score

31

—

LowBetter than 68% of packages

Maintenance61

Regular maintenance activity

Popularity4

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity45

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~0 days

Total

2

Last Release

247d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/10ec8f9737021a6f0ab3b97a2b2e7e05dbf6e237dec0f8b98aa9e987e1881e89?d=identicon)[micros](/maintainers/micros)

---

Top Contributors

[![micros](https://avatars.githubusercontent.com/u/60292?v=4)](https://github.com/micros "micros (13 commits)")

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/micrositios-pqrdeadline/health.svg)

```
[![Health](https://phpackages.com/badges/micrositios-pqrdeadline/health.svg)](https://phpackages.com/packages/micrositios-pqrdeadline)
```

###  Alternatives

[ashallendesign/short-url

A Laravel package for creating shortened URLs for your web apps.

1.4k1.9M4](/packages/ashallendesign-short-url)[solspace/craft-freeform

The most flexible and user-friendly form building plugin!

52664.9k12](/packages/solspace-craft-freeform)[whitecube/laravel-timezones

Store UTC dates in the database and work with custom timezones in the application.

106106.2k](/packages/whitecube-laravel-timezones)[intervention/zodiac

Zodiac Sign Calculator

58191.7k](/packages/intervention-zodiac)[erlandmuchasaj/laravel-gzip

Gzip your responses.

40129.3k2](/packages/erlandmuchasaj-laravel-gzip)[solspace/craft-calendar

The most powerful event management and calendaring plugin!

1830.8k1](/packages/solspace-craft-calendar)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
