@things-factory/dataset 10.1.248 → 10.1.249

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.
Files changed (351) hide show
  1. package/dist-client/activities/activity-data-collect-edit.d.ts +26 -0
  2. package/dist-client/activities/activity-data-collect-edit.js +156 -0
  3. package/dist-client/activities/activity-data-collect-edit.js.map +1 -0
  4. package/dist-client/activities/activity-data-collect-view.d.ts +16 -0
  5. package/dist-client/activities/activity-data-collect-view.js +94 -0
  6. package/dist-client/activities/activity-data-collect-view.js.map +1 -0
  7. package/dist-client/activities/activity-data-review-edit.d.ts +20 -0
  8. package/dist-client/activities/activity-data-review-edit.js +300 -0
  9. package/dist-client/activities/activity-data-review-edit.js.map +1 -0
  10. package/dist-client/activities/activity-data-review-view.d.ts +16 -0
  11. package/dist-client/activities/activity-data-review-view.js +247 -0
  12. package/dist-client/activities/activity-data-review-view.js.map +1 -0
  13. package/dist-client/activities/activity-ooc-resolve-edit.d.ts +2 -0
  14. package/dist-client/activities/activity-ooc-resolve-edit.js +203 -0
  15. package/dist-client/activities/activity-ooc-resolve-edit.js.map +1 -0
  16. package/dist-client/activities/activity-ooc-resolve-view.d.ts +14 -0
  17. package/dist-client/activities/activity-ooc-resolve-view.js +154 -0
  18. package/dist-client/activities/activity-ooc-resolve-view.js.map +1 -0
  19. package/dist-client/activities/activity-ooc-review-edit.d.ts +3 -0
  20. package/dist-client/activities/activity-ooc-review-edit.js +197 -0
  21. package/dist-client/activities/activity-ooc-review-edit.js.map +1 -0
  22. package/dist-client/activities/activity-ooc-review-view.d.ts +1 -0
  23. package/dist-client/activities/activity-ooc-review-view.js +139 -0
  24. package/dist-client/activities/activity-ooc-review-view.js.map +1 -0
  25. package/dist-client/bootstrap.d.ts +10 -0
  26. package/dist-client/bootstrap.js +26 -0
  27. package/dist-client/bootstrap.js.map +1 -0
  28. package/dist-client/components/checklist-entry-form.d.ts +21 -0
  29. package/dist-client/components/checklist-entry-form.js +107 -0
  30. package/dist-client/components/checklist-entry-form.js.map +1 -0
  31. package/dist-client/components/data-entry-form.d.ts +21 -0
  32. package/dist-client/components/data-entry-form.js +107 -0
  33. package/dist-client/components/data-entry-form.js.map +1 -0
  34. package/dist-client/index.d.ts +1 -0
  35. package/dist-client/index.js +2 -0
  36. package/dist-client/index.js.map +1 -0
  37. package/dist-client/pages/data-archive/data-archive-list-page.d.ts +55 -0
  38. package/dist-client/pages/data-archive/data-archive-list-page.js +234 -0
  39. package/dist-client/pages/data-archive/data-archive-list-page.js.map +1 -0
  40. package/dist-client/pages/data-archive/data-archive-request-popup.d.ts +1 -0
  41. package/dist-client/pages/data-archive/data-archive-request-popup.js +160 -0
  42. package/dist-client/pages/data-archive/data-archive-request-popup.js.map +1 -0
  43. package/dist-client/pages/data-entry/data-entry-list-page.d.ts +31 -0
  44. package/dist-client/pages/data-entry/data-entry-list-page.js +383 -0
  45. package/dist-client/pages/data-entry/data-entry-list-page.js.map +1 -0
  46. package/dist-client/pages/data-key-set/data-key-item-list.d.ts +19 -0
  47. package/dist-client/pages/data-key-set/data-key-item-list.js +183 -0
  48. package/dist-client/pages/data-key-set/data-key-item-list.js.map +1 -0
  49. package/dist-client/pages/data-key-set/data-key-set-importer.d.ts +10 -0
  50. package/dist-client/pages/data-key-set/data-key-set-importer.js +93 -0
  51. package/dist-client/pages/data-key-set/data-key-set-importer.js.map +1 -0
  52. package/dist-client/pages/data-key-set/data-key-set-list-page.d.ts +56 -0
  53. package/dist-client/pages/data-key-set/data-key-set-list-page.js +335 -0
  54. package/dist-client/pages/data-key-set/data-key-set-list-page.js.map +1 -0
  55. package/dist-client/pages/data-ooc/data-ooc-list-page.d.ts +67 -0
  56. package/dist-client/pages/data-ooc/data-ooc-list-page.js +484 -0
  57. package/dist-client/pages/data-ooc/data-ooc-list-page.js.map +1 -0
  58. package/dist-client/pages/data-ooc/data-ooc-page.d.ts +18 -0
  59. package/dist-client/pages/data-ooc/data-ooc-page.js +166 -0
  60. package/dist-client/pages/data-ooc/data-ooc-page.js.map +1 -0
  61. package/dist-client/pages/data-ooc/data-ooc-view.d.ts +19 -0
  62. package/dist-client/pages/data-ooc/data-ooc-view.js +234 -0
  63. package/dist-client/pages/data-ooc/data-ooc-view.js.map +1 -0
  64. package/dist-client/pages/data-ooc/data-oocs-page.d.ts +18 -0
  65. package/dist-client/pages/data-ooc/data-oocs-page.js +198 -0
  66. package/dist-client/pages/data-ooc/data-oocs-page.js.map +1 -0
  67. package/dist-client/pages/data-report/data-report-embed-page.d.ts +36 -0
  68. package/dist-client/pages/data-report/data-report-embed-page.js +104 -0
  69. package/dist-client/pages/data-report/data-report-embed-page.js.map +1 -0
  70. package/dist-client/pages/data-report/data-report-list-page.d.ts +30 -0
  71. package/dist-client/pages/data-report/data-report-list-page.js +370 -0
  72. package/dist-client/pages/data-report/data-report-list-page.js.map +1 -0
  73. package/dist-client/pages/data-report/data-report-samples-page.d.ts +26 -0
  74. package/dist-client/pages/data-report/data-report-samples-page.js +151 -0
  75. package/dist-client/pages/data-report/data-report-samples-page.js.map +1 -0
  76. package/dist-client/pages/data-report/jasper-report-oocs-page.d.ts +2 -0
  77. package/dist-client/pages/data-report/jasper-report-oocs-page.js +104 -0
  78. package/dist-client/pages/data-report/jasper-report-oocs-page.js.map +1 -0
  79. package/dist-client/pages/data-report/jasper-report-samples-crosstab-page.d.ts +2 -0
  80. package/dist-client/pages/data-report/jasper-report-samples-crosstab-page.js +104 -0
  81. package/dist-client/pages/data-report/jasper-report-samples-crosstab-page.js.map +1 -0
  82. package/dist-client/pages/data-report/jasper-report-samples-page.d.ts +2 -0
  83. package/dist-client/pages/data-report/jasper-report-samples-page.js +104 -0
  84. package/dist-client/pages/data-report/jasper-report-samples-page.js.map +1 -0
  85. package/dist-client/pages/data-sample/data-sample-list-page.d.ts +62 -0
  86. package/dist-client/pages/data-sample/data-sample-list-page.js +372 -0
  87. package/dist-client/pages/data-sample/data-sample-list-page.js.map +1 -0
  88. package/dist-client/pages/data-sample/data-sample-page.d.ts +17 -0
  89. package/dist-client/pages/data-sample/data-sample-page.js +57 -0
  90. package/dist-client/pages/data-sample/data-sample-page.js.map +1 -0
  91. package/dist-client/pages/data-sample/data-sample-search-page.d.ts +51 -0
  92. package/dist-client/pages/data-sample/data-sample-search-page.js +364 -0
  93. package/dist-client/pages/data-sample/data-sample-search-page.js.map +1 -0
  94. package/dist-client/pages/data-sample/data-sample-view.d.ts +23 -0
  95. package/dist-client/pages/data-sample/data-sample-view.js +309 -0
  96. package/dist-client/pages/data-sample/data-sample-view.js.map +1 -0
  97. package/dist-client/pages/data-sample/data-samples-page.d.ts +21 -0
  98. package/dist-client/pages/data-sample/data-samples-page.js +247 -0
  99. package/dist-client/pages/data-sample/data-samples-page.js.map +1 -0
  100. package/dist-client/pages/data-sensor/data-sensor-list-page.d.ts +50 -0
  101. package/dist-client/pages/data-sensor/data-sensor-list-page.js +395 -0
  102. package/dist-client/pages/data-sensor/data-sensor-list-page.js.map +1 -0
  103. package/dist-client/pages/data-set/data-item-list.d.ts +1 -0
  104. package/dist-client/pages/data-set/data-item-list.js +321 -0
  105. package/dist-client/pages/data-set/data-item-list.js.map +1 -0
  106. package/dist-client/pages/data-set/data-set-importer.d.ts +11 -0
  107. package/dist-client/pages/data-set/data-set-importer.js +96 -0
  108. package/dist-client/pages/data-set/data-set-importer.js.map +1 -0
  109. package/dist-client/pages/data-set/data-set-list-page.d.ts +77 -0
  110. package/dist-client/pages/data-set/data-set-list-page.js +1065 -0
  111. package/dist-client/pages/data-set/data-set-list-page.js.map +1 -0
  112. package/dist-client/pages/data-summary/data-summary-list-page.d.ts +51 -0
  113. package/dist-client/pages/data-summary/data-summary-list-page.js +308 -0
  114. package/dist-client/pages/data-summary/data-summary-list-page.js.map +1 -0
  115. package/dist-client/pages/data-summary/data-summary-period-page.d.ts +73 -0
  116. package/dist-client/pages/data-summary/data-summary-period-page.js +413 -0
  117. package/dist-client/pages/data-summary/data-summary-period-page.js.map +1 -0
  118. package/dist-client/pages/data-summary/data-summary-search-page.d.ts +70 -0
  119. package/dist-client/pages/data-summary/data-summary-search-page.js +360 -0
  120. package/dist-client/pages/data-summary/data-summary-search-page.js.map +1 -0
  121. package/dist-client/pages/data-summary/data-summary-view.d.ts +1 -0
  122. package/dist-client/pages/data-summary/data-summary-view.js +114 -0
  123. package/dist-client/pages/data-summary/data-summary-view.js.map +1 -0
  124. package/dist-client/pages/sure-to.d.ts +1 -0
  125. package/dist-client/pages/sure-to.js +10 -0
  126. package/dist-client/pages/sure-to.js.map +1 -0
  127. package/dist-client/route.d.ts +1 -0
  128. package/dist-client/route.js +71 -0
  129. package/dist-client/route.js.map +1 -0
  130. package/dist-client/tsconfig.tsbuildinfo +1 -0
  131. package/dist-server/activities/activity-data-collect.d.ts +42 -0
  132. package/dist-server/activities/activity-data-collect.js +89 -0
  133. package/dist-server/activities/activity-data-collect.js.map +1 -0
  134. package/dist-server/activities/activity-data-review.d.ts +42 -0
  135. package/dist-server/activities/activity-data-review.js +101 -0
  136. package/dist-server/activities/activity-data-review.js.map +1 -0
  137. package/dist-server/activities/activity-ooc-resolve.d.ts +42 -0
  138. package/dist-server/activities/activity-ooc-resolve.js +110 -0
  139. package/dist-server/activities/activity-ooc-resolve.js.map +1 -0
  140. package/dist-server/activities/activity-ooc-review.d.ts +42 -0
  141. package/dist-server/activities/activity-ooc-review.js +91 -0
  142. package/dist-server/activities/activity-ooc-review.js.map +1 -0
  143. package/dist-server/activities/index.d.ts +1 -0
  144. package/dist-server/activities/index.js +11 -0
  145. package/dist-server/activities/index.js.map +1 -0
  146. package/dist-server/controllers/create-data-ooc.d.ts +4 -0
  147. package/dist-server/controllers/create-data-ooc.js +73 -0
  148. package/dist-server/controllers/create-data-ooc.js.map +1 -0
  149. package/dist-server/controllers/create-data-sample.d.ts +3 -0
  150. package/dist-server/controllers/create-data-sample.js +341 -0
  151. package/dist-server/controllers/create-data-sample.js.map +1 -0
  152. package/dist-server/controllers/data-use-case.d.ts +36 -0
  153. package/dist-server/controllers/data-use-case.js +62 -0
  154. package/dist-server/controllers/data-use-case.js.map +1 -0
  155. package/dist-server/controllers/finalize-data-collection.d.ts +4 -0
  156. package/dist-server/controllers/finalize-data-collection.js +354 -0
  157. package/dist-server/controllers/finalize-data-collection.js.map +1 -0
  158. package/dist-server/controllers/index.d.ts +6 -0
  159. package/dist-server/controllers/index.js +10 -0
  160. package/dist-server/controllers/index.js.map +1 -0
  161. package/dist-server/controllers/issue-data-collection-task.d.ts +2 -0
  162. package/dist-server/controllers/issue-data-collection-task.js +64 -0
  163. package/dist-server/controllers/issue-data-collection-task.js.map +1 -0
  164. package/dist-server/controllers/issue-ooc-resolve.d.ts +3 -0
  165. package/dist-server/controllers/issue-ooc-resolve.js +55 -0
  166. package/dist-server/controllers/issue-ooc-resolve.js.map +1 -0
  167. package/dist-server/controllers/issue-ooc-review.d.ts +3 -0
  168. package/dist-server/controllers/issue-ooc-review.js +52 -0
  169. package/dist-server/controllers/issue-ooc-review.js.map +1 -0
  170. package/dist-server/controllers/jasper-report.d.ts +1 -0
  171. package/dist-server/controllers/jasper-report.js +166 -0
  172. package/dist-server/controllers/jasper-report.js.map +1 -0
  173. package/dist-server/controllers/query-data-summary-by-period.d.ts +3 -0
  174. package/dist-server/controllers/query-data-summary-by-period.js +163 -0
  175. package/dist-server/controllers/query-data-summary-by-period.js.map +1 -0
  176. package/dist-server/controllers/shiny-report.d.ts +1 -0
  177. package/dist-server/controllers/shiny-report.js +40 -0
  178. package/dist-server/controllers/shiny-report.js.map +1 -0
  179. package/dist-server/engine/index.d.ts +1 -0
  180. package/dist-server/engine/index.js +4 -0
  181. package/dist-server/engine/index.js.map +1 -0
  182. package/dist-server/engine/task/create-data-sample.d.ts +1 -0
  183. package/dist-server/engine/task/create-data-sample.js +81 -0
  184. package/dist-server/engine/task/create-data-sample.js.map +1 -0
  185. package/dist-server/engine/task/index.d.ts +2 -0
  186. package/dist-server/engine/task/index.js +5 -0
  187. package/dist-server/engine/task/index.js.map +1 -0
  188. package/dist-server/engine/task/issue-collect-data.d.ts +1 -0
  189. package/dist-server/engine/task/issue-collect-data.js +40 -0
  190. package/dist-server/engine/task/issue-collect-data.js.map +1 -0
  191. package/dist-server/index.d.ts +6 -0
  192. package/dist-server/index.js +10 -0
  193. package/dist-server/index.js.map +1 -0
  194. package/dist-server/routes.d.ts +1 -0
  195. package/dist-server/routes.js +152 -0
  196. package/dist-server/routes.js.map +1 -0
  197. package/dist-server/service/data-archive/data-archive-mutation.d.ts +16 -0
  198. package/dist-server/service/data-archive/data-archive-mutation.js +278 -0
  199. package/dist-server/service/data-archive/data-archive-mutation.js.map +1 -0
  200. package/dist-server/service/data-archive/data-archive-query.d.ts +11 -0
  201. package/dist-server/service/data-archive/data-archive-query.js +97 -0
  202. package/dist-server/service/data-archive/data-archive-query.js.map +1 -0
  203. package/dist-server/service/data-archive/data-archive-type.d.ts +23 -0
  204. package/dist-server/service/data-archive/data-archive-type.js +77 -0
  205. package/dist-server/service/data-archive/data-archive-type.js.map +1 -0
  206. package/dist-server/service/data-archive/data-archive.d.ts +19 -0
  207. package/dist-server/service/data-archive/data-archive.js +84 -0
  208. package/dist-server/service/data-archive/data-archive.js.map +1 -0
  209. package/dist-server/service/data-archive/index.d.ts +5 -0
  210. package/dist-server/service/data-archive/index.js +9 -0
  211. package/dist-server/service/data-archive/index.js.map +1 -0
  212. package/dist-server/service/data-key-set/data-key-item-type.d.ts +12 -0
  213. package/dist-server/service/data-key-set/data-key-item-type.js +52 -0
  214. package/dist-server/service/data-key-set/data-key-item-type.js.map +1 -0
  215. package/dist-server/service/data-key-set/data-key-set-mutation.d.ts +10 -0
  216. package/dist-server/service/data-key-set/data-key-set-mutation.js +203 -0
  217. package/dist-server/service/data-key-set/data-key-set-mutation.js.map +1 -0
  218. package/dist-server/service/data-key-set/data-key-set-query.d.ts +12 -0
  219. package/dist-server/service/data-key-set/data-key-set-query.js +117 -0
  220. package/dist-server/service/data-key-set/data-key-set-query.js.map +1 -0
  221. package/dist-server/service/data-key-set/data-key-set-type.d.ts +28 -0
  222. package/dist-server/service/data-key-set/data-key-set-type.js +106 -0
  223. package/dist-server/service/data-key-set/data-key-set-type.js.map +1 -0
  224. package/dist-server/service/data-key-set/data-key-set.d.ts +22 -0
  225. package/dist-server/service/data-key-set/data-key-set.js +104 -0
  226. package/dist-server/service/data-key-set/data-key-set.js.map +1 -0
  227. package/dist-server/service/data-key-set/index.d.ts +5 -0
  228. package/dist-server/service/data-key-set/index.js +9 -0
  229. package/dist-server/service/data-key-set/index.js.map +1 -0
  230. package/dist-server/service/data-ooc/data-ooc-mutation.d.ts +6 -0
  231. package/dist-server/service/data-ooc/data-ooc-mutation.js +96 -0
  232. package/dist-server/service/data-ooc/data-ooc-mutation.js.map +1 -0
  233. package/dist-server/service/data-ooc/data-ooc-query.d.ts +23 -0
  234. package/dist-server/service/data-ooc/data-ooc-query.js +209 -0
  235. package/dist-server/service/data-ooc/data-ooc-query.js.map +1 -0
  236. package/dist-server/service/data-ooc/data-ooc-subscription.d.ts +12 -0
  237. package/dist-server/service/data-ooc/data-ooc-subscription.js +64 -0
  238. package/dist-server/service/data-ooc/data-ooc-subscription.js.map +1 -0
  239. package/dist-server/service/data-ooc/data-ooc-type.d.ts +27 -0
  240. package/dist-server/service/data-ooc/data-ooc-type.js +111 -0
  241. package/dist-server/service/data-ooc/data-ooc-type.js.map +1 -0
  242. package/dist-server/service/data-ooc/data-ooc.d.ts +63 -0
  243. package/dist-server/service/data-ooc/data-ooc.js +310 -0
  244. package/dist-server/service/data-ooc/data-ooc.js.map +1 -0
  245. package/dist-server/service/data-ooc/index.d.ts +6 -0
  246. package/dist-server/service/data-ooc/index.js +10 -0
  247. package/dist-server/service/data-ooc/index.js.map +1 -0
  248. package/dist-server/service/data-sample/data-sample-mutation.d.ts +5 -0
  249. package/dist-server/service/data-sample/data-sample-mutation.js +30 -0
  250. package/dist-server/service/data-sample/data-sample-mutation.js.map +1 -0
  251. package/dist-server/service/data-sample/data-sample-query.d.ts +22 -0
  252. package/dist-server/service/data-sample/data-sample-query.js +274 -0
  253. package/dist-server/service/data-sample/data-sample-query.js.map +1 -0
  254. package/dist-server/service/data-sample/data-sample-type.d.ts +18 -0
  255. package/dist-server/service/data-sample/data-sample-type.js +68 -0
  256. package/dist-server/service/data-sample/data-sample-type.js.map +1 -0
  257. package/dist-server/service/data-sample/data-sample.d.ts +45 -0
  258. package/dist-server/service/data-sample/data-sample.js +226 -0
  259. package/dist-server/service/data-sample/data-sample.js.map +1 -0
  260. package/dist-server/service/data-sample/index.d.ts +5 -0
  261. package/dist-server/service/data-sample/index.js +9 -0
  262. package/dist-server/service/data-sample/index.js.map +1 -0
  263. package/dist-server/service/data-sensor/data-sensor-mutation.d.ts +9 -0
  264. package/dist-server/service/data-sensor/data-sensor-mutation.js +137 -0
  265. package/dist-server/service/data-sensor/data-sensor-mutation.js.map +1 -0
  266. package/dist-server/service/data-sensor/data-sensor-query.d.ts +16 -0
  267. package/dist-server/service/data-sensor/data-sensor-query.js +137 -0
  268. package/dist-server/service/data-sensor/data-sensor-query.js.map +1 -0
  269. package/dist-server/service/data-sensor/data-sensor-type.d.ts +42 -0
  270. package/dist-server/service/data-sensor/data-sensor-type.js +162 -0
  271. package/dist-server/service/data-sensor/data-sensor-type.js.map +1 -0
  272. package/dist-server/service/data-sensor/data-sensor.d.ts +33 -0
  273. package/dist-server/service/data-sensor/data-sensor.js +160 -0
  274. package/dist-server/service/data-sensor/data-sensor.js.map +1 -0
  275. package/dist-server/service/data-sensor/index.d.ts +5 -0
  276. package/dist-server/service/data-sensor/index.js +9 -0
  277. package/dist-server/service/data-sensor/index.js.map +1 -0
  278. package/dist-server/service/data-set/data-item-type.d.ts +321 -0
  279. package/dist-server/service/data-set/data-item-type.js +458 -0
  280. package/dist-server/service/data-set/data-item-type.js.map +1 -0
  281. package/dist-server/service/data-set/data-set-mutation.d.ts +20 -0
  282. package/dist-server/service/data-set/data-set-mutation.js +551 -0
  283. package/dist-server/service/data-set/data-set-mutation.js.map +1 -0
  284. package/dist-server/service/data-set/data-set-query.d.ts +39 -0
  285. package/dist-server/service/data-set/data-set-query.js +565 -0
  286. package/dist-server/service/data-set/data-set-query.js.map +1 -0
  287. package/dist-server/service/data-set/data-set-type.d.ts +75 -0
  288. package/dist-server/service/data-set/data-set-type.js +276 -0
  289. package/dist-server/service/data-set/data-set-type.js.map +1 -0
  290. package/dist-server/service/data-set/data-set.d.ts +96 -0
  291. package/dist-server/service/data-set/data-set.js +380 -0
  292. package/dist-server/service/data-set/data-set.js.map +1 -0
  293. package/dist-server/service/data-set/index.d.ts +5 -0
  294. package/dist-server/service/data-set/index.js +9 -0
  295. package/dist-server/service/data-set/index.js.map +1 -0
  296. package/dist-server/service/data-set-history/data-set-history-query.d.ts +21 -0
  297. package/dist-server/service/data-set-history/data-set-history-query.js +183 -0
  298. package/dist-server/service/data-set-history/data-set-history-query.js.map +1 -0
  299. package/dist-server/service/data-set-history/data-set-history-type.d.ts +5 -0
  300. package/dist-server/service/data-set-history/data-set-history-type.js +21 -0
  301. package/dist-server/service/data-set-history/data-set-history-type.js.map +1 -0
  302. package/dist-server/service/data-set-history/data-set-history.d.ts +53 -0
  303. package/dist-server/service/data-set-history/data-set-history.js +265 -0
  304. package/dist-server/service/data-set-history/data-set-history.js.map +1 -0
  305. package/dist-server/service/data-set-history/event-subscriber.d.ts +7 -0
  306. package/dist-server/service/data-set-history/event-subscriber.js +21 -0
  307. package/dist-server/service/data-set-history/event-subscriber.js.map +1 -0
  308. package/dist-server/service/data-set-history/index.d.ts +6 -0
  309. package/dist-server/service/data-set-history/index.js +10 -0
  310. package/dist-server/service/data-set-history/index.js.map +1 -0
  311. package/dist-server/service/data-spec/data-spec-manager.d.ts +10 -0
  312. package/dist-server/service/data-spec/data-spec-manager.js +20 -0
  313. package/dist-server/service/data-spec/data-spec-manager.js.map +1 -0
  314. package/dist-server/service/data-spec/data-spec-query.d.ts +5 -0
  315. package/dist-server/service/data-spec/data-spec-query.js +37 -0
  316. package/dist-server/service/data-spec/data-spec-query.js.map +1 -0
  317. package/dist-server/service/data-spec/data-spec.d.ts +19 -0
  318. package/dist-server/service/data-spec/data-spec.js +79 -0
  319. package/dist-server/service/data-spec/data-spec.js.map +1 -0
  320. package/dist-server/service/data-spec/index.d.ts +4 -0
  321. package/dist-server/service/data-spec/index.js +8 -0
  322. package/dist-server/service/data-spec/index.js.map +1 -0
  323. package/dist-server/service/data-summary/data-summary-mutation.d.ts +6 -0
  324. package/dist-server/service/data-summary/data-summary-mutation.js +76 -0
  325. package/dist-server/service/data-summary/data-summary-mutation.js.map +1 -0
  326. package/dist-server/service/data-summary/data-summary-query.d.ts +19 -0
  327. package/dist-server/service/data-summary/data-summary-query.js +237 -0
  328. package/dist-server/service/data-summary/data-summary-query.js.map +1 -0
  329. package/dist-server/service/data-summary/data-summary-type.d.ts +33 -0
  330. package/dist-server/service/data-summary/data-summary-type.js +139 -0
  331. package/dist-server/service/data-summary/data-summary-type.js.map +1 -0
  332. package/dist-server/service/data-summary/data-summary.d.ts +38 -0
  333. package/dist-server/service/data-summary/data-summary.js +202 -0
  334. package/dist-server/service/data-summary/data-summary.js.map +1 -0
  335. package/dist-server/service/data-summary/index.d.ts +6 -0
  336. package/dist-server/service/data-summary/index.js +10 -0
  337. package/dist-server/service/data-summary/index.js.map +1 -0
  338. package/dist-server/service/index.d.ts +14 -0
  339. package/dist-server/service/index.js +54 -0
  340. package/dist-server/service/index.js.map +1 -0
  341. package/dist-server/tsconfig.tsbuildinfo +1 -0
  342. package/dist-server/utils/config-resolver.d.ts +1 -0
  343. package/dist-server/utils/config-resolver.js +32 -0
  344. package/dist-server/utils/config-resolver.js.map +1 -0
  345. package/dist-server/utils/index.d.ts +2 -0
  346. package/dist-server/utils/index.js +6 -0
  347. package/dist-server/utils/index.js.map +1 -0
  348. package/dist-server/utils/media-validation.d.ts +51 -0
  349. package/dist-server/utils/media-validation.js +148 -0
  350. package/dist-server/utils/media-validation.js.map +1 -0
  351. package/package.json +4 -4
@@ -0,0 +1,354 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getDataFinalizeCrontabSchedule = getDataFinalizeCrontabSchedule;
4
+ exports.finalizeLatestDataCollection = finalizeLatestDataCollection;
5
+ exports.finalizeDataCollection = finalizeDataCollection;
6
+ const tslib_1 = require("tslib");
7
+ const statistics = require('simple-statistics');
8
+ const deepClone = require('lodash/cloneDeep');
9
+ const moment_timezone_1 = tslib_1.__importDefault(require("moment-timezone"));
10
+ const typeorm_1 = require("typeorm");
11
+ const shell_1 = require("@things-factory/shell");
12
+ const env_1 = require("@things-factory/env");
13
+ const work_shift_1 = require("@things-factory/work-shift");
14
+ const data_sample_js_1 = require("../service/data-sample/data-sample.js");
15
+ const data_set_js_1 = require("../service/data-set/data-set.js");
16
+ const data_summary_js_1 = require("../service/data-summary/data-summary.js");
17
+ const STAT_FUNCTION_MAP = {
18
+ sum: 'sum',
19
+ mean: 'mean',
20
+ stddev: 'standardDeviation',
21
+ variance: 'variance',
22
+ min: 'min',
23
+ max: 'max',
24
+ range: 'range',
25
+ median: 'median',
26
+ mode: 'mode'
27
+ };
28
+ const compareKeys = (dataKeyItems, summary, sample) => {
29
+ return dataKeyItems.every((item, index) => {
30
+ const prop = `key0${index + 1}`;
31
+ return sample[prop] === summary[prop];
32
+ });
33
+ };
34
+ const buildKeysFromSample = (dataKeyItems, sample) => {
35
+ return dataKeyItems.reduce((sum, item, index) => {
36
+ const prop = `key0${index + 1}`;
37
+ sum[prop] = sample[prop];
38
+ return sum;
39
+ }, {});
40
+ };
41
+ const buildKeySortingList = (dataKeyItems) => {
42
+ return dataKeyItems.reduce((sum, item, index) => {
43
+ const name = `key0${index + 1}`;
44
+ sum.push({ name, desc: true });
45
+ return sum;
46
+ }, []);
47
+ };
48
+ const calculateSummary = (dataItems, base) => {
49
+ return dataItems.reduce((summary, item) => {
50
+ const tag = item.tag;
51
+ const data = base[tag]
52
+ .flat(Infinity)
53
+ .map(Number)
54
+ .filter(item => !isNaN(item));
55
+ if (data.length > 0) {
56
+ try {
57
+ switch (item.stat) {
58
+ case 'range':
59
+ summary[tag] = statistics.max(data) - statistics.min(data);
60
+ break;
61
+ default:
62
+ const functionName = STAT_FUNCTION_MAP[item.stat];
63
+ summary[tag] = (functionName && statistics[functionName](data)) || '';
64
+ }
65
+ }
66
+ catch (err) {
67
+ summary[tag] = null;
68
+ console.error(err);
69
+ }
70
+ }
71
+ else {
72
+ summary[tag] = null;
73
+ }
74
+ return summary;
75
+ }, {});
76
+ };
77
+ const fillSummaryResult = (dataSummary, dataItems, base) => {
78
+ const summary = calculateSummary(dataItems, base);
79
+ dataSummary.summary = summary;
80
+ dataItems.slice(0, 4).forEach((dataItem, idx) => {
81
+ const value = Number(summary[dataItem.tag]);
82
+ dataSummary[`data0${idx + 1}`] = isNaN(value) ? null : value;
83
+ });
84
+ };
85
+ async function getLatestTimesForPeriod(periodType, context) {
86
+ const { domain } = context.state;
87
+ const now = (0, moment_timezone_1.default)();
88
+ if (periodType == data_set_js_1.DataSetSummaryPeriodType.Hour) {
89
+ const begin = now.clone().subtract(1, 'hour').startOf('hour');
90
+ const end = now.clone().startOf('hour');
91
+ const date = begin.clone().tz(domain.timezone);
92
+ return {
93
+ date: date.format('YYYY-MM-DD'),
94
+ period: date.format('HH'),
95
+ range: [begin.toDate(), end.toDate()]
96
+ };
97
+ }
98
+ else if (periodType == data_set_js_1.DataSetSummaryPeriodType.WorkShift) {
99
+ const { workDate, workShift, shiftRange } = await (0, work_shift_1.getLatestWorkDateAndShift)(domain, new Date());
100
+ return { date: workDate, period: workShift, range: shiftRange };
101
+ }
102
+ else if (periodType == data_set_js_1.DataSetSummaryPeriodType.WorkDate) {
103
+ const { workDate, dateRange } = await (0, work_shift_1.getLatestWorkDateAndShift)(domain, new Date());
104
+ return { date: workDate, range: dateRange };
105
+ }
106
+ else if (periodType == data_set_js_1.DataSetSummaryPeriodType.Day) {
107
+ const begin = now.clone().subtract(1, 'day').startOf('day');
108
+ const end = now.clone().startOf('day');
109
+ const date = begin.clone().tz(domain.timezone);
110
+ return {
111
+ date: date.format('YYYY-MM-DD'),
112
+ range: [begin.toDate(), end.toDate()]
113
+ };
114
+ }
115
+ }
116
+ async function getTimesForPeriod(periodType, date, period, context) {
117
+ const { domain } = context.state;
118
+ if (periodType == data_set_js_1.DataSetSummaryPeriodType.Hour) {
119
+ const theDate = moment_timezone_1.default.tz(`${date} ${period}:00:00`, 'YYYY-MM-DD HH:mm:ss', domain.timezone);
120
+ const begin = theDate.clone().startOf('hour').toDate();
121
+ const end = theDate.clone().add(+1, 'hour').startOf('hour').toDate();
122
+ return {
123
+ date,
124
+ period,
125
+ range: [begin, end]
126
+ };
127
+ }
128
+ else if (periodType == data_set_js_1.DataSetSummaryPeriodType.WorkShift) {
129
+ const range = await (0, work_shift_1.getDateRangeForWorkShift)(domain, date, period);
130
+ return { date, period, range };
131
+ }
132
+ else if (periodType == data_set_js_1.DataSetSummaryPeriodType.WorkDate) {
133
+ const range = await (0, work_shift_1.getDateRangeForWorkDate)(domain, date);
134
+ return { date, range };
135
+ }
136
+ else if (periodType == data_set_js_1.DataSetSummaryPeriodType.Day) {
137
+ const theDate = moment_timezone_1.default.tz(`${date} 00:00:00`, 'YYYY-MM-DD HH:mm:ss', domain.timezone);
138
+ const begin = theDate.clone().startOf('day').toDate();
139
+ const end = theDate.clone().add(1, 'day').startOf('day').toDate();
140
+ return {
141
+ date: (0, moment_timezone_1.default)(begin).tz(domain.timezone).format('YYYY-MM-DD'),
142
+ range: [begin, end]
143
+ };
144
+ }
145
+ }
146
+ async function getDataFinalizeCrontabSchedule(dataSet, context) {
147
+ const { domain, user, tx } = context.state;
148
+ try {
149
+ const { summaryPeriod } = dataSet;
150
+ if (summaryPeriod == data_set_js_1.DataSetSummaryPeriodType.Hour) {
151
+ return '0 5 * * * *';
152
+ }
153
+ else if (summaryPeriod == data_set_js_1.DataSetSummaryPeriodType.WorkShift) {
154
+ return await (0, work_shift_1.getSummaryScheduleForWorkShift)(domain);
155
+ }
156
+ else if (summaryPeriod == data_set_js_1.DataSetSummaryPeriodType.WorkDate) {
157
+ return await (0, work_shift_1.getSummaryScheduleForWorkDate)(domain);
158
+ }
159
+ else if (summaryPeriod == data_set_js_1.DataSetSummaryPeriodType.Day) {
160
+ return '0 10 0 * * *';
161
+ }
162
+ }
163
+ catch (err) {
164
+ console.error(err);
165
+ }
166
+ }
167
+ async function finalizeLatestDataCollection(dataSetId, context) {
168
+ const { domain, user, tx } = context.state;
169
+ const domainIds = await (0, shell_1.getDomainIdsWithAncestors)(domain);
170
+ try {
171
+ const dataSet = await tx.getRepository(data_set_js_1.DataSet).findOne({
172
+ where: { domain: { id: (0, typeorm_1.In)(domainIds) }, id: dataSetId },
173
+ relations: ['dataKeySet']
174
+ });
175
+ const dataKeyItems = dataSet.dataKeySet?.dataKeyItems || [];
176
+ const dataItems = dataSet.dataItems.filter(item => item.stat);
177
+ const initialSummary = dataItems.reduce((sum, item) => {
178
+ sum[item.tag] = [];
179
+ return sum;
180
+ }, {});
181
+ const { date, period, range } = await getLatestTimesForPeriod(dataSet.summaryPeriod, context);
182
+ const limit = 100;
183
+ var page = 1;
184
+ var summaries = [];
185
+ var summary;
186
+ do {
187
+ const samples = await (0, shell_1.getQueryBuilderFromListParams)({
188
+ repository: tx.getRepository(data_sample_js_1.DataSample),
189
+ domain: undefined,
190
+ params: {
191
+ filters: [{ name: 'dataSetId', operator: 'eq', value: dataSetId }],
192
+ pagination: { page, limit },
193
+ sortings: [...buildKeySortingList(dataKeyItems), { name: 'collectedAt', desc: true }]
194
+ },
195
+ alias: 'datasample'
196
+ })
197
+ .andWhere('datasample.domain IN (:...ancestorDomainIds)', { ancestorDomainIds: domainIds })
198
+ // The 'Between' operator includes the 'to' time in the filtering, making it unsuitable for the desired use case.
199
+ // .andWhere({ collectedAt: Between.apply(null, range) })
200
+ .andWhere('datasample.collectedAt >= :from', { from: range[0] })
201
+ .andWhere('datasample.collectedAt < :to', { to: range[1] })
202
+ .getMany();
203
+ for (const sample of samples) {
204
+ if (!summary || !compareKeys(dataKeyItems, summary, sample)) {
205
+ if (summary) {
206
+ fillSummaryResult(summary, dataItems, summary.summary);
207
+ summaries.push(summary);
208
+ }
209
+ summary = {
210
+ domain,
211
+ name: dataSet.name,
212
+ description: dataSet.description,
213
+ date,
214
+ period,
215
+ dataSet,
216
+ ...buildKeysFromSample(dataKeyItems, sample),
217
+ count: 0,
218
+ countOoc: 0,
219
+ countOos: 0,
220
+ summary: deepClone(initialSummary),
221
+ updater: user,
222
+ creator: user
223
+ };
224
+ }
225
+ summary.count++;
226
+ sample.ooc && summary.countOoc++;
227
+ sample.oos && summary.countOos++;
228
+ dataItems.forEach(item => {
229
+ summary.summary[item.tag].push(sample.data[item.tag]);
230
+ });
231
+ }
232
+ if (samples.length < limit) {
233
+ if (summary) {
234
+ fillSummaryResult(summary, dataItems, summary.summary);
235
+ summaries.push(summary);
236
+ }
237
+ break;
238
+ }
239
+ page++;
240
+ } while (true);
241
+ tx.getRepository(data_summary_js_1.DataSummary).upsert(summaries, [
242
+ 'domain',
243
+ 'dataSet',
244
+ 'key01',
245
+ 'key02',
246
+ 'key03',
247
+ 'key04',
248
+ 'key05',
249
+ 'date',
250
+ 'period'
251
+ ]);
252
+ return true;
253
+ }
254
+ catch (e) {
255
+ env_1.logger.error(e);
256
+ }
257
+ return false;
258
+ }
259
+ async function finalizeDataCollection(dataSetId, date, period, context) {
260
+ const { domain, user, tx } = context.state;
261
+ const domainIds = await (0, shell_1.getDomainIdsWithAncestors)(domain);
262
+ try {
263
+ const dataSet = dataSetId &&
264
+ (await tx.getRepository(data_set_js_1.DataSet).findOne({
265
+ where: { domain: { id: (0, typeorm_1.In)(domainIds) }, id: dataSetId },
266
+ relations: ['dataKeySet']
267
+ }));
268
+ const dataKeyItems = dataSet.dataKeySet?.dataKeyItems || [];
269
+ const dataItems = dataSet.dataItems.filter(item => item.stat);
270
+ const initialSummary = dataItems.reduce((sum, item) => {
271
+ sum[item.tag] = [];
272
+ return sum;
273
+ }, {});
274
+ const times = await getTimesForPeriod(dataSet.summaryPeriod, date, period, context);
275
+ const range = times.range;
276
+ period = times.period;
277
+ const limit = 100;
278
+ var page = 1;
279
+ var summaries = [];
280
+ var summary;
281
+ do {
282
+ const samples = await (0, shell_1.getQueryBuilderFromListParams)({
283
+ repository: tx.getRepository(data_sample_js_1.DataSample),
284
+ params: {
285
+ filters: [{ name: 'dataSetId', operator: 'eq', value: dataSetId }],
286
+ pagination: { page, limit },
287
+ sortings: [...buildKeySortingList(dataKeyItems), { name: 'collectedAt', desc: true }]
288
+ },
289
+ domain: undefined,
290
+ alias: 'datasample'
291
+ })
292
+ .andWhere('datasample.domain IN (:...ancestorDomainIds)', { ancestorDomainIds: domainIds })
293
+ // The 'Between' operator includes the 'to' time in the filtering, making it unsuitable for the desired use case.
294
+ // .andWhere({ collectedAt: Between.apply(null, range) })
295
+ .andWhere('datasample.collectedAt >= :from', { from: range[0] })
296
+ .andWhere('datasample.collectedAt < :to', { to: range[1] })
297
+ .getMany();
298
+ for (const sample of samples) {
299
+ if (!summary || !compareKeys(dataKeyItems, summary, sample)) {
300
+ if (summary) {
301
+ fillSummaryResult(summary, dataItems, summary.summary);
302
+ summaries.push(summary);
303
+ }
304
+ summary = {
305
+ domain,
306
+ name: dataSet.name,
307
+ description: dataSet.description,
308
+ date,
309
+ period,
310
+ dataSet,
311
+ ...buildKeysFromSample(dataKeyItems, sample),
312
+ count: 0,
313
+ countOoc: 0,
314
+ countOos: 0,
315
+ summary: deepClone(initialSummary),
316
+ updater: user,
317
+ creator: user
318
+ };
319
+ }
320
+ summary.count++;
321
+ sample.ooc && summary.countOoc++;
322
+ sample.oos && summary.countOos++;
323
+ dataItems.forEach(item => {
324
+ summary.summary[item.tag].push(sample.data[item.tag]);
325
+ });
326
+ }
327
+ if (samples.length < limit) {
328
+ if (summary) {
329
+ fillSummaryResult(summary, dataItems, summary.summary);
330
+ summaries.push(summary);
331
+ }
332
+ break;
333
+ }
334
+ page++;
335
+ } while (true);
336
+ tx.getRepository(data_summary_js_1.DataSummary).upsert(summaries, [
337
+ 'domain',
338
+ 'dataSet',
339
+ 'key01',
340
+ 'key02',
341
+ 'key03',
342
+ 'key04',
343
+ 'key05',
344
+ 'date',
345
+ 'period'
346
+ ]);
347
+ return true;
348
+ }
349
+ catch (e) {
350
+ env_1.logger.error(e);
351
+ }
352
+ return false;
353
+ }
354
+ //# sourceMappingURL=finalize-data-collection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finalize-data-collection.js","sourceRoot":"","sources":["../../server/controllers/finalize-data-collection.ts"],"names":[],"mappings":";;AAuLA,wEAkBC;AAED,oEAwGC;AAED,wDAkHC;;AAvaD,MAAM,UAAU,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAA;AAC/C,MAAM,SAAS,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAA;AAE7C,8EAAoC;AACpC,qCAA4B;AAE5B,iDAAyG;AACzG,6CAA4C;AAC5C,2DAMmC;AAEnC,0EAAkE;AAClE,iEAAmF;AAEnF,6EAAqE;AAKrE,MAAM,iBAAiB,GAAG;IACxB,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,mBAAmB;IAC3B,QAAQ,EAAE,UAAU;IACpB,GAAG,EAAE,KAAK;IACV,GAAG,EAAE,KAAK;IACV,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,QAAQ;IAChB,IAAI,EAAE,MAAM;CACb,CAAA;AAED,MAAM,WAAW,GAAG,CAAC,YAA2B,EAAE,OAA6B,EAAE,MAAkB,EAAW,EAAE;IAC9G,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QACxC,MAAM,IAAI,GAAG,OAAO,KAAK,GAAG,CAAC,EAAE,CAAA;QAC/B,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA;AAED,MAAM,mBAAmB,GAAG,CAAC,YAA2B,EAAE,MAAkB,EAAwB,EAAE;IACpG,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;QAC9C,MAAM,IAAI,GAAG,OAAO,KAAK,GAAG,CAAC,EAAE,CAAA;QAC/B,GAAG,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAA;QAExB,OAAO,GAAG,CAAA;IACZ,CAAC,EAAE,EAA0B,CAAC,CAAA;AAChC,CAAC,CAAA;AAED,MAAM,mBAAmB,GAAG,CAAC,YAA2B,EAAa,EAAE;IACrE,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;QAC9C,MAAM,IAAI,GAAG,OAAO,KAAK,GAAG,CAAC,EAAE,CAAA;QAC/B,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;QAC9B,OAAO,GAAG,CAAA;IACZ,CAAC,EAAE,EAAE,CAAC,CAAA;AACR,CAAC,CAAA;AAED,MAAM,gBAAgB,GAAG,CAAC,SAAqB,EAAE,IAA8B,EAAE,EAAE;IACjF,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;QACxC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAA;QAEpB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC;aACnB,IAAI,CAAC,QAAQ,CAAC;aACd,GAAG,CAAC,MAAM,CAAC;aACX,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;QAE/B,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,IAAI,CAAC;gBACH,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;oBAClB,KAAK,OAAO;wBACV,OAAO,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;wBAC1D,MAAK;oBAEP;wBACE,MAAM,YAAY,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;wBACjD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,IAAI,UAAU,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAA;gBACzE,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAA;gBACnB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YACpB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAA;QACrB,CAAC;QAED,OAAO,OAAO,CAAA;IAChB,CAAC,EAAE,EAAE,CAAC,CAAA;AACR,CAAC,CAAA;AAED,MAAM,iBAAiB,GAAG,CACxB,WAAiC,EACjC,SAAqB,EACrB,IAA8B,EACxB,EAAE;IACR,MAAM,OAAO,GAAG,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;IAEjD,WAAW,CAAC,OAAO,GAAG,OAAO,CAAA;IAC7B,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE;QAC9C,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAA;QAC3C,WAAW,CAAC,QAAQ,GAAG,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAA;IAC9D,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA;AAED,KAAK,UAAU,uBAAuB,CACpC,UAAoC,EACpC,OAAwB;IAExB,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;IAChC,MAAM,GAAG,GAAG,IAAA,yBAAM,GAAE,CAAA;IAEpB,IAAI,UAAU,IAAI,sCAAwB,CAAC,IAAI,EAAE,CAAC;QAChD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;QAC7D,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;QACvC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;QAE9C,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;YAC/B,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;YACzB,KAAK,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;SACtC,CAAA;IACH,CAAC;SAAM,IAAI,UAAU,IAAI,sCAAwB,CAAC,SAAS,EAAE,CAAC;QAC5D,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,MAAM,IAAA,sCAAyB,EAAC,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC,CAAA;QAE/F,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,CAAA;IACjE,CAAC;SAAM,IAAI,UAAU,IAAI,sCAAwB,CAAC,QAAQ,EAAE,CAAC;QAC3D,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,MAAM,IAAA,sCAAyB,EAAC,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC,CAAA;QAEnF,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAA;IAC7C,CAAC;SAAM,IAAI,UAAU,IAAI,sCAAwB,CAAC,GAAG,EAAE,CAAC;QACtD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QAC3D,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;QAE9C,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;YAC/B,KAAK,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;SACtC,CAAA;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,UAAoC,EACpC,IAAY,EACZ,MAAc,EACd,OAAwB;IAExB,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;IAEhC,IAAI,UAAU,IAAI,sCAAwB,CAAC,IAAI,EAAE,CAAC;QAChD,MAAM,OAAO,GAAG,yBAAM,CAAC,EAAE,CAAC,GAAG,IAAI,IAAI,MAAM,QAAQ,EAAE,qBAAqB,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAA;QAE5F,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,CAAA;QACtD,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,CAAA;QAEpE,OAAO;YACL,IAAI;YACJ,MAAM;YACN,KAAK,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC;SACpB,CAAA;IACH,CAAC;SAAM,IAAI,UAAU,IAAI,sCAAwB,CAAC,SAAS,EAAE,CAAC;QAC5D,MAAM,KAAK,GAAG,MAAM,IAAA,qCAAwB,EAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;QAElE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;IAChC,CAAC;SAAM,IAAI,UAAU,IAAI,sCAAwB,CAAC,QAAQ,EAAE,CAAC;QAC3D,MAAM,KAAK,GAAG,MAAM,IAAA,oCAAuB,EAAC,MAAM,EAAE,IAAI,CAAC,CAAA;QAEzD,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;IACxB,CAAC;SAAM,IAAI,UAAU,IAAI,sCAAwB,CAAC,GAAG,EAAE,CAAC;QACtD,MAAM,OAAO,GAAG,yBAAM,CAAC,EAAE,CAAC,GAAG,IAAI,WAAW,EAAE,qBAAqB,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAA;QAErF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAA;QACrD,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAA;QAEjE,OAAO;YACL,IAAI,EAAE,IAAA,yBAAM,EAAC,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC;YAC5D,KAAK,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC;SACpB,CAAA;IACH,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,8BAA8B,CAAC,OAAgB,EAAE,OAAwB;IAC7F,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;IAE1C,IAAI,CAAC;QACH,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,CAAA;QAEjC,IAAI,aAAa,IAAI,sCAAwB,CAAC,IAAI,EAAE,CAAC;YACnD,OAAO,aAAa,CAAA;QACtB,CAAC;aAAM,IAAI,aAAa,IAAI,sCAAwB,CAAC,SAAS,EAAE,CAAC;YAC/D,OAAO,MAAM,IAAA,2CAA8B,EAAC,MAAM,CAAC,CAAA;QACrD,CAAC;aAAM,IAAI,aAAa,IAAI,sCAAwB,CAAC,QAAQ,EAAE,CAAC;YAC9D,OAAO,MAAM,IAAA,0CAA6B,EAAC,MAAM,CAAC,CAAA;QACpD,CAAC;aAAM,IAAI,aAAa,IAAI,sCAAwB,CAAC,GAAG,EAAE,CAAC;YACzD,OAAO,cAAc,CAAA;QACvB,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACpB,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,4BAA4B,CAAC,SAAiB,EAAE,OAAwB;IAC5F,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;IAC1C,MAAM,SAAS,GAAG,MAAM,IAAA,iCAAyB,EAAC,MAAM,CAAC,CAAA;IAEzD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,aAAa,CAAC,qBAAO,CAAC,CAAC,OAAO,CAAC;YACtD,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,IAAA,YAAE,EAAC,SAAS,CAAC,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE;YACvD,SAAS,EAAE,CAAC,YAAY,CAAC;SAC1B,CAAC,CAAA;QAEF,MAAM,YAAY,GAAG,OAAO,CAAC,UAAU,EAAE,YAAY,IAAI,EAAE,CAAA;QAC3D,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC7D,MAAM,cAAc,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;YACpD,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAA;YAClB,OAAO,GAAG,CAAA;QACZ,CAAC,EAAE,EAAE,CAAC,CAAA;QAEN,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,uBAAuB,CAAC,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,CAAA;QAC7F,MAAM,KAAK,GAAG,GAAG,CAAA;QACjB,IAAI,IAAI,GAAG,CAAC,CAAA;QAEZ,IAAI,SAAS,GAA2B,EAAE,CAAA;QAC1C,IAAI,OAA6B,CAAA;QAEjC,GAAG,CAAC;YACF,MAAM,OAAO,GAAG,MAAM,IAAA,qCAA6B,EAAC;gBAClD,UAAU,EAAE,EAAE,CAAC,aAAa,CAAC,2BAAU,CAAC;gBACxC,MAAM,EAAE,SAAS;gBACjB,MAAM,EAAE;oBACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;oBAClE,UAAU,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;oBAC3B,QAAQ,EAAE,CAAC,GAAG,mBAAmB,CAAC,YAAY,CAAC,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;iBACtF;gBACD,KAAK,EAAE,YAAY;aACpB,CAAC;iBACC,QAAQ,CAAC,8CAA8C,EAAE,EAAE,iBAAiB,EAAE,SAAS,EAAE,CAAC;gBAC3F,iHAAiH;gBACjH,yDAAyD;iBACxD,QAAQ,CAAC,iCAAiC,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC/D,QAAQ,CAAC,8BAA8B,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC1D,OAAO,EAAE,CAAA;YAEZ,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,IAAI,CAAC,OAAO,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC;oBAC5D,IAAI,OAAO,EAAE,CAAC;wBACZ,iBAAiB,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;wBACtD,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;oBACzB,CAAC;oBAED,OAAO,GAAG;wBACR,MAAM;wBACN,IAAI,EAAE,OAAO,CAAC,IAAI;wBAClB,WAAW,EAAE,OAAO,CAAC,WAAW;wBAChC,IAAI;wBACJ,MAAM;wBACN,OAAO;wBACP,GAAG,mBAAmB,CAAC,YAAY,EAAE,MAAM,CAAC;wBAC5C,KAAK,EAAE,CAAC;wBACR,QAAQ,EAAE,CAAC;wBACX,QAAQ,EAAE,CAAC;wBACX,OAAO,EAAE,SAAS,CAAC,cAAc,CAAC;wBAClC,OAAO,EAAE,IAAI;wBACb,OAAO,EAAE,IAAI;qBACd,CAAA;gBACH,CAAC;gBAED,OAAO,CAAC,KAAK,EAAE,CAAA;gBACf,MAAM,CAAC,GAAG,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAA;gBAChC,MAAM,CAAC,GAAG,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAA;gBAEhC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;oBACvB,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;gBACvD,CAAC,CAAC,CAAA;YACJ,CAAC;YAED,IAAI,OAAO,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC;gBAC3B,IAAI,OAAO,EAAE,CAAC;oBACZ,iBAAiB,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;oBACtD,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;gBACzB,CAAC;gBACD,MAAK;YACP,CAAC;YAED,IAAI,EAAE,CAAA;QACR,CAAC,QAAQ,IAAI,EAAC;QAEd,EAAE,CAAC,aAAa,CAAC,6BAAW,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE;YAC9C,QAAQ;YACR,SAAS;YACT,OAAO;YACP,OAAO;YACP,OAAO;YACP,OAAO;YACP,OAAO;YACP,MAAM;YACN,QAAQ;SACT,CAAC,CAAA;QAEF,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,YAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAEM,KAAK,UAAU,sBAAsB,CAC1C,SAAiB,EACjB,IAAY,EACZ,MAAc,EACd,OAAwB;IAExB,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;IAC1C,MAAM,SAAS,GAAG,MAAM,IAAA,iCAAyB,EAAC,MAAM,CAAC,CAAA;IAEzD,IAAI,CAAC;QACH,MAAM,OAAO,GACX,SAAS;YACT,CAAC,MAAM,EAAE,CAAC,aAAa,CAAC,qBAAO,CAAC,CAAC,OAAO,CAAC;gBACvC,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,IAAA,YAAE,EAAC,SAAS,CAAC,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE;gBACvD,SAAS,EAAE,CAAC,YAAY,CAAC;aAC1B,CAAC,CAAC,CAAA;QAEL,MAAM,YAAY,GAAG,OAAO,CAAC,UAAU,EAAE,YAAY,IAAI,EAAE,CAAA;QAC3D,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC7D,MAAM,cAAc,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;YACpD,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAA;YAClB,OAAO,GAAG,CAAA;QACZ,CAAC,EAAE,EAAE,CAAC,CAAA;QAEN,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAA;QACnF,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAA;QACzB,MAAM,GAAG,KAAK,CAAC,MAAM,CAAA;QAErB,MAAM,KAAK,GAAG,GAAG,CAAA;QACjB,IAAI,IAAI,GAAG,CAAC,CAAA;QAEZ,IAAI,SAAS,GAA2B,EAAE,CAAA;QAC1C,IAAI,OAA6B,CAAA;QAEjC,GAAG,CAAC;YACF,MAAM,OAAO,GAAG,MAAM,IAAA,qCAA6B,EAAC;gBAClD,UAAU,EAAE,EAAE,CAAC,aAAa,CAAC,2BAAU,CAAC;gBACxC,MAAM,EAAE;oBACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;oBAClE,UAAU,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;oBAC3B,QAAQ,EAAE,CAAC,GAAG,mBAAmB,CAAC,YAAY,CAAC,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;iBACtF;gBACD,MAAM,EAAE,SAAS;gBACjB,KAAK,EAAE,YAAY;aACpB,CAAC;iBACC,QAAQ,CAAC,8CAA8C,EAAE,EAAE,iBAAiB,EAAE,SAAS,EAAE,CAAC;gBAC3F,iHAAiH;gBACjH,yDAAyD;iBACxD,QAAQ,CAAC,iCAAiC,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC/D,QAAQ,CAAC,8BAA8B,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC1D,OAAO,EAAE,CAAA;YAEZ,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,IAAI,CAAC,OAAO,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC;oBAC5D,IAAI,OAAO,EAAE,CAAC;wBACZ,iBAAiB,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;wBACtD,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;oBACzB,CAAC;oBAED,OAAO,GAAG;wBACR,MAAM;wBACN,IAAI,EAAE,OAAO,CAAC,IAAI;wBAClB,WAAW,EAAE,OAAO,CAAC,WAAW;wBAChC,IAAI;wBACJ,MAAM;wBACN,OAAO;wBACP,GAAG,mBAAmB,CAAC,YAAY,EAAE,MAAM,CAAC;wBAC5C,KAAK,EAAE,CAAC;wBACR,QAAQ,EAAE,CAAC;wBACX,QAAQ,EAAE,CAAC;wBACX,OAAO,EAAE,SAAS,CAAC,cAAc,CAAC;wBAClC,OAAO,EAAE,IAAI;wBACb,OAAO,EAAE,IAAI;qBACd,CAAA;gBACH,CAAC;gBAED,OAAO,CAAC,KAAK,EAAE,CAAA;gBACf,MAAM,CAAC,GAAG,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAA;gBAChC,MAAM,CAAC,GAAG,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAA;gBAEhC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;oBACvB,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;gBACvD,CAAC,CAAC,CAAA;YACJ,CAAC;YAED,IAAI,OAAO,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC;gBAC3B,IAAI,OAAO,EAAE,CAAC;oBACZ,iBAAiB,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;oBACtD,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;gBACzB,CAAC;gBACD,MAAK;YACP,CAAC;YAED,IAAI,EAAE,CAAA;QACR,CAAC,QAAQ,IAAI,EAAC;QAEd,EAAE,CAAC,aAAa,CAAC,6BAAW,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE;YAC9C,QAAQ;YACR,SAAS;YACT,OAAO;YACP,OAAO;YACP,OAAO;YACP,OAAO;YACP,OAAO;YACP,MAAM;YACN,QAAQ;SACT,CAAC,CAAA;QAEF,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,YAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC","sourcesContent":["const statistics = require('simple-statistics')\nconst deepClone = require('lodash/cloneDeep')\n\nimport moment from 'moment-timezone'\nimport { In } from 'typeorm'\n\nimport { Sorting, getQueryBuilderFromListParams, getDomainIdsWithAncestors } from '@things-factory/shell'\nimport { logger } from '@things-factory/env'\nimport {\n getDateRangeForWorkDate,\n getDateRangeForWorkShift,\n getLatestWorkDateAndShift,\n getSummaryScheduleForWorkDate,\n getSummaryScheduleForWorkShift\n} from '@things-factory/work-shift'\n\nimport { DataSample } from '../service/data-sample/data-sample.js'\nimport { DataSet, DataSetSummaryPeriodType } from '../service/data-set/data-set.js'\n\nimport { DataSummary } from '../service/data-summary/data-summary.js'\nimport { DataKeyItem } from '../service/data-key-set/data-key-item-type.js'\n\nimport { DataItem } from '../service/data-set/data-item-type.js'\n\nconst STAT_FUNCTION_MAP = {\n sum: 'sum',\n mean: 'mean',\n stddev: 'standardDeviation',\n variance: 'variance',\n min: 'min',\n max: 'max',\n range: 'range',\n median: 'median',\n mode: 'mode'\n}\n\nconst compareKeys = (dataKeyItems: DataKeyItem[], summary: Partial<DataSummary>, sample: DataSample): boolean => {\n return dataKeyItems.every((item, index) => {\n const prop = `key0${index + 1}`\n return sample[prop] === summary[prop]\n })\n}\n\nconst buildKeysFromSample = (dataKeyItems: DataKeyItem[], sample: DataSample): Partial<DataSummary> => {\n return dataKeyItems.reduce((sum, item, index) => {\n const prop = `key0${index + 1}`\n sum[prop] = sample[prop]\n\n return sum\n }, {} as Partial<DataSummary>)\n}\n\nconst buildKeySortingList = (dataKeyItems: DataKeyItem[]): Sorting[] => {\n return dataKeyItems.reduce((sum, item, index) => {\n const name = `key0${index + 1}`\n sum.push({ name, desc: true })\n return sum\n }, [])\n}\n\nconst calculateSummary = (dataItems: DataItem[], base: { [tag: string]: any[] }) => {\n return dataItems.reduce((summary, item) => {\n const tag = item.tag\n\n const data = base[tag]\n .flat(Infinity)\n .map(Number)\n .filter(item => !isNaN(item))\n\n if (data.length > 0) {\n try {\n switch (item.stat) {\n case 'range':\n summary[tag] = statistics.max(data) - statistics.min(data)\n break\n\n default:\n const functionName = STAT_FUNCTION_MAP[item.stat]\n summary[tag] = (functionName && statistics[functionName](data)) || ''\n }\n } catch (err) {\n summary[tag] = null\n console.error(err)\n }\n } else {\n summary[tag] = null\n }\n\n return summary\n }, {})\n}\n\nconst fillSummaryResult = (\n dataSummary: Partial<DataSummary>,\n dataItems: DataItem[],\n base: { [tag: string]: any[] }\n): void => {\n const summary = calculateSummary(dataItems, base)\n\n dataSummary.summary = summary\n dataItems.slice(0, 4).forEach((dataItem, idx) => {\n const value = Number(summary[dataItem.tag])\n dataSummary[`data0${idx + 1}`] = isNaN(value) ? null : value\n })\n}\n\nasync function getLatestTimesForPeriod(\n periodType: DataSetSummaryPeriodType,\n context: ResolverContext\n): Promise<{ date?: string; period?: string; range: Date[] }> {\n const { domain } = context.state\n const now = moment()\n\n if (periodType == DataSetSummaryPeriodType.Hour) {\n const begin = now.clone().subtract(1, 'hour').startOf('hour')\n const end = now.clone().startOf('hour')\n const date = begin.clone().tz(domain.timezone)\n\n return {\n date: date.format('YYYY-MM-DD'),\n period: date.format('HH'),\n range: [begin.toDate(), end.toDate()]\n }\n } else if (periodType == DataSetSummaryPeriodType.WorkShift) {\n const { workDate, workShift, shiftRange } = await getLatestWorkDateAndShift(domain, new Date())\n\n return { date: workDate, period: workShift, range: shiftRange }\n } else if (periodType == DataSetSummaryPeriodType.WorkDate) {\n const { workDate, dateRange } = await getLatestWorkDateAndShift(domain, new Date())\n\n return { date: workDate, range: dateRange }\n } else if (periodType == DataSetSummaryPeriodType.Day) {\n const begin = now.clone().subtract(1, 'day').startOf('day')\n const end = now.clone().startOf('day')\n const date = begin.clone().tz(domain.timezone)\n\n return {\n date: date.format('YYYY-MM-DD'),\n range: [begin.toDate(), end.toDate()]\n }\n }\n}\n\nasync function getTimesForPeriod(\n periodType: DataSetSummaryPeriodType,\n date: string,\n period: string,\n context: ResolverContext\n): Promise<{ date?: string; period?: string; range: Date[] }> {\n const { domain } = context.state\n\n if (periodType == DataSetSummaryPeriodType.Hour) {\n const theDate = moment.tz(`${date} ${period}:00:00`, 'YYYY-MM-DD HH:mm:ss', domain.timezone)\n\n const begin = theDate.clone().startOf('hour').toDate()\n const end = theDate.clone().add(+1, 'hour').startOf('hour').toDate()\n\n return {\n date,\n period,\n range: [begin, end]\n }\n } else if (periodType == DataSetSummaryPeriodType.WorkShift) {\n const range = await getDateRangeForWorkShift(domain, date, period)\n\n return { date, period, range }\n } else if (periodType == DataSetSummaryPeriodType.WorkDate) {\n const range = await getDateRangeForWorkDate(domain, date)\n\n return { date, range }\n } else if (periodType == DataSetSummaryPeriodType.Day) {\n const theDate = moment.tz(`${date} 00:00:00`, 'YYYY-MM-DD HH:mm:ss', domain.timezone)\n\n const begin = theDate.clone().startOf('day').toDate()\n const end = theDate.clone().add(1, 'day').startOf('day').toDate()\n\n return {\n date: moment(begin).tz(domain.timezone).format('YYYY-MM-DD'),\n range: [begin, end]\n }\n }\n}\n\nexport async function getDataFinalizeCrontabSchedule(dataSet: DataSet, context: ResolverContext): Promise<string> {\n const { domain, user, tx } = context.state\n\n try {\n const { summaryPeriod } = dataSet\n\n if (summaryPeriod == DataSetSummaryPeriodType.Hour) {\n return '0 5 * * * *'\n } else if (summaryPeriod == DataSetSummaryPeriodType.WorkShift) {\n return await getSummaryScheduleForWorkShift(domain)\n } else if (summaryPeriod == DataSetSummaryPeriodType.WorkDate) {\n return await getSummaryScheduleForWorkDate(domain)\n } else if (summaryPeriod == DataSetSummaryPeriodType.Day) {\n return '0 10 0 * * *'\n }\n } catch (err) {\n console.error(err)\n }\n}\n\nexport async function finalizeLatestDataCollection(dataSetId: string, context: ResolverContext): Promise<boolean> {\n const { domain, user, tx } = context.state\n const domainIds = await getDomainIdsWithAncestors(domain)\n\n try {\n const dataSet = await tx.getRepository(DataSet).findOne({\n where: { domain: { id: In(domainIds) }, id: dataSetId },\n relations: ['dataKeySet']\n })\n\n const dataKeyItems = dataSet.dataKeySet?.dataKeyItems || []\n const dataItems = dataSet.dataItems.filter(item => item.stat)\n const initialSummary = dataItems.reduce((sum, item) => {\n sum[item.tag] = []\n return sum\n }, {})\n\n const { date, period, range } = await getLatestTimesForPeriod(dataSet.summaryPeriod, context)\n const limit = 100\n var page = 1\n\n var summaries: Partial<DataSummary>[] = []\n var summary: Partial<DataSummary>\n\n do {\n const samples = await getQueryBuilderFromListParams({\n repository: tx.getRepository(DataSample),\n domain: undefined,\n params: {\n filters: [{ name: 'dataSetId', operator: 'eq', value: dataSetId }],\n pagination: { page, limit },\n sortings: [...buildKeySortingList(dataKeyItems), { name: 'collectedAt', desc: true }]\n },\n alias: 'datasample'\n })\n .andWhere('datasample.domain IN (:...ancestorDomainIds)', { ancestorDomainIds: domainIds })\n // The 'Between' operator includes the 'to' time in the filtering, making it unsuitable for the desired use case.\n // .andWhere({ collectedAt: Between.apply(null, range) })\n .andWhere('datasample.collectedAt >= :from', { from: range[0] })\n .andWhere('datasample.collectedAt < :to', { to: range[1] })\n .getMany()\n\n for (const sample of samples) {\n if (!summary || !compareKeys(dataKeyItems, summary, sample)) {\n if (summary) {\n fillSummaryResult(summary, dataItems, summary.summary)\n summaries.push(summary)\n }\n\n summary = {\n domain,\n name: dataSet.name,\n description: dataSet.description,\n date,\n period,\n dataSet,\n ...buildKeysFromSample(dataKeyItems, sample),\n count: 0,\n countOoc: 0,\n countOos: 0,\n summary: deepClone(initialSummary),\n updater: user,\n creator: user\n }\n }\n\n summary.count++\n sample.ooc && summary.countOoc++\n sample.oos && summary.countOos++\n\n dataItems.forEach(item => {\n summary.summary[item.tag].push(sample.data[item.tag])\n })\n }\n\n if (samples.length < limit) {\n if (summary) {\n fillSummaryResult(summary, dataItems, summary.summary)\n summaries.push(summary)\n }\n break\n }\n\n page++\n } while (true)\n\n tx.getRepository(DataSummary).upsert(summaries, [\n 'domain',\n 'dataSet',\n 'key01',\n 'key02',\n 'key03',\n 'key04',\n 'key05',\n 'date',\n 'period'\n ])\n\n return true\n } catch (e) {\n logger.error(e)\n }\n\n return false\n}\n\nexport async function finalizeDataCollection(\n dataSetId: string,\n date: string,\n period: string,\n context: ResolverContext\n): Promise<boolean> {\n const { domain, user, tx } = context.state\n const domainIds = await getDomainIdsWithAncestors(domain)\n\n try {\n const dataSet =\n dataSetId &&\n (await tx.getRepository(DataSet).findOne({\n where: { domain: { id: In(domainIds) }, id: dataSetId },\n relations: ['dataKeySet']\n }))\n\n const dataKeyItems = dataSet.dataKeySet?.dataKeyItems || []\n const dataItems = dataSet.dataItems.filter(item => item.stat)\n const initialSummary = dataItems.reduce((sum, item) => {\n sum[item.tag] = []\n return sum\n }, {})\n\n const times = await getTimesForPeriod(dataSet.summaryPeriod, date, period, context)\n const range = times.range\n period = times.period\n\n const limit = 100\n var page = 1\n\n var summaries: Partial<DataSummary>[] = []\n var summary: Partial<DataSummary>\n\n do {\n const samples = await getQueryBuilderFromListParams({\n repository: tx.getRepository(DataSample),\n params: {\n filters: [{ name: 'dataSetId', operator: 'eq', value: dataSetId }],\n pagination: { page, limit },\n sortings: [...buildKeySortingList(dataKeyItems), { name: 'collectedAt', desc: true }]\n },\n domain: undefined,\n alias: 'datasample'\n })\n .andWhere('datasample.domain IN (:...ancestorDomainIds)', { ancestorDomainIds: domainIds })\n // The 'Between' operator includes the 'to' time in the filtering, making it unsuitable for the desired use case.\n // .andWhere({ collectedAt: Between.apply(null, range) })\n .andWhere('datasample.collectedAt >= :from', { from: range[0] })\n .andWhere('datasample.collectedAt < :to', { to: range[1] })\n .getMany()\n\n for (const sample of samples) {\n if (!summary || !compareKeys(dataKeyItems, summary, sample)) {\n if (summary) {\n fillSummaryResult(summary, dataItems, summary.summary)\n summaries.push(summary)\n }\n\n summary = {\n domain,\n name: dataSet.name,\n description: dataSet.description,\n date,\n period,\n dataSet,\n ...buildKeysFromSample(dataKeyItems, sample),\n count: 0,\n countOoc: 0,\n countOos: 0,\n summary: deepClone(initialSummary),\n updater: user,\n creator: user\n }\n }\n\n summary.count++\n sample.ooc && summary.countOoc++\n sample.oos && summary.countOos++\n\n dataItems.forEach(item => {\n summary.summary[item.tag].push(sample.data[item.tag])\n })\n }\n\n if (samples.length < limit) {\n if (summary) {\n fillSummaryResult(summary, dataItems, summary.summary)\n summaries.push(summary)\n }\n break\n }\n\n page++\n } while (true)\n\n tx.getRepository(DataSummary).upsert(summaries, [\n 'domain',\n 'dataSet',\n 'key01',\n 'key02',\n 'key03',\n 'key04',\n 'key05',\n 'date',\n 'period'\n ])\n\n return true\n } catch (e) {\n logger.error(e)\n }\n\n return false\n}\n"]}
@@ -0,0 +1,6 @@
1
+ export * from './create-data-sample.js';
2
+ export * from './create-data-ooc.js';
3
+ export * from './issue-ooc-review.js';
4
+ export * from './issue-ooc-resolve.js';
5
+ export * from './data-use-case.js';
6
+ export * from './query-data-summary-by-period.js';
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("./create-data-sample.js"), exports);
5
+ tslib_1.__exportStar(require("./create-data-ooc.js"), exports);
6
+ tslib_1.__exportStar(require("./issue-ooc-review.js"), exports);
7
+ tslib_1.__exportStar(require("./issue-ooc-resolve.js"), exports);
8
+ tslib_1.__exportStar(require("./data-use-case.js"), exports);
9
+ tslib_1.__exportStar(require("./query-data-summary-by-period.js"), exports);
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/controllers/index.ts"],"names":[],"mappings":";;;AAAA,kEAAuC;AACvC,+DAAoC;AACpC,gEAAqC;AACrC,iEAAsC;AACtC,6DAAkC;AAClC,4EAAiD","sourcesContent":["export * from './create-data-sample.js'\nexport * from './create-data-ooc.js'\nexport * from './issue-ooc-review.js'\nexport * from './issue-ooc-resolve.js'\nexport * from './data-use-case.js'\nexport * from './query-data-summary-by-period.js'\n"]}
@@ -0,0 +1,2 @@
1
+ import { ActivityInstance } from '@things-factory/worklist';
2
+ export declare function issueDataCollectionTask(domainId: string, dataSetId: string, context: ResolverContext): Promise<ActivityInstance | void>;
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.issueDataCollectionTask = issueDataCollectionTask;
4
+ const typeorm_1 = require("typeorm");
5
+ const shell_1 = require("@things-factory/shell");
6
+ const worklist_1 = require("@things-factory/worklist");
7
+ const data_set_js_1 = require("../service/data-set/data-set.js");
8
+ async function issueDataCollectionTask(domainId, dataSetId, context) {
9
+ return await (0, shell_1.getDataSource)().transaction(async (tx) => {
10
+ const domain = await tx.getRepository(shell_1.Domain).findOneBy({ id: domainId });
11
+ if (!domain) {
12
+ throw new Error(`domain(${domainId}) not found`);
13
+ }
14
+ const domainIds = await (0, shell_1.getDomainIdsWithAncestors)(domain);
15
+ var dataSets = await tx.getRepository(data_set_js_1.DataSet).find({
16
+ where: {
17
+ domain: { id: (0, typeorm_1.In)(domainIds) },
18
+ id: dataSetId
19
+ },
20
+ relations: ['entryRole']
21
+ });
22
+ // ancestors 중 가장 가까운 도메인의 dataSet 선택 (closest-wins)
23
+ const dataSet = [...dataSets].sort((a, b) => domainIds.indexOf(a.domainId) - domainIds.indexOf(b.domainId))[0];
24
+ var activities = await tx.getRepository(worklist_1.Activity).find({
25
+ where: {
26
+ domain: { id: (0, typeorm_1.In)(domainIds) },
27
+ name: 'Collect Data'
28
+ }
29
+ });
30
+ const activity = [...activities].sort((a, b) => domainIds.indexOf(a.domainId) - domainIds.indexOf(b.domainId))[0];
31
+ if (activity) {
32
+ const { entryRole, timeLimit } = dataSet;
33
+ /* 해당 dataset에 대한 데이타 수집 태스크를 dataset entryRole에게 할당한다. */
34
+ if (entryRole) {
35
+ const activityInstance = {
36
+ name: `[Data 수집] ${dataSet.name}`,
37
+ description: dataSet.description,
38
+ activityId: activity.id,
39
+ dueAt: new Date(Date.now() + (timeLimit || activity.standardTime || 24 * 60 * 60) * 1000),
40
+ input: {
41
+ dataSetId: dataSet.id,
42
+ dataSetName: dataSet.name
43
+ },
44
+ assigneeRoles: [entryRole],
45
+ threadsMin: 1,
46
+ threadsMax: 1
47
+ };
48
+ context.state = {
49
+ ...context.state,
50
+ domain,
51
+ tx
52
+ };
53
+ return await (0, worklist_1.issue)(activityInstance, context);
54
+ }
55
+ else {
56
+ throw new Error(`Data Entry Role not set. So Data Collect Activity for ${dataSet.name}($dataSet.id) could not be issued.`);
57
+ }
58
+ }
59
+ else {
60
+ throw new Error(`Data Collect Activity is not installed.`);
61
+ }
62
+ });
63
+ }
64
+ //# sourceMappingURL=issue-data-collection-task.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue-data-collection-task.js","sourceRoot":"","sources":["../../server/controllers/issue-data-collection-task.ts"],"names":[],"mappings":"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","sourcesContent":["import { In } from 'typeorm'\n\nimport { Domain, getDataSource, getDomainIdsWithAncestors } from '@things-factory/shell'\nimport { Activity, ActivityInstance, issue } from '@things-factory/worklist'\n\nimport { DataSet } from '../service/data-set/data-set.js'\n\nexport async function issueDataCollectionTask(\n domainId: string,\n dataSetId: string,\n context: ResolverContext\n): Promise<ActivityInstance | void> {\n return await getDataSource().transaction(async tx => {\n const domain = await tx.getRepository(Domain).findOneBy({ id: domainId })\n\n if (!domain) {\n throw new Error(`domain(${domainId}) not found`)\n }\n\n const domainIds = await getDomainIdsWithAncestors(domain)\n\n var dataSets = await tx.getRepository(DataSet).find({\n where: {\n domain: { id: In(domainIds) },\n id: dataSetId\n },\n relations: ['entryRole']\n })\n\n // ancestors 중 가장 가까운 도메인의 dataSet 선택 (closest-wins)\n const dataSet = [...dataSets].sort(\n (a, b) => domainIds.indexOf(a.domainId) - domainIds.indexOf(b.domainId)\n )[0]\n\n var activities = await tx.getRepository(Activity).find({\n where: {\n domain: { id: In(domainIds) },\n name: 'Collect Data'\n }\n })\n\n const activity = [...activities].sort(\n (a, b) => domainIds.indexOf(a.domainId) - domainIds.indexOf(b.domainId)\n )[0]\n\n if (activity) {\n const { entryRole, timeLimit } = dataSet\n\n /* 해당 dataset에 대한 데이타 수집 태스크를 dataset entryRole에게 할당한다. */\n if (entryRole) {\n const activityInstance = {\n name: `[Data 수집] ${dataSet.name}`,\n description: dataSet.description,\n activityId: activity.id,\n dueAt: new Date(Date.now() + (timeLimit || activity.standardTime || 24 * 60 * 60) * 1000),\n input: {\n dataSetId: dataSet.id,\n dataSetName: dataSet.name\n },\n assigneeRoles: [entryRole],\n threadsMin: 1,\n threadsMax: 1\n }\n\n context.state = {\n ...context.state,\n domain,\n tx\n }\n\n return await issue(activityInstance, context)\n } else {\n throw new Error(\n `Data Entry Role not set. So Data Collect Activity for ${dataSet.name}($dataSet.id) could not be issued.`\n )\n }\n } else {\n throw new Error(`Data Collect Activity is not installed.`)\n }\n })\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import { DataOoc } from '../service/data-ooc/data-ooc.js';
2
+ import { DataSet } from '../service/data-set/data-set.js';
3
+ export declare function issueOocResolve(dataOoc: DataOoc, dataSet: DataSet, correctiveInstruction: string, context: ResolverContext): Promise<void>;
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.issueOocResolve = issueOocResolve;
4
+ const shell_1 = require("@things-factory/shell");
5
+ const typeorm_1 = require("typeorm");
6
+ const worklist_1 = require("@things-factory/worklist");
7
+ const issue_1 = require("@things-factory/worklist/issue");
8
+ const auth_base_1 = require("@things-factory/auth-base");
9
+ const data_ooc_js_1 = require("../service/data-ooc/data-ooc.js");
10
+ async function issueOocResolve(dataOoc, dataSet, correctiveInstruction, context) {
11
+ const { domain, user, tx } = context.state;
12
+ const { resolverRoleId, outlierApprovalLine } = dataSet;
13
+ const domainIds = await (0, shell_1.getDomainIdsWithAncestors)(domain);
14
+ var activities = await tx.getRepository(worklist_1.Activity).find({
15
+ where: {
16
+ domain: { id: (0, typeorm_1.In)(domainIds) },
17
+ name: 'OOC Resolve'
18
+ }
19
+ });
20
+ // ancestors 중 가장 가까운 도메인의 activity 가 우선 (closest-wins customization/override)
21
+ var activity = [...activities].sort((a, b) => domainIds.indexOf(a.domainId) - domainIds.indexOf(b.domainId))[0];
22
+ if (activity) {
23
+ const assigneeRole = resolverRoleId &&
24
+ (await tx.getRepository(auth_base_1.Role).findOneBy({
25
+ domain: { id: (0, typeorm_1.In)(domainIds) },
26
+ id: resolverRoleId
27
+ }));
28
+ /* 해당 dataset의 작업 담당자(resolverRole)에게 OOC 해결을 위한 태스크를 지시한다. */
29
+ if (assigneeRole) {
30
+ const activityInstance = {
31
+ name: `[OOC 조치] ${dataSet.name}`,
32
+ description: dataSet.description,
33
+ activityId: activity.id,
34
+ dueAt: new Date(Date.now() + (activity.standardTime || 24 * 60 * 60) * 1000),
35
+ input: {
36
+ dataOocId: dataOoc.id,
37
+ instruction: correctiveInstruction
38
+ },
39
+ assigneeRoles: [assigneeRole],
40
+ threadsMin: 1,
41
+ threadsMax: 1,
42
+ approvalLine: outlierApprovalLine
43
+ };
44
+ const resolveActivityInstance = await (0, issue_1.issue)(activityInstance, context);
45
+ await tx.getRepository(data_ooc_js_1.DataOoc).update({ id: dataOoc.id }, { resolveActivityInstance });
46
+ }
47
+ else {
48
+ console.error(`Assignees are not set. So, Data OOC Resolve task for ${dataOoc.name}(${dataOoc.id}) could not be issued.`);
49
+ }
50
+ }
51
+ else {
52
+ console.error('OOC Resolve Activity not installed.');
53
+ }
54
+ }
55
+ //# sourceMappingURL=issue-ooc-resolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue-ooc-resolve.js","sourceRoot":"","sources":["../../server/controllers/issue-ooc-resolve.ts"],"names":[],"mappings":";;AASA,0CAyDC;AAlED,iDAAiE;AACjE,qCAA4B;AAC5B,uDAAmD;AACnD,0DAAsD;AACtD,yDAAgD;AAEhD,iEAAyD;AAGlD,KAAK,UAAU,eAAe,CACnC,OAAgB,EAChB,OAAgB,EAChB,qBAA6B,EAC7B,OAAwB;IAExB,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;IAC1C,MAAM,EAAE,cAAc,EAAE,mBAAmB,EAAE,GAAG,OAAO,CAAA;IACvD,MAAM,SAAS,GAAG,MAAM,IAAA,iCAAyB,EAAC,MAAM,CAAC,CAAA;IAEzD,IAAI,UAAU,GAAG,MAAM,EAAE,CAAC,aAAa,CAAC,mBAAQ,CAAC,CAAC,IAAI,CAAC;QACrD,KAAK,EAAE;YACL,MAAM,EAAE,EAAE,EAAE,EAAE,IAAA,YAAE,EAAC,SAAS,CAAC,EAAE;YAC7B,IAAI,EAAE,aAAa;SACpB;KACF,CAAC,CAAA;IAEF,8EAA8E;IAC9E,IAAI,QAAQ,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,IAAI,CACjC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CACxE,CAAC,CAAC,CAAC,CAAA;IAEJ,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,YAAY,GAChB,cAAc;YACd,CAAC,MAAM,EAAE,CAAC,aAAa,CAAC,gBAAI,CAAC,CAAC,SAAS,CAAC;gBACtC,MAAM,EAAE,EAAE,EAAE,EAAE,IAAA,YAAE,EAAC,SAAS,CAAC,EAAE;gBAC7B,EAAE,EAAE,cAAc;aACnB,CAAC,CAAC,CAAA;QAEL,8DAA8D;QAC9D,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,gBAAgB,GAAG;gBACvB,IAAI,EAAE,YAAY,OAAO,CAAC,IAAI,EAAE;gBAChC,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,UAAU,EAAE,QAAQ,CAAC,EAAE;gBACvB,KAAK,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,QAAQ,CAAC,YAAY,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC;gBAC5E,KAAK,EAAE;oBACL,SAAS,EAAE,OAAO,CAAC,EAAE;oBACrB,WAAW,EAAE,qBAAqB;iBACnC;gBACD,aAAa,EAAE,CAAC,YAAY,CAAC;gBAC7B,UAAU,EAAE,CAAC;gBACb,UAAU,EAAE,CAAC;gBACb,YAAY,EAAE,mBAAmB;aAClC,CAAA;YAED,MAAM,uBAAuB,GAAG,MAAM,IAAA,aAAK,EAAC,gBAAgB,EAAE,OAAO,CAAC,CAAA;YACtE,MAAM,EAAE,CAAC,aAAa,CAAC,qBAAO,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,uBAAuB,EAAE,CAAC,CAAA;QACzF,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CACX,wDAAwD,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,EAAE,wBAAwB,CAC3G,CAAA;QACH,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAA;IACtD,CAAC;AACH,CAAC","sourcesContent":["import { getDomainIdsWithAncestors } from '@things-factory/shell'\nimport { In } from 'typeorm'\nimport { Activity } from '@things-factory/worklist'\nimport { issue } from '@things-factory/worklist/issue'\nimport { Role } from '@things-factory/auth-base'\n\nimport { DataOoc } from '../service/data-ooc/data-ooc.js'\nimport { DataSet } from '../service/data-set/data-set.js'\n\nexport async function issueOocResolve(\n dataOoc: DataOoc,\n dataSet: DataSet,\n correctiveInstruction: string,\n context: ResolverContext\n): Promise<void> {\n const { domain, user, tx } = context.state\n const { resolverRoleId, outlierApprovalLine } = dataSet\n const domainIds = await getDomainIdsWithAncestors(domain)\n\n var activities = await tx.getRepository(Activity).find({\n where: {\n domain: { id: In(domainIds) },\n name: 'OOC Resolve'\n }\n })\n\n // ancestors 중 가장 가까운 도메인의 activity 가 우선 (closest-wins customization/override)\n var activity = [...activities].sort(\n (a, b) => domainIds.indexOf(a.domainId) - domainIds.indexOf(b.domainId)\n )[0]\n\n if (activity) {\n const assigneeRole =\n resolverRoleId &&\n (await tx.getRepository(Role).findOneBy({\n domain: { id: In(domainIds) },\n id: resolverRoleId\n }))\n\n /* 해당 dataset의 작업 담당자(resolverRole)에게 OOC 해결을 위한 태스크를 지시한다. */\n if (assigneeRole) {\n const activityInstance = {\n name: `[OOC 조치] ${dataSet.name}`,\n description: dataSet.description,\n activityId: activity.id,\n dueAt: new Date(Date.now() + (activity.standardTime || 24 * 60 * 60) * 1000),\n input: {\n dataOocId: dataOoc.id,\n instruction: correctiveInstruction\n },\n assigneeRoles: [assigneeRole],\n threadsMin: 1,\n threadsMax: 1,\n approvalLine: outlierApprovalLine\n }\n\n const resolveActivityInstance = await issue(activityInstance, context)\n await tx.getRepository(DataOoc).update({ id: dataOoc.id }, { resolveActivityInstance })\n } else {\n console.error(\n `Assignees are not set. So, Data OOC Resolve task for ${dataOoc.name}(${dataOoc.id}) could not be issued.`\n )\n }\n } else {\n console.error('OOC Resolve Activity not installed.')\n }\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import { DataSet } from '../service/data-set/data-set.js';
2
+ import { DataOoc } from '../service/data-ooc/data-ooc.js';
3
+ export declare function issueOocReview(dataOoc: DataOoc, dataSet: DataSet, context: ResolverContext): Promise<void>;
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.issueOocReview = issueOocReview;
4
+ const shell_1 = require("@things-factory/shell");
5
+ const typeorm_1 = require("typeorm");
6
+ const auth_base_1 = require("@things-factory/auth-base");
7
+ const worklist_1 = require("@things-factory/worklist");
8
+ const issue_1 = require("@things-factory/worklist/issue");
9
+ const data_ooc_js_1 = require("../service/data-ooc/data-ooc.js");
10
+ async function issueOocReview(dataOoc, dataSet, context) {
11
+ const { domain, tx } = context.state;
12
+ const { collectedAt } = dataOoc;
13
+ const domainIds = await (0, shell_1.getDomainIdsWithAncestors)(domain);
14
+ var activities = await tx.getRepository(worklist_1.Activity).find({
15
+ where: {
16
+ domain: { id: (0, typeorm_1.In)(domainIds) },
17
+ name: 'OOC Review'
18
+ }
19
+ });
20
+ var activity = [...activities].sort((a, b) => domainIds.indexOf(a.domainId) - domainIds.indexOf(b.domainId))[0];
21
+ if (activity) {
22
+ const assigneeRole = dataSet.supervisoryRoleId &&
23
+ (await tx.getRepository(auth_base_1.Role).findOneBy({
24
+ domain: { id: (0, typeorm_1.In)(domainIds) },
25
+ id: dataSet.supervisoryRoleId
26
+ }));
27
+ if (assigneeRole) {
28
+ const activityInstance = {
29
+ name: `[OOC 검토] ${dataSet.name}`,
30
+ description: dataSet.description,
31
+ activityId: activity.id,
32
+ dueAt: new Date(collectedAt.getTime() + (activity.standardTime || 24 * 60 * 60) * 1000),
33
+ input: {
34
+ dataOocId: dataOoc.id
35
+ },
36
+ assigneeRoles: [assigneeRole],
37
+ threadsMin: 1,
38
+ threadsMax: 1,
39
+ approvalLine: []
40
+ };
41
+ const reviewActivityInstance = await (0, issue_1.issue)(activityInstance, context);
42
+ await tx.getRepository(data_ooc_js_1.DataOoc).update({ id: dataOoc.id }, { reviewActivityInstance });
43
+ }
44
+ else {
45
+ console.error(`Assignees are not set. So Data OOC Review task for ${dataOoc.name}(${dataOoc.id}) could not be issued.`);
46
+ }
47
+ }
48
+ else {
49
+ console.warn('OOC Review Activity not installed.');
50
+ }
51
+ }
52
+ //# sourceMappingURL=issue-ooc-review.js.map