CA mensuel
Répartition par catégorie
Comparaison CA — toutes les années
→
Date Client Pack Prix Km Total Lieu Statut Paiement
Année principale
Année de référence
Période
→
CA mensuel comparé
Nb locations comparé
Mois CA principal Nb loc. CA référence Nb loc. Δ € Δ % Évolution
Gérants
CA mensuel (locations terminées)
Ajouter un membre
Membres actuels
À lire en premier
L'outil de création de devis (index.html) a été long et difficile à mettre au point — ne pas le casser. Toute refonte doit conserver ce fonctionnement exact ou faire une migration propre. Le dashboard (dashboard.html) communique avec index.html via postMessage car Safari file:// isole le localStorage par fichier.
1 — Calendrier partagé (abonnement iCal)
Objectif : Quand une location est confirmée, elle apparaît automatiquement dans le Calendrier Apple de Rémi.

Comment : Apple Calendrier supporte l'abonnement à une URL .ics — il suffit d'une route GET /calendar.ics?token=xxx qui génère un iCalendar RFC 5545 avec un VEVENT par location à venir (DTSTART, DTEND, SUMMARY = client + pack, LOCATION = lieu, DESCRIPTION = prix + statut + contact). Rafraîchissement automatique toutes les heures.
2 — Formulaire de réservation public → dashboard
Flux :
1. Client remplit le formulaire (nom, email, tel, date, lieu, pack envisagé)
2. La demande apparaît en haut de la page Locations sous forme de notification "Demande à traiter"
3. Rémi clique Accepter → onglet Devis s'ouvre avec tous les champs pré-remplis
4. Rémi ajuste si besoin → génère le PDF → location auto-ajoutée à la liste
5. Rémi clique Refuser → archivé comme "Refusé"

Note technique : Le pré-remplissage est déjà codé dans index.html via prefillDevisFromLocation(loc) qui écoute postMessage({type:'ls64_open_devis', location:{...}}). Il suffit d'appeler ça depuis le dashboard.
3 — Modifier une location depuis le tableau
Déjà partiellement implémenté : Les locations à venir ont un bouton bleu qui ouvre l'onglet Devis et pré-remplit le formulaire via openInDevis(locId).

À compléter : recalculer le forfait km selon le lieu lors du pré-remplissage. Après modification, si le num_devis reste le même, la ligne se met à jour automatiquement (déduplication par num_devis déjà en place).
4 — Envoi automatique du reçu par mail (Remise matériel)
Contexte : Lors de la remise du matériel au client, l'employé coche la liste + le client signe sur l'écran → un reçu (PDF) + la charte de location doivent être envoyés automatiquement à l'adresse email du client.

Problème : L'app tourne en pur HTML/JS côté client — impossible d'envoyer un mail sans serveur.

Solution recommandée : EmailJS
→ Service gratuit jusqu'à 200 mails/mois
→ S'intègre en JS pur : emailjs.send(serviceId, templateId, params)
→ Supporte les pièces jointes base64 (pour envoyer le PDF)
→ Clé publique à placer dans l'app : emailjs.init("YOUR_PUBLIC_KEY")

À configurer sur emailjs.com :
1. Créer un compte (email : remi.renard64@gmail.com)
2. Connecter le service email (Gmail)
3. Créer un template "recu_location" avec les variables : {{to_email}} {{prenom}} {{pack}} {{date}} {{caution}}
4. Récupérer : Service ID + Template ID + Public Key → les injecter dans l'app

En attendant : L'app utilise un lien mailto: qui ouvre Mail avec le corps pré-rempli — l'utilisateur doit appuyer sur Envoyer manuellement. Remplacer par EmailJS dès que la clé est dispo.
5 — Architecture recommandée
Navigation : Locations (principale) → Nouveau devis → Demandes (réservations) → Répartition

Stack suggérée : Next.js + Prisma + SQLite (simple à héberger) ou FastAPI + SQLite. Auth : login email/mdp pour protéger le dashboard.

Champs d'une location : id, date, year, month, client, prenom, email, tel, pack, pack_id, categorie, prix_pack, deplacement, total, caution, lieu, statut (en_attente/a_venir/termine/refuse), paiement (non_paye/acompte_verse/solde_paye), num_devis, client_type

Clés localStorage actuelles à migrer en DB : ls64_dyn_locations, ls64_hist_overrides, ls64_settings, ls64_custom_packs

Forfait kilométrique — constantes
Sert de point de départ pour calculer les km et le temps de trajet.
Pré-rempli comme adresse réelle par défaut sur une nouvelle location.
Devis — numéro & validité
N° du prochain devis
Laisser vide pour générer automatiquement.
Textes personnalisables

Personnalisez les textes générés : documents PDF, email, calendrier et contact. Les variables entre {{accolades}} seront remplacées automatiquement.

Charte de location — Devis (page 2)

Texte affiché sur la deuxième page du devis PDF. Lignes commençant par A. B. etc. → titre de section en gras.

Charte de location — Reçu (page 2)

Texte affiché sur la deuxième page du reçu PDF.

Template email

Variables disponibles : {{prenom}} {{nom}} {{date}} {{pack}} {{prix}} {{caution}} {{lieu}} {{tel}} {{email_client}} {{num_devis}} {{adresse_cic}}

Template email — validation après acompte

Variables : {{prenom}} {{date}} {{heure}} {{lieu}} {{pack}} {{caution}} {{acompte}} {{reste}} {{num_devis}}

Template calendrier (.ICS)

Variables : {{prenom}} {{nom}} {{pack}} {{prix}} {{caution}} {{lieu}} {{tel}} {{email_client}} {{num_devis}}

Template contact (.VCF)

Variables : {{prenom}} {{nom}} {{date}} {{pack}} {{email_client}} {{tel}}

En construction

Cette section est réservée à Nils pour configurer les paramètres techniques du site.

Notifications

Quand une location déclenche l'alerte en haut de l'écran et met l'onglet Préparation en surbrillance.

Devis & paiement
S'applique aux deux rendez-vous — mise à disposition et restitution — au-delà du retard toléré. Reprise telle quelle dans les conditions générales. Laissée à 0, la clause chiffrée n'est pas imprimée.
Calendrier d'équipe

Abonne ton calendrier à cette adresse : il se met à jour tout seul à partir des locations, en lecture seule.

Sur iPhone : Réglages ▸ Applications ▸ Calendrier ▸ Comptes ▸ Ajouter un compte ▸ Autre ▸ Ajouter un abonnement.

Synchronisation
—
Forfait kilométrique

Le lieu de référence (départ) et le lieu de prise/dépose par défaut se règlent dans Paramètres devis.

Vedettes du formulaire location

Les choix mis en avant dans une location. L'ordre d'affichage = l'ordre ci-dessous (glisser pour réordonner).

Sacs

Un sac contient du matériel réel du catalogue et s'attribue aux packs — affiché à l'étape Préparation.

Enregistrement automatique à chaque modification.