SPB Git

spb/uqo_cours

Public

IMM1033 TP2 allégé : bordereau en 22 composantes à prix composites (au lieu de 64 lignes RSMeans), 7 grandeurs, 8 ventes ; énoncé 17 p., gabarit, solutionnaires (Excel vérifié 71/71), diapos séance 7

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Simon-Pierre Boucher committed (Oct 30, 2026) parent 3e6f64a Browse files

19 changed files +898 −628

19 changed files
modified IMM1033-20_Methodes_du_cout/02_Slides/pdf/seance07_couts_directs.pdf +0 −0

Binary file not shown.

modified IMM1033-20_Methodes_du_cout/02_Slides/sources/seance07_couts_directs.tex +6 −6
@@ -1456,18 +1456,18 @@ Compléter l'exercice d'estimation du bungalow et entamer le TP2 (énoncé et ga
1456 1456 \begin{frame}{TP2 --- Bordereau de coût de remplacement neuf avec UQO Éval (15\,\%)}
1457 1457 \footnotesize
1458 1458 \begin{importbox}[Mandat]
1459 −Un promoteur de Gatineau projette un \textbf{quadruplex de 2 étages} (18,3 $\times$ 10,4 m, 4 logements, sous-sol non fini, brique 80\,\%). Vous montez le bordereau complet à partir du \textbf{cas d'étude « Cas 9 » du module Quantity Survey d'UQO Éval} : plans, relevé des quantités, 64 lignes tarifées \textbf{RSMeans 2026 T4 localisées Gatineau} --- puis indirects réels, profit et validation par \textbf{11 ventes réelles de quadruplex neufs}.
1459 +Un promoteur de Gatineau projette un \textbf{quadruplex de 2 étages} (18,3 $\times$ 10,4 m, 4 logements, sous-sol non fini, brique 80\,\%). Vous montez le bordereau complet à partir du \textbf{cas d'étude « Cas 9 » du module Quantity Survey d'UQO Éval} : plans, relevé des quantités condensé en \textbf{22 composantes à prix composites RSMeans 2026 T4 (Gatineau)} --- puis indirects réels, profit et validation par \textbf{8 ventes réelles de quadruplex neufs}.
1460 1460 \end{importbox}
1461 1461 \vspace{0.5mm}
1462 1462 \uqotitle{Objectifs pédagogiques :}
1463 1463 \begin{itemize}
1464 − \item Reproduire 12 grandeurs du relevé depuis le plan et tarifer 64 lignes (conversion SI $\rightarrow$ RSMeans, coût unitaire nu, sous-totaux par division) --- séance 7
1464 + \item Reproduire 7 grandeurs du relevé depuis le plan et chiffrer 22 composantes (coût unitaire nu, montant, sous-totaux par division) --- séance 7
1465 1465 \item Passer des coûts nus aux coûts directs du cours (conditions générales, frais généraux, profit de l'entrepreneur), puis contingences
1466 1466 \item Calculer les indirects réels : permis de Gatineau (\texttt{MAX}), GCR, intercalaires avec facteur ½, honoraires --- séance 8
1467 1467 \item Asseoir le profit entrepreneurial, puis \textbf{extraire du marché} la valeur du bâtiment et le profit implicite ; comparer au moteur de coût d'UQO Éval et à Altus
1468 1468 \end{itemize}
1469 1469 \begin{notebox}[Données réelles (29 octobre 2026)]
1470 −\footnotesize RSMeans 2026 T4 (Gatineau C57), règlement 501-2005 (4,70\,\$/1\,000\,\$, min. 335\,\$/logement), GCR 2026 (2\,656,68\,\$/unité), préférentiel 4,70\,\% (hausse du taux directeur du 28 octobre), 11 ventes 2024-2025 de quadruplex 2021-2024, moteur de coût UQO Éval, Altus 2026.
1470 +\footnotesize RSMeans 2026 T4 (Gatineau C57), règlement 501-2005 (4,70\,\$/1\,000\,\$, min. 335\,\$/logement), GCR 2026 (2\,656,68\,\$/unité), préférentiel 4,70\,\% (hausse du taux directeur du 28 octobre), 8 ventes 2024-2025 de quadruplex 2021-2024, moteur de coût UQO Éval, Altus 2026.
1471 1471 \end{notebox}
1472 1472 \end{frame}
1473 1473
@@ -1491,10 +1491,10 @@ Un promoteur de Gatineau projette un \textbf{quadruplex de 2 étages} (18,3 $\ti
1491 1491 \begin{column}{0.42\textwidth}
1492 1492 \uqotitle{Les onglets du gabarit :}
1493 1493 \begin{itemize}
1494 − \item \textbf{Données} : 11 tableaux réels (ne pas modifier)
1495 − \item \textbf{Relevé} : Q1-Q3 --- plan $\rightarrow$ quantités $\rightarrow$ 64 lignes RSMeans
1494 + \item \textbf{Données} : 10 tableaux réels (ne pas modifier)
1495 + \item \textbf{Relevé} : Q1-Q3 --- plan $\rightarrow$ 7 quantités $\rightarrow$ 22 composantes
1496 1496 \item \textbf{Bordereau} : Q4-Q8 --- directs du cours, contingences, permis, GCR, intercalaires, honoraires, profit, \$/pi\up{2}
1497 − \item \textbf{Marché} : Q9 --- extraction sur 11 ventes, moteur, Altus, profit extrait
1497 + \item \textbf{Marché} : Q9 --- extraction sur 8 ventes, moteur, Altus, profit extrait
1498 1498 \item \textbf{Dashboard} + \textbf{Note} : Q10 --- KPI, verdict, graphiques, note
1499 1499 \item Cas ouvert sur \texttt{uqo-eval.app/quantity-survey} : dupliquez-le
1500 1500 \end{itemize}
modified IMM1033-20_Methodes_du_cout/03_Travaux_pratiques/TP2_Bordereau_de_cout_neuf/README.md +4 −4
@@ -1,10 +1,10 @@
1 1 # IMM1033-20 · TP2 — Bordereau de coût de remplacement neuf d'un quadruplex avec UQO Éval (15 %)
2 2
3 3 - Remise : séance 9 (12 novembre 2026, 23 h 59) · Livrables étudiants : gabarit Excel complété (renommé TP2_CodePermanent.xlsx) + PDF de la note au promoteur.
4 −- **Données 100 % réelles extraites de www.uqo-eval.app le 29 octobre 2026** : cas d'étude « Cas 9 — Quadruplex 2 étages, Gatineau (RSMeans 2026 T4) » du module Quantity Survey (`https://www.uqo-eval.app/quantity-survey/projets/97fa1d2a-06e1-4ed3-a580-0728616915ce`, créé pour ce TP par `scripts/qs-seed-cases.mts "Cas 9"` sur M2U64) : plans des 3 niveaux (`enonce/assets/plan-*.png`), fiche technique, relevé des quantités (49 mesures), révision r1 de 64 lignes tarifées RSMeans 2026 T4 localisées Gatineau (C57) → direct nu 471 085 $, total r1 611 823 $ ; 11 ventes réelles de quadruplex neufs (2021-2024) vendus 2024-2025 (Registre foncier ⋈ rôle) ; 2 quadruplex de 2020 en vigueur (280 Champlain, 335 Hippodrome, photos) ; moteur de coût UQO Éval (RCN 827 445 $) ; photos du 1151, rue Notre-Dame (vente Q11).
4 +- **Données 100 % réelles extraites de www.uqo-eval.app le 29 octobre 2026** : cas d'étude « Cas 9 — Quadruplex 2 étages, Gatineau (RSMeans 2026 T4) » du module Quantity Survey (`https://www.uqo-eval.app/quantity-survey/projets/97fa1d2a-06e1-4ed3-a580-0728616915ce`, créé pour ce TP par `scripts/qs-seed-cases.mts "Cas 9"` sur M2U64) : plans des 3 niveaux (`enonce/assets/plan-*.png`), fiche technique, relevé des quantités (49 mesures), révision r1 de 64 lignes tarifées RSMeans 2026 T4 localisées Gatineau (C57) **condensée en 22 composantes à prix composites nus** (version allégée du 29 oct. soir, à la demande du prof : « moins intense mais quand même complexe ») → direct nu 471 085 $, total r1 611 823 $ ; 8 ventes réelles (sur 11 extraites) de quadruplex neufs (2021-2024) vendus 2024-2025 (Registre foncier ⋈ rôle) ; 2 quadruplex de 2020 en vigueur (280 Champlain, 335 Hippodrome, photos) ; moteur de coût UQO Éval (RCN 827 445 $) ; photos du 1151, rue Notre-Dame (vente Q11).
5 5 - **Plus de personnalisation par code permanent** : même cas pour tous ; la note récompense la chaîne de calcul (conversions, assiettes, ordre des majorations) et la lecture (conventions, marché, limites).
6 −- 10 questions / 100 pts : méthode (6) · du plan au relevé, 12 grandeurs (10) · tarification des 64 lignes, SOMME.SI par division, top 3 (16) · coûts nus → directs du cours → contingences = r1 (8) · permis Gatineau MAX + GCR (8) · intercalaires 6,75 % × ½ (10) · honoraires, assurance, total indirects (8) · profit 11 %, coût total **759 115 $** (177,18 $/pi² hors sol, 189 779 $/logement) (8) · marché : bâtiment implicite médian 879 896 $, profit extrait 28,7 %, moteur −8,3 %, Altus (14) · dashboard + note (12).
7 −- `enonce/` et `gabarit_excel/` : **à distribuer** · `solutionnaire_enseignant/` : **réservé** (PDF + `IMM1033-20_TP2_solutionnaire.xlsx` : formules réelles, 74 cellules vérifiées par recalcul Excel) · `donnees/` : extraits bruts (JSON du cas, ventes, moteur, photos originales).
8 −- Scripts (`05_Ressources/scripts_gabarits_excel/`) : `build_tp2_donnees.py` (extraits JSON → `tp2_donnees.py`), `make_IMM1033_TP2.py` (gabarit v2 avec suivi de progression), `tp2_solutions.py` (valeurs de référence), `make_IMM1033_TP2_solution.py` + `verif_attendus_tp2.py` (solutionnaire Excel + vérification `verif_solution_xlsx.py`). Tableaux LaTeX longs générés par le script inclus dans `enonce/` (bloc python du 2026-10-29) → `tables_tp2*.tex`.
6 +- 10 questions / 100 pts : méthode (8) · du plan au relevé, 7 grandeurs (8) · bordereau des 22 composantes, SOMME.SI par division, top 3 (12) · coûts nus → directs du cours → contingences = r1 ± 50 $ (8) · permis Gatineau MAX + GCR (8) · intercalaires 6,75 % × ½ (10) · honoraires, assurance, total indirects (8) · profit 11 %, coût total **759 152 $** (177,19 $/pi² hors sol, 189 788 $/logement) (10) · marché : bâtiment implicite médian 866 833 $ (8 ventes), profit extrait 26,7 %, moteur −8,3 %, Altus (14) · dashboard + note (14).
7 +- `enonce/` et `gabarit_excel/` : **à distribuer** · `solutionnaire_enseignant/` : **réservé** (PDF + `IMM1033-20_TP2_solutionnaire.xlsx` : formules réelles, 71 cellules vérifiées par recalcul Excel) · `donnees/` : extraits bruts (JSON du cas, ventes, moteur, photos originales).
8 +- Scripts (`05_Ressources/scripts_gabarits_excel/`) : `build_tp2_donnees.py` (extraits JSON → `tp2_donnees.py` : LIGNES 64, COMPOSANTES 22, GRANDEURS 7, VENTES 11 + VENTES_TP 8), `make_IMM1033_TP2.py` (gabarit v2 avec suivi de progression), `tp2_solutions.py` (valeurs de référence), `make_IMM1033_TP2_solution.py` + `verif_attendus_tp2.py` (solutionnaire Excel + vérification `verif_solution_xlsx.py`). Tableaux LaTeX (composantes, relevé abrégé, divisions, ventes, moteur) générés par bloc python (2026-10-29) → `enonce/tables_tp2*.tex`.
9 9 - Recompiler : `cd enonce && latexmk -lualatex IMM1033-20_TP2_enonce.tex` (idem solutionnaire).
10 10 - Rafraîchir : re-seed du cas sur M2U64 (`zsh -lc 'npx tsx scripts/qs-seed-cases.mts "Cas 9"'`), export `tmp/export-cases.mts` → `donnees/qs-cas9/`, requêtes ventes (`/tmp/q_quad.py` du 2026-10-29 : `units.nb_logements=4`, `annee_construction>=2021`, ventes ≥ 2023), moteur (`POST /api/cost/estimate`), puis `build_tp2_donnees.py` → gabarit → solution → vérification → PDF.
modified IMM1033-20_Methodes_du_cout/03_Travaux_pratiques/TP2_Bordereau_de_cout_neuf/enonce/IMM1033-20_TP2_enonce.pdf +0 −0

Binary file not shown.

modified IMM1033-20_Methodes_du_cout/03_Travaux_pratiques/TP2_Bordereau_de_cout_neuf/enonce/IMM1033-20_TP2_enonce.tex +76 −80
@@ -17,7 +17,7 @@
17 17 \setexamDuree{Travail individuel à la maison (gabarit Excel obligatoire + laboratoire UQO Éval)}
18 18 \setexamRemise{Séance 9 (12 novembre 2026, 23 h 59) --- dépôt Moodle (fichier Excel + PDF de la note au promoteur)}
19 19 \setexamPonderation{15 \% de la note finale}
20 −\setexamCouverture{Bordereau de coût de remplacement neuf : quadruplex de 2 étages à Gatineau --- relevé des quantités, prix RSMeans 2026, coûts indirects réels, profit et test du marché avec UQO Éval}
20 +\setexamCouverture{Bordereau de coût de remplacement neuf : quadruplex de 2 étages à Gatineau --- composantes tarifées RSMeans 2026, coûts indirects réels, profit et test du marché avec UQO Éval}
21 21
22 22 % --- Palette complémentaire (Excel + UQO Éval) ---
23 23 \definecolor{xlVert}{RGB}{33,115,70}
@@ -87,15 +87,15 @@
87 87
88 88 \begin{miseengarde}[Deux avertissements importants]
89 89 \begin{itemize}[leftmargin=14pt, itemsep=2pt]
90 − \item \textbf{Aucun paramètre personnalisé.} Plus de montant qui dépend de votre code permanent : toutes les copies travaillent sur le \textbf{même cas réel}. Ce qui distingue votre copie, c'est la \textbf{rigueur de la chaîne de calcul} (conversions, assiettes, ordre des majorations) et la \textbf{qualité de votre lecture} (conventions, marché, limites).
91 − \item \textbf{Prix publiés, pas des soumissions.} Les prix unitaires sont des prix \emph{nus} (matériaux, main-d'œuvre, équipement) de RSMeans 2026, 4\up{e} trimestre, localisés pour Gatineau. Un entrepreneur y ajoute ses conditions générales, ses frais généraux et son profit --- c'est l'objet de la question 4 --- et une soumission réelle peut s'en écarter. Vous devez \textbf{nommer cette limite}.
90 + \item \textbf{Aucun paramètre personnalisé.} Plus de montant qui dépend de votre code permanent : toutes les copies travaillent sur le \textbf{même cas réel}. Ce qui distingue votre copie, c'est la \textbf{rigueur de la chaîne de calcul} (assiettes, ordre des majorations) et la \textbf{qualité de votre lecture} (conventions, marché, limites).
91 + \item \textbf{Prix publiés, pas des soumissions.} Les prix unitaires sont des prix \emph{nus} composites (matériaux, main-d'œuvre, équipement) dérivés de RSMeans 2026, 4\up{e} trimestre, localisés pour Gatineau. Un entrepreneur y ajoute ses conditions générales, ses frais généraux et son profit --- c'est l'objet de la question 4 --- et une soumission réelle peut s'en écarter. Vous devez \textbf{nommer cette limite}.
92 92 \end{itemize}
93 93 \end{miseengarde}
94 94
95 95 % ------------------------------------------------------------------------------
96 96 \partieexamen{Mise en situation}{}
97 97
98 −Nous sommes le \textbf{29 octobre 2026}. Un promoteur de Gatineau détient un lot desservi du secteur Gatineau (rue Raymond) et projette d'y construire un \textbf{quadruplex locatif de 2 étages} : deux logements de deux chambres par étage, sous-sol non fini commun, brique à 80~\%, toit plat à membrane, plinthes électriques --- le même programme que les quadruplex neufs qui se vendent dans le secteur (figure~\ref{fig:photos}). Avant de déposer sa demande de financement, il vous mandate pour établir le \textbf{bordereau complet du coût de remplacement neuf} de l'immeuble : coûts directs par \textbf{relevé des quantités} (séance 7), coûts indirects \textbf{réels} (séance 8), profit entrepreneurial, puis \textbf{validation} contre le marché des quadruplex neufs, le moteur de coût d'UQO Éval et les guides de coûts. Dans la méthode du coût, ce bordereau est la deuxième pierre de l'édifice : $V = V_{\text{terrain}} + (C_{\text{neuf}} - D)$.
98 +Nous sommes le \textbf{29 octobre 2026}. Un promoteur de Gatineau détient un lot desservi du secteur Gatineau (rue Raymond) et projette d'y construire un \textbf{quadruplex locatif de 2 étages} : deux logements de deux chambres par étage, sous-sol non fini commun, brique à 80~\%, toit plat à membrane, plinthes électriques --- le même programme que les quadruplex neufs qui se vendent dans le secteur (figure~\ref{fig:photos}). Avant de déposer sa demande de financement, il vous mandate pour établir le \textbf{bordereau complet du coût de remplacement neuf} de l'immeuble : coûts directs par \textbf{composantes issues du relevé des quantités} (séances 6 et 7), coûts indirects \textbf{réels} (séance 8), profit entrepreneurial, puis \textbf{validation} contre le marché des quadruplex neufs, le moteur de coût d'UQO Éval et les guides de coûts. Dans la méthode du coût, ce bordereau est la deuxième pierre de l'édifice : $V = V_{\text{terrain}} + (C_{\text{neuf}} - D)$.
99 99
100 100 \begin{figure}[htbp]
101 101 \centering
@@ -109,7 +109,7 @@ Nous sommes le \textbf{29 octobre 2026}. Un promoteur de Gatineau détient un lo
109 109 \includegraphics[width=\linewidth]{assets/nd-1151-cuisine.jpg}
110 110 \end{tcolorbox}
111 111 \end{minipage}
112 −\caption{Un quadruplex neuf du secteur : 1151, rue Notre-Dame (Gatineau), livré en 2024 et vendu 849\,411~\$ le 7 mai 2024 (vente Q11 du tableau 9) --- deux logements à l'étage, deux au rez-de-jardin, brique et revêtement sombre, escaliers extérieurs. Photos de l'inscription (RE/MAX Québec), reproduites à des fins pédagogiques.}
112 +\caption{Un quadruplex neuf du secteur : 1151, rue Notre-Dame (Gatineau), livré en 2024 et vendu 849\,411~\$ le 7 mai 2024 (vente Q8 du tableau 8) --- deux logements à l'étage, deux au rez-de-jardin, brique et revêtement sombre, escaliers extérieurs. Photos de l'inscription (RE/MAX Québec), reproduites à des fins pédagogiques.}
113 113 \label{fig:photos}
114 114 \end{figure}
115 115
@@ -121,16 +121,16 @@ Nous sommes le \textbf{29 octobre 2026}. Un promoteur de Gatineau détient un lo
121 121 \toprule
122 122 & \textbf{Question} & \textbf{Onglet Excel} & \textbf{Points} \\
123 123 \midrule
124 −\textcolor{uqoBleuClair}{\faIcon{sitemap}} & 1. Méthode d'estimation et nature du coût & \onglet{Relevé} & 6 \\
125 −\textcolor{uqoBleuClair}{\faIcon{drafting-compass}} & 2. Du plan au relevé des quantités & \onglet{Relevé} & 10 \\
126 −\textcolor{uqoBleuClair}{\faIcon{calculator}} & 3. Tarification RSMeans des 64 lignes & \onglet{Relevé} & 16 \\
124 +\textcolor{uqoBleuClair}{\faIcon{sitemap}} & 1. Méthode d'estimation et nature du coût & \onglet{Relevé} & 8 \\
125 +\textcolor{uqoBleuClair}{\faIcon{drafting-compass}} & 2. Du plan au relevé : sept grandeurs & \onglet{Relevé} & 8 \\
126 +\textcolor{uqoBleuClair}{\faIcon{calculator}} & 3. Bordereau des 22 composantes & \onglet{Relevé} & 12 \\
127 127 \textcolor{uqoOr!85!black}{\faIcon{layer-group}} & 4. Des coûts nus aux coûts directs du cours & \onglet{Bordereau} & 8 \\
128 128 \textcolor{uqoOr!85!black}{\faIcon{file-signature}} & 5. Permis réel de Gatineau et garantie GCR & \onglet{Bordereau} & 8 \\
129 129 \textcolor{uqoOr!85!black}{\faIcon{percentage}} & 6. Intérêts intercalaires & \onglet{Bordereau} & 10 \\
130 130 \textcolor{uqoOr!85!black}{\faIcon{briefcase}} & 7. Autres indirects et total & \onglet{Bordereau} & 8 \\
131 −\textcolor{uqoOr!85!black}{\faIcon{coins}} & 8. Profit entrepreneurial, coût total, unités de comparaison & \onglet{Bordereau} & 8 \\
131 +\textcolor{uqoOr!85!black}{\faIcon{coins}} & 8. Profit entrepreneurial, coût total, unités de comparaison & \onglet{Bordereau} & 10 \\
132 132 \textcolor{uqoBleuEval}{\faIcon{balance-scale}} & 9. Validation : marché, moteur de coût, Altus & \onglet{Marché} & 14 \\
133 −\textcolor{uqoVert}{\faIcon{tachometer-alt}} & 10. Tableau de bord et note au promoteur & \onglet{Dashboard} \onglet{Note} & 12 \\
133 +\textcolor{uqoVert}{\faIcon{tachometer-alt}} & 10. Tableau de bord et note au promoteur & \onglet{Dashboard} \onglet{Note} & 14 \\
134 134 \bottomrule
135 135 \end{tabular}
136 136 \end{center}
@@ -138,10 +138,10 @@ Nous sommes le \textbf{29 octobre 2026}. Un promoteur de Gatineau détient un lo
138 138
139 139 \begin{surlelabo}[Le laboratoire UQO Éval --- ce que vous y trouverez pour ce travail]
140 140 \begin{itemize}[leftmargin=14pt, itemsep=2pt]
141 − \item \textbf{Le cas d'étude} \web{/quantity-survey/projets/97fa1d2a-…} (« Cas 9 --- Quadruplex 2 étages, Gatineau ») : les plans des trois niveaux dans le Plan Studio, la fiche technique, le relevé des quantités et la révision r1 tarifée RSMeans --- ligne par ligne, avec la source de chaque prix. Le cas est verrouillé : dupliquez-le pour expérimenter (changer la brique pour du vinyle, finir le sous-sol…).
141 + \item \textbf{Le cas d'étude} \web{/quantity-survey/projets/97fa1d2a-…} (« Cas 9 --- Quadruplex 2 étages, Gatineau ») : les plans des trois niveaux dans le Plan Studio, la fiche technique, le relevé complet des quantités (49 mesures) et la révision r1 tarifée RSMeans --- les 64 lignes dont sont tirées les 22 composantes du tableau 4, avec la source de chaque prix. Le cas est verrouillé : dupliquez-le pour expérimenter (changer la brique pour du vinyle, finir le sous-sol…).
142 142 \item \textbf{Quantity Survey} \web{/quantity-survey} : l'explorateur RSMeans (18 villes du Québec, 4 livres) pour comparer un prix de Gatineau à celui de Montréal ou de Québec.
143 − \item \textbf{Coût} \web{/cout} : le moteur de coût par composantes (prix observés Canac, BMR, Patrick Morin; taux APCHQ) --- l'estimation du tableau 11 en provient.
144 − \item \textbf{Analyser une propriété} \web{} : recherchez une adresse du tableau 9 pour lire l'unité du rôle (aire d'étages, terrain, valeurs).
143 + \item \textbf{Coût} \web{/cout} : le moteur de coût par composantes (prix observés Canac, BMR, Patrick Morin; taux APCHQ) --- l'estimation du tableau 10 en provient.
144 + \item \textbf{Analyser une propriété} \web{} : recherchez une adresse du tableau 8 pour lire l'unité du rôle (aire d'étages, terrain, valeurs).
145 145 \item \textbf{Éva} \web{/assistant} : assistante pédagogique qui explique une ligne RSMeans, une unité ou une majoration.
146 146 \end{itemize}
147 147 \end{surlelabo}
@@ -212,31 +212,28 @@ Rez-de-chaussée & 176,40 & 170,8 & 57,40 & 140,06 & 108,38 & 31,68 & 12 & 4 & 5
212 212 \footnotesize Aires de murs mesurées à l'axe (périmètre $\times$ 2,44~m); l'aire nette déduit les ouvertures. Les 12 fenêtres d'un niveau : 2 de 1,8 $\times$ 1,3~m et 2 de 1,2 $\times$ 1,3~m par logement, plus la fenêtre de salle de bain; les 4 portes : une porte d'entrée et une porte-patio par logement.
213 213 \end{donnees}
214 214
215 −{\footnotesize
216 −\input{tables_tp2}
217 −}
215 +\begin{donnees}[Tableau 3 --- Relevé abrégé d'UQO Éval : les sept grandeurs que vous reproduirez à la question 2 \hfill \xl{Données}{B38:G44}]
216 +\begin{center}
217 +\small
218 +\rowcolors{2}{uqoBgClair!70}{white}
219 +\input{tables_tp2_releve}
220 +\end{center}
221 +\smallskip
222 +\footnotesize Valeurs du relevé automatique d'UQO Éval (metre-qs-1.0) à partir des plans et de la fiche. Le relevé complet (49 mesures) et les 64 lignes RSMeans de la révision r1 restent consultables sur la fiche du cas.
223 +\end{donnees}
218 224
219 −\begin{donnees}[Tableau 5 --- Conversion des unités du relevé (SI) vers les unités RSMeans \hfill \xl{Données}{B159:E163}]
225 +\begin{donnees}[Tableau 4 --- Le bordereau en 22 composantes : quantités du relevé (unités SI) et prix composites NUS par unité (matériaux, main-d'œuvre, équipement), dérivés des lignes RSMeans 2026 T4 localisées Gatineau \hfill \xl{Données}{B49:N70}]
220 226 \begin{center}
221 −\footnotesize
227 +\scriptsize
228 +\setlength{\tabcolsep}{2.8pt}
222 229 \rowcolors{2}{uqoBgClair!70}{white}
223 −\begin{tabular}{@{}llll@{}}
224 −\toprule
225 −\textbf{Unité du relevé} & \textbf{Unité RSMeans} & \textbf{Facteur ($\times$ quantité)} & \textbf{Rappel} \\
226 −\midrule
227 −m & pi lin. & 3,280840 & 1 m $=$ 3,28084 pi \\
228 −m\up{2} & pi\up{2} & 10,763910 & 1 m\up{2} $=$ 10,7639 pi\up{2} \\
229 −m\up{3} & vg\up{3} & 1,307951 & 1 m\up{3} $=$ 1,30795 vg\up{3} \\
230 −unité & unité (Ea.) & 1 & \\
231 −forfait & forfait (lump sum) & 1 & \\
232 −\bottomrule
233 −\end{tabular}
230 +\input{tables_tp2}
234 231 \end{center}
235 232 \smallskip
236 −\footnotesize Le \textbf{facteur d'ajustement} du tableau 4 traduit une particularité du poste : poutre LVL à 3~plis ($\times$~3), fermes tarifées par pi\up{2} de plancher ($\times$~0,93), isolant R-38 épaissi pour R-50 ($\times$~1,32), XPS en deux couches ($\times$~2), descentes pluviales ($\times$~0,35 de la longueur des gouttières), membrane en deux couches ($\times$~2). Quantité RSMeans $=$ quantité du relevé $\times$ facteur $\times$ conversion.
233 +\footnotesize Prix \textbf{nus} (\emph{bare costs}) : matériaux $+$ main-d'œuvre $+$ équipement, hors conditions générales, frais généraux et profit de l'entrepreneur (appliqués à la question 4). Un prix composite $=$ somme des lignes RSMeans de la composante $\div$ quantité de référence : la toiture complète en \$/m\up{2} de toit comprend fermes, support, membrane, soffites et gouttières; l'ossature de bois en \$/m\up{2} de mur comprend murs 2$\times$6, contreplaqué, cloisons, poutre et colonnes. Trois postes viennent du catalogue de prix observés d'UQO Éval (branchements, drainage, VRC).
237 234 \end{donnees}
238 235
239 −\begin{donnees}[Tableau 6 --- Divisions MasterFormat présentes et direct nu par division selon la révision r1 (contrôle de la question 3) \hfill \xl{Données}{B167:E179}]
236 +\begin{donnees}[Tableau 5 --- Divisions MasterFormat présentes et direct nu par division selon la révision r1, composantes regroupées (contrôle de la question 3) \hfill \xl{Données}{B75:E86}]
240 237 \begin{center}
241 238 \small
242 239 \rowcolors{2}{uqoBgClair!70}{white}
@@ -244,7 +241,7 @@ forfait & forfait (lump sum) & 1 & \\
244 241 \end{center}
245 242 \end{donnees}
246 243
247 −\begin{donnees}[Tableau 7 --- Majorations appliquées par le moteur Quantity Survey d'UQO Éval (ordre d'application de la révision r1) \hfill \xl{Données}{B183:E188}]
244 +\begin{donnees}[Tableau 6 --- Majorations appliquées par le moteur Quantity Survey d'UQO Éval (ordre d'application de la révision r1) \hfill \xl{Données}{B91:E96}]
248 245 \begin{center}
249 246 \small
250 247 \rowcolors{2}{uqoBgClair!70}{white}
@@ -252,12 +249,12 @@ forfait & forfait (lump sum) & 1 & \\
252 249 \toprule
253 250 \textbf{Étape} & \textbf{Valeur} & \textbf{Note} \\
254 251 \midrule
255 −Ajustement régional Gatineau sur les 3 postes du catalogue UQO Éval & 255,83~\$ & matériaux $\times$ 1,02, équipement $\times$ 1,01; les 61 lignes RSMeans sont déjà localisées \\
252 +Ajustement régional Gatineau sur les 3 postes du catalogue UQO Éval & 255,83~\$ & matériaux $\times$ 1,02, équipement $\times$ 1,01; les lignes RSMeans sont déjà localisées \\
256 253 Conditions générales du chantier & 8~\% des directs nus localisés & mobilisation, gestion, clôtures, toilettes, nettoyage \\
257 254 Frais généraux de l'entrepreneur & 7~\% du cumul précédent & bureau, assurances de l'entreprise, estimation \\
258 255 Profit de l'entrepreneur général & 8~\% du cumul précédent & $\neq$ profit entrepreneurial du promoteur (question 8) \\
259 256 Contingences de construction & 5~\% des directs nus localisés & imprévus de chantier \\
260 −\textbf{Total de la révision r1} & \textbf{611\,823,07~\$} & à retrouver à la question 4 ($\pm$ 25~\$ d'arrondi) \\
257 +\textbf{Total de la révision r1} & \textbf{611\,823,07~\$} & à retrouver à la question 4 ($\pm$ 50~\$ d'arrondi) \\
261 258 \bottomrule
262 259 \end{tabular}
263 260 \end{center}
@@ -265,7 +262,7 @@ Contingences de construction & 5~\% des directs nus localisés & imprévus de ch
265 262 \footnotesize \textbf{Convention du cours.} Les \textbf{coûts directs au sens du cours} sont ceux qu'un entrepreneur général facturerait : directs nus $+$ conditions générales $+$ frais généraux $+$ profit de l'entrepreneur (séance 7). Les \textbf{contingences} s'ajoutent ensuite. Le \textbf{profit entrepreneurial} du promoteur (séance 8) est une autre chose : il se calcule à la question 8 sur directs $+$ contingences $+$ indirects.
266 263 \end{donnees}
267 264
268 −\begin{donnees}[Tableau 8 --- Paramètres réels des coûts indirects, du profit, des taxes et des références (consultés le 29 octobre 2026) \hfill \xl{Données}{B192:E207}]
265 +\begin{donnees}[Tableau 7 --- Paramètres réels des coûts indirects, du profit, des taxes et des références (consultés le 29 octobre 2026) \hfill \xl{Données}{B100:E115}]
269 266 \begin{center}
270 267 \footnotesize
271 268 \rowcolors{2}{uqoBgClair!70}{white}
@@ -292,7 +289,7 @@ Indexation du rôle terrain & ratio médian prix vendu $\div$ rôle terrain \tex
292 289 \footnotesize Convention des intérêts intercalaires (séance 8) : $I = (D_c + \text{contingences}) \times i \times \dfrac{T}{12} \times \tfrac{1}{2}$, où $i$ est le taux du prêt de construction et $T$ la durée du chantier en mois.
293 290 \end{donnees}
294 291
295 −\begin{donnees}[Tableau 9 --- Onze ventes RÉELLES de quadruplex neufs (construits 2021--2024) à Gatineau, 2024--2025 \hfill \xl{Données}{B211:N221}]
292 +\begin{donnees}[Tableau 8 --- Huit ventes RÉELLES de quadruplex neufs de 2 étages (construits 2021--2024) à Gatineau, 2024--2025 \hfill \xl{Données}{B119:N126}]
296 293 \begin{center}
297 294 \tiny
298 295 \setlength{\tabcolsep}{2.4pt}
@@ -300,10 +297,10 @@ Indexation du rôle terrain & ratio médian prix vendu $\div$ rôle terrain \tex
300 297 \input{tables_tp2_ventes}
301 298 \end{center}
302 299 \smallskip
303 −\footnotesize Ventes du Registre foncier jumelées au rôle 2024-2026 (conditions du marché au 1\up{er} juillet 2022). \textbf{Aire d'étages} $=$ superficie hors sol des étages; dans ces quadruplex, deux des quatre logements occupent généralement le rez-de-jardin (sous-sol aménagé) --- une différence avec le projet. Q11 : vente de livraison de mai 2024 (figure~\ref{fig:photos}). Source : UQO Éval.
300 +\footnotesize Ventes du Registre foncier jumelées au rôle 2024-2026 (conditions du marché au 1\up{er} juillet 2022). \textbf{Aire d'étages} $=$ superficie hors sol des étages; dans ces quadruplex, deux des quatre logements occupent généralement le rez-de-jardin (sous-sol aménagé) --- une différence avec le projet. Q8 : vente de livraison de mai 2024 (figure~\ref{fig:photos}). Source : UQO Éval.
304 301 \end{donnees}
305 302
306 −\begin{donnees}[Tableau 10 --- Deux quadruplex de 2020 en vigueur à Gatineau (prix demandés réels) \hfill \xl{Données}{B226:N227}]
303 +\begin{donnees}[Tableau 9 --- Deux quadruplex de 2020 en vigueur à Gatineau (prix demandés réels, pour la lecture de la question 9) \hfill \xl{Données}{B131:N132}]
307 304 \begin{center}
308 305 \scriptsize
309 306 \setlength{\tabcolsep}{2.5pt}
@@ -325,7 +322,7 @@ A2 & 335, av. de l'Hippodrome (Aylmer) & 1\,289\,900 & 299,1 & 3 & 76\,800 & 210
325 322 \ficheimm{hippodrome-335.jpg}{A2}{335, av. de l'Hippodrome}{Aylmer (Lakeview)}{Quadruplex 2020 en rangée, 3 étages · 2 $\times$ 2 ch. $+$ 2 $\times$ 1 ch. · qualité supérieure · thermopompes}{Prix demandé \textbf{1\,289\,900 \$}}{Rôle bât. \textbf{752\,800 \$}}
326 323
327 324 \vspace{8pt}
328 −\begin{donnees}[Tableau 11 --- Estimation du moteur de coût d'UQO Éval pour le même programme (méthode par composantes, 29 octobre 2026) \hfill \xl{Données}{B231:E256}]
325 +\begin{donnees}[Tableau 10 --- Estimation du moteur de coût d'UQO Éval pour le même programme (méthode par composantes, 29 octobre 2026) \hfill \xl{Données}{B136:E161}]
329 326 \begin{minipage}[t]{0.52\textwidth}
330 327 \scriptsize
331 328 \rowcolors{2}{uqoBgClair!70}{white}
@@ -359,45 +356,45 @@ Indice de confiance & B (43~\% des matériaux sur prix observés) \\
359 356
360 357 Chaque question indique l'\textbf{emplacement exact de la réponse} dans le gabarit par un badge \xl{Onglet}{plage}. L'onglet \onglet{Données} ne doit jamais être modifié. Les formules attendues sont données en français; les équivalents anglais sont rappelés entre parenthèses.
361 358
362 −\begin{questionexam}{\faIcon{sitemap}\quad Méthode d'estimation et nature du coût estimé}{6}
363 −\xl{Relevé}{C5} (6 à 9 lignes). Parmi les quatre méthodes d'estimation du coût neuf vues à la séance 6 --- comparative (\$/pi\up{2} d'un guide), par composantes (unités en place), par \textbf{relevé des quantités} (\emph{quantity survey}) et indexée --- justifiez le choix du relevé des quantités pour ce mandat, en vous appuyant sur ce que le promoteur possède (tableaux 1 à 4). Dites ce que les trois autres méthodes apporteraient (ou non) ici. Expliquez ensuite pourquoi le bordereau d'un projet neuf est \textbf{par définition} un coût de \textbf{remplacement} et non de reproduction (séance 5), et nommez deux \textbf{limites} du bordereau que vous allez produire (nature des plans, nature des prix).
359 +\begin{questionexam}{\faIcon{sitemap}\quad Méthode d'estimation et nature du coût estimé}{8}
360 +\xl{Relevé}{C5} (6 à 9 lignes). Parmi les quatre méthodes d'estimation du coût neuf vues à la séance 6 --- comparative (\$/pi\up{2} d'un guide), par \textbf{composantes} (unités en place), par relevé détaillé des quantités (\emph{quantity survey}) et indexée --- justifiez la méthode de ce travail : un bordereau par \textbf{composantes nourri par un vrai relevé} (tableaux 3 et 4), en vous appuyant sur ce que le promoteur possède. Dites ce que les trois autres méthodes apporteraient (ou non) ici. Expliquez ensuite pourquoi le bordereau d'un projet neuf est \textbf{par définition} un coût de \textbf{remplacement} et non de reproduction (séance 5), et nommez deux \textbf{limites} du bordereau que vous allez produire (nature des plans, nature des prix).
364 361 \end{questionexam}
365 362
366 −\begin{questionexam}{\faIcon{drafting-compass}\quad Du plan au relevé des quantités}{10}
367 −Onglet \onglet{Relevé}. Le relevé d'UQO Éval (tableau 3) est généré depuis les plans et la fiche; vous allez en \textbf{reproduire douze grandeurs} par formule, à partir des dimensions du tableau 1 (liées dans \xl{Données}{D11:D24}) et des totaux des plans (tableau 2, liés en \cel{Relevé!E12:G12}) :
363 +\begin{questionexam}{\faIcon{drafting-compass}\quad Du plan au relevé : sept grandeurs}{8}
364 +Onglet \onglet{Relevé}. Le relevé d'UQO Éval (tableau 3) est généré depuis les plans et la fiche; vous allez en \textbf{reproduire sept grandeurs} par formule, à partir des dimensions du tableau 1 (liées dans \xl{Données}{D11:D24}) et des totaux des plans (tableau 2, liés en \cel{Relevé!E12:G12}) :
368 365 \begin{enumerate}[label=\alph*), itemsep=2pt]
369 − \item \xl{Relevé}{F16:F27} : empreinte $=(L+\text{ép.})\times(P+\text{ép.})$; périmètre à l'axe $=2(L+P)$; excavation $=(\text{empreinte}+0{,}9\times\text{périmètre})\times\text{profondeur}$; remblai $=\text{périmètre}\times0{,}9\times(\text{profondeur}-0{,}3)$; murs de fondation $=\text{périmètre}\times h_{\text{fond}}$; membrane $=\text{périmètre}\times(h_{\text{fond}}-\text{hors sol})$; murs extérieurs bruts $=\text{périmètre}\times h_{\text{étage}}\times\text{niveaux}$; murs extérieurs nets $=$ bruts $-$ ouvertures; surface de toit $=\text{empreinte}\times\text{pente}\times\text{débords}$; planchers portés $=\Sigma$ aires des pièces; gypse des murs $=$ murs nets $+2\times$ cloisons; peinture $=$ gypse murs $+$ aires des pièces (plafonds);
370 − \item \xl{Relevé}{H16:H27} : l'\textbf{écart} en \% entre votre calcul et la valeur d'UQO Éval (liée en colonne G). Un écart non nul signale une erreur de lecture du plan ou de formule --- la mise en forme conditionnelle vous le dira.
366 + \item \xl{Relevé}{F16:F22} : empreinte $=(L+\text{ép.})\times(P+\text{ép.})$; périmètre à l'axe $=2(L+P)$; murs de fondation $=\text{périmètre}\times h_{\text{fond}}$; murs extérieurs bruts $=\text{périmètre}\times h_{\text{étage}}\times\text{niveaux}$; murs extérieurs nets $=$ bruts $-$ ouvertures; surface de toit $=\text{empreinte}\times\text{pente}\times\text{débords}$; planchers portés $=\Sigma$ aires des pièces hors sol;
367 + \item \xl{Relevé}{H16:H22} : l'\textbf{écart} en \% entre votre calcul et la valeur d'UQO Éval (liée en colonne G). Un écart non nul signale une erreur de lecture du plan ou de formule --- la mise en forme conditionnelle vous le dira.
371 368 \end{enumerate}
372 369 \begin{formule}
373 −$\text{Excavation} = (199{,}02 + 0{,}9 \times 57{,}40) \times 2{,}60$ \qquad soit \fx{=(F16+0,9*F17)*Données!D17}
370 +$\text{Murs extérieurs bruts} = 57{,}40 \times 2{,}44 \times 2$ \qquad soit \fx{=F17*Données!D14*Données!D10}
374 371 \end{formule}
372 +Ces sept grandeurs sont les quantités de référence des composantes 3 et 5 à 10 du tableau 4.
375 373 \end{questionexam}
376 374
377 −\begin{questionexam}{\faIcon{calculator}\quad Tarification RSMeans des 64 lignes}{16}
378 −Onglet \onglet{Relevé}, lignes 32 à 95 (les 64 lignes du tableau 4 y sont liées : quantité, unité, facteur, unité RSMeans, trois prix unitaires nus). Pour \textbf{chaque ligne}, par formule copiée vers le bas :
375 +\begin{questionexam}{\faIcon{calculator}\quad Bordereau des 22 composantes}{12}
376 +Onglet \onglet{Relevé}, lignes 27 à 48 (les 22 composantes du tableau 4 y sont liées : quantité, unité, trois prix composites nus). Pour \textbf{chaque composante}, par formule copiée vers le bas :
379 377 \begin{enumerate}[label=\alph*), itemsep=2pt]
380 − \item \xl{Relevé}{K32:K95} : le \textbf{facteur de conversion} lu dans le tableau 5 avec \fx{RECHERCHEV} (\fx{VLOOKUP}) sur l'unité du relevé;
381 − \item \xl{Relevé}{L32:L95} : la \textbf{quantité RSMeans} $=$ quantité du relevé $\times$ facteur d'ajustement $\times$ conversion;
382 − \item \xl{Relevé}{P32:P95} : le \textbf{coût unitaire nu} $=$ matériaux $+$ main-d'œuvre $+$ équipement;
383 − \item \xl{Relevé}{Q32:Q95} : le \textbf{montant} $=$ quantité RSMeans $\times$ coût unitaire; puis \xl{Relevé}{Q96} : le \textbf{coût direct nu total};
384 − \item \xl{Relevé}{E98:E101} : les montants totaux des matériaux, de la main-d'œuvre et de l'équipement (\fx{SOMMEPROD} / \fx{SUMPRODUCT}) et la \textbf{part de la main-d'œuvre};
385 − \item \xl{Relevé}{E105:F117} : le \textbf{sous-total de chaque division} MasterFormat (\fx{SOMME.SI} / \fx{SUMIF} sur la colonne des codes) et sa part; la colonne H compare au tableau 6;
386 − \item \xl{Relevé}{C121:C123} et \xl{Relevé}{E121:E123} : les \textbf{trois postes les plus lourds} (\fx{GRANDE.VALEUR} / \fx{LARGE}, puis \fx{INDEX} + \fx{EQUIV} / \fx{MATCH}).
378 + \item \xl{Relevé}{K27:K48} : le \textbf{coût unitaire nu} $=$ matériaux $+$ main-d'œuvre $+$ équipement;
379 + \item \xl{Relevé}{L27:L48} : le \textbf{montant} $=$ quantité $\times$ coût unitaire;
380 + \item \xl{Relevé}{L49} : le \textbf{coût direct nu total};
381 + \item \xl{Relevé}{E51:E54} : les montants totaux des matériaux, de la main-d'œuvre et de l'équipement (\fx{SOMMEPROD} / \fx{SUMPRODUCT}) et la \textbf{part de la main-d'œuvre};
382 + \item \xl{Relevé}{E58:F69} : le \textbf{sous-total de chaque division} MasterFormat (\fx{SOMME.SI} / \fx{SUMIF} sur la colonne des codes) et sa part; la colonne H compare au tableau 5;
383 + \item \xl{Relevé}{C72:C74} et \xl{Relevé}{E72:E74} : les \textbf{trois composantes les plus lourdes} (\fx{GRANDE.VALEUR} / \fx{LARGE}, puis \fx{INDEX} + \fx{EQUIV} / \fx{MATCH}).
387 384 \end{enumerate}
388 −Votre total doit retrouver le direct nu de la révision r1 (471\,085~\$) à quelques dollars près (arrondis des quantités).
385 +Votre total doit retrouver le direct nu de la révision r1 (471\,085~\$) à quelques dollars près (arrondis des prix composites).
389 386 \end{questionexam}
390 387
391 388 \begin{questionexam}{\faIcon{layer-group}\quad Des coûts nus aux coûts directs du cours}{8}
392 389 Onglet \onglet{Bordereau}, \xl{Bordereau}{C9:C15}, en suivant l'\textbf{ordre d'application} du tableau 7 (chaque majoration lit son taux dans \onglet{Données}) :
393 390 \begin{enumerate}[label=\alph*), itemsep=2pt]
394 − \item directs nus \textbf{localisés} $=$ direct nu (lié de \cel{Relevé!Q96}) $+$ ajustement régional;
391 + \item directs nus \textbf{localisés} $=$ direct nu (lié de \cel{Relevé!L49}) $+$ ajustement régional;
395 392 \item conditions générales du chantier (8~\% des directs nus localisés);
396 393 \item frais généraux de l'entrepreneur (7~\% du cumul : directs $+$ conditions générales);
397 394 \item profit de l'entrepreneur général (8~\% du cumul précédent);
398 395 \item \textbf{coûts directs au sens du cours} $=$ a $+$ b $+$ c $+$ d;
399 396 \item contingences de construction (5~\% des directs nus localisés);
400 − \item \textbf{directs $+$ contingences}. La cellule \cel{D16} vérifie que vous retrouvez le total de la révision r1 (611\,823~\$, $\pm$ 25~\$).
397 + \item \textbf{directs $+$ contingences}. La cellule \cel{D16} vérifie que vous retrouvez le total de la révision r1 (611\,823~\$, $\pm$ 50~\$).
401 398 \end{enumerate}
402 399 \end{questionexam}
403 400
@@ -424,11 +421,11 @@ Points : taux (2); formule complète (5 --- l'oubli du ½ en coûte 3); explicat
424 421 \xl{Bordereau}{C29:C30} et \xl{Bordereau}{C32:C33} : honoraires professionnels (4~\% des coûts directs \textbf{au sens du cours}, pas des directs nus ni de directs $+$ contingences), assurance chantier (0,8~\% de directs $+$ contingences), puis le \textbf{total des indirects} (permis $+$ GCR $+$ intercalaires $+$ honoraires $+$ assurance $+$ frais juridiques liés) et le \textbf{ratio} indirects $\div$ directs du cours. Comparez mentalement ce ratio à la fourchette de 15--25~\% de la séance 8 : que manque-t-il à notre liste par rapport à un projet commercial (vous y reviendrez dans la note)?
425 422 \end{questionexam}
426 423
427 −\begin{questionexam}{\faIcon{coins}\quad Profit entrepreneurial, coût total et unités de comparaison}{8}
424 +\begin{questionexam}{\faIcon{coins}\quad Profit entrepreneurial, coût total et unités de comparaison}{10}
428 425 \xl{Bordereau}{C36:C43} et \xl{Bordereau}{C44} :
429 426 \begin{enumerate}[label=\alph*), itemsep=2pt]
430 427 \item l'\textbf{assiette} du profit (directs $+$ contingences $+$ indirects), le \textbf{profit entrepreneurial} de 11~\% et le \textbf{COÛT TOTAL DE REMPLACEMENT NEUF} hors taxes;
431 − \item trois unités de comparaison : le coût par pi\up{2} d'\textbf{aire brute hors sol} (398,04~m\up{2}), par pi\up{2} d'\textbf{aire chauffée} (352,81~m\up{2}) et par \textbf{logement} --- la conversion en pi\up{2} lit \cel{Données!D207};
428 + \item trois unités de comparaison : le coût par pi\up{2} d'\textbf{aire brute hors sol} (398,04~m\up{2}), par pi\up{2} d'\textbf{aire chauffée} (352,81~m\up{2}) et par \textbf{logement} --- la conversion en pi\up{2} lit \cel{Données!D115};
432 429 \item le profit qu'aurait donné la convention « 11~\% des coûts directs seulement », l'\textbf{écart} entre les deux conventions, puis en \cel{C44} (3 à 4 lignes) : pourquoi l'évaluateur doit \textbf{toujours énoncer sa convention} dans son rapport, et quelle base est la plus défendable du point de vue du promoteur.
433 430 \end{enumerate}
434 431 Les taxes de vente (TPS, TVQ) se calculent automatiquement aux lignes 48 à 50, \textbf{à titre informatif} : la convention du cours les exclut du coût de remplacement d'un immeuble locatif pour rester comparable aux prix observés (remboursement partiel pour immeubles locatifs neufs).
@@ -437,23 +434,22 @@ Les taxes de vente (TPS, TVQ) se calculent automatiquement aux lignes 48 à 50,
437 434 \begin{questionexam}{\faIcon{balance-scale}\quad Validation : marché des quadruplex neufs, moteur de coût, Altus}{14}
438 435 Onglet \onglet{Marché}. Le marché vend des immeubles \textbf{terrain compris}; pour le comparer à un coût de construction, il faut \textbf{extraire} la valeur du bâtiment (séance 8 : extraction du profit par le marché).
439 436 \begin{enumerate}[label=\alph*), itemsep=2pt]
440 − \item \xl{Marché}{J6:N16}, pour chacune des onze ventes du tableau 9 : le \textbf{terrain indexé} $=$ rôle terrain $\times$ 1,257 (le rôle est daté de juillet 2022; le ratio du TP1 le ramène au marché 2026), la \textbf{valeur implicite du bâtiment} $=$ prix $-$ terrain indexé, cette valeur par \textbf{m\up{2} d'aire d'étages} et par \textbf{logement}, et le ratio prix $\div$ rôle total; puis \xl{Marché}{K17:N17} les \textbf{médianes} (\fx{MEDIANE} / \fx{MEDIAN});
441 − \item \xl{Marché}{K21}, \xl{Marché}{K23}, \xl{Marché}{K24} : l'écart du coût total du bordereau par rapport à la valeur implicite médiane du bâtiment; l'écart par rapport au RCN du moteur de coût (tableau 11); la position de votre \$/pi\up{2} hors sol dans la fourchette Altus 2026 par une formule \fx{SI} (\emph{sous} / \emph{dans} / \emph{au-dessus de} la fourchette);
442 − \item \xl{Marché}{K25} : le \textbf{profit entrepreneurial extrait du marché} $=$ (valeur implicite médiane du bâtiment $-$ assiette \cel{Bordereau!C36}) $\div$ assiette;
443 − \item \xl{Marché}{F29:G30} : pour les deux annonces du tableau 10, la valeur implicite du bâtiment et le \$/logement \textbf{demandés};
444 − \item \xl{Marché}{C33} (8 à 12 lignes) : \textbf{lisez} ces résultats --- que signifie l'écart bordereau / marché? pourquoi le profit extrait dépasse-t-il la convention de 11~\%? quelles différences entre le projet et les comparables faut-il nommer (logements au rez-de-jardin, étages, qualité, année, terrain indexé, Q11, prix demandés $\neq$ ventes)? que retenir pour le promoteur?
437 + \item \xl{Marché}{J6:N13}, pour chacune des huit ventes du tableau 8 : le \textbf{terrain indexé} $=$ rôle terrain $\times$ 1,257 (le rôle est daté de juillet 2022; le ratio du TP1 le ramène au marché 2026), la \textbf{valeur implicite du bâtiment} $=$ prix $-$ terrain indexé, cette valeur par \textbf{m\up{2} d'aire d'étages} et par \textbf{logement}, et le ratio prix $\div$ rôle total; puis \xl{Marché}{K14:N14} les \textbf{médianes} (\fx{MEDIANE} / \fx{MEDIAN});
438 + \item \xl{Marché}{K18}, \xl{Marché}{K20}, \xl{Marché}{K21} : l'écart du coût total du bordereau par rapport à la valeur implicite médiane du bâtiment; l'écart par rapport au RCN du moteur de coût (tableau 10); la position de votre \$/pi\up{2} hors sol dans la fourchette Altus 2026 par une formule \fx{SI} (\emph{sous} / \emph{dans} / \emph{au-dessus de} la fourchette);
439 + \item \xl{Marché}{K22} : le \textbf{profit entrepreneurial extrait du marché} $=$ (valeur implicite médiane du bâtiment $-$ assiette \cel{Bordereau!C36}) $\div$ assiette;
440 + \item \xl{Marché}{C25} (8 à 12 lignes) : \textbf{lisez} ces résultats --- que signifie l'écart bordereau / marché? pourquoi le profit extrait dépasse-t-il la convention de 11~\%? quelles différences entre le projet et les comparables faut-il nommer (logements au rez-de-jardin, qualité, année, terrain indexé, Q8, annonces du tableau 9 $=$ prix demandés, pas des ventes)? que retenir pour le promoteur?
445 441 \end{enumerate}
446 −Points : a (5); b (3); c (2); d (1); e (3).
442 +Points : a (5); b (3); c (2); d (4).
447 443 \end{questionexam}
448 444
449 −\begin{questionexam}{\faIcon{tachometer-alt}\quad Tableau de bord et note au promoteur}{12}
445 +\begin{questionexam}{\faIcon{tachometer-alt}\quad Tableau de bord et note au promoteur}{14}
450 446 \begin{enumerate}[label=\alph*), itemsep=2pt]
451 447 \item \textbf{KPI} \xl{Dashboard}{B5:G6} : six indicateurs par formule avec \fx{SIERREUR} (\fx{IFERROR}) --- deux fournis en modèle, quatre à compléter (total des indirects, profit entrepreneurial, \$/pi\up{2} hors sol, écart bordereau / marché);
452 448 \item \textbf{Verdict} \xl{Dashboard}{C8} : liste déroulante (\emph{coût sous la valeur de marché --- projet viable}, \emph{coût $\approx$ valeur de marché}, \emph{coût au-dessus --- projet à revoir}) cohérent avec vos chiffres; la mise en forme conditionnelle réagit au choix;
453 − \item \textbf{Graphiques} : les deux graphiques fournis (direct nu par division; coût du bâtiment par logement selon le bordereau, le moteur, le marché et les annonces) doivent refléter votre classeur; ajoutez un \textbf{troisième graphique} de votre choix (p.~ex. matériaux / main-d'œuvre / équipement, sensibilité du coût total à la durée du chantier, \$/m\up{2} implicite des onze ventes), titré et étiqueté;
449 + \item \textbf{Graphiques} : les deux graphiques fournis (direct nu par division; coût du bâtiment par logement selon le bordereau, le moteur et le marché) doivent refléter votre classeur; ajoutez un \textbf{troisième graphique} de votre choix (p.~ex. matériaux / main-d'œuvre / équipement, sensibilité du coût total à la durée du chantier, \$/m\up{2} implicite des huit ventes), titré et étiqueté;
454 450 \item \textbf{Note au promoteur} --- onglet \onglet{Note} (et PDF remis) : coût total et unités de comparaison, postes les plus sensibles, \textbf{effet chiffré d'un retard de chantier de 6 mois} sur les intercalaires et sur le coût total, ce que disent le marché, le moteur et Altus, conventions déclarées, limites --- chaque affirmation chiffrée et référencée à une cellule.
455 451 \end{enumerate}
456 −Points : KPI (4), verdict et 3\up{e} graphique (3), note (5 --- le chiffrage du retard en vaut 2).
452 +Points : KPI (4), verdict et 3\up{e} graphique (4), note (6 --- le chiffrage du retard en vaut 2).
457 453 \end{questionexam}
458 454
459 455 % ------------------------------------------------------------------------------
@@ -466,16 +462,16 @@ Points : KPI (4), verdict et 3\up{e} graphique (3), note (5 --- le chiffrage du
466 462 \toprule
467 463 \textbf{Question} & \textbf{Objet évalué} & \textbf{Points} \\
468 464 \midrule
469 −1 & Choix du relevé des quantités motivé (2); les trois autres méthodes (2); remplacement par définition et limites (2) & 6 \\
470 −2 & Douze grandeurs par formule (8); écarts et correction des anomalies (2) & 10 \\
471 −3 & Conversion par \fx{RECHERCHEV} (3); quantité RSMeans (3); coût unitaire et montant (3); total, matériaux / MO / équipement (2); sous-totaux par division (3); trois postes les plus lourds (2) & 16 \\
465 +1 & Méthode par composantes motivée (3); les trois autres méthodes (2); remplacement par définition et limites (3) & 8 \\
466 +2 & Sept grandeurs par formule (6); écarts et correction des anomalies (2) & 8 \\
467 +3 & Coût unitaire et montant (4); total, matériaux / MO / équipement (3); sous-totaux par division (3); trois composantes les plus lourdes (2) & 12 \\
472 468 4 & Ordre des majorations respecté (5); directs du cours, contingences et contrôle r1 (3) & 8 \\
473 469 5 & Permis : \fx{MAX} fonctionnel et assiette (5); GCR (3) & 8 \\
474 470 6 & Taux (2); formule complète avec ½ (5); explication et cas limite (3) & 10 \\
475 471 7 & Honoraires sur la bonne assiette (3); assurance (1); total et ratio (4) & 8 \\
476 −8 & Assiette, profit et total (3); unités de comparaison (2); convention chiffrée et argumentée (3) & 8 \\
477 −9 & Extraction sur onze ventes et médianes (5); écarts et position Altus (3); profit extrait (2); annonces (1); lecture (3) & 14 \\
478 −10 & KPI (4); verdict et 3\up{e} graphique (3); note au promoteur chiffrée (5) & 12 \\
472 +8 & Assiette, profit et total (4); unités de comparaison (3); convention chiffrée et argumentée (3) & 10 \\
473 +9 & Extraction sur huit ventes et médianes (5); écarts et position Altus (3); profit extrait (2); lecture (4) & 14 \\
474 +10 & KPI (4); verdict et 3\up{e} graphique (4); note au promoteur chiffrée (6) & 14 \\
479 475 \midrule
480 476 & \textbf{Total} & \textbf{100} \\
481 477 \bottomrule
@@ -494,11 +490,11 @@ Points : KPI (4), verdict et 3\up{e} graphique (3), note (5 --- le chiffrage du
494 490 \partieexamen{Sources des données (extraction du 29 octobre 2026)}{}
495 491
496 492 \begin{enumerate}[leftmargin=18pt, itemsep=3pt]
497 − \item UQO Éval --- laboratoire pédagogique d'évaluation immobilière (UQO, IMM1003 · IMM1033), module \emph{Quantity Survey} : cas d'étude « Cas 9 --- Quadruplex 2 étages, Gatineau (RSMeans 2026 T4) », plans (Plan Studio), fiche technique, relevé des quantités metre-qs-1.0, révision r1 du 29 octobre 2026 : tableaux 1 à 7, figures 2 et 3. \url{https://www.uqo-eval.app/quantity-survey/projets/97fa1d2a-06e1-4ed3-a580-0728616915ce}
498 − \item RSMeans Online (Gordian), \emph{Year 2026 Quarter 4}, livres \emph{Residential} et \emph{Commercial New Construction}, localisation Gatineau (C57), main-d'œuvre syndiquée; abonnement UQO --- données sous licence, usage pédagogique interne, reproduites ici pour les seules 64 lignes du cas. \url{https://www.rsmeansonline.com}
499 − \item UQO Éval --- ventes réelles du Registre foncier du Québec fusionnées au rôle d'évaluation 2024-2025-2026 de Gatineau (MAMH, données ouvertes), unités de 4 logements construites en 2021--2024 : tableau 9. \url{https://www.uqo-eval.app/methodologie}
500 − \item UQO Éval --- « À vendre » : copie des inscriptions en vigueur (source Immo-Ka, 29 octobre 2026) : tableau 10; photos des inscriptions 1151, rue Notre-Dame (RE/MAX Québec, 2024), 280, rue Champlain et 335, av. de l'Hippodrome (Centris / courtiers inscripteurs), reproduites à des fins pédagogiques, droits réservés.
501 − \item UQO Éval --- moteur de coût \web{/cout} (\texttt{POST /api/cost/estimate}, mode construction, prix du 29 octobre 2026) : tableau 11.
493 + \item UQO Éval --- laboratoire pédagogique d'évaluation immobilière (UQO, IMM1003 · IMM1033), module \emph{Quantity Survey} : cas d'étude « Cas 9 --- Quadruplex 2 étages, Gatineau (RSMeans 2026 T4) », plans (Plan Studio), fiche technique, relevé des quantités metre-qs-1.0, révision r1 du 29 octobre 2026 : tableaux 1 à 6, figures 2 et 3. \url{https://www.uqo-eval.app/quantity-survey/projets/97fa1d2a-06e1-4ed3-a580-0728616915ce}
494 + \item RSMeans Online (Gordian), \emph{Year 2026 Quarter 4}, livres \emph{Residential} et \emph{Commercial New Construction}, localisation Gatineau (C57), main-d'œuvre syndiquée; abonnement UQO --- données sous licence, usage pédagogique interne, reproduites ici sous forme de 22 prix composites. \url{https://www.rsmeansonline.com}
495 + \item UQO Éval --- ventes réelles du Registre foncier du Québec fusionnées au rôle d'évaluation 2024-2025-2026 de Gatineau (MAMH, données ouvertes), unités de 4 logements construites en 2021--2024 : tableau 8. \url{https://www.uqo-eval.app/methodologie}
496 + \item UQO Éval --- « À vendre » : copie des inscriptions en vigueur (source Immo-Ka, 29 octobre 2026) : tableau 9; photos des inscriptions 1151, rue Notre-Dame (RE/MAX Québec, 2024), 280, rue Champlain et 335, av. de l'Hippodrome (Centris / courtiers inscripteurs), reproduites à des fins pédagogiques, droits réservés.
497 + \item UQO Éval --- moteur de coût \web{/cout} (\texttt{POST /api/cost/estimate}, mode construction, prix du 29 octobre 2026) : tableau 10.
502 498 \item Ville de Gatineau, règlement 501-2005, art. 104 : permis de construction résidentiel, 4,70~\$/1\,000~\$ de travaux, minimum 335~\$/logement. \url{https://www.gatineau.ca}
503 499 \item Garantie de construction résidentielle (GCR), grille de primes 2026, classe 1, cote A : 2\,656,68~\$ par unité. \url{https://www.garantiegcr.com}
504 500 \item Banque du Canada, annonce du 28 octobre 2026 : taux directeur relevé de 2,25 à 2,50~\%; taux préférentiel des grandes banques à 4,70~\% le 29 octobre 2026. \url{https://www.banqueducanada.ca/grandes-fonctions/politique-monetaire/taux-directeur/}
modified IMM1033-20_Methodes_du_cout/03_Travaux_pratiques/TP2_Bordereau_de_cout_neuf/enonce/tables_tp2.tex +25 −137
@@ -1,140 +1,28 @@
1 −\begin{longtable}{@{}rp{4.4cm}rlp{7.3cm}@{}}
2 −\caption*{\sffamily\bfseries\color{uqoBleu}Tableau 3 --- Relevé des quantités généré par UQO Éval depuis les plans et la fiche (49 mesures « QS ») \hfill \xl{Données}{B38:N86}}\\
1 +\begin{tabular}{@{}rlp{3.4cm}p{4.6cm}rp{1.9cm}rrr@{}}
3 2 \toprule
4 −\textbf{N\up{o}} & \textbf{Poste} & \textbf{Quantité} & \textbf{Unité} & \textbf{Formule du relevé et entrées} \\
3 +\textbf{N\up{o}} & \textbf{Div.} & \textbf{Composante} & \textbf{Ce qu'elle comprend} & \textbf{Quantité} & \textbf{Unité} & \textbf{Mat. \$/u} & \textbf{MO \$/u} & \textbf{Éq. \$/u} \\
5 4 \midrule
6 −\endfirsthead
7 −\toprule
8 −\textbf{N\up{o}} & \textbf{Poste} & \textbf{Quantité} & \textbf{Unité} & \textbf{Formule du relevé et entrées} \\
9 −\midrule
10 −\endhead
11 −\bottomrule
12 −\endfoot
13 −1 & Excavation & 651,77 & m\up{3} & (empreinte + 0,9 m $\times$ périmètre) $\times$ profondeur --- empreinte m\up{2} = 199.02 ; perimetre m = 57.4 ; profondeur m = 2.6 \\
14 −2 & Remblai & 118,82 & m\up{3} & périmètre $\times$ 0,9 m $\times$ (profondeur -- 0,3) --- perimetre m = 57.4 ; profondeur m = 2.6 \\
15 −3 & Drain français & 57,40 & m & périmètre de fondation --- perimetre m = 57.4 \\
16 −4 & Branchements (aqueduc, égout, électricité) & 1,00 & forfait & 1 par bâtiment \\
17 −5 & Semelles filantes & 57,40 & m & périmètre (+ 1/2 périmètre du garage) --- perimetre m = 57.4 ; garage m\up{2} = 0 \\
18 −6 & Murs de fondation (h 2.44 m) & 140,06 & m\up{2} & périmètre $\times$ hauteur de mur --- perimetre m = 57.4 ; hauteur m = 2.44 \\
19 −7 & Membrane d'étanchéité des fondations & 122,84 & m\up{2} & périmètre $\times$ (hauteur -- 0,3 m hors sol) --- perimetre m = 57.4 ; hauteur m = 2.44 \\
20 −8 & Dalle de sous-sol 100 mm & 199,02 & m\up{2} & aire du sous-sol --- aire m\up{2} = 199.02 \\
21 −9 & Fenêtres de sous-sol & 3,00 & unité & comptées sur le plan du sous-sol --- perimetre m = 57.4 \\
22 −10 & Planchers portés (solives) & 352,81 & m\up{2} & $\Sigma$ aires de plancher des niveaux --- aire m\up{2} = 352.81 \\
23 −11 & Murs extérieurs ossature 2$\times$6 & 280,11 & m\up{2} & $\Sigma$ murs extérieurs bruts mesurés + pignons --- murs\_bruts m\up{2} = 280.11 ; pignons m\up{2} = 0 \\
24 −12 & Cloisons ossature 2$\times$4 & 292,31 & m\up{2} & $\Sigma$ cloisons mesurées (longueur $\times$ hauteur) --- cloisons m\up{2} = 292.31 \\
25 −13 & Poutre centrale LVL & 16,69 & m & longueur du bâtiment $\approx$ √(empreinte $\times$ 1,4) --- empreinte m\up{2} = 199.02 \\
26 −14 & Colonnes d'acier & 6,00 & unité & longueur $\div$ 3 m --- longueur m = 16.69 \\
27 −15 & Fermes de toit + support OSB & 218,92 & m\up{2} & (empreinte du dernier niveau + garage) $\times$ facteur de pente $\times$ 1,10 débords --- empreinte m\up{2} = 199.02 ; facteur\_pente = 1 ; pente = 0 \\
28 −16 & Escaliers intérieurs & 2,00 & unité & escaliers dessinés (min. niveaux -- 1 + sous-sol) --- dessines = 0 \\
29 −17 & Isolation des murs extérieurs R-24 & 216,75 & m\up{2} & $\Sigma$ murs extérieurs nets (ouvertures déduites) --- net m\up{2} = 216.75 \\
30 −18 & Isolation du comble R-50 & 199,02 & m\up{2} & empreinte du dernier niveau --- empreinte m\up{2} = 199.02 \\
31 −19 & Isolation intérieure des murs de sous-sol R-20 & 140,06 & m\up{2} & périmètre $\times$ 2,44 m --- perimetre m = 57.4 \\
32 −20 & Revêtement brick (80 \%) & 173,40 & m\up{2} & murs extérieurs nets $\times$ part --- net m\up{2} = 216.75 ; part = 0.8 \\
33 −21 & Revêtement vinyl (20 \%) & 43,35 & m\up{2} & murs extérieurs nets $\times$ part --- net m\up{2} = 216.75 ; part = 0.2 \\
34 −22 & Soffites et bordures de toit & 63,14 & m & périmètre $\times$ 1,10 --- perimetre m = 57.4 \\
35 −23 & Gouttières & 34,44 & m & périmètre $\times$ 60 \% --- perimetre m = 57.4 \\
36 −24 & Couverture & 218,92 & m\up{2} & surface de toit --- toit m\up{2} = 218.92 \\
37 −25 & Fenêtres & 24,00 & unité & comptées sur les plans --- comptees = 24 \\
38 −26 & Portes extérieures & 4,00 & unité & comptées sur les plans --- comptees = 4 \\
39 −27 & Portes-patio & 4,00 & unité & comptées sur les plans (portes ext. $\geq$ 1,5 m) --- comptees = 4 \\
40 −28 & Portes intérieures & 16,00 & unité & chambres + salles de bain + salles d'eau + 1 par logement --- comptees = 0 ; chambres = 8 \\
41 −29 & Portes de garde-robe & 11,00 & unité & 1 par chambre (min. aire $\div$ 32 m\up{2}) --- chambres = 8 \\
42 −30 & Gypse 1/2 po murs (face intérieure des murs ext. + 2 faces des cloisons) & 801,38 & m\up{2} & murs ext. nets + 2 $\times$ cloisons + sous-sol fini --- ext\_net m\up{2} = 216.75 ; cloisons\_x2 m\up{2} = 584.62 \\
43 −31 & Gypse 5/8 po plafonds & 352,81 & m\up{2} & $\Sigma$ aires des pièces (+ sous-sol fini) --- pieces m\up{2} = 352.81 \\
44 −32 & Peinture 2 couches (murs + plafonds) & 1\,154,18 & m\up{2} & gypse murs + plafonds \\
45 −33 & Céramique (cuisine, salles de bain, salles d'eau) & 131,90 & m\up{2} & aires des pièces d'eau et cuisine --- pieces\_eau m\up{2} = 131.9 \\
46 −34 & Plancher hardwood (80 \%) & 176,73 & m\up{2} & aires des pièces sèches $\times$ part --- pieces\_seches m\up{2} = 220.91 ; part = 0.8 \\
47 −35 & Plancher vinyl\_plank (20 \%) & 44,18 & m\up{2} & aires des pièces sèches $\times$ part --- pieces\_seches m\up{2} = 220.91 ; part = 0.2 \\
48 −36 & Plinthes & 341,60 & m & $\Sigma$ périmètres des pièces \\
49 −37 & Tablettes de garde-robe & 19,20 & m & 2,4 m par chambre --- chambres = 8 \\
50 −38 & Armoires et comptoirs de cuisine & 34,04 & m & 45 \% du périmètre de chaque cuisine (3,6–9 m) --- cuisines = 4 \\
51 −39 & Salles de bain complètes & 4,00 & unité & pièces « salle de bain » comptées --- comptees = 4 \\
52 −40 & Plomberie brute (appareils) & 28,00 & unité & 2/cuisine + 3/salle de bain + 2/salle d'eau + 2/logement --- cuisines = 4 ; sdb = 4 ; salles\_eau = 0 ; logements = 4 \\
53 −41 & Chauffe-eau 60 gal & 4,00 & unité & 1 par logement --- logements = 4 \\
54 −42 & Drainage et évents & 1,00 & forfait & 1 par bâtiment \\
55 −43 & Plinthes électriques 1 500 W & 26,00 & unité & aire chauffée $\div$ 14 m\up{2} --- aire m\up{2} = 352.81 \\
56 −44 & Échangeur d'air (VRC) & 4,00 & unité & 1 par logement \\
57 −45 & Entrée électrique 200 A & 4,00 & unité & 1 par logement --- logements = 4 \\
58 −46 & Filage brut & 352,81 & m\up{2} & aire chauffée --- aire m\up{2} = 352.81 \\
59 −47 & Luminaires & 54,00 & unité & aire chauffée $\div$ 6,5 m\up{2} --- aire m\up{2} = 352.81 \\
60 −48 & Luminaires extérieurs & 3,00 & unité & 3 + 1 si garage \\
61 −49 & Perron préfabriqué & 1,00 & unité & 1 par bâtiment \\
62 −\end{longtable}
63 −\begingroup\scriptsize\setlength{\tabcolsep}{2.3pt}
64 −\begin{longtable}{@{}rlp{2.7cm}p{4.0cm}rlrlrrr@{}}
65 −\caption*{\sffamily\bfseries\color{uqoBleu}\footnotesize Tableau 4 --- Les 64 lignes de la révision r1 : quantités du relevé, facteur d'ajustement, unité RSMeans et prix unitaires NUS RSMeans 2026 T4 localisés Gatineau (C57) \hfill \xl{Données}{B91:O154}}\\
66 −\toprule
67 −\textbf{N\up{o}} & \textbf{Div.} & \textbf{Poste} & \textbf{Détail RSMeans (ligne)} & \textbf{Qté} & \textbf{Unité} & \textbf{Fact.} & \textbf{U. RSM} & \textbf{Mat. \$/u} & \textbf{MO \$/u} & \textbf{Éq. \$/u} \\
68 −\midrule
69 −\endfirsthead
70 −\toprule
71 −\textbf{N\up{o}} & \textbf{Div.} & \textbf{Poste} & \textbf{Détail RSMeans (ligne)} & \textbf{Qté} & \textbf{Unité} & \textbf{Fact.} & \textbf{U. RSM} & \textbf{Mat. \$/u} & \textbf{MO \$/u} & \textbf{Éq. \$/u} \\
72 −\midrule
73 −\endhead
5 +1 & 31 & Excavation, remblai et drain français & excavation en masse, remblai, drain de fondation perforé & 651,77 & m\up{3} excavé & 2,09 & 3,25 & 2,18 \\
6 +2 & 33 & Branchements des services & aqueduc, égout et électricité (catalogue UQO Éval) & 1,00 & forfait & 6\,500,00 & 1\,172,78 & 460,00 \\
7 +3 & 03 & Fondations : semelles, murs coffrés et membrane & semelle filante 24 $\times$ 12 po, mur de béton 8 po, enduit d'imperméabilisation & 140,06 & m\up{2} de mur de fondation & 108,35 & 90,32 & 6,39 \\
8 +4 & 03 & Sous-sol : dalle, isolation XPS et fenêtres & dalle 4 po, XPS 2 po deux couches, 3 fenêtres utilitaires & 199,02 & m\up{2} de dalle & 75,83 & 24,47 & 0,11 \\
9 +5 & 06 & Planchers portés & solives en I 24 po c/c et sous-plancher OSB 3/4 po & 352,81 & m\up{2} de plancher & 43,27 & 11,41 & 0,00 \\
10 +6 & 06 & Ossature de bois & murs extérieurs 2 $\times$ 6 + contreplaqué 1/2 po, cloisons 2 $\times$ 4, poutre LVL, colonnes & 572,42 & m\up{2} de mur (ext. brut + cloisons) & 17,26 & 15,47 & 0,00 \\
11 +7 & 07 & Toiture complète & fermes, support CDX 1/2 po, membrane APP 2 couches, soffites, gouttières et descentes & 218,92 & m\up{2} de toit & 54,66 & 25,26 & 9,98 \\
12 +8 & 07 & Isolation des murs extérieurs R-24 et du comble R-50 & matelas R-21 ($\approx$ R-24) + cellulose soufflée & 415,77 & m\up{2} isolé (murs nets + comble) & 9,56 & 7,99 & 2,86 \\
13 +9 & 07 & Revêtement de brique (80 \%) & placage de brique standard, appareil courant & 173,40 & m\up{2} de mur net & 358,33 & 88,80 & 0,00 \\
14 +10 & 07 & Revêtement de vinyle (20 \%) & revêtement de vinyle double 5 po & 43,35 & m\up{2} de mur net & 16,90 & 21,53 & 0,00 \\
15 +11 & 08 & Fenêtres & fenêtre de vinyle à guillotine 3 $\times$ 41/2 pi avec moustiquaire & 24,00 & unité & 848,89 & 51,18 & 0,00 \\
16 +12 & 08 & Portes extérieures et portes-patio & 4 portes d'acier isolées + 4 portes-patio coulissantes 6 pi & 8,00 & unité & 1\,467,81 & 126,44 & 0,00 \\
17 +13 & 08 & Portes intérieures et de garde-robe & 16 portes prémontées à âme creuse + 11 portes pliantes & 27,00 & unité & 292,18 & 48,17 & 0,00 \\
18 +14 & 09 & Gypse et peinture & gypse 1/2 po murs, 5/8 po plafonds, peinture latex 2 couches & 1\,154,19 & m\up{2} de gypse & 13,92 & 15,55 & 0,00 \\
19 +15 & 09 & Planchers finis & bois franc préverni (60 \%), céramique (25 \%), vinyle de luxe (15 \%) & 352,81 & m\up{2} de plancher & 76,53 & 24,60 & 0,00 \\
20 +16 & 09 & Escaliers, rampes, plinthes et tablettes & 2 escaliers préfabriqués, mains courantes, plinthe ogee, tablettes de pin & 1,00 & forfait & 6\,017,62 & 2\,946,59 & 0,00 \\
21 +17 & 11 & Cuisines & armoires, comptoirs stratifiés, éviers avec robinet & 4,00 & logement & 12\,382,26 & 1\,363,96 & 0,00 \\
22 +18 & 22 & Salles de bain complètes & toilette, lavabo et robinet, baignoire d'acier, robinetterie & 4,00 & unité & 2\,450,13 & 661,37 & 0,00 \\
23 +19 & 22 & Plomberie brute, chauffe-eau et drainage & 28 appareils (alimentation, évacuation, évent), 4 chauffe-eau 60 gal, drainage & 4,00 & logement & 4\,178,92 & 3\,406,68 & 0,00 \\
24 +20 & 23 & Chauffage et ventilation & 26 plinthes électriques 1 500 W, 4 échangeurs d'air (VRC) & 4,00 & logement & 2\,126,98 & 1\,350,96 & 0,00 \\
25 +21 & 26 & Électricité complète & 4 entrées 200 A et panneaux, filage brut, 54 luminaires, 3 lanternes & 4,00 & logement & 4\,430,71 & 2\,405,75 & 0,00 \\
26 +22 & 32 & Perron préfabriqué & 5 contremarches, 5 pi & 1,00 & unité & 2\,244,00 & 267,03 & 224,72 \\
74 27 \bottomrule
75 −\endfoot
76 −1 & 31 & Excavation & excavation en masse, pelle hydraulique 1 vg\up{3} (B.C.Y.) (312316425100) & 651,77 & m\up{3} & 1,00 & vg\up{3} & 0,00 & 1,12 & 1,14 \\
77 −2 & 31 & Remblai & remblai en masse au bouteur (L.C.Y.) (312323131300) & 118,82 & m\up{3} & 1,00 & vg\up{3} & 0,00 & 0,69 & 1,73 \\
78 −3 & 31 & Drain français & drain de fondation perforé 4 po (334116103000) & 57,40 & m & 1,00 & pi lin. & 7,22 & 5,61 & 0,96 \\
79 −4 & 33 & Branchements (aqueduc, égout, électricité) & catalogue UQO Éval & 1,00 & forfait & 1,00 & forfait & 6\,500,00 & 1\,172,78 & 460,00 \\
80 −5 & 03 & Semelles filantes & semelle filante 24 $\times$ 12 po (0,61 $\times$ 0,30 m = 0,183 m\up{3}/m) (033053403935) & 10,50 & m\up{3} & 1,00 & vg\up{3} & 228,09 & 107,03 & 0,70 \\
81 −6 & 03 & Murs de fondation (h 2.44 m) & mur de béton 8 po coffré (0,203 m\up{3}/m\up{2}) (033053404200) & 28,43 & m\up{3} & 1,00 & vg\up{3} & 315,65 & 286,06 & 23,80 \\
82 −7 & 07 & Membrane d'étanchéité des fondations & enduit bitumineux d'imperméabilisation pulvérisé, 1 couche (071113100300) & 122,84 & m\up{2} & 1,00 & pi\up{2} & 0,23 & 0,41 & 0,00 \\
83 −8 & 03 & Dalle de sous-sol 100 mm & dalle sur sol 4 po (033053405001) & 199,02 & m\up{2} & 1,00 & pi\up{2} & 2,69 & 1,13 & 0,01 \\
84 −9 & 08 & Fenêtres de sous-sol & fenêtre de sous-sol utilitaire 1 pi 7 $\times$ 2 pi 8 (085123401100) & 3,00 & unité & 1,00 & unité & 506,52 & 22,17 & 0,00 \\
85 −10 & 06 & Planchers portés (solives) & solives en I 24 po c/c, portée 15–24 pi (061733101200) & 352,81 & m\up{2} & 1,00 & pi\up{2} & 2,96 & 0,65 & 0,00 \\
86 −11 & 06 & Planchers portés (solives) & sous-plancher OSB 3/4 po (061623101600) & 352,81 & m\up{2} & 1,00 & pi\up{2} & 1,06 & 0,41 & 0,00 \\
87 −12 & 06 & Murs extérieurs ossature 2$\times$6 & ossature 2 $\times$ 6 à 16 po c/c, 8 pi, lisses incluses (m de mur = m\up{2} $\div$ 2,44) (061110260800) & 114,84 & m & 1,00 & pi lin. & 6,19 & 8,62 & 0,00 \\
88 −13 & 06 & Murs extérieurs ossature 2$\times$6 & revêtement intermédiaire contreplaqué 1/2 po (061636100600) & 280,11 & m\up{2} & 1,00 & pi\up{2} & 1,00 & 0,69 & 0,00 \\
89 −14 & 06 & Cloisons ossature 2$\times$4 & cloison 2 $\times$ 4 à 16 po c/c, 8 pi, lisses incluses (m de cloison = m\up{2} $\div$ 2,44) (061110260200) & 119,85 & m & 1,00 & pi lin. & 4,23 & 7,76 & 0,00 \\
90 −15 & 06 & Poutre centrale LVL & poutre LVL 13/4 $\times$ 14 po, 3 plis (061813206150) & 16,69 & m & 3,00 & pi lin. & 13,91 & 1,72 & 0,00 \\
91 −16 & 05 & Colonnes d'acier & colonne tubulaire (lally) 4 po remplie de béton, 8 pi (051223158080) & 6,00 & unité & 1,00 & unité & 97,38 & 31,95 & 0,00 \\
92 −17 & 06 & Fermes de toit + support OSB & fermes fink 4/12 à 24 po c/c (par pi\up{2} de plancher $\approx$ 0,93 $\times$ aire de toit) (061753100210) & 218,92 & m\up{2} & 0,93 & pi\up{2} & 2,39 & 0,66 & 0,90 \\
93 −18 & 06 & Fermes de toit + support OSB & support de toit contreplaqué CDX 1/2 po (061636100100) & 218,92 & m\up{2} & 1,00 & pi\up{2} & 1,00 & 0,56 & 0,00 \\
94 −19 & 09 & Escaliers intérieurs & escalier préfabriqué 14 contremarches, 3 pi (pin pour tapis) (064313200600) & 28,00 & unité & 1,00 & unité & 82,54 & 19,94 & 0,00 \\
95 −20 & 09 & Escaliers intérieurs & main courante avec balustres (4,3 m par escalier) (064313201550) & 8,60 & m & 1,00 & pi lin. & 83,45 & 12,92 & 0,00 \\
96 −21 & 07 & Isolation des murs extérieurs R-24 & matelas kraft 6 po R-21 (plus proche de R-24 dans RSMeans) (072116200182) & 216,75 & m\up{2} & 1,00 & pi\up{2} & 1,68 & 0,49 & 0,00 \\
97 −22 & 07 & Isolation du comble R-50 & cellulose soufflée R-38 (épaisseur $\times$ 1,32 pour R-50) (072126100120) & 199,02 & m\up{2} & 1,32 & pi\up{2} & 0,02 & 0,77 & 0,42 \\
98 −23 & 07 & Isolation intérieure des murs de sous-sol R-20 & XPS 2 po R-10, deux couches (072113101940) & 140,06 & m\up{2} & 2,00 & pi\up{2} & 2,59 & 0,79 & 0,00 \\
99 −24 & 07 & Revêtement brick (80 \%) & placage de brique standard, appareil courant (042113132000) & 173,40 & m\up{2} & 1,00 & pi\up{2} & 33,29 & 8,25 & 0,00 \\
100 −25 & 07 & Revêtement vinyl (20 \%) & revêtement de vinyle double 5 po (074633104000) & 43,35 & m\up{2} & 1,00 & pi\up{2} & 1,57 & 2,00 & 0,00 \\
101 −26 & 07 & Soffites et bordures de toit & soffite et bordure d'aluminium ventilés, débord 1 pi (074213206920) & 63,14 & m & 1,00 & pi lin. & 8,37 & 6,51 & 0,00 \\
102 −27 & 07 & Gouttières & gouttières d'aluminium 5 po (077123300100) & 34,44 & m & 1,00 & pi lin. & 3,38 & 4,58 & 0,00 \\
103 −28 & 07 & Gouttières & descentes 2 $\times$ 3 po ($\approx$ 35 \% de la longueur) (077123100100) & 34,44 & m & 0,35 & pi lin. & 2,24 & 3,02 & 0,00 \\
104 −29 & 07 & Couverture & membrane APP, base + finition (2 couches) (075213100040) & 218,92 & m\up{2} & 2,00 & pi\up{2} & 0,46 & 0,17 & 0,05 \\
105 −30 & 08 & Fenêtres & fenêtre de vinyle à guillotine 3 $\times$ 41/2 pi, moustiquaire (085313100100) & 24,00 & unité & 1,00 & unité & 848,89 & 51,18 & 0,00 \\
106 −31 & 08 & Portes extérieures & porte d'acier isolée prémontée 3 $\times$ 6 pi 8 (081313201340) & 4,00 & unité & 1,00 & unité & 841,77 & 53,22 & 0,00 \\
107 −32 & 08 & Portes-patio & porte-patio coulissante 6 pi, vitrage isolant (083219150020) & 4,00 & unité & 1,00 & unité & 2\,093,85 & 199,65 & 0,00 \\
108 −33 & 08 & Portes intérieures & porte intérieure prémontée à âme creuse (081723104600) & 16,00 & unité & 1,00 & unité & 274,95 & 46,98 & 0,00 \\
109 −34 & 08 & Portes de garde-robe & porte pliante de placard 3 pi (081313202330) & 11,00 & unité & 1,00 & unité & 317,25 & 49,91 & 0,00 \\
110 −35 & 09 & Gypse 1/2 po murs (face intérieure des murs ext. + 2 faces des cloisons) & gypse 1/2 po murs, tiré de joints niveau 4 (092910300350) & 801,38 & m\up{2} & 1,00 & pi\up{2} & 0,65 & 0,79 & 0,00 \\
111 −36 & 09 & Gypse 5/8 po plafonds & gypse 5/8 po coupe-feu plafonds, niveau 4 (092910303150) & 352,81 & m\up{2} & 1,00 & pi\up{2} & 0,79 & 1,00 & 0,00 \\
112 −37 & 09 & Peinture 2 couches (murs + plafonds) & peinture latex 2 couches au rouleau, murs et plafonds (099123720840) & 1\,154,18 & m\up{2} & 1,00 & pi\up{2} & 0,60 & 0,59 & 0,00 \\
113 −38 & 09 & Céramique (cuisine, salles de bain, salles d'eau) & céramique 12 $\times$ 12 po, couche mince (093133103270) & 131,90 & m\up{2} & 1,00 & pi\up{2} & 3,52 & 2,85 & 0,00 \\
114 −39 & 09 & Plancher hardwood (80 \%) & lames de chêne blanc préverni 31/4 po (096429106200) & 176,73 & m\up{2} & 1,00 & pi\up{2} & 8,88 & 2,24 & 0,00 \\
115 −40 & 09 & Plancher vinyl\_plank (20 \%) & planches de vinyle de luxe collées (096519238100) & 44,18 & m\up{2} & 1,00 & pi\up{2} & 10,75 & 0,78 & 0,00 \\
116 −41 & 09 & Plinthes & plinthe ogee peuplier 3 po (062213155180) & 341,60 & m & 1,00 & pi lin. & 0,95 & 1,60 & 0,00 \\
117 −42 & 09 & Tablettes de garde-robe & tablette de pin 1 $\times$ 12 po (105723190200) & 19,20 & m & 1,00 & pi lin. & 4,56 & 3,66 & 0,00 \\
118 −43 & 11 & Armoires et comptoirs de cuisine & armoires de cuisine, règle du pouce, minimum (par pi lin.) (123223109560) & 34,04 & m & 1,00 & pi lin. & 351,34 & 25,66 & 0,00 \\
119 −44 & 11 & Armoires et comptoirs de cuisine & comptoir stratifié avec dosseret, maximum (123623130100) & 34,04 & m & 1,00 & pi lin. & 61,02 & 15,47 & 0,00 \\
120 −45 & 11 & Armoires et comptoirs de cuisine & évier double inox avec robinet (1 par 8 m d'armoires) (224116163200) & 4,25 & unité & 1,00 & unité & 817,10 & 202,69 & 0,00 \\
121 −46 & 22 & Salles de bain complètes & toilette deux pièces (224113131100) & 4,00 & unité & 1,00 & unité & 376,68 & 183,96 & 0,00 \\
122 −47 & 22 & Salles de bain complètes & lavabo de meuble-lavabo (marbre cultivé) (224116131000) & 4,00 & unité & 1,00 & unité & 281,64 & 152,22 & 0,00 \\
123 −48 & 22 & Salles de bain complètes & robinet de lavabo avec drain (224139102120) & 4,00 & unité & 1,00 & unité & 134,44 & 80,99 & 0,00 \\
124 −49 & 22 & Salles de bain complètes & baignoire d'acier émaillé 5 pi (224119102300) & 4,00 & unité & 1,00 & unité & 1\,216,95 & 176,64 & 0,00 \\
125 −50 & 22 & Salles de bain complètes & robinetterie de bain-douche à pression équilibrée (224139100420) & 4,00 & unité & 1,00 & unité & 440,42 & 67,56 & 0,00 \\
126 −51 & 22 & Plomberie brute (appareils) & plomberie brute par appareil (alimentation, évacuation, évent) (224116133580) & 28,00 & unité & 1,00 & unité & 347,70 & 423,28 & 0,00 \\
127 −52 & 22 & Chauffe-eau 60 gal & chauffe-eau électrique 66 gal (plus proche de 60 gal) (223330131120) & 4,00 & unité & 1,00 & unité & 1\,622,60 & 301,18 & 0,00 \\
128 −53 & 22 & Drainage et évents & catalogue UQO Éval & 1,00 & forfait & 1,00 & forfait & 489,69 & 570,16 & 0,00 \\
129 −54 & 23 & Plinthes électriques 1 500 W & plinthe électrique 1 500 W, 6 pi (238333102000) & 26,00 & unité & 1,00 & unité & 112,92 & 107,38 & 0,00 \\
130 −55 & 23 & Échangeur d'air (VRC) & catalogue UQO Éval & 4,00 & unité & 1,00 & unité & 1\,393,00 & 652,99 & 0,00 \\
131 −56 & 26 & Entrée électrique 200 A & entrée et panneau résidentiels 150 A (RSMeans ; majorer pour 200 A) (260590101150) & 4,00 & unité & 1,00 & unité & 1\,612,00 & 513,45 & 0,00 \\
132 −57 & 26 & Entrée électrique 200 A & panneau 200 A, 24 circuits (262416100800) & 4,00 & unité & 1,00 & unité & 1\,217,06 & 733,50 & 0,00 \\
133 −58 & 26 & Filage brut & prises doubles NM \#12 (1 par 8 m\up{2}) (260590104050) & 44,10 & unité & 1,00 & unité & 25,95 & 42,79 & 0,00 \\
134 −59 & 26 & Filage brut & interrupteurs NM (1 par 15 m\up{2}) (260590102110) & 23,52 & unité & 1,00 & unité & 19,26 & 30,97 & 0,00 \\
135 −60 & 26 & Luminaires & luminaire plafonnier économique (260590106210) & 54,00 & unité & 1,00 & unité & 44,33 & 13,20 & 0,00 \\
136 −61 & 26 & Luminaires & sortie d'éclairage boîte + câble NM (260590106100) & 54,00 & unité & 1,00 & unité & 35,46 & 21,19 & 0,00 \\
137 −62 & 26 & Luminaires extérieurs & lanterne murale extérieure (265113702000) & 3,00 & unité & 1,00 & unité & 131,38 & 33,01 & 0,00 \\
138 −63 & 26 & Luminaires extérieurs & sortie d'éclairage boîte + câble NM (260590106100) & 3,00 & unité & 1,00 & unité & 35,46 & 21,19 & 0,00 \\
139 −64 & 32 & Perron préfabriqué & perron préfabriqué 5 contremarches, 5 pi (034123500350) & 1,00 & unité & 1,00 & unité & 2\,244,00 & 267,03 & 224,72 \\
140 −\end{longtable}\endgroup
28 +\end{tabular}
modified IMM1033-20_Methodes_du_cout/03_Travaux_pratiques/TP2_Bordereau_de_cout_neuf/enonce/tables_tp2_div.tex +4 −5
@@ -2,11 +2,10 @@
2 2 \toprule
3 3 \textbf{Code} & \textbf{Division MasterFormat} & \textbf{Direct nu r1 (\$)} & \textbf{Part} \\
4 4 \midrule
5 −03 & Béton & 36\,079,73 & 7,7~\% \\
6 −05 & Métaux & 775,98 & 0,2~\% \\
7 −06 & Bois et composites & 49\,582,02 & 10,5~\% \\
8 −07 & Enveloppe, isolation et toiture & 106\,068,97 & 22,5~\% \\
9 −08 & Portes et fenêtres & 45\,131,35 & 9,6~\% \\
5 +03 & Béton & 48\,703,36 & 10,3~\% \\
6 +06 & Bois et composites & 38\,025,59 & 8,1~\% \\
7 +07 & Enveloppe, isolation et toiture & 107\,363,82 & 22,8~\% \\
8 +08 & Portes et fenêtres & 43\,545,28 & 9,2~\% \\
10 9 09 & Finitions intérieures & 78\,647,93 & 16,7~\% \\
11 10 11 & Cuisines & 54\,984,88 & 11,7~\% \\
12 11 22 & Plomberie & 42\,788,41 & 9,1~\% \\
added IMM1033-20_Methodes_du_cout/03_Travaux_pratiques/TP2_Bordereau_de_cout_neuf/enonce/tables_tp2_releve.tex +13 −0
@@ -0,0 +1,13 @@
1 +\begin{tabular}{@{}clp{6.2cm}rl@{}}
2 +\toprule
3 +\textbf{N\up{o}} & \textbf{Grandeur (relevé UQO Éval)} & \textbf{Formule du relevé} & \textbf{Valeur} & \textbf{Unité} \\
4 +\midrule
5 +1 & Dalle de sous-sol 100 mm & (L + ép.) $\times$ (P + ép.) & 199,02 & m\up{2} \\
6 +2 & Semelles filantes & 2 $\times$ (L + P) & 57,40 & m \\
7 +3 & Murs de fondation (h 2.44 m) & périmètre $\times$ hauteur du mur & 140,06 & m\up{2} \\
8 +4 & Murs extérieurs ossature 2$\times$6 & périmètre $\times$ hauteur d'étage $\times$ niveaux & 280,11 & m\up{2} \\
9 +5 & Isolation des murs extérieurs R-24 & bruts -- ouvertures hors sol & 216,75 & m\up{2} \\
10 +6 & Couverture & empreinte $\times$ facteur de pente $\times$ débords & 218,92 & m\up{2} \\
11 +7 & Planchers portés (solives) & $\Sigma$ aires des pièces hors sol & 352,81 & m\up{2} \\
12 +\bottomrule
13 +\end{tabular}
modified IMM1033-20_Methodes_du_cout/03_Travaux_pratiques/TP2_Bordereau_de_cout_neuf/enonce/tables_tp2_ventes.tex +6 −9
@@ -4,14 +4,11 @@
4 4 \midrule
5 5 Q1 & 180, rue O'Brien (Saint-Renéureau de poste) & 2025-11-21 & 1\,145\,000 & 2021 & 190,2 & 658,9 & 2 / D & 229\,300 & 567\,300 & 796\,600 \\
6 6 Q2 & 160, rue O'Brien (Saint-Renéureau de poste) & 2025-11-21 & 1\,168\,000 & 2021 & 190,2 & 657,6 & 2 / D & 229\,200 & 567\,300 & 796\,500 \\
7 −Q3 & 18, rue du Campagnard (Gatineau) & 2025-10-22 & 1\,193\,000 & 2021 & 217,4 & 524,8 & 2 / J & 203\,700 & 740\,400 & 944\,100 \\
8 −Q4 & 94, rue de l'Écorce (Masson) & 2025-10-21 & 1\,100\,000 & 2022 & 196,2 & 929,5 & 2 / D & 204\,000 & 594\,900 & 798\,900 \\
9 −Q5 & 390, rue Raymond (Saint-Renéureau de poste) & 2025-09-12 & 1\,165\,000 & 2024 & 190,2 & 657,6 & 2 / D & 229\,200 & 683\,400 & 912\,600 \\
10 −Q6 & 24, boulevard Sacré-Coeur (Hull) & 2025-04-16 & 1\,300\,000 & 2023 & 266,7 & 259,9 & 3 / D & 207\,900 & 752\,500 & 960\,400 \\
11 −Q7 & 203, rue de la Cité-Jardin (Gatineau) & 2025-03-17 & 1\,199\,500 & 2021 & 229,9 & 478,3 & 3 / R & 217\,500 & 800\,900 & 1\,018\,400 \\
12 −Q8 & 7, rue Damphousse (Gatineau) & 2025-03-14 & 1\,125\,000 & 2022 & 239,4 & 587,9 & 2 / D & 184\,500 & 839\,600 & 1\,024\,100 \\
13 −Q9 & 767, rue Notre-Dame (Gatineau) & 2025-03-07 & 1\,205\,276 & 2024 & 231,8 & 565,5 & 2 / J & 184\,100 & 799\,800 & 983\,900 \\
14 −Q10 & 380, rue Raymond (Saint-Renéureau de poste) & 2025-02-03 & 1\,140\,000 & 2022 & 190,2 & 657,6 & 2 / D & 229\,200 & 573\,000 & 802\,200 \\
15 −Q11 & 1151, Rue Notre-Dame (Gatineau) & 2024-05-07 & 849\,411 & 2024 & 194,4 & 695,5 & 2 / D & 186\,200 & 715\,000 & 901\,200 \\
7 +Q3 & 94, rue de l'Écorce (Masson) & 2025-10-21 & 1\,100\,000 & 2022 & 196,2 & 929,5 & 2 / D & 204\,000 & 594\,900 & 798\,900 \\
8 +Q4 & 390, rue Raymond (Saint-Renéureau de poste) & 2025-09-12 & 1\,165\,000 & 2024 & 190,2 & 657,6 & 2 / D & 229\,200 & 683\,400 & 912\,600 \\
9 +Q5 & 7, rue Damphousse (Gatineau) & 2025-03-14 & 1\,125\,000 & 2022 & 239,4 & 587,9 & 2 / D & 184\,500 & 839\,600 & 1\,024\,100 \\
10 +Q6 & 767, rue Notre-Dame (Gatineau) & 2025-03-07 & 1\,205\,276 & 2024 & 231,8 & 565,5 & 2 / J & 184\,100 & 799\,800 & 983\,900 \\
11 +Q7 & 380, rue Raymond (Saint-Renéureau de poste) & 2025-02-03 & 1\,140\,000 & 2022 & 190,2 & 657,6 & 2 / D & 229\,200 & 573\,000 & 802\,200 \\
12 +Q8 & 1151, Rue Notre-Dame (Gatineau) & 2024-05-07 & 849\,411 & 2024 & 194,4 & 695,5 & 2 / D & 186\,200 & 715\,000 & 901\,200 \\
16 13 \bottomrule
17 14 \end{tabular}
modified IMM1033-20_Methodes_du_cout/03_Travaux_pratiques/TP2_Bordereau_de_cout_neuf/gabarit_excel/IMM1033-20_TP2_gabarit.xlsx +0 −0

Binary file not shown.

modified IMM1033-20_Methodes_du_cout/03_Travaux_pratiques/TP2_Bordereau_de_cout_neuf/solutionnaire_enseignant/IMM1033-20_TP2_solutionnaire.pdf +0 −0

Binary file not shown.

modified IMM1033-20_Methodes_du_cout/03_Travaux_pratiques/TP2_Bordereau_de_cout_neuf/solutionnaire_enseignant/IMM1033-20_TP2_solutionnaire.tex +40 −48
@@ -14,27 +14,27 @@
14 14 \setexamDuree{Travail individuel à la maison (gabarit Excel obligatoire + laboratoire UQO Éval)}
15 15 \setexamRemise{Séance 9 (12 novembre 2026) --- dépôt Moodle}
16 16 \setexamPonderation{15 \% de la note finale}
17 −\setexamCouverture{Bordereau de coût de remplacement neuf : quadruplex de 2 étages à Gatineau --- données réelles d'UQO Éval (Cas 9, RSMeans 2026 T4)}
17 +\setexamCouverture{Bordereau de coût de remplacement neuf : quadruplex de 2 étages à Gatineau --- données réelles d'UQO Éval (Cas 9, 22 composantes RSMeans 2026 T4)}
18 18
19 19 \begin{document}
20 20 \pagetitreexamen
21 21
22 22 \begin{notescorrection}[Philosophie de correction]
23 −Plus de paramètre B : toutes les copies travaillent sur le même cas réel (cas d'étude « Cas 9 » d'UQO Éval, révision r1 du 29 octobre 2026). La note récompense la \textbf{rigueur de la chaîne} (conversions, ordre des majorations, assiettes) et la \textbf{lecture} (conventions, marché, limites). Le gabarit est entièrement chaîné : changer un prix unitaire dans \emph{Données} doit recalculer Bordereau!C38. Valeurs reproductibles par \texttt{tp2\_solutions.py}; solutionnaire Excel \texttt{IMM1033-20\_TP2\_solutionnaire.xlsx} (formules réelles, 74 cellules vérifiées par recalcul dans Excel). Chaîne de référence : direct nu \textbf{471\,076~\$} (r1 : 471\,085) $\rightarrow$ directs du cours \textbf{588\,245~\$} $\rightarrow$ directs $+$ contingences \textbf{611\,812~\$} (r1 : 611\,823) $\rightarrow$ indirects \textbf{72\,075~\$} $\rightarrow$ coût total \textbf{759\,115~\$} (177,18~\$/pi\up{2} hors sol, 189\,779~\$/logement) $\rightarrow$ marché : bâtiment implicite médian \textbf{879\,896~\$}, profit extrait \textbf{28,7~\%}. Correction express : taper 0 dans Données!K91 (matériaux de l'excavation, déjà 0) ne change rien, mais taper 50 dans Données!K146 (brique) doit faire bouger Bordereau!C38 : sinon la chaîne n'est pas liée.
23 +Plus de paramètre B : toutes les copies travaillent sur le même cas réel (cas d'étude « Cas 9 » d'UQO Éval, révision r1 du 29 octobre 2026). La note récompense la \textbf{rigueur de la chaîne} (conversions, ordre des majorations, assiettes) et la \textbf{lecture} (conventions, marché, limites). Le gabarit est entièrement chaîné : changer un prix unitaire dans \emph{Données} doit recalculer Bordereau!C38. Valeurs reproductibles par \texttt{tp2\_solutions.py}; solutionnaire Excel \texttt{IMM1033-20\_TP2\_solutionnaire.xlsx} (formules réelles, 74 cellules vérifiées par recalcul dans Excel). Chaîne de référence : direct nu \textbf{471\,100~\$} (r1 : 471\,085) $\rightarrow$ directs du cours \textbf{588\,275~\$} $\rightarrow$ directs $+$ contingences \textbf{611\,843~\$} (r1 : 611\,823) $\rightarrow$ indirects \textbf{72\,078~\$} $\rightarrow$ coût total \textbf{759\,152~\$} (177,19~\$/pi\up{2} hors sol, 189\,788~\$/logement) $\rightarrow$ marché : bâtiment implicite médian \textbf{866\,833~\$}, profit extrait \textbf{26,7~\%}. Correction express : taper 100 dans Données!H57 (matériaux de la brique) doit faire bouger Bordereau!C38 : sinon la chaîne n'est pas liée. Version allégée du 29 octobre 2026 (soir) : 22 composantes à prix composites au lieu des 64 lignes RSMeans, 7 grandeurs au lieu de 12, 8 ventes au lieu de 11.
24 24 \end{notescorrection}
25 25
26 26 \partieexamen{Solutions}{}
27 27
28 −\begin{questionexam}{Méthode d'estimation et nature du coût estimé}{6}
28 +\begin{questionexam}{Méthode d'estimation et nature du coût estimé}{8}
29 29 \begin{solution}
30 −\textbf{Relevé des quantités} : le promoteur dispose de plans cotés et d'une fiche technique; la méthode part des quantités réelles de chaque composante (m\up{3} de béton, m\up{2} de brique, nombre de fenêtres) tarifées à l'unité --- c'est la méthode de l'entrepreneur qui soumissionne et la plus précise des quatre (séance 6), au prix d'un travail plus lourd (64 lignes). La méthode \textbf{comparative} (\$/pi\up{2} d'un guide : Altus 180--330~\$) ne donne qu'un ordre de grandeur sans distinguer brique et vinyle, toit plat et bardeaux; la méthode par \textbf{composantes} (unités en place, celle du moteur de coût d'UQO Éval, tableau 11) est un bon compromis et sert ici de \emph{contrôle}; la méthode \textbf{indexée} suppose un coût historique connu, inexistant pour un projet neuf. \textbf{Remplacement par définition} : il n'y a pas d'original à reproduire; on chiffre un bâtiment d'utilité équivalente aux normes et matériaux d'aujourd'hui (séance 5); la reproduction ne redeviendrait pertinente que pour un bâtiment existant aux caractéristiques d'époque. \textbf{Limites} : plan générique (gabarit du module, pas les plans d'exécution), prix publiés RSMeans localisés (pas des soumissions), 55 mesures non vérifiées manuellement; précision attendue $\pm$ 5 à 10~\% sur les directs.
30 +\textbf{Bordereau par composantes nourri par un relevé} : le promoteur dispose de plans cotés et d'une fiche technique; UQO Éval en a tiré un relevé des quantités que le TP condense en 22 composantes (unités en place) à prix composites --- chaque composante est une quantité mesurée sur le plan (m\up{2} de toit, m\up{2} de brique, nombre de fenêtres) multipliée par un prix nu par unité (séance 6). La méthode \textbf{comparative} (\$/pi\up{2} d'un guide : Altus 180--330~\$) ne donne qu'un ordre de grandeur sans distinguer brique et vinyle, toit plat et bardeaux; le \textbf{relevé détaillé} ligne par ligne (64 lignes RSMeans sur UQO Éval) est plus précis mais plus lourd --- c'est celui de l'entrepreneur qui soumissionne; la méthode \textbf{indexée} suppose un coût historique connu, inexistant pour un projet neuf; le moteur de coût d'UQO Éval (tableau 10) sert ici de \emph{contrôle}. \textbf{Remplacement par définition} : il n'y a pas d'original à reproduire; on chiffre un bâtiment d'utilité équivalente aux normes et matériaux d'aujourd'hui (séance 5); la reproduction ne redeviendrait pertinente que pour un bâtiment existant aux caractéristiques d'époque. \textbf{Limites} : plan générique (gabarit du module, pas les plans d'exécution), prix composites dérivés de prix publiés RSMeans localisés (pas des soumissions); précision attendue $\pm$ 5 à 10~\% sur les directs.
31 31 \end{solution}
32 32 \begin{notescorrection}
33 −Relevé motivé par les données : 2 pts; trois autres méthodes situées : 2 pts; remplacement par définition (1) et deux limites (1).
33 +Méthode par composantes motivée par les données : 3 pts; trois autres méthodes situées : 2 pts; remplacement par définition (1) et deux limites (2).
34 34 \end{notescorrection}
35 35 \end{questionexam}
36 36
37 −\begin{questionexam}{Du plan au relevé des quantités}{10}
37 +\begin{questionexam}{Du plan au relevé : sept grandeurs}{8}
38 38 \begin{solution}
39 39 \begin{center}
40 40 \footnotesize
@@ -44,50 +44,45 @@ Relevé motivé par les données : 2 pts; trois autres méthodes situées : 2 pt
44 44 \midrule
45 45 1 & Empreinte $=(18{,}30+0{,}30)(10{,}40+0{,}30)$ & 199,02 m\up{2} & 199,02 & 0,00 \% \\
46 46 2 & Périmètre $=2(18{,}30+10{,}40)$ & 57,40 m & 57,40 & 0,00 \% \\
47 −3 & Excavation $=(199{,}02+0{,}9\times57{,}40)\times2{,}60$ & 651,77 m\up{3} & 651,77 & 0,00 \% \\
48 −4 & Remblai $=57{,}40\times0{,}9\times2{,}30$ & 118,82 m\up{3} & 118,82 & 0,00 \% \\
49 −5 & Murs de fondation $=57{,}40\times2{,}44$ & 140,06 m\up{2} & 140,06 & 0,00 \% \\
50 −6 & Membrane $=57{,}40\times(2{,}44-0{,}30)$ & 122,84 m\up{2} & 122,84 & 0,00 \% \\
51 −7 & Murs extérieurs bruts $=57{,}40\times2{,}44\times2$ & 280,11 m\up{2} & 280,11 & 0,00 \% \\
52 −8 & Murs extérieurs nets $=280{,}11-63{,}36$ & 216,75 m\up{2} & 216,75 & 0,00 \% \\
53 −9 & Toit $=199{,}02\times1{,}00\times1{,}10$ & 218,92 m\up{2} & 218,92 & 0,00 \% \\
54 −10 & Planchers portés $=176{,}40+176{,}40$ & 352,80 m\up{2} & 352,81 & 0,00 \% \\
55 −11 & Gypse murs $=216{,}75+2\times292{,}31$ & 801,39 m\up{2} & 801,38 & 0,00 \% \\
56 −12 & Peinture $=801{,}39+352{,}80$ & 1\,154,19 m\up{2} & 1\,154,18 & 0,00 \% \\
47 +3 & Murs de fondation $=57{,}40\times2{,}44$ & 140,06 m\up{2} & 140,06 & 0,00 \% \\
48 +4 & Murs extérieurs bruts $=57{,}40\times2{,}44\times2$ & 280,11 m\up{2} & 280,11 & 0,00 \% \\
49 +5 & Murs extérieurs nets $=280{,}11-63{,}36$ & 216,75 m\up{2} & 216,75 & 0,00 \% \\
50 +6 & Toit $=199{,}02\times1{,}00\times1{,}10$ & 218,92 m\up{2} & 218,92 & 0,00 \% \\
51 +7 & Planchers portés $=176{,}40+176{,}40$ & 352,80 m\up{2} & 352,81 & 0,00 \% \\
57 52 \bottomrule
58 53 \end{tabular}
59 54 \end{center}
60 −Formules dans \texttt{Relevé!F16:F27}, écarts \texttt{=F16/G16-1} en H. Les douze écarts sont nuls (arrondis au centième près) : la lecture du plan est cohérente avec le relevé automatique.
55 +Formules dans \texttt{Relevé!F16:F22}, écarts \texttt{=F16/G16-1} en H. Les sept écarts sont nuls (arrondis au centième près) : la lecture du plan est cohérente avec le relevé automatique, et ces grandeurs sont les quantités des composantes 3, 5 à 10 du tableau 4.
61 56 \end{solution}
62 57 \begin{notescorrection}
63 −8 pts pour les douze formules (⅔ pt chacune, liées à Données); 2 pts pour les écarts et, le cas échéant, la correction d'une anomalie. Erreur fréquente : prendre 18,30 $\times$ 10,40 $=$ 190,32 m\up{2} comme empreinte (dimensions à l'axe) --- écart $-4{,}4$~\% signalé par la mise en forme.
58 +6 pts pour les sept formules (liées à Données); 2 pts pour les écarts et, le cas échéant, la correction d'une anomalie. Erreur fréquente : prendre 18,30 $\times$ 10,40 $=$ 190,32 m\up{2} comme empreinte (dimensions à l'axe) --- écart $-4{,}4$~\% signalé par la mise en forme.
64 59 \end{notescorrection}
65 60 \end{questionexam}
66 61
67 −\begin{questionexam}{Tarification RSMeans des 64 lignes}{16}
62 +\begin{questionexam}{Bordereau des 22 composantes}{12}
68 63 \begin{solution}
69 −Formules de la ligne 32 copiées vers le bas : \texttt{K32 =RECHERCHEV(G32;Données!\$B\$159:\$D\$163;3;FAUX)}, \texttt{L32 =F32*H32*K32}, \texttt{P32 =M32+N32+O32}, \texttt{Q32 =L32*P32}. Exemples : excavation $651{,}77 \times 1 \times 1{,}307951 = 852{,}48$~vg\up{3} $\times$ 2,26~\$ $=$ 1\,926,60~\$; poutre LVL $16{,}69 \times 3 \times 3{,}28084 = 164{,}27$~pi $\times$ 15,63~\$ $=$ 2\,567,57~\$; brique $173{,}40 \times 10{,}7639 = 1\,866{,}46$~pi\up{2} $\times$ 41,54~\$ $=$ \textbf{77\,532,83~\$}.\\
70 −\textbf{Total direct nu} \texttt{Q96} $=$ \textbf{471\,076,32~\$} (révision r1 : 471\,085,04; écart de 9~\$ d'arrondi). Matériaux 335\,681,75~\$; main-d'œuvre 128\,998,38~\$; équipement 6\,396,19~\$; \textbf{part de la main-d'œuvre 27,4~\%}.\\
71 −Sous-totaux par division (\texttt{=SOMME.SI(\$C\$32:\$C\$95;B105;\$Q\$32:\$Q\$95)}) : 03 béton 36\,076 (7,7~\%); 05 métaux 776; 06 bois 49\,582 (10,5~\%); \textbf{07 enveloppe 106\,069 (22,5~\%)}; 08 ouvertures 45\,131 (9,6~\%); 09 finitions 78\,648 (16,7~\%); 11 cuisines 54\,980 (11,7~\%); 22 plomberie 42\,788 (9,1~\%); 23 CVCA 13\,912; 26 électricité 27\,346 (5,8~\%); 31 terrassement 4\,900; 32 extérieur 2\,736; 33 services 8\,133 --- tous à moins de 5~\$ du tableau 6 (colonne H « ✓ »).\\
72 −Trois postes les plus lourds (\texttt{=GRANDE.VALEUR(\$Q\$32:\$Q\$95;1)} puis \texttt{INDEX/EQUIV}) : \textbf{placage de brique 77\,533~\$}, \textbf{armoires et comptoirs de cuisine 42\,103~\$}, \textbf{murs de fondation coffrés 23\,260~\$} --- 30~\% du direct nu à eux trois.
64 +Formules de la ligne 27 copiées vers le bas : \texttt{K27 =H27+I27+J27}, \texttt{L27 =F27*K27}. Exemples : excavation $651{,}77$~m\up{3} $\times$ 7,52~\$ $=$ 4\,901,31~\$; toiture complète $218{,}92$~m\up{2} $\times$ 89,90~\$ $=$ 19\,680,91~\$; brique $173{,}40$~m\up{2} $\times$ 447,13~\$ $=$ \textbf{77\,532,34~\$}; cuisines $4 \times 13\,746{,}22 = 54\,984{,}88$~\$.\\
65 +\textbf{Total direct nu} \texttt{L49} $=$ \textbf{471\,100,03~\$} (révision r1 : 471\,085,04; écart de 15~\$ d'arrondi des prix composites). Matériaux 335\,692,60~\$; main-d'œuvre 129\,011,05~\$; équipement 6\,396,38~\$; \textbf{part de la main-d'œuvre 27,4~\%}.\\
66 +Sous-totaux par division (\texttt{=SOMME.SI(\$C\$27:\$C\$48;B58;\$L\$27:\$L\$48)}) : 03 béton (fondations, sous-sol) 48\,704 (10,3~\%); 06 bois 38\,027 (8,1~\%); \textbf{07 enveloppe et toiture 107\,365 (22,8~\%)}; 08 ouvertures 43\,545 (9,2~\%); 09 finitions 78\,658 (16,7~\%); 11 cuisines 54\,985 (11,7~\%); 22 plomberie 42\,788 (9,1~\%); 23 CVCA 13\,912; 26 électricité 27\,346 (5,8~\%); 31 terrassement 4\,901; 32 extérieur 2\,736; 33 services 8\,133 --- tous à moins de 25~\$ du tableau 5 (colonne H « ✓ »).\\
67 +Trois composantes les plus lourdes (\texttt{=GRANDE.VALEUR(\$L\$27:\$L\$48;1)} puis \texttt{INDEX/EQUIV}) : \textbf{revêtement de brique 77\,532~\$}, \textbf{cuisines 54\,985~\$}, \textbf{planchers finis 35\,680~\$} --- 36~\% du direct nu à elles trois.
73 68 \end{solution}
74 69 \begin{notescorrection}
75 −Conversion par RECHERCHEV (3; une valeur tapée $=$ 1); quantité RSMeans avec le facteur (3; facteur oublié sur LVL / XPS / membrane $= -1$); coût unitaire et montant (3); total et ventilation matériaux / MO / équipement (2); sous-totaux SOMME.SI (3; codes « 03 » en texte : un EQUIV numérique échoue); top 3 (2).
70 +Coût unitaire et montant par formule (4; une valeur tapée $=$ 1); total et ventilation matériaux / MO / équipement par SOMMEPROD (3); sous-totaux SOMME.SI (3; codes « 03 » en texte : un EQUIV numérique échoue); trois composantes (2).
76 71 \end{notescorrection}
77 72 \end{questionexam}
78 73
79 74 \begin{questionexam}{Des coûts nus aux coûts directs du cours}{8}
80 75 \begin{solution}
81 −a) Localisés $= 471\,076{,}32 + 255{,}83 = \mathbf{471\,332{,}15}$~\$. b) Conditions générales $8~\% = 37\,706{,}57$. c) Frais généraux $7~\% \times (471\,332{,}15 + 37\,706{,}57) = 35\,632{,}71$. d) Profit de l'entrepreneur $8~\% \times 544\,671{,}43 = 43\,573{,}71$. e) \textbf{Coûts directs au sens du cours} $= \mathbf{588\,245{,}15}$~\$. f) Contingences $5~\% \times 471\,332{,}15 = 23\,566{,}61$. g) \textbf{Directs $+$ contingences} $= \mathbf{611\,811{,}75}$~\$ --- la révision r1 donne 611\,823,07~\$ (écart $-11$~\$, \texttt{D16} « ✓ »). Les majorations de l'entrepreneur ajoutent 24,8~\% aux coûts nus.
76 +a) Localisés $= 471\,100{,}03 + 255{,}83 = \mathbf{471\,355{,}86}$~\$. b) Conditions générales $8~\% = 37\,708{,}47$. c) Frais généraux $7~\% \times (471\,355{,}86 + 37\,708{,}47) = 35\,634{,}50$. d) Profit de l'entrepreneur $8~\% \times 544\,698{,}83 = 43\,575{,}91$. e) \textbf{Coûts directs au sens du cours} $= \mathbf{588\,274{,}74}$~\$. f) Contingences $5~\% \times 471\,355{,}86 = 23\,567{,}79$. g) \textbf{Directs $+$ contingences} $= \mathbf{611\,842{,}53}$~\$ --- la révision r1 donne 611\,823,07~\$ (écart $+19$~\$, \texttt{D16} « ✓ »). Les majorations de l'entrepreneur ajoutent 24,8~\% aux coûts nus.
82 77 \end{solution}
83 78 \begin{notescorrection}
84 −Ordre respecté (cumuls) : 5 pts --- appliquer 8 + 7 + 8 $=$ 23~\% sur la même base (580\,000~\$) vaut 3/5; e, f et contrôle : 3 pts. Contingences sur les directs du cours (29\,412~\$) : $-1$.
79 +Ordre respecté (cumuls) : 5 pts --- appliquer 8 + 7 + 8 $=$ 23~\% sur la même base (580\,000~\$) vaut 3/5; e, f et contrôle : 3 pts. Contingences sur les directs du cours (29\,414~\$) : $-1$.
85 80 \end{notescorrection}
86 81 \end{questionexam}
87 82
88 83 \begin{questionexam}{Permis de construction réel et garantie GCR}{8}
89 84 \begin{solution}
90 −a) Permis $=\max\bigl(4{,}70/1\,000 \times 611\,811{,}75;\; 335 \times 4\bigr) = \max(2\,875{,}52;\; 1\,340) = \mathbf{2\,875{,}52}$~\$ : le tarif proportionnel l'emporte; le \texttt{MAX} doit être présent et fonctionnel (test : avec 200\,000~\$ de travaux, 1\,340~\$ s'appliquerait). b) GCR $= 4 \times 2\,656{,}68 = \mathbf{10\,626{,}72}$~\$.
85 +a) Permis $=\max\bigl(4{,}70/1\,000 \times 611\,842{,}53;\; 335 \times 4\bigr) = \max(2\,875{,}66;\; 1\,340) = \mathbf{2\,875{,}66}$~\$ : le tarif proportionnel l'emporte; le \texttt{MAX} doit être présent et fonctionnel (test : avec 200\,000~\$ de travaux, 1\,340~\$ s'appliquerait). b) GCR $= 4 \times 2\,656{,}68 = \mathbf{10\,626{,}72}$~\$.
91 86 \end{solution}
92 87 \begin{notescorrection}
93 88 MAX correct et assiette directs $+$ contingences : 5 pts (MAX absent mais résultat juste : 3/5); GCR : 3 pts.
@@ -96,7 +91,7 @@ MAX correct et assiette directs $+$ contingences : 5 pts (MAX absent mais résul
96 91
97 92 \begin{questionexam}{Intérêts intercalaires}{10}
98 93 \begin{solution}
99 −a) $i = 4{,}70~\% + 2{,}05~\% = \mathbf{6{,}75~\%}$. b) $I = 611\,811{,}75 \times 0{,}0675 \times \tfrac{12}{12} \times \tfrac{1}{2} = \mathbf{20\,648{,}65}$~\$. c) Le prêt de construction est tiré \textbf{au rythme des travaux} (décaissements progressifs à chaque certificat d'avancement) : l'encours moyen sur les 12 mois vaut environ la moitié du coût final, d'où le facteur ½ --- on ne paie pas 6,75~\% sur 611\,812~\$ pendant un an. Il est \textbf{trop optimiste} si les décaissements sont concentrés tôt (structure et enveloppe payées dans les premiers mois, acomptes aux fournisseurs, terrain financé par le même prêt) ou si le chantier s'étire après la fin des tirages : l'encours moyen dépasse alors 50~\%.
94 +a) $i = 4{,}70~\% + 2{,}05~\% = \mathbf{6{,}75~\%}$. b) $I = 611\,842{,}53 \times 0{,}0675 \times \tfrac{12}{12} \times \tfrac{1}{2} = \mathbf{20\,649{,}69}$~\$. c) Le prêt de construction est tiré \textbf{au rythme des travaux} (décaissements progressifs à chaque certificat d'avancement) : l'encours moyen sur les 12 mois vaut environ la moitié du coût final, d'où le facteur ½ --- on ne paie pas 6,75~\% sur 611\,843~\$ pendant un an. Il est \textbf{trop optimiste} si les décaissements sont concentrés tôt (structure et enveloppe payées dans les premiers mois, acomptes aux fournisseurs, terrain financé par le même prêt) ou si le chantier s'étire après la fin des tirages : l'encours moyen dépasse alors 50~\%.
100 95 \end{solution}
101 96 \begin{notescorrection}
102 97 a : 2 pts; b : 5 pts (½ oublié $= -3$; taux non composé avec la prime $= -1$); c : 3 pts (encours moyen 2, cas limite 1).
@@ -105,19 +100,19 @@ a : 2 pts; b : 5 pts (½ oublié $= -3$; taux non composé avec la prime $= -1$)
105 100
106 101 \begin{questionexam}{Autres coûts indirects et total}{8}
107 102 \begin{solution}
108 −a) Honoraires $4~\% \times 588\,245{,}15 = \mathbf{23\,529{,}81}$. b) Assurance $0{,}8~\% \times 611\,811{,}75 = \mathbf{4\,894{,}49}$. Frais juridiques 9\,500 (liés). c) \textbf{Total des indirects} $= 2\,875{,}52 + 10\,626{,}72 + 20\,648{,}65 + 23\,529{,}81 + 4\,894{,}49 + 9\,500 = \mathbf{72\,075{,}18}$~\$. d) Ratio $= 72\,075 / 588\,245 = \mathbf{12{,}3~\%}$ --- sous la fourchette de 15--25~\% de la séance 8 : il manque le marketing / la location, les frais de dossier bancaire, l'inspection et les essais, les taxes foncières pendant le chantier, et les honoraires sont modestes (plans de gabarit).
103 +a) Honoraires $4~\% \times 588\,274{,}74 = \mathbf{23\,530{,}99}$. b) Assurance $0{,}8~\% \times 611\,842{,}53 = \mathbf{4\,894{,}74}$. Frais juridiques 9\,500 (liés). c) \textbf{Total des indirects} $= 2\,875{,}66 + 10\,626{,}72 + 20\,649{,}69 + 23\,530{,}99 + 4\,894{,}74 + 9\,500 = \mathbf{72\,077{,}80}$~\$. d) Ratio $= 72\,078 / 588\,275 = \mathbf{12{,}3~\%}$ --- sous la fourchette de 15--25~\% de la séance 8 : il manque le marketing / la location, les frais de dossier bancaire, l'inspection et les essais, les taxes foncières pendant le chantier, et les honoraires sont modestes (plans de gabarit).
109 104 \end{solution}
110 105 \begin{notescorrection}
111 106 Honoraires sur les directs du cours : 3 pts (sur les directs nus : 2; sur directs $+$ contingences : 2); assurance : 1; total et ratio : 4 (ratio commenté : 1 des 4).
112 107 \end{notescorrection}
113 108 \end{questionexam}
114 109
115 −\begin{questionexam}{Profit entrepreneurial, coût total et unités de comparaison}{8}
110 +\begin{questionexam}{Profit entrepreneurial, coût total et unités de comparaison}{10}
116 111 \begin{solution}
117 −a) Assiette $= 611\,811{,}75 + 72\,075{,}18 = 683\,886{,}93$; profit $11~\% = \mathbf{75\,227{,}56}$; \textbf{coût total de remplacement neuf $= 759\,114{,}50$~\$} (hors taxes). b) $759\,114{,}50 / (398{,}04 \times 10{,}7639 = 4\,284{,}5~\text{pi}^2) = \mathbf{177{,}18~\$/pi\up{2}}$ hors sol; $/ 3\,797{,}6~\text{pi}^2 = \mathbf{199{,}89~\$/pi\up{2}}$ chauffé; $/4 = \mathbf{189\,778{,}62~\$/logement}$. c) Sur les directs seuls : $11~\% \times 588\,245{,}15 = 64\,706{,}97$~\$, soit \textbf{10\,520,60~\$ de moins} ($-1{,}4$~\% du coût total). Deux conventions coexistent : même pourcentage, assiettes différentes, deux coûts neufs différents --- l'évaluateur doit \textbf{énoncer la sienne} (normes OEAQ : hypothèses et méthodes explicites) pour que le lecteur puisse répliquer le calcul et comparer des bordereaux. Du point de vue du promoteur, la base la plus défendable est l'\textbf{investissement total à risque} (directs $+$ indirects, intercalaires compris) : c'est sur ce capital qu'il exige un rendement. Informatif : TPS 37\,955,72; TVQ 75\,721,67; TTC 872\,791,89~\$.
112 +a) Assiette $= 611\,842{,}53 + 72\,077{,}80 = 683\,920{,}33$; profit $11~\% = \mathbf{75\,231{,}24}$; \textbf{coût total de remplacement neuf $= 759\,151{,}56$~\$} (hors taxes). b) $759\,151{,}56 / (398{,}04 \times 10{,}7639 = 4\,284{,}5~\text{pi}^2) = \mathbf{177{,}19~\$/pi\up{2}}$ hors sol; $/ 3\,797{,}6~\text{pi}^2 = \mathbf{199{,}90~\$/pi\up{2}}$ chauffé; $/4 = \mathbf{189\,787{,}89~\$/logement}$. c) Sur les directs seuls : $11~\% \times 588\,274{,}74 = 64\,710{,}22$~\$, soit \textbf{10\,521,01~\$ de moins} ($-1{,}4$~\% du coût total). Deux conventions coexistent : même pourcentage, assiettes différentes, deux coûts neufs différents --- l'évaluateur doit \textbf{énoncer la sienne} (normes OEAQ : hypothèses et méthodes explicites) pour que le lecteur puisse répliquer le calcul et comparer des bordereaux. Du point de vue du promoteur, la base la plus défendable est l'\textbf{investissement total à risque} (directs $+$ indirects, intercalaires compris) : c'est sur ce capital qu'il exige un rendement. Informatif : TPS 37\,957,58; TVQ 75\,725,37; TTC 872\,834,51~\$.
118 113 \end{solution}
119 114 \begin{notescorrection}
120 −a : 3 pts (assiette correcte 2); b : 2 pts; c : 3 pts (écart chiffré 1, nécessité d'énoncer 1, base défendable 1).
115 +a : 4 pts (assiette correcte 2); b : 3 pts; c : 3 pts (écart chiffré 1, nécessité d'énoncer 1, base défendable 1).
121 116 \end{notescorrection}
122 117 \end{questionexam}
123 118
@@ -133,38 +128,35 @@ a : 3 pts (assiette correcte 2); b : 2 pts; c : 3 pts (écart chiffré 1, néces
133 128 \midrule
134 129 Q1 & 180, rue O'Brien & 1\,145\,000 & 288\,230 & 856\,770 & 4\,505 & 214\,192 & 1,437 \\
135 130 Q2 & 160, rue O'Brien & 1\,168\,000 & 288\,104 & 879\,896 & 4\,626 & 219\,974 & 1,466 \\
136 −Q3 & 18, rue du Campagnard & 1\,193\,000 & 256\,051 & 936\,949 & 4\,310 & 234\,237 & 1,264 \\
137 −Q4 & 94, rue de l'Écorce & 1\,100\,000 & 256\,428 & 843\,572 & 4\,300 & 210\,893 & 1,377 \\
138 −Q5 & 390, rue Raymond & 1\,165\,000 & 288\,104 & 876\,896 & 4\,610 & 219\,224 & 1,277 \\
139 −Q6 & 24, boul. Sacré-Cœur & 1\,300\,000 & 261\,330 & 1\,038\,670 & 3\,895 & 259\,667 & 1,354 \\
140 −Q7 & 203, rue de la Cité-Jardin & 1\,199\,500 & 273\,398 & 926\,102 & 4\,028 & 231\,526 & 1,178 \\
141 −Q8 & 7, rue Damphousse & 1\,125\,000 & 231\,916 & 893\,084 & 3\,731 & 223\,271 & 1,099 \\
142 −Q9 & 767, rue Notre-Dame & 1\,205\,276 & 231\,414 & 973\,862 & 4\,201 & 243\,466 & 1,225 \\
143 −Q10 & 380, rue Raymond & 1\,140\,000 & 288\,104 & 851\,896 & 4\,479 & 212\,974 & 1,421 \\
144 −Q11 & 1151, rue Notre-Dame & 849\,411 & 234\,053 & 615\,358 & 3\,165 & 153\,839 & 0,943 \\
131 +Q3 & 94, rue de l'Écorce & 1\,100\,000 & 256\,428 & 843\,572 & 4\,300 & 210\,893 & 1,377 \\
132 +Q4 & 390, rue Raymond & 1\,165\,000 & 288\,104 & 876\,896 & 4\,610 & 219\,224 & 1,277 \\
133 +Q5 & 7, rue Damphousse & 1\,125\,000 & 231\,916 & 893\,084 & 3\,731 & 223\,271 & 1,099 \\
134 +Q6 & 767, rue Notre-Dame & 1\,205\,276 & 231\,414 & 973\,862 & 4\,201 & 243\,466 & 1,225 \\
135 +Q7 & 380, rue Raymond & 1\,140\,000 & 288\,104 & 851\,896 & 4\,479 & 212\,974 & 1,421 \\
136 +Q8 & 1151, rue Notre-Dame & 849\,411 & 234\,053 & 615\,358 & 3\,165 & 153\,839 & 0,943 \\
145 137 \midrule
146 − & \textbf{Médianes} & 1\,165\,000 & & \textbf{879\,896} & \textbf{4\,300} & \textbf{219\,974} & \textbf{1,277} \\
138 + & \textbf{Médianes} & 1\,142\,500 & & \textbf{866\,833} & \textbf{4\,389} & \textbf{216\,708} & \textbf{1,327} \\
147 139 \bottomrule
148 140 \end{tabular}
149 141 \end{center}
150 −\textbf{b)} Bordereau 759\,115~\$ contre 879\,896~\$ : écart \textbf{$-13{,}7$~\%}; contre le moteur de coût (827\,445~\$) : \textbf{$-8{,}3$~\%} (dans sa fourchette p10--p90 de 763\,109 -- 891\,781~\$); 177,18~\$/pi\up{2} hors sol $<$ 180 : « \textbf{sous la fourchette} » Altus (mais 199,89~\$/pi\up{2} chauffé est dedans --- l'unité de surface compte). \textbf{c)} Profit extrait $= (879\,896 - 683\,887) / 683\,887 = \mathbf{28{,}7~\%}$, contre 11~\% de convention. \textbf{d)} A1 : $1\,329\,000 - 240\,700 \times 1{,}257 = 1\,026\,440$~\$ (256\,610~\$/logement); A2 : $1\,289\,900 - 210\,100 \times 1{,}257 = 1\,025\,804$~\$ (256\,451~\$/logement) --- prix demandés d'immeubles de 2020 à 3 étages. \textbf{e)} Lecture attendue : le marché 2025 paie les quadruplex neufs \textbf{plus cher que leur coût de création} (profit implicite $\approx$ 29~\%), ce qui attire les promoteurs et confirme la viabilité; mais (1) les comparables ont deux logements au rez-de-jardin (sous-sol fini) et parfois trois étages --- plus de finition que notre sous-sol non fini; (2) qualité et année varient (Q6 : Hull, 3 étages, 1,3~M\$); (3) le terrain indexé par le ratio des terrains vacants (1,257) est une approximation --- un ratio de 1,10 ferait monter la valeur implicite du bâtiment; (4) la dispersion des ratios prix $\div$ rôle (0,94 à 1,47) rappelle que le rôle est daté de 2022; (5) Q11 (livraison 2024, 849\,411~\$) tire la médiane vers le bas; (6) les annonces sont des prix \emph{demandés}. Pour le promoteur : coût de création $\approx$ 759\,000~\$ $+$ terrain contre une valeur $\approx$ 880\,000~\$ $+$ terrain; la marge réelle dépendra des soumissions, de la durée du chantier et du niveau de finition.
142 +\textbf{b)} Bordereau 759\,152~\$ contre 866\,833~\$ : écart \textbf{$-12{,}4$~\%}; contre le moteur de coût (827\,445~\$) : \textbf{$-8{,}3$~\%} (dans sa fourchette p10--p90 de 763\,109 -- 891\,781~\$); 177,19~\$/pi\up{2} hors sol $<$ 180 : « \textbf{sous la fourchette} » Altus (mais 199,90~\$/pi\up{2} chauffé est dedans --- l'unité de surface compte). \textbf{c)} Profit extrait $= (866\,833 - 683\,920) / 683\,920 = \mathbf{26{,}7~\%}$, contre 11~\% de convention. \textbf{d)} Lecture attendue : le marché 2025 paie les quadruplex neufs \textbf{plus cher que leur coût de création} (profit implicite $\approx$ 27~\%), ce qui attire les promoteurs et confirme la viabilité; mais (1) les comparables ont deux logements au rez-de-jardin (sous-sol fini) --- plus de finition que notre sous-sol non fini; (2) qualité et année varient; (3) le terrain indexé par le ratio des terrains vacants (1,257) est une approximation --- un ratio de 1,10 ferait monter la valeur implicite du bâtiment; (4) la dispersion des ratios prix $\div$ rôle (0,94 à 1,47) rappelle que le rôle est daté de 2022; (5) Q8 (livraison 2024, 849\,411~\$) tire la médiane vers le bas; (6) les annonces A1 et A2 du tableau 9 ($\approx$ 1,3~M\$ demandés pour des quadruplex de 2020 à 3 étages, soit $\approx$ 256\,500~\$ de bâtiment implicite par logement) sont des prix \emph{demandés}. Pour le promoteur : coût de création $\approx$ 759\,000~\$ $+$ terrain contre une valeur $\approx$ 867\,000~\$ $+$ terrain; la marge réelle dépendra des soumissions, de la durée du chantier et du niveau de finition.
151 143 \end{solution}
152 144 \begin{notescorrection}
153 −a : 5 pts (terrain indexé 1, bâtiment implicite 1, \$/m\up{2} et \$/logement 1, ratio 1, médianes 1); b : 3 pts (formule SI fonctionnelle 1); c : 2 pts (assiette $=$ Bordereau!C36 : oublier les indirects $= -1$); d : 1 pt; e : 3 pts (viabilité 1, au moins trois limites nommées avec les données 2).
145 +a : 5 pts (terrain indexé 1, bâtiment implicite 1, \$/m\up{2} et \$/logement 1, ratio 1, médianes 1); b : 3 pts (formule SI fonctionnelle 1); c : 2 pts (assiette $=$ Bordereau!C36 : oublier les indirects $= -1$); d : 4 pts (viabilité 1, au moins trois limites nommées avec les données 3).
154 146 \end{notescorrection}
155 147 \end{questionexam}
156 148
157 −\begin{questionexam}{Tableau de bord et note au promoteur}{12}
149 +\begin{questionexam}{Tableau de bord et note au promoteur}{14}
158 150 \begin{solution}
159 −KPI : indirects 72\,075~\$ (\texttt{=SIERREUR(Bordereau!C32;"—")}), profit 75\,228~\$, 177,18~\$/pi\up{2}, écart marché $-13{,}7$~\%. Verdict : \textbf{« Coût sous la valeur de marché --- projet viable (marge $>$ 11~\%) »}. Troisième graphique de référence : matériaux / main-d'œuvre / équipement (335\,682 / 128\,998 / 6\,396~\$). Note au promoteur (éléments attendus) : coût total 759\,115~\$, 177~\$/pi\up{2} hors sol, 200~\$/pi\up{2} chauffé, 189\,779~\$/logement, indirects $+$ profit $=$ 19,4~\% du total; postes sensibles : brique (77\,533~\$, 16,5~\% du direct nu), armoires (42\,103), fondations (23\,260), enveloppe 22,5~\%, main-d'œuvre 27,4~\%; \textbf{retard de 6 mois} : $I = 611\,812 \times 6{,}75~\% \times \tfrac{18}{12} \times \tfrac{1}{2} = 30\,973$~\$, soit $\mathbf{+10\,324}$~\$ ($+50$~\% du poste), et $\approx +11\,460$~\$ sur le coût total une fois le profit de 11~\% appliqué ($\approx$ 770\,575~\$, $+1{,}5$~\%); marché, moteur et Altus comme à la question 9; conventions déclarées (profit sur directs $+$ contingences $+$ indirects; contingences 5~\% des nus; taxes de 113\,677~\$ exclues); limites (plan générique, prix RSMeans, comparables au rez-de-jardin, terrain indexé, annonces; aucune provision pour stationnements, paysagement, balcons et escaliers extérieurs).
151 +KPI : indirects 72\,078~\$ (\texttt{=SIERREUR(Bordereau!C32;"—")}), profit 75\,231~\$, 177,19~\$/pi\up{2}, écart marché $-12{,}4$~\%. Verdict : \textbf{« Coût sous la valeur de marché --- projet viable (marge $>$ 11~\%) »}. Troisième graphique de référence : matériaux / main-d'œuvre / équipement (335\,693 / 129\,011 / 6\,396~\$). Note au promoteur (éléments attendus) : coût total 759\,152~\$, 177~\$/pi\up{2} hors sol, 200~\$/pi\up{2} chauffé, 189\,788~\$/logement, indirects $+$ profit $=$ 19,4~\% du total; postes sensibles : brique (77\,532~\$, 16,5~\% du direct nu), cuisines (54\,985), planchers finis (35\,680), enveloppe et toiture 22,8~\%, main-d'œuvre 27,4~\%; \textbf{retard de 6 mois} : $I = 611\,843 \times 6{,}75~\% \times \tfrac{18}{12} \times \tfrac{1}{2} = 30\,975$~\$, soit $\mathbf{+10\,325}$~\$ ($+50$~\% du poste), et $\approx +11\,460$~\$ sur le coût total une fois le profit de 11~\% appliqué ($\approx$ 770\,612~\$, $+1{,}5$~\%); marché, moteur et Altus comme à la question 9; conventions déclarées (profit sur directs $+$ contingences $+$ indirects; contingences 5~\% des nus; taxes de 113\,683~\$ exclues); limites (plan générique, prix RSMeans, comparables au rez-de-jardin, terrain indexé, annonces; aucune provision pour stationnements, paysagement, balcons et escaliers extérieurs).
160 152 \end{solution}
161 153 \begin{notescorrection}
162 −KPI : 4 pts; verdict cohérent : 1; 3\up{e} graphique titré : 2; note : 5 (retard chiffré 2, cellules citées 1, conventions et limites 2).
154 +KPI : 4 pts; verdict cohérent : 2; 3\up{e} graphique titré : 2; note : 6 (retard chiffré 2, cellules citées 1, conventions et limites 3).
163 155 \end{notescorrection}
164 156 \end{questionexam}
165 157
166 158 \begin{notescorrection}[Rappels transversaux et pièges]
167 −Facteur ½ omis; honoraires sur les directs nus; profit entrepreneurial sur les directs seuls sans le déclarer; majorations de l'entrepreneur appliquées sur une base commune au lieu des cumuls; codes de division numériques dans SOMME.SI; empreinte à l'axe (190,32~m\up{2}); terrain non indexé à la question 9 (bâtiment implicite médian 935\,800~\$ et profit extrait 36,8~\% --- recevable si déclaré); unité de surface non précisée pour le \$/pi\up{2}. Bordereau non chaîné : plafond 50~\% des questions 2 à 9.
159 +Facteur ½ omis; honoraires sur les directs nus; profit entrepreneurial sur les directs seuls sans le déclarer; majorations de l'entrepreneur appliquées sur une base commune au lieu des cumuls; codes de division numériques dans SOMME.SI; empreinte à l'axe (190,32~m\up{2}); terrain non indexé à la question 9 (bâtiment implicite médian $\approx$ 924\,000~\$ et profit extrait $\approx$ 35~\% --- recevable si déclaré); unité de surface non précisée pour le \$/pi\up{2}. Bordereau non chaîné : plafond 50~\% des questions 2 à 9.
168 160 \end{notescorrection}
169 161
170 162 \medskip
modified IMM1033-20_Methodes_du_cout/03_Travaux_pratiques/TP2_Bordereau_de_cout_neuf/solutionnaire_enseignant/IMM1033-20_TP2_solutionnaire.xlsx +0 −0

Binary file not shown.

modified IMM1033-20_Methodes_du_cout/05_Ressources/scripts_gabarits_excel/build_tp2_donnees.py +58 −2
@@ -76,6 +76,61 @@ for pg in cas["pages"]:
76 76
77 77 t = r["totals"]
78 78 spec = cas["project"]["spec"]
79 +
80 +# --- Composantes (version allégée du 2026-10-29 soir) : 22 postes à prix composites nus en unités SI, dérivés des 64 lignes ---
81 +COMP_DEF = [ # (division, composante, détail, quantité, unité, [numéros de lignes])
82 + ("31", "Excavation, remblai et drain français", "excavation en masse, remblai, drain de fondation perforé", 651.77, "m³ excavé", [1, 2, 3]),
83 + ("33", "Branchements des services", "aqueduc, égout et électricité (catalogue UQO Éval)", 1, "forfait", [4]),
84 + ("03", "Fondations : semelles, murs coffrés et membrane", "semelle filante 24 × 12 po, mur de béton 8 po, enduit d'imperméabilisation", 140.06, "m² de mur de fondation", [5, 6, 7]),
85 + ("03", "Sous-sol : dalle, isolation XPS et fenêtres", "dalle 4 po, XPS 2 po deux couches, 3 fenêtres utilitaires", 199.02, "m² de dalle", [8, 9, 23]),
86 + ("06", "Planchers portés", "solives en I 24 po c/c et sous-plancher OSB ¾ po", 352.81, "m² de plancher", [10, 11]),
87 + ("06", "Ossature de bois", "murs extérieurs 2 × 6 + contreplaqué ½ po, cloisons 2 × 4, poutre LVL, colonnes", 572.42, "m² de mur (ext. brut + cloisons)", [12, 13, 14, 15, 16]),
88 + ("07", "Toiture complète", "fermes, support CDX ½ po, membrane APP 2 couches, soffites, gouttières et descentes", 218.92, "m² de toit", [17, 18, 26, 27, 28, 29]),
89 + ("07", "Isolation des murs extérieurs R-24 et du comble R-50", "matelas R-21 (≈ R-24) + cellulose soufflée", 415.77, "m² isolé (murs nets + comble)", [21, 22]),
90 + ("07", "Revêtement de brique (80 %)", "placage de brique standard, appareil courant", 173.40, "m² de mur net", [24]),
91 + ("07", "Revêtement de vinyle (20 %)", "revêtement de vinyle double 5 po", 43.35, "m² de mur net", [25]),
92 + ("08", "Fenêtres", "fenêtre de vinyle à guillotine 3 × 4½ pi avec moustiquaire", 24, "unité", [30]),
93 + ("08", "Portes extérieures et portes-patio", "4 portes d'acier isolées + 4 portes-patio coulissantes 6 pi", 8, "unité", [31, 32]),
94 + ("08", "Portes intérieures et de garde-robe", "16 portes prémontées à âme creuse + 11 portes pliantes", 27, "unité", [33, 34]),
95 + ("09", "Gypse et peinture", "gypse ½ po murs, ⅝ po plafonds, peinture latex 2 couches", 1154.19, "m² de gypse", [35, 36, 37]),
96 + ("09", "Planchers finis", "bois franc préverni (60 %), céramique (25 %), vinyle de luxe (15 %)", 352.81, "m² de plancher", [38, 39, 40]),
97 + ("09", "Escaliers, rampes, plinthes et tablettes", "2 escaliers préfabriqués, mains courantes, plinthe ogee, tablettes de pin", 1, "forfait", [19, 20, 41, 42]),
98 + ("11", "Cuisines", "armoires, comptoirs stratifiés, éviers avec robinet", 4, "logement", [43, 44, 45]),
99 + ("22", "Salles de bain complètes", "toilette, lavabo et robinet, baignoire d'acier, robinetterie", 4, "unité", [46, 47, 48, 49, 50]),
100 + ("22", "Plomberie brute, chauffe-eau et drainage", "28 appareils (alimentation, évacuation, évent), 4 chauffe-eau 60 gal, drainage", 4, "logement", [51, 52, 53]),
101 + ("23", "Chauffage et ventilation", "26 plinthes électriques 1 500 W, 4 échangeurs d'air (VRC)", 4, "logement", [54, 55]),
102 + ("26", "Électricité complète", "4 entrées 200 A et panneaux, filage brut, 54 luminaires, 3 lanternes", 4, "logement", [56, 57, 58, 59, 60, 61, 62, 63]),
103 + ("32", "Perron préfabriqué", "5 contremarches, 5 pi", 1, "unité", [64]),
104 +]
105 +by_no = {L["no"]: L for L in lignes}
106 +assert sorted(n for *_, nos in COMP_DEF for n in nos) == list(range(1, 65))
107 +composantes = []
108 +for i, (div, nom, det, q, u, nos) in enumerate(COMP_DEF, 1):
109 + tot = sum(by_no[n]["direct"] for n in nos)
110 + mat = sum(by_no[n]["direct"] * by_no[n]["mat"] / by_no[n]["direct_u"] if by_no[n]["direct_u"] else 0 for n in nos)
111 + mo = sum(by_no[n]["direct"] * by_no[n]["mo"] / by_no[n]["direct_u"] if by_no[n]["direct_u"] else 0 for n in nos)
112 + eq = max(tot - mat - mo, 0.0)
113 + pm, pl, pe = round(mat / q, 2), round(mo / q, 2), round(eq / q, 2)
114 + composantes.append({"no": i, "wbs": div, "division": DIV[div], "nom": nom, "detail": det, "qte": q, "unite": u,
115 + "mat": pm, "mo": pl, "eq": pe, "direct_u": round(pm + pl + pe, 2), "direct": round(q * (pm + pl + pe), 2), "direct_r1": round(tot, 2),
116 + "lignes": ", ".join(by_no[n]["code"] for n in nos if by_no[n]["code"]) or "catalogue UQO Éval"})
117 +assert abs(sum(c["direct_r1"] for c in composantes) - t["direct"]) < 0.5
118 +by_wbs_comp = {}
119 +for c in composantes:
120 + by_wbs_comp[c["wbs"]] = round(by_wbs_comp.get(c["wbs"], 0) + c["direct_r1"], 2)
121 +# --- Relevé abrégé : 7 grandeurs du relevé reproduites par les étudiants (question 2) ---
122 +REL_N = {m["nom"]: m for m in mes}
123 +GRANDEURS = [
124 + ("Empreinte du bâtiment (m²) = (L + ép.) × (P + ép.)", "(18,30 + 0,30) × (10,40 + 0,30)", "Dalle de sous-sol 100 mm", "=(Données!D11+Données!D13)*(Données!D12+Données!D13)"),
125 + ("Périmètre des murs à l'axe (m) = 2 × (L + P)", "2 × (18,30 + 10,40)", "Semelles filantes", "=2*(Données!D11+Données!D12)"),
126 + ("Murs de fondation (m²) = périmètre × hauteur du mur", "57,4 × 2,44", "Murs de fondation (h 2.44 m)", "=F17*Données!D15"),
127 + ("Murs extérieurs bruts (m²) = périmètre × hauteur d'étage × niveaux", "57,4 × 2,44 × 2", "Murs extérieurs ossature 2×6", "=F17*Données!D14*Données!D10"),
128 + ("Murs extérieurs nets (m²) = bruts − ouvertures hors sol", "280,11 − 63,36", "Isolation des murs extérieurs R-24", "=F19-E12"),
129 + ("Surface de toit (m²) = empreinte × facteur de pente × débords", "199,02 × 1,00 × 1,10", "Couverture", "=F16*Données!D18*Données!D19"),
130 + ("Planchers portés (m²) = Σ aires des pièces hors sol", "176,40 + 176,40", "Planchers portés (solives)", "=G12"),
131 +]
132 +grandeurs = [{"libelle": a, "indice": b, "releve_nom": c, "releve_valeur": REL_N[c]["valeur"], "releve_unite": REL_N[c]["unite"], "formule": d} for a, b, c, d in GRANDEURS]
133 +
79 134 out = {
80 135 "DATE_EVAL": "dt.date(2026, 10, 29)",
81 136 "PROJET": {"id": cas["project"]["id"], "nom": cas["project"]["name"], "adresse": cas["project"]["address"], "municipalite": "Gatineau",
@@ -85,15 +140,16 @@ out = {
85 140 "prof_excavation": 2.6, "debords": 1.10, "facteur_pente": 1.0, "empreinte": 199.02, "perimetre": 57.4,
86 141 "aire_chauffee": 352.81, "aire_brute_hors_sol": round(2 * 199.02, 2), "sous_sol": 199.02,
87 142 "rsm_location": "GATINEAU (C57)", "rsm_release": "Year 2026 Quarter 4", "mo": "STD (syndiquée)"},
88 − "PAGES": pages, "RELEVE": mes, "LIGNES": lignes, "DIVISIONS": DIV, "CONVERSIONS": {k: {"unite_rsm": v[0], "facteur": v[1], "fr": UNITE_FR[k], "rsm_fr": RSM_FR[v[0]]} for k, v in CONV.items()},
143 + "PAGES": pages, "RELEVE": mes, "LIGNES": lignes, "COMPOSANTES": composantes, "GRANDEURS": grandeurs, "DIVISIONS": DIV, "CONVERSIONS": {k: {"unite_rsm": v[0], "facteur": v[1], "fr": UNITE_FR[k], "rsm_fr": RSM_FR[v[0]]} for k, v in CONV.items()},
89 144 "MOTEUR_QS": {"direct_nu": t["direct"], "ajust_regional": t["locationAdjustment"], "direct_localise": t["located"], "cg_pct": 0.08, "cg": t["generalConditions"],
90 145 "fg_pct": 0.07, "fg": t["overhead"], "profit_pct": 0.08, "profit": t["profit"], "cont_pct": 0.05, "cont": t["contingency"], "total": t["total"],
91 − "mat": t["material"], "mo": t["labour"], "eq": t["equipment"], "by_wbs": {x["wbs"]: x["direct"] for x in r["byWbs"]},
146 + "mat": t["material"], "mo": t["labour"], "eq": t["equipment"], "by_wbs": {x["wbs"]: x["direct"] for x in r["byWbs"]}, "by_wbs_comp": by_wbs_comp,
92 147 "facteurs": r["location"], "ordre": r["applicationOrder"]},
93 148 "VENTES": [{"adresse": v["street"], "secteur": v["sector"], "date": v["date"], "prix": v["amount"], "annee": v["annee_construction"],
94 149 "aire_etages": v["aire_etages_m2"], "terrain": v["superficie_terrain_m2"], "front": v["front_terrain_m"], "etages": v["nb_etages"],
95 150 "lien": v["lien_physique"], "vt": v["valeur_terrain"], "vb": v["valeur_batiment"], "role": v["valeur_role"], "id": v["id_provinc"]}
96 151 for v in sorted(ventes["quad_sales"], key=lambda x: x["date"], reverse=True)],
152 + "VENTES_TP": ["180, rue O'Brien", "160, rue O'Brien", "94, rue de l'Écorce", "390, rue Raymond", "7, rue Damphousse", "767, rue Notre-Dame", "380, rue Raymond", "1151, Rue Notre-Dame"],
97 153 "ANNONCES": [
98 154 {"adresse": "280, rue Champlain", "secteur": "Île de Hull", "prix": 1329000, "annee": 2020, "aire_pi2": 3025, "aire_etages": 281.1, "terrain": 303.5, "etages": 3,
99 155 "logements": 4, "vt": 240700, "vb": 807100, "role": 1047800, "revenus": 79140, "uid": "remax_quebec:22916007", "photo": "champlain-280.jpg",
modified IMM1033-20_Methodes_du_cout/05_Ressources/scripts_gabarits_excel/make_IMM1033_TP2.py +201 −228
@@ -1,14 +1,14 @@
1 1 #!/usr/bin/env python3
2 −"""Gabarit Excel — IMM1033-20 TP2 : Bordereau de coût de remplacement neuf d'un quadruplex avec UQO Éval (design v2).
2 +"""Gabarit Excel — IMM1033-20 TP2 : Bordereau de coût de remplacement neuf d'un quadruplex avec UQO Éval (design v2, version allégée).
3 3
4 4 Toutes les données proviennent de www.uqo-eval.app (extraction du 29 octobre 2026) : cas d'étude « Cas 9 — Quadruplex 2 étages,
5 −Gatineau » du module Quantity Survey (plans, relevé des quantités, 64 lignes tarifées RSMeans 2026 T4 localisées Gatineau),
6 −onze ventes réelles de quadruplex neufs, deux annonces en vigueur, estimation du moteur de coût. Voir tp2_donnees.py.
5 +Gatineau » du module Quantity Survey (plans, relevé des quantités, révision r1 tarifée RSMeans 2026 T4 localisée Gatineau, condensée
6 +en 22 composantes à prix composites nus), huit ventes réelles de quadruplex neufs, deux annonces, estimation du moteur de coût. Voir tp2_donnees.py.
7 7
8 8 Zones de réponse (identiques à l'énoncé LaTeX) :
9 − Relevé Q1 : C5 | Q2 : F16:F27 · H16:H27 | Q3 : K32:L95 · P32:Q95 · Q96 · E98:E101 · E105:F117 · C121:C123 · E121:E123
9 + Relevé Q1 : C5 | Q2 : F16:F22 · H16:H22 | Q3 : K27:L48 · L49 · E51:E54 · E58:F69 · C72:C74 · E72:E74
10 10 Bordereau Q4 : C9:C15 | Q5 : C19:C20 | Q6 : C23:C24 · C25 | Q7 : C29:C30 · C32:C33 | Q8 : C36:C43 · C44
11 − Marché Q9 : J6:N16 · K17:N17 · K21 · K23:K25 · F29:G30 · C33
11 + Marché Q9 : J6:N13 · K14:N14 · K18 · K20:K22 · C25
12 12 Dashboard Q10 : KPI D6:G6 (4 jaunes) · C8 · graphique 3 · onglet Note
13 13 """
14 14 import os
@@ -27,7 +27,7 @@ from openpyxl.worksheet.datavalidation import DataValidation
27 27 from openpyxl.worksheet.hyperlink import Hyperlink
28 28
29 29 import uqo_xlsx as U
30 −from tp2_donnees import ANNONCES, CONVERSIONS, DATE_EVAL, DIVISIONS, LIGNES, MOTEUR_COUT, MOTEUR_QS, PAGES, PARAMS, PROJET, RELEVE, VENTES
30 +from tp2_donnees import ANNONCES, COMPOSANTES, DATE_EVAL, DIVISIONS, GRANDEURS, MOTEUR_COUT, MOTEUR_QS, PAGES, PARAMS, PROJET, VENTES, VENTES_TP
31 31 from uqo_xlsx import (
32 32 BLEU, BLEU_CLAIR, CENTER, FILL_BLEU, FILL_CALCUL, FILL_CLAIR, FILL_DONNEES, FONT_H1, FONT_H2,
33 33 FONT_NORMAL, FONT_NOTE, GRIS, OR, VERT, WRAP, bandeau, legende, note, preparer_feuille, titre_section,
@@ -61,6 +61,8 @@ FMT_P1 = "0.0%"
61 61 FMT_N2 = "#,##0.00"
62 62 FMT_DATE = "yyyy-mm-dd"
63 63 P = PROJET
64 +VTP = [v for v in VENTES if v["adresse"] in VENTES_TP]
65 +NV = len(VTP)
64 66
65 67
66 68 def rep(ws, coord, hint="", num_fmt=None, height=None, comment=None):
@@ -171,28 +173,36 @@ ws = wb.active
171 173 ws.title = "Accueil"
172 174 preparer_feuille(ws, {"B": 7, "C": 44, "D": 22, "E": 10, "F": 30, "G": 22, "H": 26})
173 175 bandeau(ws, "IMM1033-20 — Travail pratique 2",
174 − "Bordereau de coût de remplacement neuf d'un quadruplex avec UQO Éval : relevé des quantités, RSMeans 2026, indirects, profit, marché · Automne 2026 · UQO · Simon-Pierre Boucher", ncols=7)
176 + "Bordereau de coût de remplacement neuf d'un quadruplex avec UQO Éval : composantes RSMeans 2026, indirects réels, profit, marché · Automne 2026 · UQO · Simon-Pierre Boucher", ncols=7)
175 177 titre_section(ws, 5, 2, "Identification", 7)
176 178 for r, lbl in [(6, "Nom, prénom"), (7, "Code permanent"), (8, "Outils utilisés (assistante Éva d'UQO Éval, chatbot du cours, autres)")]:
177 179 c = ws.cell(row=r, column=3, value=lbl); c.font = FONT_H2; c.alignment = WRAP
178 180 ws.merge_cells(start_row=r, start_column=4, end_row=r, end_column=8)
179 −rep(ws, "D6"); rep(ws, "D7"); rep(ws, "D8", hint="ex. : Éva (UQO Éval) pour comprendre une ligne RSMeans ; chatbot du cours ; aucun…")
181 +rep(ws, "D6"); rep(ws, "D7"); rep(ws, "D8", hint="ex. : Éva (UQO Éval) pour comprendre une composante ; chatbot du cours ; aucun…")
180 182
181 183 titre_section(ws, 10, 2, "Parcours du travail — progression mise à jour automatiquement", 7)
182 184 entetes(ws, 11, 2, ["", "Question", "Onglet (cliquer)", "Points", "Zone principale", "Statut", "Repère de correction"])
185 +NC = len(COMPOSANTES)
186 +R_C0, R_C1 = 27, 27 + NC - 1 # 27..48
187 +R_CT = R_C1 + 1 # 49 total
188 +R_MAT = R_CT + 2 # 51..54
189 +R_DH = R_MAT + 6 # 57 entête divisions
190 +R_D0, R_D1 = R_DH + 1, R_DH + 12 # 58..69 (12 divisions : 05 fusionnée dans 06)
191 +R_TOP = R_D1 + 3 # 73..75
183 192 parcours = [
184 − ("1", "Méthode d'estimation et nature du coût", "Relevé", 6, "C5", None, "Relevé des quantités ; remplacement par définition"),
185 − ("2", "Du plan au relevé des quantités", "Relevé", 10, "F16:F27 · H16:H27", "COUNTBLANK(Relevé!F16:F27)+COUNTBLANK(Relevé!H16:H27)", 24, "Écarts ≈ 0 % avec le relevé UQO Éval"),
186 − ("3", "Tarification RSMeans des 64 lignes", "Relevé", 16, "K32:L95 · P32:Q95 · Q96 · E98:E101 · E105:F117 · C121:E123",
187 − "COUNTBLANK(Relevé!K32:L95)+COUNTBLANK(Relevé!P32:Q95)+COUNTBLANK(Relevé!Q96)+COUNTBLANK(Relevé!E98:E101)+COUNTBLANK(Relevé!E105:F117)+COUNTBLANK(Relevé!C121:C123)+COUNTBLANK(Relevé!E121:E123)", 293, "Direct nu ≈ 471 085 $ ; brique = poste le plus lourd"),
193 + ("1", "Méthode d'estimation et nature du coût", "Relevé", 8, "C5", None, "Relevé abrégé / composantes ; remplacement par définition"),
194 + ("2", "Du plan au relevé : sept grandeurs", "Relevé", 8, "F16:F22 · H16:H22", "COUNTBLANK(Relevé!F16:F22)+COUNTBLANK(Relevé!H16:H22)", 14, "Écarts ≈ 0 % avec le relevé UQO Éval"),
195 + ("3", "Bordereau des 22 composantes (prix composites nus)", "Relevé", 12, f"K{R_C0}:L{R_C1} · L{R_CT} · E{R_MAT}:E{R_MAT + 3} · E{R_D0}:F{R_D1} · C{R_TOP}:E{R_TOP + 2}",
196 + f"COUNTBLANK(Relevé!K{R_C0}:L{R_C1})+COUNTBLANK(Relevé!L{R_CT})+COUNTBLANK(Relevé!E{R_MAT}:E{R_MAT + 3})+COUNTBLANK(Relevé!E{R_D0}:F{R_D1})+COUNTBLANK(Relevé!C{R_TOP}:C{R_TOP + 2})+COUNTBLANK(Relevé!E{R_TOP}:E{R_TOP + 2})",
197 + 2 * NC + 1 + 4 + 2 * 12 + 6, "Direct nu ≈ 471 085 $ ; brique = poste le plus lourd"),
188 198 ("4", "Des coûts nus aux coûts directs du cours", "Bordereau", 8, "C9:C15", "COUNTBLANK(Bordereau!C9:C15)", 7, "Retrouver le total de la révision r1 (611 823 $)"),
189 199 ("5", "Permis réel de Gatineau et garantie GCR", "Bordereau", 8, "C19:C20", "COUNTBLANK(Bordereau!C19:C20)", 2, "MAX fonctionnel ; 4 unités"),
190 200 ("6", "Intérêts intercalaires", "Bordereau", 10, "C23:C24 · C25", "COUNTBLANK(Bordereau!C23:C24)", 2, "Taux composé ; facteur ½"),
191 201 ("7", "Autres indirects et total", "Bordereau", 8, "C29:C30 · C32:C33", "COUNTBLANK(Bordereau!C29:C30)+COUNTBLANK(Bordereau!C32:C33)", 4, "Honoraires sur les directs du cours"),
192 − ("8", "Profit entrepreneurial, coût total, unités de comparaison", "Bordereau", 8, "C36:C43 · C44", "COUNTBLANK(Bordereau!C36:C43)", 8, "Assiette = directs + cont. + indirects"),
193 − ("9", "Validation par le marché (11 ventes réelles), le moteur UQO Éval et Altus", "Marché", 14, "J6:N16 · K17:N17 · K21 · K23:K25 · F29:G30 · C33",
194 − "COUNTBLANK(Marché!J6:N16)+COUNTBLANK(Marché!K17:N17)+COUNTBLANK(Marché!K21)+COUNTBLANK(Marché!K23:K25)+COUNTBLANK(Marché!F29:G30)", 67, "Terrain indexé ; profit extrait ; limites"),
195 − ("10", "Tableau de bord et note au promoteur", "Dashboard", 12, "KPI D6:G6 · C8 · graphique 3 · onglet Note", "COUNTBLANK(Dashboard!D6:G6)+COUNTBLANK(Dashboard!C8)", 5, "KPI par formule ; retard de 6 mois chiffré"),
202 + ("8", "Profit entrepreneurial, coût total, unités de comparaison", "Bordereau", 10, "C36:C43 · C44", "COUNTBLANK(Bordereau!C36:C43)", 8, "Assiette = directs + cont. + indirects"),
203 + ("9", "Validation par le marché (8 ventes réelles), le moteur UQO Éval et Altus", "Marché", 14, f"J6:N{5 + NV} · K{6 + NV}:N{6 + NV} · K{NV + 10} · K{NV + 12}:K{NV + 14} · C{NV + 17}",
204 + f"COUNTBLANK(Marché!J6:N{5 + NV})+COUNTBLANK(Marché!K{6 + NV}:N{6 + NV})+COUNTBLANK(Marché!K{NV + 10})+COUNTBLANK(Marché!K{NV + 12}:K{NV + 14})", 5 * NV + 4 + 4, "Terrain indexé ; profit extrait ; limites"),
205 + ("10", "Tableau de bord et note au promoteur", "Dashboard", 14, "KPI D6:G6 · C8 · graphique 3 · onglet Note", "COUNTBLANK(Dashboard!D6:G6)+COUNTBLANK(Dashboard!C8)", 5, "KPI par formule ; retard de 6 mois chiffré"),
196 206 ]
197 207 for i, row in enumerate(parcours):
198 208 no, q, feuille, pts, zone_txt, cb, *rest = row
@@ -226,12 +236,12 @@ note(ws, 23, 3, "Le statut passe à « ◐ En cours » dès qu'une cellule de la
226 236
227 237 titre_section(ws, 25, 2, "Mode d'emploi du classeur", 7)
228 238 instructions = [
229 − "1. Lisez l'énoncé PDF au complet. Toutes les données du classeur sont RÉELLES et proviennent de www.uqo-eval.app (extraction du 29 octobre 2026) : cas d'étude « Cas 9 — Quadruplex 2 étages, Gatineau » du module Quantity Survey, RSMeans 2026 T4, ventes du Registre foncier, moteur de coût.",
230 − "2. Onglet Données : le projet (dimensions du plan), les plans par niveau, le relevé des quantités d'UQO Éval, les 64 lignes RSMeans (quantités, unités, prix unitaires nus matériaux / main-d'œuvre / équipement), la table de conversion, les paramètres du moteur, les paramètres réels des indirects, les 11 ventes de quadruplex neufs, le moteur de coût. NE RIEN MODIFIER.",
239 + "1. Lisez l'énoncé PDF au complet. Toutes les données du classeur sont RÉELLES et proviennent de www.uqo-eval.app (extraction du 29 octobre 2026) : cas d'étude « Cas 9 — Quadruplex 2 étages, Gatineau » du module Quantity Survey, prix RSMeans 2026 T4, ventes du Registre foncier, moteur de coût.",
240 + "2. Onglet Données : le projet (dimensions du plan), les plans par niveau, le relevé abrégé d'UQO Éval, les 22 composantes du bordereau (quantité, unité, prix composites nus matériaux / main-d'œuvre / équipement), les paramètres du moteur, les paramètres réels des indirects, 8 ventes de quadruplex neufs, le moteur de coût. NE RIEN MODIFIER.",
231 241 "3. Répondez PAR FORMULE dans les cellules jaunes (bordure dorée). Les cellules grises se calculent seules. Le triangle rouge des cellules clés cache un commentaire d'aide avec la formule attendue sur la première ligne.",
232 − "4. Onglet Relevé : questions 1 à 3 — du plan aux quantités (12 grandeurs à reproduire), puis tarification des 64 lignes RSMeans (conversion d'unités, coût unitaire, montant, sous-totaux par division).",
242 + "4. Onglet Relevé : questions 1 à 3 — du plan aux quantités (7 grandeurs à reproduire), puis le bordereau des 22 composantes (coût unitaire, montant, sous-totaux par division, postes les plus lourds).",
233 243 "5. Onglet Bordereau : questions 4 à 8 — coûts directs au sens du cours, contingences, permis réel, GCR, intercalaires, honoraires, assurance, profit entrepreneurial, coût total, $/pi², $/logement.",
234 − "6. Onglet Marché : question 9 — extraction de la valeur implicite du bâtiment sur 11 ventes réelles de quadruplex neufs, comparaison au moteur de coût d'UQO Éval et à Altus, profit extrait du marché.",
244 + "6. Onglet Marché : question 9 — valeur implicite du bâtiment sur 8 ventes réelles de quadruplex neufs, comparaison au moteur de coût d'UQO Éval et à Altus, profit extrait du marché.",
235 245 "7. Onglet Dashboard + onglet Note : KPI par formule, verdict, graphiques, note au promoteur (à exporter aussi en PDF). Remise Moodle : ce fichier renommé TP2_VotreCodePermanent.xlsx + le PDF de la note.",
236 246 ]
237 247 r = 26
@@ -247,9 +257,9 @@ finir_feuille(ws, BLEU, zoom=100, landscape=False, titre="Accueil et progression
247 257 # 2. DONNÉES
248 258 # ==============================================================================
249 259 ws = wb.create_sheet("Données")
250 −preparer_feuille(ws, {"B": 8, "C": 30, "D": 30, "E": 44, "F": 14, "G": 12, "H": 10, "I": 10, "J": 12, "K": 12, "L": 12, "M": 12, "N": 12, "O": 30, "P": 8})
260 +preparer_feuille(ws, {"B": 8, "C": 30, "D": 30, "E": 44, "F": 14, "G": 14, "H": 12, "I": 12, "J": 12, "K": 12, "L": 12, "M": 12, "N": 12, "O": 30, "P": 8})
251 261 bandeau(ws, "Données fournies — toutes réelles, extraites de www.uqo-eval.app le 29 octobre 2026",
252 − "Tableaux 1 à 11 de l'énoncé · NE PAS MODIFIER · les zones de réponse des autres onglets y sont liées", ncols=14)
262 + "Tableaux 1 à 10 de l'énoncé · NE PAS MODIFIER · les zones de réponse des autres onglets y sont liées", ncols=14)
253 263 ws.freeze_panes = "A5"
254 264
255 265 titre_section(ws, 5, 2, "Tableau 1 — Le projet : quadruplex de 2 étages à construire à Gatineau (cas d'étude UQO Éval « Cas 9 », plans et fiche technique)", 14)
@@ -276,8 +286,6 @@ for i, (lbl, v, fmt) in enumerate(sujet_rows):
276 286 c = donnee(ws, rr, 4, v, fmt, left=fmt is None)
277 287 if isinstance(v, str) and v.startswith("http"):
278 288 c.hyperlink = v; c.font = FONT_LINK
279 −# → D9 logements · D10 niveaux · D11 L · D12 P · D13 ép · D14 h étage · D15 h fond · D16 hors sol · D17 prof exc · D18 pente · D19 débords
280 −# D20 empreinte · D21 périmètre · D22 aire chauffée · D23 aire brute hors sol · D24 sous-sol · D25 date
281 289 R_T1 = {"log": 9, "niv": 10, "L": 11, "P": 12, "ep": 13, "h": 14, "hf": 15, "hs": 16, "exc": 17, "pente": 18, "deb": 19, "emp": 20, "per": 21, "ch": 22, "hsol": 23, "ss": 24, "date": 25}
282 290
283 291 titre_section(ws, 29, 2, "Tableau 2 — Ce que les plans donnent, par niveau (Plan Studio UQO Éval, échelle 50 px/m)", 12)
@@ -291,128 +299,116 @@ for i, pg in enumerate(PAGES):
291 299 ("ouvertures_aire", "0.00"), ("fenetres", "0"), ("portes", "0"), ("cloisons_long", "0.00"), ("cloisons_aire", "0.00")]):
292 300 donnee(ws, rr, 4 + j, pg[k], fmt)
293 301 bandes(ws, 31, 3, 2, 12)
294 −note(ws, 34, 2, "Sous-sol : ligne 31 · Rez-de-chaussée : ligne 32 · Étage : ligne 33. Les aires de murs extérieurs sont mesurées à l'axe (périmètre × 2,44 m) ; l'aire nette déduit les ouvertures. Plans dans l'énoncé (figures 2 à 4) et sur la fiche du cas.", 12)
302 +note(ws, 34, 2, "Sous-sol : ligne 31 · Rez-de-chaussée : ligne 32 · Étage : ligne 33. Les aires de murs extérieurs sont mesurées à l'axe (périmètre × 2,44 m) ; l'aire nette déduit les ouvertures. Plans dans l'énoncé (figures 2 et 3) et sur la fiche du cas.", 12)
295 303 R_T2 = {"ss": 31, "rdc": 32, "et": 33}
296 304
297 −titre_section(ws, 36, 2, "Tableau 3 — Relevé des quantités généré par UQO Éval depuis les plans et la fiche (49 mesures « QS », metre-qs-1.0)", 14)
298 −entetes(ws, 37, 2, ["No", "Poste", "", "Formule du relevé", "Quantité", "Unité", "Entrées de la formule"])
299 −ws.merge_cells("C37:D37"); ws.merge_cells("H37:N37")
300 −for i, m in enumerate(RELEVE):
301 − rr = 38 + i
302 − donnee(ws, rr, 2, i + 1)
303 − ws.merge_cells(start_row=rr, start_column=3, end_row=rr, end_column=4); donnee(ws, rr, 3, m["nom"], left=True)
304 − donnee(ws, rr, 5, m["formule"], left=True)
305 − donnee(ws, rr, 6, m["valeur"], "#,##0.00"); donnee(ws, rr, 7, m["unite"])
306 − ws.merge_cells(start_row=rr, start_column=8, end_row=rr, end_column=14); donnee(ws, rr, 8, m["entrees"].replace("_m2", " m²").replace("_m3", " m³").replace("_m=", " m=").replace("=", " = ").replace(",", " ;"), left=True)
307 −bandes(ws, 38, len(RELEVE), 2, 13)
305 +titre_section(ws, 36, 2, "Tableau 3 — Relevé abrégé d'UQO Éval : les sept grandeurs que vous reproduirez à la question 2 (valeurs de la plateforme, metre-qs-1.0)", 14)
306 +entetes(ws, 37, 2, ["No", "Grandeur (relevé UQO Éval)", "", "Formule du relevé", "Valeur UQO Éval", "Unité"])
307 +ws.merge_cells("C37:D37")
308 308 R_T3 = 38
309 −r_fin_t3 = 38 + len(RELEVE) # 87
310 −
311 −r0 = r_fin_t3 + 2 # 89
312 −titre_section(ws, r0, 2, "Tableau 4 — Les 64 lignes de la révision r1 : quantités du relevé, facteur d'ajustement, unité RSMeans et PRIX UNITAIRES NUS RSMeans 2026 T4 localisés Gatineau (C57)", 15)
313 −entetes(ws, r0 + 1, 2, ["No", "Div.", "Poste", "Détail RSMeans", "Ligne RSMeans", "Quantité (relevé)", "Unité", "Facteur d'ajustement", "Unité RSMeans", "Matériaux ($/u)", "Main-d'œuvre ($/u)", "Équipement ($/u)", "Source du prix", "MO"])
314 −R_T4 = r0 + 2 # première ligne (91)
315 −for i, L in enumerate(LIGNES):
309 +for i, g in enumerate(GRANDEURS):
310 + rr = R_T3 + i
311 + donnee(ws, rr, 2, i + 1)
312 + ws.merge_cells(start_row=rr, start_column=3, end_row=rr, end_column=4); donnee(ws, rr, 3, g["releve_nom"], left=True)
313 + donnee(ws, rr, 5, g["libelle"].split(" = ", 1)[1] if " = " in g["libelle"] else "", left=True)
314 + donnee(ws, rr, 6, g["releve_valeur"], "#,##0.00"); donnee(ws, rr, 7, g["releve_unite"])
315 +bandes(ws, R_T3, len(GRANDEURS), 2, 6)
316 +r_fin_t3 = R_T3 + len(GRANDEURS)
317 +note(ws, r_fin_t3, 2, "Le relevé complet (49 mesures) et les 64 lignes RSMeans de la révision r1 restent consultables sur la fiche du cas (UQO Éval) ; le TP travaille avec les 22 composantes du tableau 4.", 12)
318 +
319 +r0 = r_fin_t3 + 2
320 +titre_section(ws, r0, 2, "Tableau 4 — Le bordereau en 22 composantes : quantités du relevé (unités SI) et PRIX COMPOSITES NUS par unité (matériaux, main-d'œuvre, équipement) dérivés des lignes RSMeans 2026 T4 localisées Gatineau (C57)", 15)
321 +entetes(ws, r0 + 1, 2, ["No", "Div.", "Composante", "Ce qu'elle comprend", "Quantité (relevé)", "Unité", "Matériaux ($/u)", "Main-d'œuvre ($/u)", "Équipement ($/u)", "Lignes RSMeans sources"])
322 +R_T4 = r0 + 2
323 +for i, L in enumerate(COMPOSANTES):
316 324 rr = R_T4 + i
317 − donnee(ws, rr, 2, L["no"]); donnee(ws, rr, 3, L["wbs"]); donnee(ws, rr, 4, L["poste"], left=True); donnee(ws, rr, 5, L["detail"], left=True)
318 − donnee(ws, rr, 6, L["code"] or "—"); donnee(ws, rr, 7, L["qte"], "#,##0.00"); donnee(ws, rr, 8, CONVERSIONS[L["unite"]]["fr"]); donnee(ws, rr, 9, L["facteur"], "0.00")
319 − donnee(ws, rr, 10, CONVERSIONS[L["unite"]]["rsm_fr"]); donnee(ws, rr, 11, L["mat"], FMT_N2); donnee(ws, rr, 12, L["mo"], FMT_N2); donnee(ws, rr, 13, L["eq"], FMT_N2)
320 − donnee(ws, rr, 14, L["source"], left=True); donnee(ws, rr, 15, L["mo_type"])
321 −bandes(ws, R_T4, len(LIGNES), 2, 14)
322 −r_fin_t4 = R_T4 + len(LIGNES) # 155
323 −note(ws, r_fin_t4, 2, "Prix NUS (bare costs) RSMeans : matériaux + main-d'œuvre + équipement, hors conditions générales, frais généraux et profit de l'entrepreneur (appliqués à l'onglet Bordereau). Le facteur d'ajustement traduit une particularité du poste (LVL à 3 plis = × 3 ; fermes par pi² ≈ × 0,93 ; isolant R-50 = × 1,32 ; XPS deux couches = × 2 ; descentes ≈ × 0,35 ; membrane deux couches = × 2). MO : STD = syndiquée, RES = résidentielle (substituée par RSMeans quand la ligne n'existe qu'en résidentiel). Trois postes viennent du catalogue de prix observés d'UQO Éval (branchements, drainage, VRC).", 14)
324 −
325 −r0 = r_fin_t4 + 2 # 157
326 −titre_section(ws, r0, 2, "Tableau 5 — Conversion des unités du relevé (SI) vers les unités RSMeans (impériales)", 5)
327 −entetes(ws, r0 + 1, 2, ["Unité du relevé", "Unité RSMeans", "Facteur (× quantité)", "Rappel"])
328 −R_T5 = r0 + 2
329 −for i, (k, cv) in enumerate(CONVERSIONS.items()):
330 − rr = R_T5 + i
331 − donnee(ws, rr, 2, cv["fr"]); donnee(ws, rr, 3, cv["rsm_fr"]); donnee(ws, rr, 4, cv["facteur"], "0.000000")
332 − donnee(ws, rr, 5, {"m": "1 m = 3,28084 pi", "m2": "1 m² = 10,7639 pi²", "m3": "1 m³ = 1,30795 vg³", "unit": "unité = unité (Ea.)", "lump": "forfait (lump sum)"}[k], left=True)
333 −bandes(ws, R_T5, 5, 2, 4)
334 −r_fin_t5 = R_T5 + 5
325 + donnee(ws, rr, 2, L["no"]); donnee(ws, rr, 3, L["wbs"]); donnee(ws, rr, 4, L["nom"], left=True); donnee(ws, rr, 5, L["detail"], left=True)
326 + donnee(ws, rr, 6, L["qte"], "#,##0.00"); donnee(ws, rr, 7, L["unite"], left=True); donnee(ws, rr, 8, L["mat"], FMT_N2); donnee(ws, rr, 9, L["mo"], FMT_N2); donnee(ws, rr, 10, L["eq"], FMT_N2)
327 + ws.merge_cells(start_row=rr, start_column=11, end_row=rr, end_column=14); donnee(ws, rr, 11, L["lignes"], left=True)
328 + ws.row_dimensions[rr].height = 30
329 +bandes(ws, R_T4, NC, 2, 13)
330 +r_fin_t4 = R_T4 + NC
331 +note(ws, r_fin_t4, 2, "Prix NUS (bare costs) : matériaux + main-d'œuvre + équipement, hors conditions générales, frais généraux et profit de l'entrepreneur (appliqués à l'onglet Bordereau). Un prix composite = somme des lignes RSMeans de la composante ÷ quantité de référence (p. ex. la toiture complète en $/m² de toit comprend fermes, support, membrane, soffites et gouttières). Trois postes viennent du catalogue de prix observés d'UQO Éval (branchements, drainage, VRC).", 14)
335 332
336 −r0 = r_fin_t5 + 1
337 −titre_section(ws, r0, 2, "Tableau 6 — Divisions MasterFormat présentes et coût direct nu par division selon la révision r1 ($)", 5)
333 +r0 = r_fin_t4 + 2
334 +titre_section(ws, r0, 2, "Tableau 5 — Divisions MasterFormat présentes et coût direct nu par division selon la révision r1, composantes regroupées ($)", 5)
338 335 entetes(ws, r0 + 1, 2, ["Code", "Division", "Direct nu r1 ($)", "Part (%)"])
339 −R_T6 = r0 + 2
340 −DIVS = sorted(DIVISIONS)
336 +R_T5 = r0 + 2
337 +DIVS = sorted(k for k in DIVISIONS if MOTEUR_QS['by_wbs_comp'].get(k))
341 338 for i, k in enumerate(DIVS):
342 − rr = R_T6 + i
343 − donnee(ws, rr, 2, k); donnee(ws, rr, 3, DIVISIONS[k], left=True); donnee(ws, rr, 4, MOTEUR_QS["by_wbs"][k], FMT_D2); donnee(ws, rr, 5, MOTEUR_QS["by_wbs"][k] / MOTEUR_QS["direct_nu"], FMT_P1)
344 −bandes(ws, R_T6, len(DIVS), 2, 4)
345 −r_fin_t6 = R_T6 + len(DIVS)
339 + rr = R_T5 + i
340 + donnee(ws, rr, 2, k); donnee(ws, rr, 3, DIVISIONS[k], left=True); donnee(ws, rr, 4, MOTEUR_QS["by_wbs_comp"].get(k, 0), FMT_D2); donnee(ws, rr, 5, MOTEUR_QS["by_wbs_comp"].get(k, 0) / MOTEUR_QS["direct_nu"], FMT_P1)
341 +bandes(ws, R_T5, len(DIVS), 2, 4)
342 +r_fin_t5 = R_T5 + len(DIVS)
346 343
347 −r0 = r_fin_t6 + 1
348 −titre_section(ws, r0, 2, "Tableau 7 — Majorations appliquées par le moteur Quantity Survey d'UQO Éval (ordre d'application de la révision r1)", 5)
344 +r0 = r_fin_t5 + 1
345 +titre_section(ws, r0, 2, "Tableau 6 — Majorations appliquées par le moteur Quantity Survey d'UQO Éval (ordre d'application de la révision r1)", 5)
349 346 entetes(ws, r0 + 1, 2, ["Paramètre", "", "Valeur", "Note"])
350 347 ws.merge_cells(start_row=r0 + 1, start_column=2, end_row=r0 + 1, end_column=3)
351 348 moteur_rows = [
352 − ("Ajustement régional Gatineau sur les 3 postes du catalogue UQO Éval ($)", MOTEUR_QS["ajust_regional"], FMT_D2, "matériaux × 1,02, équipement × 1,01 (QC-GAT) ; les 61 lignes RSMeans sont déjà localisées"),
349 + ("Ajustement régional Gatineau sur les 3 postes du catalogue UQO Éval ($)", MOTEUR_QS["ajust_regional"], FMT_D2, "matériaux × 1,02, équipement × 1,01 (QC-GAT) ; les lignes RSMeans sont déjà localisées"),
353 350 ("Conditions générales du chantier (% des directs nus localisés)", MOTEUR_QS["cg_pct"], "0%", "mobilisation, gestion, clôtures, toilettes, nettoyage"),
354 351 ("Frais généraux de l'entrepreneur (% du cumul précédent)", MOTEUR_QS["fg_pct"], "0%", "bureau, assurances de l'entreprise, estimation"),
355 352 ("Profit de l'entrepreneur général (% du cumul précédent)", MOTEUR_QS["profit_pct"], "0%", "≠ profit entrepreneurial du promoteur (question 8)"),
356 353 ("Contingences de construction (% des directs nus localisés)", MOTEUR_QS["cont_pct"], "0%", "imprévus de chantier"),
357 − ("Total de la révision r1 (directs du cours + contingences) ($)", MOTEUR_QS["total"], FMT_D2, "à retrouver à la question 4 (± 25 $ d'arrondi)"),
354 + ("Total de la révision r1 (directs du cours + contingences) ($)", MOTEUR_QS["total"], FMT_D2, "à retrouver à la question 4 (± 50 $ d'arrondi)"),
358 355 ]
359 −R_T7 = r0 + 2
356 +R_T6 = r0 + 2
360 357 for i, (lbl, v, fmt, nt) in enumerate(moteur_rows):
361 − rr = R_T7 + i
358 + rr = R_T6 + i
362 359 ws.merge_cells(start_row=rr, start_column=2, end_row=rr, end_column=3)
363 360 donnee(ws, rr, 2, lbl, left=True); donnee(ws, rr, 4, v, fmt); donnee(ws, rr, 5, nt, left=True)
364 −bandes(ws, R_T7, len(moteur_rows), 2, 4)
365 −# → D{R_T7} ajust · D+1 CG · D+2 FG · D+3 profit entr. · D+4 cont · D+5 total r1
366 −r_fin_t7 = R_T7 + len(moteur_rows)
361 +bandes(ws, R_T6, len(moteur_rows), 2, 4)
362 +r_fin_t6 = R_T6 + len(moteur_rows)
367 363
368 −r0 = r_fin_t7 + 1
369 −titre_section(ws, r0, 2, "Tableau 8 — Paramètres réels des coûts indirects, du profit, des taxes et des références (consultés le 29 octobre 2026)", 5)
364 +r0 = r_fin_t6 + 1
365 +titre_section(ws, r0, 2, "Tableau 7 — Paramètres réels des coûts indirects, du profit, des taxes et des références (consultés le 29 octobre 2026)", 5)
370 366 entetes(ws, r0 + 1, 2, ["Paramètre", "", "Valeur", "Source"])
371 367 ws.merge_cells(start_row=r0 + 1, start_column=2, end_row=r0 + 1, end_column=3)
372 −R_T8 = r0 + 2
368 +R_T7 = r0 + 2
373 369 SOURCES = ["Ville de Gatineau, règl. 501-2005, art. 104", "Ville de Gatineau, règl. 501-2005, art. 104", "Garantie de construction résidentielle, grille 2026", "convention du cours (séance 8)",
374 370 "convention du cours (séance 8)", "promoteur (notaire, arpenteur, administration)", "Banque du Canada 2,50 % le 28 oct. 2026 → préférentiel 4,70 % le 29 oct.", "prêts construction : préférentiel + 150 à 250 pb (convention : 205 pb)",
375 371 "échéancier du promoteur", "convention du cours (séance 8) : 10-12 % pour un locatif", "ARC", "Revenu Québec", "Altus, 2026 Canadian Cost Guide (23 avril 2026)", "Altus, 2026 Canadian Cost Guide",
376 372 "UQO Éval — TP1 (ventes de terrains vacants 2026 ÷ rôle 2024-2026)", "conversion"]
377 373 for i, (lbl, v, fmt) in enumerate(PARAMS):
378 − rr = R_T8 + i
374 + rr = R_T7 + i
379 375 ws.merge_cells(start_row=rr, start_column=2, end_row=rr, end_column=3)
380 376 donnee(ws, rr, 2, lbl, left=True); donnee(ws, rr, 4, v, fmt); donnee(ws, rr, 5, SOURCES[i], left=True)
381 −bandes(ws, R_T8, len(PARAMS), 2, 4)
382 −PR = {k: R_T8 + i for i, k in enumerate(["permis", "permis_min", "gcr", "hono", "assur", "jurid", "pref", "prime", "duree", "profit", "tps", "tvq", "altus_lo", "altus_hi", "ratio", "pi2"])}
383 −r_fin_t8 = R_T8 + len(PARAMS)
377 +bandes(ws, R_T7, len(PARAMS), 2, 4)
378 +PR = {k: R_T7 + i for i, k in enumerate(["permis", "permis_min", "gcr", "hono", "assur", "jurid", "pref", "prime", "duree", "profit", "tps", "tvq", "altus_lo", "altus_hi", "ratio", "pi2"])}
379 +r_fin_t7 = R_T7 + len(PARAMS)
384 380
385 −r0 = r_fin_t8 + 1
386 −titre_section(ws, r0, 2, "Tableau 9 — Onze ventes RÉELLES de quadruplex neufs (construits 2021-2024) à Gatineau, 2024-2025 (Registre foncier ⋈ rôle 2024-2026, via UQO Éval)", 14)
381 +r0 = r_fin_t7 + 1
382 +titre_section(ws, r0, 2, f"Tableau 8 — {NV} ventes RÉELLES de quadruplex neufs de 2 étages (construits 2021-2024) à Gatineau, 2024-2025 (Registre foncier ⋈ rôle 2024-2026, via UQO Éval)", 14)
387 383 entetes(ws, r0 + 1, 2, ["No", "Adresse", "Secteur", "Date de vente", "Prix ($)", "Année de construction", "Aire d'étages au rôle (m²)", "Terrain (m²)", "Étages", "Lien physique", "Rôle — terrain ($)", "Rôle — bâtiment ($)", "Rôle — total ($)"])
388 −R_T9 = r0 + 2
389 −for i, v in enumerate(VENTES):
390 − rr = R_T9 + i
384 +R_T8 = r0 + 2
385 +for i, v in enumerate(VTP):
386 + rr = R_T8 + i
391 387 donnee(ws, rr, 2, f"Q{i + 1}").font = Font(name="Calibri", size=11, bold=True, color=BLEU)
392 − donnee(ws, rr, 3, v["adresse"], left=True); donnee(ws, rr, 4, v["secteur"], left=True); donnee(ws, rr, 5, v["date"]); donnee(ws, rr, 6, v["prix"], "#,##0")
388 + donnee(ws, rr, 3, v["adresse"], left=True); donnee(ws, rr, 4, v["secteur"].replace("Paroisse Saint-René (b", "Saint-René"), left=True); donnee(ws, rr, 5, v["date"]); donnee(ws, rr, 6, v["prix"], "#,##0")
393 389 donnee(ws, rr, 7, v["annee"], "0"); donnee(ws, rr, 8, v["aire_etages"], "0.0"); donnee(ws, rr, 9, v["terrain"], "0.0"); donnee(ws, rr, 10, v["etages"], "0")
394 390 donnee(ws, rr, 11, v["lien"], left=True); donnee(ws, rr, 12, v["vt"], "#,##0"); donnee(ws, rr, 13, v["vb"], "#,##0"); donnee(ws, rr, 14, v["role"], "#,##0")
395 −bandes(ws, R_T9, len(VENTES), 2, 13)
396 −r_fin_t9 = R_T9 + len(VENTES)
397 −note(ws, r_fin_t9, 2, "Aire d'étages au rôle = superficie hors sol des étages (sous-sol exclu) ; dans ces quadruplex, deux des quatre logements occupent généralement le rez-de-jardin (sous-sol aménagé). Rôle 2024-2026, conditions du marché au 1er juillet 2022. Q11 (1151, rue Notre-Dame) : vente de mai 2024 d'un immeuble livré en 2024 (photo dans l'énoncé).", 13)
391 +bandes(ws, R_T8, NV, 2, 13)
392 +r_fin_t8 = R_T8 + NV
393 +note(ws, r_fin_t8, 2, "Aire d'étages au rôle = superficie hors sol des étages (sous-sol exclu) ; dans ces quadruplex, deux des quatre logements occupent généralement le rez-de-jardin (sous-sol aménagé). Rôle 2024-2026, conditions du marché au 1er juillet 2022. Q8 (1151, rue Notre-Dame) : vente de mai 2024 d'un immeuble livré en 2024 (photo dans l'énoncé).", 13)
398 394
399 −r0 = r_fin_t9 + 2
400 −titre_section(ws, r0, 2, "Tableau 10 — Deux quadruplex de 2020 EN VIGUEUR à Gatineau (prix demandés réels, copie Immo-Ka du 29 octobre 2026)", 14)
395 +r0 = r_fin_t8 + 2
396 +titre_section(ws, r0, 2, "Tableau 9 — Deux quadruplex de 2020 EN VIGUEUR à Gatineau (prix demandés réels, copie Immo-Ka du 29 octobre 2026) — lecture seulement", 14)
401 397 entetes(ws, r0 + 1, 2, ["No", "Adresse", "Secteur", "Prix demandé ($)", "Aire habitable (pi²)", "Aire d'étages au rôle (m²)", "Terrain (m²)", "Étages", "Revenus bruts ($/an)", "Rôle — terrain ($)", "Rôle — bâtiment ($)", "Rôle — total ($)", "Description (fiche du courtier)"])
402 −R_T10 = r0 + 2
398 +R_T9 = r0 + 2
403 399 for i, a in enumerate(ANNONCES):
404 − rr = R_T10 + i
400 + rr = R_T9 + i
405 401 donnee(ws, rr, 2, f"A{i + 1}").font = Font(name="Calibri", size=11, bold=True, color=BLEU)
406 402 donnee(ws, rr, 3, a["adresse"], left=True); donnee(ws, rr, 4, a["secteur"], left=True); donnee(ws, rr, 5, a["prix"], "#,##0"); donnee(ws, rr, 6, a["aire_pi2"], "#,##0")
407 403 donnee(ws, rr, 7, a["aire_etages"], "0.0"); donnee(ws, rr, 8, a["terrain"], "0.0"); donnee(ws, rr, 9, a["etages"], "0"); donnee(ws, rr, 10, a["revenus"], "#,##0")
408 404 donnee(ws, rr, 11, a["vt"], "#,##0"); donnee(ws, rr, 12, a["vb"], "#,##0"); donnee(ws, rr, 13, a["role"], "#,##0")
409 405 lk = donnee(ws, rr, 14, a["desc"], left=True); lk.hyperlink = f"https://www.uqo-eval.app/a-vendre/{a['uid']}"; lk.font = FONT_LINK
410 406 ws.row_dimensions[rr].height = 30
411 −bandes(ws, R_T10, 2, 2, 13)
412 −r_fin_t10 = R_T10 + 2
407 +bandes(ws, R_T9, 2, 2, 13)
408 +r_fin_t9 = R_T9 + 2
413 409
414 −r0 = r_fin_t10 + 1
415 −titre_section(ws, r0, 2, "Tableau 11 — Estimation du moteur de coût d'UQO Éval pour le même programme (méthode par composantes, prix observés Canac/BMR/Patrick Morin + APCHQ, 29 octobre 2026)", 14)
410 +r0 = r_fin_t9 + 1
411 +titre_section(ws, r0, 2, "Tableau 10 — Estimation du moteur de coût d'UQO Éval pour le même programme (méthode par composantes, prix observés Canac/BMR/Patrick Morin + APCHQ, 29 octobre 2026)", 14)
416 412 entetes(ws, r0 + 1, 2, ["Paramètre", "", "Valeur", "Note"])
417 413 ws.merge_cells(start_row=r0 + 1, start_column=2, end_row=r0 + 1, end_column=3)
418 414 MC = MOTEUR_COUT
@@ -422,128 +418,106 @@ mc_rows = [("Coût de remplacement neuf (RCN) du moteur ($)", MC["rcn"], FMT_D,
422 418 ("RCN par pi² ($/pi²)", MC["per_sqft"], FMT_PSF, ""), ("Coûts directs du moteur ($)", MC["direct"], FMT_D, "matériaux + main-d'œuvre + équipement"),
423 419 ("Coûts indirects du moteur ($)", MC["indirect"], FMT_D, "plans 3 %, permis 0,8 %, inspection 0,5 %, assurances 1,5 %, mobilisation 1,5 %, gestion 3 %, financement 2 %, administration 1 %"),
424 420 ("Indice de confiance", MC["confiance"], None, "43 % des matériaux sur prix observés, le reste sur prix de référence")]
425 −R_T11 = r0 + 2
421 +R_T10 = r0 + 2
426 422 for i, (lbl, v, fmt, nt) in enumerate(mc_rows):
427 − rr = R_T11 + i
423 + rr = R_T10 + i
428 424 ws.merge_cells(start_row=rr, start_column=2, end_row=rr, end_column=3)
429 425 donnee(ws, rr, 2, lbl, left=True); donnee(ws, rr, 4, v, fmt); ws.merge_cells(start_row=rr, start_column=5, end_row=rr, end_column=9); donnee(ws, rr, 5, nt, left=True)
430 −bandes(ws, R_T11, len(mc_rows), 2, 3)
431 −r_fin_t11 = R_T11 + len(mc_rows)
432 −entetes(ws, r_fin_t11 + 1, 2, ["Catégorie du moteur", "", "Montant ajusté ($)", "Part (%)"])
433 −ws.merge_cells(start_row=r_fin_t11 + 1, start_column=2, end_row=r_fin_t11 + 1, end_column=3)
434 −R_T11b = r_fin_t11 + 2
426 +bandes(ws, R_T10, len(mc_rows), 2, 3)
427 +r_fin_t10 = R_T10 + len(mc_rows)
428 +entetes(ws, r_fin_t10 + 1, 2, ["Catégorie du moteur", "", "Montant ajusté ($)", "Part (%)"])
429 +ws.merge_cells(start_row=r_fin_t10 + 1, start_column=2, end_row=r_fin_t10 + 1, end_column=3)
430 +R_T10b = r_fin_t10 + 2
435 431 for i, (lbl, amt, pct) in enumerate(MC["categories"]):
436 − rr = R_T11b + i
432 + rr = R_T10b + i
437 433 ws.merge_cells(start_row=rr, start_column=2, end_row=rr, end_column=3)
438 434 donnee(ws, rr, 2, lbl, left=True); donnee(ws, rr, 4, amt, "#,##0"); donnee(ws, rr, 5, pct / 100, FMT_P1)
439 −bandes(ws, R_T11b, len(MC["categories"]), 2, 3)
435 +bandes(ws, R_T10b, len(MC["categories"]), 2, 3)
440 436 finir_feuille(ws, BLEU_CLAIR, zoom=100, titre="Données réelles UQO Éval")
441 −DN = {"T1": R_T1, "T2": R_T2, "T3": R_T3, "T4": R_T4, "T5": R_T5, "T6": R_T6, "T7": R_T7, "PR": PR, "T9": R_T9, "T10": R_T10, "T11": R_T11, "T11b": R_T11b}
437 +DN = {"T1": R_T1, "T2": R_T2, "T3": R_T3, "T4": R_T4, "T5": R_T5, "T6": R_T6, "PR": PR, "T8": R_T8, "T9": R_T9, "T10": R_T10, "T10b": R_T10b}
442 438
443 439 # ==============================================================================
444 440 # 3. RELEVÉ (Q1, Q2, Q3)
445 441 # ==============================================================================
446 442 ws = wb.create_sheet("Relevé")
447 −preparer_feuille(ws, {"B": 6, "C": 8, "D": 30, "E": 36, "F": 13, "G": 12, "H": 9, "I": 9, "J": 10, "K": 12, "L": 13, "M": 11, "N": 11, "O": 11, "P": 12, "Q": 14})
448 −bandeau(ws, "Relevé des quantités et tarification RSMeans — Questions 1, 2 et 3",
449 − "Du plan aux quantités, des quantités aux coûts directs nus · PAR FORMULE dans les cellules jaunes", ncols=16)
443 +preparer_feuille(ws, {"B": 6, "C": 8, "D": 34, "E": 40, "F": 13, "G": 18, "H": 12, "I": 12, "J": 12, "K": 14, "L": 15})
444 +bandeau(ws, "Relevé des quantités et bordereau des composantes — Questions 1, 2 et 3",
445 + "Du plan aux quantités, des quantités aux coûts directs nus · PAR FORMULE dans les cellules jaunes", ncols=11)
450 446 ws.freeze_panes = "A5"
451 −titre_section(ws, 4, 2, "Question 1 — Méthode d'estimation du coût et nature du coût estimé (C5)", 16)
452 −zone(ws, "C5", 4, 8, "Pourquoi le relevé des quantités (quantity survey) ici ? Que valent les trois autres méthodes (comparative $/pi², composantes, indexée) pour ce mandat ? Pourquoi un projet neuf est-il par définition un coût de REMPLACEMENT ? Quelles limites (plan générique, prix publiés) ? (6-9 lignes)…")
447 +titre_section(ws, 4, 2, "Question 1 — Méthode d'estimation du coût et nature du coût estimé (C5)", 11)
448 +zone(ws, "C5", 4, 8, "Pourquoi un bordereau par composantes issu d'un relevé ici ? Que valent les trois autres méthodes (comparative $/pi², relevé détaillé, indexée) pour ce mandat ? Pourquoi un projet neuf est-il par définition un coût de REMPLACEMENT ? Quelles limites (plan générique, prix publiés) ? (6-9 lignes)…")
453 449
454 −titre_section(ws, 10, 2, "Question 2 — Du plan au relevé des quantités : reproduisez par formule 12 grandeurs du relevé d'UQO Éval (F16:F27), puis l'écart avec la valeur de la plateforme (H16:H27)", 16)
450 +titre_section(ws, 10, 2, "Question 2 — Du plan au relevé des quantités : reproduisez par formule 7 grandeurs du relevé d'UQO Éval (F16:F22), puis l'écart avec la valeur de la plateforme (H16:H22)", 11)
455 451 etiquette(ws, 11, 4, "Entrées liées (ne pas modifier)", bold=True)
456 452 entetes(ws, 11, 5, ["Ouvertures extérieures hors sol (m²)", "Cloisons hors sol (m²)", "Aire des pièces hors sol (m²)"], height=30)
457 453 lien(ws, "E12", f"=Données!I{R_T2['rdc']}+Données!I{R_T2['et']}", "0.00")
458 454 lien(ws, "F12", f"=Données!M{R_T2['rdc']}+Données!M{R_T2['et']}", "0.00")
459 455 lien(ws, "G12", f"=Données!D{R_T2['rdc']}+Données!D{R_T2['et']}", "0.00")
460 −note(ws, 13, 4, "Les dimensions du projet sont dans Données!D11:D24 (longueur et profondeur à l'axe, épaisseur, hauteurs, profondeur d'excavation, facteurs de toit). Les formules du relevé d'UQO Éval sont lisibles dans Données, tableau 3.", 10)
456 +note(ws, 13, 4, "Les dimensions du projet sont dans Données!D11:D24 (longueur et profondeur à l'axe, épaisseur, hauteurs, facteurs de toit). Les formules du relevé d'UQO Éval sont lisibles dans Données, tableau 3.", 8)
461 457 entetes(ws, 15, 2, ["No", "", "Grandeur", "Formule attendue (lecture du relevé UQO Éval)", "Votre calcul", "Valeur UQO Éval — lien", "Écart (%)"])
462 458 ws.merge_cells("B15:C15")
463 −GRANDEURS = [
464 − ("Empreinte du bâtiment (m²) = (L + ép.) × (P + ép.)", "(18,30 + 0,30) × (10,40 + 0,30)", "Dalle de sous-sol 100 mm", "=(Données!D11+Données!D13)*(Données!D12+Données!D13)"),
465 − ("Périmètre des murs à l'axe (m) = 2 × (L + P)", "2 × (18,30 + 10,40)", "Semelles filantes", "=2*(Données!D11+Données!D12)"),
466 − ("Excavation (m³) = (empreinte + 0,9 × périmètre) × profondeur", "(199,02 + 0,9 × 57,4) × 2,6", "Excavation", "=(F16+0.9*F17)*Données!D17"),
467 − ("Remblai (m³) = périmètre × 0,9 × (profondeur − 0,3)", "57,4 × 0,9 × (2,6 − 0,3)", "Remblai", "=F17*0.9*(Données!D17-0.3)"),
468 − ("Murs de fondation (m²) = périmètre × hauteur du mur", "57,4 × 2,44", "Murs de fondation (h 2.44 m)", "=F17*Données!D15"),
469 − ("Membrane d'étanchéité (m²) = périmètre × (hauteur − partie hors sol)", "57,4 × (2,44 − 0,30)", "Membrane d'étanchéité des fondations", "=F17*(Données!D15-Données!D16)"),
470 − ("Murs extérieurs bruts (m²) = périmètre × hauteur d'étage × niveaux", "57,4 × 2,44 × 2", "Murs extérieurs ossature 2×6", "=F17*Données!D14*Données!D10"),
471 − ("Murs extérieurs nets (m²) = bruts − ouvertures hors sol", "280,11 − 63,36", "Isolation des murs extérieurs R-24", "=F22-E12"),
472 − ("Surface de toit (m²) = empreinte × facteur de pente × débords", "199,02 × 1,00 × 1,10", "Couverture", "=F16*Données!D18*Données!D19"),
473 − ("Planchers portés (m²) = Σ aires des pièces hors sol", "176,40 + 176,40", "Planchers portés (solives)", "=G12"),
474 − ("Gypse ½ po murs (m²) = murs ext. nets + 2 × cloisons", "216,75 + 2 × 292,31", "Gypse ½ po murs (face intérieure des murs ext. + 2 faces des cloisons)", "=F23+2*F12"),
475 − ("Peinture (m²) = gypse murs + gypse plafonds (= aires des pièces)", "801,38 + 352,81", "Peinture 2 couches (murs + plafonds)", "=F26+G12"),
476 −]
477 −NOM_REL = {m['nom']: i for i, m in enumerate(RELEVE)}
478 −for i, (lbl, hint, nom_rel, f) in enumerate(GRANDEURS):
479 − no_rel = NOM_REL[nom_rel] + 1
459 +for i, g in enumerate(GRANDEURS):
480 460 rr = 16 + i
481 461 ws.merge_cells(start_row=rr, start_column=2, end_row=rr, end_column=3)
482 462 c = ws.cell(row=rr, column=2, value=i + 1); c.font = FONT_H2; c.alignment = CENTER; c.border = BORDER_LIGHT; c.fill = FILL_CLAIR
483 − etiquette(ws, rr, 4, lbl, bold=True)
484 − e = ws.cell(row=rr, column=5, value=hint); e.font = FONT_NOTE; e.alignment = WRAP; e.border = BORDER_LIGHT; e.fill = FILL_CLAIR
485 − rep(ws, f"F{rr}", num_fmt="#,##0.00", comment=(f + " (formule attendue ; adaptez les références si vous changez de ligne)") if i < 3 else None)
486 − lien(ws, f"G{rr}", f"=Données!F{R_T3 + no_rel - 1}", "#,##0.00")
463 + etiquette(ws, rr, 4, g["libelle"], bold=True)
464 + e = ws.cell(row=rr, column=5, value=g["indice"]); e.font = FONT_NOTE; e.alignment = WRAP; e.border = BORDER_LIGHT; e.fill = FILL_CLAIR
465 + rep(ws, f"F{rr}", num_fmt="#,##0.00", comment=(g["formule"] + " (formule attendue)") if i < 3 else None)
466 + lien(ws, f"G{rr}", f"=Données!F{R_T3 + i}", "#,##0.00")
487 467 rep(ws, f"H{rr}", num_fmt="0.00%", comment="=F16/G16-1" if i == 0 else None)
488 468 ws.row_dimensions[rr].height = 26
489 −# ⚠ colonnes : E = formule attendue (texte), F = votre calcul, G = valeur UQO Éval, H = écart → l'énoncé cite F16:F27 et H16:H27
490 −ws.conditional_formatting.add("H16:H27", FormulaRule(formula=['ABS(H16)>0.005'], fill=PatternFill("solid", fgColor="FFC7CE")))
491 −ws.conditional_formatting.add("H16:H27", FormulaRule(formula=['AND(H16<>"",ABS(H16)<=0.005)'], fill=PatternFill("solid", fgColor="C6EFCE")))
492 −
493 −titre_section(ws, 30, 2, "Question 3 — Tarification RSMeans des 64 lignes : conversion d'unités (K), quantité RSMeans (L), coût unitaire nu (P), montant (Q), puis totaux et sous-totaux par division", 16)
494 −entetes(ws, 31, 2, ["No", "Div.", "Poste — lien", "Détail RSMeans — lien", "Quantité (relevé)", "Unité", "Facteur", "Unité RSMeans", "", "a) Facteur de conversion (RECHERCHEV)", "b) Quantité RSMeans = qté × facteur × conversion", "Matériaux ($/u)", "MO ($/u)", "Équip. ($/u)", "c) Coût unitaire nu ($/u)", "d) Montant ($)"], height=44)
495 −ws.merge_cells("I31:J31")
496 −for i, L in enumerate(LIGNES):
497 − rr = 32 + i
469 +R_G1 = 16 + len(GRANDEURS) - 1 # 22
470 +ws.conditional_formatting.add(f"H16:H{R_G1}", FormulaRule(formula=['ABS(H16)>0.005'], fill=PatternFill("solid", fgColor="FFC7CE")))
471 +ws.conditional_formatting.add(f"H16:H{R_G1}", FormulaRule(formula=['AND(H16<>"",ABS(H16)<=0.005)'], fill=PatternFill("solid", fgColor="C6EFCE")))
472 +
473 +titre_section(ws, R_C0 - 2, 2, f"Question 3 — Bordereau des 22 composantes : coût unitaire nu (K), montant (L), puis totaux, sous-totaux par division et postes les plus lourds", 11)
474 +entetes(ws, R_C0 - 1, 2, ["No", "Div.", "Composante — lien", "Ce qu'elle comprend — lien", "Quantité (relevé)", "Unité", "Matériaux ($/u)", "MO ($/u)", "Équip. ($/u)", "a) Coût unitaire nu ($/u)", "b) Montant ($)"], height=40)
475 +for i, L in enumerate(COMPOSANTES):
476 + rr = R_C0 + i
498 477 dr = R_T4 + i
499 478 lien(ws, f"B{rr}", f"=Données!B{dr}"); lien(ws, f"C{rr}", f"=Données!C{dr}")
500 479 lien(ws, f"D{rr}", f"=Données!D{dr}", left=True, font=Font(name="Calibri", size=9, color="333333"))
501 480 lien(ws, f"E{rr}", f"=Données!E{dr}", left=True, font=Font(name="Calibri", size=8, color=GRIS))
502 − lien(ws, f"F{rr}", f"=Données!G{dr}", "#,##0.00"); lien(ws, f"G{rr}", f"=Données!H{dr}"); lien(ws, f"H{rr}", f"=Données!I{dr}", "0.00")
503 − ws.merge_cells(start_row=rr, start_column=9, end_row=rr, end_column=10); lien(ws, f"I{rr}", f"=Données!J{dr}")
504 − rep(ws, f"K{rr}", num_fmt="0.000000", comment=f"=VLOOKUP(G32,Données!$B${R_T5}:$D${R_T5 + 4},3,FALSE) (RECHERCHEV en français : clé = unité du relevé, table 5 de Données)" if i == 0 else None)
505 − rep(ws, f"L{rr}", num_fmt="#,##0.00", comment="=F32*H32*K32" if i == 0 else None)
506 − lien(ws, f"M{rr}", f"=Données!K{dr}", FMT_N2); lien(ws, f"N{rr}", f"=Données!L{dr}", FMT_N2); lien(ws, f"O{rr}", f"=Données!M{dr}", FMT_N2)
507 − rep(ws, f"P{rr}", num_fmt=FMT_N2, comment="=M32+N32+O32" if i == 0 else None)
508 − rep(ws, f"Q{rr}", num_fmt=FMT_D2, comment="=L32*P32" if i == 0 else None)
509 − ws.row_dimensions[rr].height = 24
510 −R_L0, R_L1 = 32, 32 + len(LIGNES) - 1 # 32..95
511 −etiquette(ws, 96, 4, "e) COÛT DIRECT NU TOTAL ($) — somme des 64 montants", bold=True); ws.merge_cells("D96:P96")
512 −rep(ws, "Q96", num_fmt=FMT_D2, comment=f"=SUM(Q{R_L0}:Q{R_L1})")
513 −etiquette(ws, 98, 2, "f) Montant total des matériaux ($)", bold=True); ws.merge_cells("B98:D98"); rep(ws, "E98", num_fmt=FMT_D2, comment=f"=SUMPRODUCT(L{R_L0}:L{R_L1},M{R_L0}:M{R_L1}) (SOMMEPROD)")
514 −etiquette(ws, 99, 2, "f) Montant total de la main-d'œuvre ($)", bold=True); ws.merge_cells("B99:D99"); rep(ws, "E99", num_fmt=FMT_D2, comment=f"=SUMPRODUCT(L{R_L0}:L{R_L1},N{R_L0}:N{R_L1})")
515 −etiquette(ws, 100, 2, "f) Montant total de l'équipement ($)", bold=True); ws.merge_cells("B100:D100"); rep(ws, "E100", num_fmt=FMT_D2, comment=f"=SUMPRODUCT(L{R_L0}:L{R_L1},O{R_L0}:O{R_L1})")
516 −etiquette(ws, 101, 2, "f) Part de la main-d'œuvre dans le direct nu (%)", bold=True); ws.merge_cells("B101:D101"); rep(ws, "E101", num_fmt=FMT_P1, comment="=E99/Q96")
517 −note(ws, 102, 2, "Contrôle : E98 + E99 + E100 doit redonner Q96 à quelques dollars près (arrondis des quantités).", 10)
518 −
519 −titre_section(ws, 103, 2, "g) Sous-totaux par division MasterFormat (SOMME.SI / SUMIF sur la colonne C) et part de chaque division ; h) les trois postes les plus lourds", 16)
520 −entetes(ws, 104, 2, ["Code — lien", "Division — lien", "", "g) Direct nu de la division ($)", "g) Part (%)", "Révision r1 — lien ($)", "Écart"])
521 −ws.merge_cells("C104:D104")
481 + lien(ws, f"F{rr}", f"=Données!F{dr}", "#,##0.00"); lien(ws, f"G{rr}", f"=Données!G{dr}", left=True, font=Font(name="Calibri", size=8, color=GRIS))
482 + lien(ws, f"H{rr}", f"=Données!H{dr}", FMT_N2); lien(ws, f"I{rr}", f"=Données!I{dr}", FMT_N2); lien(ws, f"J{rr}", f"=Données!J{dr}", FMT_N2)
483 + rep(ws, f"K{rr}", num_fmt=FMT_N2, comment=f"=H{R_C0}+I{R_C0}+J{R_C0}" if i == 0 else None)
484 + rep(ws, f"L{rr}", num_fmt=FMT_D2, comment=f"=F{R_C0}*K{R_C0}" if i == 0 else None)
485 + ws.row_dimensions[rr].height = 30
486 +etiquette(ws, R_CT, 4, "c) COÛT DIRECT NU TOTAL ($) — somme des 22 montants", bold=True); ws.merge_cells(f"D{R_CT}:K{R_CT}")
487 +rep(ws, f"L{R_CT}", num_fmt=FMT_D2, comment=f"=SUM(L{R_C0}:L{R_C1})")
488 +for k, (lbl, cm, fmt) in enumerate([("d) Montant total des matériaux ($)", f"=SUMPRODUCT(F{R_C0}:F{R_C1},H{R_C0}:H{R_C1}) (SOMMEPROD)", FMT_D2),
489 + ("d) Montant total de la main-d'œuvre ($)", f"=SUMPRODUCT(F{R_C0}:F{R_C1},I{R_C0}:I{R_C1})", FMT_D2),
490 + ("d) Montant total de l'équipement ($)", f"=SUMPRODUCT(F{R_C0}:F{R_C1},J{R_C0}:J{R_C1})", FMT_D2),
491 + ("d) Part de la main-d'œuvre dans le direct nu (%)", f"=E{R_MAT + 1}/L{R_CT}", FMT_P1)]):
492 + rr = R_MAT + k
493 + etiquette(ws, rr, 2, lbl, bold=True); ws.merge_cells(f"B{rr}:D{rr}"); rep(ws, f"E{rr}", num_fmt=fmt, comment=cm)
494 +note(ws, R_MAT + 4, 2, f"Contrôle : E{R_MAT} + E{R_MAT + 1} + E{R_MAT + 2} doit redonner L{R_CT} à quelques dollars près (arrondis des prix composites).", 10)
495 +
496 +titre_section(ws, R_DH - 1, 2, "e) Sous-totaux par division MasterFormat (SOMME.SI / SUMIF sur la colonne C) et part de chaque division ; f) les trois composantes les plus lourdes", 11)
497 +entetes(ws, R_DH, 2, ["Code — lien", "Division — lien", "", "e) Direct nu de la division ($)", "e) Part (%)", "Révision r1 — lien ($)", "Écart"])
498 +ws.merge_cells(f"C{R_DH}:D{R_DH}")
522 499 for i, k in enumerate(DIVS):
523 − rr = 105 + i
524 − lien(ws, f"B{rr}", f"=Données!B{R_T6 + i}")
525 − ws.merge_cells(start_row=rr, start_column=3, end_row=rr, end_column=4); lien(ws, f"C{rr}", f"=Données!C{R_T6 + i}", left=True)
526 − rep(ws, f"E{rr}", num_fmt=FMT_D2, comment=f'=SUMIF($C${R_L0}:$C${R_L1},B105,$Q${R_L0}:$Q${R_L1}) (SOMME.SI ; le code est un texte « 03 »)' if i == 0 else None)
527 − rep(ws, f"F{rr}", num_fmt=FMT_P1, comment="=E105/$Q$96" if i == 0 else None)
528 − lien(ws, f"G{rr}", f"=Données!D{R_T6 + i}", FMT_D2)
529 − lien(ws, f"H{rr}", f'=IF(E{rr}="","—",IF(ABS(E{rr}-G{rr})<=5,"✓","≠"))')
530 −R_D0, R_D1 = 105, 105 + len(DIVS) - 1 # 105..117
500 + rr = R_D0 + i
501 + lien(ws, f"B{rr}", f"=Données!B{R_T5 + i}")
502 + ws.merge_cells(start_row=rr, start_column=3, end_row=rr, end_column=4); lien(ws, f"C{rr}", f"=Données!C{R_T5 + i}", left=True)
503 + rep(ws, f"E{rr}", num_fmt=FMT_D2, comment=f'=SUMIF($C${R_C0}:$C${R_C1},B{R_D0},$L${R_C0}:$L${R_C1}) (SOMME.SI ; le code est un texte « 03 »)' if i == 0 else None)
504 + rep(ws, f"F{rr}", num_fmt=FMT_P1, comment=f"=E{R_D0}/$L${R_CT}" if i == 0 else None)
505 + lien(ws, f"G{rr}", f"=Données!D{R_T5 + i}", FMT_D2)
506 + lien(ws, f"H{rr}", f'=IF(E{rr}="","—",IF(ABS(E{rr}-G{rr})<=25,"✓","≠"))')
531 507 ws.conditional_formatting.add(f"F{R_D0}:F{R_D1}", DataBarRule(start_type="num", start_value=0, end_type="num", end_value=0.3, color=BLEU_CLAIR, showValue=True))
532 508 ws.conditional_formatting.add(f"H{R_D0}:H{R_D1}", FormulaRule(formula=[f'H{R_D0}="≠"'], fill=PatternFill("solid", fgColor="FFC7CE")))
533 509 ws.conditional_formatting.add(f"H{R_D0}:H{R_D1}", FormulaRule(formula=[f'H{R_D0}="✓"'], fill=PatternFill("solid", fgColor="C6EFCE")))
534 −etiquette(ws, R_D1 + 1, 2, "Total des divisions (contrôle = Q96)", bold=True); ws.merge_cells(start_row=R_D1 + 1, start_column=2, end_row=R_D1 + 1, end_column=4)
510 +etiquette(ws, R_D1 + 1, 2, f"Total des divisions (contrôle = L{R_CT})", bold=True); ws.merge_cells(start_row=R_D1 + 1, start_column=2, end_row=R_D1 + 1, end_column=4)
535 511 lien(ws, f"E{R_D1 + 1}", f"=SUM(E{R_D0}:E{R_D1})", FMT_D2)
536 −r_top = R_D1 + 3 # 120
537 −entetes(ws, r_top, 2, ["Rang", "h) Poste (INDEX/EQUIV)", "", "h) Montant ($) (GRANDE.VALEUR)"])
538 −ws.merge_cells(start_row=r_top, start_column=3, end_row=r_top, end_column=4)
512 +entetes(ws, R_TOP - 1, 2, ["Rang", "f) Composante (INDEX/EQUIV)", "", "f) Montant ($) (GRANDE.VALEUR)"])
513 +ws.merge_cells(start_row=R_TOP - 1, start_column=3, end_row=R_TOP - 1, end_column=4)
539 514 for i in range(3):
540 − rr = r_top + 1 + i
515 + rr = R_TOP + i
541 516 c = ws.cell(row=rr, column=2, value=i + 1); c.font = FONT_H2; c.alignment = CENTER; c.border = BORDER_LIGHT; c.fill = FILL_CLAIR
542 517 ws.merge_cells(start_row=rr, start_column=3, end_row=rr, end_column=4)
543 − rep(ws, f"C{rr}", comment=f"=INDEX($D${R_L0}:$D${R_L1},MATCH(E{rr},$Q${R_L0}:$Q${R_L1},0)) (INDEX / EQUIV)" if i == 0 else None)
544 − rep(ws, f"E{rr}", num_fmt=FMT_D2, comment=f"=LARGE($Q${R_L0}:$Q${R_L1},B{rr}) (GRANDE.VALEUR)" if i == 0 else None)
545 −R_TOP = r_top + 1 # 121..123
546 −finir_feuille(ws, OR, zoom=100, titre="Relevé et tarification — questions 1 à 3")
518 + rep(ws, f"C{rr}", comment=f"=INDEX($D${R_C0}:$D${R_C1},MATCH(E{rr},$L${R_C0}:$L${R_C1},0)) (INDEX / EQUIV)" if i == 0 else None)
519 + rep(ws, f"E{rr}", num_fmt=FMT_D2, comment=f"=LARGE($L${R_C0}:$L${R_C1},B{rr}) (GRANDE.VALEUR)" if i == 0 else None)
520 +finir_feuille(ws, OR, zoom=100, titre="Relevé et composantes — questions 1 à 3")
547 521
548 522 # ==============================================================================
549 523 # 4. BORDEREAU (Q4–Q8)
@@ -554,7 +528,7 @@ bandeau(ws, "Bordereau de coût de remplacement neuf — Questions 4 à 8",
554 528 "Chaîne complète : directs nus → directs du cours → contingences → indirects réels → profit entrepreneurial → coût total → unités de comparaison. Tout par formule.", ncols=3)
555 529 ws.freeze_panes = "A5"
556 530 pr = lambda k: f"Données!$D${PR[k]}"
557 −mq = lambda i: f"Données!$D${R_T7 + i}"
531 +mq = lambda i: f"Données!$D${R_T6 + i}"
558 532
559 533
560 534 def ligne(r, label, kind, fmt=FMT_D2, bold=False, hint="", formula=None, comment=None):
@@ -570,8 +544,8 @@ def ligne(r, label, kind, fmt=FMT_D2, bold=False, hint="", formula=None, comment
570 544 ws.row_dimensions[r].height = 24
571 545
572 546
573 −sous_titre(ws, 6, "Question 4 — Des coûts nus du relevé aux coûts directs au sens du cours, puis contingences (lignes 7 à 16)", 2, 4)
574 −ligne(7, "Coûts directs nus du relevé RSMeans — lien (Relevé!Q96)", "calc", formula="=Relevé!Q96")
547 +sous_titre(ws, 6, "Question 4 — Des coûts nus du bordereau aux coûts directs au sens du cours, puis contingences (lignes 7 à 16)", 2, 4)
548 +ligne(7, f"Coûts directs nus des 22 composantes — lien (Relevé!L{R_CT})", "calc", formula=f"=Relevé!L{R_CT}")
575 549 ligne(8, "Ajustement régional Gatineau sur les 3 postes du catalogue UQO Éval — lien", "calc", formula=f"={mq(0)}")
576 550 ligne(9, "a) Coûts directs nus localisés", "rep", comment="=C7+C8")
577 551 ligne(10, "b) Conditions générales du chantier (8 % des directs nus localisés)", "rep", comment=f"=C9*{mq(1)}")
@@ -581,7 +555,7 @@ ligne(13, "e) COÛTS DIRECTS AU SENS DU COURS (a + b + c + d)", "rep", bold=True
581 555 ligne(14, "f) Contingences de construction (5 % des directs nus localisés)", "rep", comment=f"=C9*{mq(4)}")
582 556 ligne(15, "g) DIRECTS + CONTINGENCES", "rep", bold=True, comment="=C13+C14")
583 557 ligne(16, "Contrôle : total de la révision r1 d'UQO Éval — lien", "calc", formula=f"={mq(5)}")
584 −ck = ws["D16"]; ck.value = '=IF(C15="","",IF(ABS(C15-C16)<=25,"✓ vous retrouvez la révision r1 (± 25 $ d\'arrondi)","≠ revoir la chaîne (ordre des majorations)"))'; ck.font = FONT_H2; ck.alignment = WRAP
558 +ck = ws["D16"]; ck.value = '=IF(C15="","",IF(ABS(C15-C16)<=50,"✓ vous retrouvez la révision r1 (± 50 $ d\'arrondi)","≠ revoir la chaîne (ordre des majorations)"))'; ck.font = FONT_H2; ck.alignment = WRAP
585 559 ws.conditional_formatting.add("D16", FormulaRule(formula=['LEFT($D$16,1)="✓"'], fill=PatternFill("solid", fgColor="C6EFCE")))
586 560 ws.conditional_formatting.add("D16", FormulaRule(formula=['LEFT($D$16,1)="≠"'], fill=PatternFill("solid", fgColor="FFC7CE")))
587 561
@@ -627,11 +601,13 @@ finir_feuille(ws, OR, zoom=100, landscape=False, titre="Bordereau — questions
627 601 ws = wb.create_sheet("Marché")
628 602 preparer_feuille(ws, {"B": 6, "C": 30, "D": 12, "E": 13, "F": 8, "G": 11, "H": 13, "I": 13, "J": 15, "K": 15, "L": 13, "M": 14, "N": 12})
629 603 bandeau(ws, "Validation par le marché — Question 9",
630 − "Onze ventes réelles de quadruplex neufs, moteur de coût d'UQO Éval, fourchette Altus · extraction de la valeur implicite du bâtiment et du profit", ncols=13)
631 −titre_section(ws, 4, 2, "a) Pour chaque vente : terrain indexé (rôle terrain × 1,257), valeur implicite du bâtiment, $/m² d'aire d'étages, $/logement, ratio prix ÷ rôle total (J6:N16), puis médianes (K17:N17)", 13)
604 + f"{NV} ventes réelles de quadruplex neufs, moteur de coût d'UQO Éval, fourchette Altus · extraction de la valeur implicite du bâtiment et du profit", ncols=13)
605 +R_V0, R_V1 = 6, 6 + NV - 1 # 6..13
606 +R_MED = R_V1 + 1 # 14
607 +titre_section(ws, 4, 2, f"a) Pour chaque vente : terrain indexé (rôle terrain × 1,257), valeur implicite du bâtiment, $/m² d'aire d'étages, $/logement, ratio prix ÷ rôle total (J{R_V0}:N{R_V1}), puis médianes (K{R_MED}:N{R_MED})", 13)
632 608 entetes(ws, 5, 2, ["No", "Adresse — lien", "Date", "Prix ($)", "Année", "Aire d'étages (m²)", "Rôle terrain ($)", "Rôle total ($)", "a) Terrain indexé ($)", "a) Bâtiment implicite ($) = prix − terrain", "a) $/m² d'aire d'étages", "a) $/logement (4)", "a) Ratio prix ÷ rôle total"], height=44)
633 −for i, v in enumerate(VENTES):
634 − rr = 6 + i; dr = R_T9 + i
609 +for i, v in enumerate(VTP):
610 + rr = R_V0 + i; dr = R_T8 + i
635 611 lien(ws, f"B{rr}", f"=Données!B{dr}"); lien(ws, f"C{rr}", f"=Données!C{dr}", left=True); lien(ws, f"D{rr}", f"=Données!E{dr}")
636 612 lien(ws, f"E{rr}", f"=Données!F{dr}", "#,##0"); lien(ws, f"F{rr}", f"=Données!G{dr}", "0"); lien(ws, f"G{rr}", f"=Données!H{dr}", "0.0")
637 613 lien(ws, f"H{rr}", f"=Données!L{dr}", "#,##0"); lien(ws, f"I{rr}", f"=Données!N{dr}", "#,##0")
@@ -640,29 +616,25 @@ for i, v in enumerate(VENTES):
640 616 rep(ws, f"L{rr}", num_fmt=FMT_PM2, comment="=K6/G6" if i == 0 else None)
641 617 rep(ws, f"M{rr}", num_fmt="#,##0", comment="=K6/4" if i == 0 else None)
642 618 rep(ws, f"N{rr}", num_fmt="0.000", comment="=E6/I6" if i == 0 else None)
643 −etiquette(ws, 17, 3, "MÉDIANES (fonction MEDIANE / MEDIAN)", bold=True); ws.merge_cells("C17:J17")
619 +etiquette(ws, R_MED, 3, "MÉDIANES (fonction MEDIANE / MEDIAN)", bold=True); ws.merge_cells(f"C{R_MED}:J{R_MED}")
644 620 for col in "KLMN":
645 − rep(ws, f"{col}17", num_fmt=("#,##0" if col in "KM" else FMT_PM2 if col == "L" else "0.000"), comment="=MEDIAN(K6:K16)" if col == "K" else None)
646 −ws.conditional_formatting.add("N6:N16", DataBarRule(start_type="num", start_value=0.8, end_type="num", end_value=1.6, color=OR, showValue=True))
647 −
648 −titre_section(ws, 19, 2, "b) Bordereau vs marché, vs moteur de coût d'UQO Éval, vs Altus ; c) profit entrepreneurial extrait du marché (K21:K25)", 13)
649 −etiquette(ws, 20, 3, "Coût total de remplacement neuf du bordereau — lien (Bordereau!C38)", bold=True); ws.merge_cells("C20:J20"); lien(ws, "K20", '=IF(Bordereau!C38="","Bordereau à faire",Bordereau!C38)', FMT_D)
650 −etiquette(ws, 21, 3, "b) Écart du bordereau par rapport à la valeur implicite médiane du bâtiment (K17) (%)", bold=True); ws.merge_cells("C21:J21"); rep(ws, "K21", num_fmt=FMT_P1, comment="=K20/K17-1")
651 −etiquette(ws, 22, 3, "Coût de remplacement neuf du moteur de coût d'UQO Éval — lien (Données, tableau 11)", bold=True); ws.merge_cells("C22:J22"); lien(ws, "K22", f"=Données!D{R_T11}", FMT_D)
652 −etiquette(ws, 23, 3, "b) Écart du bordereau par rapport au moteur de coût (%)", bold=True); ws.merge_cells("C23:J23"); rep(ws, "K23", num_fmt=FMT_P1, comment="=K20/K22-1")
653 −etiquette(ws, 24, 3, "b) Position du $/pi² hors sol (Bordereau!C39) dans la fourchette Altus 2026 (formule SI : « sous », « dans », « au-dessus »)", bold=True); ws.merge_cells("C24:J24")
654 −rep(ws, "K24", comment=f'=IF(Bordereau!C39<{pr("altus_lo")},"sous la fourchette",IF(Bordereau!C39>{pr("altus_hi")},"au-dessus de la fourchette","dans la fourchette Altus 2026"))')
655 −etiquette(ws, 25, 3, "c) Profit entrepreneurial EXTRAIT du marché = (bâtiment implicite médian − assiette Bordereau!C36) ÷ assiette (%)", bold=True); ws.merge_cells("C25:J25"); rep(ws, "K25", num_fmt=FMT_P1, comment="=(K17-Bordereau!C36)/Bordereau!C36")
656 −# ⚠ zones : les réponses b)-c) sont en colonne K (K21, K23, K24, K25) ; C20:J25 = étiquettes
657 −titre_section(ws, 27, 2, "d) Deux quadruplex de 2020 en vigueur (prix DEMANDÉS) : bâtiment implicite et $/logement (F29:G30)", 13)
658 −entetes(ws, 28, 2, ["No", "Adresse — lien", "Prix demandé ($)", "Rôle terrain ($)", "d) Bâtiment implicite ($)", "d) $/logement"])
659 −for i, a in enumerate(ANNONCES):
660 − rr = 29 + i; dr = R_T10 + i
661 − lien(ws, f"B{rr}", f"=Données!B{dr}"); lien(ws, f"C{rr}", f"=Données!C{dr}", left=True); lien(ws, f"D{rr}", f"=Données!E{dr}", "#,##0"); lien(ws, f"E{rr}", f"=Données!K{dr}", "#,##0")
662 − rep(ws, f"F{rr}", num_fmt="#,##0", comment=f"=D29-E29*{pr('ratio')}" if i == 0 else None)
663 − rep(ws, f"G{rr}", num_fmt="#,##0", comment="=F29/4" if i == 0 else None)
664 −titre_section(ws, 32, 2, "e) Lecture (C33) : que signifie l'écart bordereau / marché ? Pourquoi le profit extrait dépasse-t-il la convention de 11 % ? Quelles différences entre le projet et les comparables (logements au rez-de-jardin, qualité, année, terrain indexé, prix demandés ≠ ventes) ? Que retenir pour le promoteur ? (8-12 lignes)", 13)
665 −zone(ws, "C33", 6, 11, "Réponse ancrée dans K17, K20:K25, F29:G30 et le tableau 9…")
621 + rep(ws, f"{col}{R_MED}", num_fmt=("#,##0" if col in "KM" else FMT_PM2 if col == "L" else "0.000"), comment=f"=MEDIAN(K{R_V0}:K{R_V1})" if col == "K" else None)
622 +ws.conditional_formatting.add(f"N{R_V0}:N{R_V1}", DataBarRule(start_type="num", start_value=0.8, end_type="num", end_value=1.6, color=OR, showValue=True))
623 +
624 +r0 = R_MED + 2 # 16
625 +titre_section(ws, r0, 2, f"b) Bordereau vs marché, vs moteur de coût d'UQO Éval, vs Altus ; c) profit entrepreneurial extrait du marché (K{r0 + 2}, K{r0 + 4}:K{r0 + 6})", 13)
626 +etiquette(ws, r0 + 1, 3, "Coût total de remplacement neuf du bordereau — lien (Bordereau!C38)", bold=True); ws.merge_cells(f"C{r0 + 1}:J{r0 + 1}"); lien(ws, f"K{r0 + 1}", '=IF(Bordereau!C38="","Bordereau à faire",Bordereau!C38)', FMT_D)
627 +etiquette(ws, r0 + 2, 3, f"b) Écart du bordereau par rapport à la valeur implicite médiane du bâtiment (K{R_MED}) (%)", bold=True); ws.merge_cells(f"C{r0 + 2}:J{r0 + 2}"); rep(ws, f"K{r0 + 2}", num_fmt=FMT_P1, comment=f"=K{r0 + 1}/K{R_MED}-1")
628 +etiquette(ws, r0 + 3, 3, "Coût de remplacement neuf du moteur de coût d'UQO Éval — lien (Données, tableau 10)", bold=True); ws.merge_cells(f"C{r0 + 3}:J{r0 + 3}"); lien(ws, f"K{r0 + 3}", f"=Données!D{R_T10}", FMT_D)
629 +etiquette(ws, r0 + 4, 3, "b) Écart du bordereau par rapport au moteur de coût (%)", bold=True); ws.merge_cells(f"C{r0 + 4}:J{r0 + 4}"); rep(ws, f"K{r0 + 4}", num_fmt=FMT_P1, comment=f"=K{r0 + 1}/K{r0 + 3}-1")
630 +etiquette(ws, r0 + 5, 3, "b) Position du $/pi² hors sol (Bordereau!C39) dans la fourchette Altus 2026 (formule SI : « sous », « dans », « au-dessus »)", bold=True); ws.merge_cells(f"C{r0 + 5}:J{r0 + 5}")
631 +rep(ws, f"K{r0 + 5}", comment=f'=IF(Bordereau!C39<{pr("altus_lo")},"sous la fourchette",IF(Bordereau!C39>{pr("altus_hi")},"au-dessus de la fourchette","dans la fourchette Altus 2026"))')
632 +etiquette(ws, r0 + 6, 3, "c) Profit entrepreneurial EXTRAIT du marché = (bâtiment implicite médian − assiette Bordereau!C36) ÷ assiette (%)", bold=True); ws.merge_cells(f"C{r0 + 6}:J{r0 + 6}"); rep(ws, f"K{r0 + 6}", num_fmt=FMT_P1, comment=f"=(K{R_MED}-Bordereau!C36)/Bordereau!C36")
633 +R_K = {"total": r0 + 1, "ecart_marche": r0 + 2, "moteur": r0 + 3, "ecart_moteur": r0 + 4, "altus": r0 + 5, "profit_extrait": r0 + 6}
634 +r1 = r0 + 8 # 24
635 +titre_section(ws, r1, 2, f"d) Lecture (C{r1 + 1}) : que signifie l'écart bordereau / marché ? Pourquoi le profit extrait dépasse-t-il la convention de 11 % ? Quelles différences entre le projet et les comparables (logements au rez-de-jardin, qualité, année, terrain indexé, Q8, annonces du tableau 9 = prix demandés) ? Que retenir pour le promoteur ? (8-12 lignes)", 13)
636 +zone(ws, f"C{r1 + 1}", 6, 11, f"Réponse ancrée dans K{R_MED}, K{r0 + 1}:K{r0 + 6} et les tableaux 8 et 9…")
637 +R_LECT = r1 + 1
666 638 finir_feuille(ws, EVAL_BLEU, titre="Marché — question 9")
667 639
668 640 # ==============================================================================
@@ -679,7 +651,7 @@ kpis = [
679 651 ("TOTAL DES INDIRECTS", "", FMT_D, True, "Bordereau!C32"),
680 652 ("PROFIT ENTREPRENEURIAL", "", FMT_D, True, "Bordereau!C37"),
681 653 ("$/pi² HORS SOL", "", FMT_PSF, True, "Bordereau!C39"),
682 − ("ÉCART BORDEREAU / MARCHÉ", "", FMT_P1, True, "Marché!K21"),
654 + ("ÉCART BORDEREAU / MARCHÉ", "", FMT_P1, True, f"Marché!K{R_K['ecart_marche']}"),
683 655 ]
684 656 ACCENT = [BLEU_CLAIR, BLEU_CLAIR, OR, OR, EVAL_BLEU, VERT]
685 657 for j, (lbl, formula, fmt, is_student, src) in enumerate(kpis):
@@ -692,7 +664,7 @@ for j, (lbl, formula, fmt, is_student, src) in enumerate(kpis):
692 664 vc.fill = FILL_REPONSE if is_student else PatternFill("solid", fgColor="FFFFFF")
693 665 sc = ws.cell(row=7, column=col, value=src); sc.font = FONT_KPI_SRC; sc.alignment = Alignment(horizontal="center", vertical="center", wrap_text=True)
694 666 sc.fill = FILL_CLAIR if not is_student else FILL_REPONSE; sc.border = Border(left=LIGHT, right=LIGHT, bottom=LIGHT)
695 −ws["D6"].comment = Comment('Modèle : =IFERROR(Bordereau!C32,"—") — même logique pour E6 (Bordereau!C37), F6 (Bordereau!C39), G6 (Marché!K21)', "UQO Éval · TP2")
667 +ws["D6"].comment = Comment(f'Modèle : =IFERROR(Bordereau!C32,"—") — même logique pour E6 (Bordereau!C37), F6 (Bordereau!C39), G6 (Marché!K{R_K["ecart_marche"]})', "UQO Éval · TP2")
696 668 ws.row_dimensions[5].height = 30; ws.row_dimensions[6].height = 34; ws.row_dimensions[7].height = 22
697 669
698 670 lc = ws.cell(row=8, column=2, value="VERDICT →"); lc.font = FONT_H1; lc.alignment = Alignment(horizontal="right", vertical="center")
@@ -720,7 +692,7 @@ def style_chart(ch):
720 692 ch1 = BarChart(); ch1.type = "bar"
721 693 ch1.title = "Coût direct nu par division MasterFormat ($)"
722 694 ch1.height = 7.6; ch1.width = 13
723 −ch1.add_data(Reference(releve, min_col=5, min_row=104, max_row=R_D1), titles_from_data=True)
695 +ch1.add_data(Reference(releve, min_col=5, min_row=R_DH, max_row=R_D1), titles_from_data=True)
724 696 ch1.set_categories(Reference(releve, min_col=3, min_row=R_D0, max_row=R_D1))
725 697 ch1.series[0].graphicalProperties.solidFill = BLEU_CLAIR
726 698 ch1.gapWidth = 50
@@ -729,23 +701,23 @@ ws.add_chart(ch1, "B10")
729 701
730 702 for j, h in enumerate(["Indication", "$/logement"]):
731 703 c = ws.cell(row=10, column=13 + j, value=h); c.font = FONT_NOTE; c.border = BORDER_LIGHT; c.fill = FILL_CALCUL
732 −src2 = [("Bordereau (coût total ÷ 4)", "=IFERROR(Bordereau!C41,0)"), ("Moteur UQO Éval (RCN ÷ 4)", f"=Données!D{R_T11}/4"),
733 − ("Marché : bâtiment implicite médian ÷ 4", "=IFERROR(Marché!M17,0)"), ("Annonce A1 (280, Champlain)", "=IFERROR(Marché!G29,0)"), ("Annonce A2 (335, Hippodrome)", "=IFERROR(Marché!G30,0)")]
704 +src2 = [("Bordereau (coût total ÷ 4)", "=IFERROR(Bordereau!C41,0)"), ("Moteur UQO Éval (RCN ÷ 4)", f"=Données!D{R_T10}/4"),
705 + ("Marché : bâtiment implicite médian ÷ 4", f"=IFERROR(Marché!M{R_MED},0)")]
734 706 for i, (lbl, f) in enumerate(src2):
735 707 a = ws.cell(row=11 + i, column=13, value=lbl); a.font = FONT_NOTE; a.border = BORDER_LIGHT; a.fill = FILL_CALCUL
736 708 b = ws.cell(row=11 + i, column=14, value=f); b.font = FONT_NOTE; b.border = BORDER_LIGHT; b.fill = FILL_CALCUL; b.number_format = "#,##0"
737 −note(ws, 16, 13, "Table source du graphique 2 — ne pas modifier.", 2)
709 +note(ws, 14, 13, "Table source du graphique 2 — ne pas modifier.", 2)
738 710 ch2 = BarChart(); ch2.type = "col"
739 711 ch2.title = "Coût du bâtiment par logement : bordereau, moteur, marché"
740 712 ch2.y_axis.title = "$ / logement"
741 713 ch2.height = 7.6; ch2.width = 11
742 −ch2.add_data(Reference(ws, min_col=14, min_row=10, max_row=15), titles_from_data=True)
743 −ch2.set_categories(Reference(ws, min_col=13, min_row=11, max_row=15))
714 +ch2.add_data(Reference(ws, min_col=14, min_row=10, max_row=13), titles_from_data=True)
715 +ch2.set_categories(Reference(ws, min_col=13, min_row=11, max_row=13))
744 716 ch2.series[0].graphicalProperties.solidFill = OR
745 717 ch2.gapWidth = 60
746 718 style_chart(ch2); ch2.legend = None
747 719 ws.add_chart(ch2, "I10")
748 −titre_section(ws, 26, 2, "Graphique 3 (question 10c) : ajoutez ci-dessous votre graphique — p. ex. matériaux / main-d'œuvre / équipement (Relevé!E98:E100), sensibilité du coût total à la durée du chantier, ou $/m² implicite des 11 ventes (Marché!L6:L16)", 12)
720 +titre_section(ws, 26, 2, f"Graphique 3 (question 10c) : ajoutez ci-dessous votre graphique — p. ex. matériaux / main-d'œuvre / équipement (Relevé!E{R_MAT}:E{R_MAT + 2}), sensibilité du coût total à la durée du chantier, ou $/m² implicite des {NV} ventes (Marché!L{R_V0}:L{R_V1})", 12)
749 721 ph = ws.cell(row=27, column=2, value="◻ Votre 3e graphique ici (titre + axes étiquetés)"); ph.font = Font(name="Calibri", size=11, italic=True, color="9A8A2E")
750 722 finir_feuille(ws, TURQUOISE, titre="Dashboard — question 10")
751 723
@@ -758,9 +730,9 @@ bandeau(ws, "Note au promoteur — avant la demande de financement",
758 730 "Question 10 — une page, ton professionnel, chaque affirmation ancrée dans un chiffre du classeur (citez la cellule).", ncols=2)
759 731 sections = [
760 732 ("Conclusion : coût total de remplacement neuf, $/pi² (hors sol et chauffé), $/logement, part des indirects et du profit", 2),
761 − ("Postes les plus sensibles du bordereau (trois postes les plus lourds, division la plus lourde, part de la main-d'œuvre)", 2),
733 + ("Postes les plus sensibles du bordereau (trois composantes les plus lourdes, division la plus lourde, part de la main-d'œuvre)", 2),
762 734 ("Effet chiffré d'un retard de chantier de 6 mois sur les intérêts intercalaires et sur le coût total", 2),
763 − ("Ce que disent le marché (11 ventes), le moteur de coût d'UQO Éval et Altus : le projet est-il viable ? marge attendue", 2),
735 + (f"Ce que disent le marché ({NV} ventes), le moteur de coût d'UQO Éval et Altus : le projet est-il viable ? marge attendue", 2),
764 736 ("Conventions à déclarer (profit sur directs + indirects, contingences, exclusion des taxes) et ce qui changerait avec l'autre convention", 2),
765 737 ("Limites du travail (plan générique, prix publiés RSMeans, comparables au rez-de-jardin, terrain indexé, prix demandés ≠ ventes)", 2),
766 738 ]
@@ -779,4 +751,5 @@ if not os.environ.get("TP2_SKIP_SAVE"): # make_IMM1033_TP2_solution.py réutil
779 751 os.makedirs(os.path.dirname(OUT), exist_ok=True)
780 752 wb.save(OUT)
781 753 print("OK :", OUT)
782 − print("Repères Données :", {k: v for k, v in DN.items() if k != "PR"}, "PR", PR, "| Relevé lignes", R_L0, R_L1, "divisions", R_D0, R_D1, "top", R_TOP)
754 + print("Données :", {k: v for k, v in DN.items() if k != "PR"}, "PR", PR)
755 + print("Relevé : composantes", R_C0, R_C1, "total", R_CT, "mat", R_MAT, "divisions", R_D0, R_D1, "top", R_TOP, "| Marché : ventes", R_V0, R_V1, "méd", R_MED, "K", R_K, "lecture", R_LECT)
modified IMM1033-20_Methodes_du_cout/05_Ressources/scripts_gabarits_excel/make_IMM1033_TP2_solution.py +64 −69
@@ -1,5 +1,5 @@
1 1 #!/usr/bin/env python3
2 −"""Solutionnaire Excel — IMM1033-20 TP2 (RÉSERVÉ À L'ENSEIGNANT) : quadruplex de 2 étages à Gatineau (UQO Éval, RSMeans 2026 T4).
2 +"""Solutionnaire Excel — IMM1033-20 TP2 (RÉSERVÉ À L'ENSEIGNANT) : quadruplex de 2 étages à Gatineau (UQO Éval, 22 composantes RSMeans 2026 T4).
3 3
4 4 Recharge le gabarit en mémoire (make_IMM1033_TP2.py exécuté avec TP2_SKIP_SAVE=1 : le gabarit distribué n'est pas réécrit),
5 5 puis remplit chaque cellule jaune avec la FORMULE attendue (chaînée à Données), les zones de texte avec les réponses modèles,
@@ -16,8 +16,9 @@ sys.path.insert(0, HERE)
16 16 os.environ["TP2_SKIP_SAVE"] = "1"
17 17 ns = runpy.run_path(os.path.join(HERE, "make_IMM1033_TP2.py"))
18 18 wb = ns["wb"]
19 −PR, R_T1, R_T5, R_T6, R_T7, R_T9, R_T10, R_T11 = ns["PR"], ns["R_T1"], ns["R_T5"], ns["R_T6"], ns["R_T7"], ns["R_T9"], ns["R_T10"], ns["R_T11"]
20 −R_L0, R_L1, R_D0, R_D1, R_TOP = ns["R_L0"], ns["R_L1"], ns["R_D0"], ns["R_D1"], ns["R_TOP"]
19 +PR, R_T1, R_T5, R_T6, R_T10 = ns["PR"], ns["R_T1"], ns["R_T5"], ns["R_T6"], ns["R_T10"]
20 +R_C0, R_C1, R_CT, R_MAT, R_D0, R_D1, R_TOP = ns["R_C0"], ns["R_C1"], ns["R_CT"], ns["R_MAT"], ns["R_D0"], ns["R_D1"], ns["R_TOP"]
21 +R_V0, R_V1, R_MED, R_K, R_LECT, GRANDEURS = ns["R_V0"], ns["R_V1"], ns["R_MED"], ns["R_K"], ns["R_LECT"], ns["GRANDEURS"]
21 22
22 23 from openpyxl.chart import PieChart, Reference # noqa: E402
23 24 from openpyxl.styles import Alignment, Font, PatternFill # noqa: E402
@@ -30,7 +31,8 @@ FONT_SOL = Font(name="Calibri", size=10, color="1E4620")
30 31 FONT_SOL_TXT = Font(name="Calibri", size=10, color="1F2A1F")
31 32 FONT_TITRE = Font(name="Calibri", size=18, bold=True, color="FFFFFF")
32 33 pr = lambda k: f"Données!$D${PR[k]}"
33 −mq = lambda i: f"Données!$D${R_T7 + i}"
34 +mq = lambda i: f"Données!$D${R_T6 + i}"
35 +D2 = '#,##0.00" $"'
34 36
35 37
36 38 def sol(ws, coord, value, fmt=None):
@@ -83,39 +85,34 @@ sol(ws, "D8", "Aucun outil d'IA ; valeurs reproduites par tp2_solutions.py ; cas
83 85 # ---------------- RELEVÉ ----------------
84 86 ws = wb["Relevé"]
85 87 txt(ws, "C5",
86 − "RELEVÉ DES QUANTITÉS : le promoteur dispose de plans cotés et d'une fiche technique ; la méthode du relevé (quantity survey) est la plus précise des quatre (séance 6) "
87 − "parce qu'elle part des quantités réelles de chaque composante (m³ de béton, m² de brique, nombre de fenêtres) tarifées à l'unité — c'est la méthode de l'entrepreneur qui soumissionne. "
88 − "La méthode COMPARATIVE ($/pi² d'un guide) ne donnerait qu'un ordre de grandeur (Altus 180-330 $/pi²) sans distinguer brique et vinyle, toit plat et bardeaux ; la méthode par COMPOSANTES "
89 − "(unités en place, celle du moteur de coût d'UQO Éval, tableau 11) est un bon compromis de contrôle ; la méthode INDEXÉE suppose un coût historique connu, inexistant pour un projet neuf. "
90 − "COÛT DE REMPLACEMENT par définition : il n'y a pas d'original à reproduire — on chiffre un bâtiment d'utilité équivalente aux normes et matériaux d'aujourd'hui (séance 5) ; la reproduction ne "
91 − "redeviendrait pertinente que pour un bâtiment existant à caractéristiques d'époque. LIMITES : plan générique (gabarit UQO Éval, pas les plans d'exécution), prix publiés RSMeans localisés "
92 − "Gatineau (pas des soumissions), 55 mesures non vérifiées manuellement, précision attendue ± 5 à 10 % sur les directs.")
93 −F = ["=(Données!D11+Données!D13)*(Données!D12+Données!D13)", "=2*(Données!D11+Données!D12)", "=(F16+0.9*F17)*Données!D17", "=F17*0.9*(Données!D17-0.3)",
94 − "=F17*Données!D15", "=F17*(Données!D15-Données!D16)", "=F17*Données!D14*Données!D10", "=F22-E12", "=F16*Données!D18*Données!D19", "=G12", "=F23+2*F12", "=F26+G12"]
95 −for i, f in enumerate(F):
88 + "BORDEREAU PAR COMPOSANTES ISSU D'UN RELEVÉ : le promoteur dispose de plans cotés et d'une fiche technique ; UQO Éval en a tiré un relevé des quantités (quantity survey) que le TP condense en "
89 + "22 composantes (unités en place) à prix composites — c'est la méthode par composantes de la séance 6, nourrie par un vrai relevé : chaque composante est une quantité mesurée sur le plan "
90 + "(m² de toit, m² de brique, nombre de fenêtres) multipliée par un prix nu par unité. La méthode COMPARATIVE ($/pi² d'un guide, Altus 180-330 $) ne donnerait qu'un ordre de grandeur sans "
91 + "distinguer brique et vinyle, toit plat et bardeaux ; le RELEVÉ DÉTAILLÉ ligne par ligne (64 lignes RSMeans sur UQO Éval) est plus précis mais plus lourd — c'est celui de l'entrepreneur ; "
92 + "la méthode INDEXÉE suppose un coût historique connu, inexistant pour un projet neuf. COÛT DE REMPLACEMENT par définition : il n'y a pas d'original à reproduire — on chiffre un bâtiment "
93 + "d'utilité équivalente aux normes et matériaux d'aujourd'hui (séance 5) ; la reproduction ne redeviendrait pertinente que pour un bâtiment existant à caractéristiques d'époque. "
94 + "LIMITES : plan générique (gabarit UQO Éval, pas les plans d'exécution), prix publiés RSMeans localisés Gatineau (pas des soumissions), précision attendue ± 5 à 10 % sur les directs.")
95 +for i, g in enumerate(GRANDEURS):
96 96 rr = 16 + i
97 − sol(ws, f"F{rr}", f, "#,##0.00"); sol(ws, f"H{rr}", f"=F{rr}/G{rr}-1", "0.00%")
98 −for rr in range(R_L0, R_L1 + 1):
99 − sol(ws, f"K{rr}", f"=VLOOKUP(G{rr},Données!$B${R_T5}:$D${R_T5 + 4},3,FALSE)", "0.000000")
100 − sol(ws, f"L{rr}", f"=F{rr}*H{rr}*K{rr}", "#,##0.00")
101 − sol(ws, f"P{rr}", f"=M{rr}+N{rr}+O{rr}", "#,##0.00")
102 − sol(ws, f"Q{rr}", f"=L{rr}*P{rr}", '#,##0.00" $"')
103 −sol(ws, "Q96", f"=SUM(Q{R_L0}:Q{R_L1})", '#,##0.00" $"')
104 −sol(ws, "E98", f"=SUMPRODUCT(L{R_L0}:L{R_L1},M{R_L0}:M{R_L1})", '#,##0.00" $"')
105 −sol(ws, "E99", f"=SUMPRODUCT(L{R_L0}:L{R_L1},N{R_L0}:N{R_L1})", '#,##0.00" $"')
106 −sol(ws, "E100", f"=SUMPRODUCT(L{R_L0}:L{R_L1},O{R_L0}:O{R_L1})", '#,##0.00" $"')
107 −sol(ws, "E101", "=E99/Q96", "0.0%")
97 + sol(ws, f"F{rr}", g["formule"], "#,##0.00"); sol(ws, f"H{rr}", f"=F{rr}/G{rr}-1", "0.00%")
98 +for rr in range(R_C0, R_C1 + 1):
99 + sol(ws, f"K{rr}", f"=H{rr}+I{rr}+J{rr}", "#,##0.00")
100 + sol(ws, f"L{rr}", f"=F{rr}*K{rr}", D2)
101 +sol(ws, f"L{R_CT}", f"=SUM(L{R_C0}:L{R_C1})", D2)
102 +sol(ws, f"E{R_MAT}", f"=SUMPRODUCT(F{R_C0}:F{R_C1},H{R_C0}:H{R_C1})", D2)
103 +sol(ws, f"E{R_MAT + 1}", f"=SUMPRODUCT(F{R_C0}:F{R_C1},I{R_C0}:I{R_C1})", D2)
104 +sol(ws, f"E{R_MAT + 2}", f"=SUMPRODUCT(F{R_C0}:F{R_C1},J{R_C0}:J{R_C1})", D2)
105 +sol(ws, f"E{R_MAT + 3}", f"=E{R_MAT + 1}/L{R_CT}", "0.0%")
108 106 for rr in range(R_D0, R_D1 + 1):
109 − sol(ws, f"E{rr}", f"=SUMIF($C${R_L0}:$C${R_L1},B{rr},$Q${R_L0}:$Q${R_L1})", '#,##0.00" $"')
110 − sol(ws, f"F{rr}", f"=E{rr}/$Q$96", "0.0%")
107 + sol(ws, f"E{rr}", f"=SUMIF($C${R_C0}:$C${R_C1},B{rr},$L${R_C0}:$L${R_C1})", D2)
108 + sol(ws, f"F{rr}", f"=E{rr}/$L${R_CT}", "0.0%")
111 109 for i in range(3):
112 110 rr = R_TOP + i
113 − sol(ws, f"E{rr}", f"=LARGE($Q${R_L0}:$Q${R_L1},B{rr})", '#,##0.00" $"')
114 − sol(ws, f"C{rr}", f"=INDEX($D${R_L0}:$D${R_L1},MATCH(E{rr},$Q${R_L0}:$Q${R_L1},0))")
111 + sol(ws, f"E{rr}", f"=LARGE($L${R_C0}:$L${R_C1},B{rr})", D2)
112 + sol(ws, f"C{rr}", f"=INDEX($D${R_C0}:$D${R_C1},MATCH(E{rr},$L${R_C0}:$L${R_C1},0))")
115 113
116 114 # ---------------- BORDEREAU ----------------
117 115 ws = wb["Bordereau"]
118 −D2 = '#,##0.00" $"'
119 116 for coord, f, fmt in [("C9", "=C7+C8", D2), ("C10", f"=C9*{mq(1)}", D2), ("C11", f"=(C9+C10)*{mq(2)}", D2), ("C12", f"=(C9+C10+C11)*{mq(3)}", D2),
120 117 ("C13", "=SUM(C9:C12)", D2), ("C14", f"=C9*{mq(4)}", D2), ("C15", "=C13+C14", D2),
121 118 ("C19", f"=MAX({pr('permis')}/1000*C15,{pr('permis_min')}*Données!$D${R_T1['log']})", D2), ("C20", f"=Données!$D${R_T1['log']}*{pr('gcr')}", D2),
@@ -127,49 +124,47 @@ for coord, f, fmt in [("C9", "=C7+C8", D2), ("C10", f"=C9*{mq(1)}", D2), ("C11",
127 124 sol(ws, coord, f, fmt)
128 125 txt(ws, "C25",
129 126 "Le prêt de construction est tiré AU RYTHME DES TRAVAUX (décaissements progressifs à chaque certificat d'avancement) : l'encours moyen sur les 12 mois vaut environ la moitié du coût final, "
130 − "d'où I = (D + C) × i × T × ½ — on ne paie pas 6,75 % sur 611 812 $ pendant un an, mais sur un encours qui croît de 0 à 611 812 $. Le facteur ½ est TROP OPTIMISTE si les décaissements sont "
127 + "d'où I = (D + C) × i × T × ½ — on ne paie pas 6,75 % sur 611 843 $ pendant un an, mais sur un encours qui croît de 0 à 611 843 $. Le facteur ½ est TROP OPTIMISTE si les décaissements sont "
131 128 "concentrés tôt (terrain déjà financé par le même prêt, acomptes aux fournisseurs, structure et enveloppe payées dans les premiers mois) ou si le chantier s'étire après la fin des tirages : "
132 129 "l'encours moyen dépasse alors 50 %.")
133 130 txt(ws, "C44",
134 − "Deux conventions coexistent (séance 8) : profit sur (directs + contingences + indirects) — celle du cours, 75 228 $ — ou sur les directs seuls, 64 707 $, soit 10 521 $ de moins (−1,4 % du coût "
131 + "Deux conventions coexistent (séance 8) : profit sur (directs + contingences + indirects) — celle du cours, 75 231 $ — ou sur les directs seuls, 64 710 $, soit 10 521 $ de moins (−1,4 % du coût "
135 132 "total). Comme le pourcentage est identique mais l'assiette différente, deux évaluateurs honnêtes arrivent à deux coûts neufs différents : l'évaluateur doit ÉNONCER sa convention pour que "
136 133 "le lecteur puisse répliquer le calcul et comparer des bordereaux entre eux (normes OEAQ : hypothèses et méthodes explicites). Pour un promoteur, la base la plus défendable est "
137 134 "l'investissement total à risque (directs + indirects, intercalaires inclus) : c'est sur ce capital qu'il exige un rendement, pas seulement sur les matériaux et la main-d'œuvre.")
138 135
139 136 # ---------------- MARCHÉ ----------------
140 137 ws = wb["Marché"]
141 −for rr in range(6, 17):
138 +for rr in range(R_V0, R_V1 + 1):
142 139 sol(ws, f"J{rr}", f"=H{rr}*{pr('ratio')}", "#,##0"); sol(ws, f"K{rr}", f"=E{rr}-J{rr}", "#,##0"); sol(ws, f"L{rr}", f"=K{rr}/G{rr}", '#,##0" $/m²"')
143 140 sol(ws, f"M{rr}", f"=K{rr}/4", "#,##0"); sol(ws, f"N{rr}", f"=E{rr}/I{rr}", "0.000")
144 −sol(ws, "K17", "=MEDIAN(K6:K16)", "#,##0"); sol(ws, "L17", "=MEDIAN(L6:L16)", '#,##0" $/m²"'); sol(ws, "M17", "=MEDIAN(M6:M16)", "#,##0"); sol(ws, "N17", "=MEDIAN(N6:N16)", "0.000")
145 −sol(ws, "K21", "=K20/K17-1", "0.0%"); sol(ws, "K23", "=K20/K22-1", "0.0%")
146 −sol(ws, "K24", f'=IF(Bordereau!C39<{pr("altus_lo")},"sous la fourchette",IF(Bordereau!C39>{pr("altus_hi")},"au-dessus de la fourchette","dans la fourchette Altus 2026"))')
147 −sol(ws, "K25", "=(K17-Bordereau!C36)/Bordereau!C36", "0.0%")
148 −for rr in (29, 30):
149 − sol(ws, f"F{rr}", f"=D{rr}-E{rr}*{pr('ratio')}", "#,##0"); sol(ws, f"G{rr}", f"=F{rr}/4", "#,##0")
150 −txt(ws, "C33",
151 − "MARCHÉ : les 11 ventes réelles (2024-2025) de quadruplex neufs se concluent entre 849 411 $ et 1 300 000 $ (médiane 1 165 000 $) ; une fois le terrain retiré (rôle terrain × 1,257), la valeur "
152 − "implicite médiane du bâtiment est de 879 896 $ (K17), soit 219 974 $ par logement (M17) et 4 300 $/m² d'aire d'étages (L17). Le bordereau (759 115 $, K20) est 13,7 % SOUS cette valeur (K21) "
153 − "et 8,3 % sous le moteur de coût d'UQO Éval (827 445 $, K23) ; à 177 $/pi² hors sol il est juste sous la borne Altus de 180 $ (K24) mais à 200 $/pi² chauffé il est dedans. "
154 − "PROFIT EXTRAIT : (879 896 − 683 887) ÷ 683 887 = 28,7 % (K25), bien au-dessus de la convention de 11 % — le marché 2025 paie les quadruplex neufs plus cher que leur coût de création, "
155 − "ce qui attire les promoteurs (séance 8 : extraction du profit). PRUDENCE : (1) les comparables ont deux logements au rez-de-jardin (sous-sol fini) et parfois trois étages, donc plus de "
156 − "finition que notre sous-sol non fini ; (2) la qualité (24, Sacré-Cœur : 3 étages, Hull) et l'année varient ; (3) le terrain indexé par le ratio des terrains vacants (1,257) est une "
157 − "approximation — un ratio de 1,10 relèverait la valeur implicite du bâtiment ; (4) les ratios prix ÷ rôle de 0,94 à 1,47 (N6:N16) montrent la dispersion ; (5) Q11 (849 411 $ en 2024) "
158 − "est une vente de livraison atypique qui tire la médiane vers le bas ; (6) les annonces A1-A2 (≈ 256 500 $/logement, F29:G30) sont des prix DEMANDÉS de bâtiments de 2020, pas des ventes. "
159 − "POUR LE PROMOTEUR : le projet est viable — coût de création ≈ 759 000 $ + terrain contre une valeur de marché ≈ 880 000 $ + terrain ; la marge réelle dépendra des soumissions, "
160 − "de la durée du chantier (intercalaires) et du niveau de finition retenu.")
141 +sol(ws, f"K{R_MED}", f"=MEDIAN(K{R_V0}:K{R_V1})", "#,##0"); sol(ws, f"L{R_MED}", f"=MEDIAN(L{R_V0}:L{R_V1})", '#,##0" $/m²"')
142 +sol(ws, f"M{R_MED}", f"=MEDIAN(M{R_V0}:M{R_V1})", "#,##0"); sol(ws, f"N{R_MED}", f"=MEDIAN(N{R_V0}:N{R_V1})", "0.000")
143 +sol(ws, f"K{R_K['ecart_marche']}", f"=K{R_K['total']}/K{R_MED}-1", "0.0%"); sol(ws, f"K{R_K['ecart_moteur']}", f"=K{R_K['total']}/K{R_K['moteur']}-1", "0.0%")
144 +sol(ws, f"K{R_K['altus']}", f'=IF(Bordereau!C39<{pr("altus_lo")},"sous la fourchette",IF(Bordereau!C39>{pr("altus_hi")},"au-dessus de la fourchette","dans la fourchette Altus 2026"))')
145 +sol(ws, f"K{R_K['profit_extrait']}", f"=(K{R_MED}-Bordereau!C36)/Bordereau!C36", "0.0%")
146 +txt(ws, f"C{R_LECT}",
147 + "MARCHÉ : les 8 ventes réelles (2024-2025) de quadruplex neufs de 2 étages se concluent entre 849 411 $ et 1 205 276 $ (médiane 1 142 500 $) ; une fois le terrain retiré (rôle terrain × 1,257), "
148 + f"la valeur implicite médiane du bâtiment est de 866 833 $ (K{R_MED}), soit 216 708 $ par logement (M{R_MED}) et 4 389 $/m² d'aire d'étages (L{R_MED}). Le bordereau (759 152 $, K{R_K['total']}) est 12,4 % SOUS cette "
149 + f"valeur (K{R_K['ecart_marche']}) et 8,3 % sous le moteur de coût d'UQO Éval (827 445 $, K{R_K['ecart_moteur']}) ; à 177 $/pi² hors sol il est juste sous la borne Altus de 180 $ (K{R_K['altus']}) mais à 200 $/pi² chauffé il est dedans. "
150 + f"PROFIT EXTRAIT : (866 833 − 683 920) ÷ 683 920 = 26,7 % (K{R_K['profit_extrait']}), bien au-dessus de la convention de 11 % — le marché 2025 paie les quadruplex neufs plus cher que leur coût de création, "
151 + "ce qui attire les promoteurs (séance 8 : extraction du profit). PRUDENCE : (1) les comparables ont deux logements au rez-de-jardin (sous-sol fini), donc plus de finition que notre sous-sol "
152 + "non fini ; (2) la qualité et l'année varient ; (3) le terrain indexé par le ratio des terrains vacants (1,257) est une approximation — un ratio de 1,10 relèverait la valeur implicite du "
153 + f"bâtiment ; (4) les ratios prix ÷ rôle de 0,94 à 1,47 (N{R_V0}:N{R_V1}) montrent la dispersion ; (5) Q8 (849 411 $ en 2024) est une vente de livraison atypique qui tire la médiane vers le bas ; "
154 + "(6) les annonces A1-A2 du tableau 9 (≈ 1,3 M$ demandés pour des quadruplex de 2020 à 3 étages) sont des prix DEMANDÉS, pas des ventes. POUR LE PROMOTEUR : le projet est viable — coût de "
155 + "création ≈ 759 000 $ + terrain contre une valeur de marché ≈ 867 000 $ + terrain ; la marge réelle dépendra des soumissions, de la durée du chantier (intercalaires) et du niveau de finition.")
161 156
162 157 # ---------------- DASHBOARD ----------------
163 158 ws = wb["Dashboard"]
164 159 sol(ws, "D6", '=IFERROR(Bordereau!C32,"—")', '#,##0" $"'); sol(ws, "E6", '=IFERROR(Bordereau!C37,"—")', '#,##0" $"')
165 −sol(ws, "F6", '=IFERROR(Bordereau!C39,"—")', '0.00" $/pi²"'); sol(ws, "G6", '=IFERROR(Marché!K21,"—")', "0.0%")
160 +sol(ws, "F6", '=IFERROR(Bordereau!C39,"—")', '0.00" $/pi²"'); sol(ws, "G6", f'=IFERROR(Marché!K{R_K["ecart_marche"]},"—")', "0.0%")
166 161 for col in "DEFG":
167 162 ws[f"{col}6"].font = Font(name="Calibri", size=20, bold=True, color="1E4620"); ws[f"{col}7"].fill = FILL_SOL
168 163 sol(ws, "C8", "Coût sous la valeur de marché — projet viable (marge > 11 %)")
169 164 ws["C8"].font = Font(name="Calibri", size=14, bold=True, color="1E4620"); ws["C8"].alignment = Alignment(horizontal="center", vertical="center")
170 −ws["B27"].value = "Graphique 3 (solution) : matériaux / main-d'œuvre / équipement du direct nu (Relevé!E98:E100)"
165 +ws["B27"].value = f"Graphique 3 (solution) : matériaux / main-d'œuvre / équipement du direct nu (Relevé!E{R_MAT}:E{R_MAT + 2})"
171 166 ws["B27"].font = Font(name="Calibri", size=11, bold=True, color="1E4620")
172 −for i, (lbl, f) in enumerate([("Matériaux", "=Relevé!E98"), ("Main-d'œuvre", "=Relevé!E99"), ("Équipement", "=Relevé!E100")]):
167 +for i, (lbl, f) in enumerate([("Matériaux", f"=Relevé!E{R_MAT}"), ("Main-d'œuvre", f"=Relevé!E{R_MAT + 1}"), ("Équipement", f"=Relevé!E{R_MAT + 2}")]):
173 168 a = ws.cell(row=28 + i, column=13, value=lbl); a.fill = FILL_SOL
174 169 b = ws.cell(row=28 + i, column=14, value=f); b.fill = FILL_SOL; b.number_format = "#,##0"
175 170 pie = PieChart(); pie.title = "Direct nu : matériaux, main-d'œuvre, équipement"; pie.height = 7; pie.width = 10
@@ -178,24 +173,24 @@ ws.add_chart(pie, "B28")
178 173
179 174 ws = wb["Note"]
180 175 NOTE = [
181 − "Le coût de remplacement neuf du quadruplex (18,6 × 10,7 m, 2 étages, 4 logements, sous-sol non fini) s'établit à 759 115 $ hors taxes (Bordereau!C38) : 588 245 $ de coûts directs au sens du "
182 − "cours (C13), 23 567 $ de contingences (C14), 72 075 $ d'indirects (C32, 12,3 % des directs) et 75 228 $ de profit entrepreneurial (C37, 11 %). Cela représente 177,18 $/pi² d'aire brute hors sol "
183 − "(4 284 pi², C39), 199,89 $/pi² d'aire chauffée (3 798 pi², C40) et 189 779 $ par logement (C41). Indirects + profit = 19,4 % du coût total.",
184 − "Trois postes pèsent 30 % du direct nu : le placage de brique (77 533 $, 16,5 %), les armoires et comptoirs des 4 cuisines (42 103 $) et les murs de fondation coffrés (23 260 $) "
185 − "(Relevé!C121:E123). Par division, l'enveloppe (07) domine avec 106 069 $ (22,5 %), devant les finitions (09, 16,7 %), les cuisines (11, 11,7 %) et le bois (06, 10,5 %) (Relevé!E105:F117). "
186 − "La main-d'œuvre ne représente que 27,4 % du direct nu (E101) : le bordereau est surtout sensible aux prix des matériaux (brique, armoires, fenêtres).",
187 − "Les intérêts intercalaires valent 20 649 $ pour 12 mois à 6,75 % (préférentiel 4,70 % + 2,05 %, Bordereau!C24). Un retard de 6 mois porte T à 18 mois : I = 611 812 × 6,75 % × 1,5 × ½ = 30 973 $, "
188 − "soit +10 324 $ (+50 % du poste). Répercuté dans l'assiette du profit (+11 %), le coût total passerait à ≈ 770 575 $ (+11 460 $, +1,5 %) : à provisionner et à couvrir par une clause de pénalité "
176 + "Le coût de remplacement neuf du quadruplex (18,6 × 10,7 m, 2 étages, 4 logements, sous-sol non fini) s'établit à 759 152 $ hors taxes (Bordereau!C38) : 588 275 $ de coûts directs au sens du "
177 + "cours (C13), 23 568 $ de contingences (C14), 72 078 $ d'indirects (C32, 12,3 % des directs) et 75 231 $ de profit entrepreneurial (C37, 11 %). Cela représente 177,19 $/pi² d'aire brute hors sol "
178 + "(4 284 pi², C39), 199,90 $/pi² d'aire chauffée (3 798 pi², C40) et 189 788 $ par logement (C41). Indirects + profit = 19,4 % du coût total.",
179 + f"Trois composantes pèsent 36 % du direct nu : le placage de brique (77 532 $, 16,5 %), les quatre cuisines (54 985 $) et les planchers finis (35 680 $) (Relevé!C{R_TOP}:E{R_TOP + 2}). "
180 + f"Par division, l'enveloppe et la toiture (07) dominent avec 107 365 $ (22,8 %), devant les finitions (09, 16,7 %), les cuisines (11, 11,7 %) et le béton (03, 10,3 %) (Relevé!E{R_D0}:F{R_D1}). "
181 + f"La main-d'œuvre ne représente que 27,4 % du direct nu (E{R_MAT + 3}) : le bordereau est surtout sensible aux prix des matériaux (brique, armoires, fenêtres).",
182 + "Les intérêts intercalaires valent 20 650 $ pour 12 mois à 6,75 % (préférentiel 4,70 % + 2,05 %, Bordereau!C24). Un retard de 6 mois porte T à 18 mois : I = 611 843 × 6,75 % × 1,5 × ½ = 30 975 $, "
183 + "soit +10 325 $ (+50 % du poste). Répercuté dans l'assiette du profit (+11 %), le coût total passerait à ≈ 770 612 $ (+11 460 $, +1,5 %) : à provisionner et à couvrir par une clause de pénalité "
189 184 "de retard dans le contrat de l'entrepreneur.",
190 − "Le marché confirme la viabilité : sur 11 ventes réelles de quadruplex neufs (2024-2025), la valeur implicite médiane du bâtiment est de 879 896 $ (Marché!K17), 219 974 $/logement, soit 13,7 % "
191 − "au-dessus du bordereau (K21) ; le moteur de coût d'UQO Éval donne 827 445 $ (fourchette 763 109 – 891 781 $, K22), 8,3 % au-dessus (K23). Le profit extrait du marché atteint 28,7 % (K25) "
192 − "contre 11 % de convention : la marge attendue est confortable, même si les comparables (logements au rez-de-jardin finis, trois étages pour certains) sont un peu plus finis que le projet.",
193 − "Conventions déclarées : profit entrepreneurial de 11 % sur (directs + contingences + indirects) — sur les directs seuls il serait de 64 707 $ (−10 521 $, Bordereau!C43) ; contingences de 5 % "
194 − "des directs nus ; honoraires de 4 % des directs ; intercalaires avec facteur ½ ; TPS et TVQ (113 677 $, C48:C49) exclues du coût de remplacement d'un immeuble locatif pour rester comparable "
185 + f"Le marché confirme la viabilité : sur 8 ventes réelles de quadruplex neufs de 2 étages (2024-2025), la valeur implicite médiane du bâtiment est de 866 833 $ (Marché!K{R_MED}), 216 708 $/logement, soit 12,4 % "
186 + f"au-dessus du bordereau (K{R_K['ecart_marche']}) ; le moteur de coût d'UQO Éval donne 827 445 $ (fourchette 763 109 – 891 781 $, K{R_K['moteur']}), 8,3 % au-dessus (K{R_K['ecart_moteur']}). Le profit extrait du marché atteint 26,7 % (K{R_K['profit_extrait']}) "
187 + "contre 11 % de convention : la marge attendue est confortable, même si les comparables (logements au rez-de-jardin finis) sont un peu plus finis que le projet.",
188 + "Conventions déclarées : profit entrepreneurial de 11 % sur (directs + contingences + indirects) — sur les directs seuls il serait de 64 710 $ (−10 521 $, Bordereau!C43) ; contingences de 5 % "
189 + "des directs nus ; honoraires de 4 % des directs ; intercalaires avec facteur ½ ; TPS et TVQ (113 683 $, C48:C49) exclues du coût de remplacement d'un immeuble locatif pour rester comparable "
195 190 "aux prix observés — elles restent un décaissement réel du promoteur, récupérable en partie (remboursement pour immeubles locatifs neufs).",
196 − "Limites : plan générique (gabarit du module Quantity Survey, pas les plans d'exécution) ; prix publiés RSMeans 2026 T4 localisés Gatineau, main-d'œuvre syndiquée — pas des soumissions ; "
197 − "55 mesures du relevé non vérifiées manuellement ; comparables aux logements de rez-de-jardin et terrain indexé par le ratio des terrains vacants (1,257) ; les annonces A1-A2 sont des prix "
198 − "demandés ; aucune provision pour l'aménagement extérieur (stationnements, paysagement) ni pour les balcons et escaliers extérieurs des logements de l'étage — à ajouter au devis définitif.",
191 + "Limites : plan générique (gabarit du module Quantity Survey, pas les plans d'exécution) ; prix composites dérivés de prix publiés RSMeans 2026 T4 localisés Gatineau, main-d'œuvre syndiquée — pas "
192 + "des soumissions ; comparables aux logements de rez-de-jardin et terrain indexé par le ratio des terrains vacants (1,257) ; les annonces A1-A2 sont des prix demandés ; aucune provision pour "
193 + "l'aménagement extérieur (stationnements, paysagement) ni pour les balcons et escaliers extérieurs des logements de l'étage — à ajouter au devis définitif.",
199 194 ]
200 195 r = 5
201 196 for t in NOTE:
modified IMM1033-20_Methodes_du_cout/05_Ressources/scripts_gabarits_excel/tp2_donnees.py +373 −0
Large diff (391 lines) is not loaded by default to keep the page fast.Load diff
modified IMM1033-20_Methodes_du_cout/05_Ressources/scripts_gabarits_excel/tp2_solutions.py +10 −20
Large diff (62 lines) is not loaded by default to keep the page fast.Load diff
modified IMM1033-20_Methodes_du_cout/05_Ressources/scripts_gabarits_excel/verif_attendus_tp2.py +18 −20
Large diff (43 lines) is not loaded by default to keep the page fast.Load diff
Menu

Theme