4.2 KiB
4.2 KiB
IPI Methodology Cross Verification (Updated)
Scope
Cross-verification between:
Annex V - IPI Calculation Methodology.pptx- Current implementation in
app/services/ipi_calculation_service.js - Runtime trigger/orchestration in
server.jsandapp/services/scheduler.service.js
Trigger Path Verification
Verified start path:
server.jsboots scheduler viascheduler.start().- Cron
0 2 * * *executesrunScheduledTask(). runScheduledTask()callsexecuteCalculateQuarter(year, quarter).executeCalculateQuarter()runsrunCompleteCalculation(year, month)for each month.- Manual endpoint
POST /api/admin/trigger-schedulertriggers same scheduler flow.
Status: MATCH
Overall Conclusion
Current code is largely aligned on formula chain, with two remaining methodology gaps:
- product-to-ISIC4 mapping source is still an approximation (derived from establishment submissions, not a fixed official mapping table),
- non-response imputation rules from PPT are not implemented in this service.
Verification Matrix (Current Code vs PPT)
1) Base-year average production
PPT (Slides 9-10):
- Base year average uses arithmetic mean of 12 months.
Implementation:
calculateBaseYearProduction()computes average across Jan-Dec and stores inbase_year_production.avg_by_production.
Status: MATCH
2) Item-level index formula
PPT (Slides 8-10):
Ri = CurrentProduction / BaseYearAverageIi = Ri * 100
Implementation:
calculateItemLevelIndices():production_relative = current_production / base_year_avg_productionitem_index = production_relative * 100
Status: MATCH
3) ISIC 4-digit aggregation
PPT (Slides 11-12):
- Laspeyres weighted aggregation:
ISIC4 = SUM(w_i * I_i) / SUM(w_i)
Implementation (current):
- Uses weighted formula with
products.weight_in_ib:total_weight = SUM(weight_in_ib)weighted_index_sum = SUM(weight_in_ib * item_index)isic_4digit_index = weighted_index_sum / total_weight
- Prevents row multiplication by selecting one ISIC4 per product in-period using ranked mapping.
Status: PARTIAL MATCH (Formula MATCH, Mapping APPROXIMATION)
Reason for partial:
- Formula is aligned.
- Mapping source is not a fixed product master/official bridge; it is inferred from establishment-level submissions.
4) ISIC 3-digit aggregation
PPT (Slide 13):
- Weighted roll-up from ISIC4.
Implementation:
ISIC3 = SUM(total_weight_4 * isic_4digit_index) / SUM(total_weight_4)
Status: MATCH (depends on ISIC4 inputs)
5) ISIC 2-digit aggregation
PPT (Slide 14):
- Weighted roll-up from ISIC3.
Implementation:
ISIC2 = SUM(total_weight_3 * isic_3digit_index) / SUM(total_weight_3)
Status: MATCH (depends on ISIC3 inputs)
6) Manufacturing IPI (headline)
PPT (Slide 15):
- Weighted roll-up from ISIC2.
Implementation:
ManufacturingIPI = SUM(total_weight_2 * isic_2digit_index) / SUM(total_weight_2)
Status: MATCH
Note:
- Current code includes defensive handling when no valid ISIC2 aggregates exist for a month.
7) Growth rates
PPT (Slide 16):
- YoY:
((Current - SameMonthLastYear) / SameMonthLastYear) * 100
Implementation:
- YoY formula matches.
- MoM is also computed additionally.
Status:
- YoY MATCH
- MoM Additional (not conflicting)
8) Missing/non-response data treatment
PPT (Slide 3):
- For missing data, estimate using:
- previous month repeat, or
- average of last 3 months, or
- same month previous year.
Implementation:
- This imputation logic is not implemented in the IPI service pipeline.
- Pipeline uses available approved records.
Status: MISMATCH
Final Assessment (Current Code)
If Annex V is interpreted strictly:
- Formula chain: mostly aligned now (item -> ISIC4 -> ISIC3 -> ISIC2 -> headline).
- Remaining non-compliance points: official deterministic item/product-to-ISIC mapping source and missing-data imputation policy.
Practical statement for stakeholders:
- Current implementation is operationally correct and mathematically aligned for weighted aggregation, but still requires data governance alignment (official mapping + imputation policy) for full Annex V compliance.