- migration_20260925_rgpd_requests.sql: tabela rgpd_requests (email, tipo, estado, consentimento). - config/functions_rgpd.php: rgpd_find() (acesso, art.º 15) e rgpd_erase() (apagamento por anonimização, art.º 17) sobre membership_leads/trial_leads/ event_leads, + CRUD dos pedidos. - Política de Privacidade: formulário público (POST + CSRF + anti-spam) para pedir acesso ou apagamento, e o processo escrito (resposta em 30 dias). - Backoffice: página "Pedidos RGPD" (nav + index) para exportar os dados de um email (CSV, audit) ou anonimizá-los (POST + CSRF, audit). O email está desligado, por isso os pedidos ficam guardados (como as leads), não dependem de SMTP. Texto legal com placeholders — rever com jurista antes do go-live (como já constava na Política). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
21 lines
1.1 KiB
SQL
21 lines
1.1 KiB
SQL
-- RGPD (art.º 15.º/17.º): pedidos de acesso e de apagamento de dados pessoais.
|
|
-- O visitante submete um pedido na Política de Privacidade; fica aqui (o email
|
|
-- está desligado, por isso o pedido é guardado, como as leads). O backoffice
|
|
-- processa: acesso = exportar os dados; apagamento = anonimizar.
|
|
CREATE TABLE IF NOT EXISTS `rgpd_requests` (
|
|
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
|
`gym_id` INT NOT NULL DEFAULT 0,
|
|
`email` VARCHAR(190) NOT NULL,
|
|
`request_type` ENUM('acesso','apagamento') NOT NULL,
|
|
`message` TEXT NULL,
|
|
`status` ENUM('novo','concluido') NOT NULL DEFAULT 'novo',
|
|
`consent` TINYINT(1) NOT NULL DEFAULT 0,
|
|
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
`processed_at` DATETIME NULL DEFAULT NULL,
|
|
`processed_by` INT UNSIGNED NULL DEFAULT NULL,
|
|
`deleted_at` DATETIME NULL DEFAULT NULL,
|
|
`deleted_by` INT UNSIGNED NULL DEFAULT NULL,
|
|
PRIMARY KEY (`id`),
|
|
KEY `idx_rgpd_requests_status` (`status`, `created_at`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|