@dssp/dkpi 1.0.0-alpha.62 → 1.0.0-alpha.63
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-client/components/kpi-lookup-chart.js +41 -66
- package/dist-client/components/kpi-lookup-chart.js.map +1 -1
- package/dist-client/pages/kpi-dashboard/components/kpi-left-panel.js +10 -10
- package/dist-client/pages/kpi-dashboard/components/kpi-left-panel.js.map +1 -1
- package/dist-client/pages/kpi-dashboard/components/kpi-region-popup.js +10 -10
- package/dist-client/pages/kpi-dashboard/components/kpi-region-popup.js.map +1 -1
- package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.js +1 -1
- package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.js.map +1 -1
- package/dist-client/pages/sv-project-completed-list.js +9 -8
- package/dist-client/pages/sv-project-completed-list.js.map +1 -1
- package/dist-client/pages/sv-project-detail.js +14 -14
- package/dist-client/pages/sv-project-detail.js.map +1 -1
- package/dist-client/pages/sv-project-list.js +6 -6
- package/dist-client/pages/sv-project-list.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-client/viewparts/menu-tools.js +11 -12
- package/dist-client/viewparts/menu-tools.js.map +1 -1
- package/dist-server/scripts/propagate-parent-kpi-values.d.ts +4 -0
- package/dist-server/scripts/propagate-parent-kpi-values.js +369 -77
- package/dist-server/scripts/propagate-parent-kpi-values.js.map +1 -1
- package/dist-server/service/kpi-stat/kpi-stat-query.js +34 -32
- package/dist-server/service/kpi-stat/kpi-stat-query.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -3
- package/recalculate-batch.sh +64 -0
- package/recalculate-projects-range.sh +98 -0
- package/schema.graphql +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"propagate-parent-kpi-values.js","sourceRoot":"","sources":["../../server/scripts/propagate-parent-kpi-values.ts"],"names":[],"mappings":";;;AAoCA,4DA+QC;AA0GD,wDAkEC;AA7dD,qCAA0C;AA8B1C;;;GAGG;AACI,KAAK,UAAU,wBAAwB,CAC5C,eAAwB,EACxB,gBAAgB,GAAG,KAAK,EACxB,UAAmB,EACnB,QAAiB,EACjB,OAAgB;IAEhB,0BAA0B;IAC1B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,aAAa,CAAA;IACtC,CAAC;IAED,wCAAwC;IACxC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAA;IACjD,MAAM,SAAS,GAAG,OAAO,CAAC,6DAA6D,CAAC,CAAA;IACxF,MAAM,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;IAEhD,IAAI,UAAU,CAAA;IAEd,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAA;IAE1D,IAAI,CAAC;QACH,0DAA0D;QAC1D,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAA;QAC3C,UAAU,GAAG,MAAM,IAAA,0BAAgB,gDAC9B,SAAS,GACT,gBAAgB,KACnB,OAAO,EAAE,KAAK,IACd,CAAA;QAEF,oDAAoD;QACpD,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAA;QAC1D,aAAa,CAAC,SAAS,EAAE,UAAU,CAAC,CAAA;QAEpC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAA;QAEnC,8DAA8D;QAC9D,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAA;QAC1D,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAA;QAC9C,MAAM,aAAa,GAAG,aAAa,CAAC,GAAG,CAAC,CAAA;QAExC,2BAA2B;QAC3B,IAAI,kBAAkB,CAAA;QACtB,IAAI,CAAC;YACH,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAA;YACnD,kBAAkB,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAA;QAC9C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,6EAA6E,CAAC,CAAA;YAC5F,OAAM;QACR,CAAC;QAED,+CAA+C;QAC/C,IAAI,YAAY,CAAA;QAChB,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAA;YACnD,MAAM,gBAAgB,GAAG,aAAa,CAAC,MAAM,CAAC,CAAA;YAC9C,YAAY,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAA;YAC5E,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAA;gBAC1C,OAAM;YACR,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;YAC1D,OAAM;QACR,CAAC;QAED,oCAAoC;QACpC,IAAI,SAAS,GAAG,aAAa;aAC1B,kBAAkB,CAAC,KAAK,CAAC;aACzB,iBAAiB,CAAC,YAAY,EAAE,QAAQ,CAAC;aACzC,iBAAiB,CAAC,YAAY,EAAE,QAAQ,CAAC;aACzC,iBAAiB,CAAC,cAAc,EAAE,UAAU,CAAC;aAC7C,KAAK,CAAC,2BAA2B,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAA;QAE/D,IAAI,eAAe,EAAE,CAAC;YACpB,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC,kBAAkB,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAA;YAC7E,OAAO,CAAC,GAAG,CAAC,+BAA+B,eAAe,EAAE,CAAC,CAAA;QAC/D,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAA;QACpD,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,CAAA;QAEzC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAA;YAChC,OAAM;QACR,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,YAAY,OAAO,CAAC,MAAM,aAAa,CAAC,CAAA;QAEpD,mEAAmE;QACnE,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAErD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAA;YACvC,OAAM;QACR,CAAC;QAED,+EAA+E;QAC/E,MAAM,gBAAgB,GAAG,MAAM,eAAe,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;QAEnE,OAAO,CAAC,GAAG,CAAC,iBAAiB,gBAAgB,CAAC,MAAM,cAAc,CAAC,CAAA;QAEnE,IAAI,cAAc,GAAG,CAAC,CAAA;QACtB,IAAI,YAAY,GAAG,CAAC,CAAA;QACpB,IAAI,YAAY,GAAG,CAAC,CAAA;QACpB,IAAI,UAAU,GAAG,CAAC,CAAA;QAElB,4EAA4E;QAC5E,IAAI,qBAAqB,GAA2C,EAAE,CAAA;QACtE,IAAI,QAAQ,IAAI,UAAU,EAAE,CAAC;YAC3B,qBAAqB,GAAG,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAA;QACtE,CAAC;aAAM,IAAI,QAAQ,EAAE,CAAC;YACpB,mCAAmC;YACnC,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,KAAK,CAC1C;;;;;OAKD,EACC,CAAC,QAAQ,CAAC,CACX,CAAA;YACD,qBAAqB,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAA;QAC5F,CAAC;aAAM,CAAC;YACN,mDAAmD;YACnD,MAAM,YAAY,GAAG,MAAM,kBAAkB,CAAC,KAAK,CAAC;;;;;OAKnD,CAAC,CAAA;YACF,qBAAqB,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAA;QACpG,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,YAAY,qBAAqB,CAAC,MAAM,sCAAsC,CAAC,CAAA;QAE3F,yCAAyC;QACzC,KAAK,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,qBAAqB,EAAE,CAAC;YACvE,OAAO,CAAC,GAAG,CAAC,2BAA2B,YAAY,WAAW,SAAS,EAAE,CAAC,CAAA;YAE1E,6EAA6E;YAC7E,KAAK,MAAM,SAAS,IAAI,gBAAgB,EAAE,CAAC;gBACzC,IAAI,CAAC;oBACH,OAAO,CAAC,GAAG,CACT,gCAAgC,SAAS,CAAC,IAAI,WAAW,SAAS,CAAC,OAAO,IAAI,GAAG,cAAc,YAAY,WAAW,SAAS,EAAE,CAClI,CAAA;oBAED,iBAAiB;oBACjB,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,WAAC,OAAA,CAAA,MAAA,GAAG,CAAC,MAAM,0CAAE,EAAE,MAAK,SAAS,CAAC,EAAE,CAAA,EAAA,CAAC,CAAA;oBAExE,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBAC3B,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAA;wBACnD,SAAQ;oBACV,CAAC;oBAED,OAAO,CAAC,GAAG,CAAC,eAAe,SAAS,CAAC,MAAM,aAAa,CAAC,CAAA;oBAEzD,8DAA8D;oBAC9D,MAAM,WAAW,GAAG,MAAM,iBAAiB,CAAC,kBAAkB,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,CAAC,CAAA;oBAE5G,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBAC7B,OAAO,CAAC,GAAG,CAAC,6CAA6C,SAAS,cAAc,YAAY,YAAY,CAAC,CAAA;wBACzG,SAAQ;oBACV,CAAC;oBAED,OAAO,CAAC,GAAG,CAAC,0BAA0B,WAAW,CAAC,MAAM,IAAI,SAAS,CAAC,MAAM,aAAa,CAAC,CAAA;oBAE1F,6BAA6B;oBAC7B,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,wBAAwB,CAAC,WAAW,EAAE,SAAS,CAAC,CAAA;oBAEzF,OAAO,CAAC,GAAG,CAAC,2BAA2B,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;oBAErG,8DAA8D;oBAC9D,IAAI,kBAAkB,GAAG,kBAAkB;yBACxC,kBAAkB,CAAC,UAAU,CAAC;yBAC9B,iBAAiB,CAAC,cAAc,EAAE,KAAK,CAAC;yBACxC,iBAAiB,CAAC,iBAAiB,EAAE,QAAQ,CAAC;yBAC9C,KAAK,CAAC,iBAAiB,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC;yBACjD,QAAQ,CAAC,iCAAiC,EAAE,EAAE,SAAS,EAAE,CAAC;yBAC1D,QAAQ,CAAC,2BAA2B,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAA;oBAElE,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;wBAC1B,kBAAkB,GAAG,kBAAkB,CAAC,QAAQ,CAAC,6BAA6B,EAAE,EAAE,OAAO,EAAE,CAAC,CAAA;oBAC9F,CAAC;oBAED,wBAAwB;oBACxB,kBAAkB,GAAG,kBAAkB,CAAC,QAAQ,CAAC,8BAA8B,EAAE,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC,CAAA;oBAE9G,MAAM,aAAa,GAAG,MAAM,kBAAkB,CAAC,MAAM,EAAE,CAAA;oBAEvD,OAAO,CAAC,GAAG,CAAC,mCAAmC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAA;oBAEvF,IAAI,aAAa,EAAE,CAAC;wBAClB,wBAAwB;wBACxB,IAAI,gBAAgB,IAAI,aAAa,CAAC,KAAK,KAAK,aAAa,IAAI,aAAa,CAAC,KAAK,KAAK,aAAa,EAAE,CAAC;4BACvG,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAA;4BACpC,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAA;4BAEpC,aAAa,CAAC,KAAK,GAAG,aAAa,CAAA;4BACnC,aAAa,CAAC,KAAK,GAAG,aAAa,CAAA;4BACnC,aAAa,CAAC,QAAQ,GAAG,YAAY,CAAA,CAAC,6BAA6B;4BACnE,aAAa,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAA;4BAEpC,IAAI,CAAC;gCACH,MAAM,kBAAkB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;gCAC5C,YAAY,EAAE,CAAA;gCACd,OAAO,CAAC,GAAG,CACT,mBAAmB,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CACpI,CAAA;4BACH,CAAC;4BAAC,OAAO,SAAS,EAAE,CAAC;gCACnB,OAAO,CAAC,GAAG,CAAC,yBAAyB,SAAS,CAAC,OAAO,EAAE,CAAC,CAAA;gCACzD,UAAU,EAAE,CAAA;4BACd,CAAC;wBACH,CAAC;6BAAM,CAAC;4BACN,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAA;wBAC1C,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACN,oCAAoC;wBACpC,MAAM,WAAW,GAAQ;4BACvB,GAAG,EAAE,SAAS;4BACd,KAAK,EAAE,aAAa;4BACpB,KAAK,EAAE,aAAa;4BACpB,SAAS,EAAE,SAAS;4BACpB,OAAO,EAAE,OAAO,IAAI,SAAS,CAAC,OAAO,IAAI,CAAC;4BAC1C,KAAK,EAAE,YAAY;4BACnB,QAAQ,EAAE,YAAY,EAAE,6BAA6B;4BACrD,MAAM,EAAE,YAAY,EAAE,oBAAoB;4BAC1C,SAAS,EAAE,MAAM,EAAE,wBAAwB;4BAC3C,SAAS,EAAE,IAAI,IAAI,EAAE;4BACrB,SAAS,EAAE,IAAI,IAAI,EAAE;yBACtB,CAAA;wBAED,IAAI,CAAC;4BACH,MAAM,UAAU,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;4BAC7D,YAAY,EAAE,CAAA;4BACd,OAAO,CAAC,GAAG,CACT,yBAAyB,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,UAAU,CAAC,EAAE,EAAE,CAC5G,CAAA;wBACH,CAAC;wBAAC,OAAO,SAAS,EAAE,CAAC;4BACnB,OAAO,CAAC,GAAG,CAAC,uBAAuB,SAAS,CAAC,OAAO,EAAE,CAAC,CAAA;4BACvD,UAAU,EAAE,CAAA;wBACd,CAAC;oBACH,CAAC;oBAED,cAAc,EAAE,CAAA;gBAClB,CAAC;gBAAC,OAAO,QAAQ,EAAE,CAAC;oBAClB,OAAO,CAAC,GAAG,CAAC,6BAA6B,SAAS,CAAC,IAAI,KAAK,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAA;oBAC/E,UAAU,EAAE,CAAA;gBACd,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAA;QAC3D,OAAO,CAAC,GAAG,CAAC,gCAAgC,cAAc,EAAE,CAAC,CAAA;QAC7D,OAAO,CAAC,GAAG,CAAC,wBAAwB,YAAY,EAAE,CAAC,CAAA;QACnD,OAAO,CAAC,GAAG,CAAC,wBAAwB,YAAY,EAAE,CAAC,CAAA;QACnD,OAAO,CAAC,GAAG,CAAC,gBAAgB,UAAU,EAAE,CAAC,CAAA;QAEzC,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,uEAAuE,CAAC,CAAA;QACtF,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,oDAAoD,EAAE,KAAK,CAAC,CAAA;QAC1E,MAAM,KAAK,CAAA;IACb,CAAC;YAAS,CAAC;QACT,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,UAAU,CAAC,KAAK,EAAE,CAAA;YACxB,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAA;QAC9C,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,eAAe,CAAC,UAAuB,EAAE,OAAoB;IAC1E,yCAAyC;IACzC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAA;IAE3C,SAAS,cAAc,CAAC,GAAc;QACpC,IAAI,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YAC1B,OAAO,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAE,CAAA;QAC/B,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;YAChB,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;YACxB,OAAO,CAAC,CAAA;QACV,CAAC;QAED,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,WAAC,OAAA,CAAC,CAAC,EAAE,MAAK,MAAA,GAAG,CAAC,MAAM,0CAAE,EAAE,CAAA,CAAA,EAAA,CAAC,CAAA;QAC5D,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;YACxB,OAAO,CAAC,CAAA;QACV,CAAC;QAED,MAAM,KAAK,GAAG,cAAc,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;QAC3C,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;QAC5B,OAAO,KAAK,CAAA;IACd,CAAC;IAED,uCAAuC;IACvC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;QACvB,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,CAChC;QAAC,GAAW,CAAC,OAAO,GAAG,KAAK,CAAA;IAC/B,CAAC,CAAC,CAAA;IAEF,gCAAgC;IAChC,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAE,CAAS,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG,CAAE,CAAS,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,CAAA;AACzF,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,iBAAiB,CAC9B,kBAAuB,EACvB,SAAsB,EACtB,SAAiB,EACjB,OAAgB,EAChB,QAAiB;IAEjB,MAAM,WAAW,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IAEhD,IAAI,WAAW,GAAG,kBAAkB;SACjC,kBAAkB,CAAC,UAAU,CAAC;SAC9B,iBAAiB,CAAC,cAAc,EAAE,KAAK,CAAC;SACxC,KAAK,CAAC,wBAAwB,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;SACxD,QAAQ,CAAC,iCAAiC,EAAE,EAAE,SAAS,EAAE,CAAC;SAC1D,QAAQ,CAAC,4BAA4B,CAAC,CAAA;IAEzC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,WAAW,GAAG,WAAW,CAAC,QAAQ,CAAC,6BAA6B,EAAE,EAAE,OAAO,EAAE,CAAC,CAAA;IAChF,CAAC;IAED,wBAAwB;IACxB,IAAI,QAAQ,EAAE,CAAC;QACb,WAAW,GAAG,WAAW,CAAC,QAAQ,CAAC,8BAA8B,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAA;IAC9F,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE,CAAA;IAE1C,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;GAEG;AACH,SAAS,wBAAwB,CAC/B,WAA6B,EAC7B,SAAsB;IAEtB,IAAI,kBAAkB,GAAG,CAAC,CAAA;IAC1B,IAAI,kBAAkB,GAAG,CAAC,CAAA;IAC1B,IAAI,WAAW,GAAG,CAAC,CAAA;IAEnB,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAC/D,MAAM,MAAM,GAAG,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,MAAM,KAAI,CAAC,CAAA;QAEpC,kBAAkB,IAAI,KAAK,CAAC,KAAK,GAAG,MAAM,CAAA;QAC1C,kBAAkB,IAAI,KAAK,CAAC,KAAK,GAAG,MAAM,CAAA;QAC1C,WAAW,IAAI,MAAM,CAAA;IACvB,CAAC;IAED,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,aAAa,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,CAAA;IAC/C,CAAC;IAED,OAAO;QACL,aAAa,EAAE,kBAAkB,GAAG,WAAW;QAC/C,aAAa,EAAE,kBAAkB,GAAG,WAAW;KAChD,CAAA;AACH,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,sBAAsB;IAC1C,0BAA0B;IAC1B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,aAAa,CAAA;IACtC,CAAC;IAED,wCAAwC;IACxC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAA;IACjD,MAAM,SAAS,GAAG,OAAO,CAAC,6DAA6D,CAAC,CAAA;IACxF,MAAM,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;IAEhD,IAAI,UAAU,CAAA;IAEd,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAA;QAC3C,UAAU,GAAG,MAAM,IAAA,0BAAgB,gDAC9B,SAAS,GACT,gBAAgB,KACnB,OAAO,EAAE,KAAK,IACd,CAAA;QAEF,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAA;QAC1D,aAAa,CAAC,SAAS,EAAE,UAAU,CAAC,CAAA;QAEpC,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAA;QAC1D,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAA;QAC9C,MAAM,aAAa,GAAG,aAAa,CAAC,GAAG,CAAC,CAAA;QAExC,8BAA8B;QAC9B,MAAM,IAAI,GAAG,MAAM,aAAa;aAC7B,kBAAkB,CAAC,KAAK,CAAC;aACzB,iBAAiB,CAAC,YAAY,EAAE,QAAQ,CAAC;aACzC,iBAAiB,CAAC,YAAY,EAAE,QAAQ,CAAC;aACzC,iBAAiB,CAAC,cAAc,EAAE,UAAU,CAAC;aAC7C,KAAK,CAAC,2BAA2B,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;aAC5D,OAAO,EAAE,CAAA;QAEZ,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAClD,MAAM,gBAAgB,GAAG,MAAM,eAAe,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;QAEhE,OAAO,CAAC,GAAG,CAAC,4BAA4B,gBAAgB,CAAC,MAAM,eAAe,CAAC,CAAA;QAE/E,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAA;YACvC,OAAM;QACR,CAAC;QAED,gBAAgB,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;YACtC,MAAM,KAAK,GAAI,GAAW,CAAC,OAAO,IAAI,CAAC,CAAA;YACvC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YACjC,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,WAAC,OAAA,CAAA,MAAA,CAAC,CAAC,MAAM,0CAAE,EAAE,MAAK,GAAG,CAAC,EAAE,CAAA,EAAA,CAAC,CAAC,MAAM,CAAA;YACnE,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,CAAC,CAAA;YAE9B,OAAO,CAAC,GAAG,CACT,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,MAAM,GAAG,GAAG,CAAC,IAAI,MAAM,KAAK,KAAK,UAAU,sBAAsB,MAAM,GAAG,CACxH,CAAA;QACH,CAAC,CAAC,CAAA;QAEF,OAAO,CAAC,GAAG,CAAC,gBAAgB,gBAAgB,CAAC,MAAM,cAAc,CAAC,CAAA;IACpE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAA;IACtD,CAAC;YAAS,CAAC;QACT,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,UAAU,CAAC,KAAK,EAAE,CAAA;QAC1B,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAElC,IAAI,CAAC;QACH,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;OAyBX,CAAC,CAAA;YACF,OAAM;QACR,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACnD,MAAM,sBAAsB,EAAE,CAAA;YAC9B,OAAM;QACR,CAAC;QAED,MAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;QACxE,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;QACxC,MAAM,UAAU,GAAG,SAAS,KAAK,CAAC,CAAC,IAAI,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QACpG,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;QACtC,MAAM,QAAQ,GAAG,QAAQ,KAAK,CAAC,CAAC,IAAI,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QAC/F,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;QAC9C,MAAM,OAAO,GAAG,YAAY,KAAK,CAAC,CAAC,IAAI,YAAY,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QACpH,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAC/B,GAAG,CAAC,EAAE,CACJ,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,UAAU,IAAI,GAAG,KAAK,QAAQ,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,GAAG,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC,CAC3H,CAAA;QAED,IAAI,eAAe,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,2CAA2C,eAAe,EAAE,CAAC,CAAA;YACzE,OAAO,CAAC,GAAG,CAAC,YAAY,gBAAgB,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,qBAAqB,EAAE,CAAC,CAAA;YAC7F,OAAO,CAAC,GAAG,CAAC,YAAY,UAAU,IAAI,OAAO,EAAE,CAAC,CAAA;YAChD,OAAO,CAAC,GAAG,CAAC,WAAW,QAAQ,IAAI,KAAK,EAAE,CAAC,CAAA;YAC3C,OAAO,CAAC,GAAG,CAAC,eAAe,OAAO,IAAI,QAAQ,EAAE,CAAC,CAAA;YACjD,MAAM,wBAAwB,CAAC,eAAe,EAAE,gBAAgB,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAA;QAClG,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAA;YACxD,OAAO,CAAC,GAAG,CAAC,YAAY,gBAAgB,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,qBAAqB,EAAE,CAAC,CAAA;YAC7F,OAAO,CAAC,GAAG,CAAC,YAAY,UAAU,IAAI,OAAO,EAAE,CAAC,CAAA;YAChD,OAAO,CAAC,GAAG,CAAC,WAAW,QAAQ,IAAI,KAAK,EAAE,CAAC,CAAA;YAC3C,OAAO,CAAC,GAAG,CAAC,eAAe,OAAO,IAAI,QAAQ,EAAE,CAAC,CAAA;YACjD,MAAM,wBAAwB,CAAC,SAAS,EAAE,gBAAgB,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAA;QAC5F,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;QACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC;AAED,yBAAyB;AACzB,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,KAAU,EAAE,EAAE;IAC9C,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,CAAA;IAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA;AAEF,yBAAyB;AACzB,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC5B,IAAI,EAAE,CAAA;AACR,CAAC","sourcesContent":["#!/usr/bin/env ts-node\n\nimport { createConnection } from 'typeorm'\nimport * as fs from 'fs'\nimport * as path from 'path'\n\ninterface KpiRecord {\n id: string\n name: string\n isLeaf: boolean\n weight: number\n version?: number\n parent?: {\n id: string\n name: string\n }\n children?: KpiRecord[]\n __level?: number // Added for hierarchy level tracking\n}\n\ninterface KpiValueRecord {\n id: string\n value: number\n score: number\n kpi: {\n id: string\n name: string\n }\n valueDate?: Date\n org?: any\n}\n\n/**\n * Propagate parent KPI values based on child KPI scores and weights\n * Processes hierarchy from leaf to root, calculating weighted averages\n */\nexport async function propagateParentKpiValues(\n specificKpiName?: string,\n forceRecalculate = false,\n targetDate?: string,\n orgScope?: string,\n version?: number\n): Promise<void> {\n // Set NODE_ENV if not set\n if (!process.env.NODE_ENV) {\n process.env.NODE_ENV = 'development'\n }\n\n // Initialize Things-Factory environment\n const { config } = require('@things-factory/env')\n const ormconfig = require('@things-factory/shell/dist-server/initializers/ormconfig.js')\n const connectionConfig = config.get('ormconfig')\n\n let connection\n\n console.log('🚀 Starting Parent KPI Value Propagation...')\n\n try {\n // Create database connection using Things-Factory pattern\n console.log('🔌 Connecting to database...')\n connection = await createConnection({\n ...ormconfig,\n ...connectionConfig,\n logging: false\n })\n\n // Register the connection with Things-Factory shell\n const { addDataSource } = require('@things-factory/shell')\n addDataSource('default', connection)\n\n console.log('✅ Database connected')\n\n // Now we can use getRepository with the registered connection\n const { getRepository } = require('@things-factory/shell')\n const { Kpi } = require('@things-factory/kpi')\n const kpiRepository = getRepository(Kpi)\n\n // Get KPI-Value repository\n let kpiValueRepository\n try {\n const { KpiValue } = require('@things-factory/kpi')\n kpiValueRepository = getRepository(KpiValue)\n } catch (error) {\n console.error('❌ KpiValue entity not found. Please ensure it exists in @things-factory/kpi')\n return\n }\n\n // Get Domain repository and find SYSTEM domain\n let systemDomain\n try {\n const { Domain } = require('@things-factory/shell')\n const domainRepository = getRepository(Domain)\n systemDomain = await domainRepository.findOne({ where: { name: 'SYSTEM' } })\n if (!systemDomain) {\n console.error('❌ SYSTEM domain not found')\n return\n }\n } catch (error) {\n console.error('❌ Domain entity not found:', error.message)\n return\n }\n\n // Get all KPIs with their hierarchy\n let kpisQuery = kpiRepository\n .createQueryBuilder('kpi')\n .leftJoinAndSelect('kpi.domain', 'domain')\n .leftJoinAndSelect('kpi.parent', 'parent')\n .leftJoinAndSelect('kpi.children', 'children')\n .where('domain.name = :domainName', { domainName: 'SYSTEM' })\n\n if (specificKpiName) {\n kpisQuery = kpisQuery.andWhere('kpi.name = :name', { name: specificKpiName })\n console.log(`🎯 Processing specific KPI: ${specificKpiName}`)\n } else {\n console.log('🎯 Processing all KPIs in hierarchy')\n }\n\n const allKpis = await kpisQuery.getMany()\n\n if (allKpis.length === 0) {\n console.log('⚠️ No KPIs found')\n return\n }\n\n console.log(`📊 Found ${allKpis.length} KPIs total`)\n\n // Get parent KPIs (non-leaf KPIs) ordered by level (deepest first)\n const parentKpis = allKpis.filter(kpi => !kpi.isLeaf)\n\n if (parentKpis.length === 0) {\n console.log('⚠️ No parent KPIs found')\n return\n }\n\n // Sort parent KPIs by hierarchy level (deepest first for bottom-up processing)\n const sortedParentKpis = await sortKpisByLevel(parentKpis, allKpis)\n\n console.log(`🔄 Processing ${sortedParentKpis.length} parent KPIs`)\n\n let totalProcessed = 0\n let totalCreated = 0\n let totalUpdated = 0\n let errorCount = 0\n\n // Get all distinct (group, valueDate) combinations from existing KPI values\n let groupDateCombinations: { group: string; valueDate: string }[] = []\n if (orgScope && targetDate) {\n groupDateCombinations = [{ group: orgScope, valueDate: targetDate }]\n } else if (orgScope) {\n // Get all dates for specific group\n const dates = await kpiValueRepository.query(\n `\n SELECT DISTINCT \"value_date\" \n FROM kpi_values \n WHERE \"group\" = $1 AND \"group\" IS NOT NULL\n ORDER BY \"value_date\"\n `,\n [orgScope]\n )\n groupDateCombinations = dates.map(row => ({ group: orgScope, valueDate: row.value_date }))\n } else {\n // Get all distinct (group, valueDate) combinations\n const combinations = await kpiValueRepository.query(`\n SELECT DISTINCT \"group\", \"value_date\" \n FROM kpi_values \n WHERE \"group\" IS NOT NULL AND \"group\" != ''\n ORDER BY \"group\", \"value_date\"\n `)\n groupDateCombinations = combinations.map(row => ({ group: row.group, valueDate: row.value_date }))\n }\n\n console.log(`📍 Found ${groupDateCombinations.length} distinct (group, date) combinations`)\n\n // Process each (group, date) combination\n for (const { group: currentGroup, valueDate } of groupDateCombinations) {\n console.log(`\\\\n🏢 Processing Group: ${currentGroup}, Date: ${valueDate}`)\n\n // Process each parent KPI from deepest to shallowest for this group and date\n for (const parentKpi of sortedParentKpis) {\n try {\n console.log(\n `\\\\n📄 Processing Parent KPI: ${parentKpi.name} (Level ${parentKpi.__level || '?'}) - Group: ${currentGroup}, Date: ${valueDate}`\n )\n\n // Get child KPIs\n const childKpis = allKpis.filter(kpi => kpi.parent?.id === parentKpi.id)\n\n if (childKpis.length === 0) {\n console.log(` ⚠️ No child KPIs found, skipping`)\n continue\n }\n\n console.log(` 👶 Found ${childKpis.length} child KPIs`)\n\n // Get child KPI values/scores for the specific group and date\n const childValues = await getChildKpiValues(kpiValueRepository, childKpis, valueDate, version, currentGroup)\n\n if (childValues.length === 0) {\n console.log(` ⚠️ No child KPI values found for date ${valueDate} and group ${currentGroup}, skipping`)\n continue\n }\n\n console.log(` 📊 Found values for ${childValues.length}/${childKpis.length} child KPIs`)\n\n // Calculate weighted average\n const { weightedValue, weightedScore } = calculateWeightedAverage(childValues, childKpis)\n\n console.log(` 🧮 Calculated: value=${weightedValue.toFixed(4)}, score=${weightedScore.toFixed(4)}`)\n\n // Check if parent KPI value already exists for this org scope\n let existingValueQuery = kpiValueRepository\n .createQueryBuilder('kpiValue')\n .leftJoinAndSelect('kpiValue.kpi', 'kpi')\n .leftJoinAndSelect('kpiValue.domain', 'domain')\n .where('kpi.id = :kpiId', { kpiId: parentKpi.id })\n .andWhere('kpiValue.valueDate = :valueDate', { valueDate })\n .andWhere('domain.name = :domainName', { domainName: 'SYSTEM' })\n\n if (version !== undefined) {\n existingValueQuery = existingValueQuery.andWhere('kpiValue.version = :version', { version })\n }\n\n // Filter by group scope\n existingValueQuery = existingValueQuery.andWhere('kpiValue.group = :groupScope', { groupScope: currentGroup })\n\n const existingValue = await existingValueQuery.getOne()\n\n console.log(` 🔍 Checking existing record: ${existingValue ? 'FOUND' : 'NOT FOUND'}`)\n\n if (existingValue) {\n // Update existing value\n if (forceRecalculate || existingValue.value !== weightedValue || existingValue.score !== weightedScore) {\n const oldValue = existingValue.value\n const oldScore = existingValue.score\n\n existingValue.value = weightedValue\n existingValue.score = weightedScore\n existingValue.kpiScope = currentGroup // Set kpiScope same as group\n existingValue.updatedAt = new Date()\n\n try {\n await kpiValueRepository.save(existingValue)\n totalUpdated++\n console.log(\n ` ✅ Updated: ${oldValue.toFixed(4)} → ${weightedValue.toFixed(4)}, score: ${oldScore.toFixed(4)} → ${weightedScore.toFixed(4)}`\n )\n } catch (saveError) {\n console.log(` ❌ Update failed: ${saveError.message}`)\n errorCount++\n }\n } else {\n console.log(` ⏭️ No change needed`)\n }\n } else {\n // Create new value with group scope\n const newKpiValue: any = {\n kpi: parentKpi,\n value: weightedValue,\n score: weightedScore,\n valueDate: valueDate,\n version: version || parentKpi.version || 1,\n group: currentGroup,\n kpiScope: currentGroup, // Set kpiScope same as group\n domain: systemDomain, // Set domain entity\n inputType: 'AUTO', // Set inputType to AUTO\n createdAt: new Date(),\n updatedAt: new Date()\n }\n\n try {\n const savedValue = await kpiValueRepository.save(newKpiValue)\n totalCreated++\n console.log(\n ` ✨ Created: value=${weightedValue.toFixed(4)}, score=${weightedScore.toFixed(4)}, id=${savedValue.id}`\n )\n } catch (saveError) {\n console.log(` ❌ Save failed: ${saveError.message}`)\n errorCount++\n }\n }\n\n totalProcessed++\n } catch (kpiError) {\n console.log(` ❌ Error processing KPI ${parentKpi.name}: ${kpiError.message}`)\n errorCount++\n }\n }\n }\n\n console.log(`\\\\n🎉 Parent KPI Value Propagation Complete!`)\n console.log(` 📊 Parent KPIs processed: ${totalProcessed}`)\n console.log(` ✨ Values created: ${totalCreated}`)\n console.log(` ✅ Values updated: ${totalUpdated}`)\n console.log(` ❌ Errors: ${errorCount}`)\n\n if (errorCount > 0) {\n console.log(`\\\\n⚠️ Some parent KPIs had errors. Check the logs above for details.`)\n }\n } catch (error) {\n console.error(`❌ Fatal error during parent KPI value propagation:`, error)\n throw error\n } finally {\n if (connection) {\n await connection.close()\n console.log('🔌 Database connection closed')\n }\n }\n}\n\n/**\n * Sort KPIs by hierarchy level (deepest first for bottom-up processing)\n */\nasync function sortKpisByLevel(parentKpis: KpiRecord[], allKpis: KpiRecord[]): Promise<KpiRecord[]> {\n // Calculate hierarchy level for each KPI\n const kpiLevels = new Map<string, number>()\n\n function calculateLevel(kpi: KpiRecord): number {\n if (kpiLevels.has(kpi.id)) {\n return kpiLevels.get(kpi.id)!\n }\n\n if (!kpi.parent) {\n kpiLevels.set(kpi.id, 0)\n return 0\n }\n\n const parentKpi = allKpis.find(k => k.id === kpi.parent?.id)\n if (!parentKpi) {\n kpiLevels.set(kpi.id, 1)\n return 1\n }\n\n const level = calculateLevel(parentKpi) + 1\n kpiLevels.set(kpi.id, level)\n return level\n }\n\n // Calculate levels for all parent KPIs\n parentKpis.forEach(kpi => {\n const level = calculateLevel(kpi)\n ;(kpi as any).__level = level\n })\n\n // Sort by level (deepest first)\n return parentKpis.sort((a, b) => ((b as any).__level || 0) - ((a as any).__level || 0))\n}\n\n/**\n * Get child KPI values for a specific date\n */\nasync function getChildKpiValues(\n kpiValueRepository: any,\n childKpis: KpiRecord[],\n valueDate: string,\n version?: number,\n orgScope?: string\n): Promise<KpiValueRecord[]> {\n const childKpiIds = childKpis.map(kpi => kpi.id)\n\n let valuesQuery = kpiValueRepository\n .createQueryBuilder('kpiValue')\n .leftJoinAndSelect('kpiValue.kpi', 'kpi')\n .where('kpi.id IN (:...kpiIds)', { kpiIds: childKpiIds })\n .andWhere('kpiValue.valueDate = :valueDate', { valueDate })\n .andWhere('kpiValue.score IS NOT NULL')\n\n if (version !== undefined) {\n valuesQuery = valuesQuery.andWhere('kpiValue.version = :version', { version })\n }\n\n // Filter by group scope\n if (orgScope) {\n valuesQuery = valuesQuery.andWhere('kpiValue.group = :groupScope', { groupScope: orgScope })\n }\n\n const values = await valuesQuery.getMany()\n\n return values\n}\n\n/**\n * Calculate weighted average from child KPI values\n */\nfunction calculateWeightedAverage(\n childValues: KpiValueRecord[],\n childKpis: KpiRecord[]\n): { weightedValue: number; weightedScore: number } {\n let totalWeightedValue = 0\n let totalWeightedScore = 0\n let totalWeight = 0\n\n for (const value of childValues) {\n const childKpi = childKpis.find(kpi => kpi.id === value.kpi.id)\n const weight = childKpi?.weight || 1\n\n totalWeightedValue += value.score * weight\n totalWeightedScore += value.score * weight\n totalWeight += weight\n }\n\n if (totalWeight === 0) {\n return { weightedValue: 0, weightedScore: 0 }\n }\n\n return {\n weightedValue: totalWeightedValue / totalWeight,\n weightedScore: totalWeightedScore / totalWeight\n }\n}\n\n/**\n * List parent KPIs and their hierarchy\n */\nexport async function listParentKpiHierarchy(): Promise<void> {\n // Set NODE_ENV if not set\n if (!process.env.NODE_ENV) {\n process.env.NODE_ENV = 'development'\n }\n\n // Initialize Things-Factory environment\n const { config } = require('@things-factory/env')\n const ormconfig = require('@things-factory/shell/dist-server/initializers/ormconfig.js')\n const connectionConfig = config.get('ormconfig')\n\n let connection\n\n try {\n console.log('🔌 Connecting to database...')\n connection = await createConnection({\n ...ormconfig,\n ...connectionConfig,\n logging: false\n })\n\n const { addDataSource } = require('@things-factory/shell')\n addDataSource('default', connection)\n\n const { getRepository } = require('@things-factory/shell')\n const { Kpi } = require('@things-factory/kpi')\n const kpiRepository = getRepository(Kpi)\n\n // Get all KPIs with hierarchy\n const kpis = await kpiRepository\n .createQueryBuilder('kpi')\n .leftJoinAndSelect('kpi.domain', 'domain')\n .leftJoinAndSelect('kpi.parent', 'parent')\n .leftJoinAndSelect('kpi.children', 'children')\n .where('domain.name = :domainName', { domainName: 'SYSTEM' })\n .getMany()\n\n const parentKpis = kpis.filter(kpi => !kpi.isLeaf)\n const sortedParentKpis = await sortKpisByLevel(parentKpis, kpis)\n\n console.log(`📁 Parent KPI Hierarchy (${sortedParentKpis.length} parents):\\\\n`)\n\n if (sortedParentKpis.length === 0) {\n console.log(' No parent KPIs found.')\n return\n }\n\n sortedParentKpis.forEach((kpi, index) => {\n const level = (kpi as any).__level || 0\n const indent = ' '.repeat(level)\n const childCount = kpis.filter(k => k.parent?.id === kpi.id).length\n const weight = kpi.weight || 1\n\n console.log(\n ` ${(index + 1).toString().padStart(2)}: ${indent}${kpi.name} (L${level}, ${childCount} children, weight: ${weight})`\n )\n })\n\n console.log(`\\\\n📈 Total: ${sortedParentKpis.length} parent KPIs`)\n } catch (error) {\n console.error('❌ Error listing parent KPIs:', error)\n } finally {\n if (connection) {\n await connection.close()\n }\n }\n}\n\n/**\n * CLI execution when called directly\n */\nasync function main() {\n const args = process.argv.slice(2)\n\n try {\n if (args.includes('--help') || args.includes('-h')) {\n console.log(`\n🎯 Parent KPI Value Propagator\n\nUsage:\n ts-node server/scripts/propagate-parent-kpi-values.ts [options] [kpiName]\n\nOptions:\n --list, -l List parent KPIs and their hierarchy\n --force, -f Force recalculate all values (not just missing ones)\n --date YYYY-MM-DD Target date for value calculation (default: today)\n --org orgScope Organization scope filter (default: all orgs)\n --version N KPI version filter (default: latest version)\n --help, -h Show this help\n\nExamples:\n ts-node server/scripts/propagate-parent-kpi-values.ts # Process all parent KPIs for today\n ts-node server/scripts/propagate-parent-kpi-values.ts --force # Recalculate ALL parent values\n ts-node server/scripts/propagate-parent-kpi-values.ts --date 2024-01-15 # Process for specific date\n ts-node server/scripts/propagate-parent-kpi-values.ts --org \"PROJECT-123\" # Process for specific org\n ts-node server/scripts/propagate-parent-kpi-values.ts --version 2 # Process for specific version\n ts-node server/scripts/propagate-parent-kpi-values.ts \"상위 KPI명\" # Process specific parent KPI\n ts-node server/scripts/propagate-parent-kpi-values.ts --list # List parent KPI hierarchy\n\nNote: Processes parent KPIs from deepest level to root, calculating weighted averages.\n Child KPI scores and weights are used to calculate parent values.\n `)\n return\n }\n\n if (args.includes('--list') || args.includes('-l')) {\n await listParentKpiHierarchy()\n return\n }\n\n const forceRecalculate = args.includes('--force') || args.includes('-f')\n const dateIndex = args.indexOf('--date')\n const targetDate = dateIndex !== -1 && dateIndex + 1 < args.length ? args[dateIndex + 1] : undefined\n const orgIndex = args.indexOf('--org')\n const orgScope = orgIndex !== -1 && orgIndex + 1 < args.length ? args[orgIndex + 1] : undefined\n const versionIndex = args.indexOf('--version')\n const version = versionIndex !== -1 && versionIndex + 1 < args.length ? parseInt(args[versionIndex + 1]) : undefined\n const specificKpiName = args.find(\n arg =>\n !arg.startsWith('--') && arg !== targetDate && arg !== orgScope && (version === undefined || arg !== version.toString())\n )\n\n if (specificKpiName) {\n console.log(`🎯 Propagating values for specific KPI: ${specificKpiName}`)\n console.log(` Mode: ${forceRecalculate ? 'Force recalculate ALL' : 'Only missing values'}`)\n console.log(` Date: ${targetDate || 'today'}`)\n console.log(` Org: ${orgScope || 'all'}`)\n console.log(` Version: ${version || 'latest'}`)\n await propagateParentKpiValues(specificKpiName, forceRecalculate, targetDate, orgScope, version)\n } else {\n console.log(`🎯 Propagating values for all parent KPIs`)\n console.log(` Mode: ${forceRecalculate ? 'Force recalculate ALL' : 'Only missing values'}`)\n console.log(` Date: ${targetDate || 'today'}`)\n console.log(` Org: ${orgScope || 'all'}`)\n console.log(` Version: ${version || 'latest'}`)\n await propagateParentKpiValues(undefined, forceRecalculate, targetDate, orgScope, version)\n }\n\n console.log('\\\\n✨ Done!')\n } catch (error) {\n console.error('\\\\n❌ Script failed:', error.message)\n process.exit(1)\n }\n}\n\n// Handle uncaught errors\nprocess.on('unhandledRejection', (error: any) => {\n console.error('❌ Unhandled error:', error.message || error)\n process.exit(1)\n})\n\n// Run if called directly\nif (require.main === module) {\n main()\n}\n"]}
|
|
1
|
+
{"version":3,"file":"propagate-parent-kpi-values.js","sourceRoot":"","sources":["../../server/scripts/propagate-parent-kpi-values.ts"],"names":[],"mappings":";;;AAsCA,sEAoFC;AAyID,4DAkRC;AAgPD,wDAkEC;AAr0BD,qCAA0C;AAiC1C;;GAEG;AACI,KAAK,UAAU,6BAA6B,CACjD,SAAmB,EACnB,eAAwB,EACxB,gBAAgB,GAAG,KAAK,EACxB,UAAmB,EACnB,OAAgB;IAEhB,0BAA0B;IAC1B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,aAAa,CAAA;IACtC,CAAC;IAED,+CAA+C;IAC/C,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAA;IACjD,MAAM,SAAS,GAAG,OAAO,CAAC,6DAA6D,CAAC,CAAA;IACxF,MAAM,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;IAEhD,IAAI,UAAU,CAAA;IAEd,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAA;IAChE,OAAO,CAAC,GAAG,CAAC,iBAAiB,SAAS,CAAC,MAAM,gBAAgB,CAAC,CAAA;IAE9D,IAAI,CAAC;QACH,iEAAiE;QACjE,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAA;QAC3C,UAAU,GAAG,MAAM,IAAA,0BAAgB,gDAC9B,SAAS,GACT,gBAAgB,KACnB,OAAO,EAAE,KAAK,IACd,CAAA;QAEF,oDAAoD;QACpD,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAA;QAC1D,aAAa,CAAC,SAAS,EAAE,UAAU,CAAC,CAAA;QAEpC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAA;QAEnC,IAAI,cAAc,GAAG,CAAC,CAAA;QACtB,IAAI,YAAY,GAAG,CAAC,CAAA;QACpB,IAAI,WAAW,GAAG,CAAC,CAAA;QACnB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAE5B,4BAA4B;QAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1C,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;YACpC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,MAAM,wBAAwB,QAAQ,EAAE,CAAC,CAAA;YAE9E,IAAI,CAAC;gBACH,gDAAgD;gBAChD,MAAM,MAAM,GAAG,MAAM,gBAAgB,CACnC,UAAU,EACV,QAAQ,EACR,eAAe,EACf,gBAAgB,EAChB,UAAU,EACV,OAAO,CACR,CAAA;gBAED,cAAc,IAAI,MAAM,CAAC,SAAS,CAAA;gBAClC,YAAY,IAAI,MAAM,CAAC,OAAO,CAAA;gBAC9B,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,CAAC,OAAO,sBAAsB,CAAC,CAAA;YACpE,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,WAAW,EAAE,CAAA;gBACb,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;YAC9C,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAC1B,MAAM,QAAQ,GAAG,CAAC,CAAC,OAAO,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;QAE1D,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAA;QAC/C,OAAO,CAAC,GAAG,CAAC,kCAAkC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAA;QACjE,OAAO,CAAC,GAAG,CAAC,6BAA6B,YAAY,EAAE,CAAC,CAAA;QACxD,OAAO,CAAC,GAAG,CAAC,gBAAgB,WAAW,EAAE,CAAC,CAAA;QAC1C,OAAO,CAAC,GAAG,CAAC,oBAAoB,QAAQ,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAA;IACjH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,yCAAyC,EAAE,KAAK,CAAC,CAAA;QAC/D,MAAM,KAAK,CAAA;IACb,CAAC;YAAS,CAAC;QACT,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,UAAU,CAAC,KAAK,EAAE,CAAA;YACxB,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAA;QAC9C,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,gBAAgB,CAC7B,UAAe,EACf,QAAgB,EAChB,eAAwB,EACxB,gBAAgB,GAAG,KAAK,EACxB,UAAmB,EACnB,OAAgB;IAEhB,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAA;IAC1D,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAA;IACxD,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAA;IAEnD,MAAM,aAAa,GAAG,aAAa,CAAC,GAAG,CAAC,CAAA;IACxC,MAAM,kBAAkB,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAA;IAClD,MAAM,gBAAgB,GAAG,aAAa,CAAC,MAAM,CAAC,CAAA;IAE9C,MAAM,YAAY,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAA;IAClF,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAA;IAC5C,CAAC;IAED,oCAAoC;IACpC,IAAI,SAAS,GAAG,aAAa;SAC1B,kBAAkB,CAAC,KAAK,CAAC;SACzB,iBAAiB,CAAC,YAAY,EAAE,QAAQ,CAAC;SACzC,iBAAiB,CAAC,YAAY,EAAE,QAAQ,CAAC;SACzC,iBAAiB,CAAC,cAAc,EAAE,UAAU,CAAC;SAC7C,KAAK,CAAC,2BAA2B,EAAE,EAAE,QAAQ,EAAE,YAAY,CAAC,EAAE,EAAE,CAAC,CAAA;IAEpE,IAAI,eAAe,EAAE,CAAC;QACpB,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC,kBAAkB,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAA;IAC/E,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,CAAA;IACzC,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IAC5D,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IAEzD,OAAO,CAAC,GAAG,CAAC,eAAe,OAAO,CAAC,MAAM,WAAW,QAAQ,CAAC,MAAM,UAAU,UAAU,CAAC,MAAM,UAAU,CAAC,CAAA;IAEzG,iCAAiC;IACjC,MAAM,wBAAwB,CAAC,aAAa,EAAE,kBAAkB,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAA;IAEjG,uCAAuC;IACvC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,YAAY,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACzD,IAAI,WAAW,GAAG,kBAAkB;aACjC,kBAAkB,CAAC,UAAU,CAAC;aAC9B,MAAM,EAAE;aACR,KAAK,CAAC,wBAAwB,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;aACzD,QAAQ,CAAC,+DAA+D,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;aACnG,QAAQ,CAAC,qBAAqB,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAA;QAEhD,IAAI,UAAU,EAAE,CAAC;YACf,WAAW,GAAG,WAAW,CAAC,QAAQ,CAAC,0BAA0B,EAAE,EAAE,UAAU,EAAE,CAAC,CAAA;QAChF,CAAC;QAED,MAAM,WAAW,CAAC,OAAO,EAAE,CAAA;IAC7B,CAAC;IAED,2CAA2C;IAC3C,MAAM,gBAAgB,GAAG,MAAM,eAAe,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;IAEnE,IAAI,qBAAqB,GAA2C,EAAE,CAAA;IACtE,IAAI,UAAU,EAAE,CAAC;QACf,qBAAqB,GAAG,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAA;IACtE,CAAC;SAAM,CAAC;QACN,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,KAAK,CAC1C,+GAA+G,EAC/G,CAAC,QAAQ,CAAC,CACX,CAAA;QACD,qBAAqB,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAA;IACnG,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,4BAA4B,qBAAqB,CAAC,MAAM,EAAE,CAAC,CAAA;IAEvE,IAAI,YAAY,GAAG,CAAC,CAAA;IAEpB,6BAA6B;IAC7B,KAAK,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,qBAAqB,EAAE,CAAC;QACvE,OAAO,CAAC,GAAG,CAAC,0BAA0B,SAAS,EAAE,CAAC,CAAA;QAClD,KAAK,MAAM,SAAS,IAAI,gBAAgB,EAAE,CAAC;YACzC,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAQ,EAAE,EAAE,WAAC,OAAA,CAAA,MAAA,GAAG,CAAC,MAAM,0CAAE,EAAE,MAAK,SAAS,CAAC,EAAE,CAAA,EAAA,CAAC,CAAA;YAC/E,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAQ;YAEpC,MAAM,WAAW,GAAG,MAAM,iBAAiB,CAAC,kBAAkB,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,CAAC,CAAA;YAC5G,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAQ;YAEtC,IAAI,eAAuB,CAAA;YAC3B,IAAI,eAAuB,CAAA;YAE3B,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;gBACtB,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,MAAM,6BAA6B,CAAC,SAAS,EAAE,WAAW,EAAE,SAAS,CAAC,CAAA;oBACrF,eAAe,GAAG,MAAM,CAAC,KAAK,CAAA;oBAC9B,eAAe,GAAG,MAAM,CAAC,KAAK,CAAA;gBAChC,CAAC;gBAAC,OAAO,YAAY,EAAE,CAAC;oBACtB,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,wBAAwB,CAAC,WAAW,EAAE,SAAS,CAAC,CAAA;oBACzF,eAAe,GAAG,aAAa,CAAA;oBAC/B,eAAe,GAAG,aAAa,CAAA;gBACjC,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,wBAAwB,CAAC,WAAW,EAAE,SAAS,CAAC,CAAA;gBACzF,eAAe,GAAG,aAAa,CAAA;gBAC/B,eAAe,GAAG,aAAa,CAAA;YACjC,CAAC;YAED,MAAM,WAAW,GAAQ;gBACvB,GAAG,EAAE,SAAS;gBACd,KAAK,EAAE,eAAe;gBACtB,KAAK,EAAE,eAAe;gBACtB,SAAS,EAAE,SAAS;gBACpB,OAAO,EAAE,SAAS,CAAC,OAAO,IAAI,CAAC;gBAC/B,KAAK,EAAE,YAAY;gBACnB,QAAQ,EAAE,YAAY;gBACtB,MAAM,EAAE,YAAY;gBACpB,SAAS,EAAE,MAAM;gBACjB,SAAS,EAAE,IAAI,IAAI,EAAE;gBACrB,SAAS,EAAE,IAAI,IAAI,EAAE;aACtB,CAAA;YAED,MAAM,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;YAC1C,YAAY,EAAE,CAAA;QAChB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,gBAAgB,CAAC,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,CAAA;AACtE,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,wBAAwB,CAC5C,eAAwB,EACxB,gBAAgB,GAAG,KAAK,EACxB,UAAmB,EACnB,QAAiB,EACjB,OAAgB;IAEhB,0BAA0B;IAC1B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,aAAa,CAAA;IACtC,CAAC;IAED,wCAAwC;IACxC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAA;IACjD,MAAM,SAAS,GAAG,OAAO,CAAC,6DAA6D,CAAC,CAAA;IACxF,MAAM,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;IAEhD,IAAI,UAAU,CAAA;IAEd,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAA;IAE1D,IAAI,CAAC;QACH,0DAA0D;QAC1D,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAA;QAC3C,UAAU,GAAG,MAAM,IAAA,0BAAgB,gDAC9B,SAAS,GACT,gBAAgB,KACnB,OAAO,EAAE,KAAK,IACd,CAAA;QAEF,oDAAoD;QACpD,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAA;QAC1D,aAAa,CAAC,SAAS,EAAE,UAAU,CAAC,CAAA;QAEpC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAA;QAEnC,8DAA8D;QAC9D,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAA;QAC1D,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAA;QAC9C,MAAM,aAAa,GAAG,aAAa,CAAC,GAAG,CAAC,CAAA;QAExC,2BAA2B;QAC3B,IAAI,kBAAkB,CAAA;QACtB,IAAI,CAAC;YACH,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAA;YACnD,kBAAkB,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAA;QAC9C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,6EAA6E,CAAC,CAAA;YAC5F,OAAM;QACR,CAAC;QAED,+CAA+C;QAC/C,IAAI,YAAY,CAAA;QAChB,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAA;YACnD,MAAM,gBAAgB,GAAG,aAAa,CAAC,MAAM,CAAC,CAAA;YAC9C,YAAY,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAA;YAC5E,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAA;gBAC1C,OAAM;YACR,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;YAC1D,OAAM;QACR,CAAC;QAED,oCAAoC;QACpC,IAAI,SAAS,GAAG,aAAa;aAC1B,kBAAkB,CAAC,KAAK,CAAC;aACzB,iBAAiB,CAAC,YAAY,EAAE,QAAQ,CAAC;aACzC,iBAAiB,CAAC,YAAY,EAAE,QAAQ,CAAC;aACzC,iBAAiB,CAAC,cAAc,EAAE,UAAU,CAAC;aAC7C,KAAK,CAAC,2BAA2B,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAA;QAE/D,IAAI,eAAe,EAAE,CAAC;YACpB,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC,kBAAkB,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAA;YAC7E,OAAO,CAAC,GAAG,CAAC,+BAA+B,eAAe,EAAE,CAAC,CAAA;QAC/D,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAA;QACpD,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,CAAA;QAEzC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAA;YAChC,OAAM;QACR,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,YAAY,OAAO,CAAC,MAAM,aAAa,CAAC,CAAA;QAEpD,mEAAmE;QACnE,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAErD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAA;YACvC,OAAM;QACR,CAAC;QAED,+EAA+E;QAC/E,MAAM,gBAAgB,GAAG,MAAM,eAAe,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;QAEnE,OAAO,CAAC,GAAG,CAAC,iBAAiB,gBAAgB,CAAC,MAAM,cAAc,CAAC,CAAA;QAEnE,6EAA6E;QAC7E,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAClD,OAAO,CAAC,GAAG,CAAC,8BAA8B,QAAQ,CAAC,MAAM,4CAA4C,CAAC,CAAA;QACtG,MAAM,wBAAwB,CAAC,aAAa,EAAE,kBAAkB,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAA;QAEjG,8EAA8E;QAC9E,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAA;QACpE,MAAM,YAAY,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACzD,IAAI,WAAW,GAAG,kBAAkB;aACjC,kBAAkB,CAAC,UAAU,CAAC;aAC9B,MAAM,EAAE;aACR,KAAK,CAAC,wBAAwB,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;aACzD,QAAQ,CAAC,+DAA+D,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAA;QAEtG,IAAI,QAAQ,EAAE,CAAC;YACb,WAAW,GAAG,WAAW,CAAC,QAAQ,CAAC,qBAAqB,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAA;QACzE,CAAC;QAED,IAAI,UAAU,EAAE,CAAC;YACf,WAAW,GAAG,WAAW,CAAC,QAAQ,CAAC,0BAA0B,EAAE,EAAE,UAAU,EAAE,CAAC,CAAA;QAChF,CAAC;QAED,MAAM,YAAY,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE,CAAA;QAChD,OAAO,CAAC,GAAG,CAAC,aAAa,YAAY,CAAC,QAAQ,IAAI,CAAC,6BAA6B,CAAC,CAAA;QAEjF,IAAI,cAAc,GAAG,CAAC,CAAA;QACtB,IAAI,YAAY,GAAG,CAAC,CAAA;QACpB,IAAI,UAAU,GAAG,CAAC,CAAA;QAElB,+EAA+E;QAC/E,OAAO,CAAC,GAAG,CAAC,0EAA0E,CAAC,CAAA;QACvF,IAAI,qBAAqB,GAA2C,EAAE,CAAA;QACtE,IAAI,QAAQ,IAAI,UAAU,EAAE,CAAC;YAC3B,qBAAqB,GAAG,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAA;QACtE,CAAC;aAAM,IAAI,QAAQ,EAAE,CAAC;YACpB,mCAAmC;YACnC,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,KAAK,CAC1C;;;;;OAKD,EACC,CAAC,QAAQ,CAAC,CACX,CAAA;YACD,qBAAqB,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAA;QACnG,CAAC;aAAM,CAAC;YACN,mDAAmD;YACnD,MAAM,YAAY,GAAG,MAAM,kBAAkB,CAAC,KAAK,CAAC;;;;;OAKnD,CAAC,CAAA;YACF,qBAAqB,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAA;QAC3G,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,YAAY,qBAAqB,CAAC,MAAM,sCAAsC,CAAC,CAAA;QAE3F,yCAAyC;QACzC,KAAK,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,qBAAqB,EAAE,CAAC;YACvE,OAAO,CAAC,GAAG,CAAC,2BAA2B,YAAY,WAAW,SAAS,EAAE,CAAC,CAAA;YAE1E,6EAA6E;YAC7E,KAAK,MAAM,SAAS,IAAI,gBAAgB,EAAE,CAAC;gBACzC,IAAI,CAAC;oBACH,OAAO,CAAC,GAAG,CACT,gCAAgC,SAAS,CAAC,IAAI,WAAW,SAAS,CAAC,OAAO,IAAI,GAAG,cAAc,YAAY,WAAW,SAAS,EAAE,CAClI,CAAA;oBAED,iBAAiB;oBACjB,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,WAAC,OAAA,CAAA,MAAA,GAAG,CAAC,MAAM,0CAAE,EAAE,MAAK,SAAS,CAAC,EAAE,CAAA,EAAA,CAAC,CAAA;oBAExE,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBAC3B,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAA;wBACnD,SAAQ;oBACV,CAAC;oBAED,OAAO,CAAC,GAAG,CAAC,eAAe,SAAS,CAAC,MAAM,aAAa,CAAC,CAAA;oBAEzD,8DAA8D;oBAC9D,MAAM,WAAW,GAAG,MAAM,iBAAiB,CAAC,kBAAkB,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,CAAC,CAAA;oBAE5G,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBAC7B,OAAO,CAAC,GAAG,CAAC,6CAA6C,SAAS,cAAc,YAAY,YAAY,CAAC,CAAA;wBACzG,SAAQ;oBACV,CAAC;oBAED,OAAO,CAAC,GAAG,CAAC,0BAA0B,WAAW,CAAC,MAAM,IAAI,SAAS,CAAC,MAAM,aAAa,CAAC,CAAA;oBAE1F,uCAAuC;oBACvC,IAAI,eAAuB,CAAA;oBAC3B,IAAI,eAAuB,CAAA;oBAE3B,oDAAoD;oBACpD,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;wBACtB,IAAI,CAAC;4BACH,OAAO,CAAC,GAAG,CAAC,wBAAwB,SAAS,CAAC,OAAO,EAAE,CAAC,CAAA;4BACxD,MAAM,MAAM,GAAG,MAAM,6BAA6B,CAAC,SAAS,EAAE,WAAW,EAAE,SAAS,CAAC,CAAA;4BACrF,eAAe,GAAG,MAAM,CAAC,KAAK,CAAA;4BAC9B,eAAe,GAAG,MAAM,CAAC,KAAK,CAAA;4BAC9B,OAAO,CAAC,GAAG,CAAC,+BAA+B,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;wBAC/G,CAAC;wBAAC,OAAO,YAAY,EAAE,CAAC;4BACtB,OAAO,CAAC,GAAG,CAAC,qCAAqC,YAAY,CAAC,OAAO,oCAAoC,CAAC,CAAA;4BAC1G,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,wBAAwB,CAAC,WAAW,EAAE,SAAS,CAAC,CAAA;4BACzF,eAAe,GAAG,aAAa,CAAA;4BAC/B,eAAe,GAAG,aAAa,CAAA;wBACjC,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACN,yCAAyC;wBACzC,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAA;wBAC5C,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,wBAAwB,CAAC,WAAW,EAAE,SAAS,CAAC,CAAA;wBACzF,eAAe,GAAG,aAAa,CAAA;wBAC/B,eAAe,GAAG,aAAa,CAAA;wBAC/B,OAAO,CAAC,GAAG,CAAC,iCAAiC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;oBACjH,CAAC;oBAED,2DAA2D;oBAC3D,yEAAyE;oBACzE,MAAM,WAAW,GAAQ;wBACvB,GAAG,EAAE,SAAS;wBACd,KAAK,EAAE,eAAe;wBACtB,KAAK,EAAE,eAAe;wBACtB,SAAS,EAAE,SAAS;wBACpB,OAAO,EAAE,SAAS,CAAC,OAAO,IAAI,CAAC,EAAE,yBAAyB;wBAC1D,KAAK,EAAE,YAAY;wBACnB,QAAQ,EAAE,YAAY,EAAE,6BAA6B;wBACrD,MAAM,EAAE,YAAY,EAAE,oBAAoB;wBAC1C,SAAS,EAAE,MAAM,EAAE,wBAAwB;wBAC3C,SAAS,EAAE,IAAI,IAAI,EAAE;wBACrB,SAAS,EAAE,IAAI,IAAI,EAAE;qBACtB,CAAA;oBAED,IAAI,CAAC;wBACH,MAAM,UAAU,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;wBAC7D,YAAY,EAAE,CAAA;wBACd,OAAO,CAAC,GAAG,CACT,yBAAyB,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,aACtF,SAAS,CAAC,OAAO,IAAI,CACvB,QAAQ,UAAU,CAAC,EAAE,EAAE,CACxB,CAAA;oBACH,CAAC;oBAAC,OAAO,SAAS,EAAE,CAAC;wBACnB,OAAO,CAAC,GAAG,CAAC,uBAAuB,SAAS,CAAC,OAAO,EAAE,CAAC,CAAA;wBACvD,UAAU,EAAE,CAAA;oBACd,CAAC;oBAED,cAAc,EAAE,CAAA;gBAClB,CAAC;gBAAC,OAAO,QAAQ,EAAE,CAAC;oBAClB,OAAO,CAAC,GAAG,CAAC,6BAA6B,SAAS,CAAC,IAAI,KAAK,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAA;oBAC/E,UAAU,EAAE,CAAA;gBACd,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAA;QAC3D,OAAO,CAAC,GAAG,CAAC,gCAAgC,cAAc,EAAE,CAAC,CAAA;QAC7D,OAAO,CAAC,GAAG,CAAC,wBAAwB,YAAY,EAAE,CAAC,CAAA;QACnD,OAAO,CAAC,GAAG,CAAC,gBAAgB,UAAU,EAAE,CAAC,CAAA;QAEzC,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,uEAAuE,CAAC,CAAA;QACtF,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,oDAAoD,EAAE,KAAK,CAAC,CAAA;QAC1E,MAAM,KAAK,CAAA;IACb,CAAC;YAAS,CAAC;QACT,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,UAAU,CAAC,KAAK,EAAE,CAAA;YACxB,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAA;QAC9C,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,eAAe,CAAC,UAAuB,EAAE,OAAoB;IAC1E,yCAAyC;IACzC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAA;IAE3C,SAAS,cAAc,CAAC,GAAc;QACpC,IAAI,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YAC1B,OAAO,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAE,CAAA;QAC/B,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;YAChB,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;YACxB,OAAO,CAAC,CAAA;QACV,CAAC;QAED,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,WAAC,OAAA,CAAC,CAAC,EAAE,MAAK,MAAA,GAAG,CAAC,MAAM,0CAAE,EAAE,CAAA,CAAA,EAAA,CAAC,CAAA;QAC5D,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;YACxB,OAAO,CAAC,CAAA;QACV,CAAC;QAED,MAAM,KAAK,GAAG,cAAc,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;QAC3C,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;QAC5B,OAAO,KAAK,CAAA;IACd,CAAC;IAED,uCAAuC;IACvC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;QACvB,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,CAChC;QAAC,GAAW,CAAC,OAAO,GAAG,KAAK,CAAA;IAC/B,CAAC,CAAC,CAAA;IAEF,gCAAgC;IAChC,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAE,CAAS,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG,CAAE,CAAS,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,CAAA;AACzF,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,iBAAiB,CAC9B,kBAAuB,EACvB,SAAsB,EACtB,SAAiB,EACjB,OAAgB,EAChB,QAAiB;IAEjB,MAAM,WAAW,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IAEvD,IAAI,WAAW,GAAG,kBAAkB;SACjC,kBAAkB,CAAC,UAAU,CAAC;SAC9B,iBAAiB,CAAC,cAAc,EAAE,KAAK,CAAC;SACxC,KAAK,CAAC,wBAAwB,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;SACxD,QAAQ,CAAC,iCAAiC,EAAE,EAAE,SAAS,EAAE,CAAC;SAC1D,QAAQ,CAAC,4BAA4B,CAAC,CAAA;IAEzC,mFAAmF;IACnF,4EAA4E;IAE5E,wBAAwB;IACxB,IAAI,QAAQ,EAAE,CAAC;QACb,WAAW,GAAG,WAAW,CAAC,QAAQ,CAAC,8BAA8B,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAA;IAC9F,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE,CAAA;IAE1C,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,wBAAwB,CACrC,aAAkB,EAClB,kBAAuB,EACvB,QAAqB,EACrB,QAAiB,EACjB,UAAmB;IAEnB,IAAI,iBAAiB,GAAG,CAAC,CAAA;IACzB,IAAI,UAAU,GAAG,CAAC,CAAA;IAElB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,6CAA6C;YAC7C,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC;gBAC5C,KAAK,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE;gBACzB,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE;aAC3B,CAAC,CAAA;YAEF,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,mCAAmC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;gBAC9D,SAAQ;YACV,CAAC;YAED,wDAAwD;YACxD,IAAI,WAAW,GAAG,kBAAkB;iBACjC,kBAAkB,CAAC,UAAU,CAAC;iBAC9B,KAAK,CAAC,0BAA0B,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC;iBACxD,QAAQ,CAAC,4BAA4B,CAAC,CAAA;YAEzC,IAAI,QAAQ,EAAE,CAAC;gBACb,WAAW,GAAG,WAAW,CAAC,QAAQ,CAAC,4BAA4B,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAA;YAChF,CAAC;YAED,IAAI,UAAU,EAAE,CAAC;gBACf,WAAW,GAAG,WAAW,CAAC,QAAQ,CAAC,mCAAmC,EAAE,EAAE,UAAU,EAAE,CAAC,CAAA;YACzF,CAAC;YAED,MAAM,SAAS,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE,CAAA;YAE7C,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3B,SAAQ;YACV,CAAC;YAED,2DAA2D;YAC3D,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;gBACjC,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAA;gBAC/B,MAAM,QAAQ,GAAG,wBAAwB,CAAC,SAAS,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAA;gBAEpE,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;oBAC/C,QAAQ,CAAC,KAAK,GAAG,QAAQ,CAAA;oBACzB,QAAQ,CAAC,OAAO,GAAG,SAAS,CAAC,OAAO,IAAI,CAAC,CAAA;oBACzC,MAAM,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;oBACvC,iBAAiB,EAAE,CAAA;oBACnB,OAAO,CAAC,GAAG,CACT,QAAQ,OAAO,CAAC,IAAI,WAAW,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,OAAO,CAAC,CAAC,CAAC,KAAI,MAAM,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,aACpF,SAAS,CAAC,OAAO,IAAI,CACvB,GAAG,CACJ,CAAA;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,uCAAuC,OAAO,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;YACpF,UAAU,EAAE,CAAA;QACd,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,qCAAqC,iBAAiB,aAAa,UAAU,EAAE,CAAC,CAAA;AAC9F,CAAC;AAED;;GAEG;AACH,SAAS,wBAAwB,CAAC,GAAQ,EAAE,KAAa;IACvD,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3C,OAAO,IAAI,CAAA;IACb,CAAC;IAED,0CAA0C;IAC1C,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC,CAAC,QAAQ,IAAI,KAAK,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAA;IAErF,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO,KAAK,CAAC,KAAK,CAAA;AACpB,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,6BAA6B,CAC1C,SAAoB,EACpB,WAA6B,EAC7B,SAAsB;IAEtB,sCAAsC;IACtC,MAAM,EAAE,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAA;IAE1F,yCAAyC;IACzC,MAAM,gBAAgB,GAA2B,EAAE,CAAA;IACnD,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;;QAC7B,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACrE,IAAI,QAAQ,EAAE,CAAC;YACb,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAA,QAAQ,CAAC,KAAK,mCAAI,CAAC,CAAA;QACvD,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,yCAAyC;IACzC,MAAM,QAAQ,GAAG;QACf,GAAG,EAAE,KAAK,EAAE,IAAY,EAAE,EAAE;YAC1B,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAA;YACpC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CAAC,cAAc,IAAI,mCAAmC,CAAC,CAAA;YACxE,CAAC;YACD,OAAO,KAAK,CAAA;QACd,CAAC;KACF,CAAA;IAED,6BAA6B;IAC7B,MAAM,GAAG,GAAG,YAAY,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;IAC3C,MAAM,WAAW,GAAG,EAAE,SAAS,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAA;IAC7D,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,GAAG,EAAE,WAAW,CAAC,CAAA;IAEtD,OAAO;QACL,KAAK,EAAE,MAAM;QACb,KAAK,EAAE,MAAM;KACd,CAAA;AACH,CAAC;AAED;;GAEG;AACH,SAAS,wBAAwB,CAC/B,WAA6B,EAC7B,SAAsB;IAEtB,IAAI,kBAAkB,GAAG,CAAC,CAAA;IAC1B,IAAI,kBAAkB,GAAG,CAAC,CAAA;IAC1B,IAAI,WAAW,GAAG,CAAC,CAAA;IAEnB,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAC/D,MAAM,MAAM,GAAG,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,MAAM,KAAI,CAAC,CAAA;QAEpC,kBAAkB,IAAI,KAAK,CAAC,KAAK,GAAG,MAAM,CAAA;QAC1C,kBAAkB,IAAI,KAAK,CAAC,KAAK,GAAG,MAAM,CAAA;QAC1C,WAAW,IAAI,MAAM,CAAA;IACvB,CAAC;IAED,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,aAAa,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,CAAA;IAC/C,CAAC;IAED,OAAO;QACL,aAAa,EAAE,kBAAkB,GAAG,WAAW;QAC/C,aAAa,EAAE,kBAAkB,GAAG,WAAW;KAChD,CAAA;AACH,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,sBAAsB;IAC1C,0BAA0B;IAC1B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,aAAa,CAAA;IACtC,CAAC;IAED,wCAAwC;IACxC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAA;IACjD,MAAM,SAAS,GAAG,OAAO,CAAC,6DAA6D,CAAC,CAAA;IACxF,MAAM,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;IAEhD,IAAI,UAAU,CAAA;IAEd,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAA;QAC3C,UAAU,GAAG,MAAM,IAAA,0BAAgB,gDAC9B,SAAS,GACT,gBAAgB,KACnB,OAAO,EAAE,KAAK,IACd,CAAA;QAEF,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAA;QAC1D,aAAa,CAAC,SAAS,EAAE,UAAU,CAAC,CAAA;QAEpC,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAA;QAC1D,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAA;QAC9C,MAAM,aAAa,GAAG,aAAa,CAAC,GAAG,CAAC,CAAA;QAExC,8BAA8B;QAC9B,MAAM,IAAI,GAAG,MAAM,aAAa;aAC7B,kBAAkB,CAAC,KAAK,CAAC;aACzB,iBAAiB,CAAC,YAAY,EAAE,QAAQ,CAAC;aACzC,iBAAiB,CAAC,YAAY,EAAE,QAAQ,CAAC;aACzC,iBAAiB,CAAC,cAAc,EAAE,UAAU,CAAC;aAC7C,KAAK,CAAC,2BAA2B,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;aAC5D,OAAO,EAAE,CAAA;QAEZ,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAClD,MAAM,gBAAgB,GAAG,MAAM,eAAe,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;QAEhE,OAAO,CAAC,GAAG,CAAC,4BAA4B,gBAAgB,CAAC,MAAM,eAAe,CAAC,CAAA;QAE/E,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAA;YACvC,OAAM;QACR,CAAC;QAED,gBAAgB,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;YACtC,MAAM,KAAK,GAAI,GAAW,CAAC,OAAO,IAAI,CAAC,CAAA;YACvC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YACjC,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,WAAC,OAAA,CAAA,MAAA,CAAC,CAAC,MAAM,0CAAE,EAAE,MAAK,GAAG,CAAC,EAAE,CAAA,EAAA,CAAC,CAAC,MAAM,CAAA;YACnE,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,CAAC,CAAA;YAE9B,OAAO,CAAC,GAAG,CACT,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,MAAM,GAAG,GAAG,CAAC,IAAI,MAAM,KAAK,KAAK,UAAU,sBAAsB,MAAM,GAAG,CACxH,CAAA;QACH,CAAC,CAAC,CAAA;QAEF,OAAO,CAAC,GAAG,CAAC,gBAAgB,gBAAgB,CAAC,MAAM,cAAc,CAAC,CAAA;IACpE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAA;IACtD,CAAC;YAAS,CAAC;QACT,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,UAAU,CAAC,KAAK,EAAE,CAAA;QAC1B,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAElC,IAAI,CAAC;QACH,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BX,CAAC,CAAA;YACF,OAAM;QACR,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACnD,MAAM,sBAAsB,EAAE,CAAA;YAC9B,OAAM;QACR,CAAC;QAED,MAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;QACxE,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;QACxC,MAAM,UAAU,GAAG,SAAS,KAAK,CAAC,CAAC,IAAI,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QACpG,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;QACtC,MAAM,QAAQ,GAAG,QAAQ,KAAK,CAAC,CAAC,IAAI,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QAC/F,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;QACxC,MAAM,eAAe,GAAG,SAAS,KAAK,CAAC,CAAC,IAAI,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QACzG,MAAM,SAAS,GAAG,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QAC1E,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;QAC9C,MAAM,OAAO,GAAG,YAAY,KAAK,CAAC,CAAC,IAAI,YAAY,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QACpH,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAC/B,GAAG,CAAC,EAAE,CACJ,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;YACrB,GAAG,KAAK,UAAU;YAClB,GAAG,KAAK,QAAQ;YAChB,GAAG,KAAK,eAAe;YACvB,CAAC,OAAO,KAAK,SAAS,IAAI,GAAG,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC,CACxD,CAAA;QAED,kDAAkD;QAClD,IAAI,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtC,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAA;YACrE,OAAO,CAAC,GAAG,CAAC,YAAY,gBAAgB,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,qBAAqB,EAAE,CAAC,CAAA;YAC7F,OAAO,CAAC,GAAG,CAAC,YAAY,UAAU,IAAI,OAAO,EAAE,CAAC,CAAA;YAChD,OAAO,CAAC,GAAG,CAAC,YAAY,SAAS,CAAC,MAAM,gBAAgB,CAAC,CAAA;YACzD,OAAO,CAAC,GAAG,CAAC,eAAe,OAAO,IAAI,QAAQ,EAAE,CAAC,CAAA;YACjD,MAAM,6BAA6B,CAAC,SAAS,EAAE,eAAe,EAAE,gBAAgB,EAAE,UAAU,EAAE,OAAO,CAAC,CAAA;QACxG,CAAC;aAAM,IAAI,eAAe,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,2CAA2C,eAAe,EAAE,CAAC,CAAA;YACzE,OAAO,CAAC,GAAG,CAAC,YAAY,gBAAgB,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,qBAAqB,EAAE,CAAC,CAAA;YAC7F,OAAO,CAAC,GAAG,CAAC,YAAY,UAAU,IAAI,OAAO,EAAE,CAAC,CAAA;YAChD,OAAO,CAAC,GAAG,CAAC,WAAW,QAAQ,IAAI,KAAK,EAAE,CAAC,CAAA;YAC3C,OAAO,CAAC,GAAG,CAAC,eAAe,OAAO,IAAI,QAAQ,EAAE,CAAC,CAAA;YACjD,MAAM,wBAAwB,CAAC,eAAe,EAAE,gBAAgB,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAA;QAClG,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAA;YACxD,OAAO,CAAC,GAAG,CAAC,YAAY,gBAAgB,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,qBAAqB,EAAE,CAAC,CAAA;YAC7F,OAAO,CAAC,GAAG,CAAC,YAAY,UAAU,IAAI,OAAO,EAAE,CAAC,CAAA;YAChD,OAAO,CAAC,GAAG,CAAC,WAAW,QAAQ,IAAI,KAAK,EAAE,CAAC,CAAA;YAC3C,OAAO,CAAC,GAAG,CAAC,eAAe,OAAO,IAAI,QAAQ,EAAE,CAAC,CAAA;YACjD,MAAM,wBAAwB,CAAC,SAAS,EAAE,gBAAgB,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAA;QAC5F,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;QACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC;AAED,yBAAyB;AACzB,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,KAAU,EAAE,EAAE;IAC9C,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,CAAA;IAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA;AAEF,yBAAyB;AACzB,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC5B,IAAI,EAAE,CAAA;AACR,CAAC","sourcesContent":["#!/usr/bin/env ts-node\n\nimport { createConnection } from 'typeorm'\nimport * as fs from 'fs'\nimport * as path from 'path'\n\ninterface KpiRecord {\n id: string\n name: string\n isLeaf: boolean\n weight: number\n version?: number\n formula?: string\n scoreFormula?: string\n grades?: any[]\n parent?: {\n id: string\n name: string\n }\n children?: KpiRecord[]\n __level?: number // Added for hierarchy level tracking\n}\n\ninterface KpiValueRecord {\n id: string\n value: number\n score: number\n kpi: {\n id: string\n name: string\n }\n valueDate?: Date\n org?: any\n}\n\n/**\n * Batch process multiple organizations with single initialization (optimized for performance)\n */\nexport async function propagateParentKpiValuesBatch(\n orgScopes: string[],\n specificKpiName?: string,\n forceRecalculate = false,\n targetDate?: string,\n version?: number\n): Promise<void> {\n // Set NODE_ENV if not set\n if (!process.env.NODE_ENV) {\n process.env.NODE_ENV = 'development'\n }\n\n // Initialize Things-Factory environment (ONCE)\n const { config } = require('@things-factory/env')\n const ormconfig = require('@things-factory/shell/dist-server/initializers/ormconfig.js')\n const connectionConfig = config.get('ormconfig')\n\n let connection\n\n console.log('🚀 Starting Batch Parent KPI Value Propagation...')\n console.log(`📦 Processing ${orgScopes.length} organizations`)\n\n try {\n // Create database connection using Things-Factory pattern (ONCE)\n console.log('🔌 Connecting to database...')\n connection = await createConnection({\n ...ormconfig,\n ...connectionConfig,\n logging: false\n })\n\n // Register the connection with Things-Factory shell\n const { addDataSource } = require('@things-factory/shell')\n addDataSource('default', connection)\n\n console.log('✅ Database connected')\n\n let totalProcessed = 0\n let totalCreated = 0\n let totalErrors = 0\n const startTime = Date.now()\n\n // Process each organization\n for (let i = 0; i < orgScopes.length; i++) {\n const orgScope = orgScopes[i].trim()\n console.log(`\\n[${i + 1}/${orgScopes.length}] 🏢 Processing org: ${orgScope}`)\n\n try {\n // Call the core processing logic for single org\n const result = await processSingleOrg(\n connection,\n orgScope,\n specificKpiName,\n forceRecalculate,\n targetDate,\n version\n )\n\n totalProcessed += result.processed\n totalCreated += result.created\n console.log(` ✅ Success: ${result.created} parent KPIs created`)\n } catch (error) {\n totalErrors++\n console.log(` ❌ Failed: ${error.message}`)\n }\n }\n\n const endTime = Date.now()\n const duration = ((endTime - startTime) / 1000).toFixed(2)\n\n console.log(`\\n🎉 Batch Propagation Complete!`)\n console.log(` 📊 Organizations processed: ${orgScopes.length}`)\n console.log(` ✨ Parent KPIs created: ${totalCreated}`)\n console.log(` ❌ Errors: ${totalErrors}`)\n console.log(` ⏱️ Duration: ${duration}s (${(parseFloat(duration) / orgScopes.length).toFixed(2)}s per org)`)\n } catch (error) {\n console.error(`❌ Fatal error during batch propagation:`, error)\n throw error\n } finally {\n if (connection) {\n await connection.close()\n console.log('🔌 Database connection closed')\n }\n }\n}\n\n/**\n * Process single organization (used by batch processor)\n */\nasync function processSingleOrg(\n connection: any,\n orgScope: string,\n specificKpiName?: string,\n forceRecalculate = false,\n targetDate?: string,\n version?: number\n): Promise<{ processed: number; created: number }> {\n const { getRepository } = require('@things-factory/shell')\n const { Kpi, KpiValue } = require('@things-factory/kpi')\n const { Domain } = require('@things-factory/shell')\n\n const kpiRepository = getRepository(Kpi)\n const kpiValueRepository = getRepository(KpiValue)\n const domainRepository = getRepository(Domain)\n\n const systemDomain = await domainRepository.findOne({ where: { name: 'SYSTEM' } })\n if (!systemDomain) {\n throw new Error('SYSTEM domain not found')\n }\n\n // Get all KPIs with their hierarchy\n let kpisQuery = kpiRepository\n .createQueryBuilder('kpi')\n .leftJoinAndSelect('kpi.domain', 'domain')\n .leftJoinAndSelect('kpi.parent', 'parent')\n .leftJoinAndSelect('kpi.children', 'children')\n .where('kpi.domain_id = :domainId', { domainId: systemDomain.id })\n\n if (specificKpiName) {\n kpisQuery = kpisQuery.andWhere('kpi.name = :name', { name: specificKpiName })\n }\n\n const allKpis = await kpisQuery.getMany()\n const parentKpis = allKpis.filter((kpi: any) => !kpi.isLeaf)\n const leafKpis = allKpis.filter((kpi: any) => kpi.isLeaf)\n\n console.log(` 📊 KPIs: ${allKpis.length} total (${leafKpis.length} leaf, ${parentKpis.length} parent)`)\n\n // 1. Recalculate leaf KPI scores\n await recalculateLeafKpiScores(kpiRepository, kpiValueRepository, leafKpis, orgScope, targetDate)\n\n // 2. Delete existing parent KPI values\n if (parentKpis.length > 0) {\n const parentKpiIds = parentKpis.map((kpi: any) => kpi.id)\n let deleteQuery = kpiValueRepository\n .createQueryBuilder('kpiValue')\n .delete()\n .where('kpi_id IN (:...kpiIds)', { kpiIds: parentKpiIds })\n .andWhere('domain_id = (SELECT id FROM domains WHERE name = :domainName)', { domainName: 'SYSTEM' })\n .andWhere('\"group\" = :orgScope', { orgScope })\n\n if (targetDate) {\n deleteQuery = deleteQuery.andWhere('value_date = :targetDate', { targetDate })\n }\n\n await deleteQuery.execute()\n }\n\n // 3. Sort parent KPIs and get combinations\n const sortedParentKpis = await sortKpisByLevel(parentKpis, allKpis)\n\n let groupDateCombinations: { group: string; valueDate: string }[] = []\n if (targetDate) {\n groupDateCombinations = [{ group: orgScope, valueDate: targetDate }]\n } else {\n const dates = await kpiValueRepository.query(\n `SELECT DISTINCT \"value_date\" FROM kpi_values WHERE \"group\" = $1 AND \"group\" IS NOT NULL ORDER BY \"value_date\"`,\n [orgScope]\n )\n groupDateCombinations = dates.map((row: any) => ({ group: orgScope, valueDate: row.value_date }))\n }\n\n console.log(` 📅 Date combinations: ${groupDateCombinations.length}`)\n\n let totalCreated = 0\n\n // 4. Process each parent KPI\n for (const { group: currentGroup, valueDate } of groupDateCombinations) {\n console.log(` 📆 Processing date: ${valueDate}`)\n for (const parentKpi of sortedParentKpis) {\n const childKpis = allKpis.filter((kpi: any) => kpi.parent?.id === parentKpi.id)\n if (childKpis.length === 0) continue\n\n const childValues = await getChildKpiValues(kpiValueRepository, childKpis, valueDate, version, currentGroup)\n if (childValues.length === 0) continue\n\n let calculatedValue: number\n let calculatedScore: number\n\n if (parentKpi.formula) {\n try {\n const result = await calculateParentKpiWithFormula(parentKpi, childValues, childKpis)\n calculatedValue = result.value\n calculatedScore = result.score\n } catch (formulaError) {\n const { weightedValue, weightedScore } = calculateWeightedAverage(childValues, childKpis)\n calculatedValue = weightedValue\n calculatedScore = weightedScore\n }\n } else {\n const { weightedValue, weightedScore } = calculateWeightedAverage(childValues, childKpis)\n calculatedValue = weightedValue\n calculatedScore = weightedScore\n }\n\n const newKpiValue: any = {\n kpi: parentKpi,\n value: calculatedValue,\n score: calculatedScore,\n valueDate: valueDate,\n version: parentKpi.version || 1,\n group: currentGroup,\n kpiScope: currentGroup,\n domain: systemDomain,\n inputType: 'AUTO',\n createdAt: new Date(),\n updatedAt: new Date()\n }\n\n await kpiValueRepository.save(newKpiValue)\n totalCreated++\n }\n }\n\n return { processed: sortedParentKpis.length, created: totalCreated }\n}\n\n/**\n * Propagate parent KPI values based on child KPI scores and weights\n * Processes hierarchy from leaf to root, calculating weighted averages\n */\nexport async function propagateParentKpiValues(\n specificKpiName?: string,\n forceRecalculate = false,\n targetDate?: string,\n orgScope?: string,\n version?: number\n): Promise<void> {\n // Set NODE_ENV if not set\n if (!process.env.NODE_ENV) {\n process.env.NODE_ENV = 'development'\n }\n\n // Initialize Things-Factory environment\n const { config } = require('@things-factory/env')\n const ormconfig = require('@things-factory/shell/dist-server/initializers/ormconfig.js')\n const connectionConfig = config.get('ormconfig')\n\n let connection\n\n console.log('🚀 Starting Parent KPI Value Propagation...')\n\n try {\n // Create database connection using Things-Factory pattern\n console.log('🔌 Connecting to database...')\n connection = await createConnection({\n ...ormconfig,\n ...connectionConfig,\n logging: false\n })\n\n // Register the connection with Things-Factory shell\n const { addDataSource } = require('@things-factory/shell')\n addDataSource('default', connection)\n\n console.log('✅ Database connected')\n\n // Now we can use getRepository with the registered connection\n const { getRepository } = require('@things-factory/shell')\n const { Kpi } = require('@things-factory/kpi')\n const kpiRepository = getRepository(Kpi)\n\n // Get KPI-Value repository\n let kpiValueRepository\n try {\n const { KpiValue } = require('@things-factory/kpi')\n kpiValueRepository = getRepository(KpiValue)\n } catch (error) {\n console.error('❌ KpiValue entity not found. Please ensure it exists in @things-factory/kpi')\n return\n }\n\n // Get Domain repository and find SYSTEM domain\n let systemDomain\n try {\n const { Domain } = require('@things-factory/shell')\n const domainRepository = getRepository(Domain)\n systemDomain = await domainRepository.findOne({ where: { name: 'SYSTEM' } })\n if (!systemDomain) {\n console.error('❌ SYSTEM domain not found')\n return\n }\n } catch (error) {\n console.error('❌ Domain entity not found:', error.message)\n return\n }\n\n // Get all KPIs with their hierarchy\n let kpisQuery = kpiRepository\n .createQueryBuilder('kpi')\n .leftJoinAndSelect('kpi.domain', 'domain')\n .leftJoinAndSelect('kpi.parent', 'parent')\n .leftJoinAndSelect('kpi.children', 'children')\n .where('domain.name = :domainName', { domainName: 'SYSTEM' })\n\n if (specificKpiName) {\n kpisQuery = kpisQuery.andWhere('kpi.name = :name', { name: specificKpiName })\n console.log(`🎯 Processing specific KPI: ${specificKpiName}`)\n } else {\n console.log('🎯 Processing all KPIs in hierarchy')\n }\n\n const allKpis = await kpisQuery.getMany()\n\n if (allKpis.length === 0) {\n console.log('⚠️ No KPIs found')\n return\n }\n\n console.log(`📊 Found ${allKpis.length} KPIs total`)\n\n // Get parent KPIs (non-leaf KPIs) ordered by level (deepest first)\n const parentKpis = allKpis.filter(kpi => !kpi.isLeaf)\n\n if (parentKpis.length === 0) {\n console.log('⚠️ No parent KPIs found')\n return\n }\n\n // Sort parent KPIs by hierarchy level (deepest first for bottom-up processing)\n const sortedParentKpis = await sortKpisByLevel(parentKpis, allKpis)\n\n console.log(`🔄 Processing ${sortedParentKpis.length} parent KPIs`)\n\n // 1. First, recalculate leaf KPI scores using latest KPI versions and grades\n const leafKpis = allKpis.filter(kpi => kpi.isLeaf)\n console.log(`\\n📊 Step 1: Recalculating ${leafKpis.length} leaf KPI scores with latest KPI grades...`)\n await recalculateLeafKpiScores(kpiRepository, kpiValueRepository, leafKpis, orgScope, targetDate)\n\n // 2. Delete existing parent KPI values (not leaf values - they are base data)\n console.log('\\n🗑️ Step 2: Deleting existing parent KPI values...')\n const parentKpiIds = parentKpis.map((kpi: any) => kpi.id)\n let deleteQuery = kpiValueRepository\n .createQueryBuilder('kpiValue')\n .delete()\n .where('kpi_id IN (:...kpiIds)', { kpiIds: parentKpiIds })\n .andWhere('domain_id = (SELECT id FROM domains WHERE name = :domainName)', { domainName: 'SYSTEM' })\n\n if (orgScope) {\n deleteQuery = deleteQuery.andWhere('\"group\" = :orgScope', { orgScope })\n }\n\n if (targetDate) {\n deleteQuery = deleteQuery.andWhere('value_date = :targetDate', { targetDate })\n }\n\n const deleteResult = await deleteQuery.execute()\n console.log(`✅ Deleted ${deleteResult.affected || 0} existing parent KPI values`)\n\n let totalProcessed = 0\n let totalCreated = 0\n let errorCount = 0\n\n // 3. Get all distinct (group, valueDate) combinations from existing KPI values\n console.log('\\n📍 Step 3: Creating parent KPI values from recalculated leaf scores...')\n let groupDateCombinations: { group: string; valueDate: string }[] = []\n if (orgScope && targetDate) {\n groupDateCombinations = [{ group: orgScope, valueDate: targetDate }]\n } else if (orgScope) {\n // Get all dates for specific group\n const dates = await kpiValueRepository.query(\n `\n SELECT DISTINCT \"value_date\"\n FROM kpi_values\n WHERE \"group\" = $1 AND \"group\" IS NOT NULL\n ORDER BY \"value_date\"\n `,\n [orgScope]\n )\n groupDateCombinations = dates.map((row: any) => ({ group: orgScope, valueDate: row.value_date }))\n } else {\n // Get all distinct (group, valueDate) combinations\n const combinations = await kpiValueRepository.query(`\n SELECT DISTINCT \"group\", \"value_date\"\n FROM kpi_values\n WHERE \"group\" IS NOT NULL AND \"group\" != ''\n ORDER BY \"group\", \"value_date\"\n `)\n groupDateCombinations = combinations.map((row: any) => ({ group: row.group, valueDate: row.value_date }))\n }\n\n console.log(` Found ${groupDateCombinations.length} distinct (group, date) combinations`)\n\n // Process each (group, date) combination\n for (const { group: currentGroup, valueDate } of groupDateCombinations) {\n console.log(`\\\\n🏢 Processing Group: ${currentGroup}, Date: ${valueDate}`)\n\n // Process each parent KPI from deepest to shallowest for this group and date\n for (const parentKpi of sortedParentKpis) {\n try {\n console.log(\n `\\\\n📄 Processing Parent KPI: ${parentKpi.name} (Level ${parentKpi.__level || '?'}) - Group: ${currentGroup}, Date: ${valueDate}`\n )\n\n // Get child KPIs\n const childKpis = allKpis.filter(kpi => kpi.parent?.id === parentKpi.id)\n\n if (childKpis.length === 0) {\n console.log(` ⚠️ No child KPIs found, skipping`)\n continue\n }\n\n console.log(` 👶 Found ${childKpis.length} child KPIs`)\n\n // Get child KPI values/scores for the specific group and date\n const childValues = await getChildKpiValues(kpiValueRepository, childKpis, valueDate, version, currentGroup)\n\n if (childValues.length === 0) {\n console.log(` ⚠️ No child KPI values found for date ${valueDate} and group ${currentGroup}, skipping`)\n continue\n }\n\n console.log(` 📊 Found values for ${childValues.length}/${childKpis.length} child KPIs`)\n\n // Calculate parent KPI value and score\n let calculatedValue: number\n let calculatedScore: number\n\n // 1. If parent KPI has formula, use it to calculate\n if (parentKpi.formula) {\n try {\n console.log(` 📐 Using formula: ${parentKpi.formula}`)\n const result = await calculateParentKpiWithFormula(parentKpi, childValues, childKpis)\n calculatedValue = result.value\n calculatedScore = result.score\n console.log(` 🧮 Formula result: value=${calculatedValue.toFixed(4)}, score=${calculatedScore.toFixed(4)}`)\n } catch (formulaError) {\n console.log(` ⚠️ Formula evaluation failed: ${formulaError.message}, falling back to weighted average`)\n const { weightedValue, weightedScore } = calculateWeightedAverage(childValues, childKpis)\n calculatedValue = weightedValue\n calculatedScore = weightedScore\n }\n } else {\n // 2. If no formula, use weighted average\n console.log(` ⚖️ Using weighted average`)\n const { weightedValue, weightedScore } = calculateWeightedAverage(childValues, childKpis)\n calculatedValue = weightedValue\n calculatedScore = weightedScore\n console.log(` 🧮 Weighted average: value=${calculatedValue.toFixed(4)}, score=${calculatedScore.toFixed(4)}`)\n }\n\n // Create new parent KPI value (old values already deleted)\n // Use latest KPI version (parentKpi.version) not the old value's version\n const newKpiValue: any = {\n kpi: parentKpi,\n value: calculatedValue,\n score: calculatedScore,\n valueDate: valueDate,\n version: parentKpi.version || 1, // Use latest KPI version\n group: currentGroup,\n kpiScope: currentGroup, // Set kpiScope same as group\n domain: systemDomain, // Set domain entity\n inputType: 'AUTO', // Set inputType to AUTO\n createdAt: new Date(),\n updatedAt: new Date()\n }\n\n try {\n const savedValue = await kpiValueRepository.save(newKpiValue)\n totalCreated++\n console.log(\n ` ✨ Created: value=${calculatedValue.toFixed(4)}, score=${calculatedScore.toFixed(4)}, version=${\n parentKpi.version || 1\n }, id=${savedValue.id}`\n )\n } catch (saveError) {\n console.log(` ❌ Save failed: ${saveError.message}`)\n errorCount++\n }\n\n totalProcessed++\n } catch (kpiError) {\n console.log(` ❌ Error processing KPI ${parentKpi.name}: ${kpiError.message}`)\n errorCount++\n }\n }\n }\n\n console.log(`\\\\n🎉 Parent KPI Value Propagation Complete!`)\n console.log(` 📊 Parent KPIs processed: ${totalProcessed}`)\n console.log(` ✨ Values created: ${totalCreated}`)\n console.log(` ❌ Errors: ${errorCount}`)\n\n if (errorCount > 0) {\n console.log(`\\\\n⚠️ Some parent KPIs had errors. Check the logs above for details.`)\n }\n } catch (error) {\n console.error(`❌ Fatal error during parent KPI value propagation:`, error)\n throw error\n } finally {\n if (connection) {\n await connection.close()\n console.log('🔌 Database connection closed')\n }\n }\n}\n\n/**\n * Sort KPIs by hierarchy level (deepest first for bottom-up processing)\n */\nasync function sortKpisByLevel(parentKpis: KpiRecord[], allKpis: KpiRecord[]): Promise<KpiRecord[]> {\n // Calculate hierarchy level for each KPI\n const kpiLevels = new Map<string, number>()\n\n function calculateLevel(kpi: KpiRecord): number {\n if (kpiLevels.has(kpi.id)) {\n return kpiLevels.get(kpi.id)!\n }\n\n if (!kpi.parent) {\n kpiLevels.set(kpi.id, 0)\n return 0\n }\n\n const parentKpi = allKpis.find(k => k.id === kpi.parent?.id)\n if (!parentKpi) {\n kpiLevels.set(kpi.id, 1)\n return 1\n }\n\n const level = calculateLevel(parentKpi) + 1\n kpiLevels.set(kpi.id, level)\n return level\n }\n\n // Calculate levels for all parent KPIs\n parentKpis.forEach(kpi => {\n const level = calculateLevel(kpi)\n ;(kpi as any).__level = level\n })\n\n // Sort by level (deepest first)\n return parentKpis.sort((a, b) => ((b as any).__level || 0) - ((a as any).__level || 0))\n}\n\n/**\n * Get child KPI values for a specific date\n * Note: Version filter is NOT applied - uses latest available child KPI values regardless of version\n * This matches the recalculateProjectKpiValues logic in kpi-metric-value-mutation.ts\n */\nasync function getChildKpiValues(\n kpiValueRepository: any,\n childKpis: KpiRecord[],\n valueDate: string,\n version?: number,\n orgScope?: string\n): Promise<KpiValueRecord[]> {\n const childKpiIds = childKpis.map((kpi: any) => kpi.id)\n\n let valuesQuery = kpiValueRepository\n .createQueryBuilder('kpiValue')\n .leftJoinAndSelect('kpiValue.kpi', 'kpi')\n .where('kpi.id IN (:...kpiIds)', { kpiIds: childKpiIds })\n .andWhere('kpiValue.valueDate = :valueDate', { valueDate })\n .andWhere('kpiValue.score IS NOT NULL')\n\n // Version filter is intentionally removed to use latest available child KPI values\n // This ensures we calculate parent KPIs based on the most recent child data\n\n // Filter by group scope\n if (orgScope) {\n valuesQuery = valuesQuery.andWhere('kpiValue.group = :groupScope', { groupScope: orgScope })\n }\n\n const values = await valuesQuery.getMany()\n\n return values\n}\n\n/**\n * Recalculate leaf KPI scores using latest KPI grades lookup table\n */\nasync function recalculateLeafKpiScores(\n kpiRepository: any,\n kpiValueRepository: any,\n leafKpis: KpiRecord[],\n orgScope?: string,\n targetDate?: string\n): Promise<void> {\n let totalRecalculated = 0\n let errorCount = 0\n\n for (const leafKpi of leafKpis) {\n try {\n // Get latest version of this KPI with grades\n const latestKpi = await kpiRepository.findOne({\n where: { id: leafKpi.id },\n order: { version: 'DESC' }\n })\n\n if (!latestKpi) {\n console.log(` ⚠️ Latest KPI not found for ${leafKpi.name}`)\n continue\n }\n\n // Get all leaf KPI values that need score recalculation\n let valuesQuery = kpiValueRepository\n .createQueryBuilder('kpiValue')\n .where('kpiValue.kpi_id = :kpiId', { kpiId: leafKpi.id })\n .andWhere('kpiValue.value IS NOT NULL')\n\n if (orgScope) {\n valuesQuery = valuesQuery.andWhere('kpiValue.group = :orgScope', { orgScope })\n }\n\n if (targetDate) {\n valuesQuery = valuesQuery.andWhere('kpiValue.value_date = :targetDate', { targetDate })\n }\n\n const kpiValues = await valuesQuery.getMany()\n\n if (kpiValues.length === 0) {\n continue\n }\n\n // Recalculate score for each value using latest KPI grades\n for (const kpiValue of kpiValues) {\n const oldScore = kpiValue.score\n const newScore = calculateScoreFromGrades(latestKpi, kpiValue.value)\n\n if (newScore !== null && newScore !== oldScore) {\n kpiValue.score = newScore\n kpiValue.version = latestKpi.version || 1\n await kpiValueRepository.save(kpiValue)\n totalRecalculated++\n console.log(\n ` ✅ ${leafKpi.name}: score ${oldScore?.toFixed(4) || 'null'} → ${newScore.toFixed(4)} (version ${\n latestKpi.version || 1\n })`\n )\n }\n }\n } catch (error) {\n console.log(` ❌ Error recalculating scores for ${leafKpi.name}: ${error.message}`)\n errorCount++\n }\n }\n\n console.log(`\\n 📊 Leaf scores recalculated: ${totalRecalculated}, Errors: ${errorCount}`)\n}\n\n/**\n * Calculate score from KPI grades lookup table\n */\nfunction calculateScoreFromGrades(kpi: any, value: number): number | null {\n if (!kpi.grades || kpi.grades.length === 0) {\n return null\n }\n\n // Find grade that matches the value range\n const grade = kpi.grades.find((g: any) => value >= g.minValue && value <= g.maxValue)\n\n if (!grade) {\n return null\n }\n\n return grade.score\n}\n\n/**\n * Calculate parent KPI value using formula\n * This matches the logic in kpi-metric-value-mutation.ts recalculateParentKpiValue\n */\nasync function calculateParentKpiWithFormula(\n parentKpi: KpiRecord,\n childValues: KpiValueRecord[],\n childKpis: KpiRecord[]\n): Promise<{ value: number; score: number }> {\n // Import formula evaluation functions\n const { parseFormula, evaluateFormula, builtinFunctions } = require('@things-factory/kpi')\n\n // Create child KPI name -> score mapping\n const childKpiScoreMap: Record<string, number> = {}\n childValues.forEach(kpiValue => {\n const childKpi = childKpis.find((k: any) => k.id === kpiValue.kpi.id)\n if (childKpi) {\n childKpiScoreMap[childKpi.name] = kpiValue.score ?? 0\n }\n })\n\n // Create provider for formula evaluation\n const provider = {\n get: async (name: string) => {\n const value = childKpiScoreMap[name]\n if (value === undefined) {\n throw new Error(`Child KPI '${name}' not found in parent KPI formula`)\n }\n return value\n }\n }\n\n // Parse and evaluate formula\n const ast = parseFormula(parentKpi.formula)\n const evalContext = { functions: builtinFunctions, provider }\n const result = await evaluateFormula(ast, evalContext)\n\n return {\n value: result,\n score: result\n }\n}\n\n/**\n * Calculate weighted average from child KPI values\n */\nfunction calculateWeightedAverage(\n childValues: KpiValueRecord[],\n childKpis: KpiRecord[]\n): { weightedValue: number; weightedScore: number } {\n let totalWeightedValue = 0\n let totalWeightedScore = 0\n let totalWeight = 0\n\n for (const value of childValues) {\n const childKpi = childKpis.find(kpi => kpi.id === value.kpi.id)\n const weight = childKpi?.weight || 1\n\n totalWeightedValue += value.score * weight\n totalWeightedScore += value.score * weight\n totalWeight += weight\n }\n\n if (totalWeight === 0) {\n return { weightedValue: 0, weightedScore: 0 }\n }\n\n return {\n weightedValue: totalWeightedValue / totalWeight,\n weightedScore: totalWeightedScore / totalWeight\n }\n}\n\n/**\n * List parent KPIs and their hierarchy\n */\nexport async function listParentKpiHierarchy(): Promise<void> {\n // Set NODE_ENV if not set\n if (!process.env.NODE_ENV) {\n process.env.NODE_ENV = 'development'\n }\n\n // Initialize Things-Factory environment\n const { config } = require('@things-factory/env')\n const ormconfig = require('@things-factory/shell/dist-server/initializers/ormconfig.js')\n const connectionConfig = config.get('ormconfig')\n\n let connection\n\n try {\n console.log('🔌 Connecting to database...')\n connection = await createConnection({\n ...ormconfig,\n ...connectionConfig,\n logging: false\n })\n\n const { addDataSource } = require('@things-factory/shell')\n addDataSource('default', connection)\n\n const { getRepository } = require('@things-factory/shell')\n const { Kpi } = require('@things-factory/kpi')\n const kpiRepository = getRepository(Kpi)\n\n // Get all KPIs with hierarchy\n const kpis = await kpiRepository\n .createQueryBuilder('kpi')\n .leftJoinAndSelect('kpi.domain', 'domain')\n .leftJoinAndSelect('kpi.parent', 'parent')\n .leftJoinAndSelect('kpi.children', 'children')\n .where('domain.name = :domainName', { domainName: 'SYSTEM' })\n .getMany()\n\n const parentKpis = kpis.filter(kpi => !kpi.isLeaf)\n const sortedParentKpis = await sortKpisByLevel(parentKpis, kpis)\n\n console.log(`📁 Parent KPI Hierarchy (${sortedParentKpis.length} parents):\\\\n`)\n\n if (sortedParentKpis.length === 0) {\n console.log(' No parent KPIs found.')\n return\n }\n\n sortedParentKpis.forEach((kpi, index) => {\n const level = (kpi as any).__level || 0\n const indent = ' '.repeat(level)\n const childCount = kpis.filter(k => k.parent?.id === kpi.id).length\n const weight = kpi.weight || 1\n\n console.log(\n ` ${(index + 1).toString().padStart(2)}: ${indent}${kpi.name} (L${level}, ${childCount} children, weight: ${weight})`\n )\n })\n\n console.log(`\\\\n📈 Total: ${sortedParentKpis.length} parent KPIs`)\n } catch (error) {\n console.error('❌ Error listing parent KPIs:', error)\n } finally {\n if (connection) {\n await connection.close()\n }\n }\n}\n\n/**\n * CLI execution when called directly\n */\nasync function main() {\n const args = process.argv.slice(2)\n\n try {\n if (args.includes('--help') || args.includes('-h')) {\n console.log(`\n🎯 Parent KPI Value Propagator\n\nUsage:\n ts-node server/scripts/propagate-parent-kpi-values.ts [options] [kpiName]\n\nOptions:\n --list, -l List parent KPIs and their hierarchy\n --force, -f Force recalculate all values (not just missing ones)\n --date YYYY-MM-DD Target date for value calculation (default: today)\n --org orgScope Organization scope filter (default: all orgs)\n --orgs org1,org2 Multiple organization scopes (comma-separated)\n --version N KPI version filter (default: latest version)\n --help, -h Show this help\n\nExamples:\n ts-node server/scripts/propagate-parent-kpi-values.ts # Process all parent KPIs for today\n ts-node server/scripts/propagate-parent-kpi-values.ts --force # Recalculate ALL parent values\n ts-node server/scripts/propagate-parent-kpi-values.ts --date 2024-01-15 # Process for specific date\n ts-node server/scripts/propagate-parent-kpi-values.ts --org \"PROJECT-123\" # Process for specific org\n ts-node server/scripts/propagate-parent-kpi-values.ts --orgs \"ID1,ID2,ID3\" # Process multiple orgs\n ts-node server/scripts/propagate-parent-kpi-values.ts --version 2 # Process for specific version\n ts-node server/scripts/propagate-parent-kpi-values.ts \"상위 KPI명\" # Process specific parent KPI\n ts-node server/scripts/propagate-parent-kpi-values.ts --list # List parent KPI hierarchy\n\nNote: Processes parent KPIs from deepest level to root, calculating weighted averages.\n Child KPI scores and weights are used to calculate parent values.\n --orgs option processes multiple orgs with single initialization (faster).\n `)\n return\n }\n\n if (args.includes('--list') || args.includes('-l')) {\n await listParentKpiHierarchy()\n return\n }\n\n const forceRecalculate = args.includes('--force') || args.includes('-f')\n const dateIndex = args.indexOf('--date')\n const targetDate = dateIndex !== -1 && dateIndex + 1 < args.length ? args[dateIndex + 1] : undefined\n const orgIndex = args.indexOf('--org')\n const orgScope = orgIndex !== -1 && orgIndex + 1 < args.length ? args[orgIndex + 1] : undefined\n const orgsIndex = args.indexOf('--orgs')\n const orgScopesString = orgsIndex !== -1 && orgsIndex + 1 < args.length ? args[orgsIndex + 1] : undefined\n const orgScopes = orgScopesString ? orgScopesString.split(',') : undefined\n const versionIndex = args.indexOf('--version')\n const version = versionIndex !== -1 && versionIndex + 1 < args.length ? parseInt(args[versionIndex + 1]) : undefined\n const specificKpiName = args.find(\n arg =>\n !arg.startsWith('--') &&\n arg !== targetDate &&\n arg !== orgScope &&\n arg !== orgScopesString &&\n (version === undefined || arg !== version.toString())\n )\n\n // Use batch processing if multiple orgs specified\n if (orgScopes && orgScopes.length > 0) {\n console.log(`🎯 Propagating values for all parent KPIs (Batch mode)`)\n console.log(` Mode: ${forceRecalculate ? 'Force recalculate ALL' : 'Only missing values'}`)\n console.log(` Date: ${targetDate || 'today'}`)\n console.log(` Orgs: ${orgScopes.length} organizations`)\n console.log(` Version: ${version || 'latest'}`)\n await propagateParentKpiValuesBatch(orgScopes, specificKpiName, forceRecalculate, targetDate, version)\n } else if (specificKpiName) {\n console.log(`🎯 Propagating values for specific KPI: ${specificKpiName}`)\n console.log(` Mode: ${forceRecalculate ? 'Force recalculate ALL' : 'Only missing values'}`)\n console.log(` Date: ${targetDate || 'today'}`)\n console.log(` Org: ${orgScope || 'all'}`)\n console.log(` Version: ${version || 'latest'}`)\n await propagateParentKpiValues(specificKpiName, forceRecalculate, targetDate, orgScope, version)\n } else {\n console.log(`🎯 Propagating values for all parent KPIs`)\n console.log(` Mode: ${forceRecalculate ? 'Force recalculate ALL' : 'Only missing values'}`)\n console.log(` Date: ${targetDate || 'today'}`)\n console.log(` Org: ${orgScope || 'all'}`)\n console.log(` Version: ${version || 'latest'}`)\n await propagateParentKpiValues(undefined, forceRecalculate, targetDate, orgScope, version)\n }\n\n console.log('\\\\n✨ Done!')\n } catch (error) {\n console.error('\\\\n❌ Script failed:', error.message)\n process.exit(1)\n }\n}\n\n// Handle uncaught errors\nprocess.on('unhandledRejection', (error: any) => {\n console.error('❌ Unhandled error:', error.message || error)\n process.exit(1)\n})\n\n// Run if called directly\nif (require.main === module) {\n main()\n}\n"]}
|
|
@@ -37,12 +37,12 @@ let KpiStatQuery = class KpiStatQuery {
|
|
|
37
37
|
const results = await queryBuilder.getRawMany();
|
|
38
38
|
return results.map(result => {
|
|
39
39
|
const kpiName = result.kpiname;
|
|
40
|
-
const minVal = Number(result.minval);
|
|
41
|
-
const q1Val = Number(result.q1val);
|
|
42
|
-
const medVal = Number(result.medval);
|
|
43
|
-
const q3Val = Number(result.q3val);
|
|
44
|
-
const avgVal = Number(result.avgval);
|
|
45
|
-
const maxVal = Number(result.maxval);
|
|
40
|
+
const minVal = Math.min(Math.max(Number(result.minval), 0), 1);
|
|
41
|
+
const q1Val = Math.min(Math.max(Number(result.q1val), 0), 1);
|
|
42
|
+
const medVal = Math.min(Math.max(Number(result.medval), 0), 1);
|
|
43
|
+
const q3Val = Math.min(Math.max(Number(result.q3val), 0), 1);
|
|
44
|
+
const avgVal = Math.min(Math.max(Number(result.avgval), 0), 1);
|
|
45
|
+
const maxVal = Math.min(Math.max(Number(result.maxval), 0), 1);
|
|
46
46
|
const projectCount = Number(result.projectcount);
|
|
47
47
|
return {
|
|
48
48
|
kpiName: kpiName,
|
|
@@ -86,12 +86,12 @@ let KpiStatQuery = class KpiStatQuery {
|
|
|
86
86
|
const results = await queryBuilder.getRawMany();
|
|
87
87
|
return results.map(result => {
|
|
88
88
|
const kpiName = result.kpiname;
|
|
89
|
-
const minVal = Number(result.minval);
|
|
90
|
-
const q1Val = Number(result.q1val);
|
|
91
|
-
const medVal = Number(result.medval);
|
|
92
|
-
const q3Val = Number(result.q3val);
|
|
93
|
-
const avgVal = Number(result.avgval);
|
|
94
|
-
const maxVal = Number(result.maxval);
|
|
89
|
+
const minVal = Math.min(Math.max(Number(result.minval), 0), 1);
|
|
90
|
+
const q1Val = Math.min(Math.max(Number(result.q1val), 0), 1);
|
|
91
|
+
const medVal = Math.min(Math.max(Number(result.medval), 0), 1);
|
|
92
|
+
const q3Val = Math.min(Math.max(Number(result.q3val), 0), 1);
|
|
93
|
+
const avgVal = Math.min(Math.max(Number(result.avgval), 0), 1);
|
|
94
|
+
const maxVal = Math.min(Math.max(Number(result.maxval), 0), 1);
|
|
95
95
|
const projectCount = Number(result.projectcount);
|
|
96
96
|
return {
|
|
97
97
|
kpiName: kpiName,
|
|
@@ -164,12 +164,12 @@ let KpiStatQuery = class KpiStatQuery {
|
|
|
164
164
|
return results
|
|
165
165
|
.map(result => {
|
|
166
166
|
const kpiName = result.kpiname;
|
|
167
|
-
const minVal = Number(result.minval);
|
|
168
|
-
const q1Val = Number(result.q1val);
|
|
169
|
-
const medVal = Number(result.medval);
|
|
170
|
-
const q3Val = Number(result.q3val);
|
|
171
|
-
const maxVal = Number(result.maxval);
|
|
172
|
-
const avgVal = Number(result.avgval);
|
|
167
|
+
const minVal = Math.min(Math.max(Number(result.minval), 0), 1);
|
|
168
|
+
const q1Val = Math.min(Math.max(Number(result.q1val), 0), 1);
|
|
169
|
+
const medVal = Math.min(Math.max(Number(result.medval), 0), 1);
|
|
170
|
+
const q3Val = Math.min(Math.max(Number(result.q3val), 0), 1);
|
|
171
|
+
const maxVal = Math.min(Math.max(Number(result.maxval), 0), 1);
|
|
172
|
+
const avgVal = Math.min(Math.max(Number(result.avgval), 0), 1);
|
|
173
173
|
const projectCount = Number(result.projectcount);
|
|
174
174
|
return {
|
|
175
175
|
kpiName: kpiName,
|
|
@@ -214,12 +214,12 @@ let KpiStatQuery = class KpiStatQuery {
|
|
|
214
214
|
return results
|
|
215
215
|
.map(result => {
|
|
216
216
|
const kpiName = result.kpiname;
|
|
217
|
-
const minVal = Number(result.minval);
|
|
218
|
-
const q1Val = Number(result.q1val);
|
|
219
|
-
const medVal = Number(result.medval);
|
|
220
|
-
const q3Val = Number(result.q3val);
|
|
221
|
-
const maxVal = Number(result.maxval);
|
|
222
|
-
const avgVal = Number(result.avgval);
|
|
217
|
+
const minVal = Math.min(Math.max(Number(result.minval), 0), 1);
|
|
218
|
+
const q1Val = Math.min(Math.max(Number(result.q1val), 0), 1);
|
|
219
|
+
const medVal = Math.min(Math.max(Number(result.medval), 0), 1);
|
|
220
|
+
const q3Val = Math.min(Math.max(Number(result.q3val), 0), 1);
|
|
221
|
+
const maxVal = Math.min(Math.max(Number(result.maxval), 0), 1);
|
|
222
|
+
const avgVal = Math.min(Math.max(Number(result.avgval), 0), 1);
|
|
223
223
|
const projectCount = Number(result.projectcount);
|
|
224
224
|
return {
|
|
225
225
|
kpiName: kpiName,
|
|
@@ -286,7 +286,7 @@ let KpiStatQuery = class KpiStatQuery {
|
|
|
286
286
|
const results = await queryBuilder.getRawMany();
|
|
287
287
|
return results
|
|
288
288
|
.map(result => {
|
|
289
|
-
const avgVal = Number(result.avgval);
|
|
289
|
+
const avgVal = Math.min(Math.max(Number(result.avgval), 0), 1);
|
|
290
290
|
const projectCount = Number(result.projectcount);
|
|
291
291
|
return {
|
|
292
292
|
geoGroup: result.geogroup || null,
|
|
@@ -353,12 +353,12 @@ let KpiStatQuery = class KpiStatQuery {
|
|
|
353
353
|
const results = await queryBuilder.getRawMany();
|
|
354
354
|
return results.map(result => {
|
|
355
355
|
const kpiName = result.kpiname;
|
|
356
|
-
const minVal = Number(result.minval);
|
|
357
|
-
const q1Val = Number(result.q1val);
|
|
358
|
-
const medVal = Number(result.medval);
|
|
359
|
-
const q3Val = Number(result.q3val);
|
|
360
|
-
const avgVal = Number(result.avgval);
|
|
361
|
-
const maxVal = Number(result.maxval);
|
|
356
|
+
const minVal = Math.min(Math.max(Number(result.minval), 0), 1);
|
|
357
|
+
const q1Val = Math.min(Math.max(Number(result.q1val), 0), 1);
|
|
358
|
+
const medVal = Math.min(Math.max(Number(result.medval), 0), 1);
|
|
359
|
+
const q3Val = Math.min(Math.max(Number(result.q3val), 0), 1);
|
|
360
|
+
const avgVal = Math.min(Math.max(Number(result.avgval), 0), 1);
|
|
361
|
+
const maxVal = Math.min(Math.max(Number(result.maxval), 0), 1);
|
|
362
362
|
const projectCount = Number(result.projectcount);
|
|
363
363
|
return {
|
|
364
364
|
kpiName: kpiName,
|
|
@@ -396,7 +396,9 @@ tslib_1.__decorate([
|
|
|
396
396
|
], KpiStatQuery.prototype, "totalKpiYValueComprehensiveStats", null);
|
|
397
397
|
tslib_1.__decorate([
|
|
398
398
|
(0, type_graphql_1.Directive)('@privilege(category: "kpi", privilege: "query", domainOwnerGranted: true, superUserGranted: true)'),
|
|
399
|
-
(0, type_graphql_1.Query)(() => [kpi_stat_types_1.KpiComprehensiveStatsByGeoGroup], {
|
|
399
|
+
(0, type_graphql_1.Query)(() => [kpi_stat_types_1.KpiComprehensiveStatsByGeoGroup], {
|
|
400
|
+
description: 'Get KPI box plot statistics for Z-category KPIs by metro area'
|
|
401
|
+
}),
|
|
400
402
|
tslib_1.__param(0, (0, type_graphql_1.Arg)('geoGroup', { nullable: true })),
|
|
401
403
|
tslib_1.__param(1, (0, type_graphql_1.Arg)('kpiName', { nullable: true })),
|
|
402
404
|
tslib_1.__param(2, (0, type_graphql_1.Arg)('startYearMonth', { nullable: true })),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kpi-stat-query.js","sourceRoot":"","sources":["../../../server/service/kpi-stat/kpi-stat-query.ts"],"names":[],"mappings":"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","sourcesContent":["import { Resolver, Query, Arg, Ctx, Directive } from 'type-graphql'\nimport { getRepository } from '@things-factory/shell'\nimport type ResolverContext from '@things-factory/auth-base'\nimport { KpiStatistic } from '@things-factory/kpi'\nimport { KpiComprehensiveStats, KpiComprehensiveStatsByGeoGroup, KpiMonthlyTrend } from './kpi-stat-types'\n\n@Resolver(KpiStatistic)\nexport class KpiStatQuery {\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(() => [KpiComprehensiveStats], { description: 'Get KPI box plot statistics for Z-category KPIs for all projects' })\n async totalKpiZValueComprehensiveStats(\n @Arg('startYearMonth', { nullable: true }) startYearMonth?: string,\n @Arg('endYearMonth', { nullable: true }) endYearMonth?: string,\n @Ctx() context?: ResolverContext\n ): Promise<KpiComprehensiveStats[]> {\n const { domain } = context.state\n\n const queryBuilder = getRepository('kpi_values')\n .createQueryBuilder('kv')\n .select([\n 'k.name as kpiName',\n 'MIN(kv.score) as minVal',\n 'PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY kv.score) as q1Val',\n 'PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY kv.score) as medVal',\n 'PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY kv.score) as q3Val',\n 'AVG(kv.score) as avgVal',\n 'MAX(kv.score) as maxVal',\n 'COUNT(DISTINCT p.id) as projectCount'\n ])\n .innerJoin('kpis', 'k', 'kv.kpi_id = k.id')\n .innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')\n .where('k.name LIKE :pattern', { pattern: 'Z%' })\n .andWhere('p.end_date IS NOT NULL')\n .andWhere('kv.domain_id = :domainId', { domainId: domain.id })\n\n // 기간 필터\n if (startYearMonth && startYearMonth.trim() !== '') {\n queryBuilder.andWhere(`TO_CHAR(p.end_date, 'YYYY-MM') >= :startYearMonth`, { startYearMonth })\n }\n if (endYearMonth && endYearMonth.trim() !== '') {\n queryBuilder.andWhere(`TO_CHAR(p.end_date, 'YYYY-MM') <= :endYearMonth`, { endYearMonth })\n }\n\n queryBuilder.groupBy('k.name')\n\n const results = await queryBuilder.getRawMany()\n\n return results.map(result => {\n const kpiName = result.kpiname\n const minVal = Number(result.minval)\n const q1Val = Number(result.q1val)\n const medVal = Number(result.medval)\n const q3Val = Number(result.q3val)\n const avgVal = Number(result.avgval)\n const maxVal = Number(result.maxval)\n const projectCount = Number(result.projectcount)\n\n return {\n kpiName: kpiName,\n minVal: isNaN(minVal) ? 0 : minVal,\n q1Val: isNaN(q1Val) ? 0 : q1Val,\n medVal: isNaN(medVal) ? 0 : medVal,\n q3Val: isNaN(q3Val) ? 0 : q3Val,\n maxVal: isNaN(maxVal) ? 0 : maxVal,\n avgVal: isNaN(avgVal) ? 0 : avgVal,\n projectCount: isNaN(projectCount) ? 0 : projectCount\n }\n })\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(() => [KpiComprehensiveStats], { description: 'Get KPI box plot statistics for Y-category KPIs for all projects' })\n async totalKpiYValueComprehensiveStats(\n @Arg('startYearMonth', { nullable: true }) startYearMonth?: string,\n @Arg('endYearMonth', { nullable: true }) endYearMonth?: string,\n @Ctx() context?: ResolverContext\n ): Promise<KpiComprehensiveStats[]> {\n const { domain } = context.state\n\n const queryBuilder = getRepository('kpi_values')\n .createQueryBuilder('kv')\n .select([\n 'k.name as kpiName',\n 'MIN(kv.score) as minVal',\n 'PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY kv.score) as q1Val',\n 'PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY kv.score) as medVal',\n 'PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY kv.score) as q3Val',\n 'AVG(kv.score) as avgVal',\n 'MAX(kv.score) as maxVal',\n 'COUNT(DISTINCT p.id) as projectCount'\n ])\n .innerJoin('kpis', 'k', 'kv.kpi_id = k.id')\n .innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')\n .where('k.name LIKE :pattern', { pattern: 'Y%' })\n .andWhere('p.end_date IS NOT NULL')\n .andWhere('kv.domain_id = :domainId', { domainId: domain.id })\n\n // 기간 필터\n if (startYearMonth && startYearMonth.trim() !== '') {\n queryBuilder.andWhere(`TO_CHAR(p.end_date, 'YYYY-MM') >= :startYearMonth`, { startYearMonth })\n }\n if (endYearMonth && endYearMonth.trim() !== '') {\n queryBuilder.andWhere(`TO_CHAR(p.end_date, 'YYYY-MM') <= :endYearMonth`, { endYearMonth })\n }\n\n queryBuilder.groupBy('k.name').orderBy('k.name', 'ASC')\n\n const results = await queryBuilder.getRawMany()\n\n return results.map(result => {\n const kpiName = result.kpiname\n const minVal = Number(result.minval)\n const q1Val = Number(result.q1val)\n const medVal = Number(result.medval)\n const q3Val = Number(result.q3val)\n const avgVal = Number(result.avgval)\n const maxVal = Number(result.maxval)\n const projectCount = Number(result.projectcount)\n\n return {\n kpiName: kpiName,\n minVal: isNaN(minVal) ? 0 : minVal,\n q1Val: isNaN(q1Val) ? 0 : q1Val,\n medVal: isNaN(medVal) ? 0 : medVal,\n q3Val: isNaN(q3Val) ? 0 : q3Val,\n maxVal: isNaN(maxVal) ? 0 : maxVal,\n avgVal: isNaN(avgVal) ? 0 : avgVal,\n projectCount: isNaN(projectCount) ? 0 : projectCount\n }\n })\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(() => [KpiComprehensiveStatsByGeoGroup], { description: 'Get KPI box plot statistics for Z-category KPIs by metro area' })\n async kpiZValueComprehensiveStatsByGeoGroup(\n @Arg('geoGroup', { nullable: true }) geoGroup?: string,\n @Arg('kpiName', { nullable: true }) kpiName?: string,\n @Arg('startYearMonth', { nullable: true }) startYearMonth?: string,\n @Arg('endYearMonth', { nullable: true }) endYearMonth?: string,\n @Ctx() context?: ResolverContext\n ): Promise<KpiComprehensiveStatsByGeoGroup[]> {\n const { domain } = context.state\n\n const queryBuilder = getRepository('kpi_values')\n .createQueryBuilder('kv')\n .select([\n `CASE\n WHEN p.geo_group IN ('01','02','03','04','05','06','07','08') THEN '서울특별시'\n WHEN p.geo_group IN ('46','47','48','49') THEN '부산광역시'\n WHEN p.geo_group IN ('41','42','43') THEN '대구광역시'\n WHEN p.geo_group IN ('21','22','23') THEN '인천광역시'\n WHEN p.geo_group IN ('61','62') THEN '광주광역시'\n WHEN p.geo_group IN ('34','35') THEN '대전광역시'\n WHEN p.geo_group IN ('44','45') THEN '울산광역시'\n WHEN p.geo_group = '30' THEN '세종특별자치시'\n WHEN p.geo_group IN ('10','11','12','13','14','15','16','17','18') THEN '경기도'\n WHEN p.geo_group IN ('24','25','26','33') THEN '강원도'\n WHEN p.geo_group IN ('27','28','29') THEN '충청북도'\n WHEN p.geo_group IN ('31','32') THEN '충청남도'\n WHEN p.geo_group IN ('54','55','56') THEN '전라북도'\n WHEN p.geo_group IN ('57','58','59') THEN '전라남도'\n WHEN p.geo_group IN ('36','37','38','39','40') THEN '경상북도'\n WHEN p.geo_group IN ('50','51','52','53') THEN '경상남도'\n WHEN p.geo_group = '63' THEN '제주특별자치도'\n END as geoGroup`,\n 'MIN(kv.score) as minVal',\n 'PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY kv.score) as q1Val',\n 'PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY kv.score) as medVal',\n 'PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY kv.score) as q3Val',\n 'MAX(kv.score) as maxVal',\n 'AVG(kv.score) as avgVal',\n 'COUNT(DISTINCT p.id) as projectCount'\n ])\n .innerJoin('kpis', 'k', 'kv.kpi_id = k.id')\n .innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')\n .where('p.end_date IS NOT NULL')\n .andWhere('p.geo_group IS NOT NULL')\n .andWhere('kv.domain_id = :domainId', { domainId: domain.id })\n\n // 기간 필터\n if (startYearMonth && startYearMonth.trim() !== '') {\n queryBuilder.andWhere(`TO_CHAR(p.end_date, 'YYYY-MM') >= :startYearMonth`, { startYearMonth })\n }\n if (endYearMonth && endYearMonth.trim() !== '') {\n queryBuilder.andWhere(`TO_CHAR(p.end_date, 'YYYY-MM') <= :endYearMonth`, { endYearMonth })\n }\n\n // KPI 필터: kpiName이 지정되면 해당 Y-level KPI만, 없으면 Z-level KPI 전체\n if (kpiName && kpiName.trim() !== '') {\n queryBuilder.andWhere('k.name = :kpiName', { kpiName })\n } else {\n queryBuilder.andWhere('k.name LIKE :pattern', { pattern: 'Z%' })\n }\n\n queryBuilder.groupBy('geoGroup')\n\n if (geoGroup && geoGroup.trim() !== '') {\n queryBuilder.having('geoGroup = :geoGroup', { geoGroup })\n }\n\n const results = await queryBuilder.getRawMany()\n return results\n .map(result => {\n const kpiName = result.kpiname\n const minVal = Number(result.minval)\n const q1Val = Number(result.q1val)\n const medVal = Number(result.medval)\n const q3Val = Number(result.q3val)\n const maxVal = Number(result.maxval)\n const avgVal = Number(result.avgval)\n const projectCount = Number(result.projectcount)\n\n return {\n kpiName: kpiName,\n geoGroup: result.geogroup || null,\n minVal: isNaN(minVal) ? 0 : minVal,\n q1Val: isNaN(q1Val) ? 0 : q1Val,\n medVal: isNaN(medVal) ? 0 : medVal,\n q3Val: isNaN(q3Val) ? 0 : q3Val,\n maxVal: isNaN(maxVal) ? 0 : maxVal,\n avgVal: isNaN(avgVal) ? 0 : avgVal,\n projectCount: isNaN(projectCount) ? 0 : projectCount\n }\n })\n .filter(result => result.geoGroup !== null)\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(() => [KpiComprehensiveStatsByGeoGroup], { description: 'Get KPI box plot statistics for Y-category KPIs by geo group' })\n async kpiYValueComprehensiveStatsByGeoGroup(\n @Arg('geoGroup', { nullable: true }) geoGroup?: string,\n @Ctx() context?: ResolverContext\n ): Promise<KpiComprehensiveStatsByGeoGroup[]> {\n const { domain } = context.state\n\n const queryBuilder = getRepository('kpi_values')\n .createQueryBuilder('kv')\n .select([\n 'p.geo_group as geoGroup',\n 'k.name as kpiName',\n 'MIN(kv.score) as minVal',\n 'PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY kv.score) as q1Val',\n 'PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY kv.score) as medVal',\n 'PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY kv.score) as q3Val',\n 'MAX(kv.score) as maxVal',\n 'AVG(kv.score) as avgVal',\n 'COUNT(DISTINCT p.id) as projectCount'\n ])\n .innerJoin('kpis', 'k', 'kv.kpi_id = k.id')\n .innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')\n .where('k.name LIKE :pattern', { pattern: 'Y%' })\n .andWhere('p.end_date IS NOT NULL')\n .andWhere('p.geo_group IS NOT NULL')\n .andWhere('kv.domain_id = :domainId', { domainId: domain.id })\n .groupBy('p.geo_group, k.name')\n\n if (geoGroup && geoGroup.trim() !== '') {\n queryBuilder.andWhere('p.geo_group LIKE :geoGroup', { geoGroup: `%${geoGroup}%` })\n }\n\n const results = await queryBuilder.getRawMany()\n return results\n .map(result => {\n const kpiName = result.kpiname\n const minVal = Number(result.minval)\n const q1Val = Number(result.q1val)\n const medVal = Number(result.medval)\n const q3Val = Number(result.q3val)\n const maxVal = Number(result.maxval)\n const avgVal = Number(result.avgval)\n const projectCount = Number(result.projectcount)\n\n return {\n kpiName: kpiName,\n geoGroup: result.geogroup || null,\n minVal: isNaN(minVal) ? 0 : minVal,\n q1Val: isNaN(q1Val) ? 0 : q1Val,\n medVal: isNaN(medVal) ? 0 : medVal,\n q3Val: isNaN(q3Val) ? 0 : q3Val,\n maxVal: isNaN(maxVal) ? 0 : maxVal,\n avgVal: isNaN(avgVal) ? 0 : avgVal,\n projectCount: isNaN(projectCount) ? 0 : projectCount\n }\n })\n .filter(result => result.geoGroup !== null)\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(() => [KpiMonthlyTrend], { description: 'Get monthly KPI trend for Z-category KPIs by metro area' })\n async kpiZValueMonthlyTrendByGeoGroup(\n @Arg('kpiName', { nullable: true }) kpiName?: string,\n @Arg('startYearMonth', { nullable: true }) startYearMonth?: string,\n @Arg('endYearMonth', { nullable: true }) endYearMonth?: string,\n @Ctx() context?: ResolverContext\n ): Promise<KpiMonthlyTrend[]> {\n const { domain } = context.state\n\n const queryBuilder = getRepository('kpi_values')\n .createQueryBuilder('kv')\n .select([\n `CASE\n WHEN p.geo_group IN ('01','02','03','04','05','06','07','08') THEN '서울특별시'\n WHEN p.geo_group IN ('46','47','48','49') THEN '부산광역시'\n WHEN p.geo_group IN ('41','42','43') THEN '대구광역시'\n WHEN p.geo_group IN ('21','22','23') THEN '인천광역시'\n WHEN p.geo_group IN ('61','62') THEN '광주광역시'\n WHEN p.geo_group IN ('34','35') THEN '대전광역시'\n WHEN p.geo_group IN ('44','45') THEN '울산광역시'\n WHEN p.geo_group = '30' THEN '세종특별자치시'\n WHEN p.geo_group IN ('10','11','12','13','14','15','16','17','18') THEN '경기도'\n WHEN p.geo_group IN ('24','25','26','33') THEN '강원도'\n WHEN p.geo_group IN ('27','28','29') THEN '충청북도'\n WHEN p.geo_group IN ('31','32') THEN '충청남도'\n WHEN p.geo_group IN ('54','55','56') THEN '전라북도'\n WHEN p.geo_group IN ('57','58','59') THEN '전라남도'\n WHEN p.geo_group IN ('36','37','38','39','40') THEN '경상북도'\n WHEN p.geo_group IN ('50','51','52','53') THEN '경상남도'\n WHEN p.geo_group = '63' THEN '제주특별자치도'\n END as geoGroup`,\n `TO_CHAR(p.end_date, 'YYYY-MM') as yearMonth`,\n 'AVG(kv.score) as avgVal',\n 'COUNT(DISTINCT p.id) as projectCount'\n ])\n .innerJoin('kpis', 'k', 'kv.kpi_id = k.id')\n .innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')\n .where('p.end_date IS NOT NULL')\n .andWhere('p.geo_group IS NOT NULL')\n .andWhere('kv.domain_id = :domainId', { domainId: domain.id })\n\n // 기간 필터\n if (startYearMonth && startYearMonth.trim() !== '') {\n queryBuilder.andWhere(`TO_CHAR(p.end_date, 'YYYY-MM') >= :startYearMonth`, { startYearMonth })\n }\n if (endYearMonth && endYearMonth.trim() !== '') {\n queryBuilder.andWhere(`TO_CHAR(p.end_date, 'YYYY-MM') <= :endYearMonth`, { endYearMonth })\n }\n\n // KPI 필터: kpiName이 지정되면 해당 Y-level KPI만, 없으면 Z-level KPI 전체\n if (kpiName && kpiName.trim() !== '') {\n queryBuilder.andWhere('k.name = :kpiName', { kpiName })\n } else {\n queryBuilder.andWhere('k.name LIKE :pattern', { pattern: 'Z%' })\n }\n\n queryBuilder.groupBy('geoGroup, yearMonth').orderBy('yearMonth', 'ASC')\n\n const results = await queryBuilder.getRawMany()\n return results\n .map(result => {\n const avgVal = Number(result.avgval)\n const projectCount = Number(result.projectcount)\n\n return {\n geoGroup: result.geogroup || null,\n yearMonth: result.yearmonth,\n avgVal: isNaN(avgVal) ? 0 : avgVal,\n projectCount: isNaN(projectCount) ? 0 : projectCount\n }\n })\n .filter(result => result.geoGroup !== null)\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(() => [KpiComprehensiveStats], { description: 'Get KPI statistics for Y-category KPIs by specific metro area' })\n async kpiYValueStatsByMetroArea(\n @Arg('metroArea') metroArea: string,\n @Arg('startYearMonth', { nullable: true }) startYearMonth?: string,\n @Arg('endYearMonth', { nullable: true }) endYearMonth?: string,\n @Ctx() context?: ResolverContext\n ): Promise<KpiComprehensiveStats[]> {\n if (!context || !context.state) {\n console.error('Context is undefined or missing state')\n return []\n }\n\n const { domain } = context.state\n\n const queryBuilder = getRepository('kpi_values')\n .createQueryBuilder('kv')\n .select([\n 'k.name as kpiName',\n 'MIN(kv.score) as minVal',\n 'PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY kv.score) as q1Val',\n 'PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY kv.score) as medVal',\n 'PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY kv.score) as q3Val',\n 'MAX(kv.score) as maxVal',\n 'AVG(kv.score) as avgVal',\n 'COUNT(DISTINCT p.id) as projectCount'\n ])\n .innerJoin('kpis', 'k', 'kv.kpi_id = k.id')\n .innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')\n .where('k.name LIKE :pattern', { pattern: 'Y%' })\n .andWhere('p.end_date IS NOT NULL')\n .andWhere('p.geo_group IS NOT NULL')\n .andWhere('kv.domain_id = :domainId', { domainId: domain.id })\n\n // 기간 필터\n if (startYearMonth && startYearMonth.trim() !== '') {\n queryBuilder.andWhere(`TO_CHAR(p.end_date, 'YYYY-MM') >= :startYearMonth`, { startYearMonth })\n }\n if (endYearMonth && endYearMonth.trim() !== '') {\n queryBuilder.andWhere(`TO_CHAR(p.end_date, 'YYYY-MM') <= :endYearMonth`, { endYearMonth })\n }\n\n queryBuilder\n .andWhere(\n `CASE\n WHEN p.geo_group IN ('01','02','03','04','05','06','07','08') THEN '서울특별시'\n WHEN p.geo_group IN ('46','47','48','49') THEN '부산광역시'\n WHEN p.geo_group IN ('41','42','43') THEN '대구광역시'\n WHEN p.geo_group IN ('21','22','23') THEN '인천광역시'\n WHEN p.geo_group IN ('61','62') THEN '광주광역시'\n WHEN p.geo_group IN ('34','35') THEN '대전광역시'\n WHEN p.geo_group IN ('44','45') THEN '울산광역시'\n WHEN p.geo_group = '30' THEN '세종특별자치시'\n WHEN p.geo_group IN ('10','11','12','13','14','15','16','17','18') THEN '경기도'\n WHEN p.geo_group IN ('24','25','26','33') THEN '강원도'\n WHEN p.geo_group IN ('27','28','29') THEN '충청북도'\n WHEN p.geo_group IN ('31','32') THEN '충청남도'\n WHEN p.geo_group IN ('54','55','56') THEN '전라북도'\n WHEN p.geo_group IN ('57','58','59') THEN '전라남도'\n WHEN p.geo_group IN ('36','37','38','39','40') THEN '경상북도'\n WHEN p.geo_group IN ('50','51','52','53') THEN '경상남도'\n WHEN p.geo_group = '63' THEN '제주특별자치도'\n END = :metroArea`,\n { metroArea }\n )\n .groupBy('k.name')\n .orderBy('k.name', 'ASC')\n\n const results = await queryBuilder.getRawMany()\n\n return results.map(result => {\n const kpiName = result.kpiname\n const minVal = Number(result.minval)\n const q1Val = Number(result.q1val)\n const medVal = Number(result.medval)\n const q3Val = Number(result.q3val)\n const avgVal = Number(result.avgval)\n const maxVal = Number(result.maxval)\n const projectCount = Number(result.projectcount)\n\n return {\n kpiName: kpiName,\n minVal: isNaN(minVal) ? 0 : minVal,\n q1Val: isNaN(q1Val) ? 0 : q1Val,\n medVal: isNaN(medVal) ? 0 : medVal,\n q3Val: isNaN(q3Val) ? 0 : q3Val,\n maxVal: isNaN(maxVal) ? 0 : maxVal,\n avgVal: isNaN(avgVal) ? 0 : avgVal,\n projectCount: isNaN(projectCount) ? 0 : projectCount\n }\n })\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"kpi-stat-query.js","sourceRoot":"","sources":["../../../server/service/kpi-stat/kpi-stat-query.ts"],"names":[],"mappings":"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","sourcesContent":["import { Resolver, Query, Arg, Ctx, Directive } from 'type-graphql'\nimport { getRepository } from '@things-factory/shell'\nimport type ResolverContext from '@things-factory/auth-base'\nimport { KpiStatistic } from '@things-factory/kpi'\nimport { KpiComprehensiveStats, KpiComprehensiveStatsByGeoGroup, KpiMonthlyTrend } from './kpi-stat-types'\n\n@Resolver(KpiStatistic)\nexport class KpiStatQuery {\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(() => [KpiComprehensiveStats], { description: 'Get KPI box plot statistics for Z-category KPIs for all projects' })\n async totalKpiZValueComprehensiveStats(\n @Arg('startYearMonth', { nullable: true }) startYearMonth?: string,\n @Arg('endYearMonth', { nullable: true }) endYearMonth?: string,\n @Ctx() context?: ResolverContext\n ): Promise<KpiComprehensiveStats[]> {\n const { domain } = context.state\n\n const queryBuilder = getRepository('kpi_values')\n .createQueryBuilder('kv')\n .select([\n 'k.name as kpiName',\n 'MIN(kv.score) as minVal',\n 'PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY kv.score) as q1Val',\n 'PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY kv.score) as medVal',\n 'PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY kv.score) as q3Val',\n 'AVG(kv.score) as avgVal',\n 'MAX(kv.score) as maxVal',\n 'COUNT(DISTINCT p.id) as projectCount'\n ])\n .innerJoin('kpis', 'k', 'kv.kpi_id = k.id')\n .innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')\n .where('k.name LIKE :pattern', { pattern: 'Z%' })\n .andWhere('p.end_date IS NOT NULL')\n .andWhere('kv.domain_id = :domainId', { domainId: domain.id })\n\n // 기간 필터\n if (startYearMonth && startYearMonth.trim() !== '') {\n queryBuilder.andWhere(`TO_CHAR(p.end_date, 'YYYY-MM') >= :startYearMonth`, { startYearMonth })\n }\n if (endYearMonth && endYearMonth.trim() !== '') {\n queryBuilder.andWhere(`TO_CHAR(p.end_date, 'YYYY-MM') <= :endYearMonth`, { endYearMonth })\n }\n\n queryBuilder.groupBy('k.name')\n\n const results = await queryBuilder.getRawMany()\n\n return results.map(result => {\n const kpiName = result.kpiname\n const minVal = Math.min(Math.max(Number(result.minval), 0), 1)\n const q1Val = Math.min(Math.max(Number(result.q1val), 0), 1)\n const medVal = Math.min(Math.max(Number(result.medval), 0), 1)\n const q3Val = Math.min(Math.max(Number(result.q3val), 0), 1)\n const avgVal = Math.min(Math.max(Number(result.avgval), 0), 1)\n const maxVal = Math.min(Math.max(Number(result.maxval), 0), 1)\n const projectCount = Number(result.projectcount)\n\n return {\n kpiName: kpiName,\n minVal: isNaN(minVal) ? 0 : minVal,\n q1Val: isNaN(q1Val) ? 0 : q1Val,\n medVal: isNaN(medVal) ? 0 : medVal,\n q3Val: isNaN(q3Val) ? 0 : q3Val,\n maxVal: isNaN(maxVal) ? 0 : maxVal,\n avgVal: isNaN(avgVal) ? 0 : avgVal,\n projectCount: isNaN(projectCount) ? 0 : projectCount\n }\n })\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(() => [KpiComprehensiveStats], { description: 'Get KPI box plot statistics for Y-category KPIs for all projects' })\n async totalKpiYValueComprehensiveStats(\n @Arg('startYearMonth', { nullable: true }) startYearMonth?: string,\n @Arg('endYearMonth', { nullable: true }) endYearMonth?: string,\n @Ctx() context?: ResolverContext\n ): Promise<KpiComprehensiveStats[]> {\n const { domain } = context.state\n\n const queryBuilder = getRepository('kpi_values')\n .createQueryBuilder('kv')\n .select([\n 'k.name as kpiName',\n 'MIN(kv.score) as minVal',\n 'PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY kv.score) as q1Val',\n 'PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY kv.score) as medVal',\n 'PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY kv.score) as q3Val',\n 'AVG(kv.score) as avgVal',\n 'MAX(kv.score) as maxVal',\n 'COUNT(DISTINCT p.id) as projectCount'\n ])\n .innerJoin('kpis', 'k', 'kv.kpi_id = k.id')\n .innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')\n .where('k.name LIKE :pattern', { pattern: 'Y%' })\n .andWhere('p.end_date IS NOT NULL')\n .andWhere('kv.domain_id = :domainId', { domainId: domain.id })\n\n // 기간 필터\n if (startYearMonth && startYearMonth.trim() !== '') {\n queryBuilder.andWhere(`TO_CHAR(p.end_date, 'YYYY-MM') >= :startYearMonth`, { startYearMonth })\n }\n if (endYearMonth && endYearMonth.trim() !== '') {\n queryBuilder.andWhere(`TO_CHAR(p.end_date, 'YYYY-MM') <= :endYearMonth`, { endYearMonth })\n }\n\n queryBuilder.groupBy('k.name').orderBy('k.name', 'ASC')\n\n const results = await queryBuilder.getRawMany()\n\n return results.map(result => {\n const kpiName = result.kpiname\n const minVal = Math.min(Math.max(Number(result.minval), 0), 1)\n const q1Val = Math.min(Math.max(Number(result.q1val), 0), 1)\n const medVal = Math.min(Math.max(Number(result.medval), 0), 1)\n const q3Val = Math.min(Math.max(Number(result.q3val), 0), 1)\n const avgVal = Math.min(Math.max(Number(result.avgval), 0), 1)\n const maxVal = Math.min(Math.max(Number(result.maxval), 0), 1)\n const projectCount = Number(result.projectcount)\n\n return {\n kpiName: kpiName,\n minVal: isNaN(minVal) ? 0 : minVal,\n q1Val: isNaN(q1Val) ? 0 : q1Val,\n medVal: isNaN(medVal) ? 0 : medVal,\n q3Val: isNaN(q3Val) ? 0 : q3Val,\n maxVal: isNaN(maxVal) ? 0 : maxVal,\n avgVal: isNaN(avgVal) ? 0 : avgVal,\n projectCount: isNaN(projectCount) ? 0 : projectCount\n }\n })\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(() => [KpiComprehensiveStatsByGeoGroup], {\n description: 'Get KPI box plot statistics for Z-category KPIs by metro area'\n })\n async kpiZValueComprehensiveStatsByGeoGroup(\n @Arg('geoGroup', { nullable: true }) geoGroup?: string,\n @Arg('kpiName', { nullable: true }) kpiName?: string,\n @Arg('startYearMonth', { nullable: true }) startYearMonth?: string,\n @Arg('endYearMonth', { nullable: true }) endYearMonth?: string,\n @Ctx() context?: ResolverContext\n ): Promise<KpiComprehensiveStatsByGeoGroup[]> {\n const { domain } = context.state\n\n const queryBuilder = getRepository('kpi_values')\n .createQueryBuilder('kv')\n .select([\n `CASE\n WHEN p.geo_group IN ('01','02','03','04','05','06','07','08') THEN '서울특별시'\n WHEN p.geo_group IN ('46','47','48','49') THEN '부산광역시'\n WHEN p.geo_group IN ('41','42','43') THEN '대구광역시'\n WHEN p.geo_group IN ('21','22','23') THEN '인천광역시'\n WHEN p.geo_group IN ('61','62') THEN '광주광역시'\n WHEN p.geo_group IN ('34','35') THEN '대전광역시'\n WHEN p.geo_group IN ('44','45') THEN '울산광역시'\n WHEN p.geo_group = '30' THEN '세종특별자치시'\n WHEN p.geo_group IN ('10','11','12','13','14','15','16','17','18') THEN '경기도'\n WHEN p.geo_group IN ('24','25','26','33') THEN '강원도'\n WHEN p.geo_group IN ('27','28','29') THEN '충청북도'\n WHEN p.geo_group IN ('31','32') THEN '충청남도'\n WHEN p.geo_group IN ('54','55','56') THEN '전라북도'\n WHEN p.geo_group IN ('57','58','59') THEN '전라남도'\n WHEN p.geo_group IN ('36','37','38','39','40') THEN '경상북도'\n WHEN p.geo_group IN ('50','51','52','53') THEN '경상남도'\n WHEN p.geo_group = '63' THEN '제주특별자치도'\n END as geoGroup`,\n 'MIN(kv.score) as minVal',\n 'PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY kv.score) as q1Val',\n 'PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY kv.score) as medVal',\n 'PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY kv.score) as q3Val',\n 'MAX(kv.score) as maxVal',\n 'AVG(kv.score) as avgVal',\n 'COUNT(DISTINCT p.id) as projectCount'\n ])\n .innerJoin('kpis', 'k', 'kv.kpi_id = k.id')\n .innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')\n .where('p.end_date IS NOT NULL')\n .andWhere('p.geo_group IS NOT NULL')\n .andWhere('kv.domain_id = :domainId', { domainId: domain.id })\n\n // 기간 필터\n if (startYearMonth && startYearMonth.trim() !== '') {\n queryBuilder.andWhere(`TO_CHAR(p.end_date, 'YYYY-MM') >= :startYearMonth`, { startYearMonth })\n }\n if (endYearMonth && endYearMonth.trim() !== '') {\n queryBuilder.andWhere(`TO_CHAR(p.end_date, 'YYYY-MM') <= :endYearMonth`, { endYearMonth })\n }\n\n // KPI 필터: kpiName이 지정되면 해당 Y-level KPI만, 없으면 Z-level KPI 전체\n if (kpiName && kpiName.trim() !== '') {\n queryBuilder.andWhere('k.name = :kpiName', { kpiName })\n } else {\n queryBuilder.andWhere('k.name LIKE :pattern', { pattern: 'Z%' })\n }\n\n queryBuilder.groupBy('geoGroup')\n\n if (geoGroup && geoGroup.trim() !== '') {\n queryBuilder.having('geoGroup = :geoGroup', { geoGroup })\n }\n\n const results = await queryBuilder.getRawMany()\n return results\n .map(result => {\n const kpiName = result.kpiname\n const minVal = Math.min(Math.max(Number(result.minval), 0), 1)\n const q1Val = Math.min(Math.max(Number(result.q1val), 0), 1)\n const medVal = Math.min(Math.max(Number(result.medval), 0), 1)\n const q3Val = Math.min(Math.max(Number(result.q3val), 0), 1)\n const maxVal = Math.min(Math.max(Number(result.maxval), 0), 1)\n const avgVal = Math.min(Math.max(Number(result.avgval), 0), 1)\n const projectCount = Number(result.projectcount)\n\n return {\n kpiName: kpiName,\n geoGroup: result.geogroup || null,\n minVal: isNaN(minVal) ? 0 : minVal,\n q1Val: isNaN(q1Val) ? 0 : q1Val,\n medVal: isNaN(medVal) ? 0 : medVal,\n q3Val: isNaN(q3Val) ? 0 : q3Val,\n maxVal: isNaN(maxVal) ? 0 : maxVal,\n avgVal: isNaN(avgVal) ? 0 : avgVal,\n projectCount: isNaN(projectCount) ? 0 : projectCount\n }\n })\n .filter(result => result.geoGroup !== null)\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(() => [KpiComprehensiveStatsByGeoGroup], { description: 'Get KPI box plot statistics for Y-category KPIs by geo group' })\n async kpiYValueComprehensiveStatsByGeoGroup(\n @Arg('geoGroup', { nullable: true }) geoGroup?: string,\n @Ctx() context?: ResolverContext\n ): Promise<KpiComprehensiveStatsByGeoGroup[]> {\n const { domain } = context.state\n\n const queryBuilder = getRepository('kpi_values')\n .createQueryBuilder('kv')\n .select([\n 'p.geo_group as geoGroup',\n 'k.name as kpiName',\n 'MIN(kv.score) as minVal',\n 'PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY kv.score) as q1Val',\n 'PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY kv.score) as medVal',\n 'PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY kv.score) as q3Val',\n 'MAX(kv.score) as maxVal',\n 'AVG(kv.score) as avgVal',\n 'COUNT(DISTINCT p.id) as projectCount'\n ])\n .innerJoin('kpis', 'k', 'kv.kpi_id = k.id')\n .innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')\n .where('k.name LIKE :pattern', { pattern: 'Y%' })\n .andWhere('p.end_date IS NOT NULL')\n .andWhere('p.geo_group IS NOT NULL')\n .andWhere('kv.domain_id = :domainId', { domainId: domain.id })\n .groupBy('p.geo_group, k.name')\n\n if (geoGroup && geoGroup.trim() !== '') {\n queryBuilder.andWhere('p.geo_group LIKE :geoGroup', { geoGroup: `%${geoGroup}%` })\n }\n\n const results = await queryBuilder.getRawMany()\n return results\n .map(result => {\n const kpiName = result.kpiname\n const minVal = Math.min(Math.max(Number(result.minval), 0), 1)\n const q1Val = Math.min(Math.max(Number(result.q1val), 0), 1)\n const medVal = Math.min(Math.max(Number(result.medval), 0), 1)\n const q3Val = Math.min(Math.max(Number(result.q3val), 0), 1)\n const maxVal = Math.min(Math.max(Number(result.maxval), 0), 1)\n const avgVal = Math.min(Math.max(Number(result.avgval), 0), 1)\n const projectCount = Number(result.projectcount)\n\n return {\n kpiName: kpiName,\n geoGroup: result.geogroup || null,\n minVal: isNaN(minVal) ? 0 : minVal,\n q1Val: isNaN(q1Val) ? 0 : q1Val,\n medVal: isNaN(medVal) ? 0 : medVal,\n q3Val: isNaN(q3Val) ? 0 : q3Val,\n maxVal: isNaN(maxVal) ? 0 : maxVal,\n avgVal: isNaN(avgVal) ? 0 : avgVal,\n projectCount: isNaN(projectCount) ? 0 : projectCount\n }\n })\n .filter(result => result.geoGroup !== null)\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(() => [KpiMonthlyTrend], { description: 'Get monthly KPI trend for Z-category KPIs by metro area' })\n async kpiZValueMonthlyTrendByGeoGroup(\n @Arg('kpiName', { nullable: true }) kpiName?: string,\n @Arg('startYearMonth', { nullable: true }) startYearMonth?: string,\n @Arg('endYearMonth', { nullable: true }) endYearMonth?: string,\n @Ctx() context?: ResolverContext\n ): Promise<KpiMonthlyTrend[]> {\n const { domain } = context.state\n\n const queryBuilder = getRepository('kpi_values')\n .createQueryBuilder('kv')\n .select([\n `CASE\n WHEN p.geo_group IN ('01','02','03','04','05','06','07','08') THEN '서울특별시'\n WHEN p.geo_group IN ('46','47','48','49') THEN '부산광역시'\n WHEN p.geo_group IN ('41','42','43') THEN '대구광역시'\n WHEN p.geo_group IN ('21','22','23') THEN '인천광역시'\n WHEN p.geo_group IN ('61','62') THEN '광주광역시'\n WHEN p.geo_group IN ('34','35') THEN '대전광역시'\n WHEN p.geo_group IN ('44','45') THEN '울산광역시'\n WHEN p.geo_group = '30' THEN '세종특별자치시'\n WHEN p.geo_group IN ('10','11','12','13','14','15','16','17','18') THEN '경기도'\n WHEN p.geo_group IN ('24','25','26','33') THEN '강원도'\n WHEN p.geo_group IN ('27','28','29') THEN '충청북도'\n WHEN p.geo_group IN ('31','32') THEN '충청남도'\n WHEN p.geo_group IN ('54','55','56') THEN '전라북도'\n WHEN p.geo_group IN ('57','58','59') THEN '전라남도'\n WHEN p.geo_group IN ('36','37','38','39','40') THEN '경상북도'\n WHEN p.geo_group IN ('50','51','52','53') THEN '경상남도'\n WHEN p.geo_group = '63' THEN '제주특별자치도'\n END as geoGroup`,\n `TO_CHAR(p.end_date, 'YYYY-MM') as yearMonth`,\n 'AVG(kv.score) as avgVal',\n 'COUNT(DISTINCT p.id) as projectCount'\n ])\n .innerJoin('kpis', 'k', 'kv.kpi_id = k.id')\n .innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')\n .where('p.end_date IS NOT NULL')\n .andWhere('p.geo_group IS NOT NULL')\n .andWhere('kv.domain_id = :domainId', { domainId: domain.id })\n\n // 기간 필터\n if (startYearMonth && startYearMonth.trim() !== '') {\n queryBuilder.andWhere(`TO_CHAR(p.end_date, 'YYYY-MM') >= :startYearMonth`, { startYearMonth })\n }\n if (endYearMonth && endYearMonth.trim() !== '') {\n queryBuilder.andWhere(`TO_CHAR(p.end_date, 'YYYY-MM') <= :endYearMonth`, { endYearMonth })\n }\n\n // KPI 필터: kpiName이 지정되면 해당 Y-level KPI만, 없으면 Z-level KPI 전체\n if (kpiName && kpiName.trim() !== '') {\n queryBuilder.andWhere('k.name = :kpiName', { kpiName })\n } else {\n queryBuilder.andWhere('k.name LIKE :pattern', { pattern: 'Z%' })\n }\n\n queryBuilder.groupBy('geoGroup, yearMonth').orderBy('yearMonth', 'ASC')\n\n const results = await queryBuilder.getRawMany()\n return results\n .map(result => {\n const avgVal = Math.min(Math.max(Number(result.avgval), 0), 1)\n const projectCount = Number(result.projectcount)\n\n return {\n geoGroup: result.geogroup || null,\n yearMonth: result.yearmonth,\n avgVal: isNaN(avgVal) ? 0 : avgVal,\n projectCount: isNaN(projectCount) ? 0 : projectCount\n }\n })\n .filter(result => result.geoGroup !== null)\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(() => [KpiComprehensiveStats], { description: 'Get KPI statistics for Y-category KPIs by specific metro area' })\n async kpiYValueStatsByMetroArea(\n @Arg('metroArea') metroArea: string,\n @Arg('startYearMonth', { nullable: true }) startYearMonth?: string,\n @Arg('endYearMonth', { nullable: true }) endYearMonth?: string,\n @Ctx() context?: ResolverContext\n ): Promise<KpiComprehensiveStats[]> {\n if (!context || !context.state) {\n console.error('Context is undefined or missing state')\n return []\n }\n\n const { domain } = context.state\n\n const queryBuilder = getRepository('kpi_values')\n .createQueryBuilder('kv')\n .select([\n 'k.name as kpiName',\n 'MIN(kv.score) as minVal',\n 'PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY kv.score) as q1Val',\n 'PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY kv.score) as medVal',\n 'PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY kv.score) as q3Val',\n 'MAX(kv.score) as maxVal',\n 'AVG(kv.score) as avgVal',\n 'COUNT(DISTINCT p.id) as projectCount'\n ])\n .innerJoin('kpis', 'k', 'kv.kpi_id = k.id')\n .innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')\n .where('k.name LIKE :pattern', { pattern: 'Y%' })\n .andWhere('p.end_date IS NOT NULL')\n .andWhere('p.geo_group IS NOT NULL')\n .andWhere('kv.domain_id = :domainId', { domainId: domain.id })\n\n // 기간 필터\n if (startYearMonth && startYearMonth.trim() !== '') {\n queryBuilder.andWhere(`TO_CHAR(p.end_date, 'YYYY-MM') >= :startYearMonth`, { startYearMonth })\n }\n if (endYearMonth && endYearMonth.trim() !== '') {\n queryBuilder.andWhere(`TO_CHAR(p.end_date, 'YYYY-MM') <= :endYearMonth`, { endYearMonth })\n }\n\n queryBuilder\n .andWhere(\n `CASE\n WHEN p.geo_group IN ('01','02','03','04','05','06','07','08') THEN '서울특별시'\n WHEN p.geo_group IN ('46','47','48','49') THEN '부산광역시'\n WHEN p.geo_group IN ('41','42','43') THEN '대구광역시'\n WHEN p.geo_group IN ('21','22','23') THEN '인천광역시'\n WHEN p.geo_group IN ('61','62') THEN '광주광역시'\n WHEN p.geo_group IN ('34','35') THEN '대전광역시'\n WHEN p.geo_group IN ('44','45') THEN '울산광역시'\n WHEN p.geo_group = '30' THEN '세종특별자치시'\n WHEN p.geo_group IN ('10','11','12','13','14','15','16','17','18') THEN '경기도'\n WHEN p.geo_group IN ('24','25','26','33') THEN '강원도'\n WHEN p.geo_group IN ('27','28','29') THEN '충청북도'\n WHEN p.geo_group IN ('31','32') THEN '충청남도'\n WHEN p.geo_group IN ('54','55','56') THEN '전라북도'\n WHEN p.geo_group IN ('57','58','59') THEN '전라남도'\n WHEN p.geo_group IN ('36','37','38','39','40') THEN '경상북도'\n WHEN p.geo_group IN ('50','51','52','53') THEN '경상남도'\n WHEN p.geo_group = '63' THEN '제주특별자치도'\n END = :metroArea`,\n { metroArea }\n )\n .groupBy('k.name')\n .orderBy('k.name', 'ASC')\n\n const results = await queryBuilder.getRawMany()\n\n return results.map(result => {\n const kpiName = result.kpiname\n const minVal = Math.min(Math.max(Number(result.minval), 0), 1)\n const q1Val = Math.min(Math.max(Number(result.q1val), 0), 1)\n const medVal = Math.min(Math.max(Number(result.medval), 0), 1)\n const q3Val = Math.min(Math.max(Number(result.q3val), 0), 1)\n const avgVal = Math.min(Math.max(Number(result.avgval), 0), 1)\n const maxVal = Math.min(Math.max(Number(result.maxval), 0), 1)\n const projectCount = Number(result.projectcount)\n\n return {\n kpiName: kpiName,\n minVal: isNaN(minVal) ? 0 : minVal,\n q1Val: isNaN(q1Val) ? 0 : q1Val,\n medVal: isNaN(medVal) ? 0 : medVal,\n q3Val: isNaN(q3Val) ? 0 : q3Val,\n maxVal: isNaN(maxVal) ? 0 : maxVal,\n avgVal: isNaN(avgVal) ? 0 : avgVal,\n projectCount: isNaN(projectCount) ? 0 : projectCount\n }\n })\n }\n}\n"]}
|