ofcoop-shared-core 0.1.0-alpha.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 (98) hide show
  1. package/README.md +18 -0
  2. package/dist/OfcoopCore.d.ts +60 -0
  3. package/dist/OfcoopCore.js +273 -0
  4. package/dist/contracts/MemberContract.d.ts +52 -0
  5. package/dist/contracts/MemberContract.js +2 -0
  6. package/dist/contracts/MemberNumberPolicyContract.d.ts +44 -0
  7. package/dist/contracts/MemberNumberPolicyContract.js +2 -0
  8. package/dist/contracts/SavingComplianceSnapshotContract.d.ts +34 -0
  9. package/dist/contracts/SavingComplianceSnapshotContract.js +2 -0
  10. package/dist/contracts/SavingLedgerContract.d.ts +49 -0
  11. package/dist/contracts/SavingLedgerContract.js +2 -0
  12. package/dist/contracts/SavingPolicyContract.d.ts +63 -0
  13. package/dist/contracts/SavingPolicyContract.js +2 -0
  14. package/dist/contracts/ShuConfigContract.d.ts +39 -0
  15. package/dist/contracts/ShuConfigContract.js +2 -0
  16. package/dist/contracts/ShuContract.d.ts +58 -0
  17. package/dist/contracts/ShuContract.js +2 -0
  18. package/dist/contracts/crossDomainPrimitives.d.ts +5 -0
  19. package/dist/contracts/crossDomainPrimitives.js +2 -0
  20. package/dist/data/applyPendingMigrations.d.ts +2 -0
  21. package/dist/data/applyPendingMigrations.js +30 -0
  22. package/dist/data/migrations.d.ts +2 -0
  23. package/dist/data/migrations.js +20 -0
  24. package/dist/data/repositories.d.ts +114 -0
  25. package/dist/data/repositories.js +324 -0
  26. package/dist/data/schemas.d.ts +14 -0
  27. package/dist/data/schemas.js +179 -0
  28. package/dist/index.d.ts +38 -0
  29. package/dist/index.js +54 -0
  30. package/dist/services/AuditTrailQueryService.d.ts +35 -0
  31. package/dist/services/AuditTrailQueryService.js +62 -0
  32. package/dist/services/CoopOrchestrationService.d.ts +35 -0
  33. package/dist/services/CoopOrchestrationService.js +71 -0
  34. package/dist/services/DailyOpsService.d.ts +2 -0
  35. package/dist/services/DailyOpsService.js +7 -0
  36. package/dist/services/DashboardSummaryService.d.ts +180 -0
  37. package/dist/services/DashboardSummaryService.js +211 -0
  38. package/dist/services/DashboardViewModelService.d.ts +42 -0
  39. package/dist/services/DashboardViewModelService.js +193 -0
  40. package/dist/services/Member360Service.d.ts +75 -0
  41. package/dist/services/Member360Service.js +79 -0
  42. package/dist/services/Member360ViewModelService.d.ts +33 -0
  43. package/dist/services/Member360ViewModelService.js +66 -0
  44. package/dist/services/MemberNumberPolicyService.d.ts +4 -0
  45. package/dist/services/MemberNumberPolicyService.js +18 -0
  46. package/dist/services/MemberService.d.ts +4 -0
  47. package/dist/services/MemberService.js +18 -0
  48. package/dist/services/ReportSummaryService.d.ts +81 -0
  49. package/dist/services/ReportSummaryService.js +160 -0
  50. package/dist/services/ReportViewModelService.d.ts +24 -0
  51. package/dist/services/ReportViewModelService.js +90 -0
  52. package/dist/services/SavingComplianceSnapshotService.d.ts +4 -0
  53. package/dist/services/SavingComplianceSnapshotService.js +10 -0
  54. package/dist/services/SavingLedgerService.d.ts +4 -0
  55. package/dist/services/SavingLedgerService.js +13 -0
  56. package/dist/services/SavingPolicyService.d.ts +5 -0
  57. package/dist/services/SavingPolicyService.js +20 -0
  58. package/dist/services/ShuConfigService.d.ts +4 -0
  59. package/dist/services/ShuConfigService.js +16 -0
  60. package/dist/services/ShuService.d.ts +4 -0
  61. package/dist/services/ShuService.js +14 -0
  62. package/dist/services/createActivityAuditTrailProvider.d.ts +22 -0
  63. package/dist/services/createActivityAuditTrailProvider.js +73 -0
  64. package/dist/services/createAuditTrailCompositionProvider.d.ts +13 -0
  65. package/dist/services/createAuditTrailCompositionProvider.js +21 -0
  66. package/dist/services/createDbAdapterOfcoopServices.d.ts +20 -0
  67. package/dist/services/createDbAdapterOfcoopServices.js +23 -0
  68. package/dist/services/createMember360CompositionProviders.d.ts +6 -0
  69. package/dist/services/createMember360CompositionProviders.js +43 -0
  70. package/dist/services/createOfauthCompositionProviders.d.ts +39 -0
  71. package/dist/services/createOfauthCompositionProviders.js +80 -0
  72. package/dist/services/createOfcoopCreditCompositionProviders.d.ts +59 -0
  73. package/dist/services/createOfcoopCreditCompositionProviders.js +233 -0
  74. package/dist/services/createOfcoopDashboardCompositionProviders.d.ts +18 -0
  75. package/dist/services/createOfcoopDashboardCompositionProviders.js +228 -0
  76. package/dist/services/createOfcoopDomainAuditCompositionProviders.d.ts +36 -0
  77. package/dist/services/createOfcoopDomainAuditCompositionProviders.js +117 -0
  78. package/dist/services/createOfcoopReportCompositionProviders.d.ts +10 -0
  79. package/dist/services/createOfcoopReportCompositionProviders.js +30 -0
  80. package/dist/services/errors.d.ts +8 -0
  81. package/dist/services/errors.js +23 -0
  82. package/dist/services/impl/DbAdapterMemberNumberPolicyService.d.ts +9 -0
  83. package/dist/services/impl/DbAdapterMemberNumberPolicyService.js +37 -0
  84. package/dist/services/impl/DbAdapterMemberService.d.ts +21 -0
  85. package/dist/services/impl/DbAdapterMemberService.js +142 -0
  86. package/dist/services/impl/DbAdapterSavingComplianceSnapshotService.d.ts +9 -0
  87. package/dist/services/impl/DbAdapterSavingComplianceSnapshotService.js +74 -0
  88. package/dist/services/impl/DbAdapterSavingLedgerService.d.ts +18 -0
  89. package/dist/services/impl/DbAdapterSavingLedgerService.js +115 -0
  90. package/dist/services/impl/DbAdapterSavingPolicyService.d.ts +14 -0
  91. package/dist/services/impl/DbAdapterSavingPolicyService.js +139 -0
  92. package/dist/services/impl/DbAdapterShuConfigService.d.ts +12 -0
  93. package/dist/services/impl/DbAdapterShuConfigService.js +62 -0
  94. package/dist/services/impl/DbAdapterShuService.d.ts +26 -0
  95. package/dist/services/impl/DbAdapterShuService.js +376 -0
  96. package/dist/services/impl/runtimeSupport.d.ts +18 -0
  97. package/dist/services/impl/runtimeSupport.js +29 -0
  98. package/package.json +41 -0
@@ -0,0 +1,179 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ofcoopSchema = exports.OFCOOP_TABLES = void 0;
4
+ exports.getOfcoopTableSchemas = getOfcoopTableSchemas;
5
+ exports.OFCOOP_TABLES = {
6
+ members: 'ofcoop_members',
7
+ memberWaConsent: 'ofcoop_member_wa_consent',
8
+ memberExitState: 'ofcoop_member_exit_state',
9
+ memberNumberPolicies: 'ofcoop_member_number_policies',
10
+ savingPolicies: 'ofcoop_saving_policies',
11
+ savingEntries: 'ofcoop_saving_entries',
12
+ shuConfigs: 'ofcoop_shu_configs',
13
+ shuPeriods: 'ofcoop_shu_periods',
14
+ shuAllocations: 'ofcoop_shu_allocations',
15
+ };
16
+ const tableSchemas = [
17
+ {
18
+ name: exports.OFCOOP_TABLES.members,
19
+ columns: [
20
+ { name: 'id', type: 'string' },
21
+ { name: 'memberNumber', type: 'string', isIndexed: true },
22
+ { name: 'fullName', type: 'string' },
23
+ { name: 'status', type: 'string', enum: ['active', 'inactive', 'exited'] },
24
+ { name: 'joinDate', type: 'string' },
25
+ { name: 'exitDate', type: 'string', isOptional: true },
26
+ { name: 'branchId', type: 'string', isOptional: true, isIndexed: true },
27
+ { name: 'tenantId', type: 'string', isOptional: true, isIndexed: true },
28
+ { name: 'version', type: 'number' },
29
+ { name: 'lastModified', type: 'string' },
30
+ { name: 'deleted', type: 'boolean', isIndexed: true },
31
+ ],
32
+ },
33
+ {
34
+ name: exports.OFCOOP_TABLES.memberWaConsent,
35
+ columns: [
36
+ { name: 'id', type: 'string' },
37
+ { name: 'granted', type: 'boolean' },
38
+ { name: 'source', type: 'string', isOptional: true },
39
+ { name: 'note', type: 'string', isOptional: true },
40
+ { name: 'version', type: 'number' },
41
+ { name: 'lastModified', type: 'string' },
42
+ { name: 'deleted', type: 'boolean', isIndexed: true },
43
+ ],
44
+ },
45
+ {
46
+ name: exports.OFCOOP_TABLES.memberExitState,
47
+ columns: [
48
+ { name: 'id', type: 'string' },
49
+ { name: 'stage', type: 'string', enum: ['requested', 'settled', 'canceled'] },
50
+ { name: 'reason', type: 'string', isOptional: true },
51
+ { name: 'requestedBy', type: 'string', isOptional: true },
52
+ { name: 'referenceId', type: 'string', isOptional: true },
53
+ { name: 'version', type: 'number' },
54
+ { name: 'lastModified', type: 'string' },
55
+ { name: 'deleted', type: 'boolean', isIndexed: true },
56
+ ],
57
+ },
58
+ {
59
+ name: exports.OFCOOP_TABLES.memberNumberPolicies,
60
+ columns: [
61
+ { name: 'id', type: 'string' },
62
+ { name: 'koperasiId', type: 'string', isIndexed: true },
63
+ { name: 'branchId', type: 'string', isOptional: true, isIndexed: true },
64
+ { name: 'tenantId', type: 'string', isOptional: true, isIndexed: true },
65
+ { name: 'prefix', type: 'string', isOptional: true },
66
+ { name: 'includeYear', type: 'boolean' },
67
+ { name: 'includeMonth', type: 'boolean', isOptional: true },
68
+ { name: 'separator', type: 'string' },
69
+ { name: 'paddingDigits', type: 'number' },
70
+ { name: 'counterResetPolicy', type: 'string', enum: ['never', 'yearly'] },
71
+ { name: 'counterStart', type: 'number' },
72
+ { name: 'manualOverrideAllowed', type: 'boolean' },
73
+ { name: 'effectiveDate', type: 'string' },
74
+ { name: 'approvalRef', type: 'string', isOptional: true },
75
+ { name: 'version', type: 'number' },
76
+ { name: 'lastModified', type: 'string' },
77
+ { name: 'deleted', type: 'boolean', isIndexed: true },
78
+ ],
79
+ },
80
+ {
81
+ name: exports.OFCOOP_TABLES.savingPolicies,
82
+ columns: [
83
+ { name: 'id', type: 'string' },
84
+ { name: 'koperasiId', type: 'string', isIndexed: true },
85
+ { name: 'branchId', type: 'string', isOptional: true, isIndexed: true },
86
+ { name: 'tenantId', type: 'string', isOptional: true, isIndexed: true },
87
+ { name: 'simpananPokokNominalIdr', type: 'number' },
88
+ { name: 'monthlyWajibNominalIdr', type: 'number' },
89
+ { name: 'gracePeriodMonth', type: 'number' },
90
+ { name: 'dendaType', type: 'string', enum: ['fixed', 'percentage'] },
91
+ { name: 'dendaAmountIdr', type: 'number' },
92
+ { name: 'dendaPercentage', type: 'number' },
93
+ { name: 'warningAtMonths', type: 'number' },
94
+ { name: 'nonaktifAtMonths', type: 'number' },
95
+ { name: 'autoSetAnggotaNonaktif', type: 'boolean' },
96
+ { name: 'effectiveDate', type: 'string' },
97
+ { name: 'changeReason', type: 'string', isOptional: true },
98
+ { name: 'approvalRef', type: 'string', isOptional: true },
99
+ { name: 'version', type: 'number' },
100
+ { name: 'lastModified', type: 'string' },
101
+ { name: 'deleted', type: 'boolean', isIndexed: true },
102
+ ],
103
+ },
104
+ {
105
+ name: exports.OFCOOP_TABLES.savingEntries,
106
+ columns: [
107
+ { name: 'id', type: 'string' },
108
+ { name: 'memberId', type: 'string', isIndexed: true },
109
+ { name: 'savingType', type: 'string', enum: ['pokok', 'wajib', 'sukarela'] },
110
+ { name: 'entryType', type: 'string', enum: ['credit', 'debit'] },
111
+ { name: 'amount', type: 'number' },
112
+ { name: 'transactionDate', type: 'string', isIndexed: true },
113
+ { name: 'referenceType', type: 'string', isOptional: true },
114
+ { name: 'referenceId', type: 'string', isOptional: true },
115
+ { name: 'notes', type: 'string', isOptional: true },
116
+ { name: 'branchId', type: 'string', isOptional: true, isIndexed: true },
117
+ { name: 'tenantId', type: 'string', isOptional: true, isIndexed: true },
118
+ { name: 'version', type: 'number' },
119
+ { name: 'lastModified', type: 'string' },
120
+ { name: 'deleted', type: 'boolean', isIndexed: true },
121
+ ],
122
+ },
123
+ {
124
+ name: exports.OFCOOP_TABLES.shuConfigs,
125
+ columns: [
126
+ { name: 'id', type: 'string' },
127
+ { name: 'koperasiId', type: 'string', isIndexed: true },
128
+ { name: 'tenantId', type: 'string', isOptional: true, isIndexed: true },
129
+ { name: 'branchId', type: 'string', isOptional: true, isIndexed: true },
130
+ { name: 'effectiveDate', type: 'string' },
131
+ { name: 'cadanganPercent', type: 'number' },
132
+ { name: 'jasaUsahaPercent', type: 'number' },
133
+ { name: 'jasaModalPercent', type: 'number' },
134
+ { name: 'notes', type: 'string', isOptional: true },
135
+ { name: 'approvalRef', type: 'string', isOptional: true },
136
+ { name: 'version', type: 'number' },
137
+ { name: 'lastModified', type: 'string' },
138
+ { name: 'deleted', type: 'boolean', isIndexed: true },
139
+ ],
140
+ },
141
+ {
142
+ name: exports.OFCOOP_TABLES.shuPeriods,
143
+ columns: [
144
+ { name: 'id', type: 'string' },
145
+ { name: 'periodCode', type: 'string', isIndexed: true },
146
+ { name: 'startDate', type: 'string' },
147
+ { name: 'endDate', type: 'string' },
148
+ { name: 'status', type: 'string', enum: ['draft', 'finalized'] },
149
+ { name: 'formulaSnapshot', type: 'json' },
150
+ { name: 'branchId', type: 'string', isOptional: true, isIndexed: true },
151
+ { name: 'tenantId', type: 'string', isOptional: true, isIndexed: true },
152
+ { name: 'version', type: 'number' },
153
+ { name: 'lastModified', type: 'string' },
154
+ { name: 'deleted', type: 'boolean', isIndexed: true },
155
+ ],
156
+ },
157
+ {
158
+ name: exports.OFCOOP_TABLES.shuAllocations,
159
+ columns: [
160
+ { name: 'id', type: 'string' },
161
+ { name: 'shuPeriodId', type: 'string', isIndexed: true },
162
+ { name: 'memberId', type: 'string', isIndexed: true },
163
+ { name: 'allocationAmount', type: 'number' },
164
+ { name: 'calculationBasis', type: 'json' },
165
+ { name: 'branchId', type: 'string', isOptional: true, isIndexed: true },
166
+ { name: 'tenantId', type: 'string', isOptional: true, isIndexed: true },
167
+ { name: 'version', type: 'number' },
168
+ { name: 'lastModified', type: 'string' },
169
+ { name: 'deleted', type: 'boolean', isIndexed: true },
170
+ ],
171
+ },
172
+ ];
173
+ exports.ofcoopSchema = {
174
+ version: 1,
175
+ tables: tableSchemas,
176
+ };
177
+ function getOfcoopTableSchemas() {
178
+ return exports.ofcoopSchema.tables;
179
+ }
@@ -0,0 +1,38 @@
1
+ export * from './contracts/crossDomainPrimitives';
2
+ export * from './contracts/MemberContract';
3
+ export * from './contracts/SavingLedgerContract';
4
+ export * from './contracts/ShuContract';
5
+ export * from './contracts/MemberNumberPolicyContract';
6
+ export * from './contracts/SavingPolicyContract';
7
+ export * from './contracts/SavingComplianceSnapshotContract';
8
+ export * from './contracts/ShuConfigContract';
9
+ export * from './OfcoopCore';
10
+ export * from './services/MemberService';
11
+ export * from './services/SavingLedgerService';
12
+ export * from './services/ShuService';
13
+ export * from './services/MemberNumberPolicyService';
14
+ export * from './services/SavingPolicyService';
15
+ export * from './services/SavingComplianceSnapshotService';
16
+ export * from './services/ShuConfigService';
17
+ export * from './services/CoopOrchestrationService';
18
+ export * from './services/Member360Service';
19
+ export * from './services/Member360ViewModelService';
20
+ export * from './services/createMember360CompositionProviders';
21
+ export * from './services/DashboardSummaryService';
22
+ export * from './services/DashboardViewModelService';
23
+ export * from './services/ReportSummaryService';
24
+ export * from './services/ReportViewModelService';
25
+ export * from './services/AuditTrailQueryService';
26
+ export * from './services/createAuditTrailCompositionProvider';
27
+ export * from './services/createActivityAuditTrailProvider';
28
+ export * from './services/createOfcoopCreditCompositionProviders';
29
+ export * from './services/createOfcoopDashboardCompositionProviders';
30
+ export * from './services/createOfcoopReportCompositionProviders';
31
+ export * from './services/createOfcoopDomainAuditCompositionProviders';
32
+ export * from './services/createOfauthCompositionProviders';
33
+ export * from './services/errors';
34
+ export * from './services/createDbAdapterOfcoopServices';
35
+ export * from './data/schemas';
36
+ export * from './data/migrations';
37
+ export * from './data/applyPendingMigrations';
38
+ export * from './data/repositories';
package/dist/index.js ADDED
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./contracts/crossDomainPrimitives"), exports);
18
+ __exportStar(require("./contracts/MemberContract"), exports);
19
+ __exportStar(require("./contracts/SavingLedgerContract"), exports);
20
+ __exportStar(require("./contracts/ShuContract"), exports);
21
+ __exportStar(require("./contracts/MemberNumberPolicyContract"), exports);
22
+ __exportStar(require("./contracts/SavingPolicyContract"), exports);
23
+ __exportStar(require("./contracts/SavingComplianceSnapshotContract"), exports);
24
+ __exportStar(require("./contracts/ShuConfigContract"), exports);
25
+ __exportStar(require("./OfcoopCore"), exports);
26
+ __exportStar(require("./services/MemberService"), exports);
27
+ __exportStar(require("./services/SavingLedgerService"), exports);
28
+ __exportStar(require("./services/ShuService"), exports);
29
+ __exportStar(require("./services/MemberNumberPolicyService"), exports);
30
+ __exportStar(require("./services/SavingPolicyService"), exports);
31
+ __exportStar(require("./services/SavingComplianceSnapshotService"), exports);
32
+ __exportStar(require("./services/ShuConfigService"), exports);
33
+ __exportStar(require("./services/CoopOrchestrationService"), exports);
34
+ __exportStar(require("./services/Member360Service"), exports);
35
+ __exportStar(require("./services/Member360ViewModelService"), exports);
36
+ __exportStar(require("./services/createMember360CompositionProviders"), exports);
37
+ __exportStar(require("./services/DashboardSummaryService"), exports);
38
+ __exportStar(require("./services/DashboardViewModelService"), exports);
39
+ __exportStar(require("./services/ReportSummaryService"), exports);
40
+ __exportStar(require("./services/ReportViewModelService"), exports);
41
+ __exportStar(require("./services/AuditTrailQueryService"), exports);
42
+ __exportStar(require("./services/createAuditTrailCompositionProvider"), exports);
43
+ __exportStar(require("./services/createActivityAuditTrailProvider"), exports);
44
+ __exportStar(require("./services/createOfcoopCreditCompositionProviders"), exports);
45
+ __exportStar(require("./services/createOfcoopDashboardCompositionProviders"), exports);
46
+ __exportStar(require("./services/createOfcoopReportCompositionProviders"), exports);
47
+ __exportStar(require("./services/createOfcoopDomainAuditCompositionProviders"), exports);
48
+ __exportStar(require("./services/createOfauthCompositionProviders"), exports);
49
+ __exportStar(require("./services/errors"), exports);
50
+ __exportStar(require("./services/createDbAdapterOfcoopServices"), exports);
51
+ __exportStar(require("./data/schemas"), exports);
52
+ __exportStar(require("./data/migrations"), exports);
53
+ __exportStar(require("./data/applyPendingMigrations"), exports);
54
+ __exportStar(require("./data/repositories"), exports);
@@ -0,0 +1,35 @@
1
+ export interface AuditTrailScopeRef {
2
+ tenantId?: string | null;
3
+ branchId?: string | null;
4
+ }
5
+ export type AuditTrailRole = 'pengurus' | 'pengawas' | 'anggota';
6
+ export interface AuditTrailAccessContext {
7
+ role: AuditTrailRole;
8
+ actorMemberId?: string | null;
9
+ }
10
+ export interface AuditTrailEvent {
11
+ eventId: string;
12
+ sourceDomain: 'ofcoop' | 'ofcoop-credit' | 'ofauth' | 'external';
13
+ eventType: string;
14
+ occurredAt: string;
15
+ memberId?: string | null;
16
+ tenantId?: string | null;
17
+ branchId?: string | null;
18
+ summary?: string;
19
+ }
20
+ export interface AuditTrailQueryInput {
21
+ scope?: AuditTrailScopeRef;
22
+ memberId?: string | null;
23
+ eventTypes?: string[];
24
+ fromTimestamp?: string;
25
+ toTimestamp?: string;
26
+ limit?: number;
27
+ accessContext?: AuditTrailAccessContext;
28
+ }
29
+ export interface AuditTrailQueryDependencies {
30
+ providers: {
31
+ listEvents: (query: AuditTrailQueryInput) => Promise<AuditTrailEvent[]>;
32
+ };
33
+ eventCatalog?: string[];
34
+ }
35
+ export declare function queryAuditTrail(deps: AuditTrailQueryDependencies, input?: AuditTrailQueryInput): Promise<AuditTrailEvent[]>;
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.queryAuditTrail = queryAuditTrail;
4
+ const errors_1 = require("./errors");
5
+ function normalizeQuery(input) {
6
+ const out = { ...input };
7
+ if (out.limit == null)
8
+ out.limit = 100;
9
+ if (out.limit < 1)
10
+ out.limit = 1;
11
+ if (out.limit > 1000)
12
+ out.limit = 1000;
13
+ return out;
14
+ }
15
+ function normalizeCatalog(catalog) {
16
+ if (!catalog || catalog.length === 0)
17
+ return null;
18
+ return new Set(catalog);
19
+ }
20
+ function enforceCatalogQuery(query, catalog) {
21
+ if (!catalog || !query.eventTypes?.length)
22
+ return;
23
+ const unknown = query.eventTypes.filter((eventType) => !catalog.has(eventType));
24
+ if (unknown.length > 0) {
25
+ throw (0, errors_1.invalidState)(`audit trail query contains unknown eventTypes: ${unknown.join(', ')}`);
26
+ }
27
+ }
28
+ function enforceAccessPolicy(input) {
29
+ const query = normalizeQuery(input);
30
+ const ctx = query.accessContext;
31
+ if (!ctx || ctx.role !== 'anggota')
32
+ return query;
33
+ if (!ctx.actorMemberId?.trim()) {
34
+ throw (0, errors_1.invalidState)('audit trail access denied: anggota context requires actorMemberId');
35
+ }
36
+ if (query.memberId && query.memberId !== ctx.actorMemberId) {
37
+ throw (0, errors_1.invalidState)('audit trail access denied: anggota can only query own memberId');
38
+ }
39
+ return {
40
+ ...query,
41
+ memberId: ctx.actorMemberId,
42
+ };
43
+ }
44
+ function applyQueryFilter(events, query) {
45
+ return events
46
+ .filter((e) => (query.memberId ? e.memberId === query.memberId : true))
47
+ .filter((e) => (query.scope?.tenantId ? e.tenantId === query.scope.tenantId : true))
48
+ .filter((e) => (query.scope?.branchId ? e.branchId === query.scope.branchId : true))
49
+ .filter((e) => (query.eventTypes?.length ? query.eventTypes.includes(e.eventType) : true))
50
+ .filter((e) => (query.fromTimestamp ? e.occurredAt >= query.fromTimestamp : true))
51
+ .filter((e) => (query.toTimestamp ? e.occurredAt <= query.toTimestamp : true))
52
+ .sort((a, b) => b.occurredAt.localeCompare(a.occurredAt))
53
+ .slice(0, query.limit ?? 100);
54
+ }
55
+ async function queryAuditTrail(deps, input = {}) {
56
+ const catalog = normalizeCatalog(deps.eventCatalog);
57
+ const query = enforceAccessPolicy(input);
58
+ enforceCatalogQuery(query, catalog);
59
+ const events = await deps.providers.listEvents(query);
60
+ const sanitizedEvents = catalog ? events.filter((event) => catalog.has(event.eventType)) : events;
61
+ return applyQueryFilter(sanitizedEvents, query);
62
+ }
@@ -0,0 +1,35 @@
1
+ import type { CreateMemberInput, MemberContract, MemberServiceContract } from '../contracts/MemberContract';
2
+ import type { SavingLedgerContract, SavingLedgerServiceContract } from '../contracts/SavingLedgerContract';
3
+ import type { SavingComplianceEvaluation, SavingComplianceWorklistItem, SavingPolicyContract, SavingPolicyServiceContract, UpsertSavingPolicyInput } from '../contracts/SavingPolicyContract';
4
+ import type { CreateShuPeriodInput, CsvExportPayload, ShuAllocationContract, ShuPeriodContract, ShuServiceContract } from '../contracts/ShuContract';
5
+ export interface CoopOrchestrationDependencies {
6
+ memberService: MemberServiceContract;
7
+ savingLedgerService: SavingLedgerServiceContract;
8
+ savingPolicyService: SavingPolicyServiceContract;
9
+ shuService: ShuServiceContract;
10
+ }
11
+ export interface OnboardMemberInput {
12
+ koperasiId?: string;
13
+ member: CreateMemberInput;
14
+ initialPokokDepositIdr?: number;
15
+ initialWajibDepositIdr?: number;
16
+ initialSukarelaDepositIdr?: number;
17
+ transactionDate: string;
18
+ }
19
+ export interface OnboardMemberResult {
20
+ member: MemberContract;
21
+ ledgerEntries: SavingLedgerContract[];
22
+ }
23
+ export declare function onboardMemberWithInitialSavings(deps: Pick<CoopOrchestrationDependencies, 'memberService' | 'savingLedgerService' | 'savingPolicyService'>, input: OnboardMemberInput): Promise<OnboardMemberResult>;
24
+ export interface UpsertPolicyAndEvaluateResult {
25
+ policy: SavingPolicyContract;
26
+ evaluation: SavingComplianceEvaluation;
27
+ worklist: SavingComplianceWorklistItem[];
28
+ }
29
+ export declare function upsertPolicyAndEvaluateCompliance(deps: Pick<CoopOrchestrationDependencies, 'savingPolicyService'>, input: UpsertSavingPolicyInput): Promise<UpsertPolicyAndEvaluateResult>;
30
+ export interface CreateGenerateExportShuResult {
31
+ period: ShuPeriodContract;
32
+ allocations: ShuAllocationContract[];
33
+ csv: CsvExportPayload;
34
+ }
35
+ export declare function createGenerateAndExportShu(deps: Pick<CoopOrchestrationDependencies, 'shuService'>, input: CreateShuPeriodInput): Promise<CreateGenerateExportShuResult>;
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.onboardMemberWithInitialSavings = onboardMemberWithInitialSavings;
4
+ exports.upsertPolicyAndEvaluateCompliance = upsertPolicyAndEvaluateCompliance;
5
+ exports.createGenerateAndExportShu = createGenerateAndExportShu;
6
+ const errors_1 = require("./errors");
7
+ async function onboardMemberWithInitialSavings(deps, input) {
8
+ if (!input.transactionDate?.trim()) {
9
+ throw (0, errors_1.invalidState)('transactionDate is required');
10
+ }
11
+ const pokok = Math.max(0, input.initialPokokDepositIdr ?? 0);
12
+ const wajib = Math.max(0, input.initialWajibDepositIdr ?? 0);
13
+ const sukarela = Math.max(0, input.initialSukarelaDepositIdr ?? 0);
14
+ if (deps.savingPolicyService && input.koperasiId && input.member.tenantId) {
15
+ const activePolicy = await deps.savingPolicyService.getActiveSavingPolicy({
16
+ koperasiId: input.koperasiId,
17
+ tenantId: input.member.tenantId,
18
+ branchId: input.member.branchId ?? null,
19
+ });
20
+ if (activePolicy && pokok < activePolicy.simpananPokokNominalIdr) {
21
+ throw (0, errors_1.invalidState)(`initialPokokDepositIdr must be >= ${activePolicy.simpananPokokNominalIdr}`);
22
+ }
23
+ }
24
+ const member = await deps.memberService.createMember(input.member);
25
+ const ledgerEntries = [];
26
+ const baseEntry = {
27
+ memberId: member.id,
28
+ transactionDate: input.transactionDate,
29
+ tenantId: member.tenantId ?? null,
30
+ branchId: member.branchId ?? null,
31
+ };
32
+ if (pokok > 0) {
33
+ ledgerEntries.push(await deps.savingLedgerService.recordSavingCredit({
34
+ ...baseEntry,
35
+ savingType: 'pokok',
36
+ amount: pokok,
37
+ }));
38
+ }
39
+ if (wajib > 0) {
40
+ ledgerEntries.push(await deps.savingLedgerService.recordSavingCredit({
41
+ ...baseEntry,
42
+ savingType: 'wajib',
43
+ amount: wajib,
44
+ }));
45
+ }
46
+ if (sukarela > 0) {
47
+ ledgerEntries.push(await deps.savingLedgerService.recordSavingCredit({
48
+ ...baseEntry,
49
+ savingType: 'sukarela',
50
+ amount: sukarela,
51
+ }));
52
+ }
53
+ return { member, ledgerEntries };
54
+ }
55
+ async function upsertPolicyAndEvaluateCompliance(deps, input) {
56
+ const policy = await deps.savingPolicyService.upsertSavingPolicy(input);
57
+ const scope = {
58
+ koperasiId: input.koperasiId,
59
+ tenantId: input.tenantId,
60
+ branchId: input.branchId ?? null,
61
+ };
62
+ const evaluation = await deps.savingPolicyService.evaluateWajibCompliance(scope);
63
+ const worklist = await deps.savingPolicyService.getComplianceWorklist(scope);
64
+ return { policy, evaluation, worklist };
65
+ }
66
+ async function createGenerateAndExportShu(deps, input) {
67
+ const period = await deps.shuService.createShuPeriod(input);
68
+ const allocations = await deps.shuService.generateShuAllocations(period.id);
69
+ const csv = await deps.shuService.exportShuAllocationsCsv(period.id);
70
+ return { period, allocations, csv };
71
+ }
@@ -0,0 +1,2 @@
1
+ export type { CoopOrchestrationDependencies as DailyOpsDependencies, OnboardMemberInput, OnboardMemberResult, UpsertPolicyAndEvaluateResult, CreateGenerateExportShuResult, } from './CoopOrchestrationService';
2
+ export { onboardMemberWithInitialSavings, upsertPolicyAndEvaluateCompliance, createGenerateAndExportShu, } from './CoopOrchestrationService';
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createGenerateAndExportShu = exports.upsertPolicyAndEvaluateCompliance = exports.onboardMemberWithInitialSavings = void 0;
4
+ var CoopOrchestrationService_1 = require("./CoopOrchestrationService");
5
+ Object.defineProperty(exports, "onboardMemberWithInitialSavings", { enumerable: true, get: function () { return CoopOrchestrationService_1.onboardMemberWithInitialSavings; } });
6
+ Object.defineProperty(exports, "upsertPolicyAndEvaluateCompliance", { enumerable: true, get: function () { return CoopOrchestrationService_1.upsertPolicyAndEvaluateCompliance; } });
7
+ Object.defineProperty(exports, "createGenerateAndExportShu", { enumerable: true, get: function () { return CoopOrchestrationService_1.createGenerateAndExportShu; } });