<?php

declare(strict_types=1);

require_once dirname(__DIR__) . '/config.php';
require_once dirname(__DIR__) . '/lib/ChronooUi.php';

$brand = defined('SMARTCAL_BRAND_NAME') && SMARTCAL_BRAND_NAME !== '' ? SMARTCAL_BRAND_NAME : 'Chronoo';
// Contact public (pas SMARTCAL_FROM_EMAIL / noreply)
$contactEmail = 'ask@chronoo.ch';
$retentionDays = defined('SMARTCAL_BOOKING_RETENTION_DAYS') ? (int) SMARTCAL_BOOKING_RETENTION_DAYS : 365;
$manageTtlDays = defined('SMARTCAL_MANAGE_TOKEN_TTL_DAYS') ? (int) SMARTCAL_MANAGE_TOKEN_TTL_DAYS : 30;
$retentionEnabled = $retentionDays > 0;
$updated = '31 août 2026';

ChronooUi::legalLayoutStart('Politique de confidentialité');
?>
<article class="legal-doc">
  <p class="legal-kicker">Document provisoire — à valider juridiquement</p>
  <h1>Politique de confidentialité</h1>
  <p class="legal-meta">Dernière mise à jour : <?= htmlspecialchars($updated, ENT_QUOTES, 'UTF-8') ?></p>

  <p>
    La présente politique décrit comment <strong><?= htmlspecialchars($brand, ENT_QUOTES, 'UTF-8') ?></strong>
    (« <?= htmlspecialchars($brand, ENT_QUOTES, 'UTF-8') ?> », « nous ») traite les données personnelles
    dans le cadre de son service SaaS de prise de rendez-vous en ligne et de gestion d’agendas connectés,
    conformément à la loi fédérale suisse sur la protection des données (nLPD, RS 235.1).
  </p>

  <h2>1. Responsable du traitement</h2>
  <p>
    Le responsable du traitement est l’éditeur de la plateforme <?= htmlspecialchars($brand, ENT_QUOTES, 'UTF-8') ?>.
    Pour toute question relative à la protection des données :
    <a href="mailto:<?= htmlspecialchars($contactEmail, ENT_QUOTES, 'UTF-8') ?>"><?= htmlspecialchars($contactEmail, ENT_QUOTES, 'UTF-8') ?></a>.
  </p>

  <h2>2. Données traitées</h2>
  <h3>2.1 Visiteurs et prospects (prise de rendez-vous)</h3>
  <ul>
    <li>Identité et contact : prénom, nom, adresse e-mail, numéro de téléphone (optionnel), société (optionnel).</li>
    <li>Contenu de la demande : objet ou message libre, mode de rendez-vous, adresse en présentiel le cas échéant.</li>
    <li>Données de planification : créneau choisi, fuseau horaire, langue, identifiant technique de réservation.</li>
    <li>Données techniques : adresse IP (limitation anti-abus), identifiant de session analytics (si activé).</li>
  </ul>

  <h3>2.2 Comptes utilisateurs (offre self-service)</h3>
  <ul>
    <li>Identité de compte : nom affiché, adresse e-mail, mot de passe (stocké sous forme de hash).</li>
    <li>Profils et paramètres de disponibilité, libellés publics, préférences de rendez-vous.</li>
  </ul>

  <h3>2.3 Connexion d’agendas (OAuth)</h3>
  <p>
    Si vous connectez un agenda Google, Microsoft Outlook ou Infomaniak, <?= htmlspecialchars($brand, ENT_QUOTES, 'UTF-8') ?>
    reçoit et conserve des jetons d’accès OAuth chiffrés afin de lire vos disponibilités et, le cas échéant,
    d’écrire les événements de rendez-vous. Nous n’accédons qu’aux calendriers que vous autorisez explicitement.
    Les données d’agenda restent hébergées chez le fournisseur concerné ; nous n’en conservons que le strict
    nécessaire au fonctionnement du service.
  </p>

  <h2>3. Finalités et bases légales</h2>
  <ul>
    <li><strong>Exécution du service</strong> — planifier, confirmer, rappeler ou permettre la modification/annulation d’un rendez-vous (art. 6 nLPD).</li>
    <li><strong>Compte utilisateur</strong> — création et administration de votre espace, connexion des agendas (art. 6 nLPD).</li>
    <li><strong>Sécurité et anti-abus</strong> — limitation du débit, journalisation d’événements de sécurité (intérêt prépondérant, art. 31 nLPD).</li>
    <li><strong>Amélioration du produit</strong> — statistiques agrégées de parcours de réservation, si l’option analytics est activée sur l’instance (intérêt prépondérant ou consentement selon le cas).</li>
    <li><strong>Obligations légales</strong> — conservation limitée de traces techniques lorsque la loi l’exige.</li>
  </ul>

  <h2>4. Destinataires et sous-traitants</h2>
  <p>Les données peuvent être traitées par :</p>
  <ul>
    <li><strong>Hébergeur</strong> — Infomaniak Network SA (Suisse), pour l’hébergement de l’application et des journaux techniques.</li>
    <li><strong>Fournisseurs d’agenda</strong> — Google LLC, Microsoft Corporation, Infomaniak, selon les connexions que vous activez.</li>
    <li><strong>Outils de visioconférence</strong> — liens ou intégrations que vous choisissez (Google Meet, Microsoft Teams, kMeet, Zoom, etc.).</li>
    <li><strong>CRM ou messagerie</strong> — uniquement si configurés par l’administrateur de l’instance (ex. HubSpot, envoi d’e-mails transactionnels).</li>
  </ul>
  <p>
    Nous ne vendons pas vos données personnelles. Tout sous-traitant est choisi pour garantir un niveau de
    protection adéquat au regard de la nLPD.
  </p>

  <h2>5. Transferts à l’étranger</h2>
  <p>
    L’infrastructure principale est située en Suisse. La connexion d’agendas ou de visioconférence via des
    services américains ou européens peut entraîner un transfert de données hors de Suisse. Ces transferts
    reposent sur les garanties contractuelles et techniques du fournisseur concerné et sur votre choix
    d’activer ces intégrations.
  </p>

  <h2>6. Durées de conservation et anonymisation</h2>
  <p>
    Nous appliquons le principe de limitation de la conservation. Les durées ci-dessous reflètent la
    configuration technique de l’instance et peuvent être adaptées par l’administrateur.
  </p>

  <h3>6.1 Journal des réservations</h3>
  <?php if ($retentionEnabled): ?>
  <p>
    Les données identifiantes liées à une réservation passée (nom, prénom, e-mail, téléphone, société,
    objet de demande, adresse de rendez-vous, jeton de gestion) sont <strong>anonymisées automatiquement
    <?= (int) $retentionDays ?> jour<?= $retentionDays > 1 ? 's' : '' ?> après la fin du créneau réservé</strong>
    (<code>end_utc</code>), via le processus planifié <code>purge_bookings.php</code>.
  </p>
  <p>Après anonymisation, seules des métadonnées non identifiantes peuvent subsister (dates, mode de rendez-vous, statistiques internes).</p>
  <?php else: ?>
  <p>
    L’anonymisation automatique du journal des réservations est actuellement <strong>désactivée</strong>
    sur cette instance (<code>SMARTCAL_BOOKING_RETENTION_DAYS=0</code>). Les données sont conservées tant
    que nécessaire à l’exploitation du service, puis supprimées ou anonymisées manuellement.
  </p>
  <?php endif; ?>

  <h3>6.2 Lien de gestion prospect (<code>manage.php</code>)</h3>
  <?php if ($manageTtlDays > 0): ?>
  <p>
    Le jeton permettant de reporter ou annuler un rendez-vous expire
    <strong><?= (int) $manageTtlDays ?> jour<?= $manageTtlDays > 1 ? 's' : '' ?> après la fin du rendez-vous</strong>
    (<code>SMARTCAL_MANAGE_TOKEN_TTL_DAYS</code>), ou est effacé lors de l’anonymisation du journal.
  </p>
  <?php else: ?>
  <p>Le jeton de gestion prospect ne comporte pas de date d’expiration automatique sur cette instance.</p>
  <?php endif; ?>

  <h3>6.3 Compte utilisateur et OAuth</h3>
  <ul>
    <li>Données de compte : conservées tant que le compte est actif, puis supprimées dans un délai raisonnable après suppression du compte.</li>
    <li>Jetons OAuth d’agenda : révoqués à la déconnexion du calendrier ou à la fermeture du compte.</li>
    <li>Journaux techniques et analytics : durée limitée (rotation ou agrégation), généralement inférieure à 12 mois.</li>
  </ul>

  <h2>7. Sécurité</h2>
  <p>
    Nous mettons en œuvre des mesures techniques et organisationnelles appropriées : chiffrement des
    secrets et jetons OAuth, contrôle d’accès aux fichiers sensibles, protection CSRF sur la réservation,
    limitation du débit, journalisation des événements de sécurité. Aucune mesure n’offre toutefois une
    sécurité absolue.
  </p>

  <h2>8. Vos droits</h2>
  <p>Conformément à la nLPD, vous disposez notamment des droits suivants, dans les limites prévues par la loi :</p>
  <ul>
    <li>droit d’information sur le traitement ;</li>
    <li>droit d’accès ;</li>
    <li>droit de rectification ;</li>
    <li>droit de suppression ou d’anonymisation lorsque les données ne sont plus nécessaires ;</li>
    <li>droit de retirer un consentement le cas échéant ;</li>
    <li>droit d’introduire une réclamation auprès du Préposé fédéral à la protection des données et à la transparence (PFPDT).</li>
  </ul>
  <p>
    Exercez vos droits en écrivant à
    <a href="mailto:<?= htmlspecialchars($contactEmail, ENT_QUOTES, 'UTF-8') ?>"><?= htmlspecialchars($contactEmail, ENT_QUOTES, 'UTF-8') ?></a>.
    Nous pouvons vous demander de prouver votre identité.
  </p>

  <h2>9. Cookies et stockage local</h2>
  <p>
    Le parcours de réservation peut utiliser un stockage local du navigateur (langue, session analytics).
    L’espace compte repose sur un cookie de session strictement nécessaire à l’authentification.
    Aucun cookie publicitaire n’est déposé par défaut par <?= htmlspecialchars($brand, ENT_QUOTES, 'UTF-8') ?>.
  </p>

  <h2>10. Modifications</h2>
  <p>
    Nous pouvons mettre à jour la présente politique pour refléter l’évolution du service ou de la
    réglementation. La date de mise à jour figure en tête de document. En cas de changement substantiel,
    nous informerons les utilisateurs de compte par e-mail ou via l’interface lorsque cela est pertinent.
  </p>

  <h2>11. Contact</h2>
  <p>
    Questions ou demandes relatives à la protection des données :
    <a href="mailto:<?= htmlspecialchars($contactEmail, ENT_QUOTES, 'UTF-8') ?>"><?= htmlspecialchars($contactEmail, ENT_QUOTES, 'UTF-8') ?></a>.
  </p>
</article>
<?php
ChronooUi::legalLayoutEnd();
