webrek/arco

Framework-agnostic ARCO data-subject requests and a consent ledger for Mexico's LFPDPPP, with an optional Laravel bridge (Eloquent, facades, migrations).

Maintainers

Package info

github.com/webrek/arco

pkg:composer/webrek/arco

Statistics

Installs: 0

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

v1.0.0 2026-06-29 20:25 UTC

This package is auto-updated.

Last update: 2026-06-29 20:57:19 UTC


README

Última versión Tests PHP Licencia

Lleva el control de las solicitudes de derechos ARCO con su plazo legal y una bitácora de consentimiento de solo-agregado — las dos cosas que la LFPDPPP de México te pide poder demostrar: que respondiste las solicitudes a tiempo y que puedes probar cuándo y para qué te dieron consentimiento.

Un núcleo independiente de framework (depende solo de PHP y de nesbot/carbon) con un puente opcional para Laravel — almacenamiento con Eloquent, facades, migraciones y un comando — que se conecta solo cuando trabajas en Laravel.

use Webrek\Arco\Laravel\Facades\{Arco, Consent};
use Webrek\Arco\ArcoRight;

$solicitud = Arco::receive(ArcoRight::Acceso, $user);   // registrada con su plazo de 20 días hábiles
Arco::complete($solicitud, 'Información entregada.');

Consent::grant($user, 'marketing', ['privacy_version' => 'v3', 'ip' => request()->ip()]);
Consent::granted($user, 'marketing');   // true

Este paquete te da los registros y los plazos que el cumplimiento exige. No vuelve "conforme" a una organización por sí solo — eso requiere un aviso de privacidad, procedimientos internos y un responsable.

Instalación

composer require webrek/arco

En Laravel

El service provider se descubre automáticamente. Publica y corre las migraciones:

php artisan vendor:publish --tag=arco-migrations
php artisan migrate
php artisan vendor:publish --tag=arco-config   # opcional: plazo, días festivos, tablas

En cualquier otro lado

No hay dependencia de framework. Construye los servicios con tu propio almacenamiento implementando dos interfaces — Webrek\Arco\Contracts\ArcoRequestRepository y Webrek\Arco\Contracts\ConsentRepository:

use Webrek\Arco\{ArcoService, ConsentService, ArcoRight, Subject};

$arco = new ArcoService($tuRepositorioDeSolicitudes, responseBusinessDays: 20);
$solicitud = $arco->receive(ArcoRight::Acceso, Subject::email('titular@example.com'));

$consent = new ConsentService($tuRepositorioDeConsentimiento);
$consent->grant(Subject::email('titular@example.com'), 'marketing');

El titular es un value object SubjectSubject::model($tipo, $id), Subject::email($correo) o Subject::anonymous() — para que nada del núcleo conozca tu ORM.

Solicitudes ARCO

Los cuatro derechos son un enum: ArcoRight::Acceso, Rectificacion, Cancelacion, Oposicion. Cada solicitud recibe un dueAt20 días hábiles desde su recepción (LFPDPPP art. 32), saltando fines de semana y los días festivos que configures.

$solicitud->markInProgress();           // (entidad) o Arco::markInProgress($solicitud) (persistiendo)
Arco::complete($solicitud, 'Hecho.');   // o Arco::reject($solicitud, 'No localizado.')

$solicitud->isOverdue($ahora);
Arco::pending();   // solicitudes abiertas, plazo más próximo primero
Arco::overdue();   // las que ya están vencidas
php artisan arco:pending            # la cola de solicitudes abiertas
php artisan arco:pending --overdue  # solo las vencidas

Los eventos ArcoRequestReceived y ArcoRequestResolved se disparan en cada paso.

Días festivos

El plazo salta los fines de semana automáticamente. Los días de descanso obligatorio en México cambian de fecha cada año, así que lista las fechas concretas que observes en la configuración:

'response_business_days' => 20,
'holidays' => ['2026-01-01', '2026-02-02', '2026-03-16', '2026-05-01'],

Bitácora de consentimiento

El consentimiento se registra como una serie de eventos de solo-agregado — un otorgamiento y una revocación posterior son dos renglones, nunca una actualización — para que el historial completo quede como evidencia. El último evento de un par (titular, finalidad) es el estado actual.

Consent::grant($user, 'marketing', [
    'privacy_version' => 'v3',
    'source' => 'formulario-registro',
    'ip' => request()->ip(),
    'user_agent' => request()->userAgent(),
]);

Consent::granted($user, 'marketing');   // true
Consent::revoke($user, 'marketing');
Consent::history($user, 'marketing');   // todos los eventos, del más reciente al más antiguo

Un titular puede ser cualquier modelo de Eloquent o un correo, así que puedes registrar el consentimiento antes de que la persona tenga cuenta.

El trait HasDataRights (Laravel)

use Webrek\Arco\Laravel\Concerns\HasDataRights;

class User extends Authenticatable
{
    use HasDataRights;
}
$user->grantConsent('marketing', ['privacy_version' => 'v3']);
$user->hasConsentedTo('marketing');
$user->arcoRequests;     // sus solicitudes ARCO
$user->consentRecords;   // sus eventos de consentimiento

Pruebas

composer test

La suite del núcleo (tests/Unit) corre sin framework, contra repositorios en memoria; la suite de Laravel (tests/Feature) ejercita el puente de Eloquent.

Contribuir

Consulta CONTRIBUTING.md. Corre make check antes de abrir un pull request.

Seguridad

Reporta vulnerabilidades a través del formulario de avisos de seguridad, no como issues públicos. Consulta SECURITY.md.

Licencia

Licencia MIT (MIT). Consulta LICENSE.