arco
LaravelFramework-agnostic ARCO data-subject requests and a consent ledger for Mexico's LFPDPPP, with an optional Laravel bridge (Eloquent, facades, migrations).
composer require webrek/arcoArco
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 Subject — Subject::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 dueAt — 20 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.