-{# Pro+ banner — soumission personnalisée pour grands volumes / SLA renforcé #}
+{# === Bloc 2 — DictIA LOCAL (large, distinctif, pleine largeur) === #}
+
+ {# Decorative orbs background — purely decorative, hidden from AT #}
+
+
+
+
+
+ {# === LEFT — copy + checkmarks === #}
+
+
+
+
+ Au Québec
+
+ par InnovA AI
+
+
+
DictIA LOCAL · Serveur souverain
+
+ Vous en êtes propriétaire.
+
+
+ On vous vend, configure et installe votre serveur IA directement dans vos locaux. Vous êtes propriétaire du matériel. Vos données ne quittent jamais votre bureau.
+
+
+
+ {% for bullet in [
+ ('PC + GPU RTX vous appartient', 'pas de location, pas d’abonnement matériel'),
+ ('Traitement 100 % local', 'aucun transit réseau, fonctionne hors-ligne'),
+ ('Assemblé et configuré au Québec par InnovA AI', 'support local inclus'),
+ ('On vient l’installer chez vous', 'formation incluse, opérationnel le jour 1'),
+ ('Achat direct sans appel d’offres si < 34 700 $', 'DictIA LOCAL s’y qualifie')
+ ] %}
+
Trois forfaits Cloud DictIA + DictIA LOCAL + Pro+ sur soumission
{% include 'marketing/_partials/_pricing_tiers.html' %}
diff --git a/tests/test_marketing_landing_template.py b/tests/test_marketing_landing_template.py
index eac0eb7..9ab05b0 100644
--- a/tests/test_marketing_landing_template.py
+++ b/tests/test_marketing_landing_template.py
@@ -360,28 +360,32 @@ def test_pricing_recommended_tier_is_cloud_pro():
def test_pricing_cta_labels_v7():
- """CTAs reflect v7.0 forfait choice (Démarrer en Cloud / Choisir Essentiel / Commander Pro / Configurer DictIA Local)."""
+ """CTAs reflect v7.0 forfait choice — 3 Cloud go to /checkout, DictIA LOCAL goes to /contact?plan=dictia-local."""
client = app.test_client()
body = client.get('/').data.decode('utf-8')
- for slug in ['cloud-basic', 'cloud-essentiel', 'cloud-pro', 'dictia-local']:
+ # 3 Cloud forfaits use /checkout/
+ for slug in ['cloud-basic', 'cloud-essentiel', 'cloud-pro']:
assert f'href="/checkout/{slug}"' in body, f"Missing checkout link for {slug}"
# CTA labels match the macro callers in _pricing_tiers.html
assert 'Démarrer en Cloud' in body or 'Démarrer en Cloud' in body
assert 'Choisir Essentiel' in body
assert 'Commander Pro' in body
- assert 'Configurer DictIA Local' in body
+ # DictIA LOCAL now has a dedicated block with a contact CTA (no /checkout slug)
+ assert 'Voir les serveurs disponibles' in body, "Missing DictIA LOCAL block CTA label"
+ assert '/contact?plan=dictia-local' in body, "Missing DictIA LOCAL contact CTA href"
def test_pricing_features_use_safe_filter_no_double_escape():
"""Pricing card features piped through | safe — ' ' must render single-escaped, not double."""
client = app.test_client()
body = client.get('/').data.decode('utf-8')
- # Capacity chips use NBSP
+ # Capacity chips use NBSP (3 Cloud forfaits)
assert '~165 h audio/mois' in body, "Missing Cloud BASIC capacity chip"
assert '100 Go' in body, "Missing Cloud BASIC storage chip"
assert '~660 h audio/mois' in body, "Missing Cloud PRO capacity chip"
assert '500 Go' in body, "Missing Cloud PRO storage chip"
- assert '2 To SSD' in body, "Missing DictIA LOCAL storage chip"
+ # DictIA LOCAL dedicated block — server visual mockup uses NBSP for GPU spec
+ assert 'RTX 5070 Ti 16 Go' in body, "Missing DictIA LOCAL GPU spec line in dedicated block"
# WhisperX precision claim w/ NBSP
assert 'WhisperX Large-v3' in body, "Missing WhisperX Large-v3 mention"
# Loi 25 with NBSP
@@ -462,8 +466,9 @@ def test_pricing_cta_url_no_double_slash():
"""pricing_card uses cta_url.rstrip('/') so href never has '//' (regression guard)."""
client = app.test_client()
body = client.get('/').data.decode('utf-8')
- # All 4 CTAs use the default cta_url='/checkout' (no trailing slash) — so /checkout/
- for slug in ['cloud-basic', 'cloud-essentiel', 'cloud-pro', 'dictia-local']:
+ # The 3 Cloud forfaits use the default cta_url='/checkout' (no trailing slash) — so /checkout/
+ # DictIA LOCAL is presented in a dedicated block with /contact?plan=dictia-local (not via pricing_card macro)
+ for slug in ['cloud-basic', 'cloud-essentiel', 'cloud-pro']:
assert f'href="/checkout/{slug}"' in body, f"Missing single-slash href for {slug}"
assert f'href="/checkout//{slug}"' not in body, f"Double-slash regression for {slug}"
diff --git a/tests/test_marketing_secondary_pages.py b/tests/test_marketing_secondary_pages.py
index 5c11865..07f7eb0 100644
--- a/tests/test_marketing_secondary_pages.py
+++ b/tests/test_marketing_secondary_pages.py
@@ -34,7 +34,7 @@ def test_tarifs_has_h1_with_anchor():
def test_tarifs_renders_4_pricing_cards_v7():
- """Tarifs page renders the v7.0 4 forfaits + Pro+ chip."""
+ """Tarifs page renders the v7.0 3 Cloud forfaits + DictIA LOCAL dedicated block + Pro+ chip."""
client = app.test_client()
body = client.get('/tarifs').data.decode('utf-8')
for tier in ['Cloud BASIC', 'Cloud ESSENTIEL', 'Cloud PRO', 'DictIA LOCAL']:
@@ -45,11 +45,15 @@ def test_tarifs_renders_4_pricing_cards_v7():
assert '549 $' in body
assert '485 $' in body # Cloud Pro onboarding
assert '5 998 $' in body # DictIA Local An 1
- # Checkout slugs
+ # 3 Cloud forfaits use checkout slugs
assert 'href="/checkout/cloud-basic"' in body
assert 'href="/checkout/cloud-essentiel"' in body
assert 'href="/checkout/cloud-pro"' in body
- assert 'href="/checkout/dictia-local"' in body
+ # DictIA LOCAL has its own dedicated block with a contact CTA (no /checkout slug)
+ assert '/contact?plan=dictia-local' in body, "Missing DictIA LOCAL block contact CTA"
+ assert 'Vous en êtes' in body or 'Vous en êtes' in body, \
+ "Missing DictIA LOCAL block headline 'Vous en êtes propriétaire'"
+ assert 'Serveur DictIA' in body, "Missing DictIA LOCAL block server visual mockup label"
# Pro+ chip with /contact link
assert 'Pro+' in body
assert '/contact?pro-plus=1' in body