feat(landing): pages légales + CTAs trial 30 jours
All checks were successful
Build & Deploy Landing / build-and-deploy (push) Successful in 19s
All checks were successful
Build & Deploy Landing / build-and-deploy (push) Successful in 19s
- CGV B2B SaaS (16 sections, conforme avec Stripe en place) - Mentions légales allégées au strict minimum LCEN - Politique de confidentialité resserrée : - retrait des détails infra (Proxmox, K3s, etc.) - sous-traitants par catégorie (Stripe / Resend / Mistral AI) - section sécurité standardisée - cookies simplifiés - Période d'essai harmonisée à 30 jours partout (landing + CGV) - Insistance sur l'hébergement et les données en France
This commit is contained in:
parent
f59b11f836
commit
5127cd2c9e
@ -1193,6 +1193,97 @@ CronJob K3s qui run `node ace migration:run --force` avant chaque rollout. Alter
|
||||
|
||||
---
|
||||
|
||||
## 17-bis. Observability — Sentry (ADR-024)
|
||||
|
||||
Error monitoring API via `@sentry/node`. Init au plus tôt dans
|
||||
`bin/server.ts` AVANT le boot Ignitor pour capturer même les erreurs
|
||||
de bootstrap.
|
||||
|
||||
### Configuration
|
||||
|
||||
```ts
|
||||
// apps/api/start/sentry.ts
|
||||
// No-op si SENTRY_DSN_API absent → dev local sans bruit Sentry par défaut
|
||||
```
|
||||
|
||||
| Aspect | Valeur | Rationale |
|
||||
|---|---|---|
|
||||
| Sample rate traces | 10 % prod, 100 % dev | Quota free tier (5K events/mois) |
|
||||
| Sample rate profiles | 100 % | Sampled par traces de toute façon |
|
||||
| `release` | `APP_VERSION` runtime (sha git) | Set par `kubectl set env` post-deploy |
|
||||
| User context | `user.id` UUID seulement | Pas d'email/nom (PII minimisée) |
|
||||
| `beforeSend` | drop 4xx | Validation, auth invalide = bruit |
|
||||
|
||||
### Capture automatique
|
||||
|
||||
Le `report()` du `HttpExceptionHandler` (`apps/api/app/exceptions/handler.ts`)
|
||||
capture **uniquement les 5xx** (status >= 500 ou status absent). Tout le
|
||||
reste — `E_INVALID_CREDENTIALS`, `E_VALIDATION_ERROR`, custom 4xx —
|
||||
n'arrive **jamais** dans Sentry.
|
||||
|
||||
```ts
|
||||
// handler.ts:report (extrait)
|
||||
const isServerError = !status || status >= 500
|
||||
if (isServerError) {
|
||||
Sentry.captureException(error, {
|
||||
tags: {
|
||||
// PATTERN de route (/api/v1/checkin/:token/paid), pas l'URL réelle
|
||||
// → les codes OAuth, tokens checkin, etc. ne fuitent JAMAIS dans
|
||||
// les tags Sentry indexés.
|
||||
url: ctx.route?.pattern ?? ctx.request.url(false),
|
||||
method: ctx.request.method(),
|
||||
status: status?.toString() ?? '500',
|
||||
},
|
||||
user: ctx.auth?.user
|
||||
? { id: String(ctx.auth.user.id) }
|
||||
: undefined,
|
||||
})
|
||||
}
|
||||
```
|
||||
|
||||
### Capturer manuellement (cas métier)
|
||||
|
||||
Dans un service ou job où une exception métier doit être tracée :
|
||||
|
||||
```ts
|
||||
import * as Sentry from '@sentry/node'
|
||||
|
||||
try {
|
||||
await mistralOcr.extract(buffer)
|
||||
} catch (err) {
|
||||
Sentry.captureException(err, {
|
||||
tags: { feature: 'ocr', provider: 'mistral' },
|
||||
extra: { batchId, fileSize: buffer.length },
|
||||
})
|
||||
throw err // re-throw pour que le contrôleur fasse son job de réponse
|
||||
}
|
||||
```
|
||||
|
||||
### Tester l'intégration en prod (E2E)
|
||||
|
||||
Endpoint debug `/api/v1/_debug/sentry-test` (gardé par
|
||||
`NODE_ENV !== 'production'` OU `DEBUG_SENTRY_TEST=true`). Pour activer
|
||||
temporairement sur la prod et lancer un test :
|
||||
|
||||
```bash
|
||||
KUBECTL="kubectl --kubeconfig ~/dev/perso/proxmox/k3s/kubeconfig.yaml -n rubis"
|
||||
|
||||
$KUBECTL set env deploy/rubis-api DEBUG_SENTRY_TEST=true
|
||||
$KUBECTL rollout status deploy/rubis-api --timeout=120s
|
||||
|
||||
curl -i https://app.rubis.pro/api/v1/_debug/sentry-test
|
||||
# 500 attendu — vérifier Sentry sous 30s
|
||||
|
||||
$KUBECTL set env deploy/rubis-api DEBUG_SENTRY_TEST-
|
||||
```
|
||||
|
||||
### Variables d'env requises
|
||||
|
||||
- **K3s secret `rubis-app-secrets`** : `SENTRY_DSN_API` (DSN privé du projet rubis-api)
|
||||
- **K3s ConfigMap (set par CI)** : `APP_VERSION` = sha git pour le tag release
|
||||
|
||||
---
|
||||
|
||||
## 18. Pointeurs vers l'existant
|
||||
|
||||
Avant de coder un endpoint, **toujours consulter** :
|
||||
|
||||
@ -738,6 +738,93 @@ Quand tu reconstruis l'app, **rien ne se réinvente sans consulter** :
|
||||
|
||||
---
|
||||
|
||||
## 12-bis. Observability — Sentry (ADR-024)
|
||||
|
||||
Error monitoring + replay sur le SPA via `@sentry/react`. Init au plus tôt
|
||||
dans `main.tsx` AVANT tout autre import non-essentiel pour capturer les
|
||||
erreurs de bootstrap.
|
||||
|
||||
### Configuration
|
||||
|
||||
```ts
|
||||
// apps/web/src/lib/sentry.ts — init basé sur VITE_SENTRY_DSN_WEB
|
||||
// (no-op si DSN absent → dev local sans bruit Sentry par défaut)
|
||||
```
|
||||
|
||||
| Aspect | Valeur | Rationale |
|
||||
|---|---|---|
|
||||
| Sample rate traces | 10 % prod, 100 % dev | Quota free tier (5K events/mois) |
|
||||
| Sample rate replay session | **0 %** | Pas de replay sans erreur — économie quota |
|
||||
| Sample rate replay sur erreur | 100 % | Capture les 30 s précédant le crash |
|
||||
| `maskAllText` / `blockAllMedia` | true | Privacy par défaut, on relâche après |
|
||||
| `release` | sha git court (CI build-arg) | Une régression ↔ un commit |
|
||||
| User context | `user.id` UUID seulement | Pas d'email/nom (PII minimisée) |
|
||||
|
||||
### Triggers automatiques (déjà câblés)
|
||||
|
||||
- **Erreurs runtime** : `window.onerror` + `unhandledrejection` interceptés par le SDK.
|
||||
- **`Sentry.ErrorBoundary`** dans `main.tsx` autour de l'app → capture les erreurs React + affiche `<FallbackError />`.
|
||||
- **User context** : `authStore.setSession` appelle `Sentry.setUser({ id })`, `authStore.clear` reset.
|
||||
|
||||
### Capturer manuellement une erreur métier
|
||||
|
||||
Dans un component / handler :
|
||||
|
||||
```ts
|
||||
import * as Sentry from "@sentry/react"
|
||||
|
||||
try {
|
||||
await doSomethingRisky()
|
||||
} catch (err) {
|
||||
Sentry.captureException(err, {
|
||||
tags: { feature: "ocr-import" },
|
||||
extra: { batchId },
|
||||
})
|
||||
toast.error("Quelque chose a coincé.")
|
||||
}
|
||||
```
|
||||
|
||||
### Tester l'intégration en prod
|
||||
|
||||
⚠️ Les `throw` tapés dans la console DevTools **ne hittent PAS** `window.onerror`
|
||||
(ils restent dans le scope d'eval du devtools). Pour un test valide :
|
||||
|
||||
```js
|
||||
// Dans la console DevTools
|
||||
setTimeout(() => { throw new Error("sentry test") }, 0)
|
||||
// OU
|
||||
Promise.reject(new Error("sentry test"))
|
||||
```
|
||||
|
||||
Les deux méthodes traversent la vraie boucle d'événements de la page →
|
||||
Sentry intercepte. Vérifier ensuite Sentry Dashboard → projet `rubis-web`.
|
||||
|
||||
Pour vérifier que le SDK est bien init :
|
||||
```js
|
||||
typeof __SENTRY__ // doit être "object" (sinon DSN absent au build)
|
||||
```
|
||||
|
||||
### Source maps
|
||||
|
||||
`@sentry/vite-plugin` est actif au build CI (gardé par `SENTRY_AUTH_TOKEN`).
|
||||
Il :
|
||||
1. Upload les `.map` à Sentry (désobfuscation des stack traces)
|
||||
2. **Supprime les `.map` du `dist/` final** (`filesToDeleteAfterUpload`)
|
||||
|
||||
→ nginx en prod ne sert pas les sourcemaps publiquement. Sécurité critique.
|
||||
|
||||
### Variables CI (secrets Gitea Actions)
|
||||
|
||||
Cf. `.gitea/workflows/deploy-web.yml`. Les 4 secrets requis :
|
||||
|
||||
- `SENTRY_DSN_WEB` — DSN public projet rubis-web (bake-able dans le bundle)
|
||||
- `SENTRY_AUTH_TOKEN` — scope `project:releases` + `project:write` (upload sourcemaps)
|
||||
- `SENTRY_ORG` — slug org Sentry
|
||||
|
||||
Le build est tolérant : si `SENTRY_AUTH_TOKEN` manque, le plugin Vite est skip et les sourcemaps ne sont pas uploadées (Sentry capture quand même mais stack traces minifiées).
|
||||
|
||||
---
|
||||
|
||||
## 13. Points d'attention
|
||||
|
||||
- **Auth Bearer en mémoire** : si l'utilisateur reload, l'access token est perdu — toujours appeler `/auth/refresh` au boot avant le render initial (cf. section 7)
|
||||
|
||||
406
landing/cgv.html
Normal file
406
landing/cgv.html
Normal file
@ -0,0 +1,406 @@
|
||||
<!doctype html>
|
||||
<html lang="fr">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<meta name="theme-color" content="#9F1239" />
|
||||
<meta
|
||||
name="description"
|
||||
content="Conditions Générales de Vente du service Rubis sur l'ongle (SaaS de relance de factures impayées)."
|
||||
/>
|
||||
<meta name="robots" content="index,follow" />
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
||||
<link rel="apple-touch-icon" href="/apple-touch-icon.png" />
|
||||
<link rel="manifest" href="/site.webmanifest" />
|
||||
<link rel="stylesheet" href="/_legal-shell.css" />
|
||||
<title>Conditions Générales de Vente · Rubis sur l'ongle</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<header class="legal-header">
|
||||
<div class="container">
|
||||
<a href="/" class="brand">
|
||||
<svg class="gem-svg" viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg">
|
||||
<polygon points="100,10 190,100 100,190 10,100" fill="#9F1239" />
|
||||
<line x1="10" y1="100" x2="190" y2="100" stroke="rgba(255,255,255,0.55)" stroke-width="3" />
|
||||
<line x1="55" y1="55" x2="100" y2="100" stroke="rgba(255,255,255,0.4)" stroke-width="2" />
|
||||
<line x1="145" y1="55" x2="100" y2="100" stroke="rgba(255,255,255,0.4)" stroke-width="2" />
|
||||
</svg>
|
||||
<span>Rubis<span class="brand-suffix">sur l'ongle</span></span>
|
||||
</a>
|
||||
<a href="/" class="back-link">← Retour à l'accueil</a>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main class="legal-main">
|
||||
<div class="container">
|
||||
<p class="eyebrow">Conditions contractuelles</p>
|
||||
<h1>Conditions Générales <em>de Vente</em></h1>
|
||||
<p class="lede">
|
||||
Ces conditions encadrent l'utilisation du service Rubis sur l'ongle entre l'éditeur
|
||||
(Arthur Barré, entrepreneur individuel) et l'utilisateur professionnel (TPE, PME,
|
||||
freelance, ou personne morale française) qui souscrit à un plan payant ou utilise
|
||||
la version gratuite.
|
||||
</p>
|
||||
<p class="last-updated">Dernière mise à jour : 7 mai 2026</p>
|
||||
|
||||
<div class="toc" aria-label="Sommaire">
|
||||
<p class="toc-title">Sommaire</p>
|
||||
<ol>
|
||||
<li><a href="#definitions">Définitions</a></li>
|
||||
<li><a href="#objet">Objet</a></li>
|
||||
<li><a href="#acceptation">Acceptation des CGV</a></li>
|
||||
<li><a href="#compte">Création du compte</a></li>
|
||||
<li><a href="#service">Description du service</a></li>
|
||||
<li><a href="#tarifs">Tarifs, essai et facturation</a></li>
|
||||
<li><a href="#duree">Durée et résiliation</a></li>
|
||||
<li><a href="#disponibilite">Disponibilité du service</a></li>
|
||||
<li><a href="#obligations">Obligations de l'utilisateur</a></li>
|
||||
<li><a href="#propriete">Propriété intellectuelle</a></li>
|
||||
<li><a href="#donnees">Données personnelles</a></li>
|
||||
<li><a href="#responsabilite">Responsabilité</a></li>
|
||||
<li><a href="#force-majeure">Force majeure</a></li>
|
||||
<li><a href="#modifications">Modification des CGV</a></li>
|
||||
<li><a href="#cession">Cession</a></li>
|
||||
<li><a href="#droit">Droit applicable et juridiction</a></li>
|
||||
</ol>
|
||||
</div>
|
||||
|
||||
<h2 id="definitions">1. Définitions</h2>
|
||||
<ul>
|
||||
<li><strong>Éditeur</strong> : Arthur Barré, entrepreneur individuel, responsable
|
||||
de la publication et de l'édition du service Rubis sur l'ongle (cf.
|
||||
<a href="/mentions-legales.html">mentions légales</a>).</li>
|
||||
<li><strong>Utilisateur</strong> : toute personne physique ou morale exerçant à
|
||||
titre professionnel qui crée un compte et utilise le service.</li>
|
||||
<li><strong>Service</strong> : la plateforme SaaS « Rubis sur l'ongle » accessible
|
||||
depuis <a href="https://app.rubis.pro">app.rubis.pro</a>, permettant d'automatiser
|
||||
la relance de factures impayées.</li>
|
||||
<li><strong>Compte</strong> : espace utilisateur protégé par un identifiant et un
|
||||
mot de passe permettant d'accéder au service.</li>
|
||||
<li><strong>Plan</strong> : formule d'abonnement choisie par l'utilisateur (Free,
|
||||
Pro ou Business) déterminant le périmètre des fonctionnalités et le tarif.</li>
|
||||
<li><strong>Client final</strong> : tiers à qui l'utilisateur facture des
|
||||
prestations et à qui les emails de relance sont adressés.</li>
|
||||
</ul>
|
||||
|
||||
<h2 id="objet">2. Objet</h2>
|
||||
<p>
|
||||
Les présentes conditions ont pour objet de définir les modalités contractuelles
|
||||
applicables à l'utilisation du service Rubis sur l'ongle, qui permet à l'utilisateur
|
||||
de :
|
||||
</p>
|
||||
<ul>
|
||||
<li>Importer des factures (PDF, image, ou saisie manuelle) ;</li>
|
||||
<li>Configurer des plans de relance avec emails programmés ;</li>
|
||||
<li>Envoyer automatiquement ces relances à ses clients finaux selon la cadence
|
||||
choisie ;</li>
|
||||
<li>Suivre le statut des factures, valider les paiements, gérer les mises en demeure.</li>
|
||||
</ul>
|
||||
|
||||
<h2 id="acceptation">3. Acceptation des CGV</h2>
|
||||
<p>
|
||||
L'inscription au service et la création d'un compte impliquent l'acceptation pleine
|
||||
et entière des présentes CGV par l'utilisateur, ainsi que de la
|
||||
<a href="/confidentialite.html">politique de confidentialité</a>.
|
||||
</p>
|
||||
<p>
|
||||
L'utilisateur déclare agir dans le cadre d'une activité professionnelle. Le service
|
||||
n'est <strong>pas destiné aux consommateurs</strong> au sens du Code de la
|
||||
consommation.
|
||||
</p>
|
||||
|
||||
<h2 id="compte">4. Création du compte</h2>
|
||||
<p>
|
||||
L'inscription nécessite la fourniture d'une adresse email valide et d'un mot de
|
||||
passe (ou d'une connexion via un fournisseur d'identité tiers — Google, Microsoft).
|
||||
L'utilisateur s'engage à fournir des informations exactes et à les tenir à jour.
|
||||
</p>
|
||||
<p>
|
||||
L'utilisateur est seul responsable de la confidentialité de ses identifiants et de
|
||||
toutes les actions effectuées depuis son compte. En cas de soupçon de compromission,
|
||||
il doit immédiatement réinitialiser son mot de passe et nous prévenir à
|
||||
<a href="mailto:contact@rubis.pro">contact@rubis.pro</a>.
|
||||
</p>
|
||||
|
||||
<h2 id="service">5. Description du service</h2>
|
||||
<p>
|
||||
Le service comprend, selon le plan souscrit, les fonctionnalités suivantes :
|
||||
</p>
|
||||
<table class="def-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Plan</th>
|
||||
<th>Périmètre principal</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><strong>Free</strong></td>
|
||||
<td>
|
||||
Jusqu'à 5 factures actives en relance simultanément. Plans de relance
|
||||
standards. OCR limité. Un seul utilisateur.
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>Pro</strong></td>
|
||||
<td>
|
||||
Factures et OCR illimités, plans personnalisables, statistiques détaillées,
|
||||
relances signées au nom de l'utilisateur (sous-domaine Rubis), support
|
||||
prioritaire. Un seul utilisateur.
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>Business</strong></td>
|
||||
<td>
|
||||
Tout du Pro, plus jusqu'à 5 collaborateurs, envoi des relances depuis le
|
||||
domaine propre de l'utilisateur (configuration DKIM/SPF), onboarding personnel.
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p>
|
||||
La liste détaillée et à jour des fonctionnalités est disponible sur la page
|
||||
<a href="/#pricing">tarifs</a> du site.
|
||||
</p>
|
||||
|
||||
<h2 id="tarifs">6. Tarifs, essai et facturation</h2>
|
||||
|
||||
<h3>6.1 Tarifs</h3>
|
||||
<p>
|
||||
Les tarifs en vigueur sont indiqués sur la page tarifs du site, en euros et hors
|
||||
taxes. La TVA, lorsque applicable, est ajoutée selon le taux en vigueur (20 % en
|
||||
France métropolitaine).
|
||||
</p>
|
||||
|
||||
<h3>6.2 Période d'essai gratuite</h3>
|
||||
<p>
|
||||
Tout nouvel utilisateur bénéficie d'une période d'essai de <strong>30 jours</strong>
|
||||
permettant l'accès au plan Pro sans engagement et sans carte bancaire requise.
|
||||
À l'issue de cette période, l'utilisateur peut souscrire à un plan payant ou
|
||||
poursuivre gratuitement avec le plan Free (5 factures actives).
|
||||
</p>
|
||||
|
||||
<h3>6.3 Modalités de paiement</h3>
|
||||
<p>
|
||||
Le paiement des plans payants s'effectue en ligne via notre prestataire de
|
||||
paiement <strong>Stripe</strong>, par carte bancaire ou prélèvement SEPA. Aucune
|
||||
donnée bancaire n'est stockée sur les serveurs de l'éditeur.
|
||||
</p>
|
||||
<p>
|
||||
Le règlement est effectué d'avance, par mensualités successives, à la date
|
||||
anniversaire de la souscription.
|
||||
</p>
|
||||
|
||||
<h3>6.4 Facturation</h3>
|
||||
<p>
|
||||
Une facture est émise automatiquement à chaque échéance et mise à disposition dans
|
||||
l'espace utilisateur (rubrique « Paramètres › Facturation »). Elle est également
|
||||
envoyée par email à l'adresse de contact renseignée.
|
||||
</p>
|
||||
|
||||
<h3>6.5 Défaut de paiement</h3>
|
||||
<p>
|
||||
En cas de défaut de paiement (rejet bancaire, expiration de la carte, etc.), une
|
||||
relance automatique est envoyée à l'utilisateur. À défaut de régularisation sous 14
|
||||
jours, l'éditeur se réserve le droit de suspendre l'accès aux fonctionnalités
|
||||
payantes du compte. Les données de l'utilisateur restent conservées pendant cette
|
||||
période, et l'accès est rétabli dès la régularisation.
|
||||
</p>
|
||||
|
||||
<h3>6.6 Évolution tarifaire</h3>
|
||||
<p>
|
||||
L'éditeur se réserve le droit de modifier ses tarifs. Toute évolution est notifiée
|
||||
par email à l'utilisateur au moins <strong>30 jours</strong> avant son entrée en
|
||||
vigueur. L'utilisateur peut alors résilier son abonnement avant l'application du
|
||||
nouveau tarif sans pénalité.
|
||||
</p>
|
||||
|
||||
<h2 id="duree">7. Durée et résiliation</h2>
|
||||
|
||||
<h3>7.1 Durée</h3>
|
||||
<p>
|
||||
L'abonnement est conclu pour une durée d'un mois et se renouvelle tacitement à
|
||||
chaque échéance, sauf résiliation par l'une des parties.
|
||||
</p>
|
||||
|
||||
<h3>7.2 Résiliation par l'utilisateur</h3>
|
||||
<p>
|
||||
L'utilisateur peut résilier son abonnement à tout moment, en un clic, depuis son
|
||||
espace personnel (« Paramètres › Facturation › Annuler l'abonnement »). La
|
||||
résiliation prend effet à la fin de la période en cours (déjà payée). Aucun
|
||||
remboursement prorata temporis n'est dû.
|
||||
</p>
|
||||
<p>
|
||||
La suppression complète du compte (et de toutes les données associées) peut être
|
||||
demandée par email à <a href="mailto:contact@rubis.pro">contact@rubis.pro</a> ou
|
||||
via le bouton dédié dans les paramètres. Voir la
|
||||
<a href="/confidentialite.html">politique de confidentialité</a> pour les durées
|
||||
de conservation post-suppression.
|
||||
</p>
|
||||
|
||||
<h3>7.3 Résiliation par l'éditeur</h3>
|
||||
<p>
|
||||
L'éditeur peut résilier le compte de l'utilisateur, sans préavis ni indemnité,
|
||||
dans les cas suivants :
|
||||
</p>
|
||||
<ul>
|
||||
<li>Défaut de paiement persistant (au-delà de 30 jours) ;</li>
|
||||
<li>Violation manifeste des présentes CGV ou de la législation en vigueur ;</li>
|
||||
<li>Utilisation du service à des fins illicites, frauduleuses, de harcèlement ou
|
||||
de spam ;</li>
|
||||
<li>Atteinte à la sécurité ou à l'intégrité du service.</li>
|
||||
</ul>
|
||||
|
||||
<h2 id="disponibilite">8. Disponibilité du service</h2>
|
||||
<p>
|
||||
L'éditeur met en œuvre les moyens raisonnables pour assurer la disponibilité du
|
||||
service 24h/24 et 7j/7. Aucun engagement de disponibilité chiffré (SLA) n'est
|
||||
contractuellement garanti dans cette version. Des interruptions peuvent survenir
|
||||
pour des opérations de maintenance, des mises à jour, ou des causes indépendantes
|
||||
de la volonté de l'éditeur.
|
||||
</p>
|
||||
<p>
|
||||
Les opérations de maintenance planifiée sont annoncées à l'avance par email ou
|
||||
notification dans l'application lorsque possible.
|
||||
</p>
|
||||
|
||||
<h2 id="obligations">9. Obligations de l'utilisateur</h2>
|
||||
<p>L'utilisateur s'engage à :</p>
|
||||
<ul>
|
||||
<li>Utiliser le service conformément à sa destination, à la législation française
|
||||
et aux usages commerciaux loyaux ;</li>
|
||||
<li>Respecter le cadre légal applicable aux relances de factures, notamment la
|
||||
<strong>loi LME</strong> sur les délais de paiement et les règles de procédure
|
||||
civile concernant la mise en demeure ;</li>
|
||||
<li>S'assurer du caractère professionnel et licite de ses relations commerciales
|
||||
avec ses clients finaux ;</li>
|
||||
<li>Ne pas utiliser le service pour adresser des communications non sollicitées
|
||||
(spam) à des destinataires sans relation commerciale préexistante ;</li>
|
||||
<li>Disposer du droit d'utilisation des données client (email, nom, etc.) qu'il
|
||||
renseigne dans le service ;</li>
|
||||
<li>Ne pas tenter de contourner les limitations techniques du service ou
|
||||
d'extraire massivement des données via des moyens automatisés non documentés.</li>
|
||||
</ul>
|
||||
<p>
|
||||
La <strong>mise en demeure</strong> est traitée par le service comme une étape de
|
||||
plan particulière nécessitant une <strong>validation manuelle</strong> de
|
||||
l'utilisateur avant envoi. L'éditeur ne saurait être tenu responsable du contenu
|
||||
ou de la qualification juridique de cette mise en demeure.
|
||||
</p>
|
||||
|
||||
<h2 id="propriete">10. Propriété intellectuelle</h2>
|
||||
<p>
|
||||
La marque « Rubis sur l'ongle », le logo (◆), les textes, le code source, les
|
||||
chartes graphiques et l'ensemble des éléments composant le service sont la propriété
|
||||
exclusive de l'éditeur ou de ses partenaires.
|
||||
</p>
|
||||
<p>
|
||||
L'utilisateur conserve l'intégralité de la propriété sur les <strong>données qu'il
|
||||
importe ou crée</strong> dans le service (factures, plans de relance, templates
|
||||
d'emails personnalisés, données clients). L'éditeur ne dispose que d'un droit
|
||||
d'usage strictement limité à la fourniture du service.
|
||||
</p>
|
||||
|
||||
<h2 id="donnees">11. Données personnelles</h2>
|
||||
<p>
|
||||
Le traitement des données personnelles par l'éditeur est régi par notre
|
||||
<a href="/confidentialite.html">politique de confidentialité</a>, qui fait partie
|
||||
intégrante des présentes CGV.
|
||||
</p>
|
||||
<p>
|
||||
Pour les données des <strong>clients finaux</strong> de l'utilisateur (emails,
|
||||
noms, etc.), l'éditeur agit en tant que <strong>sous-traitant</strong> au sens de
|
||||
l'article 28 du RGPD. Un avenant DPA (Data Processing Agreement) peut être fourni
|
||||
sur demande à <a href="mailto:contact@rubis.pro">contact@rubis.pro</a>.
|
||||
</p>
|
||||
|
||||
<h2 id="responsabilite">12. Responsabilité</h2>
|
||||
<p>
|
||||
L'éditeur fournit un outil d'assistance à l'envoi de relances automatisées.
|
||||
L'<strong>utilisateur reste seul responsable</strong> :
|
||||
</p>
|
||||
<ul>
|
||||
<li>Du contenu des emails envoyés à ses clients ;</li>
|
||||
<li>De la légalité et de la qualité de la relation commerciale qui motive la
|
||||
relance ;</li>
|
||||
<li>De la qualification juridique éventuelle d'une mise en demeure ;</li>
|
||||
<li>De l'exactitude des données saisies dans le service.</li>
|
||||
</ul>
|
||||
<p>
|
||||
La responsabilité de l'éditeur est strictement limitée aux dommages directs et
|
||||
prévisibles, liés à un défaut prouvé du service. Les dommages indirects
|
||||
(notamment : perte de données, perte de chiffre d'affaires, perte de clientèle,
|
||||
atteinte à l'image) sont exclus dans toute la mesure permise par la loi.
|
||||
</p>
|
||||
<p>
|
||||
En tout état de cause, et conformément aux usages commerciaux entre professionnels,
|
||||
la responsabilité totale de l'éditeur est plafonnée au montant des sommes
|
||||
effectivement versées par l'utilisateur au titre des 12 mois précédant le fait
|
||||
générateur de la responsabilité.
|
||||
</p>
|
||||
|
||||
<h2 id="force-majeure">13. Force majeure</h2>
|
||||
<p>
|
||||
L'éditeur ne saurait être tenu responsable d'un manquement à ses obligations en
|
||||
cas de survenance d'un événement de force majeure au sens de l'article 1218 du
|
||||
Code civil (catastrophe naturelle, attaque informatique majeure, panne réseau
|
||||
d'envergure, décision gouvernementale, etc.).
|
||||
</p>
|
||||
|
||||
<h2 id="modifications">14. Modification des CGV</h2>
|
||||
<p>
|
||||
L'éditeur peut modifier les présentes CGV pour refléter des évolutions du service,
|
||||
de la législation ou des conditions commerciales. Toute modification substantielle
|
||||
est notifiée à l'utilisateur par email au moins <strong>30 jours</strong> avant
|
||||
son entrée en vigueur.
|
||||
</p>
|
||||
<p>
|
||||
La poursuite de l'utilisation du service au-delà de cette période vaut acceptation
|
||||
des nouvelles CGV. À défaut, l'utilisateur peut résilier son abonnement sans
|
||||
pénalité avant l'entrée en vigueur des nouvelles conditions.
|
||||
</p>
|
||||
|
||||
<h2 id="cession">15. Cession</h2>
|
||||
<p>
|
||||
L'éditeur peut librement céder les présentes CGV ainsi que les contrats en cours
|
||||
dans le cadre d'une opération de restructuration, de fusion ou de cession
|
||||
d'activité. L'utilisateur en sera informé par email.
|
||||
</p>
|
||||
|
||||
<h2 id="droit">16. Droit applicable et juridiction</h2>
|
||||
<p>
|
||||
Les présentes CGV sont régies par le droit français. Tout litige relatif à leur
|
||||
formation, exécution ou interprétation, qui n'aurait pu être réglé à l'amiable,
|
||||
relèvera de la compétence exclusive des tribunaux français du siège de l'éditeur,
|
||||
y compris en cas de pluralité de défendeurs ou d'appel en garantie, et nonobstant
|
||||
toute clause contraire éventuelle.
|
||||
</p>
|
||||
<p>
|
||||
Avant toute action contentieuse, les parties s'engagent à rechercher une solution
|
||||
amiable, par échange écrit à <a href="mailto:contact@rubis.pro">contact@rubis.pro</a>,
|
||||
dans un délai raisonnable.
|
||||
</p>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<footer class="legal-footer">
|
||||
<div class="container">
|
||||
<a href="/" class="brand">
|
||||
<svg class="gem-svg" viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg">
|
||||
<polygon points="100,10 190,100 100,190 10,100" fill="#9F1239" />
|
||||
</svg>
|
||||
Rubis sur l'ongle
|
||||
</a>
|
||||
<nav>
|
||||
<a href="/">Accueil</a>
|
||||
<a href="https://app.rubis.pro">Lancer Rubis</a>
|
||||
<a href="/mentions-legales.html">Mentions légales</a>
|
||||
<a href="/cgv.html">CGV</a>
|
||||
<a href="/confidentialite.html">Confidentialité</a>
|
||||
</nav>
|
||||
<div>© 2026 · Made in France 🇫🇷</div>
|
||||
</div>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
@ -78,7 +78,7 @@
|
||||
<h3>2.1 Données d'inscription et de compte</h3>
|
||||
<ul>
|
||||
<li><strong>Email</strong> (identifiant de connexion + canal de notification check-in)</li>
|
||||
<li><strong>Mot de passe</strong> (stocké hashé via Argon2 — nous ne pouvons pas le lire)</li>
|
||||
<li><strong>Mot de passe</strong> (stocké de manière chiffrée et irréversible)</li>
|
||||
<li><strong>Nom complet</strong> (signature des relances)</li>
|
||||
<li><strong>Nom de l'organisation et SIRET</strong> (optionnel, pour les mises en demeure formelles)</li>
|
||||
</ul>
|
||||
@ -98,9 +98,9 @@
|
||||
|
||||
<h3>2.3 Données techniques et journaux</h3>
|
||||
<ul>
|
||||
<li>Logs serveur (adresse IP, user agent, date/heure de connexion) — conservés 30 jours pour la sécurité</li>
|
||||
<li>Cookies de session (refresh token httpOnly) — durée de vie 30 jours</li>
|
||||
<li>Identifiants Stripe Customer/Subscription (en cas d'abonnement payant)</li>
|
||||
<li>Journaux de connexion (adresse IP, date) — conservés à des fins de sécurité</li>
|
||||
<li>Cookie de session pour maintenir la connexion</li>
|
||||
<li>Identifiants techniques de notre prestataire de paiement (en cas d'abonnement payant)</li>
|
||||
</ul>
|
||||
|
||||
<h2 id="finalites">3. Finalités et bases légales</h2>
|
||||
@ -141,9 +141,9 @@
|
||||
|
||||
<h2 id="sous-traitants">4. Sous-traitants et hébergement</h2>
|
||||
<p>
|
||||
Tout l'hébergement principal (base de données, fichiers PDF, application) reste sur
|
||||
notre infrastructure auto-hébergée en France. Quelques services tiers spécialisés
|
||||
interviennent uniquement pour des fonctions ciblées :
|
||||
L'application, la base de données et les fichiers utilisateurs sont hébergés
|
||||
<strong>en France</strong>. Trois sous-traitants spécialisés interviennent pour des
|
||||
fonctions ciblées :
|
||||
</p>
|
||||
<table class="def-table">
|
||||
<thead>
|
||||
@ -155,32 +155,21 @@
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><strong>Stripe</strong></td>
|
||||
<td>
|
||||
Traitement des paiements et abonnements. Données : email, nom, CB (jamais
|
||||
stockée chez nous, gérée par Stripe). Stripe est certifié PCI-DSS niveau 1.
|
||||
Hébergement principal : Irlande (UE).
|
||||
</td>
|
||||
<td>Traitement des paiements. Hébergement : Union européenne.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>Resend</strong></td>
|
||||
<td>
|
||||
Envoi des emails transactionnels (relances et confirmations). Données :
|
||||
adresses email, contenu des emails. Hébergement : UE/US avec
|
||||
clauses contractuelles types.
|
||||
</td>
|
||||
<td>Envoi des emails transactionnels et de relance. Hébergement : Union européenne (clauses contractuelles types pour les éventuels traitements hors UE).</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>Mistral AI</strong></td>
|
||||
<td>
|
||||
OCR sur les factures uploadées. Les fichiers sont envoyés à Mistral pour
|
||||
extraction du texte puis supprimés de leur côté. Hébergement : France.
|
||||
</td>
|
||||
<td>Reconnaissance du texte sur les factures importées. Hébergement : France.</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p>
|
||||
Aucun transfert hors UE n'a lieu sans encadrement contractuel approprié (clauses
|
||||
contractuelles types de la Commission européenne).
|
||||
Aucun transfert de données hors Union européenne n'a lieu sans encadrement
|
||||
contractuel approprié.
|
||||
</p>
|
||||
|
||||
<h2 id="duree">5. Durée de conservation</h2>
|
||||
@ -233,44 +222,19 @@
|
||||
au fonctionnement du service. Aucun cookie publicitaire ni de mesure d'audience
|
||||
tierce n'est déposé.
|
||||
</p>
|
||||
<table class="def-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Cookie</th>
|
||||
<th>Rôle & durée</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>rubis_refresh</code></td>
|
||||
<td>Cookie httpOnly maintenant la session connectée. Durée : 30 jours.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>localStorage <code>access_token</code></td>
|
||||
<td>
|
||||
Token JWT de courte durée (30 min) pour authentifier les appels API. Pas un
|
||||
cookie au sens technique mais un stockage local du navigateur.
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>localStorage <code>rubis.sidebar.collapsed</code></td>
|
||||
<td>Préférence d'affichage (sidebar repliée ou non). Aucun tracking.</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p>
|
||||
Un cookie de session permet de maintenir la connexion à votre compte. Aucun
|
||||
consentement préalable n'est requis pour ces cookies fonctionnels (article 82 de
|
||||
la loi Informatique et Libertés).
|
||||
</p>
|
||||
|
||||
<h2 id="securite">8. Sécurité</h2>
|
||||
<p>
|
||||
Nous appliquons les mesures de sécurité usuelles pour un service SaaS :
|
||||
Nous mettons en œuvre les mesures techniques et organisationnelles appropriées
|
||||
pour préserver la confidentialité, l'intégrité et la disponibilité de vos données :
|
||||
chiffrement des échanges, contrôle des accès, sauvegardes régulières et journalisation
|
||||
des opérations sensibles.
|
||||
</p>
|
||||
<ul>
|
||||
<li>Chiffrement des connexions TLS 1.2+ (Let's Encrypt)</li>
|
||||
<li>Mots de passe hashés via Argon2id (pas de stockage en clair)</li>
|
||||
<li>Tokens d'API rotatés (access tokens 30 min, refresh tokens 30 jours)</li>
|
||||
<li>Restrictions d'accès aux clés Stripe par IP allowlist</li>
|
||||
<li>Sauvegardes chiffrées de la base de données</li>
|
||||
<li>Logs d'accès conservés et audités en cas d'incident</li>
|
||||
</ul>
|
||||
|
||||
<h2 id="reclamation">9. Réclamation auprès de la CNIL</h2>
|
||||
<p>
|
||||
|
||||
@ -1954,7 +1954,7 @@
|
||||
<div class="trust">
|
||||
<span><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
||||
<polyline points="20 6 9 17 4 12" />
|
||||
</svg> 3 mois gratuits puis Free 5 factures</span>
|
||||
</svg> 30 jours gratuits puis Free 5 factures</span>
|
||||
<span class="dot"></span>
|
||||
<span>Hébergement souverain</span>
|
||||
<span class="dot"></span>
|
||||
@ -2511,7 +2511,7 @@
|
||||
<section class="final-cta" id="lancer">
|
||||
<div class="container">
|
||||
<h2>Récupérez vos premières heures dès aujourd'hui.</h2>
|
||||
<p>3 mois gratuits illimités, puis le plan Free continue avec 5 factures actives. Pas de carte demandée pour démarrer.</p>
|
||||
<p>30 jours gratuits, puis le plan Free continue avec 5 factures actives. Pas de carte demandée pour démarrer.</p>
|
||||
<div class="cta-row" style="justify-content: center; margin-top: 24px;">
|
||||
<a href="https://app.rubis.pro" class="btn btn-primary">
|
||||
Lancer Rubis →
|
||||
|
||||
@ -69,15 +69,11 @@
|
||||
|
||||
<h2 id="hebergeur">2. Hébergement</h2>
|
||||
<p>
|
||||
Le site et l'application sont hébergés sur une infrastructure auto-hébergée en France
|
||||
(serveurs Proxmox + cluster Kubernetes K3s) administrée directement par l'éditeur.
|
||||
Toutes les données utilisateurs (factures, emails) sont stockées sur ce même
|
||||
environnement, sans externalisation à un cloud tiers grand public.
|
||||
<strong>Hébergeur</strong> : [À COMPLÉTER : nom de l'hébergeur]<br />
|
||||
<strong>Adresse</strong> : [À COMPLÉTER : adresse postale de l'hébergeur].
|
||||
</p>
|
||||
<p>
|
||||
Les données techniques (paiements, emails sortants, OCR) transitent par les
|
||||
sous-traitants listés dans la
|
||||
<a href="/confidentialite.html">politique de confidentialité</a>.
|
||||
L'ensemble de l'infrastructure et des données utilisateurs est situé en France.
|
||||
</p>
|
||||
|
||||
<h2 id="publication">3. Directeur de la publication</h2>
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user