Commit Graph

28 Commits

Author SHA1 Message Date
Serge RAKOTO HARRY-NAIVO
84b4b7753e feat(guide): add armes à feu in Explosifs + substances illégales in Substances toxiques
Demande Serge — clarifier les articles interdits sur mva-globalfret.com/guide-envoi.html.

Changes :
- guide-envoi.html : append 'armes à feu' à cat1Desc + 'substances illégales' à cat6Desc (visible immédiat sans JS i18n).
- js/translations.js : sync les 3 langues FR/EN/MG sur cat1Desc + cat6Desc.

FR : armes à feu / substances illégales
EN : firearms / illegal substances
MG : basy / zavatra tsy ara-dalàna

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 01:02:14 +02:00
MVA Global Fret
70f8f86c7a Add Mentions Légales & Politique de Confidentialité pages
Create two new legal pages (FR/EN/MG) with LAATEL Corporation
company details (STAT, RCS, NIF). Add footer links to all pages
and translation keys for the three languages.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-06 20:05:39 +02:00
MVA Global Fret
eb5c4f1cee Email verification flow via Resend (Turnstile + click-to-confirm)
Architecture finale :

1. User remplit formulaire + passe Turnstile CAPTCHA → form-handler.js
2. form-handler.js POST au Worker avec action 'requestVerification'
3. Worker valide Turnstile, génère un token UUID, le stocke en KV (TTL 24h)
   avec firstname/email/reference_client, puis envoie un email via Resend
   avec un lien : confirmation.html?token=XXX
4. User reçoit email, clique 'Confirmer mon email'
5. confirmation.html lit le token de l'URL, POST au Worker avec action
   'verifyToken'
6. Worker valide le token, envoie le welcome email via Resend (avec ref +
   adresse Paris depuis env var), marque le token comme utilisé
7. confirmation.html affiche 'Inscription confirmée !'

Ainsi : ref + adresse Paris ne sortent JAMAIS avant validation email,
et les bots sont bloqués à l'étape 1 par Turnstile.

Setup Cloudflare requis (côté user) :
- RESEND_API_KEY  : clé API Resend (re_...)
- RESEND_FROM     : adresse expéditrice ('onboarding@resend.dev' pour test,
                    ou domain vérifié pour prod)
- SITE_URL        : optionnel, défaut https://mva-global-fret.github.io/site-mva-global-fret

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 10:59:26 +02:00
MVA Global Fret
313c870ea4 Fix bugs inscription: ref dupliquée + email de bienvenue manquant
Bug 1 — Ref MVA-001 dupliquée :
Le filtre HubSpot 'HAS_PROPERTY' avec value:'' retournait 0 résultats.
Suppression du value:'' → maintenant le worker liste correctement les
contacts avec reference_client et incrémente bien (testé : MVA-004).

Bug 2 — Email post-inscription jamais reçu :
Le double opt-in HubSpot ne se déclenche pas via Forms API sans
subscription consent (impossible à configurer sans nouveaux scopes
Private App). Pivot vers une approche plus simple :
- L'email de bienvenue est désormais envoyé directement après
  soumission du formulaire (pas de DOI HubSpot)
- L'envoi passe par le Cloudflare Worker (action sendWelcomeNow)
  pour que l'adresse Paris reste dans les env vars Cloudflare et
  ne soit JAMAIS dans le JS public
- Worker appelle EmailJS REST avec firstname + reference + paris_address

Cleanup : message de succès reverti à 'Inscription réussie' (FR/EN/MG).

Anti-spam : protection légère via filtre email/téléphone côté formulaire.
La cron-based welcome (post-DOI) reste en place mais sera inerte tant
que aucun contact n'a le statut CONFIRMED côté HubSpot.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 09:52:48 +02:00
MVA Global Fret
f534376f90 Add post-confirmation page that triggers welcome email after double opt-in
Flux complet du double opt-in :
1. User soumet le formulaire → contact créé en HubSpot avec sa référence
2. HubSpot envoie un email 'Confirmez votre inscription'
3. User clique 'Confirmer' → HubSpot le marque 'subscribed'
4. HubSpot redirige vers confirmation.html?email=...
5. La page lit l'email, appelle le Worker Cloudflare pour récupérer la
   référence du contact, et déclenche l'envoi de l'email de bienvenue
   via EmailJS (avec la référence dedans)
6. Affiche succès + référence à l'écran

Idempotence via localStorage pour éviter de spammer l'email à chaque
rechargement de la page.

À configurer dans HubSpot Settings > Marketing > Email > Confirmation
d'inscription : URL de redirection après confirmation =
https://mva-global-fret.github.io/site-mva-global-fret/confirmation.html?email={{contact.email}}

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-05 23:03:19 +02:00
MVA Global Fret
c713d40946 Contact: ne plus afficher la référence avant validation email
- Retire le bloc 'Numéro de référence client' de la page de succès
- Met à jour le message en FR/EN/MG : 'Vous recevrez ensuite votre numéro
  de référence client' après confirmation
- Désactive l'envoi immédiat de l'email EmailJS de bienvenue (qui
  contenait déjà la référence). HubSpot envoie son email de
  double opt-in qui sera customisé pour inclure la référence
  via le token {{contact.reference_client}}.

Résultat : la référence n'est jamais visible avant que l'email ne soit
vérifié (puisque seuls les emails valides reçoivent le double opt-in).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-05 22:53:23 +02:00
MVA Global Fret
c2e3b1e0d5 Contact: clarify double opt-in flow on success message
HubSpot double opt-in is now enabled at the account level. After
submitting the form, contacts must click the confirmation link in
their email to be added to the marketing list.

The success message now explicitly tells the user to check their
inbox and click the confirmation link, instead of just saying
'inscription enregistrée'.

- title: 'Vérifiez votre boîte mail !' (FR), 'Check your inbox!' (EN), 'Jereo ny boaty mailaka!' (MG)
- main msg: focus on confirmation step
- icon: enveloppe-circle-check (gold) instead of generic green check
- note: nuance that the reference number is for tracking parcels
- emailSent: kept as is (informative footer)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-05 22:45:30 +02:00
MVA Global Fret
5ab50dae3b Tarifs: 'Livraison en Province' = à partir de 6 000 Ar (FR/EN/MG)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-05 22:23:54 +02:00
MVA Global Fret
94b168850b Tier home-delivery pricing in Antananarivo by parcel weight
Antananarivo home delivery is no longer a flat 6,000 Ar:
- 6,000 Ar  ≤ 5 kg
- 10,000 Ar ≤ 10 kg
- 20,000 Ar ≤ 20 kg
- > 20 kg: contact us

tarifs.html: replace the single price line with a 3-row tiered list
inside the Antananarivo card, keep the headline "À partir de 6 000 Ar"
on top, and turn the green "home delivery available" note into an
amber "over 20 kg: contact us" info banner.

translations.js: add delivery1Tier1/2/3 keys for FR/EN/MG, refresh
delivery1Title (now mentions "à domicile"), delivery1Price (now "À
partir de…"), delivery1Desc, delivery1Note. Province card unchanged.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-05 16:02:31 +02:00
MVA Global Fret
d79628ace3 Revert "Tarifs: grille de livraison Antananarivo par palier de poids"
This reverts commit aec3cdd0b8.
2026-05-05 15:41:49 +02:00
MVA Global Fret
aec3cdd0b8 Tarifs: grille de livraison Antananarivo par palier de poids
Remplace le prix unique de 6 000 Ar par 3 paliers (5/10/20 kg) plus
une ligne « Nous contacter » pour les colis plus lourds.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-05 15:21:37 +02:00
MVA Global Fret
0b2fe83963 Expose translations on window so the inline lang switcher can find it
translations.js declared the dict as `const translations = {...}`,
which scopes it to the script but does NOT attach it to window. The
inline applyLang() in index.html reads `window.translations?.[l]` and
was always getting undefined → early-return → no DOM updates → the
button text stayed in French regardless of the lang switcher.

One-line fix: append `window.translations = translations;` so
classic-script inline code can pick it up. All page-level i18n keys
(intro.ctaBtn included) start translating again.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-05 14:18:14 +02:00
MVA Global Fret
1ddd7b12d8 Add cinematic parallax intro page as new landing
The new index.html is a 3-act scroll-driven storytelling intro:

  Act 1 (Tarmac at sunset)
    Sunset gradient sky, mountain silhouettes, hangar, runway with
    centerline lights. Inline SVG cargo plane (MVA-branded gold tail)
    sits on the ground while box emojis cycle up a loading ramp.

  Act 2 (Take-off at dusk)
    Dusk sky, two parallax cloud layers and distant mountains. The
    plane translates diagonally up-and-right with a slight tilt and
    a glowing contrail, sized down progressively.

  Act 3 (Arrival at night)
    Deep navy night sky with twinkling stars, a glowing moon, and
    the Madagascar coastline silhouette. A small plane fades in
    descending toward the island, then a centered CTA block reveals:
    "Bienvenue à bord" with the gold "Accéder au site" button that
    routes to accueil.html (the real homepage).

Implementation:
- Pure CSS layered scenes; no library
- Scroll progress driven by a single CSS custom property --scroll
  (0→1) updated via rAF, layers transform off it
- Mouse-move parallax on layers via --mx/--my (skipped on touch)
- Inline SVG plane reused across the 3 scenes
- All text is i18n-driven with a new `intro` section in FR/EN/MG

Architecture changes:
- index.html  → new parallax intro
- accueil.html → former index.html content (full homepage)
- All nav/logo/footer links updated index.html → accueil.html across
  the 8 existing pages
- Mobile-nav on accueil.html now also includes Service Commande

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-04 22:18:02 +02:00
MVA Global Fret
245f28f76d Update copyright year from 2025 to 2026
Footer copyright bumped to 2026 across all 8 HTML pages and in the
three translation strings (FR/EN/MG) in translations.js.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-04 21:20:29 +02:00
MVA Global Fret
8031a8bf2e Add asterisk note for oversized parcels in shipping guide
"Dépasser les dimensions autorisées" now has an asterisk pointing to
a small italic note below the dos/donts grid: "Nous contacter pour
tout colis volumineux." (FR/EN/MG).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-04 21:17:57 +02:00
MVA Global Fret
4a79136525 Add "Service Commande" page (personal shopper service)
New page service-commande.html explaining the order-on-behalf service:
- 10% commission on total order amount
- 50% deposit + 50% on order validation
- Right to request 100% upfront for large orders
- Standard 70,000 Ar/kg shipping fee on top, paid on receipt
- 5-question FAQ
- CTA to contact / Messenger

Trilingual content (FR / EN / MG) added to translations.js with full
serviceCommande section + nav.serviceCommande key.

Menu link inserted right after "Tarifs" in main nav, mobile nav and
footer links across all pages: index, about, tarifs, contact,
guide-envoi, application, cgv, service-commande.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-04 20:14:16 +02:00
MVA Global Fret
39d3496758 Redesign contact map section with elegant card layout
- Replace the cramped map-container layout with a polished map-card
- Centered section header (h2 + gold-line + subtitle) above the card
- Navy gradient header inside the card with gold location icon
- Address displayed in the header alongside an "open in Google Maps" CTA
- Increased map height to 420px (320px on mobile)
- Soft shadow and gold-tinted border for premium feel
- Added mapSubtitle translation key (FR/EN/MG)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-04 17:58:39 +02:00
MVA Global Fret
b602e0d6f2 Fix remaining hardcoded French texts (i18n complete audit)
Critical fixes (user-reported):
- tarifs.html: delivery1Note "Livraison à domicile disponible"
- tarifs.html: delivery2Note "Retrait au bureau Cotisse de votre ville"
- contact.html: cgvLabel checkbox (with embedded CGV link, uses data-i18n-html)

Application page (mockup phone + payment methods section):
- mockupFlightTitle/Sub, mockupTab All/Transit/Delivered, mockupBadgeTransit
- mockupItemName/Ref, mockupStep1/3, mockupOrder1/2
- mockupPaymentTitle, mockupArrived
- paymentTitle, paymentSubtitle, cardLabel

Other pages:
- guide-envoi.html: warningContact callout paragraph
- about.html: channelMessenger/MessengerAction/PhoneMG/PhoneFR/Email labels

All keys added in FR/EN/MG.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-04 17:48:19 +02:00
MVA Global Fret
ec77737a9c Translate CGV page to EN/MG + full i18n audit fixes
- CGV page: added trilingual content (FR/EN/MG) using data-lang-block divs
- main.js: added data-lang-block toggle handler in applyLanguage()
- translations.js: added cgv.heroTitle/heroSubtitle for FR/EN/MG
- translations.js: fixed Malagasy (Fandefasana, Sarany), English (from Europe)
- translations.js: added delivery delay precision (depuis le dépôt Paris)
- translations.js: added 50+ missing i18n keys for tarifs/contact/guide/app/home
- All footer CGV links updated with data-i18n attributes

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-04 17:39:55 +02:00
MVA Global Fret
ae85f2944b fix(i18n): traduire tous les textes codés en dur en français sur l'ensemble du site
Ajout de data-i18n sur tous les éléments non traduits (tarifs, contact, guide,
application, accueil) et ajout des clés correspondantes en FR/EN/MG dans
translations.js : détails tarifaires, cartes livraison, stats accueil, sections
CTA, récapitulatif contact, footer CGV.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-04 17:31:40 +02:00
MVA Global Fret
7e43b818d8 fix(mg): remplacer "vidiny/Vidinay" par "sarany/Sarany" partout en malgache
"Sarany" est le terme correct pour désigner les tarifs/prix dans ce contexte.
Corrige : heroTitle tarifs, heroSubtitle tarifs, nav pricing, heroCtaSecondary,
et value3Desc (about).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-04 17:20:16 +02:00
MVA Global Fret
f2b80d0e04 fix(en): corriger "between Europe and Madagascar" → "from Europe to Madagascar"
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-04 17:18:31 +02:00
MVA Global Fret
50e792ef96 fix(mg): remplacer toutes les occurrences de "fandefa" par "fandefasana" en malgache
"Fandefasana" est la forme correcte (nominalisée) en malgache pour désigner
le transport/fret aérien. Corrige le titre hero et 5 autres occurrences dans
les textes descriptifs, sous-titres et footer.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-04 17:16:06 +02:00
MVA Global Fret
1e2ee85b6e fix: préciser que le délai de 2 semaines est compté depuis l'arrivée au dépôt de Paris
Mise à jour de toutes les mentions du délai de livraison sur l'ensemble du site
(index, tarifs, contact) et dans les 3 langues (FR/EN/MG) pour indiquer clairement
que les 2 semaines sont comptées à compter de l'arrivée du colis au dépôt de Paris.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-04 17:12:20 +02:00
MVA Global Fret
15e98b9c32 feat: numérotation séquentielle MVA-XXX, texte succès corrigé, message email/spam 2026-05-04 16:28:28 +02:00
MVA Global Fret
fa4b49e1b8 Unicité référence client + détection doublon email
- generateRefNumber() basé sur timestamp : références jamais identiques
- checkExistingContact() : lecture HubSpot via clé de service (read-only)
- Si email déjà connu : affiche message 'déjà client' + référence existante,
  AUCUNE soumission envoyée (référence existante jamais modifiée)
- Notification interne Formspree si tentative double inscription
- Traductions FR/EN/MG pour les nouveaux messages
2026-05-03 16:23:49 +02:00
MVA Global Fret
64f5401112 feat: generate client reference number (MVA-YYYY-XXXX), save to HubSpot reference_client field, display in success message 2026-05-03 11:20:52 +02:00
MVA Global Fret
938efe582f Initial commit — Site MVA Global Fret 2026-05-02 22:23:48 +02:00