148 lines
4.2 KiB
Markdown
148 lines
4.2 KiB
Markdown
# 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.js` and `app/services/scheduler.service.js`
|
|
|
|
## Trigger Path Verification
|
|
Verified start path:
|
|
- `server.js` boots scheduler via `scheduler.start()`.
|
|
- Cron `0 2 * * *` executes `runScheduledTask()`.
|
|
- `runScheduledTask()` calls `executeCalculateQuarter(year, quarter)`.
|
|
- `executeCalculateQuarter()` runs `runCompleteCalculation(year, month)` for each month.
|
|
- Manual endpoint `POST /api/admin/trigger-scheduler` triggers same scheduler flow.
|
|
|
|
Status: **MATCH**
|
|
|
|
---
|
|
|
|
## Overall Conclusion
|
|
Current code is **largely aligned on formula chain**, with **two remaining methodology gaps**:
|
|
1. product-to-ISIC4 mapping source is still an approximation (derived from establishment submissions, not a fixed official mapping table),
|
|
2. 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 in `base_year_production.avg_by_production`.
|
|
|
|
Status: **MATCH**
|
|
|
|
---
|
|
|
|
## 2) Item-level index formula
|
|
PPT (Slides 8-10):
|
|
- `Ri = CurrentProduction / BaseYearAverage`
|
|
- `Ii = Ri * 100`
|
|
|
|
Implementation:
|
|
- `calculateItemLevelIndices()`:
|
|
- `production_relative = current_production / base_year_avg_production`
|
|
- `item_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.
|
|
|