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.
- package/dist/OfcoopCore.d.ts +10 -3
- package/dist/contracts/ComplianceReadinessContract.d.ts +31 -0
- package/dist/contracts/CoopCommunityProfileContract.d.ts +87 -0
- package/dist/contracts/GovernanceContract.d.ts +157 -0
- package/dist/contracts/LeadershipAppointmentContract.d.ts +91 -0
- package/dist/contracts/LeadershipTermContract.d.ts +53 -0
- package/dist/contracts/ManagementReportContract.d.ts +99 -0
- package/dist/contracts/MemberContract.d.ts +61 -18
- package/dist/contracts/MemberDependentContract.d.ts +43 -0
- package/dist/contracts/MemberNumberPolicyContract.d.ts +6 -11
- package/dist/contracts/OversightPolicyContract.d.ts +28 -0
- package/dist/contracts/RiskRegisterContract.d.ts +93 -0
- package/dist/contracts/SavingComplianceSnapshotContract.d.ts +5 -8
- package/dist/contracts/SavingLedgerContract.d.ts +9 -14
- package/dist/contracts/SavingPolicyContract.d.ts +16 -20
- package/dist/contracts/ShuConfigContract.d.ts +26 -12
- package/dist/contracts/ShuContract.d.ts +11 -18
- package/dist/contracts/ShuParticipationEntryContract.d.ts +54 -0
- package/dist/contracts/WhistleReportContract.d.ts +72 -0
- package/dist/data/repositories.d.ts +154 -9
- package/dist/data/schemas.d.ts +16 -0
- package/dist/finance/offinanceProjection.d.ts +33 -0
- package/dist/index.d.ts +67 -38
- package/dist/index.esm.js +7 -0
- package/dist/index.js +7 -54
- package/dist/services/ComplianceReadinessService.d.ts +4 -0
- package/dist/services/CoopCommunityProfileService.d.ts +5 -0
- package/dist/services/CoopOrchestrationService.d.ts +4 -4
- package/dist/services/DashboardSummaryService.d.ts +38 -2
- package/dist/services/DashboardViewModelService.d.ts +1 -1
- package/dist/services/GovernanceMeetingService.d.ts +9 -0
- package/dist/services/HasilUsahaPeriodService.d.ts +35 -0
- package/dist/services/LeadershipAppointmentService.d.ts +7 -0
- package/dist/services/LeadershipTermService.d.ts +6 -0
- package/dist/services/ManagementReportFinancialTemplateEvaluatorService.d.ts +12 -0
- package/dist/services/ManagementReportFinancialTemplateService.d.ts +25 -0
- package/dist/services/ManagementReportService.d.ts +8 -0
- package/dist/services/Member360Service.d.ts +2 -2
- package/dist/services/Member360ViewModelService.d.ts +1 -1
- package/dist/services/MemberDependentService.d.ts +5 -0
- package/dist/services/MemberNumberPolicyService.d.ts +1 -1
- package/dist/services/MemberService.d.ts +2 -1
- package/dist/services/OversightPolicyService.d.ts +4 -0
- package/dist/services/ReportSummaryService.d.ts +26 -2
- package/dist/services/ReportViewModelService.d.ts +1 -1
- package/dist/services/RiskRegisterService.d.ts +10 -0
- package/dist/services/SavingComplianceSnapshotService.d.ts +1 -1
- package/dist/services/SavingLedgerService.d.ts +1 -1
- package/dist/services/SavingPolicyService.d.ts +1 -1
- package/dist/services/ShuConfigService.d.ts +2 -1
- package/dist/services/ShuParticipationEntryService.d.ts +5 -0
- package/dist/services/ShuService.d.ts +1 -1
- package/dist/services/WhistleReportService.d.ts +8 -0
- package/dist/services/createActivityAuditTrailProvider.d.ts +1 -1
- package/dist/services/createDbAdapterOfcoopServices.d.ts +31 -9
- package/dist/services/createMember360CompositionProviders.d.ts +1 -1
- package/dist/services/createOfauthCompositionProviders.d.ts +2 -2
- package/dist/services/createOfcoopCreditCompositionProviders.d.ts +27 -6
- package/dist/services/createOfcoopDashboardCompositionProviders.d.ts +4 -4
- package/dist/services/createOfcoopDomainAuditCompositionProviders.d.ts +2 -2
- package/dist/services/createOfcoopOffinanceReportCompositionProviders.d.ts +32 -0
- package/dist/services/createOfcoopReportCompositionProviders.d.ts +2 -2
- package/dist/services/createOfcoopStandardReportProviders.d.ts +35 -0
- package/dist/services/impl/DbAdapterComplianceReadinessService.d.ts +18 -0
- package/dist/services/impl/DbAdapterCoopCommunityProfileService.d.ts +15 -0
- package/dist/services/impl/DbAdapterGovernanceMeetingService.d.ts +29 -0
- package/dist/services/impl/DbAdapterLeadershipAppointmentService.d.ts +17 -0
- package/dist/services/impl/DbAdapterLeadershipTermService.d.ts +15 -0
- package/dist/services/impl/DbAdapterManagementReportService.d.ts +24 -0
- package/dist/services/impl/DbAdapterMemberDependentService.d.ts +15 -0
- package/dist/services/impl/DbAdapterMemberNumberPolicyService.d.ts +5 -4
- package/dist/services/impl/DbAdapterMemberService.d.ts +14 -13
- package/dist/services/impl/DbAdapterOversightPolicyService.d.ts +13 -0
- package/dist/services/impl/DbAdapterRiskRegisterService.d.ts +23 -0
- package/dist/services/impl/DbAdapterSavingComplianceSnapshotService.d.ts +5 -4
- package/dist/services/impl/DbAdapterSavingLedgerService.d.ts +9 -9
- package/dist/services/impl/DbAdapterSavingPolicyService.d.ts +9 -7
- package/dist/services/impl/DbAdapterShuConfigService.d.ts +8 -6
- package/dist/services/impl/DbAdapterShuParticipationEntryService.d.ts +14 -0
- package/dist/services/impl/DbAdapterShuService.d.ts +10 -10
- package/dist/services/impl/DbAdapterWhistleReportService.d.ts +21 -0
- package/dist/services/impl/managementReportTemplates.d.ts +7 -0
- package/dist/services/impl/runtimeSupport.d.ts +30 -1
- package/dist/services/userService.d.ts +30 -0
- package/package.json +20 -9
- package/dist/OfcoopCore.js +0 -273
- package/dist/contracts/MemberContract.js +0 -2
- package/dist/contracts/MemberNumberPolicyContract.js +0 -2
- package/dist/contracts/SavingComplianceSnapshotContract.js +0 -2
- package/dist/contracts/SavingLedgerContract.js +0 -2
- package/dist/contracts/SavingPolicyContract.js +0 -2
- package/dist/contracts/ShuConfigContract.js +0 -2
- package/dist/contracts/ShuContract.js +0 -2
- package/dist/contracts/crossDomainPrimitives.d.ts +0 -5
- package/dist/contracts/crossDomainPrimitives.js +0 -2
- package/dist/data/applyPendingMigrations.js +0 -30
- package/dist/data/migrations.js +0 -20
- package/dist/data/repositories.js +0 -324
- package/dist/data/schemas.js +0 -179
- package/dist/services/AuditTrailQueryService.js +0 -62
- package/dist/services/CoopOrchestrationService.js +0 -71
- package/dist/services/DailyOpsService.js +0 -7
- package/dist/services/DashboardSummaryService.js +0 -211
- package/dist/services/DashboardViewModelService.js +0 -193
- package/dist/services/Member360Service.js +0 -79
- package/dist/services/Member360ViewModelService.js +0 -66
- package/dist/services/MemberNumberPolicyService.js +0 -18
- package/dist/services/MemberService.js +0 -18
- package/dist/services/ReportSummaryService.js +0 -160
- package/dist/services/ReportViewModelService.js +0 -90
- package/dist/services/SavingComplianceSnapshotService.js +0 -10
- package/dist/services/SavingLedgerService.js +0 -13
- package/dist/services/SavingPolicyService.js +0 -20
- package/dist/services/ShuConfigService.js +0 -16
- package/dist/services/ShuService.js +0 -14
- package/dist/services/createActivityAuditTrailProvider.js +0 -73
- package/dist/services/createAuditTrailCompositionProvider.js +0 -21
- package/dist/services/createDbAdapterOfcoopServices.js +0 -23
- package/dist/services/createMember360CompositionProviders.js +0 -43
- package/dist/services/createOfauthCompositionProviders.js +0 -80
- package/dist/services/createOfcoopCreditCompositionProviders.js +0 -233
- package/dist/services/createOfcoopDashboardCompositionProviders.js +0 -228
- package/dist/services/createOfcoopDomainAuditCompositionProviders.js +0 -117
- package/dist/services/createOfcoopReportCompositionProviders.js +0 -30
- package/dist/services/errors.js +0 -23
- package/dist/services/impl/DbAdapterMemberNumberPolicyService.js +0 -37
- package/dist/services/impl/DbAdapterMemberService.js +0 -142
- package/dist/services/impl/DbAdapterSavingComplianceSnapshotService.js +0 -74
- package/dist/services/impl/DbAdapterSavingLedgerService.js +0 -115
- package/dist/services/impl/DbAdapterSavingPolicyService.js +0 -139
- package/dist/services/impl/DbAdapterShuConfigService.js +0 -62
- package/dist/services/impl/DbAdapterShuService.js +0 -376
- package/dist/services/impl/runtimeSupport.js +0 -29
package/dist/OfcoopCore.d.ts
CHANGED
|
@@ -7,8 +7,8 @@ import type { PlatformAdapter } from 'ofcore';
|
|
|
7
7
|
import type { SocketAdapter } from 'ofcore';
|
|
8
8
|
import type { ActivitySink } from 'ofcore';
|
|
9
9
|
import type { ReadonlyStore, Store } from 'ofcore';
|
|
10
|
-
import type { OfcoopDomainEvent } from './services/createDbAdapterOfcoopServices';
|
|
11
|
-
import
|
|
10
|
+
import type { OfcoopDomainEvent, OfcoopDomainServices, ServiceRuntimeOptions } from './services/createDbAdapterOfcoopServices.js';
|
|
11
|
+
import { IUserService } from './services/userService.js';
|
|
12
12
|
export type OfcoopDomainServicesOverride = Partial<OfcoopDomainServices>;
|
|
13
13
|
export type OfcoopDomainServicesFactory = () => Promise<OfcoopDomainServices> | OfcoopDomainServices;
|
|
14
14
|
export type OfcoopRuntimeHooks = Pick<CoreRuntimeHooks<OfcoopDomainServices, never>, 'runMigrations' | 'runSeed' | 'onInit' | 'onStop'>;
|
|
@@ -24,6 +24,7 @@ export declare class OfcoopCore {
|
|
|
24
24
|
private readonly runtime;
|
|
25
25
|
private readonly runtimeStateStore;
|
|
26
26
|
domainServices?: OfcoopDomainServices;
|
|
27
|
+
userService?: IUserService;
|
|
27
28
|
readonly runtimeStore: ReadonlyStore<OfcoopRuntimeState>;
|
|
28
29
|
constructor(runtime: CoreRuntime<OfcoopDomainServices, never>, runtimeStateStore: Store<OfcoopRuntimeState>);
|
|
29
30
|
static builder(): OfcoopCoreBuilder;
|
|
@@ -42,6 +43,8 @@ export declare class OfcoopCoreBuilder {
|
|
|
42
43
|
private domainServiceOverrides;
|
|
43
44
|
private runtimeHooks;
|
|
44
45
|
private domainEventSink?;
|
|
46
|
+
private extraServiceOptions;
|
|
47
|
+
private coreInstance?;
|
|
45
48
|
constructor();
|
|
46
49
|
withPlatformAdapter(factory: (core: CoreRuntime<any, any>) => PlatformAdapter): this;
|
|
47
50
|
withDbAdapter(factory: (core: CoreRuntime<any, any>) => DbAdapter): this;
|
|
@@ -54,7 +57,11 @@ export declare class OfcoopCoreBuilder {
|
|
|
54
57
|
overrideDomainServices(overrides: OfcoopDomainServicesOverride): this;
|
|
55
58
|
withRuntimeHooks(hooks: Partial<OfcoopRuntimeHooks>): this;
|
|
56
59
|
withMigrationRunner(runner: NonNullable<OfcoopRuntimeHooks['runMigrations']>): this;
|
|
57
|
-
withSeedRunner(runner: NonNullable<OfcoopRuntimeHooks['runSeed']>): this;
|
|
58
60
|
withDomainEventSink(sink: (event: OfcoopDomainEvent) => Promise<void> | void): this;
|
|
61
|
+
/**
|
|
62
|
+
* Injeksikan opsi tambahan untuk ServiceRuntimeOptions, misalnya `hasActiveLoan`
|
|
63
|
+
* untuk guard cross-domain di settleMemberExit.
|
|
64
|
+
*/
|
|
65
|
+
withServiceRuntimeOptions(options: Partial<ServiceRuntimeOptions>): this;
|
|
59
66
|
build(): OfcoopCore;
|
|
60
67
|
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { ScopeRef, ResponseEnvelope } from 'ofcore';
|
|
2
|
+
export type ComplianceReadinessRegulator = 'dinas_koperasi' | 'ojk';
|
|
3
|
+
export type ComplianceReadinessCheckStatus = 'pass' | 'warn' | 'fail';
|
|
4
|
+
export type ComplianceReadinessStatus = 'ready' | 'partial' | 'not_ready';
|
|
5
|
+
export interface ComplianceReadinessScope extends ScopeRef {
|
|
6
|
+
periodCode?: string | null;
|
|
7
|
+
}
|
|
8
|
+
export interface ComplianceReadinessCheck {
|
|
9
|
+
id: string;
|
|
10
|
+
label: string;
|
|
11
|
+
status: ComplianceReadinessCheckStatus;
|
|
12
|
+
detail: string;
|
|
13
|
+
meta?: Record<string, unknown>;
|
|
14
|
+
}
|
|
15
|
+
export interface ComplianceReadinessSummary {
|
|
16
|
+
score: number;
|
|
17
|
+
status: ComplianceReadinessStatus;
|
|
18
|
+
regulator: ComplianceReadinessRegulator;
|
|
19
|
+
}
|
|
20
|
+
export interface ComplianceReadinessSnapshot {
|
|
21
|
+
generatedAt: string;
|
|
22
|
+
scope: ComplianceReadinessScope;
|
|
23
|
+
summary: ComplianceReadinessSummary;
|
|
24
|
+
checks: ComplianceReadinessCheck[];
|
|
25
|
+
}
|
|
26
|
+
export interface GetComplianceReadinessInput extends ComplianceReadinessScope {
|
|
27
|
+
regulator: ComplianceReadinessRegulator;
|
|
28
|
+
}
|
|
29
|
+
export interface ComplianceReadinessServiceContract {
|
|
30
|
+
getComplianceReadinessSnapshot(input: GetComplianceReadinessInput): Promise<ResponseEnvelope<ComplianceReadinessSnapshot>>;
|
|
31
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import type { ScopeRef, ResponseEnvelope } from 'ofcore';
|
|
2
|
+
export type CommunityProfileType = 'kud' | 'kpri' | 'kopkar' | 'kopontren' | 'kospin' | 'koperasi_merah_putih' | 'custom';
|
|
3
|
+
export interface SavingRequirementPolicy {
|
|
4
|
+
/** Simpanan pokok minimal (IDR) */
|
|
5
|
+
minSimpananPokok: number;
|
|
6
|
+
/** Simpanan wajib per periode */
|
|
7
|
+
minSimpananWajib: number;
|
|
8
|
+
/** Frekuensi bayar simpanan wajib: 'monthly' | 'quarterly' | 'annual' */
|
|
9
|
+
savingFrequency: 'monthly' | 'quarterly' | 'annual';
|
|
10
|
+
}
|
|
11
|
+
export interface ShuRulePolicy {
|
|
12
|
+
/** % dana cadangan minimal per AD/ART */
|
|
13
|
+
minCadanganPercent: number;
|
|
14
|
+
/** % jasa modal (JMA) dari shuDibagikan */
|
|
15
|
+
jasaModalPercent: number;
|
|
16
|
+
/** % jasa usaha (JUA) dari shuDibagikan */
|
|
17
|
+
jasaUsahaPercent: number;
|
|
18
|
+
}
|
|
19
|
+
export interface MembershipRequirementPolicy {
|
|
20
|
+
/** Usia minimum anggota */
|
|
21
|
+
minAgeYears?: number | null;
|
|
22
|
+
/** Apakah keanggotaan terikat domisili/wilayah */
|
|
23
|
+
residencyRequired: boolean;
|
|
24
|
+
/** Apakah keanggotaan terikat status kepegawaian */
|
|
25
|
+
employmentLinked: boolean;
|
|
26
|
+
/** Kriteria komunitas lain (teks bebas) */
|
|
27
|
+
communityCriteria?: string | null;
|
|
28
|
+
}
|
|
29
|
+
export interface GovernanceRulePolicy {
|
|
30
|
+
/** Lama masa jabatan pengurus (tahun) */
|
|
31
|
+
boardTermYears: number;
|
|
32
|
+
/** Frekuensi RAT: 'annual' | 'biennial' */
|
|
33
|
+
ratFrequency: 'annual' | 'biennial';
|
|
34
|
+
/** Apakah wajib audit eksternal */
|
|
35
|
+
externalAuditRequired: boolean;
|
|
36
|
+
}
|
|
37
|
+
export interface CoopCommunityProfileContract extends ScopeRef {
|
|
38
|
+
id: string;
|
|
39
|
+
profileType: CommunityProfileType;
|
|
40
|
+
displayName: string;
|
|
41
|
+
description?: string | null;
|
|
42
|
+
savingRequirements?: SavingRequirementPolicy | null;
|
|
43
|
+
shuRules?: ShuRulePolicy | null;
|
|
44
|
+
membershipRequirements?: MembershipRequirementPolicy | null;
|
|
45
|
+
governanceRules?: GovernanceRulePolicy | null;
|
|
46
|
+
/** Field kustom tambahan per jenis komunitas */
|
|
47
|
+
customFields?: Record<string, unknown> | null;
|
|
48
|
+
isActive: boolean;
|
|
49
|
+
notes?: string | null;
|
|
50
|
+
version: number;
|
|
51
|
+
lastModified: string;
|
|
52
|
+
deleted: boolean;
|
|
53
|
+
}
|
|
54
|
+
export interface CreateCommunityProfileInput extends ScopeRef {
|
|
55
|
+
profileType: CommunityProfileType;
|
|
56
|
+
displayName: string;
|
|
57
|
+
description?: string | null;
|
|
58
|
+
savingRequirements?: SavingRequirementPolicy | null;
|
|
59
|
+
shuRules?: ShuRulePolicy | null;
|
|
60
|
+
membershipRequirements?: MembershipRequirementPolicy | null;
|
|
61
|
+
governanceRules?: GovernanceRulePolicy | null;
|
|
62
|
+
customFields?: Record<string, unknown> | null;
|
|
63
|
+
notes?: string | null;
|
|
64
|
+
}
|
|
65
|
+
export interface UpdateCommunityProfileInput {
|
|
66
|
+
displayName?: string;
|
|
67
|
+
description?: string | null;
|
|
68
|
+
savingRequirements?: SavingRequirementPolicy | null;
|
|
69
|
+
shuRules?: ShuRulePolicy | null;
|
|
70
|
+
membershipRequirements?: MembershipRequirementPolicy | null;
|
|
71
|
+
governanceRules?: GovernanceRulePolicy | null;
|
|
72
|
+
customFields?: Record<string, unknown> | null;
|
|
73
|
+
isActive?: boolean;
|
|
74
|
+
notes?: string | null;
|
|
75
|
+
}
|
|
76
|
+
export interface CommunityProfileQueryOptions extends Partial<ScopeRef> {
|
|
77
|
+
includeDeleted?: boolean;
|
|
78
|
+
profileType?: CommunityProfileType;
|
|
79
|
+
isActive?: boolean;
|
|
80
|
+
}
|
|
81
|
+
export interface CoopCommunityProfileServiceContract {
|
|
82
|
+
createCommunityProfile(input: CreateCommunityProfileInput): Promise<ResponseEnvelope<CoopCommunityProfileContract>>;
|
|
83
|
+
updateCommunityProfile(profileId: string, input: UpdateCommunityProfileInput): Promise<ResponseEnvelope<CoopCommunityProfileContract>>;
|
|
84
|
+
getCommunityProfileById(profileId: string): Promise<ResponseEnvelope<CoopCommunityProfileContract | null>>;
|
|
85
|
+
getActiveCommunityProfile(tenantId: string, branchId?: string | null): Promise<ResponseEnvelope<CoopCommunityProfileContract | null>>;
|
|
86
|
+
listCommunityProfiles(options?: CommunityProfileQueryOptions): Promise<ResponseEnvelope<CoopCommunityProfileContract[]>>;
|
|
87
|
+
}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import type { ScopeRef, ResponseEnvelope } from 'ofcore';
|
|
2
|
+
export type GovernanceMeetingStatus = 'draft' | 'voting' | 'closed';
|
|
3
|
+
export type GovernanceAgendaStatus = 'open' | 'approved' | 'rejected' | 'deferred';
|
|
4
|
+
export type GovernanceVoteChoice = 'yes' | 'no' | 'abstain';
|
|
5
|
+
export interface GovernanceMeetingContract extends ScopeRef {
|
|
6
|
+
id: string;
|
|
7
|
+
title: string;
|
|
8
|
+
meetingDate: string;
|
|
9
|
+
status: GovernanceMeetingStatus;
|
|
10
|
+
quorumPercent: number;
|
|
11
|
+
eligibleMemberIds?: string[] | null;
|
|
12
|
+
notes?: string | null;
|
|
13
|
+
minutes?: string | null;
|
|
14
|
+
decisionSummary?: string | null;
|
|
15
|
+
minutesArtifactRef?: string | null;
|
|
16
|
+
attendanceArtifactRef?: string | null;
|
|
17
|
+
ratDecisionBundleRef?: string | null;
|
|
18
|
+
chairpersonMemberId?: string | null;
|
|
19
|
+
secretaryMemberId?: string | null;
|
|
20
|
+
version: number;
|
|
21
|
+
lastModified: string;
|
|
22
|
+
deleted: boolean;
|
|
23
|
+
}
|
|
24
|
+
export interface GovernanceAgendaItemContract extends ScopeRef {
|
|
25
|
+
id: string;
|
|
26
|
+
meetingId: string;
|
|
27
|
+
title: string;
|
|
28
|
+
description?: string | null;
|
|
29
|
+
orderNo: number;
|
|
30
|
+
status: GovernanceAgendaStatus;
|
|
31
|
+
decisionArtifactRef?: string | null;
|
|
32
|
+
decisionNumber?: string | null;
|
|
33
|
+
decidedAt?: string | null;
|
|
34
|
+
decidedByMemberId?: string | null;
|
|
35
|
+
decisionNote?: string | null;
|
|
36
|
+
version: number;
|
|
37
|
+
lastModified: string;
|
|
38
|
+
deleted: boolean;
|
|
39
|
+
}
|
|
40
|
+
export interface GovernanceVoteContract extends ScopeRef {
|
|
41
|
+
id: string;
|
|
42
|
+
meetingId: string;
|
|
43
|
+
agendaItemId: string;
|
|
44
|
+
memberId: string;
|
|
45
|
+
choice: GovernanceVoteChoice;
|
|
46
|
+
votedAt: string;
|
|
47
|
+
notes?: string | null;
|
|
48
|
+
version: number;
|
|
49
|
+
lastModified: string;
|
|
50
|
+
deleted: boolean;
|
|
51
|
+
}
|
|
52
|
+
export interface CreateGovernanceMeetingInput extends ScopeRef {
|
|
53
|
+
title: string;
|
|
54
|
+
meetingDate: string;
|
|
55
|
+
quorumPercent: number;
|
|
56
|
+
eligibleMemberIds?: string[] | null;
|
|
57
|
+
notes?: string | null;
|
|
58
|
+
}
|
|
59
|
+
export interface GovernanceMeetingQueryOptions extends Partial<ScopeRef> {
|
|
60
|
+
includeDeleted?: boolean;
|
|
61
|
+
status?: GovernanceMeetingStatus;
|
|
62
|
+
}
|
|
63
|
+
export interface AddGovernanceAgendaItemInput {
|
|
64
|
+
title: string;
|
|
65
|
+
description?: string | null;
|
|
66
|
+
orderNo: number;
|
|
67
|
+
}
|
|
68
|
+
export interface CloseGovernanceAgendaInput {
|
|
69
|
+
status: Extract<GovernanceAgendaStatus, 'approved' | 'rejected' | 'deferred'>;
|
|
70
|
+
decisionArtifactRef?: string | null;
|
|
71
|
+
decisionNumber?: string | null;
|
|
72
|
+
decidedAt?: string | null;
|
|
73
|
+
decidedByMemberId?: string | null;
|
|
74
|
+
decisionNote?: string | null;
|
|
75
|
+
}
|
|
76
|
+
export interface RecordGovernanceVoteInput {
|
|
77
|
+
agendaItemId: string;
|
|
78
|
+
memberId: string;
|
|
79
|
+
choice: GovernanceVoteChoice;
|
|
80
|
+
notes?: string | null;
|
|
81
|
+
votedAt: string;
|
|
82
|
+
}
|
|
83
|
+
export interface RecordGovernanceMeetingMinutesInput {
|
|
84
|
+
minutes: string;
|
|
85
|
+
decisionSummary?: string | null;
|
|
86
|
+
}
|
|
87
|
+
export interface RecordGovernanceMeetingArtifactsInput {
|
|
88
|
+
minutesArtifactRef?: string | null;
|
|
89
|
+
attendanceArtifactRef?: string | null;
|
|
90
|
+
ratDecisionBundleRef?: string | null;
|
|
91
|
+
chairpersonMemberId?: string | null;
|
|
92
|
+
secretaryMemberId?: string | null;
|
|
93
|
+
}
|
|
94
|
+
export interface GovernanceVoteSummary {
|
|
95
|
+
agendaItemId: string;
|
|
96
|
+
totalVotes: number;
|
|
97
|
+
eligibleVoters: number;
|
|
98
|
+
eligibleVotersSource: 'active-members' | 'meeting-eligible-members';
|
|
99
|
+
quorumPercent: number;
|
|
100
|
+
quorumReached: boolean;
|
|
101
|
+
yes: number;
|
|
102
|
+
no: number;
|
|
103
|
+
abstain: number;
|
|
104
|
+
}
|
|
105
|
+
export interface GovernanceDecisionArchiveItem {
|
|
106
|
+
agendaItemId: string;
|
|
107
|
+
title: string;
|
|
108
|
+
orderNo: number;
|
|
109
|
+
status: Extract<GovernanceAgendaStatus, 'approved' | 'rejected' | 'deferred'>;
|
|
110
|
+
decisionNumber?: string | null;
|
|
111
|
+
decisionArtifactRef?: string | null;
|
|
112
|
+
decidedAt?: string | null;
|
|
113
|
+
decidedByMemberId?: string | null;
|
|
114
|
+
decisionNote?: string | null;
|
|
115
|
+
}
|
|
116
|
+
export interface GovernanceDecisionArchive extends ScopeRef {
|
|
117
|
+
id: string;
|
|
118
|
+
meetingId: string;
|
|
119
|
+
meetingTitle: string;
|
|
120
|
+
meetingDate: string;
|
|
121
|
+
archivedAt: string;
|
|
122
|
+
archivedBy?: string | null;
|
|
123
|
+
totalItems: number;
|
|
124
|
+
approvedCount: number;
|
|
125
|
+
rejectedCount: number;
|
|
126
|
+
deferredCount: number;
|
|
127
|
+
/** Snapshot of all decided agenda items at archive time. */
|
|
128
|
+
items: GovernanceDecisionArchiveItem[];
|
|
129
|
+
version: number;
|
|
130
|
+
lastModified: string;
|
|
131
|
+
deleted: boolean;
|
|
132
|
+
}
|
|
133
|
+
export interface ArchiveDecisionsInput {
|
|
134
|
+
archivedBy?: string | null;
|
|
135
|
+
}
|
|
136
|
+
export interface GovernanceMeetingServiceContract {
|
|
137
|
+
createMeeting(input: CreateGovernanceMeetingInput): Promise<ResponseEnvelope<GovernanceMeetingContract>>;
|
|
138
|
+
getMeetingById(id: string): Promise<ResponseEnvelope<GovernanceMeetingContract | null>>;
|
|
139
|
+
listMeetings(options?: GovernanceMeetingQueryOptions): Promise<ResponseEnvelope<GovernanceMeetingContract[]>>;
|
|
140
|
+
addAgendaItem(meetingId: string, input: AddGovernanceAgendaItemInput): Promise<ResponseEnvelope<GovernanceAgendaItemContract>>;
|
|
141
|
+
listAgendaItems(meetingId: string): Promise<ResponseEnvelope<GovernanceAgendaItemContract[]>>;
|
|
142
|
+
startVoting(meetingId: string): Promise<ResponseEnvelope<GovernanceMeetingContract>>;
|
|
143
|
+
recordVote(meetingId: string, input: RecordGovernanceVoteInput): Promise<ResponseEnvelope<GovernanceVoteContract>>;
|
|
144
|
+
getAgendaVoteSummary(agendaItemId: string): Promise<ResponseEnvelope<GovernanceVoteSummary>>;
|
|
145
|
+
closeAgendaItem(agendaItemId: string, input: CloseGovernanceAgendaInput): Promise<ResponseEnvelope<GovernanceAgendaItemContract>>;
|
|
146
|
+
closeMeeting(meetingId: string): Promise<ResponseEnvelope<GovernanceMeetingContract>>;
|
|
147
|
+
recordMeetingMinutes(meetingId: string, input: RecordGovernanceMeetingMinutesInput): Promise<ResponseEnvelope<GovernanceMeetingContract>>;
|
|
148
|
+
recordMeetingArtifacts(meetingId: string, input: RecordGovernanceMeetingArtifactsInput): Promise<ResponseEnvelope<GovernanceMeetingContract>>;
|
|
149
|
+
/**
|
|
150
|
+
* Creates a formal snapshot archive of all decided (approved/rejected/deferred)
|
|
151
|
+
* agenda items for a closed meeting. Idempotent: returns existing archive if
|
|
152
|
+
* already archived.
|
|
153
|
+
*/
|
|
154
|
+
archiveDecisions(meetingId: string, input?: ArchiveDecisionsInput): Promise<ResponseEnvelope<GovernanceDecisionArchive>>;
|
|
155
|
+
/** Returns the decision archive for a meeting, or null if not yet archived. */
|
|
156
|
+
getDecisionArchive(meetingId: string): Promise<ResponseEnvelope<GovernanceDecisionArchive | null>>;
|
|
157
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import type { ScopeRef, ResponseEnvelope } from 'ofcore';
|
|
2
|
+
import type { LeadershipRoleType } from './LeadershipTermContract.js';
|
|
3
|
+
export type AppointmentType = 'election' | 'replacement' | 'interim' | 'cooptation';
|
|
4
|
+
export type AppointmentStatus = 'proposed' | 'endorsed' | 'approved' | 'rejected' | 'installed';
|
|
5
|
+
export interface LeadershipAppointmentContract extends ScopeRef {
|
|
6
|
+
id: string;
|
|
7
|
+
proposedMemberId: string;
|
|
8
|
+
roleType: LeadershipRoleType;
|
|
9
|
+
positionTitle: string;
|
|
10
|
+
appointmentType: AppointmentType;
|
|
11
|
+
/** ID of the LeadershipTerm being replaced (if applicable) */
|
|
12
|
+
replacesTermId?: string | null;
|
|
13
|
+
/** Meeting ID where this appointment was endorsed/voted */
|
|
14
|
+
governanceMeetingRef?: string | null;
|
|
15
|
+
status: AppointmentStatus;
|
|
16
|
+
effectiveDate: string;
|
|
17
|
+
endDate?: string | null;
|
|
18
|
+
proposedAt: string;
|
|
19
|
+
endorsedAt?: string | null;
|
|
20
|
+
endorsedBy?: string | null;
|
|
21
|
+
approvedAt?: string | null;
|
|
22
|
+
approvalRef?: string | null;
|
|
23
|
+
installedAt?: string | null;
|
|
24
|
+
/** Term ID created when installed */
|
|
25
|
+
installedTermId?: string | null;
|
|
26
|
+
rejectedAt?: string | null;
|
|
27
|
+
rejectionReason?: string | null;
|
|
28
|
+
notes?: string | null;
|
|
29
|
+
version: number;
|
|
30
|
+
lastModified: string;
|
|
31
|
+
deleted: boolean;
|
|
32
|
+
}
|
|
33
|
+
export interface ProposeAppointmentInput extends ScopeRef {
|
|
34
|
+
proposedMemberId: string;
|
|
35
|
+
roleType: LeadershipRoleType;
|
|
36
|
+
positionTitle: string;
|
|
37
|
+
appointmentType: AppointmentType;
|
|
38
|
+
effectiveDate: string;
|
|
39
|
+
endDate?: string | null;
|
|
40
|
+
replacesTermId?: string | null;
|
|
41
|
+
governanceMeetingRef?: string | null;
|
|
42
|
+
notes?: string | null;
|
|
43
|
+
}
|
|
44
|
+
export interface EndorseAppointmentInput {
|
|
45
|
+
endorsedBy: string;
|
|
46
|
+
endorsedAt?: string;
|
|
47
|
+
governanceMeetingRef?: string | null;
|
|
48
|
+
}
|
|
49
|
+
export interface ApproveAppointmentInput {
|
|
50
|
+
approvalRef?: string | null;
|
|
51
|
+
approvedAt?: string;
|
|
52
|
+
}
|
|
53
|
+
export interface InstallAppointmentInput {
|
|
54
|
+
installedAt?: string;
|
|
55
|
+
}
|
|
56
|
+
export interface RejectAppointmentInput {
|
|
57
|
+
rejectionReason: string;
|
|
58
|
+
rejectedAt?: string;
|
|
59
|
+
}
|
|
60
|
+
export interface LeadershipAppointmentQueryOptions extends Partial<ScopeRef> {
|
|
61
|
+
includeDeleted?: boolean;
|
|
62
|
+
status?: AppointmentStatus;
|
|
63
|
+
roleType?: LeadershipRoleType;
|
|
64
|
+
}
|
|
65
|
+
export interface LeadershipAppointmentServiceContract {
|
|
66
|
+
/**
|
|
67
|
+
* Propose a new appointment (status = proposed).
|
|
68
|
+
* Can be called by any initiator (pengurus/secretary).
|
|
69
|
+
*/
|
|
70
|
+
proposeAppointment(input: ProposeAppointmentInput): Promise<ResponseEnvelope<LeadershipAppointmentContract>>;
|
|
71
|
+
/**
|
|
72
|
+
* Endorse the appointment (status proposed → endorsed).
|
|
73
|
+
* Typically triggered when the governance meeting votes in favour.
|
|
74
|
+
*/
|
|
75
|
+
endorseAppointment(appointmentId: string, input: EndorseAppointmentInput): Promise<ResponseEnvelope<LeadershipAppointmentContract>>;
|
|
76
|
+
/**
|
|
77
|
+
* Final approval (status endorsed → approved).
|
|
78
|
+
* E.g. notarial/dinas koperasi approval or RAT formal resolution.
|
|
79
|
+
*/
|
|
80
|
+
approveAppointment(appointmentId: string, input: ApproveAppointmentInput): Promise<ResponseEnvelope<LeadershipAppointmentContract>>;
|
|
81
|
+
/**
|
|
82
|
+
* Install the appointment (status approved → installed).
|
|
83
|
+
* Creates a new LeadershipTerm record and links installedTermId.
|
|
84
|
+
* If replacesTermId provided, ends the old term.
|
|
85
|
+
*/
|
|
86
|
+
installAppointment(appointmentId: string, input?: InstallAppointmentInput): Promise<ResponseEnvelope<LeadershipAppointmentContract>>;
|
|
87
|
+
/** Reject at any stage before installed. */
|
|
88
|
+
rejectAppointment(appointmentId: string, input: RejectAppointmentInput): Promise<ResponseEnvelope<LeadershipAppointmentContract>>;
|
|
89
|
+
getAppointmentById(appointmentId: string): Promise<ResponseEnvelope<LeadershipAppointmentContract | null>>;
|
|
90
|
+
listAppointments(options?: LeadershipAppointmentQueryOptions): Promise<ResponseEnvelope<LeadershipAppointmentContract[]>>;
|
|
91
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { ScopeRef, ResponseEnvelope } from 'ofcore';
|
|
2
|
+
export type LeadershipRoleType = 'pengurus' | 'pengawas';
|
|
3
|
+
export type LeadershipTermStatus = 'active' | 'ended';
|
|
4
|
+
export interface LeadershipTermContract extends ScopeRef {
|
|
5
|
+
id: string;
|
|
6
|
+
memberId: string;
|
|
7
|
+
roleType: LeadershipRoleType;
|
|
8
|
+
positionTitle: string;
|
|
9
|
+
startDate: string;
|
|
10
|
+
endDate?: string | null;
|
|
11
|
+
handoverFromTermId?: string | null;
|
|
12
|
+
status: LeadershipTermStatus;
|
|
13
|
+
notes?: string | null;
|
|
14
|
+
version: number;
|
|
15
|
+
lastModified: string;
|
|
16
|
+
deleted: boolean;
|
|
17
|
+
}
|
|
18
|
+
export interface CreateLeadershipTermInput extends ScopeRef {
|
|
19
|
+
memberId: string;
|
|
20
|
+
roleType: LeadershipRoleType;
|
|
21
|
+
positionTitle: string;
|
|
22
|
+
startDate: string;
|
|
23
|
+
endDate?: string | null;
|
|
24
|
+
handoverFromTermId?: string | null;
|
|
25
|
+
notes?: string | null;
|
|
26
|
+
}
|
|
27
|
+
export interface EndLeadershipTermInput {
|
|
28
|
+
endDate: string;
|
|
29
|
+
notes?: string | null;
|
|
30
|
+
}
|
|
31
|
+
export interface HandoverLeadershipTermInput {
|
|
32
|
+
successorMemberId: string;
|
|
33
|
+
effectiveDate: string;
|
|
34
|
+
positionTitle?: string;
|
|
35
|
+
notes?: string | null;
|
|
36
|
+
}
|
|
37
|
+
export interface LeadershipTermHandoverResult {
|
|
38
|
+
endedTerm: LeadershipTermContract;
|
|
39
|
+
successorTerm: LeadershipTermContract;
|
|
40
|
+
}
|
|
41
|
+
export interface LeadershipTermQueryOptions extends Partial<ScopeRef> {
|
|
42
|
+
includeDeleted?: boolean;
|
|
43
|
+
status?: LeadershipTermStatus;
|
|
44
|
+
roleType?: LeadershipRoleType;
|
|
45
|
+
memberId?: string;
|
|
46
|
+
}
|
|
47
|
+
export interface LeadershipTermServiceContract {
|
|
48
|
+
createLeadershipTerm(input: CreateLeadershipTermInput): Promise<ResponseEnvelope<LeadershipTermContract>>;
|
|
49
|
+
endLeadershipTerm(termId: string, input: EndLeadershipTermInput): Promise<ResponseEnvelope<LeadershipTermContract>>;
|
|
50
|
+
handoverLeadershipTerm(termId: string, input: HandoverLeadershipTermInput): Promise<ResponseEnvelope<LeadershipTermHandoverResult>>;
|
|
51
|
+
getLeadershipTermById(termId: string): Promise<ResponseEnvelope<LeadershipTermContract | null>>;
|
|
52
|
+
listLeadershipTerms(options?: LeadershipTermQueryOptions): Promise<ResponseEnvelope<LeadershipTermContract[]>>;
|
|
53
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import type { ScopeRef, ResponseEnvelope } from 'ofcore';
|
|
2
|
+
export type ManagementReportType = 'lpj_pengurus' | 'lpj_pengawas';
|
|
3
|
+
export type ManagementReportStatus = 'draft' | 'submitted' | 'approved' | 'rejected';
|
|
4
|
+
export type ManagementReportAudience = 'rapat_anggota' | 'dinas_koperasi' | 'ojk' | 'pajak';
|
|
5
|
+
export type ManagementReportPayload = Record<string, unknown>;
|
|
6
|
+
export interface ManagementReportContract extends ScopeRef {
|
|
7
|
+
id: string;
|
|
8
|
+
reportType: ManagementReportType;
|
|
9
|
+
periodCode: string;
|
|
10
|
+
title: string;
|
|
11
|
+
summary: string;
|
|
12
|
+
preparedByMemberId: string;
|
|
13
|
+
preparedByLeadershipTermId?: string | null;
|
|
14
|
+
status: ManagementReportStatus;
|
|
15
|
+
submittedAt?: string | null;
|
|
16
|
+
reviewedAt?: string | null;
|
|
17
|
+
reviewerMemberId?: string | null;
|
|
18
|
+
reviewNotes?: string | null;
|
|
19
|
+
payload?: ManagementReportPayload | null;
|
|
20
|
+
version: number;
|
|
21
|
+
lastModified: string;
|
|
22
|
+
deleted: boolean;
|
|
23
|
+
}
|
|
24
|
+
export interface CreateManagementReportInput extends ScopeRef {
|
|
25
|
+
reportType: ManagementReportType;
|
|
26
|
+
periodCode: string;
|
|
27
|
+
title: string;
|
|
28
|
+
summary: string;
|
|
29
|
+
preparedByMemberId: string;
|
|
30
|
+
preparedByLeadershipTermId?: string | null;
|
|
31
|
+
}
|
|
32
|
+
export interface SubmitManagementReportInput {
|
|
33
|
+
submittedAt: string;
|
|
34
|
+
}
|
|
35
|
+
export interface ReviewManagementReportInput {
|
|
36
|
+
reviewerMemberId: string;
|
|
37
|
+
reviewedAt: string;
|
|
38
|
+
reviewNotes?: string | null;
|
|
39
|
+
}
|
|
40
|
+
export interface UpsertManagementReportPayloadInput {
|
|
41
|
+
payload: ManagementReportPayload;
|
|
42
|
+
}
|
|
43
|
+
export interface ManagementReportQueryOptions extends Partial<ScopeRef> {
|
|
44
|
+
includeDeleted?: boolean;
|
|
45
|
+
status?: ManagementReportStatus;
|
|
46
|
+
reportType?: ManagementReportType;
|
|
47
|
+
periodCode?: string;
|
|
48
|
+
}
|
|
49
|
+
export interface ManagementReportPackageSection {
|
|
50
|
+
id: string;
|
|
51
|
+
title: string;
|
|
52
|
+
content: string;
|
|
53
|
+
}
|
|
54
|
+
export interface ManagementReportTemplateField {
|
|
55
|
+
key: string;
|
|
56
|
+
label: string;
|
|
57
|
+
required: boolean;
|
|
58
|
+
}
|
|
59
|
+
export interface ManagementReportTemplateSection {
|
|
60
|
+
id: string;
|
|
61
|
+
title: string;
|
|
62
|
+
fields: ManagementReportTemplateField[];
|
|
63
|
+
}
|
|
64
|
+
export interface ManagementReportCompletenessContract {
|
|
65
|
+
audience: ManagementReportAudience;
|
|
66
|
+
totalRequired: number;
|
|
67
|
+
filledRequired: number;
|
|
68
|
+
missingKeys: string[];
|
|
69
|
+
isComplete: boolean;
|
|
70
|
+
template: ManagementReportTemplateSection[];
|
|
71
|
+
}
|
|
72
|
+
export interface ManagementReportPackageContract {
|
|
73
|
+
reportId: string;
|
|
74
|
+
reportType: ManagementReportType;
|
|
75
|
+
audience: ManagementReportAudience;
|
|
76
|
+
title: string;
|
|
77
|
+
periodCode: string;
|
|
78
|
+
generatedAt: string;
|
|
79
|
+
sections: ManagementReportPackageSection[];
|
|
80
|
+
metadata: {
|
|
81
|
+
tenantId?: string | null;
|
|
82
|
+
branchId?: string | null;
|
|
83
|
+
submittedAt?: string | null;
|
|
84
|
+
reviewedAt?: string | null;
|
|
85
|
+
status: ManagementReportStatus;
|
|
86
|
+
completeness: ManagementReportCompletenessContract;
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
export interface ManagementReportServiceContract {
|
|
90
|
+
createManagementReport(input: CreateManagementReportInput): Promise<ResponseEnvelope<ManagementReportContract>>;
|
|
91
|
+
upsertManagementReportPayload(reportId: string, input: UpsertManagementReportPayloadInput): Promise<ResponseEnvelope<ManagementReportContract>>;
|
|
92
|
+
submitManagementReport(reportId: string, input: SubmitManagementReportInput): Promise<ResponseEnvelope<ManagementReportContract>>;
|
|
93
|
+
approveManagementReport(reportId: string, input: ReviewManagementReportInput): Promise<ResponseEnvelope<ManagementReportContract>>;
|
|
94
|
+
rejectManagementReport(reportId: string, input: ReviewManagementReportInput): Promise<ResponseEnvelope<ManagementReportContract>>;
|
|
95
|
+
getManagementReportById(reportId: string): Promise<ResponseEnvelope<ManagementReportContract | null>>;
|
|
96
|
+
listManagementReports(options?: ManagementReportQueryOptions): Promise<ResponseEnvelope<ManagementReportContract[]>>;
|
|
97
|
+
evaluateManagementReportCompleteness(reportId: string, audience: ManagementReportAudience): Promise<ResponseEnvelope<ManagementReportCompletenessContract>>;
|
|
98
|
+
buildManagementReportPackage(reportId: string, audience: ManagementReportAudience): Promise<ResponseEnvelope<ManagementReportPackageContract>>;
|
|
99
|
+
}
|
|
@@ -1,33 +1,28 @@
|
|
|
1
|
+
import type { ScopeRef, ResponseEnvelope } from 'ofcore';
|
|
1
2
|
export type MemberStatus = 'active' | 'inactive' | 'exited';
|
|
2
|
-
export interface MemberContract {
|
|
3
|
+
export interface MemberContract extends ScopeRef {
|
|
3
4
|
id: string;
|
|
4
5
|
memberNumber: string;
|
|
5
6
|
fullName: string;
|
|
6
7
|
status: MemberStatus;
|
|
7
8
|
joinDate: string;
|
|
8
9
|
exitDate?: string | null;
|
|
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 CreateMemberInput {
|
|
14
|
+
export interface CreateMemberInput extends ScopeRef {
|
|
16
15
|
memberNumber: string;
|
|
17
16
|
fullName: string;
|
|
18
17
|
joinDate: string;
|
|
19
|
-
branchId?: string | null;
|
|
20
|
-
tenantId?: string | null;
|
|
21
18
|
}
|
|
22
19
|
export interface UpdateMemberInput {
|
|
23
20
|
fullName?: string;
|
|
24
21
|
memberNumber?: string;
|
|
25
22
|
}
|
|
26
|
-
export interface MemberQueryOptions {
|
|
23
|
+
export interface MemberQueryOptions extends Partial<ScopeRef> {
|
|
27
24
|
includeDeleted?: boolean;
|
|
28
25
|
status?: MemberStatus;
|
|
29
|
-
tenantId?: string | null;
|
|
30
|
-
branchId?: string | null;
|
|
31
26
|
}
|
|
32
27
|
export interface MemberWaConsentInput {
|
|
33
28
|
granted: boolean;
|
|
@@ -38,15 +33,63 @@ export interface MemberExitInput {
|
|
|
38
33
|
reason?: string | null;
|
|
39
34
|
requestedBy?: string | null;
|
|
40
35
|
referenceId?: string | null;
|
|
36
|
+
note?: string | null;
|
|
37
|
+
actionAt?: string | null;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Rincian finansial penyelesaian anggota keluar.
|
|
41
|
+
* Semua nilai dalam satuan IDR. Field yang tidak relevan diisi 0.
|
|
42
|
+
*/
|
|
43
|
+
export interface MemberExitSettlementDetail {
|
|
44
|
+
/** Simpanan pokok yang dikembalikan. */
|
|
45
|
+
simpananPokokReturned: number;
|
|
46
|
+
/** Simpanan wajib yang dikembalikan. */
|
|
47
|
+
simpananWajibReturned: number;
|
|
48
|
+
/** Simpanan sukarela yang dikembalikan. */
|
|
49
|
+
simpananSukarelaReturned: number;
|
|
50
|
+
/** Alokasi SHU yang diterimakan (jika periode belum tutup, bisa 0). */
|
|
51
|
+
shuAllocated: number;
|
|
52
|
+
/** Potongan/kewajiban lain yang belum diselesaikan (misal denda, biaya administrasi). */
|
|
53
|
+
deductions: number;
|
|
54
|
+
/** Net yang diterima anggota: sum returns + shuAllocated - deductions. */
|
|
55
|
+
netSettlementAmount: number;
|
|
56
|
+
/** Siapa yang mengesahkan settlement. */
|
|
57
|
+
settledBy: string;
|
|
58
|
+
/** Tanggal settlement dikonfirmasi (ISO). */
|
|
59
|
+
settledAt: string;
|
|
60
|
+
/** Catatan tambahan. */
|
|
61
|
+
notes?: string | null;
|
|
62
|
+
}
|
|
63
|
+
export type MemberExitStage = 'requested' | 'settled' | 'canceled';
|
|
64
|
+
/**
|
|
65
|
+
* State exit anggota yang lengkap — berisi tahap saat ini beserta rincian
|
|
66
|
+
* request dan (jika sudah settle) rincian finansial settlement.
|
|
67
|
+
*/
|
|
68
|
+
export interface MemberExitState {
|
|
69
|
+
memberId: string;
|
|
70
|
+
stage: MemberExitStage;
|
|
71
|
+
reason?: string | null;
|
|
72
|
+
requestedBy?: string | null;
|
|
73
|
+
referenceId?: string | null;
|
|
74
|
+
settlement?: MemberExitSettlementDetail | null;
|
|
75
|
+
version: number;
|
|
76
|
+
lastModified: string;
|
|
77
|
+
}
|
|
78
|
+
/** Input untuk settle — mengharuskan rincian finansial. */
|
|
79
|
+
export interface MemberSettleExitInput extends MemberExitInput {
|
|
80
|
+
settlement: MemberExitSettlementDetail;
|
|
41
81
|
}
|
|
42
82
|
export interface MemberServiceContract {
|
|
43
|
-
createMember(input: CreateMemberInput): Promise<MemberContract
|
|
44
|
-
updateMember(id: string, updates: UpdateMemberInput): Promise<MemberContract
|
|
45
|
-
getMemberById(id: string): Promise<MemberContract | null
|
|
46
|
-
listMembers(options?: MemberQueryOptions): Promise<MemberContract[]
|
|
47
|
-
changeMemberStatus(id: string, status: MemberStatus): Promise<MemberContract
|
|
48
|
-
setMemberWaConsent(id: string, consent: MemberWaConsentInput): Promise<MemberContract
|
|
49
|
-
requestMemberExit(id: string, payload: MemberExitInput): Promise<MemberContract
|
|
50
|
-
|
|
51
|
-
|
|
83
|
+
createMember(input: CreateMemberInput): Promise<ResponseEnvelope<MemberContract>>;
|
|
84
|
+
updateMember(id: string, updates: UpdateMemberInput): Promise<ResponseEnvelope<MemberContract>>;
|
|
85
|
+
getMemberById(id: string): Promise<ResponseEnvelope<MemberContract | null>>;
|
|
86
|
+
listMembers(options?: MemberQueryOptions): Promise<ResponseEnvelope<MemberContract[]>>;
|
|
87
|
+
changeMemberStatus(id: string, status: MemberStatus): Promise<ResponseEnvelope<MemberContract>>;
|
|
88
|
+
setMemberWaConsent(id: string, consent: MemberWaConsentInput): Promise<ResponseEnvelope<MemberContract>>;
|
|
89
|
+
requestMemberExit(id: string, payload: MemberExitInput): Promise<ResponseEnvelope<MemberContract>>;
|
|
90
|
+
/** Settle memerlukan rincian finansial dan gagal jika anggota masih punya pinjaman aktif. */
|
|
91
|
+
settleMemberExit(id: string, payload: MemberSettleExitInput): Promise<ResponseEnvelope<MemberContract>>;
|
|
92
|
+
cancelMemberExit(id: string, payload: MemberExitInput): Promise<ResponseEnvelope<MemberContract>>;
|
|
93
|
+
/** Kembalikan state exit terkini beserta rincian settlement jika sudah ada. */
|
|
94
|
+
getMemberExitState(id: string): Promise<ResponseEnvelope<MemberExitState | null>>;
|
|
52
95
|
}
|