auto: sync 2026-06-02 17:27

This commit is contained in:
Capucine Gest
2026-06-02 17:27:32 +02:00
parent 8401b8f16d
commit 09f7d49052
4 changed files with 68 additions and 14 deletions
+14
View File
@@ -1086,6 +1086,20 @@ export async function GET(req: NextRequest) {
lastUpdated: yoyRef, lastUpdated: yoyRef,
...(yoyCons !== null ? { consensus: yoyCons } : {}), ...(yoyCons !== null ? { consensus: yoyCons } : {}),
}; };
// Flash vs Final : si un Final est attendu, calculer le delta Final_forecast Flash_actual
const finalForecastYoY = parseTeF(teCpiForecast?.cpiYoYFinal);
if (finalForecastYoY !== null && indicators.cpiYoY) {
const delta = parseFloat((finalForecastYoY - yoyValue).toFixed(2));
(indicators.cpiYoY as Record<string,unknown>)["_finalForecast"] = finalForecastYoY;
(indicators.cpiYoY as Record<string,unknown>)["_finalDelta"] = delta;
}
// Idem pour cpiCore
const finalForecastCore = parseTeF(teCpiForecast?.cpiCoreFinal);
if (finalForecastCore !== null && coreValue !== null && indicators.cpiCore) {
const delta = parseFloat((finalForecastCore - coreValue).toFixed(2));
(indicators.cpiCore as Record<string,unknown>)["_finalForecast"] = finalForecastCore;
(indicators.cpiCore as Record<string,unknown>)["_finalDelta"] = delta;
}
} }
// Core CPI MoM (pages individuelles, décimales précises) // Core CPI MoM (pages individuelles, décimales précises)
+37 -2
View File
@@ -414,8 +414,43 @@ export default function CurrencyCard({ currency, expectations, yields, sentiment
)} )}
{(inflFilter === "all" || inflFilter === "yoy") && ( {(inflFilter === "all" || inflFilter === "yoy") && (
<> <>
<Row label="Core CPI YoY" ind={inds?.cpiCore ?? null} unit="%" consensus={fc?.cpiCore ?? fc?.cpi ?? null} surpriseVsCons={fc?.cpiSurprise ?? null} /> <Row
<Row label="Inflation Rate YoY" ind={inds?.cpiYoY ?? null} unit="%" consensus={fc?.cpi ?? null} /> label="Core CPI YoY"
ind={inds?.cpiCore ?? null}
unit="%"
consensus={fc?.cpiCore ?? fc?.cpi ?? null}
surpriseVsCons={fc?.cpiSurprise ?? null}
tooltip={(() => {
const fd = (inds?.cpiCore as (Ind & { _finalForecast?: number; _finalDelta?: number }) | null);
if (fd?._finalForecast === undefined) return null;
const d = fd._finalDelta ?? 0;
const arrow = d > 0 ? "↑" : d < 0 ? "↓" : "=";
return `Prel./Flash — Final prévu : ${fd._finalForecast?.toFixed(1)}% (${arrow}${d > 0 ? "+" : ""}${d.toFixed(2)})`;
})()}
info={(() => {
const fd = (inds?.cpiCore as (Ind & { _finalDelta?: number }) | null);
if (fd?._finalDelta === undefined) return null;
return fd._finalDelta > 0 ? "↑F" : fd._finalDelta < 0 ? "↓F" : "=F";
})()}
/>
<Row
label="Inflation Rate YoY"
ind={inds?.cpiYoY ?? null}
unit="%"
consensus={fc?.cpi ?? null}
tooltip={(() => {
const fd = (inds?.cpiYoY as (Ind & { _finalForecast?: number; _finalDelta?: number }) | null);
if (fd?._finalForecast === undefined) return null;
const d = fd._finalDelta ?? 0;
const arrow = d > 0 ? "↑" : d < 0 ? "↓" : "=";
return `Prel./Flash — Final prévu : ${fd._finalForecast?.toFixed(1)}% (${arrow}${d > 0 ? "+" : ""}${d.toFixed(2)})`;
})()}
info={(() => {
const fd = (inds?.cpiYoY as (Ind & { _finalDelta?: number }) | null);
if (fd?._finalDelta === undefined) return null;
return fd._finalDelta > 0 ? "↑F" : fd._finalDelta < 0 ? "↓F" : "=F";
})()}
/>
{inds?.commodityPricesYoY && ( {inds?.commodityPricesYoY && (
<Row label="Commodity Prices YoY" ind={inds.commodityPricesYoY} unit="%" info="AUD — RBA Commodity Price Index (TradingEconomics)" /> <Row label="Commodity Prices YoY" ind={inds.commodityPricesYoY} unit="%" info="AUD — RBA Commodity Price Index (TradingEconomics)" />
)} )}
+16 -11
View File
@@ -221,11 +221,13 @@ function parseCalendarHTML(html: string): TECalendarEvent[] {
// Utilisé par la macro route pour remplir forecasts.cpiCore / forecasts.cpiMoM. // Utilisé par la macro route pour remplir forecasts.cpiCore / forecasts.cpiMoM.
export interface TEInflationForecasts { export interface TEInflationForecasts {
cpiYoY: string | null; cpiYoY: string | null;
cpiCore: string | null; cpiYoYFinal: string | null; // "Final" event specifically (vs Flash/Prel)
cpiMoM: string | null; cpiCore: string | null;
cpiCoreMoM: string | null; cpiCoreFinal: string | null; // Core CPI YoY Final event
ppiMoM: string | null; cpiMoM: string | null;
cpiCoreMoM: string | null;
ppiMoM: string | null;
} }
export async function fetchTEInflationForecasts( export async function fetchTEInflationForecasts(
@@ -243,20 +245,23 @@ export async function fetchTEInflationForecasts(
const ccy = ev.currency; const ccy = ev.currency;
const title = ev.title.toLowerCase(); const title = ev.title.toLowerCase();
if (!result[ccy]) result[ccy] = { cpiYoY: null, cpiCore: null, cpiMoM: null, cpiCoreMoM: null, ppiMoM: null }; if (!result[ccy]) result[ccy] = { cpiYoY: null, cpiYoYFinal: null, cpiCore: null, cpiCoreFinal: null, cpiMoM: null, cpiCoreMoM: null, ppiMoM: null };
const r = result[ccy]!; const r = result[ccy]!;
const isFinal = /\bfinal\b/i.test(title);
// Order matters: Core MoM before generic MoM, Core YoY before generic YoY, PPI before CPI // Order matters: Core MoM before generic MoM, Core YoY before generic YoY, PPI before CPI
if (!r.ppiMoM && /ppi.*mom|producer.*price.*mom/i.test(title)) { if (!r.ppiMoM && /ppi.*mom|producer.*price.*mom/i.test(title)) {
r.ppiMoM = ev.forecast; r.ppiMoM = ev.forecast;
} else if (!r.cpiCoreMoM && /core.*mom|core.*inflation.*mom|core.*rate.*mom/i.test(title)) { } else if (!r.cpiCoreMoM && /core.*mom|core.*inflation.*mom|core.*rate.*mom/i.test(title)) {
r.cpiCoreMoM = ev.forecast; r.cpiCoreMoM = ev.forecast;
} else if (!r.cpiCore && /core.*inflation.*yoy|core.*cpi.*yoy|core.*rate.*yoy/i.test(title)) { } else if (/core.*inflation.*yoy|core.*cpi.*yoy|core.*rate.*yoy/i.test(title)) {
r.cpiCore = ev.forecast; if (isFinal && !r.cpiCoreFinal) r.cpiCoreFinal = ev.forecast;
if (!r.cpiCore) r.cpiCore = ev.forecast;
} else if (!r.cpiMoM && /^(?!.*core).*(?:inflation.*mom|cpi.*mom|rate.*mom)/i.test(title)) { } else if (!r.cpiMoM && /^(?!.*core).*(?:inflation.*mom|cpi.*mom|rate.*mom)/i.test(title)) {
r.cpiMoM = ev.forecast; r.cpiMoM = ev.forecast;
} else if (!r.cpiYoY && /^(?!.*core).*(?:inflation.*yoy|cpi.*yoy|inflation\s+rate.*yoy)/i.test(title)) { } else if (/^(?!.*core).*(?:inflation.*yoy|cpi.*yoy|inflation\s+rate.*yoy)/i.test(title)) {
r.cpiYoY = ev.forecast; if (isFinal && !r.cpiYoYFinal) r.cpiYoYFinal = ev.forecast;
if (!r.cpiYoY) r.cpiYoY = ev.forecast;
} }
} }
return result; return result;
+1 -1
View File
File diff suppressed because one or more lines are too long