ofcoop-shared-core 0.1.0-alpha.0 → 0.1.0-alpha.2

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 (133) hide show
  1. package/dist/OfcoopCore.d.ts +10 -3
  2. package/dist/contracts/ComplianceReadinessContract.d.ts +31 -0
  3. package/dist/contracts/CoopCommunityProfileContract.d.ts +87 -0
  4. package/dist/contracts/GovernanceContract.d.ts +157 -0
  5. package/dist/contracts/LeadershipAppointmentContract.d.ts +91 -0
  6. package/dist/contracts/LeadershipTermContract.d.ts +53 -0
  7. package/dist/contracts/ManagementReportContract.d.ts +99 -0
  8. package/dist/contracts/MemberContract.d.ts +61 -18
  9. package/dist/contracts/MemberDependentContract.d.ts +43 -0
  10. package/dist/contracts/MemberNumberPolicyContract.d.ts +6 -11
  11. package/dist/contracts/OversightPolicyContract.d.ts +28 -0
  12. package/dist/contracts/RiskRegisterContract.d.ts +93 -0
  13. package/dist/contracts/SavingComplianceSnapshotContract.d.ts +5 -8
  14. package/dist/contracts/SavingLedgerContract.d.ts +9 -14
  15. package/dist/contracts/SavingPolicyContract.d.ts +16 -20
  16. package/dist/contracts/ShuConfigContract.d.ts +26 -12
  17. package/dist/contracts/ShuContract.d.ts +11 -18
  18. package/dist/contracts/ShuParticipationEntryContract.d.ts +54 -0
  19. package/dist/contracts/WhistleReportContract.d.ts +72 -0
  20. package/dist/data/repositories.d.ts +154 -9
  21. package/dist/data/schemas.d.ts +16 -0
  22. package/dist/finance/offinanceProjection.d.ts +33 -0
  23. package/dist/index.d.ts +67 -38
  24. package/dist/index.esm.js +7 -0
  25. package/dist/index.js +7 -54
  26. package/dist/services/ComplianceReadinessService.d.ts +4 -0
  27. package/dist/services/CoopCommunityProfileService.d.ts +5 -0
  28. package/dist/services/CoopOrchestrationService.d.ts +4 -4
  29. package/dist/services/DashboardSummaryService.d.ts +38 -2
  30. package/dist/services/DashboardViewModelService.d.ts +1 -1
  31. package/dist/services/GovernanceMeetingService.d.ts +9 -0
  32. package/dist/services/HasilUsahaPeriodService.d.ts +35 -0
  33. package/dist/services/LeadershipAppointmentService.d.ts +7 -0
  34. package/dist/services/LeadershipTermService.d.ts +6 -0
  35. package/dist/services/ManagementReportFinancialTemplateEvaluatorService.d.ts +12 -0
  36. package/dist/services/ManagementReportFinancialTemplateService.d.ts +25 -0
  37. package/dist/services/ManagementReportService.d.ts +8 -0
  38. package/dist/services/Member360Service.d.ts +2 -2
  39. package/dist/services/Member360ViewModelService.d.ts +1 -1
  40. package/dist/services/MemberDependentService.d.ts +5 -0
  41. package/dist/services/MemberNumberPolicyService.d.ts +1 -1
  42. package/dist/services/MemberService.d.ts +2 -1
  43. package/dist/services/OversightPolicyService.d.ts +4 -0
  44. package/dist/services/ReportSummaryService.d.ts +26 -2
  45. package/dist/services/ReportViewModelService.d.ts +1 -1
  46. package/dist/services/RiskRegisterService.d.ts +10 -0
  47. package/dist/services/SavingComplianceSnapshotService.d.ts +1 -1
  48. package/dist/services/SavingLedgerService.d.ts +1 -1
  49. package/dist/services/SavingPolicyService.d.ts +1 -1
  50. package/dist/services/ShuConfigService.d.ts +2 -1
  51. package/dist/services/ShuParticipationEntryService.d.ts +5 -0
  52. package/dist/services/ShuService.d.ts +1 -1
  53. package/dist/services/WhistleReportService.d.ts +8 -0
  54. package/dist/services/createActivityAuditTrailProvider.d.ts +1 -1
  55. package/dist/services/createDbAdapterOfcoopServices.d.ts +31 -9
  56. package/dist/services/createMember360CompositionProviders.d.ts +1 -1
  57. package/dist/services/createOfauthCompositionProviders.d.ts +2 -2
  58. package/dist/services/createOfcoopCreditCompositionProviders.d.ts +27 -6
  59. package/dist/services/createOfcoopDashboardCompositionProviders.d.ts +4 -4
  60. package/dist/services/createOfcoopDomainAuditCompositionProviders.d.ts +2 -2
  61. package/dist/services/createOfcoopOffinanceReportCompositionProviders.d.ts +32 -0
  62. package/dist/services/createOfcoopReportCompositionProviders.d.ts +2 -2
  63. package/dist/services/createOfcoopStandardReportProviders.d.ts +35 -0
  64. package/dist/services/impl/DbAdapterComplianceReadinessService.d.ts +18 -0
  65. package/dist/services/impl/DbAdapterCoopCommunityProfileService.d.ts +15 -0
  66. package/dist/services/impl/DbAdapterGovernanceMeetingService.d.ts +29 -0
  67. package/dist/services/impl/DbAdapterLeadershipAppointmentService.d.ts +17 -0
  68. package/dist/services/impl/DbAdapterLeadershipTermService.d.ts +15 -0
  69. package/dist/services/impl/DbAdapterManagementReportService.d.ts +24 -0
  70. package/dist/services/impl/DbAdapterMemberDependentService.d.ts +15 -0
  71. package/dist/services/impl/DbAdapterMemberNumberPolicyService.d.ts +5 -4
  72. package/dist/services/impl/DbAdapterMemberService.d.ts +14 -13
  73. package/dist/services/impl/DbAdapterOversightPolicyService.d.ts +13 -0
  74. package/dist/services/impl/DbAdapterRiskRegisterService.d.ts +23 -0
  75. package/dist/services/impl/DbAdapterSavingComplianceSnapshotService.d.ts +5 -4
  76. package/dist/services/impl/DbAdapterSavingLedgerService.d.ts +9 -9
  77. package/dist/services/impl/DbAdapterSavingPolicyService.d.ts +9 -7
  78. package/dist/services/impl/DbAdapterShuConfigService.d.ts +8 -6
  79. package/dist/services/impl/DbAdapterShuParticipationEntryService.d.ts +14 -0
  80. package/dist/services/impl/DbAdapterShuService.d.ts +10 -10
  81. package/dist/services/impl/DbAdapterWhistleReportService.d.ts +21 -0
  82. package/dist/services/impl/managementReportTemplates.d.ts +7 -0
  83. package/dist/services/impl/runtimeSupport.d.ts +30 -1
  84. package/dist/services/userService.d.ts +30 -0
  85. package/package.json +20 -9
  86. package/dist/OfcoopCore.js +0 -273
  87. package/dist/contracts/MemberContract.js +0 -2
  88. package/dist/contracts/MemberNumberPolicyContract.js +0 -2
  89. package/dist/contracts/SavingComplianceSnapshotContract.js +0 -2
  90. package/dist/contracts/SavingLedgerContract.js +0 -2
  91. package/dist/contracts/SavingPolicyContract.js +0 -2
  92. package/dist/contracts/ShuConfigContract.js +0 -2
  93. package/dist/contracts/ShuContract.js +0 -2
  94. package/dist/contracts/crossDomainPrimitives.d.ts +0 -5
  95. package/dist/contracts/crossDomainPrimitives.js +0 -2
  96. package/dist/data/applyPendingMigrations.js +0 -30
  97. package/dist/data/migrations.js +0 -20
  98. package/dist/data/repositories.js +0 -324
  99. package/dist/data/schemas.js +0 -179
  100. package/dist/services/AuditTrailQueryService.js +0 -62
  101. package/dist/services/CoopOrchestrationService.js +0 -71
  102. package/dist/services/DailyOpsService.js +0 -7
  103. package/dist/services/DashboardSummaryService.js +0 -211
  104. package/dist/services/DashboardViewModelService.js +0 -193
  105. package/dist/services/Member360Service.js +0 -79
  106. package/dist/services/Member360ViewModelService.js +0 -66
  107. package/dist/services/MemberNumberPolicyService.js +0 -18
  108. package/dist/services/MemberService.js +0 -18
  109. package/dist/services/ReportSummaryService.js +0 -160
  110. package/dist/services/ReportViewModelService.js +0 -90
  111. package/dist/services/SavingComplianceSnapshotService.js +0 -10
  112. package/dist/services/SavingLedgerService.js +0 -13
  113. package/dist/services/SavingPolicyService.js +0 -20
  114. package/dist/services/ShuConfigService.js +0 -16
  115. package/dist/services/ShuService.js +0 -14
  116. package/dist/services/createActivityAuditTrailProvider.js +0 -73
  117. package/dist/services/createAuditTrailCompositionProvider.js +0 -21
  118. package/dist/services/createDbAdapterOfcoopServices.js +0 -23
  119. package/dist/services/createMember360CompositionProviders.js +0 -43
  120. package/dist/services/createOfauthCompositionProviders.js +0 -80
  121. package/dist/services/createOfcoopCreditCompositionProviders.js +0 -233
  122. package/dist/services/createOfcoopDashboardCompositionProviders.js +0 -228
  123. package/dist/services/createOfcoopDomainAuditCompositionProviders.js +0 -117
  124. package/dist/services/createOfcoopReportCompositionProviders.js +0 -30
  125. package/dist/services/errors.js +0 -23
  126. package/dist/services/impl/DbAdapterMemberNumberPolicyService.js +0 -37
  127. package/dist/services/impl/DbAdapterMemberService.js +0 -142
  128. package/dist/services/impl/DbAdapterSavingComplianceSnapshotService.js +0 -74
  129. package/dist/services/impl/DbAdapterSavingLedgerService.js +0 -115
  130. package/dist/services/impl/DbAdapterSavingPolicyService.js +0 -139
  131. package/dist/services/impl/DbAdapterShuConfigService.js +0 -62
  132. package/dist/services/impl/DbAdapterShuService.js +0 -376
  133. package/dist/services/impl/runtimeSupport.js +0 -29
@@ -0,0 +1,43 @@
1
+ import type { ScopeRef, ResponseEnvelope } from 'ofcore';
2
+ export type DependentRelationship = 'spouse' | 'child' | 'parent' | 'sibling' | 'other';
3
+ export interface MemberDependentContract extends ScopeRef {
4
+ id: string;
5
+ memberId: string;
6
+ fullName: string;
7
+ relationship: DependentRelationship;
8
+ birthDate?: string | null;
9
+ idNumber?: string | null;
10
+ isInsuranceBeneficiary: boolean;
11
+ notes?: string | null;
12
+ version: number;
13
+ lastModified: string;
14
+ deleted: boolean;
15
+ }
16
+ export interface AddMemberDependentInput extends ScopeRef {
17
+ memberId: string;
18
+ fullName: string;
19
+ relationship: DependentRelationship;
20
+ birthDate?: string | null;
21
+ idNumber?: string | null;
22
+ isInsuranceBeneficiary?: boolean;
23
+ notes?: string | null;
24
+ }
25
+ export interface UpdateMemberDependentInput {
26
+ fullName?: string;
27
+ relationship?: DependentRelationship;
28
+ birthDate?: string | null;
29
+ idNumber?: string | null;
30
+ isInsuranceBeneficiary?: boolean;
31
+ notes?: string | null;
32
+ }
33
+ export interface MemberDependentQueryOptions extends Partial<ScopeRef> {
34
+ includeDeleted?: boolean;
35
+ relationship?: DependentRelationship;
36
+ }
37
+ export interface MemberDependentServiceContract {
38
+ addDependent(input: AddMemberDependentInput): Promise<ResponseEnvelope<MemberDependentContract>>;
39
+ updateDependent(dependentId: string, input: UpdateMemberDependentInput): Promise<ResponseEnvelope<MemberDependentContract>>;
40
+ removeDependent(dependentId: string): Promise<ResponseEnvelope<MemberDependentContract>>;
41
+ listDependentsByMember(memberId: string, options?: MemberDependentQueryOptions): Promise<ResponseEnvelope<MemberDependentContract[]>>;
42
+ getDependentById(dependentId: string): Promise<ResponseEnvelope<MemberDependentContract | null>>;
43
+ }
@@ -1,9 +1,8 @@
1
+ import type { ScopeRef, ResponseEnvelope } from 'ofcore';
1
2
  export type CounterResetPolicy = 'never' | 'yearly';
2
- export interface MemberNumberPolicyContract {
3
+ export interface MemberNumberPolicyContract extends ScopeRef {
3
4
  id: string;
4
5
  koperasiId: string;
5
- branchId?: string | null;
6
- tenantId?: string | null;
7
6
  prefix?: string | null;
8
7
  includeYear: boolean;
9
8
  includeMonth: boolean;
@@ -18,15 +17,11 @@ export interface MemberNumberPolicyContract {
18
17
  lastModified: string;
19
18
  deleted: boolean;
20
19
  }
21
- export interface MemberNumberPolicyScope {
20
+ export interface MemberNumberPolicyScope extends ScopeRef {
22
21
  koperasiId: string;
23
- tenantId: string;
24
- branchId?: string | null;
25
22
  }
26
- export interface UpsertMemberNumberPolicyInput {
23
+ export interface UpsertMemberNumberPolicyInput extends ScopeRef {
27
24
  koperasiId: string;
28
- tenantId: string;
29
- branchId?: string | null;
30
25
  prefix?: string | null;
31
26
  includeYear: boolean;
32
27
  includeMonth: boolean;
@@ -39,6 +34,6 @@ export interface UpsertMemberNumberPolicyInput {
39
34
  approvalRef?: string | null;
40
35
  }
41
36
  export interface MemberNumberPolicyServiceContract {
42
- getActiveMemberNumberPolicy(scope: MemberNumberPolicyScope): Promise<MemberNumberPolicyContract | null>;
43
- upsertMemberNumberPolicy(input: UpsertMemberNumberPolicyInput): Promise<MemberNumberPolicyContract>;
37
+ getActiveMemberNumberPolicy(scope: MemberNumberPolicyScope): Promise<ResponseEnvelope<MemberNumberPolicyContract | null>>;
38
+ upsertMemberNumberPolicy(input: UpsertMemberNumberPolicyInput): Promise<ResponseEnvelope<MemberNumberPolicyContract>>;
44
39
  }
@@ -0,0 +1,28 @@
1
+ import type { ScopeRef, ResponseEnvelope } from 'ofcore';
2
+ import type { RiskRegisterCategory } from './RiskRegisterContract.js';
3
+ import type { WhistleReportChannel } from './WhistleReportContract.js';
4
+ export type RiskSlaPolicyMap = Record<RiskRegisterCategory, number>;
5
+ export type WhistleSlaPolicyMap = Record<WhistleReportChannel, number>;
6
+ export interface OversightPolicyContract extends ScopeRef {
7
+ id: string;
8
+ effectiveDate: string;
9
+ riskSlaHoursByCategory: RiskSlaPolicyMap;
10
+ whistleSlaHoursByChannel: WhistleSlaPolicyMap;
11
+ escalationMaxLevel: number;
12
+ version: number;
13
+ lastModified: string;
14
+ deleted: boolean;
15
+ }
16
+ export interface OversightPolicyScope extends ScopeRef {
17
+ }
18
+ export interface UpsertOversightPolicyInput extends ScopeRef {
19
+ effectiveDate: string;
20
+ riskSlaHoursByCategory: RiskSlaPolicyMap;
21
+ whistleSlaHoursByChannel: WhistleSlaPolicyMap;
22
+ escalationMaxLevel: number;
23
+ }
24
+ export interface OversightPolicyServiceContract {
25
+ getActiveOversightPolicy(scope: OversightPolicyScope): Promise<ResponseEnvelope<OversightPolicyContract | null>>;
26
+ upsertOversightPolicy(input: UpsertOversightPolicyInput): Promise<ResponseEnvelope<OversightPolicyContract>>;
27
+ listOversightPolicies(scope: OversightPolicyScope): Promise<ResponseEnvelope<OversightPolicyContract[]>>;
28
+ }
@@ -0,0 +1,93 @@
1
+ import type { ScopeRef, ResponseEnvelope } from 'ofcore';
2
+ export type RiskRegisterCategory = 'operational' | 'credit' | 'compliance' | 'liquidity' | 'governance' | 'other';
3
+ export type RiskRegisterStatus = 'open' | 'mitigating' | 'accepted' | 'closed';
4
+ export type RiskMitigationApprovalStatus = 'not_required' | 'pending' | 'approved' | 'rejected';
5
+ export interface RiskRegisterContract extends ScopeRef {
6
+ id: string;
7
+ title: string;
8
+ description?: string | null;
9
+ category: RiskRegisterCategory;
10
+ likelihood: number;
11
+ impact: number;
12
+ riskScore: number;
13
+ status: RiskRegisterStatus;
14
+ ownerMemberId?: string | null;
15
+ mitigationPlan?: string | null;
16
+ slaDueAt?: string | null;
17
+ escalationLevel: number;
18
+ escalatedAt?: string | null;
19
+ escalationReason?: string | null;
20
+ mitigationApprovalStatus?: RiskMitigationApprovalStatus;
21
+ mitigationSubmittedAt?: string | null;
22
+ mitigationReviewedAt?: string | null;
23
+ mitigationReviewerMemberId?: string | null;
24
+ mitigationReviewNote?: string | null;
25
+ nextReviewDate?: string | null;
26
+ lastReviewedAt?: string | null;
27
+ notes?: string | null;
28
+ version: number;
29
+ lastModified: string;
30
+ deleted: boolean;
31
+ }
32
+ export interface CreateRiskRegisterInput extends ScopeRef {
33
+ title: string;
34
+ description?: string | null;
35
+ category: RiskRegisterCategory;
36
+ likelihood: number;
37
+ impact: number;
38
+ ownerMemberId?: string | null;
39
+ mitigationPlan?: string | null;
40
+ slaDueAt?: string | null;
41
+ nextReviewDate?: string | null;
42
+ notes?: string | null;
43
+ }
44
+ export interface UpdateRiskRegisterInput {
45
+ title?: string;
46
+ description?: string | null;
47
+ category?: RiskRegisterCategory;
48
+ likelihood?: number;
49
+ impact?: number;
50
+ ownerMemberId?: string | null;
51
+ mitigationPlan?: string | null;
52
+ slaDueAt?: string | null;
53
+ nextReviewDate?: string | null;
54
+ notes?: string | null;
55
+ }
56
+ export interface UpdateRiskRegisterStatusInput {
57
+ status: RiskRegisterStatus;
58
+ notes?: string | null;
59
+ }
60
+ export interface RecordRiskRegisterReviewInput {
61
+ reviewedAt: string;
62
+ notes?: string | null;
63
+ }
64
+ export interface EscalateRiskRegisterInput {
65
+ reason: string;
66
+ escalatedAt?: string;
67
+ }
68
+ export interface SubmitRiskMitigationApprovalInput {
69
+ submittedAt?: string;
70
+ note?: string | null;
71
+ }
72
+ export interface ReviewRiskMitigationApprovalInput {
73
+ decision: 'approved' | 'rejected';
74
+ reviewerMemberId: string;
75
+ reviewedAt?: string;
76
+ note?: string | null;
77
+ }
78
+ export interface RiskRegisterQueryOptions extends Partial<ScopeRef> {
79
+ includeDeleted?: boolean;
80
+ status?: RiskRegisterStatus;
81
+ category?: RiskRegisterCategory;
82
+ }
83
+ export interface RiskRegisterServiceContract {
84
+ createRiskItem(input: CreateRiskRegisterInput): Promise<ResponseEnvelope<RiskRegisterContract>>;
85
+ updateRiskItem(riskId: string, input: UpdateRiskRegisterInput): Promise<ResponseEnvelope<RiskRegisterContract>>;
86
+ updateRiskItemStatus(riskId: string, input: UpdateRiskRegisterStatusInput): Promise<ResponseEnvelope<RiskRegisterContract>>;
87
+ recordRiskItemReview(riskId: string, input: RecordRiskRegisterReviewInput): Promise<ResponseEnvelope<RiskRegisterContract>>;
88
+ escalateRiskItem(riskId: string, input: EscalateRiskRegisterInput): Promise<ResponseEnvelope<RiskRegisterContract>>;
89
+ submitRiskMitigationApproval(riskId: string, input?: SubmitRiskMitigationApprovalInput): Promise<ResponseEnvelope<RiskRegisterContract>>;
90
+ reviewRiskMitigationApproval(riskId: string, input: ReviewRiskMitigationApprovalInput): Promise<ResponseEnvelope<RiskRegisterContract>>;
91
+ getRiskItemById(riskId: string): Promise<ResponseEnvelope<RiskRegisterContract | null>>;
92
+ listRiskItems(options?: RiskRegisterQueryOptions): Promise<ResponseEnvelope<RiskRegisterContract[]>>;
93
+ }
@@ -1,10 +1,9 @@
1
+ import type { ScopeRef, ResponseEnvelope } from 'ofcore';
1
2
  export type SavingComplianceStatus = 'compliant' | 'underpaid' | 'no-policy';
2
- export interface SavingComplianceSnapshotContract {
3
+ export interface SavingComplianceSnapshotContract extends ScopeRef {
3
4
  id: string;
4
5
  memberId: string;
5
6
  koperasiId: string;
6
- tenantId?: string | null;
7
- branchId?: string | null;
8
7
  referenceDate: string;
9
8
  monthlyWajibNominalIdr: number;
10
9
  wajibCreditTotalIdr: number;
@@ -18,10 +17,8 @@ export interface SavingComplianceSnapshotContract {
18
17
  lastModified: string;
19
18
  deleted: boolean;
20
19
  }
21
- export interface SavingComplianceSnapshotScope {
20
+ export interface SavingComplianceSnapshotScope extends ScopeRef {
22
21
  koperasiId: string;
23
- tenantId: string;
24
- branchId?: string | null;
25
22
  }
26
23
  export interface SavingComplianceSnapshotQueryOptions {
27
24
  memberId?: string;
@@ -29,6 +26,6 @@ export interface SavingComplianceSnapshotQueryOptions {
29
26
  includeDeleted?: boolean;
30
27
  }
31
28
  export interface SavingComplianceSnapshotServiceContract {
32
- listComplianceSnapshots(scope: SavingComplianceSnapshotScope, options?: SavingComplianceSnapshotQueryOptions): Promise<SavingComplianceSnapshotContract[]>;
33
- getComplianceSnapshotByMember(memberId: string, scope: SavingComplianceSnapshotScope): Promise<SavingComplianceSnapshotContract | null>;
29
+ listComplianceSnapshots(scope: SavingComplianceSnapshotScope, options?: SavingComplianceSnapshotQueryOptions): Promise<ResponseEnvelope<SavingComplianceSnapshotContract[]>>;
30
+ getComplianceSnapshotByMember(memberId: string, scope: SavingComplianceSnapshotScope): Promise<ResponseEnvelope<SavingComplianceSnapshotContract | null>>;
34
31
  }
@@ -1,6 +1,7 @@
1
+ import type { ScopeRef, ResponseEnvelope } from 'ofcore';
1
2
  export type SavingType = 'pokok' | 'wajib' | 'sukarela';
2
3
  export type SavingEntryType = 'credit' | 'debit';
3
- export interface SavingLedgerContract {
4
+ export interface SavingLedgerContract extends ScopeRef {
4
5
  id: string;
5
6
  memberId: string;
6
7
  savingType: SavingType;
@@ -10,13 +11,11 @@ export interface SavingLedgerContract {
10
11
  referenceType?: string | null;
11
12
  referenceId?: string | null;
12
13
  notes?: string | null;
13
- branchId?: string | null;
14
- tenantId?: string | null;
15
14
  version: number;
16
15
  lastModified: string;
17
16
  deleted: boolean;
18
17
  }
19
- export interface SavingEntryInput {
18
+ export interface SavingEntryInput extends ScopeRef {
20
19
  memberId: string;
21
20
  savingType: SavingType;
22
21
  amount: number;
@@ -24,8 +23,6 @@ export interface SavingEntryInput {
24
23
  referenceType?: string | null;
25
24
  referenceId?: string | null;
26
25
  notes?: string | null;
27
- branchId?: string | null;
28
- tenantId?: string | null;
29
26
  }
30
27
  export interface SavingBalance {
31
28
  pokok: number;
@@ -33,17 +30,15 @@ export interface SavingBalance {
33
30
  sukarela: number;
34
31
  total: number;
35
32
  }
36
- export interface SavingLedgerQueryOptions {
33
+ export interface SavingLedgerQueryOptions extends Partial<ScopeRef> {
37
34
  includeDeleted?: boolean;
38
35
  dateFrom?: string;
39
36
  dateTo?: string;
40
- tenantId?: string | null;
41
- branchId?: string | null;
42
37
  }
43
38
  export interface SavingLedgerServiceContract {
44
- recordSavingCredit(input: SavingEntryInput): Promise<SavingLedgerContract>;
45
- recordSavingDebit(input: SavingEntryInput): Promise<SavingLedgerContract>;
46
- recordSavingWithdrawal(input: SavingEntryInput): Promise<SavingLedgerContract>;
47
- listSavingEntriesByMember(memberId: string, options?: SavingLedgerQueryOptions): Promise<SavingLedgerContract[]>;
48
- getSavingBalanceByMember(memberId: string): Promise<SavingBalance>;
39
+ recordSavingCredit(input: SavingEntryInput): Promise<ResponseEnvelope<SavingLedgerContract>>;
40
+ recordSavingDebit(input: SavingEntryInput): Promise<ResponseEnvelope<SavingLedgerContract>>;
41
+ recordSavingWithdrawal(input: SavingEntryInput): Promise<ResponseEnvelope<SavingLedgerContract>>;
42
+ listSavingEntriesByMember(memberId: string, options?: SavingLedgerQueryOptions): Promise<ResponseEnvelope<SavingLedgerContract[]>>;
43
+ getSavingBalanceByMember(memberId: string): Promise<ResponseEnvelope<SavingBalance>>;
49
44
  }
@@ -1,9 +1,8 @@
1
+ import type { ScopeRef, ResponseEnvelope, WorklistItem } from 'ofcore';
1
2
  export type FineType = 'fixed' | 'percentage';
2
- export interface SavingPolicyContract {
3
+ export interface SavingPolicyContract extends ScopeRef {
3
4
  id: string;
4
5
  koperasiId: string;
5
- branchId?: string | null;
6
- tenantId?: string | null;
7
6
  simpananPokokNominalIdr: number;
8
7
  monthlyWajibNominalIdr: number;
9
8
  gracePeriodMonth: number;
@@ -16,19 +15,17 @@ export interface SavingPolicyContract {
16
15
  effectiveDate: string;
17
16
  changeReason?: string | null;
18
17
  approvalRef?: string | null;
18
+ /** Ditandai true jika policy ini sudah digantikan versi yang lebih baru. */
19
+ isSuperseded?: boolean | null;
19
20
  version: number;
20
21
  lastModified: string;
21
22
  deleted: boolean;
22
23
  }
23
- export interface SavingPolicyScope {
24
+ export interface SavingPolicyScope extends ScopeRef {
24
25
  koperasiId: string;
25
- tenantId: string;
26
- branchId?: string | null;
27
26
  }
28
- export interface UpsertSavingPolicyInput {
27
+ export interface UpsertSavingPolicyInput extends ScopeRef {
29
28
  koperasiId: string;
30
- tenantId: string;
31
- branchId?: string | null;
32
29
  simpananPokokNominalIdr: number;
33
30
  monthlyWajibNominalIdr: number;
34
31
  gracePeriodMonth: number;
@@ -46,18 +43,17 @@ export interface SavingComplianceEvaluation {
46
43
  summary: Record<string, number>;
47
44
  referenceDate: string;
48
45
  }
49
- export interface SavingComplianceWorklistItem {
50
- id: string;
46
+ /** Worklist item kepatuhan simpanan — extends WorklistItem dari ofcore. */
47
+ export interface SavingComplianceWorklistItem extends WorklistItem {
48
+ /** ID anggota yang bersangkutan. */
51
49
  memberId: string;
52
- priority: 'low' | 'medium' | 'high' | 'critical';
53
- reasonCode: string;
54
- reasonText: string;
55
- recommendedAction: string;
56
- metadata?: Record<string, unknown>;
57
50
  }
58
51
  export interface SavingPolicyServiceContract {
59
- getActiveSavingPolicy(scope: SavingPolicyScope): Promise<SavingPolicyContract | null>;
60
- upsertSavingPolicy(input: UpsertSavingPolicyInput): Promise<SavingPolicyContract>;
61
- evaluateWajibCompliance(scope: SavingPolicyScope): Promise<SavingComplianceEvaluation>;
62
- getComplianceWorklist(scope: SavingPolicyScope): Promise<SavingComplianceWorklistItem[]>;
52
+ getActiveSavingPolicy(scope: SavingPolicyScope): Promise<ResponseEnvelope<SavingPolicyContract | null>>;
53
+ /** Buat policy baru; tolak jika effectiveDate sama atau lebih awal dari policy aktif terbaru. */
54
+ upsertSavingPolicy(input: UpsertSavingPolicyInput): Promise<ResponseEnvelope<SavingPolicyContract>>;
55
+ /** Kembalikan seluruh riwayat policy (termasuk yang sudah superseded), urut terbaru dulu. */
56
+ getPolicyHistory(scope: SavingPolicyScope): Promise<ResponseEnvelope<SavingPolicyContract[]>>;
57
+ evaluateWajibCompliance(scope: SavingPolicyScope): Promise<ResponseEnvelope<SavingComplianceEvaluation>>;
58
+ getComplianceWorklist(scope: SavingPolicyScope): Promise<ResponseEnvelope<SavingComplianceWorklistItem[]>>;
63
59
  }
@@ -1,39 +1,53 @@
1
- export interface ShuConfigContract {
1
+ import type { ScopeRef, ResponseEnvelope } from 'ofcore';
2
+ export type ShuFormulaModel = 'ksp' | 'konsumen' | 'produsen' | 'pemasaran' | 'serba_usaha' | 'custom';
3
+ /** Bobot distribusi SHU per komponen partisipasi (harus total = 100) */
4
+ export interface ShuParticipationWeights {
5
+ /** Bobot dari kontribusi simpanan/modal anggota */
6
+ simpananWeight: number;
7
+ /** Bobot dari jasa usaha (pinjaman utk KSP; belanja utk konsumen; produksi utk produsen) */
8
+ jasaUsahaWeight: number;
9
+ /** Bobot dari transaksi pemasaran (untuk koperasi pemasaran/serba usaha) */
10
+ pemasaranWeight?: number;
11
+ /** Bobot dari kontribusi lain (khusus model custom) */
12
+ otherWeight?: number;
13
+ }
14
+ export interface ShuConfigContract extends ScopeRef {
2
15
  id: string;
3
16
  koperasiId: string;
4
- tenantId?: string | null;
5
- branchId?: string | null;
6
17
  effectiveDate: string;
7
18
  cadanganPercent: number;
8
19
  jasaUsahaPercent: number;
9
20
  jasaModalPercent: number;
10
21
  notes?: string | null;
11
22
  approvalRef?: string | null;
23
+ /** Model formula SHU; default 'ksp' jika tidak diisi */
24
+ formulaModel?: ShuFormulaModel | null;
25
+ /** Bobot distribusi komponen partisipasi anggota */
26
+ participationWeights?: ShuParticipationWeights | null;
12
27
  version: number;
13
28
  lastModified: string;
14
29
  deleted: boolean;
15
30
  }
16
- export interface ShuConfigScope {
31
+ export interface ShuConfigScope extends ScopeRef {
17
32
  koperasiId: string;
18
- tenantId: string;
19
- branchId?: string | null;
20
33
  }
21
- export interface UpsertShuConfigInput {
34
+ export interface UpsertShuConfigInput extends ScopeRef {
22
35
  koperasiId: string;
23
- tenantId: string;
24
- branchId?: string | null;
25
36
  effectiveDate: string;
26
37
  cadanganPercent: number;
27
38
  jasaUsahaPercent: number;
28
39
  jasaModalPercent: number;
29
40
  notes?: string | null;
30
41
  approvalRef?: string | null;
42
+ formulaModel?: ShuFormulaModel | null;
43
+ participationWeights?: ShuParticipationWeights | null;
31
44
  }
32
45
  export interface ShuConfigQueryOptions {
33
46
  includeDeleted?: boolean;
34
47
  }
35
48
  export interface ShuConfigServiceContract {
36
- getActiveShuConfig(scope: ShuConfigScope): Promise<ShuConfigContract | null>;
37
- upsertShuConfig(input: UpsertShuConfigInput): Promise<ShuConfigContract>;
38
- listShuConfigs(scope: ShuConfigScope, options?: ShuConfigQueryOptions): Promise<ShuConfigContract[]>;
49
+ getActiveShuConfig(scope: ShuConfigScope): Promise<ResponseEnvelope<ShuConfigContract | null>>;
50
+ upsertShuConfig(input: UpsertShuConfigInput): Promise<ResponseEnvelope<ShuConfigContract>>;
51
+ listShuConfigs(scope: ShuConfigScope, options?: ShuConfigQueryOptions): Promise<ResponseEnvelope<ShuConfigContract[]>>;
52
+ getDefaultParticipationWeights(model: ShuFormulaModel): Promise<ResponseEnvelope<ShuParticipationWeights>>;
39
53
  }
@@ -1,45 +1,38 @@
1
+ import type { ScopeRef, ResponseEnvelope } from 'ofcore';
1
2
  export type ShuPeriodStatus = 'draft' | 'finalized';
2
- export interface ShuPeriodContract {
3
+ export interface ShuPeriodContract extends ScopeRef {
3
4
  id: string;
4
5
  periodCode: string;
5
6
  startDate: string;
6
7
  endDate: string;
7
8
  status: ShuPeriodStatus;
8
9
  formulaSnapshot: Record<string, unknown>;
9
- branchId?: string | null;
10
- tenantId?: string | null;
11
10
  version: number;
12
11
  lastModified: string;
13
12
  deleted: boolean;
14
13
  }
15
- export interface ShuAllocationContract {
14
+ export interface ShuAllocationContract extends ScopeRef {
16
15
  id: string;
17
16
  shuPeriodId: string;
18
17
  memberId: string;
19
18
  allocationAmount: number;
20
19
  calculationBasis: Record<string, unknown>;
21
- branchId?: string | null;
22
- tenantId?: string | null;
23
20
  version: number;
24
21
  lastModified: string;
25
22
  deleted: boolean;
26
23
  }
27
- export interface CreateShuPeriodInput {
24
+ export interface CreateShuPeriodInput extends ScopeRef {
28
25
  periodCode: string;
29
26
  startDate: string;
30
27
  endDate: string;
31
28
  formulaSnapshot: Record<string, unknown>;
32
- branchId?: string | null;
33
- tenantId?: string | null;
34
29
  }
35
30
  export interface ShuAllocationQueryOptions {
36
31
  includeDeleted?: boolean;
37
32
  memberId?: string;
38
33
  }
39
- export interface ShuPeriodQueryOptions {
34
+ export interface ShuPeriodQueryOptions extends Partial<ScopeRef> {
40
35
  includeDeleted?: boolean;
41
- tenantId?: string | null;
42
- branchId?: string | null;
43
36
  status?: ShuPeriodStatus;
44
37
  dateContains?: string;
45
38
  }
@@ -49,10 +42,10 @@ export interface CsvExportPayload {
49
42
  body: string;
50
43
  }
51
44
  export interface ShuServiceContract {
52
- createShuPeriod(input: CreateShuPeriodInput): Promise<ShuPeriodContract>;
53
- finalizeShuPeriod(periodId: string): Promise<ShuPeriodContract>;
54
- listShuPeriods(options?: ShuPeriodQueryOptions): Promise<ShuPeriodContract[]>;
55
- generateShuAllocations(periodId: string): Promise<ShuAllocationContract[]>;
56
- listShuAllocations(periodId: string, options?: ShuAllocationQueryOptions): Promise<ShuAllocationContract[]>;
57
- exportShuAllocationsCsv(periodId: string): Promise<CsvExportPayload>;
45
+ createShuPeriod(input: CreateShuPeriodInput): Promise<ResponseEnvelope<ShuPeriodContract>>;
46
+ finalizeShuPeriod(periodId: string): Promise<ResponseEnvelope<ShuPeriodContract>>;
47
+ listShuPeriods(options?: ShuPeriodQueryOptions): Promise<ResponseEnvelope<ShuPeriodContract[]>>;
48
+ generateShuAllocations(periodId: string): Promise<ResponseEnvelope<ShuAllocationContract[]>>;
49
+ listShuAllocations(periodId: string, options?: ShuAllocationQueryOptions): Promise<ResponseEnvelope<ShuAllocationContract[]>>;
50
+ exportShuAllocationsCsv(periodId: string): Promise<ResponseEnvelope<CsvExportPayload>>;
58
51
  }
@@ -0,0 +1,54 @@
1
+ import type { ScopeRef, ResponseEnvelope } from 'ofcore';
2
+ /**
3
+ * Jenis partisipasi anggota untuk perhitungan JUA.
4
+ * - 'pinjaman' : volume pinjaman aktif (KSP — proporsi bunga/pokok)
5
+ * - 'simpanan_aktif': saldo simpanan aktif (KSP — bagian modal aktif)
6
+ * - 'pembelian' : nilai pembelian barang/jasa (konsumen)
7
+ * - 'production' : nilai produksi/penyerahan hasil (produsen)
8
+ * - 'pemasaran' : nilai pemasaran/penjualan kolektif (pemasaran)
9
+ * - 'jasa' : nilai jasa yang digunakan/diberikan (jasa)
10
+ */
11
+ export type ShuParticipationType = 'pinjaman' | 'simpanan_aktif' | 'pembelian' | 'produksi' | 'pemasaran' | 'jasa';
12
+ export interface ShuParticipationEntryContract extends ScopeRef {
13
+ id: string;
14
+ shuPeriodId: string;
15
+ memberId: string;
16
+ participationType: ShuParticipationType;
17
+ /** Nilai/volume dalam satuan IDR atau unit usaha yang disepakati */
18
+ amount: number;
19
+ /** Keterangan tambahan (referensi transaksi, dll.) */
20
+ notes?: string | null;
21
+ version: number;
22
+ lastModified: string;
23
+ deleted: boolean;
24
+ }
25
+ export interface RecordShuParticipationInput extends ScopeRef {
26
+ shuPeriodId: string;
27
+ memberId: string;
28
+ participationType: ShuParticipationType;
29
+ amount: number;
30
+ notes?: string | null;
31
+ }
32
+ export interface BulkRecordShuParticipationInput {
33
+ entries: RecordShuParticipationInput[];
34
+ }
35
+ export interface ShuParticipationQueryOptions extends Partial<ScopeRef> {
36
+ includeDeleted?: boolean;
37
+ memberId?: string;
38
+ participationType?: ShuParticipationType;
39
+ }
40
+ export interface MemberParticipationSummary {
41
+ memberId: string;
42
+ totalByType: Partial<Record<ShuParticipationType, number>>;
43
+ grandTotal: number;
44
+ }
45
+ export interface ShuParticipationServiceContract {
46
+ /** Catat satu entri partisipasi anggota untuk periode SHU tertentu */
47
+ recordParticipation(input: RecordShuParticipationInput): Promise<ResponseEnvelope<ShuParticipationEntryContract>>;
48
+ /** Bulk record untuk efisiensi saat import dari sistem lain */
49
+ bulkRecordParticipation(input: BulkRecordShuParticipationInput): Promise<ResponseEnvelope<ShuParticipationEntryContract[]>>;
50
+ /** List semua entri partisipasi untuk sebuah periode */
51
+ listParticipationByPeriod(shuPeriodId: string, options?: ShuParticipationQueryOptions): Promise<ResponseEnvelope<ShuParticipationEntryContract[]>>;
52
+ /** Ringkasan total partisipasi per anggota untuk sebuah periode */
53
+ summarizeParticipationByPeriod(shuPeriodId: string, options?: ShuParticipationQueryOptions): Promise<ResponseEnvelope<MemberParticipationSummary[]>>;
54
+ }
@@ -0,0 +1,72 @@
1
+ import type { ScopeRef, ResponseEnvelope } from 'ofcore';
2
+ export type WhistleReportChannel = 'web' | 'email' | 'hotline' | 'other';
3
+ export type WhistleReportStatus = 'submitted' | 'in_review' | 'resolved' | 'dismissed';
4
+ export type WhistleInvestigationStage = 'intake' | 'preliminary' | 'formal' | 'recommendation';
5
+ export interface WhistleReportContract extends ScopeRef {
6
+ id: string;
7
+ incidentDate?: string | null;
8
+ subject: string;
9
+ description: string;
10
+ channel: WhistleReportChannel;
11
+ isAnonymous: boolean;
12
+ reporterMemberId?: string | null;
13
+ evidenceRefs?: string[] | null;
14
+ slaDueAt?: string | null;
15
+ escalationLevel: number;
16
+ escalatedAt?: string | null;
17
+ escalationReason?: string | null;
18
+ investigationStage?: WhistleInvestigationStage;
19
+ investigationUpdatedAt?: string | null;
20
+ investigationNote?: string | null;
21
+ status: WhistleReportStatus;
22
+ assignedToMemberId?: string | null;
23
+ handledByMemberId?: string | null;
24
+ resolutionSummary?: string | null;
25
+ resolvedAt?: string | null;
26
+ version: number;
27
+ lastModified: string;
28
+ deleted: boolean;
29
+ }
30
+ export interface CreateWhistleReportInput extends ScopeRef {
31
+ incidentDate?: string | null;
32
+ subject: string;
33
+ description: string;
34
+ channel: WhistleReportChannel;
35
+ isAnonymous?: boolean;
36
+ reporterMemberId?: string | null;
37
+ evidenceRefs?: string[] | null;
38
+ slaDueAt?: string | null;
39
+ }
40
+ export interface UpdateWhistleReportStatusInput {
41
+ status: WhistleReportStatus;
42
+ assignedToMemberId?: string | null;
43
+ handledByMemberId?: string | null;
44
+ resolutionSummary?: string | null;
45
+ resolvedAt?: string | null;
46
+ }
47
+ export interface EscalateWhistleReportInput {
48
+ reason: string;
49
+ escalatedAt?: string;
50
+ }
51
+ export interface AddWhistleEvidenceInput {
52
+ evidenceRef: string;
53
+ }
54
+ export interface AdvanceWhistleInvestigationStageInput {
55
+ stage: WhistleInvestigationStage;
56
+ updatedAt?: string;
57
+ note?: string | null;
58
+ }
59
+ export interface WhistleReportQueryOptions extends Partial<ScopeRef> {
60
+ includeDeleted?: boolean;
61
+ status?: WhistleReportStatus;
62
+ channel?: WhistleReportChannel;
63
+ }
64
+ export interface WhistleReportServiceContract {
65
+ createWhistleReport(input: CreateWhistleReportInput): Promise<ResponseEnvelope<WhistleReportContract>>;
66
+ updateWhistleReportStatus(reportId: string, input: UpdateWhistleReportStatusInput): Promise<ResponseEnvelope<WhistleReportContract>>;
67
+ escalateWhistleReport(reportId: string, input: EscalateWhistleReportInput): Promise<ResponseEnvelope<WhistleReportContract>>;
68
+ addWhistleEvidence(reportId: string, input: AddWhistleEvidenceInput): Promise<ResponseEnvelope<WhistleReportContract>>;
69
+ advanceWhistleInvestigationStage(reportId: string, input: AdvanceWhistleInvestigationStageInput): Promise<ResponseEnvelope<WhistleReportContract>>;
70
+ getWhistleReportById(reportId: string): Promise<ResponseEnvelope<WhistleReportContract | null>>;
71
+ listWhistleReports(options?: WhistleReportQueryOptions): Promise<ResponseEnvelope<WhistleReportContract[]>>;
72
+ }