@rytass/bpm-core-nestjs-module 0.4.0 → 0.5.0

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 (658) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/eslint.config.mjs +20 -0
  3. package/jest.config.cts +15 -0
  4. package/package.json +2 -2
  5. package/project.json +58 -0
  6. package/src/lib/attachment/attachment-options.spec.ts +45 -0
  7. package/src/lib/attachment/attachment-options.ts +130 -0
  8. package/src/lib/attachment/attachment-storage.provider.spec.ts +79 -0
  9. package/src/lib/attachment/attachment-storage.provider.ts +60 -0
  10. package/src/lib/attachment/{attachment-storage.token.d.ts → attachment-storage.token.ts} +3 -1
  11. package/src/lib/attachment/attachment.controller.ts +39 -0
  12. package/src/lib/attachment/attachment.entity.ts +59 -0
  13. package/src/lib/attachment/attachment.module.ts +149 -0
  14. package/src/lib/attachment/attachment.mutations.ts +22 -0
  15. package/src/lib/attachment/attachment.queries.ts +65 -0
  16. package/src/lib/attachment/attachment.service.spec.ts +319 -0
  17. package/src/lib/attachment/attachment.service.ts +477 -0
  18. package/src/lib/attachment/dto/upload-attachment.input.ts +60 -0
  19. package/src/lib/bpm/bpm-root.module.spec.ts +138 -0
  20. package/src/lib/bpm/bpm-root.module.ts +320 -0
  21. package/src/lib/bpm-auth/bpm-auth-context.extractor.ts +106 -0
  22. package/src/lib/bpm-auth/bpm-auth-context.ts +40 -0
  23. package/src/lib/bpm-auth/bpm-auth.authorization.ts +80 -0
  24. package/src/lib/bpm-auth/bpm-auth.decorators.ts +19 -0
  25. package/src/lib/bpm-auth/bpm-auth.guard.ts +31 -0
  26. package/src/lib/bpm-auth/bpm-auth.module.spec.ts +106 -0
  27. package/src/lib/bpm-auth/bpm-auth.module.ts +69 -0
  28. package/src/lib/bpm-auth/bpm-auth.options.ts +21 -0
  29. package/src/lib/bpm-auth/configurable-bpm-auth-context.accessor.ts +55 -0
  30. package/src/lib/common/filters/all-exceptions.filter.ts +138 -0
  31. package/src/lib/common/iso-duration.ts +31 -0
  32. package/src/lib/condition/condition.module.ts +8 -0
  33. package/src/lib/condition/condition.service.spec.ts +50 -0
  34. package/src/lib/condition/condition.service.ts +141 -0
  35. package/src/lib/database/data-source.ts +7 -0
  36. package/src/lib/database/migration-runner.ts +26 -0
  37. package/src/lib/database/reconcile-legacy-migrations.ts +87 -0
  38. package/src/lib/database/typeorm.config.ts +217 -0
  39. package/src/lib/delegation/delegation-rule.entity.ts +84 -0
  40. package/src/lib/delegation/delegation.enums.ts +21 -0
  41. package/src/lib/delegation/delegation.module.ts +14 -0
  42. package/src/lib/delegation/delegation.mutations.ts +92 -0
  43. package/src/lib/delegation/delegation.queries.ts +111 -0
  44. package/src/lib/delegation/delegation.service.spec.ts +295 -0
  45. package/src/lib/delegation/delegation.service.ts +482 -0
  46. package/src/lib/delegation/dto/delegation-rule.input.ts +125 -0
  47. package/src/lib/form/dto/form-definition.input.ts +90 -0
  48. package/src/lib/form/form-definition-version.entity.ts +66 -0
  49. package/src/lib/form/form-definition.entity.ts +54 -0
  50. package/src/lib/form/form-schema-lint.object.ts +10 -0
  51. package/src/lib/form/form-schema.validator.spec.ts +180 -0
  52. package/src/lib/form/form-schema.validator.ts +538 -0
  53. package/src/lib/form/form.enums.ts +20 -0
  54. package/src/lib/form/form.module.ts +19 -0
  55. package/src/lib/form/form.mutations.ts +73 -0
  56. package/src/lib/form/form.queries.ts +72 -0
  57. package/src/lib/form/form.service.spec.ts +371 -0
  58. package/src/lib/form/form.service.ts +607 -0
  59. package/src/lib/identity/identity-options.ts +41 -0
  60. package/src/lib/identity/identity.module.ts +96 -0
  61. package/src/lib/identity/identity.queries.ts +61 -0
  62. package/src/lib/identity/identity.service.spec.ts +328 -0
  63. package/src/lib/identity/identity.service.ts +277 -0
  64. package/src/lib/identity/member-base.adapter.spec.ts +122 -0
  65. package/src/lib/identity/member-base.adapter.ts +302 -0
  66. package/src/lib/identity/member-metadata-cache.entity.ts +27 -0
  67. package/src/lib/identity/{member-not-found.exception.d.ts → member-not-found.exception.ts} +8 -3
  68. package/src/lib/identity/member-profile.object.ts +28 -0
  69. package/src/lib/identity/member-resolver.interface.ts +140 -0
  70. package/src/lib/migrations/0000000000001-enable-postgres-extensions.ts +14 -0
  71. package/src/lib/migrations/{0000000001000-identity-organization-foundation.js → 0000000001000-identity-organization-foundation.ts} +38 -29
  72. package/src/lib/migrations/{0000000002000-form-builder-foundation.js → 0000000002000-form-builder-foundation.ts} +22 -21
  73. package/src/lib/migrations/{0000000003000-approval-template-foundation.js → 0000000003000-approval-template-foundation.ts} +24 -21
  74. package/src/lib/migrations/{0000000004000-workflow-engine-foundation.js → 0000000004000-workflow-engine-foundation.ts} +46 -34
  75. package/src/lib/migrations/{0000000005000-delegation-rules.js → 0000000005000-delegation-rules.ts} +20 -19
  76. package/src/lib/migrations/{0000000006000-notifications-sla.js → 0000000006000-notifications-sla.ts} +26 -23
  77. package/src/lib/migrations/{0000000007000-signatures-attachments.js → 0000000007000-signatures-attachments.ts} +28 -27
  78. package/src/lib/migrations/{0000000008000-approval-template-categories.js → 0000000008000-approval-template-categories.ts} +28 -25
  79. package/src/lib/migrations/{0000000009000-task-candidates.js → 0000000009000-task-candidates.ts} +26 -23
  80. package/src/lib/migrations/{0000000010000-notification-delivery-state.js → 0000000010000-notification-delivery-state.ts} +16 -17
  81. package/src/lib/migrations/0000000011000-remove-attachment-encryption-key.ts +19 -0
  82. package/src/lib/migrations/0000000012000-notification-sla-idempotency.ts +22 -0
  83. package/src/lib/migrations/0000000013000-workflow-query-indexes.ts +113 -0
  84. package/src/lib/migrations/0000000014000-notification-resolution.ts +29 -0
  85. package/src/lib/migrations/{0000000015000-backfill-stale-notification-resolution.js → 0000000015000-backfill-stale-notification-resolution.ts} +15 -16
  86. package/src/lib/migrations/{0000000016000-archive-parallel-form-drafts.js → 0000000016000-archive-parallel-form-drafts.ts} +15 -16
  87. package/src/lib/migrations/{0000000017000-adhoc-directives.js → 0000000017000-adhoc-directives.ts} +18 -19
  88. package/src/lib/migrations/index.ts +59 -0
  89. package/src/lib/notification/dto/notification-preference.input.ts +46 -0
  90. package/src/lib/notification/notification-delivery-scheduler.service.ts +69 -0
  91. package/src/lib/notification/notification-delivery.service.spec.ts +315 -0
  92. package/src/lib/notification/notification-delivery.service.ts +339 -0
  93. package/src/lib/notification/notification-dispatcher.token.ts +13 -0
  94. package/src/lib/notification/notification-options.module.ts +67 -0
  95. package/src/lib/notification/notification-options.spec.ts +93 -0
  96. package/src/lib/notification/notification-options.ts +452 -0
  97. package/src/lib/notification/notification-preference.entity.ts +35 -0
  98. package/src/lib/notification/notification-sla-scheduler.service.ts +66 -0
  99. package/src/lib/notification/notification-template.spec.ts +33 -0
  100. package/src/lib/notification/notification-template.ts +97 -0
  101. package/src/lib/notification/notification.entity.ts +129 -0
  102. package/src/lib/notification/notification.enums.ts +64 -0
  103. package/src/lib/notification/notification.module.ts +37 -0
  104. package/src/lib/notification/notification.mutations.ts +47 -0
  105. package/src/lib/notification/notification.queries.ts +64 -0
  106. package/src/lib/notification/notification.service.spec.ts +412 -0
  107. package/src/lib/notification/notification.service.ts +1129 -0
  108. package/src/lib/organization/dto/manager-resolution.input.ts +91 -0
  109. package/src/lib/organization/dto/membership.input.ts +77 -0
  110. package/src/lib/organization/dto/org-unit.input.ts +96 -0
  111. package/src/lib/organization/dto/position.input.ts +50 -0
  112. package/src/lib/organization/json-metadata.ts +15 -0
  113. package/src/lib/organization/manager-resolution.entity.ts +44 -0
  114. package/src/lib/organization/membership.entity.ts +50 -0
  115. package/src/lib/organization/org-unit-tree-commit-result.object.ts +8 -0
  116. package/src/lib/organization/org-unit.entity.ts +53 -0
  117. package/src/lib/organization/organization-summary.object.ts +16 -0
  118. package/src/lib/organization/organization.enums.ts +19 -0
  119. package/src/lib/organization/organization.module.ts +27 -0
  120. package/src/lib/organization/organization.mutations.ts +115 -0
  121. package/src/lib/organization/organization.queries.ts +191 -0
  122. package/src/lib/organization/organization.service.spec.ts +835 -0
  123. package/src/lib/organization/organization.service.ts +1245 -0
  124. package/src/lib/organization/position.entity.ts +39 -0
  125. package/src/lib/organization/resolved-manager.object.ts +10 -0
  126. package/src/lib/signature/signature-options.spec.ts +60 -0
  127. package/src/lib/signature/signature-options.ts +120 -0
  128. package/src/lib/signature/signature-verification.object.ts +16 -0
  129. package/src/lib/signature/signature.entity.ts +62 -0
  130. package/src/lib/signature/signature.module.ts +80 -0
  131. package/src/lib/signature/signature.queries.ts +37 -0
  132. package/src/lib/signature/signature.service.spec.ts +134 -0
  133. package/src/lib/signature/signature.service.ts +205 -0
  134. package/src/lib/template/approval-template-category.entity.ts +40 -0
  135. package/src/lib/template/approval-template-version.entity.ts +82 -0
  136. package/src/lib/template/approval-template.entity.ts +64 -0
  137. package/src/lib/template/compose-approval-template.object.ts +23 -0
  138. package/src/lib/template/compose-template.mutations.ts +22 -0
  139. package/src/lib/template/dto/approval-template.input.ts +147 -0
  140. package/src/lib/template/dto/compose-approval-template.input.ts +80 -0
  141. package/src/lib/template/template.enums.ts +30 -0
  142. package/src/lib/template/template.module.ts +33 -0
  143. package/src/lib/template/template.mutations.ts +106 -0
  144. package/src/lib/template/template.queries.ts +119 -0
  145. package/src/lib/template/template.service.spec.ts +822 -0
  146. package/src/lib/template/template.service.ts +1082 -0
  147. package/src/lib/template/workflow-definition.validator.spec.ts +595 -0
  148. package/src/lib/template/workflow-definition.validator.ts +539 -0
  149. package/src/lib/testing/cel-js.jest.ts +46 -0
  150. package/src/lib/workflow-engine/activity-log.entity.ts +48 -0
  151. package/src/lib/workflow-engine/adhoc-directive.entity.ts +90 -0
  152. package/src/lib/workflow-engine/adhoc.enums.ts +42 -0
  153. package/src/lib/workflow-engine/approval-instance-page-info.object.ts +22 -0
  154. package/src/lib/workflow-engine/approval-instance.entity.ts +86 -0
  155. package/src/lib/workflow-engine/dto/adhoc-notification.input.ts +18 -0
  156. package/src/lib/workflow-engine/dto/adhoc-target.input.ts +52 -0
  157. package/src/lib/workflow-engine/dto/cancel-approval-instance.input.ts +18 -0
  158. package/src/lib/workflow-engine/dto/decide-task.input.ts +33 -0
  159. package/src/lib/workflow-engine/dto/dry-run-approval-workflow.input.ts +22 -0
  160. package/src/lib/workflow-engine/dto/resubmit-approval-instance.input.ts +22 -0
  161. package/src/lib/workflow-engine/dto/submit-approval-instance.input.ts +27 -0
  162. package/src/lib/workflow-engine/task-candidate.entity.ts +56 -0
  163. package/src/lib/workflow-engine/task-decision.entity.ts +43 -0
  164. package/src/lib/workflow-engine/task.entity.ts +102 -0
  165. package/src/lib/workflow-engine/workflow-condition-evaluator.ts +168 -0
  166. package/src/lib/workflow-engine/workflow-dashboard-summary.object.ts +22 -0
  167. package/src/lib/workflow-engine/workflow-dry-run.object.ts +58 -0
  168. package/src/lib/workflow-engine/workflow-engine.enums.ts +102 -0
  169. package/src/lib/workflow-engine/workflow-engine.module.ts +77 -0
  170. package/src/lib/workflow-engine/workflow-engine.mutations.ts +193 -0
  171. package/src/lib/workflow-engine/workflow-engine.queries.ts +241 -0
  172. package/src/lib/workflow-engine/workflow-engine.service.spec.ts +3345 -0
  173. package/src/lib/workflow-engine/workflow-engine.service.ts +6022 -0
  174. package/src/lib/workflow-engine/{workflow-engine.tokens.d.ts → workflow-engine.tokens.ts} +9 -3
  175. package/src/lib/workflow-engine/workflow-service-task-dispatcher.token.ts +69 -0
  176. package/src/lib/workflow-engine/workflow-token.entity.ts +40 -0
  177. package/tsconfig.json +24 -0
  178. package/tsconfig.lib.json +16 -0
  179. package/tsconfig.spec.json +16 -0
  180. package/src/index.js +0 -18
  181. package/src/index.js.map +0 -1
  182. package/src/lib/attachment/attachment-options.d.ts +0 -44
  183. package/src/lib/attachment/attachment-options.js +0 -62
  184. package/src/lib/attachment/attachment-options.js.map +0 -1
  185. package/src/lib/attachment/attachment-storage.provider.d.ts +0 -4
  186. package/src/lib/attachment/attachment-storage.provider.js +0 -35
  187. package/src/lib/attachment/attachment-storage.provider.js.map +0 -1
  188. package/src/lib/attachment/attachment-storage.token.js +0 -5
  189. package/src/lib/attachment/attachment-storage.token.js.map +0 -1
  190. package/src/lib/attachment/attachment.controller.d.ts +0 -8
  191. package/src/lib/attachment/attachment.controller.js +0 -38
  192. package/src/lib/attachment/attachment.controller.js.map +0 -1
  193. package/src/lib/attachment/attachment.entity.d.ts +0 -14
  194. package/src/lib/attachment/attachment.entity.js +0 -74
  195. package/src/lib/attachment/attachment.entity.js.map +0 -1
  196. package/src/lib/attachment/attachment.module.d.ts +0 -27
  197. package/src/lib/attachment/attachment.module.js +0 -103
  198. package/src/lib/attachment/attachment.module.js.map +0 -1
  199. package/src/lib/attachment/attachment.mutations.d.ts +0 -8
  200. package/src/lib/attachment/attachment.mutations.js +0 -35
  201. package/src/lib/attachment/attachment.mutations.js.map +0 -1
  202. package/src/lib/attachment/attachment.queries.d.ts +0 -9
  203. package/src/lib/attachment/attachment.queries.js +0 -78
  204. package/src/lib/attachment/attachment.queries.js.map +0 -1
  205. package/src/lib/attachment/attachment.service.d.ts +0 -49
  206. package/src/lib/attachment/attachment.service.js +0 -276
  207. package/src/lib/attachment/attachment.service.js.map +0 -1
  208. package/src/lib/attachment/dto/upload-attachment.input.d.ts +0 -11
  209. package/src/lib/attachment/dto/upload-attachment.input.js +0 -68
  210. package/src/lib/attachment/dto/upload-attachment.input.js.map +0 -1
  211. package/src/lib/attachment/index.js +0 -9
  212. package/src/lib/attachment/index.js.map +0 -1
  213. package/src/lib/bpm/bpm-root.module.d.ts +0 -155
  214. package/src/lib/bpm/bpm-root.module.js +0 -170
  215. package/src/lib/bpm/bpm-root.module.js.map +0 -1
  216. package/src/lib/bpm/index.js +0 -5
  217. package/src/lib/bpm/index.js.map +0 -1
  218. package/src/lib/bpm-auth/bpm-auth-context.d.ts +0 -24
  219. package/src/lib/bpm-auth/bpm-auth-context.extractor.d.ts +0 -4
  220. package/src/lib/bpm-auth/bpm-auth-context.extractor.js +0 -69
  221. package/src/lib/bpm-auth/bpm-auth-context.extractor.js.map +0 -1
  222. package/src/lib/bpm-auth/bpm-auth-context.js +0 -15
  223. package/src/lib/bpm-auth/bpm-auth-context.js.map +0 -1
  224. package/src/lib/bpm-auth/bpm-auth.authorization.d.ts +0 -12
  225. package/src/lib/bpm-auth/bpm-auth.authorization.js +0 -67
  226. package/src/lib/bpm-auth/bpm-auth.authorization.js.map +0 -1
  227. package/src/lib/bpm-auth/bpm-auth.decorators.d.ts +0 -3
  228. package/src/lib/bpm-auth/bpm-auth.decorators.js +0 -11
  229. package/src/lib/bpm-auth/bpm-auth.decorators.js.map +0 -1
  230. package/src/lib/bpm-auth/bpm-auth.guard.d.ts +0 -7
  231. package/src/lib/bpm-auth/bpm-auth.guard.js +0 -24
  232. package/src/lib/bpm-auth/bpm-auth.guard.js.map +0 -1
  233. package/src/lib/bpm-auth/bpm-auth.module.d.ts +0 -6
  234. package/src/lib/bpm-auth/bpm-auth.module.js +0 -69
  235. package/src/lib/bpm-auth/bpm-auth.module.js.map +0 -1
  236. package/src/lib/bpm-auth/bpm-auth.options.d.ts +0 -11
  237. package/src/lib/bpm-auth/bpm-auth.options.js +0 -3
  238. package/src/lib/bpm-auth/bpm-auth.options.js.map +0 -1
  239. package/src/lib/bpm-auth/configurable-bpm-auth-context.accessor.d.ts +0 -10
  240. package/src/lib/bpm-auth/configurable-bpm-auth-context.accessor.js +0 -40
  241. package/src/lib/bpm-auth/configurable-bpm-auth-context.accessor.js.map +0 -1
  242. package/src/lib/bpm-auth/index.js +0 -10
  243. package/src/lib/bpm-auth/index.js.map +0 -1
  244. package/src/lib/common/filters/all-exceptions.filter.d.ts +0 -25
  245. package/src/lib/common/filters/all-exceptions.filter.js +0 -93
  246. package/src/lib/common/filters/all-exceptions.filter.js.map +0 -1
  247. package/src/lib/common/index.js +0 -5
  248. package/src/lib/common/index.js.map +0 -1
  249. package/src/lib/common/iso-duration.d.ts +0 -1
  250. package/src/lib/common/iso-duration.js +0 -27
  251. package/src/lib/common/iso-duration.js.map +0 -1
  252. package/src/lib/condition/condition.module.d.ts +0 -2
  253. package/src/lib/condition/condition.module.js +0 -16
  254. package/src/lib/condition/condition.module.js.map +0 -1
  255. package/src/lib/condition/condition.service.d.ts +0 -16
  256. package/src/lib/condition/condition.service.js +0 -82
  257. package/src/lib/condition/condition.service.js.map +0 -1
  258. package/src/lib/condition/index.js +0 -6
  259. package/src/lib/condition/index.js.map +0 -1
  260. package/src/lib/database/data-source.d.ts +0 -4
  261. package/src/lib/database/data-source.js +0 -7
  262. package/src/lib/database/data-source.js.map +0 -1
  263. package/src/lib/database/index.js +0 -6
  264. package/src/lib/database/index.js.map +0 -1
  265. package/src/lib/database/migration-runner.d.ts +0 -1
  266. package/src/lib/database/migration-runner.js +0 -25
  267. package/src/lib/database/migration-runner.js.map +0 -1
  268. package/src/lib/database/reconcile-legacy-migrations.d.ts +0 -13
  269. package/src/lib/database/reconcile-legacy-migrations.js +0 -70
  270. package/src/lib/database/reconcile-legacy-migrations.js.map +0 -1
  271. package/src/lib/database/typeorm.config.d.ts +0 -14
  272. package/src/lib/database/typeorm.config.js +0 -135
  273. package/src/lib/database/typeorm.config.js.map +0 -1
  274. package/src/lib/delegation/delegation-rule.entity.d.ts +0 -19
  275. package/src/lib/delegation/delegation-rule.entity.js +0 -99
  276. package/src/lib/delegation/delegation-rule.entity.js.map +0 -1
  277. package/src/lib/delegation/delegation.enums.d.ts +0 -10
  278. package/src/lib/delegation/delegation.enums.js +0 -23
  279. package/src/lib/delegation/delegation.enums.js.map +0 -1
  280. package/src/lib/delegation/delegation.module.d.ts +0 -2
  281. package/src/lib/delegation/delegation.module.js +0 -22
  282. package/src/lib/delegation/delegation.module.js.map +0 -1
  283. package/src/lib/delegation/delegation.mutations.d.ts +0 -11
  284. package/src/lib/delegation/delegation.mutations.js +0 -87
  285. package/src/lib/delegation/delegation.mutations.js.map +0 -1
  286. package/src/lib/delegation/delegation.queries.d.ts +0 -10
  287. package/src/lib/delegation/delegation.queries.js +0 -91
  288. package/src/lib/delegation/delegation.queries.js.map +0 -1
  289. package/src/lib/delegation/delegation.service.d.ts +0 -56
  290. package/src/lib/delegation/delegation.service.js +0 -268
  291. package/src/lib/delegation/delegation.service.js.map +0 -1
  292. package/src/lib/delegation/dto/delegation-rule.input.d.ts +0 -24
  293. package/src/lib/delegation/dto/delegation-rule.input.js +0 -143
  294. package/src/lib/delegation/dto/delegation-rule.input.js.map +0 -1
  295. package/src/lib/delegation/index.js +0 -9
  296. package/src/lib/delegation/index.js.map +0 -1
  297. package/src/lib/form/dto/form-definition.input.d.ts +0 -26
  298. package/src/lib/form/dto/form-definition.input.js +0 -126
  299. package/src/lib/form/dto/form-definition.input.js.map +0 -1
  300. package/src/lib/form/form-definition-version.entity.d.ts +0 -17
  301. package/src/lib/form/form-definition-version.entity.js +0 -84
  302. package/src/lib/form/form-definition-version.entity.js.map +0 -1
  303. package/src/lib/form/form-definition.entity.d.ts +0 -13
  304. package/src/lib/form/form-definition.entity.js +0 -66
  305. package/src/lib/form/form-definition.entity.js.map +0 -1
  306. package/src/lib/form/form-schema-lint.object.d.ts +0 -4
  307. package/src/lib/form/form-schema-lint.object.js +0 -20
  308. package/src/lib/form/form-schema-lint.object.js.map +0 -1
  309. package/src/lib/form/form-schema.validator.d.ts +0 -13
  310. package/src/lib/form/form-schema.validator.js +0 -354
  311. package/src/lib/form/form-schema.validator.js.map +0 -1
  312. package/src/lib/form/form.enums.d.ts +0 -9
  313. package/src/lib/form/form.enums.js +0 -22
  314. package/src/lib/form/form.enums.js.map +0 -1
  315. package/src/lib/form/form.module.d.ts +0 -2
  316. package/src/lib/form/form.module.js +0 -27
  317. package/src/lib/form/form.module.js.map +0 -1
  318. package/src/lib/form/form.mutations.d.ts +0 -14
  319. package/src/lib/form/form.mutations.js +0 -89
  320. package/src/lib/form/form.mutations.js.map +0 -1
  321. package/src/lib/form/form.queries.d.ts +0 -16
  322. package/src/lib/form/form.queries.js +0 -96
  323. package/src/lib/form/form.queries.js.map +0 -1
  324. package/src/lib/form/form.service.d.ts +0 -49
  325. package/src/lib/form/form.service.js +0 -346
  326. package/src/lib/form/form.service.js.map +0 -1
  327. package/src/lib/form/index.js +0 -12
  328. package/src/lib/form/index.js.map +0 -1
  329. package/src/lib/identity/identity-options.d.ts +0 -13
  330. package/src/lib/identity/identity-options.js +0 -20
  331. package/src/lib/identity/identity-options.js.map +0 -1
  332. package/src/lib/identity/identity.module.d.ts +0 -17
  333. package/src/lib/identity/identity.module.js +0 -65
  334. package/src/lib/identity/identity.module.js.map +0 -1
  335. package/src/lib/identity/identity.queries.d.ts +0 -12
  336. package/src/lib/identity/identity.queries.js +0 -79
  337. package/src/lib/identity/identity.queries.js.map +0 -1
  338. package/src/lib/identity/identity.service.d.ts +0 -22
  339. package/src/lib/identity/identity.service.js +0 -141
  340. package/src/lib/identity/identity.service.js.map +0 -1
  341. package/src/lib/identity/index.js +0 -8
  342. package/src/lib/identity/index.js.map +0 -1
  343. package/src/lib/identity/member-base.adapter.d.ts +0 -95
  344. package/src/lib/identity/member-base.adapter.js +0 -137
  345. package/src/lib/identity/member-base.adapter.js.map +0 -1
  346. package/src/lib/identity/member-metadata-cache.entity.d.ts +0 -8
  347. package/src/lib/identity/member-metadata-cache.entity.js +0 -39
  348. package/src/lib/identity/member-metadata-cache.entity.js.map +0 -1
  349. package/src/lib/identity/member-not-found.exception.js +0 -26
  350. package/src/lib/identity/member-not-found.exception.js.map +0 -1
  351. package/src/lib/identity/member-profile.object.d.ts +0 -8
  352. package/src/lib/identity/member-profile.object.js +0 -37
  353. package/src/lib/identity/member-profile.object.js.map +0 -1
  354. package/src/lib/identity/member-resolver.interface.d.ts +0 -79
  355. package/src/lib/identity/member-resolver.interface.js +0 -19
  356. package/src/lib/identity/member-resolver.interface.js.map +0 -1
  357. package/src/lib/migrations/0000000000001-enable-postgres-extensions.d.ts +0 -6
  358. package/src/lib/migrations/0000000000001-enable-postgres-extensions.js +0 -17
  359. package/src/lib/migrations/0000000000001-enable-postgres-extensions.js.map +0 -1
  360. package/src/lib/migrations/0000000001000-identity-organization-foundation.d.ts +0 -6
  361. package/src/lib/migrations/0000000001000-identity-organization-foundation.js.map +0 -1
  362. package/src/lib/migrations/0000000002000-form-builder-foundation.d.ts +0 -6
  363. package/src/lib/migrations/0000000002000-form-builder-foundation.js.map +0 -1
  364. package/src/lib/migrations/0000000003000-approval-template-foundation.d.ts +0 -6
  365. package/src/lib/migrations/0000000003000-approval-template-foundation.js.map +0 -1
  366. package/src/lib/migrations/0000000004000-workflow-engine-foundation.d.ts +0 -6
  367. package/src/lib/migrations/0000000004000-workflow-engine-foundation.js.map +0 -1
  368. package/src/lib/migrations/0000000005000-delegation-rules.d.ts +0 -6
  369. package/src/lib/migrations/0000000005000-delegation-rules.js.map +0 -1
  370. package/src/lib/migrations/0000000006000-notifications-sla.d.ts +0 -6
  371. package/src/lib/migrations/0000000006000-notifications-sla.js.map +0 -1
  372. package/src/lib/migrations/0000000007000-signatures-attachments.d.ts +0 -6
  373. package/src/lib/migrations/0000000007000-signatures-attachments.js.map +0 -1
  374. package/src/lib/migrations/0000000008000-approval-template-categories.d.ts +0 -6
  375. package/src/lib/migrations/0000000008000-approval-template-categories.js.map +0 -1
  376. package/src/lib/migrations/0000000009000-task-candidates.d.ts +0 -6
  377. package/src/lib/migrations/0000000009000-task-candidates.js.map +0 -1
  378. package/src/lib/migrations/0000000010000-notification-delivery-state.d.ts +0 -6
  379. package/src/lib/migrations/0000000010000-notification-delivery-state.js.map +0 -1
  380. package/src/lib/migrations/0000000011000-remove-attachment-encryption-key.d.ts +0 -6
  381. package/src/lib/migrations/0000000011000-remove-attachment-encryption-key.js +0 -22
  382. package/src/lib/migrations/0000000011000-remove-attachment-encryption-key.js.map +0 -1
  383. package/src/lib/migrations/0000000012000-notification-sla-idempotency.d.ts +0 -6
  384. package/src/lib/migrations/0000000012000-notification-sla-idempotency.js +0 -21
  385. package/src/lib/migrations/0000000012000-notification-sla-idempotency.js.map +0 -1
  386. package/src/lib/migrations/0000000013000-workflow-query-indexes.d.ts +0 -6
  387. package/src/lib/migrations/0000000013000-workflow-query-indexes.js +0 -80
  388. package/src/lib/migrations/0000000013000-workflow-query-indexes.js.map +0 -1
  389. package/src/lib/migrations/0000000014000-notification-resolution.d.ts +0 -6
  390. package/src/lib/migrations/0000000014000-notification-resolution.js +0 -30
  391. package/src/lib/migrations/0000000014000-notification-resolution.js.map +0 -1
  392. package/src/lib/migrations/0000000015000-backfill-stale-notification-resolution.d.ts +0 -15
  393. package/src/lib/migrations/0000000015000-backfill-stale-notification-resolution.js.map +0 -1
  394. package/src/lib/migrations/0000000016000-archive-parallel-form-drafts.d.ts +0 -15
  395. package/src/lib/migrations/0000000016000-archive-parallel-form-drafts.js.map +0 -1
  396. package/src/lib/migrations/0000000017000-adhoc-directives.d.ts +0 -6
  397. package/src/lib/migrations/0000000017000-adhoc-directives.js.map +0 -1
  398. package/src/lib/migrations/index.d.ts +0 -20
  399. package/src/lib/migrations/index.js +0 -61
  400. package/src/lib/migrations/index.js.map +0 -1
  401. package/src/lib/notification/dto/notification-preference.input.d.ts +0 -9
  402. package/src/lib/notification/dto/notification-preference.input.js +0 -53
  403. package/src/lib/notification/dto/notification-preference.input.js.map +0 -1
  404. package/src/lib/notification/index.js +0 -11
  405. package/src/lib/notification/index.js.map +0 -1
  406. package/src/lib/notification/notification-delivery-scheduler.service.d.ts +0 -13
  407. package/src/lib/notification/notification-delivery-scheduler.service.js +0 -53
  408. package/src/lib/notification/notification-delivery-scheduler.service.js.map +0 -1
  409. package/src/lib/notification/notification-delivery.service.d.ts +0 -23
  410. package/src/lib/notification/notification-delivery.service.js +0 -245
  411. package/src/lib/notification/notification-delivery.service.js.map +0 -1
  412. package/src/lib/notification/notification-dispatcher.token.d.ts +0 -7
  413. package/src/lib/notification/notification-dispatcher.token.js +0 -5
  414. package/src/lib/notification/notification-dispatcher.token.js.map +0 -1
  415. package/src/lib/notification/notification-options.d.ts +0 -215
  416. package/src/lib/notification/notification-options.js +0 -128
  417. package/src/lib/notification/notification-options.js.map +0 -1
  418. package/src/lib/notification/notification-options.module.d.ts +0 -23
  419. package/src/lib/notification/notification-options.module.js +0 -41
  420. package/src/lib/notification/notification-options.module.js.map +0 -1
  421. package/src/lib/notification/notification-preference.entity.d.ts +0 -10
  422. package/src/lib/notification/notification-preference.entity.js +0 -50
  423. package/src/lib/notification/notification-preference.entity.js.map +0 -1
  424. package/src/lib/notification/notification-sla-scheduler.service.d.ts +0 -13
  425. package/src/lib/notification/notification-sla-scheduler.service.js +0 -51
  426. package/src/lib/notification/notification-sla-scheduler.service.js.map +0 -1
  427. package/src/lib/notification/notification-template.d.ts +0 -13
  428. package/src/lib/notification/notification-template.js +0 -61
  429. package/src/lib/notification/notification-template.js.map +0 -1
  430. package/src/lib/notification/notification.entity.d.ts +0 -31
  431. package/src/lib/notification/notification.entity.js +0 -149
  432. package/src/lib/notification/notification.entity.js.map +0 -1
  433. package/src/lib/notification/notification.enums.d.ts +0 -38
  434. package/src/lib/notification/notification.enums.js +0 -63
  435. package/src/lib/notification/notification.enums.js.map +0 -1
  436. package/src/lib/notification/notification.module.d.ts +0 -2
  437. package/src/lib/notification/notification.module.js +0 -45
  438. package/src/lib/notification/notification.module.js.map +0 -1
  439. package/src/lib/notification/notification.mutations.d.ts +0 -11
  440. package/src/lib/notification/notification.mutations.js +0 -64
  441. package/src/lib/notification/notification.mutations.js.map +0 -1
  442. package/src/lib/notification/notification.queries.d.ts +0 -11
  443. package/src/lib/notification/notification.queries.js +0 -77
  444. package/src/lib/notification/notification.queries.js.map +0 -1
  445. package/src/lib/notification/notification.service.d.ts +0 -121
  446. package/src/lib/notification/notification.service.js +0 -713
  447. package/src/lib/notification/notification.service.js.map +0 -1
  448. package/src/lib/organization/dto/manager-resolution.input.d.ts +0 -18
  449. package/src/lib/organization/dto/manager-resolution.input.js +0 -107
  450. package/src/lib/organization/dto/manager-resolution.input.js.map +0 -1
  451. package/src/lib/organization/dto/membership.input.d.ts +0 -16
  452. package/src/lib/organization/dto/membership.input.js +0 -99
  453. package/src/lib/organization/dto/membership.input.js.map +0 -1
  454. package/src/lib/organization/dto/org-unit.input.d.ts +0 -24
  455. package/src/lib/organization/dto/org-unit.input.js +0 -119
  456. package/src/lib/organization/dto/org-unit.input.js.map +0 -1
  457. package/src/lib/organization/dto/position.input.d.ts +0 -13
  458. package/src/lib/organization/dto/position.input.js +0 -70
  459. package/src/lib/organization/dto/position.input.js.map +0 -1
  460. package/src/lib/organization/index.js +0 -16
  461. package/src/lib/organization/index.js.map +0 -1
  462. package/src/lib/organization/json-metadata.d.ts +0 -1
  463. package/src/lib/organization/json-metadata.js +0 -14
  464. package/src/lib/organization/json-metadata.js.map +0 -1
  465. package/src/lib/organization/manager-resolution.entity.d.ts +0 -11
  466. package/src/lib/organization/manager-resolution.entity.js +0 -55
  467. package/src/lib/organization/manager-resolution.entity.js.map +0 -1
  468. package/src/lib/organization/membership.entity.d.ts +0 -11
  469. package/src/lib/organization/membership.entity.js +0 -60
  470. package/src/lib/organization/membership.entity.js.map +0 -1
  471. package/src/lib/organization/org-unit-tree-commit-result.object.d.ts +0 -4
  472. package/src/lib/organization/org-unit-tree-commit-result.object.js +0 -17
  473. package/src/lib/organization/org-unit-tree-commit-result.object.js.map +0 -1
  474. package/src/lib/organization/org-unit.entity.d.ts +0 -13
  475. package/src/lib/organization/org-unit.entity.js +0 -64
  476. package/src/lib/organization/org-unit.entity.js.map +0 -1
  477. package/src/lib/organization/organization-summary.object.d.ts +0 -6
  478. package/src/lib/organization/organization-summary.object.js +0 -28
  479. package/src/lib/organization/organization-summary.object.js.map +0 -1
  480. package/src/lib/organization/organization.enums.d.ts +0 -11
  481. package/src/lib/organization/organization.enums.js +0 -22
  482. package/src/lib/organization/organization.enums.js.map +0 -1
  483. package/src/lib/organization/organization.module.d.ts +0 -2
  484. package/src/lib/organization/organization.module.js +0 -35
  485. package/src/lib/organization/organization.module.js.map +0 -1
  486. package/src/lib/organization/organization.mutations.d.ts +0 -26
  487. package/src/lib/organization/organization.mutations.js +0 -148
  488. package/src/lib/organization/organization.mutations.js.map +0 -1
  489. package/src/lib/organization/organization.queries.d.ts +0 -23
  490. package/src/lib/organization/organization.queries.js +0 -204
  491. package/src/lib/organization/organization.queries.js.map +0 -1
  492. package/src/lib/organization/organization.service.d.ts +0 -103
  493. package/src/lib/organization/organization.service.js +0 -768
  494. package/src/lib/organization/organization.service.js.map +0 -1
  495. package/src/lib/organization/position.entity.d.ts +0 -9
  496. package/src/lib/organization/position.entity.js +0 -48
  497. package/src/lib/organization/position.entity.js.map +0 -1
  498. package/src/lib/organization/resolved-manager.object.d.ts +0 -4
  499. package/src/lib/organization/resolved-manager.object.js +0 -20
  500. package/src/lib/organization/resolved-manager.object.js.map +0 -1
  501. package/src/lib/signature/index.js +0 -8
  502. package/src/lib/signature/index.js.map +0 -1
  503. package/src/lib/signature/signature-options.d.ts +0 -33
  504. package/src/lib/signature/signature-options.js +0 -51
  505. package/src/lib/signature/signature-options.js.map +0 -1
  506. package/src/lib/signature/signature-verification.object.d.ts +0 -6
  507. package/src/lib/signature/signature-verification.object.js +0 -28
  508. package/src/lib/signature/signature-verification.object.js.map +0 -1
  509. package/src/lib/signature/signature.entity.d.ts +0 -16
  510. package/src/lib/signature/signature.entity.js +0 -88
  511. package/src/lib/signature/signature.entity.js.map +0 -1
  512. package/src/lib/signature/signature.module.d.ts +0 -11
  513. package/src/lib/signature/signature.module.js +0 -60
  514. package/src/lib/signature/signature.module.js.map +0 -1
  515. package/src/lib/signature/signature.queries.d.ts +0 -11
  516. package/src/lib/signature/signature.queries.js +0 -46
  517. package/src/lib/signature/signature.queries.js.map +0 -1
  518. package/src/lib/signature/signature.service.d.ts +0 -25
  519. package/src/lib/signature/signature.service.js +0 -124
  520. package/src/lib/signature/signature.service.js.map +0 -1
  521. package/src/lib/template/approval-template-category.entity.d.ts +0 -9
  522. package/src/lib/template/approval-template-category.entity.js +0 -49
  523. package/src/lib/template/approval-template-category.entity.js.map +0 -1
  524. package/src/lib/template/approval-template-version.entity.d.ts +0 -21
  525. package/src/lib/template/approval-template-version.entity.js +0 -106
  526. package/src/lib/template/approval-template-version.entity.js.map +0 -1
  527. package/src/lib/template/approval-template.entity.d.ts +0 -14
  528. package/src/lib/template/approval-template.entity.js +0 -74
  529. package/src/lib/template/approval-template.entity.js.map +0 -1
  530. package/src/lib/template/compose-approval-template.object.d.ts +0 -11
  531. package/src/lib/template/compose-approval-template.object.js +0 -36
  532. package/src/lib/template/compose-approval-template.object.js.map +0 -1
  533. package/src/lib/template/compose-template.mutations.d.ts +0 -8
  534. package/src/lib/template/compose-template.mutations.js +0 -32
  535. package/src/lib/template/compose-template.mutations.js.map +0 -1
  536. package/src/lib/template/dto/approval-template.input.d.ts +0 -36
  537. package/src/lib/template/dto/approval-template.input.js +0 -187
  538. package/src/lib/template/dto/approval-template.input.js.map +0 -1
  539. package/src/lib/template/dto/compose-approval-template.input.d.ts +0 -17
  540. package/src/lib/template/dto/compose-approval-template.input.js +0 -99
  541. package/src/lib/template/dto/compose-approval-template.input.js.map +0 -1
  542. package/src/lib/template/index.js +0 -14
  543. package/src/lib/template/index.js.map +0 -1
  544. package/src/lib/template/template.enums.d.ts +0 -14
  545. package/src/lib/template/template.enums.js +0 -31
  546. package/src/lib/template/template.enums.js.map +0 -1
  547. package/src/lib/template/template.module.d.ts +0 -2
  548. package/src/lib/template/template.module.js +0 -41
  549. package/src/lib/template/template.module.js.map +0 -1
  550. package/src/lib/template/template.mutations.d.ts +0 -20
  551. package/src/lib/template/template.mutations.js +0 -139
  552. package/src/lib/template/template.mutations.js.map +0 -1
  553. package/src/lib/template/template.queries.d.ts +0 -16
  554. package/src/lib/template/template.queries.js +0 -133
  555. package/src/lib/template/template.queries.js.map +0 -1
  556. package/src/lib/template/template.service.d.ts +0 -83
  557. package/src/lib/template/template.service.js +0 -654
  558. package/src/lib/template/template.service.js.map +0 -1
  559. package/src/lib/template/workflow-definition.validator.d.ts +0 -9
  560. package/src/lib/template/workflow-definition.validator.js +0 -362
  561. package/src/lib/template/workflow-definition.validator.js.map +0 -1
  562. package/src/lib/testing/cel-js.jest.d.ts +0 -15
  563. package/src/lib/testing/cel-js.jest.js +0 -27
  564. package/src/lib/testing/cel-js.jest.js.map +0 -1
  565. package/src/lib/workflow-engine/activity-log.entity.d.ts +0 -12
  566. package/src/lib/workflow-engine/activity-log.entity.js +0 -62
  567. package/src/lib/workflow-engine/activity-log.entity.js.map +0 -1
  568. package/src/lib/workflow-engine/adhoc-directive.entity.d.ts +0 -31
  569. package/src/lib/workflow-engine/adhoc-directive.entity.js +0 -105
  570. package/src/lib/workflow-engine/adhoc-directive.entity.js.map +0 -1
  571. package/src/lib/workflow-engine/adhoc.enums.d.ts +0 -21
  572. package/src/lib/workflow-engine/adhoc.enums.js +0 -42
  573. package/src/lib/workflow-engine/adhoc.enums.js.map +0 -1
  574. package/src/lib/workflow-engine/approval-instance-page-info.object.d.ts +0 -8
  575. package/src/lib/workflow-engine/approval-instance-page-info.object.js +0 -36
  576. package/src/lib/workflow-engine/approval-instance-page-info.object.js.map +0 -1
  577. package/src/lib/workflow-engine/approval-instance.entity.d.ts +0 -22
  578. package/src/lib/workflow-engine/approval-instance.entity.js +0 -113
  579. package/src/lib/workflow-engine/approval-instance.entity.js.map +0 -1
  580. package/src/lib/workflow-engine/dto/adhoc-notification.input.d.ts +0 -6
  581. package/src/lib/workflow-engine/dto/adhoc-notification.input.js +0 -28
  582. package/src/lib/workflow-engine/dto/adhoc-notification.input.js.map +0 -1
  583. package/src/lib/workflow-engine/dto/adhoc-target.input.d.ts +0 -16
  584. package/src/lib/workflow-engine/dto/adhoc-target.input.js +0 -61
  585. package/src/lib/workflow-engine/dto/adhoc-target.input.js.map +0 -1
  586. package/src/lib/workflow-engine/dto/cancel-approval-instance.input.d.ts +0 -5
  587. package/src/lib/workflow-engine/dto/cancel-approval-instance.input.js +0 -29
  588. package/src/lib/workflow-engine/dto/cancel-approval-instance.input.js.map +0 -1
  589. package/src/lib/workflow-engine/dto/decide-task.input.d.ts +0 -9
  590. package/src/lib/workflow-engine/dto/decide-task.input.js +0 -47
  591. package/src/lib/workflow-engine/dto/decide-task.input.js.map +0 -1
  592. package/src/lib/workflow-engine/dto/dry-run-approval-workflow.input.d.ts +0 -6
  593. package/src/lib/workflow-engine/dto/dry-run-approval-workflow.input.js +0 -34
  594. package/src/lib/workflow-engine/dto/dry-run-approval-workflow.input.js.map +0 -1
  595. package/src/lib/workflow-engine/dto/resubmit-approval-instance.input.d.ts +0 -6
  596. package/src/lib/workflow-engine/dto/resubmit-approval-instance.input.js +0 -34
  597. package/src/lib/workflow-engine/dto/resubmit-approval-instance.input.js.map +0 -1
  598. package/src/lib/workflow-engine/dto/submit-approval-instance.input.d.ts +0 -7
  599. package/src/lib/workflow-engine/dto/submit-approval-instance.input.js +0 -40
  600. package/src/lib/workflow-engine/dto/submit-approval-instance.input.js.map +0 -1
  601. package/src/lib/workflow-engine/index.js +0 -28
  602. package/src/lib/workflow-engine/index.js.map +0 -1
  603. package/src/lib/workflow-engine/task-candidate.entity.d.ts +0 -14
  604. package/src/lib/workflow-engine/task-candidate.entity.js +0 -72
  605. package/src/lib/workflow-engine/task-candidate.entity.js.map +0 -1
  606. package/src/lib/workflow-engine/task-decision.entity.d.ts +0 -12
  607. package/src/lib/workflow-engine/task-decision.entity.js +0 -60
  608. package/src/lib/workflow-engine/task-decision.entity.js.map +0 -1
  609. package/src/lib/workflow-engine/task.entity.d.ts +0 -25
  610. package/src/lib/workflow-engine/task.entity.js +0 -130
  611. package/src/lib/workflow-engine/task.entity.js.map +0 -1
  612. package/src/lib/workflow-engine/workflow-condition-evaluator.d.ts +0 -5
  613. package/src/lib/workflow-engine/workflow-condition-evaluator.js +0 -107
  614. package/src/lib/workflow-engine/workflow-condition-evaluator.js.map +0 -1
  615. package/src/lib/workflow-engine/workflow-dashboard-summary.object.d.ts +0 -8
  616. package/src/lib/workflow-engine/workflow-dashboard-summary.object.js +0 -36
  617. package/src/lib/workflow-engine/workflow-dashboard-summary.object.js.map +0 -1
  618. package/src/lib/workflow-engine/workflow-dry-run.object.d.ts +0 -21
  619. package/src/lib/workflow-engine/workflow-dry-run.object.js +0 -86
  620. package/src/lib/workflow-engine/workflow-dry-run.object.js.map +0 -1
  621. package/src/lib/workflow-engine/workflow-engine.enums.d.ts +0 -61
  622. package/src/lib/workflow-engine/workflow-engine.enums.js +0 -98
  623. package/src/lib/workflow-engine/workflow-engine.enums.js.map +0 -1
  624. package/src/lib/workflow-engine/workflow-engine.module.d.ts +0 -9
  625. package/src/lib/workflow-engine/workflow-engine.module.js +0 -78
  626. package/src/lib/workflow-engine/workflow-engine.module.js.map +0 -1
  627. package/src/lib/workflow-engine/workflow-engine.mutations.d.ts +0 -29
  628. package/src/lib/workflow-engine/workflow-engine.mutations.js +0 -218
  629. package/src/lib/workflow-engine/workflow-engine.mutations.js.map +0 -1
  630. package/src/lib/workflow-engine/workflow-engine.queries.d.ts +0 -31
  631. package/src/lib/workflow-engine/workflow-engine.queries.js +0 -237
  632. package/src/lib/workflow-engine/workflow-engine.queries.js.map +0 -1
  633. package/src/lib/workflow-engine/workflow-engine.service.d.ts +0 -188
  634. package/src/lib/workflow-engine/workflow-engine.service.js +0 -3561
  635. package/src/lib/workflow-engine/workflow-engine.service.js.map +0 -1
  636. package/src/lib/workflow-engine/workflow-engine.tokens.js +0 -5
  637. package/src/lib/workflow-engine/workflow-engine.tokens.js.map +0 -1
  638. package/src/lib/workflow-engine/workflow-service-task-dispatcher.token.d.ts +0 -18
  639. package/src/lib/workflow-engine/workflow-service-task-dispatcher.token.js +0 -39
  640. package/src/lib/workflow-engine/workflow-service-task-dispatcher.token.js.map +0 -1
  641. package/src/lib/workflow-engine/workflow-token.entity.d.ts +0 -10
  642. package/src/lib/workflow-engine/workflow-token.entity.js +0 -50
  643. package/src/lib/workflow-engine/workflow-token.entity.js.map +0 -1
  644. /package/src/{index.d.ts → index.ts} +0 -0
  645. /package/src/lib/attachment/{index.d.ts → index.ts} +0 -0
  646. /package/src/lib/bpm/{index.d.ts → index.ts} +0 -0
  647. /package/src/lib/bpm-auth/{index.d.ts → index.ts} +0 -0
  648. /package/src/lib/common/{index.d.ts → index.ts} +0 -0
  649. /package/src/lib/condition/{index.d.ts → index.ts} +0 -0
  650. /package/src/lib/database/{index.d.ts → index.ts} +0 -0
  651. /package/src/lib/delegation/{index.d.ts → index.ts} +0 -0
  652. /package/src/lib/form/{index.d.ts → index.ts} +0 -0
  653. /package/src/lib/identity/{index.d.ts → index.ts} +0 -0
  654. /package/src/lib/notification/{index.d.ts → index.ts} +0 -0
  655. /package/src/lib/organization/{index.d.ts → index.ts} +0 -0
  656. /package/src/lib/signature/{index.d.ts → index.ts} +0 -0
  657. /package/src/lib/template/{index.d.ts → index.ts} +0 -0
  658. /package/src/lib/workflow-engine/{index.d.ts → index.ts} +0 -0
@@ -0,0 +1,835 @@
1
+ import { DataSource, Repository } from 'typeorm';
2
+ import { ManagerResolutionEntity } from './manager-resolution.entity';
3
+ import { MembershipEntity } from './membership.entity';
4
+ import { OrgUnitEntity } from './org-unit.entity';
5
+ import {
6
+ ManagerResolutionScopeTypeEnum,
7
+ OrgUnitTypeEnum,
8
+ } from './organization.enums';
9
+ import { OrganizationService } from './organization.service';
10
+ import { PositionEntity } from './position.entity';
11
+
12
+ const baseUpdatedAt = new Date('2026-05-12T08:00:00.000Z');
13
+
14
+ describe('OrganizationService', () => {
15
+ it('resolves member-scoped manager by highest priority', async (): Promise<void> => {
16
+ const managerResolutionRepository = {
17
+ find: jest.fn<Promise<readonly ManagerResolutionEntity[]>, []>(() =>
18
+ Promise.resolve([
19
+ {
20
+ createdAt: new Date(),
21
+ effectiveFrom: '2026-01-01',
22
+ effectiveTo: null,
23
+ id: 'rule-low',
24
+ managerMemberId: 'manager-low',
25
+ priority: 1,
26
+ scopeId: 'member-1',
27
+ scopeType: ManagerResolutionScopeTypeEnum.MEMBER,
28
+ },
29
+ {
30
+ createdAt: new Date(),
31
+ effectiveFrom: '2026-01-01',
32
+ effectiveTo: null,
33
+ id: 'rule-high',
34
+ managerMemberId: 'manager-high',
35
+ priority: 10,
36
+ scopeId: 'member-1',
37
+ scopeType: ManagerResolutionScopeTypeEnum.MEMBER,
38
+ },
39
+ ]),
40
+ ),
41
+ } as unknown as Repository<ManagerResolutionEntity>;
42
+ const membershipRepository = {
43
+ find: jest.fn<Promise<readonly MembershipEntity[]>, []>(() =>
44
+ Promise.resolve([]),
45
+ ),
46
+ } as unknown as Repository<MembershipEntity>;
47
+ const service = new OrganizationService(
48
+ {} as DataSource,
49
+ {} as Repository<OrgUnitEntity>,
50
+ {} as Repository<PositionEntity>,
51
+ membershipRepository,
52
+ managerResolutionRepository,
53
+ );
54
+
55
+ await expect(
56
+ service.resolveManagerMemberId('member-1', new Date('2026-04-30')),
57
+ ).resolves.toBe('manager-high');
58
+ });
59
+
60
+ it('creates org unit paths with ltree-safe identifiers', async (): Promise<void> => {
61
+ const orgUnitRepository = {
62
+ create: jest.fn((entity: Partial<OrgUnitEntity>): OrgUnitEntity => {
63
+ return {
64
+ code: entity.code ?? 'ROOT',
65
+ createdAt: new Date(),
66
+ deletedAt: null,
67
+ id: entity.id ?? 'id',
68
+ metadata: entity.metadata ?? {},
69
+ name: entity.name ?? 'Root',
70
+ parentId: entity.parentId ?? null,
71
+ path: entity.path ?? '',
72
+ type: entity.type ?? OrgUnitTypeEnum.COMPANY,
73
+ updatedAt: new Date(),
74
+ };
75
+ }),
76
+ findOne: jest.fn<Promise<OrgUnitEntity | null>, []>(() =>
77
+ Promise.resolve(null),
78
+ ),
79
+ save: jest.fn((entity: OrgUnitEntity): Promise<OrgUnitEntity> => {
80
+ return Promise.resolve(entity);
81
+ }),
82
+ } as unknown as Repository<OrgUnitEntity>;
83
+ const service = new OrganizationService(
84
+ {} as DataSource,
85
+ orgUnitRepository,
86
+ {} as Repository<PositionEntity>,
87
+ {} as Repository<MembershipEntity>,
88
+ {} as Repository<ManagerResolutionEntity>,
89
+ );
90
+
91
+ const orgUnit = await service.createOrgUnit({
92
+ code: 'ROOT',
93
+ metadataJson: '{}',
94
+ name: 'Root',
95
+ parentId: null,
96
+ type: OrgUnitTypeEnum.COMPANY,
97
+ });
98
+
99
+ expect(orgUnit.path).toMatch(/^org\.n[0-9a-f_]+$/);
100
+ expect(orgUnitRepository.save).toHaveBeenCalledTimes(1);
101
+ });
102
+
103
+ it('pushes org unit filters into repository query', async (): Promise<void> => {
104
+ const find = jest.fn(
105
+ (): Promise<readonly OrgUnitEntity[]> => Promise.resolve([]),
106
+ );
107
+ const orgUnitRepository = {
108
+ find,
109
+ } as unknown as Repository<OrgUnitEntity>;
110
+ const service = new OrganizationService(
111
+ {} as DataSource,
112
+ orgUnitRepository,
113
+ {} as Repository<PositionEntity>,
114
+ {} as Repository<MembershipEntity>,
115
+ {} as Repository<ManagerResolutionEntity>,
116
+ );
117
+
118
+ await service.listOrgUnits({
119
+ page: 2,
120
+ pageSize: 5,
121
+ searchText: '財務',
122
+ type: OrgUnitTypeEnum.DEPARTMENT,
123
+ });
124
+
125
+ expect(find).toHaveBeenCalledWith(
126
+ expect.objectContaining({
127
+ order: { path: 'ASC' },
128
+ skip: 5,
129
+ take: 5,
130
+ where: expect.arrayContaining([
131
+ expect.objectContaining({
132
+ code: expect.any(Object),
133
+ deletedAt: expect.any(Object),
134
+ type: OrgUnitTypeEnum.DEPARTMENT,
135
+ }),
136
+ expect.objectContaining({
137
+ deletedAt: expect.any(Object),
138
+ name: expect.any(Object),
139
+ type: OrgUnitTypeEnum.DEPARTMENT,
140
+ }),
141
+ ]),
142
+ }),
143
+ );
144
+ });
145
+
146
+ it('pushes organization table filters into paginated repository queries', async (): Promise<void> => {
147
+ const positionFind = jest.fn(
148
+ (): Promise<readonly PositionEntity[]> => Promise.resolve([]),
149
+ );
150
+ const membershipFind = jest.fn(
151
+ (): Promise<readonly MembershipEntity[]> => Promise.resolve([]),
152
+ );
153
+ const managerResolutionCount = jest.fn((): Promise<number> =>
154
+ Promise.resolve(0),
155
+ );
156
+ const service = new OrganizationService(
157
+ {} as DataSource,
158
+ {} as Repository<OrgUnitEntity>,
159
+ { find: positionFind } as unknown as Repository<PositionEntity>,
160
+ { find: membershipFind } as unknown as Repository<MembershipEntity>,
161
+ {
162
+ count: managerResolutionCount,
163
+ } as unknown as Repository<ManagerResolutionEntity>,
164
+ );
165
+
166
+ await service.listPositions({
167
+ page: 3,
168
+ pageSize: 10,
169
+ searchText: '主管',
170
+ });
171
+ await service.listMemberships({
172
+ activeOnly: true,
173
+ orgUnitId: 'org-1',
174
+ page: 2,
175
+ pageSize: 20,
176
+ positionId: 'position-1',
177
+ });
178
+ await service.countManagerResolutions({
179
+ activeOnly: true,
180
+ scopeType: ManagerResolutionScopeTypeEnum.ORG_UNIT,
181
+ });
182
+
183
+ expect(positionFind).toHaveBeenCalledWith(
184
+ expect.objectContaining({
185
+ order: { code: 'ASC', level: 'DESC' },
186
+ skip: 20,
187
+ take: 10,
188
+ where: expect.arrayContaining([
189
+ expect.objectContaining({ code: expect.any(Object) }),
190
+ expect.objectContaining({ name: expect.any(Object) }),
191
+ ]),
192
+ }),
193
+ );
194
+ expect(membershipFind).toHaveBeenCalledWith(
195
+ expect.objectContaining({
196
+ order: {
197
+ effectiveFrom: 'DESC',
198
+ isPrimary: 'DESC',
199
+ memberId: 'ASC',
200
+ },
201
+ skip: 20,
202
+ take: 20,
203
+ where: expect.arrayContaining([
204
+ expect.objectContaining({
205
+ effectiveFrom: expect.any(Object),
206
+ orgUnitId: 'org-1',
207
+ positionId: 'position-1',
208
+ }),
209
+ ]),
210
+ }),
211
+ );
212
+ expect(managerResolutionCount).toHaveBeenCalledWith(
213
+ expect.objectContaining({
214
+ where: expect.arrayContaining([
215
+ expect.objectContaining({
216
+ effectiveFrom: expect.any(Object),
217
+ scopeType: ManagerResolutionScopeTypeEnum.ORG_UNIT,
218
+ }),
219
+ ]),
220
+ }),
221
+ );
222
+ });
223
+
224
+ it('fetches every org unit without pagination when all is true', async (): Promise<void> => {
225
+ const find = jest.fn(
226
+ (): Promise<readonly OrgUnitEntity[]> => Promise.resolve([]),
227
+ );
228
+ const orgUnitRepository = {
229
+ find,
230
+ } as unknown as Repository<OrgUnitEntity>;
231
+ const service = new OrganizationService(
232
+ {} as DataSource,
233
+ orgUnitRepository,
234
+ {} as Repository<PositionEntity>,
235
+ {} as Repository<MembershipEntity>,
236
+ {} as Repository<ManagerResolutionEntity>,
237
+ );
238
+
239
+ await service.listOrgUnits({ all: true, page: 3, pageSize: 5 });
240
+
241
+ expect(find).toHaveBeenCalledWith(
242
+ expect.objectContaining({ order: { path: 'ASC' } }),
243
+ );
244
+ expect(find).toHaveBeenCalledWith(
245
+ expect.not.objectContaining({ skip: expect.anything() }),
246
+ );
247
+ expect(find).toHaveBeenCalledWith(
248
+ expect.not.objectContaining({ take: expect.anything() }),
249
+ );
250
+ });
251
+
252
+ it('returns the full org unit list when pageSize is omitted', async (): Promise<void> => {
253
+ const find = jest.fn(
254
+ (): Promise<readonly OrgUnitEntity[]> => Promise.resolve([]),
255
+ );
256
+ const orgUnitRepository = {
257
+ find,
258
+ } as unknown as Repository<OrgUnitEntity>;
259
+ const service = new OrganizationService(
260
+ {} as DataSource,
261
+ orgUnitRepository,
262
+ {} as Repository<PositionEntity>,
263
+ {} as Repository<MembershipEntity>,
264
+ {} as Repository<ManagerResolutionEntity>,
265
+ );
266
+
267
+ await service.listOrgUnits({});
268
+
269
+ expect(find).toHaveBeenCalledWith(
270
+ expect.not.objectContaining({ skip: expect.anything() }),
271
+ );
272
+ expect(find).toHaveBeenCalledWith(
273
+ expect.not.objectContaining({ take: expect.anything() }),
274
+ );
275
+ });
276
+
277
+ it('clamps an oversized pageSize to the maximum page size', async (): Promise<void> => {
278
+ const find = jest.fn(
279
+ (): Promise<readonly OrgUnitEntity[]> => Promise.resolve([]),
280
+ );
281
+ const orgUnitRepository = {
282
+ find,
283
+ } as unknown as Repository<OrgUnitEntity>;
284
+ const service = new OrganizationService(
285
+ {} as DataSource,
286
+ orgUnitRepository,
287
+ {} as Repository<PositionEntity>,
288
+ {} as Repository<MembershipEntity>,
289
+ {} as Repository<ManagerResolutionEntity>,
290
+ );
291
+
292
+ await service.listOrgUnits({ page: 1, pageSize: 5000 });
293
+
294
+ expect(find).toHaveBeenCalledWith(
295
+ expect.objectContaining({ skip: 0, take: 100 }),
296
+ );
297
+ });
298
+
299
+ it('commits org unit tree draft moves and recalculates descendant paths in one transaction', async (): Promise<void> => {
300
+ const orgUnits = [
301
+ createOrgUnitFixture({
302
+ code: 'ROOT',
303
+ id: '00000000-0000-4000-8000-000000000001',
304
+ name: 'Root',
305
+ path: 'org.n00000000_0000_4000_8000_000000000001',
306
+ }),
307
+ createOrgUnitFixture({
308
+ code: 'A',
309
+ id: '00000000-0000-4000-8000-000000000002',
310
+ name: 'Department A',
311
+ parentId: '00000000-0000-4000-8000-000000000001',
312
+ path: 'org.n00000000_0000_4000_8000_000000000001.n00000000_0000_4000_8000_000000000002',
313
+ }),
314
+ createOrgUnitFixture({
315
+ code: 'A1',
316
+ id: '00000000-0000-4000-8000-000000000003',
317
+ name: 'Team A1',
318
+ parentId: '00000000-0000-4000-8000-000000000002',
319
+ path: 'org.n00000000_0000_4000_8000_000000000001.n00000000_0000_4000_8000_000000000002.n00000000_0000_4000_8000_000000000003',
320
+ }),
321
+ createOrgUnitFixture({
322
+ code: 'B',
323
+ id: '00000000-0000-4000-8000-000000000004',
324
+ name: 'Department B',
325
+ parentId: '00000000-0000-4000-8000-000000000001',
326
+ path: 'org.n00000000_0000_4000_8000_000000000001.n00000000_0000_4000_8000_000000000004',
327
+ }),
328
+ ];
329
+ const orgUnitRepository = createOrgUnitTreeDraftRepository(orgUnits);
330
+ const manager = {
331
+ getRepository: jest.fn(() => orgUnitRepository),
332
+ };
333
+ const transaction = jest.fn(
334
+ (
335
+ callback: (value: typeof manager) => Promise<unknown>,
336
+ ): Promise<unknown> => callback(manager),
337
+ );
338
+ const service = new OrganizationService(
339
+ { transaction } as unknown as DataSource,
340
+ {} as Repository<OrgUnitEntity>,
341
+ {} as Repository<PositionEntity>,
342
+ {} as Repository<MembershipEntity>,
343
+ {} as Repository<ManagerResolutionEntity>,
344
+ );
345
+
346
+ const result = await service.commitOrgUnitTreeDraft({
347
+ moves: [
348
+ {
349
+ baseUpdatedAt: baseUpdatedAt.toISOString(),
350
+ id: '00000000-0000-4000-8000-000000000002',
351
+ parentId: '00000000-0000-4000-8000-000000000004',
352
+ },
353
+ ],
354
+ });
355
+
356
+ expect(transaction).toHaveBeenCalledTimes(1);
357
+ expect(orgUnitRepository.save).toHaveBeenCalledTimes(2);
358
+ expect(result.orgUnits.map((orgUnit) => orgUnit.id)).toEqual([
359
+ '00000000-0000-4000-8000-000000000002',
360
+ '00000000-0000-4000-8000-000000000003',
361
+ ]);
362
+ expect(orgUnits[1]?.parentId).toBe(
363
+ '00000000-0000-4000-8000-000000000004',
364
+ );
365
+ expect(orgUnits[1]?.path).toBe(
366
+ 'org.n00000000_0000_4000_8000_000000000001.n00000000_0000_4000_8000_000000000004.n00000000_0000_4000_8000_000000000002',
367
+ );
368
+ expect(orgUnits[2]?.path).toBe(
369
+ 'org.n00000000_0000_4000_8000_000000000001.n00000000_0000_4000_8000_000000000004.n00000000_0000_4000_8000_000000000002.n00000000_0000_4000_8000_000000000003',
370
+ );
371
+ });
372
+
373
+ it('rejects stale org unit tree draft moves', async (): Promise<void> => {
374
+ const orgUnits = [
375
+ createOrgUnitFixture({
376
+ id: '00000000-0000-4000-8000-000000000001',
377
+ updatedAt: new Date('2026-05-12T08:01:00.000Z'),
378
+ }),
379
+ ];
380
+ const orgUnitRepository = createOrgUnitTreeDraftRepository(orgUnits);
381
+ const manager = {
382
+ getRepository: jest.fn(() => orgUnitRepository),
383
+ };
384
+ const transaction = jest.fn(
385
+ (
386
+ callback: (value: typeof manager) => Promise<unknown>,
387
+ ): Promise<unknown> => callback(manager),
388
+ );
389
+ const service = new OrganizationService(
390
+ { transaction } as unknown as DataSource,
391
+ {} as Repository<OrgUnitEntity>,
392
+ {} as Repository<PositionEntity>,
393
+ {} as Repository<MembershipEntity>,
394
+ {} as Repository<ManagerResolutionEntity>,
395
+ );
396
+
397
+ await expect(
398
+ service.commitOrgUnitTreeDraft({
399
+ moves: [
400
+ {
401
+ baseUpdatedAt: baseUpdatedAt.toISOString(),
402
+ id: '00000000-0000-4000-8000-000000000001',
403
+ parentId: null,
404
+ },
405
+ ],
406
+ }),
407
+ ).rejects.toThrow('changed since this draft was based');
408
+ expect(orgUnitRepository.save).not.toHaveBeenCalled();
409
+ });
410
+
411
+ it('rejects org unit tree draft cycles before saving', async (): Promise<void> => {
412
+ const orgUnits = [
413
+ createOrgUnitFixture({
414
+ id: '00000000-0000-4000-8000-000000000001',
415
+ path: 'org.n00000000_0000_4000_8000_000000000001',
416
+ }),
417
+ createOrgUnitFixture({
418
+ id: '00000000-0000-4000-8000-000000000002',
419
+ path: 'org.n00000000_0000_4000_8000_000000000002',
420
+ }),
421
+ ];
422
+ const orgUnitRepository = createOrgUnitTreeDraftRepository(orgUnits);
423
+ const manager = {
424
+ getRepository: jest.fn(() => orgUnitRepository),
425
+ };
426
+ const transaction = jest.fn(
427
+ (
428
+ callback: (value: typeof manager) => Promise<unknown>,
429
+ ): Promise<unknown> => callback(manager),
430
+ );
431
+ const service = new OrganizationService(
432
+ { transaction } as unknown as DataSource,
433
+ {} as Repository<OrgUnitEntity>,
434
+ {} as Repository<PositionEntity>,
435
+ {} as Repository<MembershipEntity>,
436
+ {} as Repository<ManagerResolutionEntity>,
437
+ );
438
+
439
+ await expect(
440
+ service.commitOrgUnitTreeDraft({
441
+ moves: [
442
+ {
443
+ baseUpdatedAt: baseUpdatedAt.toISOString(),
444
+ id: '00000000-0000-4000-8000-000000000001',
445
+ parentId: '00000000-0000-4000-8000-000000000002',
446
+ },
447
+ {
448
+ baseUpdatedAt: baseUpdatedAt.toISOString(),
449
+ id: '00000000-0000-4000-8000-000000000002',
450
+ parentId: '00000000-0000-4000-8000-000000000001',
451
+ },
452
+ ],
453
+ }),
454
+ ).rejects.toThrow('cycle');
455
+ expect(orgUnitRepository.save).not.toHaveBeenCalled();
456
+ });
457
+
458
+ it('clears previous primary membership when creating a new primary membership', async (): Promise<void> => {
459
+ const orgUnitRepository = {
460
+ findOne: jest.fn<Promise<OrgUnitEntity | null>, []>(() =>
461
+ Promise.resolve({
462
+ code: 'FIN',
463
+ createdAt: new Date(),
464
+ deletedAt: null,
465
+ id: 'org-1',
466
+ metadata: {},
467
+ name: 'Finance',
468
+ parentId: null,
469
+ path: 'org.n_fin',
470
+ type: OrgUnitTypeEnum.DEPARTMENT,
471
+ updatedAt: new Date(),
472
+ }),
473
+ ),
474
+ } as unknown as Repository<OrgUnitEntity>;
475
+ const membershipRepository = {
476
+ create: jest.fn((input: Partial<MembershipEntity>): MembershipEntity => {
477
+ return {
478
+ createdAt: new Date(),
479
+ effectiveFrom: input.effectiveFrom ?? '2026-01-01',
480
+ effectiveTo: input.effectiveTo ?? null,
481
+ id: input.id ?? 'membership-1',
482
+ isPrimary: input.isPrimary ?? false,
483
+ memberId: input.memberId ?? 'member-1',
484
+ orgUnitId: input.orgUnitId ?? 'org-1',
485
+ positionId: input.positionId ?? null,
486
+ updatedAt: new Date(),
487
+ };
488
+ }),
489
+ save: jest.fn((entity: MembershipEntity): Promise<MembershipEntity> => {
490
+ return Promise.resolve(entity);
491
+ }),
492
+ update: jest.fn<Promise<{ readonly affected: number }>, []>(() =>
493
+ Promise.resolve({ affected: 1 }),
494
+ ),
495
+ } as unknown as Repository<MembershipEntity>;
496
+ const service = new OrganizationService(
497
+ {} as DataSource,
498
+ orgUnitRepository,
499
+ {} as Repository<PositionEntity>,
500
+ membershipRepository,
501
+ {} as Repository<ManagerResolutionEntity>,
502
+ );
503
+
504
+ const membership = await service.createMembership({
505
+ effectiveFrom: '2026-01-01',
506
+ effectiveTo: null,
507
+ isPrimary: true,
508
+ memberId: 'member-1',
509
+ orgUnitId: 'org-1',
510
+ positionId: null,
511
+ });
512
+
513
+ expect(membership.isPrimary).toBe(true);
514
+ expect(membershipRepository.update).toHaveBeenCalledWith(
515
+ { isPrimary: true, memberId: 'member-1' },
516
+ { isPrimary: false },
517
+ );
518
+ });
519
+
520
+ it('clears membership effectiveTo when update input explicitly passes null', async (): Promise<void> => {
521
+ const existingMembership = {
522
+ createdAt: new Date(),
523
+ effectiveFrom: '2026-01-01',
524
+ effectiveTo: '2026-12-31',
525
+ id: 'membership-1',
526
+ isPrimary: false,
527
+ memberId: 'member-1',
528
+ orgUnitId: 'org-1',
529
+ positionId: null,
530
+ updatedAt: new Date(),
531
+ };
532
+ const orgUnitRepository = {
533
+ findOne: jest.fn<Promise<OrgUnitEntity | null>, []>(() =>
534
+ Promise.resolve({
535
+ code: 'FIN',
536
+ createdAt: new Date(),
537
+ deletedAt: null,
538
+ id: 'org-1',
539
+ metadata: {},
540
+ name: 'Finance',
541
+ parentId: null,
542
+ path: 'org.n_fin',
543
+ type: OrgUnitTypeEnum.DEPARTMENT,
544
+ updatedAt: new Date(),
545
+ }),
546
+ ),
547
+ } as unknown as Repository<OrgUnitEntity>;
548
+ const membershipRepository = {
549
+ findOne: jest.fn<Promise<MembershipEntity | null>, []>(() =>
550
+ Promise.resolve(existingMembership),
551
+ ),
552
+ merge: jest.fn(
553
+ (
554
+ entity: MembershipEntity,
555
+ update: Partial<MembershipEntity>,
556
+ ): MembershipEntity => ({
557
+ ...entity,
558
+ ...update,
559
+ }),
560
+ ),
561
+ save: jest.fn((entity: MembershipEntity): Promise<MembershipEntity> => {
562
+ return Promise.resolve(entity);
563
+ }),
564
+ } as unknown as Repository<MembershipEntity>;
565
+ const service = new OrganizationService(
566
+ {} as DataSource,
567
+ orgUnitRepository,
568
+ {} as Repository<PositionEntity>,
569
+ membershipRepository,
570
+ {} as Repository<ManagerResolutionEntity>,
571
+ );
572
+
573
+ const membership = await service.updateMembership({
574
+ effectiveFrom: null,
575
+ effectiveTo: null,
576
+ id: 'membership-1',
577
+ isPrimary: null,
578
+ orgUnitId: null,
579
+ positionId: null,
580
+ });
581
+
582
+ expect(membership.effectiveTo).toBeNull();
583
+ expect(membershipRepository.save).toHaveBeenCalledWith(
584
+ expect.objectContaining({ effectiveTo: null }),
585
+ );
586
+ });
587
+
588
+ it('clears manager resolution effectiveTo when update input explicitly passes null', async (): Promise<void> => {
589
+ const existingResolution = {
590
+ createdAt: new Date(),
591
+ effectiveFrom: '2026-01-01',
592
+ effectiveTo: '2026-12-31',
593
+ id: 'resolution-1',
594
+ managerMemberId: 'manager-1',
595
+ priority: 10,
596
+ scopeId: 'member-1',
597
+ scopeType: ManagerResolutionScopeTypeEnum.MEMBER,
598
+ };
599
+ const managerResolutionRepository = {
600
+ findOne: jest.fn<Promise<ManagerResolutionEntity | null>, []>(() =>
601
+ Promise.resolve(existingResolution),
602
+ ),
603
+ merge: jest.fn(
604
+ (
605
+ entity: ManagerResolutionEntity,
606
+ update: Partial<ManagerResolutionEntity>,
607
+ ): ManagerResolutionEntity => ({
608
+ ...entity,
609
+ ...update,
610
+ }),
611
+ ),
612
+ save: jest.fn(
613
+ (entity: ManagerResolutionEntity): Promise<ManagerResolutionEntity> => {
614
+ return Promise.resolve(entity);
615
+ },
616
+ ),
617
+ } as unknown as Repository<ManagerResolutionEntity>;
618
+ const service = new OrganizationService(
619
+ {} as DataSource,
620
+ {} as Repository<OrgUnitEntity>,
621
+ {} as Repository<PositionEntity>,
622
+ {} as Repository<MembershipEntity>,
623
+ managerResolutionRepository,
624
+ );
625
+
626
+ const resolution = await service.updateManagerResolution({
627
+ effectiveFrom: null,
628
+ effectiveTo: null,
629
+ id: 'resolution-1',
630
+ managerMemberId: null,
631
+ priority: null,
632
+ scopeId: null,
633
+ scopeType: null,
634
+ });
635
+
636
+ expect(resolution.effectiveTo).toBeNull();
637
+ expect(managerResolutionRepository.save).toHaveBeenCalledWith(
638
+ expect.objectContaining({ effectiveTo: null }),
639
+ );
640
+ });
641
+
642
+ it('rejects a member-scoped manager resolution that points to the same member', async (): Promise<void> => {
643
+ const service = new OrganizationService(
644
+ {} as DataSource,
645
+ {} as Repository<OrgUnitEntity>,
646
+ {} as Repository<PositionEntity>,
647
+ {} as Repository<MembershipEntity>,
648
+ {} as Repository<ManagerResolutionEntity>,
649
+ );
650
+
651
+ await expect(
652
+ service.createManagerResolution({
653
+ effectiveFrom: '2026-01-01',
654
+ effectiveTo: null,
655
+ managerMemberId: 'member-1',
656
+ priority: 0,
657
+ scopeId: 'member-1',
658
+ scopeType: ManagerResolutionScopeTypeEnum.MEMBER,
659
+ }),
660
+ ).rejects.toThrow('Manager cannot be the scoped member');
661
+ });
662
+
663
+ it('rejects moving an org unit under its descendant', async (): Promise<void> => {
664
+ const existing = {
665
+ code: 'ROOT',
666
+ createdAt: new Date(),
667
+ deletedAt: null,
668
+ id: 'org-root',
669
+ metadata: {},
670
+ name: 'Root',
671
+ parentId: null,
672
+ path: 'org.n_root',
673
+ type: OrgUnitTypeEnum.COMPANY,
674
+ updatedAt: new Date(),
675
+ };
676
+ const descendant = {
677
+ ...existing,
678
+ code: 'FIN',
679
+ id: 'org-fin',
680
+ name: 'Finance',
681
+ parentId: 'org-root',
682
+ path: 'org.n_root.n_fin',
683
+ type: OrgUnitTypeEnum.DEPARTMENT,
684
+ };
685
+ const orgUnitRepository = {
686
+ findOne: jest.fn(
687
+ (options: {
688
+ readonly where: { readonly id?: string };
689
+ }): Promise<OrgUnitEntity | null> => {
690
+ if (options.where.id === 'org-root') {
691
+ return Promise.resolve(existing);
692
+ }
693
+
694
+ if (options.where.id === 'org-fin') {
695
+ return Promise.resolve(descendant);
696
+ }
697
+
698
+ return Promise.resolve(null);
699
+ },
700
+ ),
701
+ } as unknown as Repository<OrgUnitEntity>;
702
+ const service = new OrganizationService(
703
+ {} as DataSource,
704
+ orgUnitRepository,
705
+ {} as Repository<PositionEntity>,
706
+ {} as Repository<MembershipEntity>,
707
+ {} as Repository<ManagerResolutionEntity>,
708
+ );
709
+
710
+ await expect(
711
+ service.updateOrgUnit({
712
+ code: null,
713
+ id: 'org-root',
714
+ metadataJson: null,
715
+ name: null,
716
+ parentId: 'org-fin',
717
+ type: null,
718
+ }),
719
+ ).rejects.toThrow('descendant');
720
+ });
721
+
722
+ it('formats date-only values with the BPM business timezone', (): void => {
723
+ const service = new OrganizationService(
724
+ {} as DataSource,
725
+ {} as Repository<OrgUnitEntity>,
726
+ {} as Repository<PositionEntity>,
727
+ {} as Repository<MembershipEntity>,
728
+ {} as Repository<ManagerResolutionEntity>,
729
+ );
730
+ const formatter = service as unknown as {
731
+ readonly toDateOnly: (date: Date) => string;
732
+ };
733
+
734
+ expect(formatter.toDateOnly(new Date('2026-05-10T16:30:00.000Z'))).toBe(
735
+ '2026-05-11',
736
+ );
737
+ });
738
+ });
739
+
740
+ function createOrgUnitFixture(
741
+ value: Partial<OrgUnitEntity>,
742
+ ): OrgUnitEntity {
743
+ return {
744
+ code: value.code ?? 'ORG',
745
+ createdAt: value.createdAt ?? baseUpdatedAt,
746
+ deletedAt: value.deletedAt ?? null,
747
+ id: value.id ?? '00000000-0000-4000-8000-000000000001',
748
+ metadata: value.metadata ?? {},
749
+ name: value.name ?? 'Organization',
750
+ parentId: value.parentId ?? null,
751
+ path: value.path ?? 'org.n00000000_0000_4000_8000_000000000001',
752
+ type: value.type ?? OrgUnitTypeEnum.DEPARTMENT,
753
+ updatedAt: value.updatedAt ?? baseUpdatedAt,
754
+ };
755
+ }
756
+
757
+ function createOrgUnitTreeDraftRepository(
758
+ orgUnits: OrgUnitEntity[],
759
+ ): Repository<OrgUnitEntity> {
760
+ type OrgUnitTreeDraftQueryBuilder = Readonly<{
761
+ andWhere: (
762
+ condition: string,
763
+ nextParameters?: {
764
+ readonly id?: string;
765
+ readonly previousPath?: string;
766
+ },
767
+ ) => OrgUnitTreeDraftQueryBuilder;
768
+ getMany: () => Promise<OrgUnitEntity[]>;
769
+ where: (condition: string) => OrgUnitTreeDraftQueryBuilder;
770
+ }>;
771
+
772
+ const find = jest.fn((): Promise<OrgUnitEntity[]> =>
773
+ Promise.resolve(orgUnits),
774
+ );
775
+ const save = jest.fn((entity: OrgUnitEntity): Promise<OrgUnitEntity> => {
776
+ const index = orgUnits.findIndex((orgUnit) => orgUnit.id === entity.id);
777
+
778
+ if (index >= 0) {
779
+ orgUnits[index] = entity;
780
+ }
781
+
782
+ return Promise.resolve(entity);
783
+ });
784
+ const merge = jest.fn(
785
+ (
786
+ entity: OrgUnitEntity,
787
+ patch: Partial<OrgUnitEntity>,
788
+ ): OrgUnitEntity => Object.assign(entity, patch),
789
+ );
790
+ const createQueryBuilder = jest.fn((): OrgUnitTreeDraftQueryBuilder => {
791
+ const parameters: { id?: string; previousPath?: string } = {};
792
+ const queryBuilder: OrgUnitTreeDraftQueryBuilder = {
793
+ andWhere: jest.fn(
794
+ (
795
+ _condition: string,
796
+ nextParameters?: {
797
+ readonly id?: string;
798
+ readonly previousPath?: string;
799
+ },
800
+ ): OrgUnitTreeDraftQueryBuilder => {
801
+ Object.assign(parameters, nextParameters);
802
+
803
+ return queryBuilder;
804
+ },
805
+ ),
806
+ getMany: jest.fn((): Promise<OrgUnitEntity[]> => {
807
+ const previousPath = parameters.previousPath ?? '';
808
+ const id = parameters.id ?? '';
809
+
810
+ return Promise.resolve(
811
+ orgUnits.filter(
812
+ (orgUnit) =>
813
+ orgUnit.id !== id &&
814
+ orgUnit.path !== previousPath &&
815
+ orgUnit.path.startsWith(`${previousPath}.`),
816
+ ),
817
+ );
818
+ }),
819
+ where: jest.fn((condition: string): OrgUnitTreeDraftQueryBuilder => {
820
+ void condition;
821
+
822
+ return queryBuilder;
823
+ }),
824
+ };
825
+
826
+ return queryBuilder;
827
+ });
828
+
829
+ return {
830
+ createQueryBuilder,
831
+ find,
832
+ merge,
833
+ save,
834
+ } as unknown as Repository<OrgUnitEntity>;
835
+ }