gigafibre-fsm/services/targo-hub/templates/contract-residential.html
louispaulb 41d9b5f316 feat: flow editor, Gemini QR scanner with offline queue, dispatch planning v2
Major additions accumulated over 9 days — single commit per request.

Flow editor (new):
- Generic visual editor for step trees, usable by project wizard + agent flows
- PROJECT_KINDS / AGENT_KINDS catalogs decouple UI from domain
- Drag-and-drop reorder via vuedraggable with scope isolation per peer group
- Chain-aware depends_on rewrite on reorder (sequential only — DAGs preserved)
- Variable picker with per-applies_to catalog (Customer / Quotation /
  Service Contract / Issue / Subscription), insert + copy-clipboard modes
- trigger_condition helper with domain-specific JSONLogic examples
- Global FlowEditorDialog mounted once in MainLayout, Odoo inline pattern
- Server: targo-hub flow-runtime.js, flow-api.js, flow-templates.js
- ERPNext: Flow Template/Run doctypes, scheduler, 5 seeded system templates
- depends_on chips resolve to step labels instead of opaque "s4" ids

QR/OCR scanner (field app):
- Camera capture → Gemini Vision via targo-hub with 8s timeout
- IndexedDB offline queue retries photos when signal returns
- Watcher merges late-arriving scan results into the live UI

Dispatch:
- Planning mode (draft → publish) with offer pool for unassigned jobs
- Shared presets, recurrence selector, suggested-slots dialog
- PublishScheduleModal, unassign confirmation

Ops app:
- ClientDetailPage composables extraction (useClientData, useDeviceStatus,
  useWifiDiagnostic, useModemDiagnostic)
- Project wizard: shared detail sections, wizard catalog/publish composables
- Address pricing composable + pricing-mock data
- Settings redesign hosting flow templates

Targo-hub:
- Contract acceptance (JWT residential + DocuSeal commercial tracks)
- Referral system
- Modem-bridge diagnostic normalizer
- Device extractors consolidated

Migration scripts:
- Invoice/quote print format setup, Jinja rendering
- Additional import + fix scripts (reversals, dates, customers, payments)

Docs:
- Consolidated: old scattered MDs → HANDOFF, ARCHITECTURE, DATA_AND_FLOWS,
  FLOW_EDITOR_ARCHITECTURE, BILLING_AND_PAYMENTS, CPE_MANAGEMENT,
  APP_DESIGN_GUIDELINES
- Archived legacy wizard PHP for reference
- STATUS snapshots for 2026-04-18/19

Cleanup:
- Removed ~40 generated PDFs/HTMLs (invoice_preview*, rendered_jinja*)
- .gitignore now covers invoice preview output + nested .DS_Store

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-22 10:44:17 -04:00

237 lines
16 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<title>Entente de service — TARGO</title>
<style>
@page { size: letter; margin: 14mm 14mm 18mm 14mm; }
* { box-sizing: border-box; margin: 0; padding: 0; }
body { font-family: "Helvetica Neue", Arial, sans-serif; color: #1a1a1a; font-size: 10pt; line-height: 1.45; }
.page { padding: 0; page-break-after: always; }
.page:last-child { page-break-after: auto; }
/* Header */
header.brand { display: flex; justify-content: space-between; align-items: flex-end; border-bottom: 2px solid #019547; padding-bottom: 6mm; margin-bottom: 6mm; }
header.brand .logo { height: 12mm; }
header.brand .meta { text-align: right; font-size: 9pt; }
header.brand .meta .phone { color: #019547; font-weight: 700; font-size: 11pt; }
header.brand .meta .url { color: #666; }
h1.title { font-size: 14pt; font-weight: 800; color: #019547; text-align: center; text-transform: uppercase; letter-spacing: 0.3px; margin-bottom: 5mm; padding: 3mm 0; border-bottom: 2px solid #019547; }
/* Parties */
.parties { display: grid; grid-template-columns: 1fr 1fr; gap: 4mm; margin-bottom: 5mm; }
.party { border: 1px solid #d0d0d0; border-radius: 2mm; padding: 3mm; font-size: 9.5pt; }
.party .name { color: #019547; font-weight: 700; font-size: 10.5pt; margin-bottom: 1mm; }
.party .role { color: #888; font-size: 8.5pt; font-style: italic; margin-top: 1.5mm; }
/* Section headings */
h2.section { background: #019547; color: #fff; font-size: 10pt; font-weight: 700; padding: 1.5mm 3mm; text-transform: uppercase; letter-spacing: 0.3px; margin: 4mm 0 2mm 0; border-radius: 1mm; }
h3.sub { color: #019547; font-size: 10pt; font-weight: 700; margin-top: 3mm; margin-bottom: 1.5mm; }
p { margin-bottom: 1.5mm; }
ul, ol { margin-left: 5mm; margin-bottom: 2mm; }
ul li, ol li { margin-bottom: 0.5mm; font-size: 9.5pt; }
.art { color: #019547; font-weight: 700; margin-right: 1.5mm; }
/* Boxes */
.callout { border: 1px solid #019547; background: #f1fbf5; border-radius: 2mm; padding: 3mm; margin: 2mm 0 3mm 0; font-size: 9.5pt; }
.callout .head { color: #019547; font-weight: 700; margin-bottom: 1.5mm; }
.warning { border: 1px solid #fde68a; background: #fffbeb; border-radius: 2mm; padding: 3mm; margin: 2mm 0 3mm 0; font-size: 9.5pt; }
.warning .head { color: #b45309; font-weight: 700; margin-bottom: 1.5mm; }
/* Service summary table */
table.svc { width: 100%; border-collapse: collapse; margin: 2mm 0 3mm 0; font-size: 9.5pt; }
table.svc td { padding: 1.5mm 2.5mm; border-bottom: 1px solid #eee; }
table.svc td.lbl { color: #666; width: 40%; }
table.svc td.val { font-weight: 600; text-align: right; }
/* Benefits table */
table.benefits { width: 100%; border-collapse: collapse; margin: 2mm 0 3mm 0; font-size: 9pt; }
table.benefits th { background: #f4fff6; color: #00733a; text-align: left; padding: 2mm 2.5mm; border-bottom: 2px solid #019547; font-weight: 700; }
table.benefits td { padding: 2mm 2.5mm; border-bottom: 1px solid #eee; }
table.benefits td.r { text-align: right; }
table.benefits tfoot td { font-weight: 700; color: #00733a; border-top: 2px solid #019547; border-bottom: none; background: #f4fff6; }
/* Signatures */
.sig-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 6mm; margin-top: 6mm; }
.sig-box { border: 1px solid #d0d0d0; border-radius: 2mm; padding: 3mm; min-height: 32mm; }
.sig-box .label { color: #019547; font-weight: 700; font-size: 10pt; margin-bottom: 2mm; }
.sig-box .fields { font-size: 9pt; color: #555; }
.sig-box .fields .row { margin-bottom: 2mm; border-bottom: 1px dotted #bbb; padding-bottom: 1mm; min-height: 8mm; }
/* Footer repeated via margin for each page on PDF engines that support it */
.footer-note { color: #888; font-size: 8pt; text-align: center; margin-top: 5mm; border-top: 1px solid #eee; padding-top: 2mm; }
</style>
</head>
<body>
<!-- ══════════ PAGE 1 — Identification, service, avantages, clause de résiliation ══════════ -->
<div class="page">
<header class="brand">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 326.39 70.35" width="150" height="32" style="display:block;"><path fill="#019547" d="M25.83,15H8.41a4.14,4.14,0,0,1-3.89-2.71L0,1.18H66.59L62.07,12.27A4.14,4.14,0,0,1,58.18,15H40.76V69.19H25.81Z"/><path fill="#019547" d="M90.74.68h18.55a5.63,5.63,0,0,1,5.63,5.6l.26,62.91H99.55L99.76,54H71.87L66.41,65.51a6.45,6.45,0,0,1-5.84,3.68H49.35L73.53,12.11A18.7,18.7,0,0,1,90.74.68M100,40.73l.07-26h-8a6.75,6.75,0,0,0-6.26,4.18L76.73,40.73Z"/><path fill="#019547" d="M124.51,6.81a5.64,5.64,0,0,1,5.65-5.65H155.6c8.64,0,15.37,2.44,19.81,6.91,3.81,3.78,5.84,9.14,5.84,15.53v.18c0,11-5.92,17.87-14.59,21.1l16.61,24.29h-14a6.51,6.51,0,0,1-5.39-2.87L151.21,47.41H139.44V69.17h-15Zm30.12,27.41c7.28,0,11.45-3.89,11.45-9.62v-.21c0-6.42-4.46-9.7-11.74-9.7H139.46V34.22Z"/><path fill="#019547" d="M184.74,35.37v-.18C184.74,15.85,199.8,0,220.4,0,232.65,0,240,3.31,247.13,9.33l-6.28,7.57a5.18,5.18,0,0,1-6.84,1,23.71,23.71,0,0,0-14.11-4.13c-10.88,0-19.52,9.62-19.52,21.18v.19c0,12.43,8.54,21.57,20.6,21.57a24,24,0,0,0,14.09-4.07V42.91h-8.68A6.41,6.41,0,0,1,220,36.53V30h29.54V59.52a44,44,0,0,1-29,10.78c-21.18,0-35.74-14.8-35.74-34.93"/><path fill="#019547" d="M254.09,35.37v-.18C254.09,15.85,269.33,0,290.33,0s36.06,15.66,36.06,35v.18c0,19.34-15.27,35.19-36.24,35.19s-36.06-15.64-36.06-35m56.63,0v-.18c0-11.67-8.54-21.39-20.6-21.39S269.73,23.34,269.73,35v.18c0,11.67,8.54,21.37,20.6,21.37S310.72,47,310.72,35.37"/></svg>
<div class="meta">
<div class="phone">1-855-888-2746</div>
<div class="url">www.targo.ca</div>
<div style="color:#888;font-size:8.5pt;margin-top:1mm;">Contrat n° {{contract_number}}</div>
</div>
</header>
<h1 class="title">Entente de service — Internet par fibre optique</h1>
<section class="parties">
<div class="party">
<div class="name">TARGO Communications Inc.</div>
<div>1867 chemin de la Rivière</div>
<div>Sainte-Clotilde-de-Châteauguay (Québec)</div>
<div style="margin-top:1.5mm;">Tél. : 1-855-888-2746</div>
<div>Courriel : service@targo.ca</div>
<div class="role">Ci-après désignée « TARGO »</div>
</div>
<div class="party">
<div class="name">{{customer_name}}</div>
<div>{{customer_address_line1}}</div>
<div>{{customer_city}} ({{customer_province}}) {{customer_postal}}</div>
<div style="margin-top:1.5mm;">Tél. : {{customer_phone}}</div>
<div>Courriel : {{customer_email}}</div>
<div class="role">Ci-après désigné « CLIENT »</div>
</div>
</section>
<h2 class="section">1. Objet du contrat</h2>
<p><span class="art">1.1</span> La présente entente a pour objet la fourniture au CLIENT, par TARGO, d'un service d'accès Internet résidentiel par fibre optique au lieu d'installation indiqué ci-dessus, incluant l'installation, l'équipement requis et le support technique.</p>
<p><span class="art">1.2</span> Le service est offert sous la marque <strong>Gigafibre</strong>, une marque de commerce de TARGO.</p>
<h2 class="section">2. Service souscrit</h2>
<table class="svc">
<tr><td class="lbl">Plan de service</td><td class="val">{{plan_name}}</td></tr>
<tr><td class="lbl">Vitesse descendante / montante</td><td class="val">{{download_speed}} / {{upload_speed}}</td></tr>
<tr><td class="lbl">Mensualité (taxes en sus)</td><td class="val">{{monthly_rate}} $ / mois</td></tr>
<tr><td class="lbl">Durée d'engagement</td><td class="val">{{duration_months}} mois</td></tr>
<tr><td class="lbl">Date de début prévue</td><td class="val">{{start_date}}</td></tr>
<tr><td class="lbl">Date d'échéance du terme</td><td class="val">{{end_date}}</td></tr>
</table>
<h2 class="section">3. Avantages particuliers accordés au CLIENT</h2>
<p style="margin-bottom:2mm;">Dans le cadre de la signature d'un engagement de {{duration_months}} mois, TARGO accorde au CLIENT les avantages suivants :</p>
<table class="benefits">
<thead>
<tr>
<th>Avantage</th>
<th class="r">Prix régulier</th>
<th class="r">Prix accordé</th>
<th class="r">Valeur ($)</th>
<th class="r">Reconnaissance mensuelle</th>
</tr>
</thead>
<tbody>
{{#benefits}}
<tr>
<td>{{description}}</td>
<td class="r">{{regular_price}} $</td>
<td class="r">{{granted_price}} $</td>
<td class="r">{{benefit_value}} $</td>
<td class="r">{{monthly_recognition}} $ / mois</td>
</tr>
{{/benefits}}
</tbody>
<tfoot>
<tr>
<td colspan="3">Total des avantages sur {{duration_months}} mois</td>
<td class="r">{{total_benefit_value}} $</td>
<td class="r"></td>
</tr>
</tfoot>
</table>
<div class="callout">
<div class="head">Mécanique de reconnaissance</div>
Chaque mois d'abonnement respecté « reconnaît » une fraction des avantages accordés.
Exemple : un avantage de 288 $ accordé sur 24 mois est reconnu à raison de 12 $ par mois.
Après 12 mois, 144 $ sont reconnus ; 144 $ restent à compenser si le CLIENT met fin à l'entente.
</div>
<h2 class="section">4. Clause de résiliation anticipée</h2>
<p><span class="art">4.1</span> Le CLIENT peut en tout temps résilier la présente entente en transmettant un avis écrit à TARGO avec un préavis minimal de 30 jours.</p>
<p><span class="art">4.2</span> Si la résiliation survient <strong>avant l'échéance du terme de {{duration_months}} mois</strong>, le CLIENT devra rembourser à TARGO la valeur résiduelle des avantages non encore reconnus, calculée au prorata des mois restants.</p>
<p><span class="art">4.3</span> Le montant dû est établi selon la formule suivante :</p>
<div class="warning">
<div class="head">Formule de remboursement</div>
<strong>Montant dû</strong> = Somme, pour chaque avantage, de (Valeur Mois écoulés × Reconnaissance mensuelle).
<br>Autrement dit : seuls les mois restants sur les {{duration_months}} mois d'engagement sont facturés, pour la portion d'avantages non encore compensée.
</div>
<p><span class="art">4.4</span> Aucun frais de résiliation ne s'applique au-delà de cette valeur résiduelle. Aucune pénalité supplémentaire n'est exigée dans le cas d'un contrat résidentiel.</p>
<p><span class="art">4.5</span> Le montant dû sera facturé au CLIENT sur sa facture finale, payable selon les modalités habituelles.</p>
<div class="footer-note">Page 1 de 2 — Contrat {{contract_number}} — {{customer_name}}</div>
</div>
<!-- ══════════ PAGE 2 — Termes généraux, obligations, signatures ══════════ -->
<div class="page">
<header class="brand">
<div style="display:flex;align-items:center;gap:4mm;">
<div style="font-size:14pt;font-weight:800;color:#019547;">TARGO</div>
</div>
<div class="meta">
<div style="color:#888;font-size:8.5pt;">Contrat n° {{contract_number}} — suite</div>
</div>
</header>
<h2 class="section">5. Obligations du CLIENT</h2>
<p><span class="art">5.1</span> Le CLIENT s'engage à acquitter les factures dans les délais prescrits, à maintenir des coordonnées de paiement valides et à utiliser le service de manière conforme aux lois en vigueur et aux conditions d'utilisation de TARGO publiées sur www.targo.ca.</p>
<p><span class="art">5.2</span> Le CLIENT est responsable de son équipement interne (ordinateur, routeur tiers, câblage après la prise murale) et des dommages qu'il cause volontairement à l'équipement fourni par TARGO.</p>
<p><span class="art">5.3</span> Le CLIENT s'engage à fournir un accès raisonnable au technicien pour l'installation initiale et tout service ultérieur requis.</p>
<h2 class="section">6. Équipement fourni par TARGO</h2>
<p><span class="art">6.1</span> L'équipement nécessaire à la fourniture du service (ONT, routeur, câblage jusqu'à la prise) demeure la propriété de TARGO sauf mention contraire à l'entente.</p>
<p><span class="art">6.2</span> En cas de résiliation, le CLIENT doit retourner l'équipement fourni dans un délai de 15 jours, faute de quoi les frais de remplacement lui seront facturés au coût de remplacement équivalent neuf.</p>
<h2 class="section">7. Responsabilité de TARGO</h2>
<p><span class="art">7.1</span> TARGO s'engage à fournir le service avec une diligence raisonnable et à rétablir le service en cas d'interruption dans un délai raisonnable. TARGO ne saurait être tenue responsable des interruptions causées par des cas de force majeure, des travaux chez le fournisseur d'accès tiers ou des manipulations par le CLIENT.</p>
<p><span class="art">7.2</span> La responsabilité de TARGO est limitée au montant équivalent à un (1) mois de service, à l'exclusion de tout dommage indirect, perte de profit ou perte de données.</p>
<h2 class="section">8. Facturation et paiement</h2>
<p><span class="art">8.1</span> Les factures sont émises mensuellement et payables dès réception. Les taxes applicables (TPS/TVQ) s'ajoutent au montant.</p>
<p><span class="art">8.2</span> Tout compte en souffrance de plus de 30 jours peut faire l'objet d'une suspension de service après préavis. Un compte en souffrance de plus de 60 jours peut entraîner la résiliation de l'entente, auquel cas l'article 4 (résiliation anticipée) s'applique.</p>
<p><span class="art">8.3</span> Des frais de 25 $ sont appliqués en cas de paiement sans provision (NSF).</p>
<h2 class="section">9. Modifications et ajustements</h2>
<p><span class="art">9.1</span> TARGO peut modifier la mensualité ou les conditions du service avec un préavis écrit de 30 jours. Le CLIENT qui refuse la modification peut résilier sans pénalité (les avantages déjà reconnus ne sont pas réclamés).</p>
<p><span class="art">9.2</span> Toute modification de plan ou d'adresse de service demandée par le CLIENT fait l'objet d'un avenant écrit.</p>
<h2 class="section">10. Protection des renseignements personnels</h2>
<p><span class="art">10.1</span> TARGO traite les renseignements personnels du CLIENT conformément à la Loi sur la protection des renseignements personnels dans le secteur privé (Québec) et à la Loi 25. La politique complète est disponible sur www.targo.ca/politique-confidentialite.</p>
<h2 class="section">11. Droit applicable et juridiction</h2>
<p><span class="art">11.1</span> La présente entente est régie par les lois en vigueur dans la province de Québec. Les parties conviennent que tout litige relatif à l'interprétation ou l'application de l'entente sera soumis aux tribunaux du district judiciaire de Beauharnois.</p>
<h2 class="section">12. Signatures</h2>
<p style="margin-bottom:2mm;">En signant la présente entente, les parties confirment avoir lu, compris et accepté l'ensemble des modalités qui y sont stipulées.</p>
<div class="sig-grid">
<div class="sig-box">
<div class="label">Pour TARGO</div>
<div class="fields">
<div class="row" style="min-height:14mm;">Signature</div>
<div class="row">&nbsp;</div>
<div class="row">Date : {{signature_date_targo}}</div>
</div>
</div>
<div class="sig-box">
<div class="label">Le CLIENT</div>
<div class="fields">
<div class="row" style="min-height:14mm;">Signature</div>
<div class="row">{{customer_name}}</div>
<div class="row">Date : {{signature_date_client}}</div>
</div>
</div>
</div>
<div class="footer-note">Page 2 de 2 — Contrat {{contract_number}} — TARGO Communications Inc. — www.targo.ca</div>
</div>
</body>
</html>