ofcoop-shared-core 0.1.0-alpha.2 → 0.1.0-alpha.3
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/index.esm.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import{CoreRuntime as yn}from"ofcore";import{InMemoryDbAdapter as Ur}from"ofcore";import{asReadonlyStore as fn,createStore as hn}from"ofcore";var f={histories:"ofcoop_histories",members:"ofcoop_members",memberWaConsent:"ofcoop_member_wa_consent",memberExitState:"ofcoop_member_exit_state",memberNumberPolicies:"ofcoop_member_number_policies",governanceMeetings:"ofcoop_governance_meetings",governanceAgendaItems:"ofcoop_governance_agenda_items",governanceVotes:"ofcoop_governance_votes",leadershipTerms:"ofcoop_leadership_terms",managementReports:"ofcoop_management_reports",oversightPolicies:"ofcoop_oversight_policies",riskRegisters:"ofcoop_risk_registers",whistleReports:"ofcoop_whistle_reports",savingPolicies:"ofcoop_saving_policies",savingEntries:"ofcoop_saving_entries",shuConfigs:"ofcoop_shu_configs",shuPeriods:"ofcoop_shu_periods",shuAllocations:"ofcoop_shu_allocations",governanceDecisionArchives:"ofcoop_governance_decision_archives",leadershipAppointments:"ofcoop_leadership_appointments",shuParticipationEntries:"ofcoop_shu_participation_entries",communityProfiles:"ofcoop_community_profiles",memberDependents:"ofcoop_member_dependents",users:"ofcoop_users",roles:"ofcoop_roles"},tn=[{name:f.histories,columns:[{name:"id",type:"string"},{name:"tableName",type:"string",isIndexed:!0},{name:"recordId",type:"string",isIndexed:!0},{name:"action",type:"string",isIndexed:!0},{name:"changes",type:"json",isOptional:!0},{name:"userId",type:"string",isOptional:!0,isIndexed:!0},{name:"timestamp",type:"string",isIndexed:!0},{name:"branchId",type:"string",isOptional:!0,isIndexed:!0},{name:"tenantId",type:"string",isOptional:!0,isIndexed:!0}]},{name:f.members,columns:[{name:"id",type:"string"},{name:"memberNumber",type:"string",isIndexed:!0},{name:"fullName",type:"string"},{name:"status",type:"string",enum:["active","inactive","exited"]},{name:"joinDate",type:"string"},{name:"exitDate",type:"string",isOptional:!0},{name:"branchId",type:"string",isOptional:!0,isIndexed:!0},{name:"tenantId",type:"string",isOptional:!0,isIndexed:!0},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]},{name:f.memberWaConsent,columns:[{name:"id",type:"string"},{name:"granted",type:"boolean"},{name:"source",type:"string",isOptional:!0},{name:"note",type:"string",isOptional:!0},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]},{name:f.memberExitState,columns:[{name:"id",type:"string"},{name:"stage",type:"string",enum:["requested","settled","canceled"]},{name:"reason",type:"string",isOptional:!0},{name:"requestedBy",type:"string",isOptional:!0},{name:"referenceId",type:"string",isOptional:!0},{name:"note",type:"string",isOptional:!0},{name:"simpananPokokReturned",type:"number",isOptional:!0},{name:"simpananWajibReturned",type:"number",isOptional:!0},{name:"simpananSukarelaReturned",type:"number",isOptional:!0},{name:"shuAllocated",type:"number",isOptional:!0},{name:"deductions",type:"number",isOptional:!0},{name:"netSettlementAmount",type:"number",isOptional:!0},{name:"settledBy",type:"string",isOptional:!0},{name:"settledAt",type:"string",isOptional:!0},{name:"settlementNotes",type:"string",isOptional:!0},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]},{name:f.memberNumberPolicies,columns:[{name:"id",type:"string"},{name:"koperasiId",type:"string",isIndexed:!0},{name:"branchId",type:"string",isOptional:!0,isIndexed:!0},{name:"tenantId",type:"string",isOptional:!0,isIndexed:!0},{name:"prefix",type:"string",isOptional:!0},{name:"includeYear",type:"boolean"},{name:"includeMonth",type:"boolean",isOptional:!0},{name:"separator",type:"string"},{name:"paddingDigits",type:"number"},{name:"counterResetPolicy",type:"string",enum:["never","yearly"]},{name:"counterStart",type:"number"},{name:"manualOverrideAllowed",type:"boolean"},{name:"effectiveDate",type:"string"},{name:"approvalRef",type:"string",isOptional:!0},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]},{name:f.governanceMeetings,columns:[{name:"id",type:"string"},{name:"title",type:"string"},{name:"meetingDate",type:"string",isIndexed:!0},{name:"status",type:"string",enum:["draft","voting","closed"],isIndexed:!0},{name:"quorumPercent",type:"number"},{name:"eligibleMemberIds",type:"json",isOptional:!0},{name:"notes",type:"string",isOptional:!0},{name:"minutes",type:"string",isOptional:!0},{name:"decisionSummary",type:"string",isOptional:!0},{name:"minutesArtifactRef",type:"string",isOptional:!0,isIndexed:!0},{name:"attendanceArtifactRef",type:"string",isOptional:!0,isIndexed:!0},{name:"ratDecisionBundleRef",type:"string",isOptional:!0,isIndexed:!0},{name:"chairpersonMemberId",type:"string",isOptional:!0,isIndexed:!0},{name:"secretaryMemberId",type:"string",isOptional:!0,isIndexed:!0},{name:"branchId",type:"string",isOptional:!0,isIndexed:!0},{name:"tenantId",type:"string",isOptional:!0,isIndexed:!0},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]},{name:f.governanceAgendaItems,columns:[{name:"id",type:"string"},{name:"meetingId",type:"string",isIndexed:!0},{name:"title",type:"string"},{name:"description",type:"string",isOptional:!0},{name:"orderNo",type:"number",isIndexed:!0},{name:"status",type:"string",enum:["open","approved","rejected","deferred"],isIndexed:!0},{name:"decisionArtifactRef",type:"string",isOptional:!0,isIndexed:!0},{name:"decisionNumber",type:"string",isOptional:!0,isIndexed:!0},{name:"decidedAt",type:"string",isOptional:!0,isIndexed:!0},{name:"decidedByMemberId",type:"string",isOptional:!0,isIndexed:!0},{name:"decisionNote",type:"string",isOptional:!0},{name:"branchId",type:"string",isOptional:!0,isIndexed:!0},{name:"tenantId",type:"string",isOptional:!0,isIndexed:!0},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]},{name:f.governanceVotes,columns:[{name:"id",type:"string"},{name:"meetingId",type:"string",isIndexed:!0},{name:"agendaItemId",type:"string",isIndexed:!0},{name:"memberId",type:"string",isIndexed:!0},{name:"choice",type:"string",enum:["yes","no","abstain"]},{name:"votedAt",type:"string",isIndexed:!0},{name:"notes",type:"string",isOptional:!0},{name:"branchId",type:"string",isOptional:!0,isIndexed:!0},{name:"tenantId",type:"string",isOptional:!0,isIndexed:!0},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]},{name:f.leadershipTerms,columns:[{name:"id",type:"string"},{name:"memberId",type:"string",isIndexed:!0},{name:"roleType",type:"string",enum:["pengurus","pengawas"],isIndexed:!0},{name:"positionTitle",type:"string"},{name:"startDate",type:"string",isIndexed:!0},{name:"endDate",type:"string",isOptional:!0,isIndexed:!0},{name:"handoverFromTermId",type:"string",isOptional:!0,isIndexed:!0},{name:"status",type:"string",enum:["active","ended"],isIndexed:!0},{name:"notes",type:"string",isOptional:!0},{name:"branchId",type:"string",isOptional:!0,isIndexed:!0},{name:"tenantId",type:"string",isOptional:!0,isIndexed:!0},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]},{name:f.managementReports,columns:[{name:"id",type:"string"},{name:"reportType",type:"string",enum:["lpj_pengurus","lpj_pengawas"],isIndexed:!0},{name:"periodCode",type:"string",isIndexed:!0},{name:"title",type:"string"},{name:"summary",type:"string"},{name:"preparedByMemberId",type:"string",isIndexed:!0},{name:"preparedByLeadershipTermId",type:"string",isOptional:!0,isIndexed:!0},{name:"status",type:"string",enum:["draft","submitted","approved","rejected"],isIndexed:!0},{name:"submittedAt",type:"string",isOptional:!0},{name:"reviewedAt",type:"string",isOptional:!0},{name:"reviewerMemberId",type:"string",isOptional:!0,isIndexed:!0},{name:"reviewNotes",type:"string",isOptional:!0},{name:"payload",type:"json",isOptional:!0},{name:"branchId",type:"string",isOptional:!0,isIndexed:!0},{name:"tenantId",type:"string",isOptional:!0,isIndexed:!0},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]},{name:f.oversightPolicies,columns:[{name:"id",type:"string"},{name:"tenantId",type:"string",isIndexed:!0},{name:"branchId",type:"string",isOptional:!0,isIndexed:!0},{name:"effectiveDate",type:"string",isIndexed:!0},{name:"riskSlaHoursByCategory",type:"json"},{name:"whistleSlaHoursByChannel",type:"json"},{name:"escalationMaxLevel",type:"number"},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]},{name:f.riskRegisters,columns:[{name:"id",type:"string"},{name:"title",type:"string"},{name:"description",type:"string",isOptional:!0},{name:"category",type:"string",enum:["operational","credit","compliance","liquidity","governance","other"],isIndexed:!0},{name:"likelihood",type:"number"},{name:"impact",type:"number"},{name:"riskScore",type:"number",isIndexed:!0},{name:"status",type:"string",enum:["open","mitigating","accepted","closed"],isIndexed:!0},{name:"ownerMemberId",type:"string",isOptional:!0,isIndexed:!0},{name:"mitigationPlan",type:"string",isOptional:!0},{name:"slaDueAt",type:"string",isOptional:!0,isIndexed:!0},{name:"escalationLevel",type:"number",isIndexed:!0},{name:"escalatedAt",type:"string",isOptional:!0,isIndexed:!0},{name:"escalationReason",type:"string",isOptional:!0},{name:"mitigationApprovalStatus",type:"string",enum:["not_required","pending","approved","rejected"],isOptional:!0,isIndexed:!0},{name:"mitigationSubmittedAt",type:"string",isOptional:!0,isIndexed:!0},{name:"mitigationReviewedAt",type:"string",isOptional:!0,isIndexed:!0},{name:"mitigationReviewerMemberId",type:"string",isOptional:!0,isIndexed:!0},{name:"mitigationReviewNote",type:"string",isOptional:!0},{name:"nextReviewDate",type:"string",isOptional:!0,isIndexed:!0},{name:"lastReviewedAt",type:"string",isOptional:!0,isIndexed:!0},{name:"notes",type:"string",isOptional:!0},{name:"branchId",type:"string",isOptional:!0,isIndexed:!0},{name:"tenantId",type:"string",isOptional:!0,isIndexed:!0},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]},{name:f.whistleReports,columns:[{name:"id",type:"string"},{name:"incidentDate",type:"string",isOptional:!0,isIndexed:!0},{name:"subject",type:"string"},{name:"description",type:"string"},{name:"channel",type:"string",enum:["web","email","hotline","other"],isIndexed:!0},{name:"isAnonymous",type:"boolean"},{name:"reporterMemberId",type:"string",isOptional:!0,isIndexed:!0},{name:"evidenceRefs",type:"json",isOptional:!0},{name:"slaDueAt",type:"string",isOptional:!0,isIndexed:!0},{name:"escalationLevel",type:"number",isIndexed:!0},{name:"escalatedAt",type:"string",isOptional:!0,isIndexed:!0},{name:"escalationReason",type:"string",isOptional:!0},{name:"investigationStage",type:"string",enum:["intake","preliminary","formal","recommendation"],isOptional:!0,isIndexed:!0},{name:"investigationUpdatedAt",type:"string",isOptional:!0,isIndexed:!0},{name:"investigationNote",type:"string",isOptional:!0},{name:"status",type:"string",enum:["submitted","in_review","resolved","dismissed"],isIndexed:!0},{name:"assignedToMemberId",type:"string",isOptional:!0,isIndexed:!0},{name:"handledByMemberId",type:"string",isOptional:!0,isIndexed:!0},{name:"resolutionSummary",type:"string",isOptional:!0},{name:"resolvedAt",type:"string",isOptional:!0,isIndexed:!0},{name:"branchId",type:"string",isOptional:!0,isIndexed:!0},{name:"tenantId",type:"string",isOptional:!0,isIndexed:!0},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]},{name:f.savingPolicies,columns:[{name:"id",type:"string"},{name:"koperasiId",type:"string",isIndexed:!0},{name:"branchId",type:"string",isOptional:!0,isIndexed:!0},{name:"tenantId",type:"string",isOptional:!0,isIndexed:!0},{name:"simpananPokokNominalIdr",type:"number"},{name:"monthlyWajibNominalIdr",type:"number"},{name:"gracePeriodMonth",type:"number"},{name:"dendaType",type:"string",enum:["fixed","percentage"]},{name:"dendaAmountIdr",type:"number"},{name:"dendaPercentage",type:"number"},{name:"warningAtMonths",type:"number"},{name:"nonaktifAtMonths",type:"number"},{name:"autoSetAnggotaNonaktif",type:"boolean"},{name:"effectiveDate",type:"string",isIndexed:!0},{name:"changeReason",type:"string",isOptional:!0},{name:"approvalRef",type:"string",isOptional:!0},{name:"isSuperseded",type:"boolean",isOptional:!0,isIndexed:!0},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]},{name:f.savingEntries,columns:[{name:"id",type:"string"},{name:"memberId",type:"string",isIndexed:!0},{name:"savingType",type:"string",enum:["pokok","wajib","sukarela"]},{name:"entryType",type:"string",enum:["credit","debit"]},{name:"amount",type:"number"},{name:"transactionDate",type:"string",isIndexed:!0},{name:"referenceType",type:"string",isOptional:!0},{name:"referenceId",type:"string",isOptional:!0},{name:"notes",type:"string",isOptional:!0},{name:"branchId",type:"string",isOptional:!0,isIndexed:!0},{name:"tenantId",type:"string",isOptional:!0,isIndexed:!0},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]},{name:f.shuConfigs,columns:[{name:"id",type:"string"},{name:"koperasiId",type:"string",isIndexed:!0},{name:"tenantId",type:"string",isOptional:!0,isIndexed:!0},{name:"branchId",type:"string",isOptional:!0,isIndexed:!0},{name:"effectiveDate",type:"string"},{name:"cadanganPercent",type:"number"},{name:"jasaUsahaPercent",type:"number"},{name:"jasaModalPercent",type:"number"},{name:"notes",type:"string",isOptional:!0},{name:"approvalRef",type:"string",isOptional:!0},{name:"formulaModel",type:"string",isOptional:!0},{name:"participationWeights",type:"string",isOptional:!0},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]},{name:f.shuPeriods,columns:[{name:"id",type:"string"},{name:"periodCode",type:"string",isIndexed:!0},{name:"startDate",type:"string"},{name:"endDate",type:"string"},{name:"status",type:"string",enum:["draft","finalized"]},{name:"formulaSnapshot",type:"json"},{name:"branchId",type:"string",isOptional:!0,isIndexed:!0},{name:"tenantId",type:"string",isOptional:!0,isIndexed:!0},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]},{name:f.shuAllocations,columns:[{name:"id",type:"string"},{name:"shuPeriodId",type:"string",isIndexed:!0},{name:"memberId",type:"string",isIndexed:!0},{name:"allocationAmount",type:"number"},{name:"calculationBasis",type:"json"},{name:"branchId",type:"string",isOptional:!0,isIndexed:!0},{name:"tenantId",type:"string",isOptional:!0,isIndexed:!0},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]},{name:f.governanceDecisionArchives,columns:[{name:"id",type:"string"},{name:"meetingId",type:"string",isIndexed:!0},{name:"meetingTitle",type:"string"},{name:"meetingDate",type:"string"},{name:"archivedAt",type:"string"},{name:"archivedBy",type:"string",isOptional:!0},{name:"totalItems",type:"number"},{name:"approvedCount",type:"number"},{name:"rejectedCount",type:"number"},{name:"deferredCount",type:"number"},{name:"items",type:"json"},{name:"branchId",type:"string",isOptional:!0,isIndexed:!0},{name:"tenantId",type:"string",isOptional:!0,isIndexed:!0},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]},{name:f.leadershipAppointments,columns:[{name:"id",type:"string"},{name:"proposedMemberId",type:"string",isIndexed:!0},{name:"roleType",type:"string",enum:["pengurus","pengawas"],isIndexed:!0},{name:"positionTitle",type:"string"},{name:"appointmentType",type:"string",enum:["election","replacement","interim","cooptation"],isIndexed:!0},{name:"replacesTermId",type:"string",isOptional:!0,isIndexed:!0},{name:"governanceMeetingRef",type:"string",isOptional:!0,isIndexed:!0},{name:"status",type:"string",enum:["proposed","endorsed","approved","rejected","installed"],isIndexed:!0},{name:"effectiveDate",type:"string",isIndexed:!0},{name:"endDate",type:"string",isOptional:!0},{name:"proposedAt",type:"string",isIndexed:!0},{name:"endorsedAt",type:"string",isOptional:!0},{name:"endorsedBy",type:"string",isOptional:!0},{name:"approvedAt",type:"string",isOptional:!0},{name:"approvalRef",type:"string",isOptional:!0},{name:"installedAt",type:"string",isOptional:!0},{name:"installedTermId",type:"string",isOptional:!0,isIndexed:!0},{name:"rejectedAt",type:"string",isOptional:!0},{name:"rejectionReason",type:"string",isOptional:!0},{name:"notes",type:"string",isOptional:!0},{name:"tenantId",type:"string",isOptional:!0,isIndexed:!0},{name:"branchId",type:"string",isOptional:!0,isIndexed:!0},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]},{name:f.shuParticipationEntries,columns:[{name:"id",type:"string"},{name:"shuPeriodId",type:"string",isIndexed:!0},{name:"memberId",type:"string",isIndexed:!0},{name:"participationType",type:"string",isIndexed:!0},{name:"amount",type:"number"},{name:"notes",type:"string",isOptional:!0},{name:"tenantId",type:"string",isOptional:!0,isIndexed:!0},{name:"branchId",type:"string",isOptional:!0,isIndexed:!0},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]},{name:f.communityProfiles,columns:[{name:"id",type:"string"},{name:"tenantId",type:"string",isIndexed:!0},{name:"branchId",type:"string",isOptional:!0,isIndexed:!0},{name:"profileType",type:"string",isIndexed:!0},{name:"displayName",type:"string"},{name:"description",type:"string",isOptional:!0},{name:"savingRequirements",type:"string",isOptional:!0},{name:"shuRules",type:"string",isOptional:!0},{name:"membershipRequirements",type:"string",isOptional:!0},{name:"governanceRules",type:"string",isOptional:!0},{name:"customFields",type:"string",isOptional:!0},{name:"isActive",type:"boolean",isIndexed:!0},{name:"notes",type:"string",isOptional:!0},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]},{name:f.memberDependents,columns:[{name:"id",type:"string"},{name:"memberId",type:"string",isIndexed:!0},{name:"fullName",type:"string"},{name:"relationship",type:"string",isIndexed:!0},{name:"birthDate",type:"string",isOptional:!0},{name:"idNumber",type:"string",isOptional:!0},{name:"isInsuranceBeneficiary",type:"boolean"},{name:"notes",type:"string",isOptional:!0},{name:"tenantId",type:"string",isOptional:!0,isIndexed:!0},{name:"branchId",type:"string",isOptional:!0,isIndexed:!0},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]},{name:f.users,columns:[{name:"id",type:"string"},{name:"username",type:"string",isIndexed:!0},{name:"role",type:"string"},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]},{name:f.roles,columns:[{name:"id",type:"string"},{name:"name",type:"string",isIndexed:!0},{name:"permissions",type:"string[]"},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]}],rn={version:20,tables:tn};function Ut(){return rn.tables}var _t=[{toVersion:1,up:async r=>{let e=Ut();for(let t of e)try{await r.addTable(t)}catch{}}},{toVersion:2,up:async r=>{let e=[{name:"note",type:"string",isOptional:!0},{name:"simpananPokokReturned",type:"number",isOptional:!0},{name:"simpananWajibReturned",type:"number",isOptional:!0},{name:"simpananSukarelaReturned",type:"number",isOptional:!0},{name:"shuAllocated",type:"number",isOptional:!0},{name:"deductions",type:"number",isOptional:!0},{name:"netSettlementAmount",type:"number",isOptional:!0},{name:"settledBy",type:"string",isOptional:!0},{name:"settledAt",type:"string",isOptional:!0},{name:"settlementNotes",type:"string",isOptional:!0}];for(let t of e)try{await r.addColumn(f.memberExitState,t)}catch{}try{await r.addColumn(f.savingPolicies,{name:"isSuperseded",type:"boolean",isOptional:!0,isIndexed:!0})}catch{}}},{toVersion:3,up:async r=>{try{await r.addTable({name:f.governanceDecisionArchives,columns:[{name:"id",type:"string"},{name:"meetingId",type:"string",isIndexed:!0},{name:"meetingTitle",type:"string"},{name:"meetingDate",type:"string"},{name:"archivedAt",type:"string"},{name:"archivedBy",type:"string",isOptional:!0},{name:"totalItems",type:"number"},{name:"approvedCount",type:"number"},{name:"rejectedCount",type:"number"},{name:"deferredCount",type:"number"},{name:"items",type:"json"},{name:"branchId",type:"string",isOptional:!0,isIndexed:!0},{name:"tenantId",type:"string",isOptional:!0,isIndexed:!0},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]})}catch{}}},{toVersion:4,up:async r=>{let e=[{name:"formulaModel",type:"string",isOptional:!0},{name:"participationWeights",type:"string",isOptional:!0}];for(let t of e)try{await r.addColumn(f.shuConfigs,t)}catch{}try{await r.addTable({name:f.leadershipAppointments,columns:[{name:"id",type:"string"},{name:"proposedMemberId",type:"string",isIndexed:!0},{name:"roleType",type:"string",isIndexed:!0},{name:"positionTitle",type:"string"},{name:"appointmentType",type:"string",isIndexed:!0},{name:"replacesTermId",type:"string",isOptional:!0,isIndexed:!0},{name:"governanceMeetingRef",type:"string",isOptional:!0,isIndexed:!0},{name:"status",type:"string",isIndexed:!0},{name:"effectiveDate",type:"string",isIndexed:!0},{name:"endDate",type:"string",isOptional:!0},{name:"proposedAt",type:"string",isIndexed:!0},{name:"endorsedAt",type:"string",isOptional:!0},{name:"endorsedBy",type:"string",isOptional:!0},{name:"approvedAt",type:"string",isOptional:!0},{name:"approvalRef",type:"string",isOptional:!0},{name:"installedAt",type:"string",isOptional:!0},{name:"installedTermId",type:"string",isOptional:!0,isIndexed:!0},{name:"rejectedAt",type:"string",isOptional:!0},{name:"rejectionReason",type:"string",isOptional:!0},{name:"notes",type:"string",isOptional:!0},{name:"tenantId",type:"string",isOptional:!0,isIndexed:!0},{name:"branchId",type:"string",isOptional:!0,isIndexed:!0},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]})}catch{}}},{toVersion:5,up:async r=>{try{await r.addTable({name:f.shuParticipationEntries,columns:[{name:"id",type:"string"},{name:"shuPeriodId",type:"string",isIndexed:!0},{name:"memberId",type:"string",isIndexed:!0},{name:"participationType",type:"string",isIndexed:!0},{name:"amount",type:"number"},{name:"notes",type:"string",isOptional:!0},{name:"tenantId",type:"string",isOptional:!0,isIndexed:!0},{name:"branchId",type:"string",isOptional:!0,isIndexed:!0},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]})}catch{}try{await r.addTable({name:f.communityProfiles,columns:[{name:"id",type:"string"},{name:"tenantId",type:"string",isIndexed:!0},{name:"branchId",type:"string",isOptional:!0,isIndexed:!0},{name:"profileType",type:"string",isIndexed:!0},{name:"displayName",type:"string"},{name:"description",type:"string",isOptional:!0},{name:"savingRequirements",type:"string",isOptional:!0},{name:"shuRules",type:"string",isOptional:!0},{name:"membershipRequirements",type:"string",isOptional:!0},{name:"governanceRules",type:"string",isOptional:!0},{name:"customFields",type:"string",isOptional:!0},{name:"isActive",type:"boolean",isIndexed:!0},{name:"notes",type:"string",isOptional:!0},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]})}catch{}try{await r.addTable({name:f.memberDependents,columns:[{name:"id",type:"string"},{name:"memberId",type:"string",isIndexed:!0},{name:"fullName",type:"string"},{name:"relationship",type:"string",isIndexed:!0},{name:"birthDate",type:"string",isOptional:!0},{name:"idNumber",type:"string",isOptional:!0},{name:"isInsuranceBeneficiary",type:"boolean"},{name:"notes",type:"string",isOptional:!0},{name:"tenantId",type:"string",isOptional:!0,isIndexed:!0},{name:"branchId",type:"string",isOptional:!0,isIndexed:!0},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]})}catch{}}}];var nn={logInfo(){},logWarn(){},logError(){}};async function Vt(r,e=nn){e.logInfo("[ofcoop] starting database migration process");let t=[..._t].sort((i,o)=>i.toVersion-o.toVersion),n=t.length>0?t[t.length-1].toVersion:0,a=await r.getSchemaVersion();if((a==null||a<0)&&(a=0),a>=n){e.logInfo(`[ofcoop] database already up-to-date at v${a}`);return}for(let i of t)i.toVersion>a&&(e.logInfo(`[ofcoop] applying migration v${i.toVersion}`),await i.up(r),await r.setSchemaVersion(i.toVersion),a=i.toVersion);e.logInfo(`[ofcoop] migration completed at v${a}`)}import{nowIso as ye,toAndFilter as F}from"ofcore";function Be(r,e){return new Date(r).getTime()<=new Date(e).getTime()}var lt=class{constructor(e){this.db=e}async create(e){return this.db.create(f.members,e)}async update(e,t){return this.db.update(f.members,e,t)}async getById(e){return this.db.get(f.members,e)}async list(e){var n,a;let t=[];return e!=null&&e.includeDeleted||t.push({deleted:!1}),e!=null&&e.status&&t.push({status:e.status}),(e==null?void 0:e.tenantId)!==void 0&&t.push({tenantId:(n=e.tenantId)!=null?n:null}),(e==null?void 0:e.branchId)!==void 0&&t.push({branchId:(a=e.branchId)!=null?a:null}),this.db.query(f.members,{filters:F(t),sort:[{field:"lastModified",direction:"desc"}]})}},mt=class{constructor(e){this.db=e}async set(e,t){var i,o,s;let n=await this.get(e),a={id:e,granted:t.granted,source:(i=t.source)!=null?i:null,note:(o=t.note)!=null?o:null,version:((s=n==null?void 0:n.version)!=null?s:0)+1,lastModified:ye(),deleted:!1};return n?this.db.update(f.memberWaConsent,e,a):this.db.create(f.memberWaConsent,a)}async get(e){return this.db.get(f.memberWaConsent,e)}},ut=class{constructor(e){this.db=e}async set(e,t,n){var s,d,c,m,p,u,h,y,I,v,R,C,A,k,M;let a=await this.get(e),i=(s=n.settlement)!=null?s:null,o={id:e,stage:t,reason:(d=n.reason)!=null?d:null,requestedBy:(c=n.requestedBy)!=null?c:null,referenceId:(m=n.referenceId)!=null?m:null,note:(p=n.note)!=null?p:null,simpananPokokReturned:(u=i==null?void 0:i.simpananPokokReturned)!=null?u:null,simpananWajibReturned:(h=i==null?void 0:i.simpananWajibReturned)!=null?h:null,simpananSukarelaReturned:(y=i==null?void 0:i.simpananSukarelaReturned)!=null?y:null,shuAllocated:(I=i==null?void 0:i.shuAllocated)!=null?I:null,deductions:(v=i==null?void 0:i.deductions)!=null?v:null,netSettlementAmount:(R=i==null?void 0:i.netSettlementAmount)!=null?R:null,settledBy:(C=i==null?void 0:i.settledBy)!=null?C:null,settledAt:(A=i==null?void 0:i.settledAt)!=null?A:null,settlementNotes:(k=i==null?void 0:i.notes)!=null?k:null,version:((M=a==null?void 0:a.version)!=null?M:0)+1,lastModified:ye(),deleted:!1};return a?this.db.update(f.memberExitState,e,o):this.db.create(f.memberExitState,o)}async get(e){return this.db.get(f.memberExitState,e)}async getMemberExitState(e){var a,i,o,s,d,c,m,p,u,h,y;let t=await this.get(e);if(!t)return null;let n=t.stage==="settled"&&t.settledBy?{simpananPokokReturned:(a=t.simpananPokokReturned)!=null?a:0,simpananWajibReturned:(i=t.simpananWajibReturned)!=null?i:0,simpananSukarelaReturned:(o=t.simpananSukarelaReturned)!=null?o:0,shuAllocated:(s=t.shuAllocated)!=null?s:0,deductions:(d=t.deductions)!=null?d:0,netSettlementAmount:(c=t.netSettlementAmount)!=null?c:0,settledBy:t.settledBy,settledAt:(m=t.settledAt)!=null?m:t.lastModified,notes:(p=t.settlementNotes)!=null?p:null}:null;return{memberId:t.id,stage:t.stage,reason:(u=t.reason)!=null?u:null,requestedBy:(h=t.requestedBy)!=null?h:null,referenceId:(y=t.referenceId)!=null?y:null,settlement:n,version:t.version,lastModified:t.lastModified}}},pt=class{constructor(e){this.db=e}async upsert(e){return await this.db.get(f.memberNumberPolicies,e.id)?this.db.update(f.memberNumberPolicies,e.id,e):this.db.create(f.memberNumberPolicies,e)}async getActive(e){var a;let t=ye();return(a=(await this.list(e)).filter(i=>Be(i.effectiveDate,t)).sort((i,o)=>o.effectiveDate.localeCompare(i.effectiveDate))[0])!=null?a:null}async list(e){var t,n;return this.db.query(f.memberNumberPolicies,{filters:{and:[{deleted:!1},{koperasiId:e.koperasiId},{tenantId:(t=e.tenantId)!=null?t:null},{branchId:(n=e.branchId)!=null?n:null}]},sort:[{field:"effectiveDate",direction:"desc"}]})}},gt=class{constructor(e){this.db=e}async create(e){return this.db.create(f.governanceMeetings,e)}async update(e,t){return this.db.update(f.governanceMeetings,e,t)}async getById(e){return this.db.get(f.governanceMeetings,e)}async list(e){var n,a;let t=[];return e!=null&&e.includeDeleted||t.push({deleted:!1}),e!=null&&e.status&&t.push({status:e.status}),(e==null?void 0:e.tenantId)!==void 0&&t.push({tenantId:(n=e.tenantId)!=null?n:null}),(e==null?void 0:e.branchId)!==void 0&&t.push({branchId:(a=e.branchId)!=null?a:null}),this.db.query(f.governanceMeetings,{filters:F(t),sort:[{field:"meetingDate",direction:"desc"}]})}},yt=class{constructor(e){this.db=e}async create(e){return this.db.create(f.governanceAgendaItems,e)}async update(e,t){return this.db.update(f.governanceAgendaItems,e,t)}async getById(e){return this.db.get(f.governanceAgendaItems,e)}async listByMeeting(e){return this.db.query(f.governanceAgendaItems,{filters:{and:[{deleted:!1},{meetingId:e}]},sort:[{field:"orderNo",direction:"asc"},{field:"lastModified",direction:"desc"}]})}},ft=class{constructor(e){this.db=e}async create(e){return this.db.create(f.governanceVotes,e)}async update(e,t){return this.db.update(f.governanceVotes,e,t)}async listByAgenda(e){return this.db.query(f.governanceVotes,{filters:{and:[{deleted:!1},{agendaItemId:e}]},sort:[{field:"votedAt",direction:"desc"}]})}async getByAgendaAndMember(e,t){var a;return(a=(await this.db.query(f.governanceVotes,{filters:{and:[{deleted:!1},{agendaItemId:e},{memberId:t}]},sort:[{field:"lastModified",direction:"desc"}],limit:1}))[0])!=null?a:null}},ht=class{constructor(e){this.db=e}async create(e){return this.db.create(f.leadershipTerms,e)}async update(e,t){return this.db.update(f.leadershipTerms,e,t)}async getById(e){return this.db.get(f.leadershipTerms,e)}async list(e){var n,a;let t=[];return e!=null&&e.includeDeleted||t.push({deleted:!1}),e!=null&&e.status&&t.push({status:e.status}),e!=null&&e.roleType&&t.push({roleType:e.roleType}),(e==null?void 0:e.tenantId)!==void 0&&t.push({tenantId:(n=e.tenantId)!=null?n:null}),(e==null?void 0:e.branchId)!==void 0&&t.push({branchId:(a=e.branchId)!=null?a:null}),e!=null&&e.memberId&&t.push({memberId:e.memberId}),this.db.query(f.leadershipTerms,{filters:F(t),sort:[{field:"startDate",direction:"desc"}]})}},bt=class{constructor(e){this.db=e}async create(e){return this.db.create(f.managementReports,e)}async update(e,t){return this.db.update(f.managementReports,e,t)}async getById(e){return this.db.get(f.managementReports,e)}async list(e){var n,a;let t=[];return e!=null&&e.includeDeleted||t.push({deleted:!1}),e!=null&&e.status&&t.push({status:e.status}),e!=null&&e.reportType&&t.push({reportType:e.reportType}),e!=null&&e.periodCode&&t.push({periodCode:e.periodCode}),(e==null?void 0:e.tenantId)!==void 0&&t.push({tenantId:(n=e.tenantId)!=null?n:null}),(e==null?void 0:e.branchId)!==void 0&&t.push({branchId:(a=e.branchId)!=null?a:null}),this.db.query(f.managementReports,{filters:F(t),sort:[{field:"lastModified",direction:"desc"}]})}},vt=class{constructor(e){this.db=e}async upsert(e){return await this.db.get(f.oversightPolicies,e.id)?this.db.update(f.oversightPolicies,e.id,e):this.db.create(f.oversightPolicies,e)}async getActive(e){var a;let t=ye();return(a=(await this.list(e)).filter(i=>Be(i.effectiveDate,t)).sort((i,o)=>o.effectiveDate.localeCompare(i.effectiveDate))[0])!=null?a:null}async list(e){var t,n;return this.db.query(f.oversightPolicies,{filters:{and:[{deleted:!1},{tenantId:(t=e.tenantId)!=null?t:null},{branchId:(n=e.branchId)!=null?n:null}]},sort:[{field:"effectiveDate",direction:"desc"}]})}},It=class{constructor(e){this.db=e}async create(e){return this.db.create(f.riskRegisters,e)}async update(e,t){return this.db.update(f.riskRegisters,e,t)}async getById(e){return this.db.get(f.riskRegisters,e)}async list(e){var n,a;let t=[];return e!=null&&e.includeDeleted||t.push({deleted:!1}),e!=null&&e.status&&t.push({status:e.status}),e!=null&&e.category&&t.push({category:e.category}),(e==null?void 0:e.tenantId)!==void 0&&t.push({tenantId:(n=e.tenantId)!=null?n:null}),(e==null?void 0:e.branchId)!==void 0&&t.push({branchId:(a=e.branchId)!=null?a:null}),this.db.query(f.riskRegisters,{filters:F(t),sort:[{field:"riskScore",direction:"desc"},{field:"lastModified",direction:"desc"}]})}},Rt=class{constructor(e){this.db=e}async create(e){return this.db.create(f.whistleReports,e)}async update(e,t){return this.db.update(f.whistleReports,e,t)}async getById(e){return this.db.get(f.whistleReports,e)}async list(e){var n,a;let t=[];return e!=null&&e.includeDeleted||t.push({deleted:!1}),e!=null&&e.status&&t.push({status:e.status}),e!=null&&e.channel&&t.push({channel:e.channel}),(e==null?void 0:e.tenantId)!==void 0&&t.push({tenantId:(n=e.tenantId)!=null?n:null}),(e==null?void 0:e.branchId)!==void 0&&t.push({branchId:(a=e.branchId)!=null?a:null}),this.db.query(f.whistleReports,{filters:F(t),sort:[{field:"lastModified",direction:"desc"}]})}},St=class{constructor(e){this.db=e}async create(e){return this.db.create(f.savingPolicies,e)}async markSuperseded(e){await this.db.update(f.savingPolicies,e,{isSuperseded:!0,lastModified:ye()})}async getActive(e){var a;let t=ye();return(a=(await this.getPolicyHistory(e)).filter(i=>Be(i.effectiveDate,t)).sort((i,o)=>o.effectiveDate.localeCompare(i.effectiveDate))[0])!=null?a:null}async getPolicyHistory(e){var t,n;return this.db.query(f.savingPolicies,{filters:{and:[{deleted:!1},{koperasiId:e.koperasiId},{tenantId:(t=e.tenantId)!=null?t:null},{branchId:(n=e.branchId)!=null?n:null}]},sort:[{field:"effectiveDate",direction:"desc"}]})}},Ct=class{constructor(e){this.db=e}async create(e){return this.db.create(f.savingEntries,e)}async listByMember(e,t){var a,i;let n=[{memberId:e}];return t!=null&&t.includeDeleted||n.push({deleted:!1}),t!=null&&t.dateFrom&&n.push({field:"transactionDate",operator:">=",value:t.dateFrom}),t!=null&&t.dateTo&&n.push({field:"transactionDate",operator:"<=",value:t.dateTo}),(t==null?void 0:t.tenantId)!==void 0&&n.push({tenantId:(a=t.tenantId)!=null?a:null}),(t==null?void 0:t.branchId)!==void 0&&n.push({branchId:(i=t.branchId)!=null?i:null}),this.db.query(f.savingEntries,{filters:F(n),sort:[{field:"transactionDate",direction:"desc"}]})}async listAll(e){var n,a;let t=[];return e!=null&&e.includeDeleted||t.push({deleted:!1}),e!=null&&e.dateFrom&&t.push({field:"transactionDate",operator:">=",value:e.dateFrom}),e!=null&&e.dateTo&&t.push({field:"transactionDate",operator:"<=",value:e.dateTo}),(e==null?void 0:e.tenantId)!==void 0&&t.push({tenantId:(n=e.tenantId)!=null?n:null}),(e==null?void 0:e.branchId)!==void 0&&t.push({branchId:(a=e.branchId)!=null?a:null}),this.db.query(f.savingEntries,{filters:F(t),sort:[{field:"transactionDate",direction:"desc"}]})}async findByReference(e){var a,i,o;let t=[{deleted:!1},{memberId:e.memberId},{savingType:e.savingType},{entryType:e.entryType},{referenceType:e.referenceType},{referenceId:e.referenceId}];return e.tenantId!==void 0&&t.push({tenantId:(a=e.tenantId)!=null?a:null}),e.branchId!==void 0&&t.push({branchId:(i=e.branchId)!=null?i:null}),(o=(await this.db.query(f.savingEntries,{filters:F(t),sort:[{field:"lastModified",direction:"desc"}],limit:1}))[0])!=null?o:null}},wt=class{constructor(e){this.db=e}async upsert(e){return await this.db.get(f.shuConfigs,e.id)?this.db.update(f.shuConfigs,e.id,e):this.db.create(f.shuConfigs,e)}async getActive(e){var a;let t=ye();return(a=(await this.list(e)).filter(i=>Be(i.effectiveDate,t)).sort((i,o)=>o.effectiveDate.localeCompare(i.effectiveDate))[0])!=null?a:null}async list(e,t){var a,i;let n=[{koperasiId:e.koperasiId},{tenantId:(a=e.tenantId)!=null?a:null},{branchId:(i=e.branchId)!=null?i:null}];return t!=null&&t.includeDeleted||n.push({deleted:!1}),this.db.query(f.shuConfigs,{filters:F(n),sort:[{field:"effectiveDate",direction:"desc"}]})}},At=class{constructor(e){this.db=e}async create(e){return this.db.create(f.shuPeriods,e)}async update(e,t){return this.db.update(f.shuPeriods,e,t)}async getById(e){return this.db.get(f.shuPeriods,e)}async list(e){var n,a;let t=[];return e!=null&&e.includeDeleted||t.push({deleted:!1}),(e==null?void 0:e.tenantId)!==void 0&&t.push({tenantId:(n=e.tenantId)!=null?n:null}),(e==null?void 0:e.branchId)!==void 0&&t.push({branchId:(a=e.branchId)!=null?a:null}),this.db.query(f.shuPeriods,{filters:F(t),sort:[{field:"lastModified",direction:"desc"}]})}},Pt=class{constructor(e){this.db=e}async createMany(e){return e.length===0?[]:this.db.bulkCreate(f.shuAllocations,e)}async listByPeriod(e,t){let n=[{shuPeriodId:e}];return t!=null&&t.includeDeleted||n.push({deleted:!1}),t!=null&&t.memberId&&n.push({memberId:t.memberId}),this.db.query(f.shuAllocations,{filters:F(n),sort:[{field:"lastModified",direction:"desc"}]})}},Mt=class{constructor(e){this.db=e}async create(e){return this.db.create(f.governanceDecisionArchives,e)}async getByMeeting(e){var n;return(n=(await this.db.query(f.governanceDecisionArchives,{filters:{and:[{deleted:!1},{meetingId:e}]},sort:[{field:"archivedAt",direction:"desc"}],limit:1}))[0])!=null?n:null}},kt=class{constructor(e){this.db=e}async create(e){return this.db.create(f.leadershipAppointments,e)}async update(e,t){return this.db.update(f.leadershipAppointments,e,t)}async getById(e){return this.db.get(f.leadershipAppointments,e)}async list(e){var n,a;let t=[];return e!=null&&e.includeDeleted||t.push({deleted:!1}),e!=null&&e.status&&t.push({status:e.status}),e!=null&&e.roleType&&t.push({roleType:e.roleType}),(e==null?void 0:e.tenantId)!==void 0&&t.push({tenantId:(n=e.tenantId)!=null?n:null}),(e==null?void 0:e.branchId)!==void 0&&t.push({branchId:(a=e.branchId)!=null?a:null}),this.db.query(f.leadershipAppointments,{filters:F(t),sort:[{field:"proposedAt",direction:"desc"}]})}},Dt=class{constructor(e){this.db=e}async create(e){return this.db.create(f.shuParticipationEntries,e)}async createMany(e){return e.length===0?[]:this.db.bulkCreate(f.shuParticipationEntries,e)}async listByPeriod(e,t){var a,i;let n=[{shuPeriodId:e}];return t!=null&&t.includeDeleted||n.push({deleted:!1}),t!=null&&t.memberId&&n.push({memberId:t.memberId}),t!=null&&t.participationType&&n.push({participationType:t.participationType}),(t==null?void 0:t.tenantId)!==void 0&&n.push({tenantId:(a=t.tenantId)!=null?a:null}),(t==null?void 0:t.branchId)!==void 0&&n.push({branchId:(i=t.branchId)!=null?i:null}),this.db.query(f.shuParticipationEntries,{filters:F(n),sort:[{field:"lastModified",direction:"desc"}]})}},Tt=class{constructor(e){this.db=e}async create(e){return this.db.create(f.communityProfiles,e)}async update(e,t){return this.db.update(f.communityProfiles,e,t)}async getById(e){return this.db.get(f.communityProfiles,e)}async list(e){var n,a;let t=[];return e!=null&&e.includeDeleted||t.push({deleted:!1}),e!=null&&e.profileType&&t.push({profileType:e.profileType}),(e==null?void 0:e.isActive)!==void 0&&t.push({isActive:e.isActive}),(e==null?void 0:e.tenantId)!==void 0&&t.push({tenantId:(n=e.tenantId)!=null?n:null}),(e==null?void 0:e.branchId)!==void 0&&t.push({branchId:(a=e.branchId)!=null?a:null}),this.db.query(f.communityProfiles,{filters:F(t),sort:[{field:"lastModified",direction:"desc"}]})}},xt=class{constructor(e){this.db=e}async create(e){return this.db.create(f.memberDependents,e)}async update(e,t){return this.db.update(f.memberDependents,e,t)}async getById(e){return this.db.get(f.memberDependents,e)}async listByMember(e,t){var a,i;let n=[{memberId:e}];return t!=null&&t.includeDeleted||n.push({deleted:!1}),t!=null&&t.relationship&&n.push({relationship:t.relationship}),(t==null?void 0:t.tenantId)!==void 0&&n.push({tenantId:(a=t.tenantId)!=null?a:null}),(t==null?void 0:t.branchId)!==void 0&&n.push({branchId:(i=t.branchId)!=null?i:null}),this.db.query(f.memberDependents,{filters:F(n),sort:[{field:"lastModified",direction:"desc"}]})}};function te(r){return{memberRepository:new lt(r),memberWaConsentRepository:new mt(r),memberExitStateRepository:new ut(r),memberNumberPolicyRepository:new pt(r),governanceMeetingRepository:new gt(r),governanceAgendaRepository:new yt(r),governanceVoteRepository:new ft(r),governanceDecisionArchiveRepository:new Mt(r),leadershipTermRepository:new ht(r),managementReportRepository:new bt(r),oversightPolicyRepository:new vt(r),riskRegisterRepository:new It(r),whistleReportRepository:new Rt(r),savingPolicyRepository:new St(r),savingLedgerRepository:new Ct(r),shuConfigRepository:new wt(r),shuPeriodRepository:new At(r),shuAllocationRepository:new Pt(r),leadershipAppointmentRepository:new kt(r),shuParticipationEntryRepository:new Dt(r),communityProfileRepository:new Tt(r),memberDependentRepository:new xt(r)}}var Me=class extends Error{constructor(t,n){super(n);this.code=t;this.name="OfcoopDomainError"}};function w(r,e){return new Me("RESOURCE_NOT_FOUND",`${r} not found: ${e}`)}function U(r){return new Me("CONFLICT",r)}function l(r){return new Me("INVALID_STATE",r)}function Gt(r){var e,t,n;if(!((e=r.koperasiId)!=null&&e.trim()))throw l("koperasiId is required");if(!((t=r.tenantId)!=null&&t.trim()))throw l("tenantId is required");if(!((n=r.effectiveDate)!=null&&n.trim()))throw l("effectiveDate is required");if(r.paddingDigits<1)throw l("paddingDigits must be >= 1");if(r.counterStart<0)throw l("counterStart must be >= 0");if(r.includeMonth&&!r.includeYear)throw l("includeMonth requires includeYear")}import{cloneValue as an,makeIdFactory as on,nowIso as sn,unwrap as P}from"ofcore";function g(){return sn()}function D(r){return on(r)}function je(r){return an(r)}async function S(r,e){var t;if(r.emitEvent)try{await r.emitEvent(e)}catch(n){(t=r.logger)==null||t.logError(n,{message:"[ofcoop] domain event sink failed",eventName:e.name})}}async function b(r){try{return{data:await r}}catch(e){return{error:{code:e.code||"INTERNAL_ERROR",message:e.message||"An unexpected error occurred",timestamp:g()}}}}var Ne=class{constructor(e){this.repos=e;this.newId=D("member-number-policy")}async getActiveMemberNumberPolicy(e){return b(this.repos.memberNumberPolicyRepository.getActive(e))}async upsertMemberNumberPolicy(e){return b((async()=>{var i;Gt(e);let t={koperasiId:e.koperasiId,tenantId:e.tenantId,branchId:e.branchId},n=await this.repos.memberNumberPolicyRepository.getActive(t),a=g();return n?this.repos.memberNumberPolicyRepository.upsert({...n,...e,version:n.version+1,lastModified:a}):this.repos.memberNumberPolicyRepository.upsert({id:this.newId(),...e,approvalRef:(i=e.approvalRef)!=null?i:null,version:1,lastModified:a,deleted:!1})})())}};function $t(r){var e,t,n,a;if(!((e=r.memberNumber)!=null&&e.trim()))throw l("memberNumber is required");if(!((t=r.fullName)!=null&&t.trim()))throw l("fullName is required");if(!((n=r.joinDate)!=null&&n.trim()))throw l("joinDate is required");if(!((a=r.tenantId)!=null&&a.trim()))throw l("tenantId is required")}function qe(r){var e;if(!((e=r.reason)!=null&&e.trim()))throw l("member exit reason is required")}var We=class{constructor(e,t,n={}){this.db=e;this.repos=t;this.options=n;this.newId=D("member")}async inTx(e){return this.db.transaction(async t=>e(te(t)))}async createMember(e){return b((async()=>{var a;if($t(e),(await this.repos.memberRepository.list({tenantId:e.tenantId})).some(i=>i.memberNumber===e.memberNumber&&!i.deleted))throw U(`Member number already exists: ${e.memberNumber}`);let n=await this.repos.memberRepository.create({id:this.newId(),memberNumber:e.memberNumber,fullName:e.fullName,status:"active",joinDate:e.joinDate,exitDate:null,branchId:e.branchId,tenantId:e.tenantId,version:1,lastModified:g(),deleted:!1});return(a=this.options.logger)==null||a.logInfo("[ofcoop] member created",{memberId:n.id,tenantId:n.tenantId,branchId:n.branchId}),await S(this.options,{name:"member.created",occurredAt:g(),entityId:n.id,tenantId:n.tenantId,branchId:n.branchId,payload:{memberNumber:n.memberNumber}}),n})())}async updateMember(e,t){return b((async()=>{var i,o,s;let n=await this.repos.memberRepository.getById(e);if(!n||n.deleted)throw w("Member",e);let a=await this.repos.memberRepository.update(e,{...t.fullName!==void 0?{fullName:t.fullName}:{},...t.memberNumber!==void 0?{memberNumber:t.memberNumber}:{},version:n.version+1,lastModified:g()});return(i=this.options.logger)==null||i.logInfo("[ofcoop] member updated",{memberId:e}),await S(this.options,{name:"member.updated",occurredAt:g(),entityId:a.id,tenantId:(o=a.tenantId)!=null?o:null,branchId:(s=a.branchId)!=null?s:null,payload:{memberNumber:a.memberNumber}}),a})())}async getMemberById(e){return b((async()=>{let t=await this.repos.memberRepository.getById(e);return!t||t.deleted?null:t})())}async listMembers(e){return b(this.repos.memberRepository.list(e))}async changeMemberStatus(e,t){return b((async()=>{let n=await this.repos.memberRepository.getById(e);if(!n||n.deleted)throw w("Member",e);return this.repos.memberRepository.update(e,{status:t,version:n.version+1,lastModified:g()})})())}async setMemberWaConsent(e,t){return b(this.inTx(async n=>{let a=await n.memberRepository.getById(e);if(!a||a.deleted)throw w("Member",e);return await n.memberWaConsentRepository.set(e,t),n.memberRepository.update(e,{version:a.version+1,lastModified:g()})}))}async requestMemberExit(e,t){return b(this.inTx(async n=>{var s,d,c;qe(t);let a=await n.memberRepository.getById(e);if(!a||a.deleted)throw w("Member",e);if(a.status==="exited")throw U("cannot request exit for exited member");let i=await n.memberExitStateRepository.get(e);if((i==null?void 0:i.stage)==="requested")throw U("member exit already requested");await n.memberExitStateRepository.set(e,"requested",t);let o=await n.memberRepository.update(e,{status:"inactive",version:a.version+1,lastModified:g()});return await S(this.options,{name:"member.exit-requested",occurredAt:g(),entityId:e,tenantId:(s=a.tenantId)!=null?s:null,branchId:(d=a.branchId)!=null?d:null,payload:{reason:(c=t.reason)!=null?c:null}}),o}))}async settleMemberExit(e,t){return b(this.inTx(async n=>{var s,d;if(this.options.hasActiveLoan&&await this.options.hasActiveLoan(e))throw l(`Member ${e} masih memiliki pinjaman aktif; selesaikan pinjaman sebelum exit.`);qe(t);let a=await n.memberRepository.getById(e);if(!a||a.deleted)throw w("Member",e);let i=await n.memberExitStateRepository.get(e);if(!i||i.stage!=="requested")throw l(`Member ${e} belum dalam status exit-requested; tidak bisa di-settle.`);await n.memberExitStateRepository.set(e,"settled",t);let o=await n.memberRepository.update(e,{status:"exited",exitDate:g(),version:a.version+1,lastModified:g()});return await S(this.options,{name:"member.exit-settled",occurredAt:g(),entityId:e,tenantId:(s=a.tenantId)!=null?s:null,branchId:(d=a.branchId)!=null?d:null,payload:{netSettlementAmount:t.settlement.netSettlementAmount,settledBy:t.settlement.settledBy}}),o}))}async cancelMemberExit(e,t){return b(this.inTx(async n=>{var s,d,c;qe(t);let a=await n.memberRepository.getById(e);if(!a||a.deleted)throw w("Member",e);let i=await n.memberExitStateRepository.get(e);if(!i||i.stage!=="requested")throw U("member exit can only be canceled from requested stage");await n.memberExitStateRepository.set(e,"canceled",t);let o=await n.memberRepository.update(e,{status:"active",exitDate:null,version:a.version+1,lastModified:g()});return await S(this.options,{name:"member.exit-canceled",occurredAt:g(),entityId:e,tenantId:(s=a.tenantId)!=null?s:null,branchId:(d=a.branchId)!=null?d:null,payload:{reason:(c=t.reason)!=null?c:null}}),o}))}async getMemberExitState(e){return b(this.repos.memberExitStateRepository.getMemberExitState(e))}};function Ht(r){var e,t;if(!((e=r.tenantId)!=null&&e.trim()))throw l("tenantId is required");if(!((t=r.regulator)!=null&&t.trim()))throw l("regulator is required")}function dn(r){return r==="pass"?1:r==="warn"?.5:0}function cn(r){return r>=80?"ready":r>=50?"partial":"not_ready"}var Fe=class{constructor(e){this.deps=e}async getComplianceReadinessSnapshot(e){return b((async()=>{var q,L;Ht(e);let t={tenantId:e.tenantId,branchId:e.branchId,periodCode:e.periodCode},[n,a,i,o,s]=await Promise.all([this.deps.leadershipTermService.listLeadershipTerms({status:"active",roleType:"pengurus",tenantId:t.tenantId,branchId:t.branchId}),this.deps.leadershipTermService.listLeadershipTerms({status:"active",roleType:"pengawas",tenantId:t.tenantId,branchId:t.branchId}),this.deps.managementReportService.listManagementReports({status:"approved",periodCode:(q=t.periodCode)!=null?q:void 0,tenantId:t.tenantId,branchId:t.branchId}),this.deps.riskRegisterService.listRiskItems({status:"open",tenantId:t.tenantId,branchId:t.branchId}),this.deps.whistleReportService.listWhistleReports({status:"in_review",tenantId:t.tenantId,branchId:t.branchId})]),d=P(n),c=P(a),m=P(i),p=P(o),u=P(s),h=[],y=d.length>0&&c.length>0;h.push({id:"governance.active-roles",label:"Ketersediaan Pengurus dan Pengawas Aktif",status:y?"pass":"fail",detail:y?"Pengurus dan pengawas aktif tersedia.":"Belum ada pengurus/pengawas aktif yang lengkap.",meta:{activePengurus:d.length,activePengawas:c.length}});let I=m.some(N=>N.reportType==="lpj_pengurus"),v=m.some(N=>N.reportType==="lpj_pengawas"),R=I&&v?"pass":I||v?"warn":"fail";h.push({id:"report.approved-both-roles",label:"LPJ Disetujui (Pengurus + Pengawas)",status:R,detail:R==="pass"?"LPJ pengurus dan pengawas sudah disetujui.":R==="warn"?"Baru salah satu LPJ (pengurus/pengawas) yang disetujui.":"Belum ada LPJ disetujui untuk pengurus/pengawas.",meta:{hasPengurusReport:I,hasPengawasReport:v,periodCode:(L=t.periodCode)!=null?L:null}});let A=(await Promise.all(m.map(async N=>({reportId:N.id,reportType:N.reportType,completeness:P(await this.deps.managementReportService.evaluateManagementReportCompleteness(N.id,e.regulator))})))).filter(N=>N.completeness&&!N.completeness.isComplete),k=m.length===0?"fail":A.length===0?"pass":"warn";h.push({id:"report.completeness",label:`Kelengkapan Paket Laporan (${e.regulator})`,status:k,detail:k==="pass"?"Semua LPJ disetujui sudah memenuhi checklist kelengkapan.":k==="warn"?"Masih ada LPJ disetujui yang belum lengkap field wajib.":"Belum ada LPJ disetujui untuk dievaluasi kelengkapannya.",meta:{regulator:e.regulator,approvedReportCount:m.length,incompleteCount:A.length}});let M=await this.deps.riskRegisterService.listRiskItems({tenantId:t.tenantId,branchId:t.branchId}),T=P(M).filter(N=>{var V;return((V=N.escalationLevel)!=null?V:0)>0&&N.status!=="closed"});h.push({id:"risk.open-escalated",label:"Risiko Tereskalasi Terbuka",status:T.length===0?"pass":"warn",detail:T.length===0?"Tidak ada risiko tereskalasi yang masih terbuka.":`${T.length} risiko tereskalasi masih terbuka.`,meta:{openRiskCount:p.length,escalatedOpenRiskCount:T.length}}),h.push({id:"whistle.in-review",label:"Kasus Whistle Sedang Investigasi",status:u.length===0?"pass":"warn",detail:u.length===0?"Tidak ada kasus whistle yang masih in_review.":`${u.length} kasus whistle masih in_review.`,meta:{inReviewWhistleCount:u.length}});let j=h.reduce((N,V)=>N+dn(V.status),0)/h.length,B=Math.round(j*100);return{generatedAt:g(),scope:{tenantId:t.tenantId,branchId:t.branchId,periodCode:t.periodCode},summary:{score:B,status:cn(B),regulator:e.regulator},checks:h}})())}};function Qt(r){var e,t,n;if(!((e=r.title)!=null&&e.trim()))throw l("meeting title is required");if(!((t=r.meetingDate)!=null&&t.trim()))throw l("meetingDate is required");if(!((n=r.tenantId)!=null&&n.trim()))throw l("tenantId is required");if(!Number.isFinite(r.quorumPercent)||r.quorumPercent<=0||r.quorumPercent>100)throw l("quorumPercent must be between 1 and 100");if(r.eligibleMemberIds!==void 0&&r.eligibleMemberIds!==null){if(!Array.isArray(r.eligibleMemberIds))throw l("eligibleMemberIds must be an array when provided");let a=r.eligibleMemberIds.map(i=>typeof i=="string"?i.trim():"");if(a.some(i=>!i))throw l("eligibleMemberIds cannot contain empty memberId");if(new Set(a).size!==a.length)throw l("eligibleMemberIds must not contain duplicate memberId")}}function Kt(r){var e;if(!((e=r.title)!=null&&e.trim()))throw l("agenda title is required");if(!Number.isInteger(r.orderNo)||r.orderNo<=0)throw l("agenda orderNo must be a positive integer")}function Jt(r){var e,t,n;if(!((e=r.agendaItemId)!=null&&e.trim()))throw l("agendaItemId is required");if(!((t=r.memberId)!=null&&t.trim()))throw l("memberId is required");if(!((n=r.votedAt)!=null&&n.trim()))throw l("votedAt is required")}function zt(r){var e;if(!((e=r.minutes)!=null&&e.trim()))throw l("minutes is required")}function Yt(r){var t,n,a;if(!(!!((t=r.minutesArtifactRef)!=null&&t.trim())||!!((n=r.attendanceArtifactRef)!=null&&n.trim())||!!((a=r.ratDecisionBundleRef)!=null&&a.trim())))throw l("at least one meeting artifact reference is required")}function Zt(r){var t,n,a,i;if(!((t=r.status)!=null&&t.trim()))throw l("agenda close status is required");if(r.status==="approved"||r.status==="rejected"){if(!((n=r.decisionArtifactRef)!=null&&n.trim()))throw l("decisionArtifactRef is required when agenda status is approved/rejected");if(!((a=r.decidedAt)!=null&&a.trim()))throw l("decidedAt is required when agenda status is approved/rejected");if(!((i=r.decidedByMemberId)!=null&&i.trim()))throw l("decidedByMemberId is required when agenda status is approved/rejected")}}var Ue=class{constructor(e,t,n={}){this.db=e;this.repos=t;this.options=n;this.newMeetingId=D("gov-meeting");this.newAgendaId=D("gov-agenda");this.newVoteId=D("gov-vote");this.newArchiveId=D("gov-archive")}async inTx(e){return this.db.transaction(async t=>e(te(t)))}async createMeeting(e){return b((async()=>{var a,i;Qt(e);let t=e.eligibleMemberIds&&e.eligibleMemberIds.length>0?[...new Set(e.eligibleMemberIds.map(o=>o.trim()))]:null,n=await this.repos.governanceMeetingRepository.create({id:this.newMeetingId(),title:e.title.trim(),meetingDate:e.meetingDate,status:"draft",quorumPercent:e.quorumPercent,eligibleMemberIds:t,notes:(a=e.notes)!=null?a:null,minutes:null,decisionSummary:null,minutesArtifactRef:null,attendanceArtifactRef:null,ratDecisionBundleRef:null,chairpersonMemberId:null,secretaryMemberId:null,branchId:e.branchId,tenantId:e.tenantId,version:1,lastModified:g(),deleted:!1});return(i=this.options.logger)==null||i.logInfo("[ofcoop] governance meeting created",{meetingId:n.id,tenantId:n.tenantId,branchId:n.branchId}),await S(this.options,{name:"governance.meeting-created",occurredAt:g(),entityId:n.id,tenantId:n.tenantId,branchId:n.branchId,payload:{title:n.title,status:n.status}}),n})())}async getMeetingById(e){return b((async()=>{let t=await this.repos.governanceMeetingRepository.getById(e);return!t||t.deleted?null:t})())}async listMeetings(e){return b(this.repos.governanceMeetingRepository.list(e))}async addAgendaItem(e,t){return b((async()=>{var i;Kt(t);let n=await this.repos.governanceMeetingRepository.getById(e);if(!n||n.deleted)throw w("GovernanceMeeting",e);if(n.status==="closed")throw l("Cannot add agenda item to a closed meeting");let a=await this.repos.governanceAgendaRepository.create({id:this.newAgendaId(),meetingId:e,title:t.title.trim(),description:(i=t.description)!=null?i:null,orderNo:t.orderNo,status:"open",decisionArtifactRef:null,decisionNumber:null,decidedAt:null,decidedByMemberId:null,decisionNote:null,branchId:n.branchId,tenantId:n.tenantId,version:1,lastModified:g(),deleted:!1});return await S(this.options,{name:"governance.agenda-created",occurredAt:g(),entityId:a.id,tenantId:a.tenantId,branchId:a.branchId,payload:{meetingId:e,orderNo:a.orderNo}}),a})())}async listAgendaItems(e){return b(this.repos.governanceAgendaRepository.listByMeeting(e))}async startVoting(e){return b((async()=>{let t=await this.repos.governanceMeetingRepository.getById(e);if(!t||t.deleted)throw w("GovernanceMeeting",e);if(t.status==="closed")throw l("Cannot start voting on closed meeting");let n=await this.repos.governanceMeetingRepository.update(e,{status:"voting",version:t.version+1,lastModified:g()});return await S(this.options,{name:"governance.meeting-voting-started",occurredAt:g(),entityId:n.id,tenantId:n.tenantId,branchId:n.branchId,payload:{status:n.status}}),n})())}async recordVote(e,t){return b(this.inTx(async n=>{var c,m;Jt(t);let a=await n.governanceMeetingRepository.getById(e);if(!a||a.deleted)throw w("GovernanceMeeting",e);if(a.status!=="voting")throw l("Voting is only allowed when meeting status is voting");let i=await n.governanceAgendaRepository.getById(t.agendaItemId);if(!i||i.deleted)throw w("GovernanceAgendaItem",t.agendaItemId);if(i.meetingId!==e)throw U("Agenda item does not belong to the target meeting");if(i.status!=="open")throw l("Voting is only allowed for open agenda item");let o=await n.memberRepository.getById(t.memberId);if(!o||o.deleted)throw w("Member",t.memberId);if(o.status!=="active")throw l("Only active member can vote");if(a.eligibleMemberIds&&a.eligibleMemberIds.length>0&&!a.eligibleMemberIds.includes(t.memberId))throw l("Member is not eligible to vote in this meeting");let s=await n.governanceVoteRepository.getByAgendaAndMember(t.agendaItemId,t.memberId);if(s&&!s.deleted)return n.governanceVoteRepository.update(s.id,{choice:t.choice,votedAt:t.votedAt,notes:(c=t.notes)!=null?c:null,version:s.version+1,lastModified:g()});let d=await n.governanceVoteRepository.create({id:this.newVoteId(),meetingId:e,agendaItemId:t.agendaItemId,memberId:t.memberId,choice:t.choice,votedAt:t.votedAt,notes:(m=t.notes)!=null?m:null,branchId:a.branchId,tenantId:a.tenantId,version:1,lastModified:g(),deleted:!1});return await S(this.options,{name:"governance.vote-recorded",occurredAt:g(),entityId:d.id,tenantId:d.tenantId,branchId:d.branchId,payload:{meetingId:e,agendaItemId:d.agendaItemId,memberId:d.memberId,choice:d.choice}}),d}))}async getAgendaVoteSummary(e){return b((async()=>{let t=await this.repos.governanceAgendaRepository.getById(e);if(!t||t.deleted)throw w("GovernanceAgendaItem",e);let n=await this.repos.governanceMeetingRepository.getById(t.meetingId);if(!n||n.deleted)throw w("GovernanceMeeting",t.meetingId);let a=await this.repos.governanceVoteRepository.listByAgenda(e),i=await this.repos.memberRepository.list({status:"active",tenantId:n.tenantId,branchId:n.branchId}),s=(n.eligibleMemberIds&&n.eligibleMemberIds.length>0?i.filter(p=>{var u;return(u=n.eligibleMemberIds)==null?void 0:u.includes(p.id)}):i).length,d=n.eligibleMemberIds&&n.eligibleMemberIds.length>0?"meeting-eligible-members":"active-members",c=s>0&&a.length/s*100>=n.quorumPercent,m={agendaItemId:e,totalVotes:a.length,eligibleVoters:s,eligibleVotersSource:d,quorumPercent:n.quorumPercent,quorumReached:c,yes:0,no:0,abstain:0};for(let p of a)p.choice==="yes"&&(m.yes+=1),p.choice==="no"&&(m.no+=1),p.choice==="abstain"&&(m.abstain+=1);return m})())}async closeAgendaItem(e,t){return b((async()=>{var s,d,c,m,p,u,h,y,I,v,R,C;Zt(t);let n=await this.repos.governanceAgendaRepository.getById(e);if(!n||n.deleted)throw w("GovernanceAgendaItem",e);let a=await this.repos.governanceMeetingRepository.getById(n.meetingId);if(!a||a.deleted)throw w("GovernanceMeeting",n.meetingId);let i=P(await this.getAgendaVoteSummary(e));if(!i.quorumReached&&t.status!=="deferred")throw l(`Cannot close agenda as ${t.status} because quorum is not reached (${i.totalVotes}/${i.eligibleVoters})`);if(t.status==="approved"&&i.yes<=i.no)throw l("Cannot close agenda as approved when yes votes are not greater than no votes");if(t.status==="rejected"&&i.no<i.yes)throw l("Cannot close agenda as rejected when no votes are lower than yes votes");if((s=t.decidedByMemberId)!=null&&s.trim()){let A=await this.repos.memberRepository.getById(t.decidedByMemberId.trim());if(!A||A.deleted)throw w("Member",t.decidedByMemberId.trim());if(A.status!=="active")throw l("decidedByMemberId must refer to active member")}let o=await this.repos.governanceAgendaRepository.update(e,{status:t.status,decisionArtifactRef:t.decisionArtifactRef===void 0?(d=n.decisionArtifactRef)!=null?d:null:((c=t.decisionArtifactRef)==null?void 0:c.trim())||null,decisionNumber:t.decisionNumber===void 0?(m=n.decisionNumber)!=null?m:null:((p=t.decisionNumber)==null?void 0:p.trim())||null,decidedAt:t.decidedAt===void 0?(u=n.decidedAt)!=null?u:null:t.decidedAt,decidedByMemberId:t.decidedByMemberId===void 0?(h=n.decidedByMemberId)!=null?h:null:((y=t.decidedByMemberId)==null?void 0:y.trim())||null,decisionNote:t.decisionNote===void 0?(I=n.decisionNote)!=null?I:null:(v=t.decisionNote)!=null?v:null,version:n.version+1,lastModified:g()});return await S(this.options,{name:"governance.agenda-closed",occurredAt:g(),entityId:o.id,tenantId:o.tenantId,branchId:o.branchId,payload:{status:o.status,meetingId:o.meetingId,decisionArtifactRef:(R=o.decisionArtifactRef)!=null?R:null,decidedAt:(C=o.decidedAt)!=null?C:null}}),o})())}async closeMeeting(e){return b((async()=>{let t=await this.repos.governanceMeetingRepository.getById(e);if(!t||t.deleted)throw w("GovernanceMeeting",e);let n=await this.repos.governanceMeetingRepository.update(e,{status:"closed",version:t.version+1,lastModified:g()});return await S(this.options,{name:"governance.meeting-closed",occurredAt:g(),entityId:n.id,tenantId:n.tenantId,branchId:n.branchId,payload:{status:n.status}}),n})())}async recordMeetingMinutes(e,t){return b((async()=>{var i;zt(t);let n=await this.repos.governanceMeetingRepository.getById(e);if(!n||n.deleted)throw w("GovernanceMeeting",e);if(n.status!=="closed")throw l("Meeting minutes can only be recorded after meeting is closed");let a=await this.repos.governanceMeetingRepository.update(e,{minutes:t.minutes.trim(),decisionSummary:((i=t.decisionSummary)==null?void 0:i.trim())||null,version:n.version+1,lastModified:g()});return await S(this.options,{name:"governance.meeting-minutes-recorded",occurredAt:g(),entityId:a.id,tenantId:a.tenantId,branchId:a.branchId,payload:{hasDecisionSummary:!!a.decisionSummary}}),a})())}async recordMeetingArtifacts(e,t){return b((async()=>{var i,o,s,d,c,m,p,u,h,y,I,v,R,C,A,k;Yt(t);let n=await this.repos.governanceMeetingRepository.getById(e);if(!n||n.deleted)throw w("GovernanceMeeting",e);if(n.status!=="closed")throw l("Meeting artifacts can only be recorded after meeting is closed");if(!((i=n.minutes)!=null&&i.trim()))throw l("Meeting artifacts require minutes to be recorded first");if((o=t.chairpersonMemberId)!=null&&o.trim()){let M=await this.repos.memberRepository.getById(t.chairpersonMemberId.trim());if(!M||M.deleted)throw w("Member",t.chairpersonMemberId.trim());if(M.status!=="active")throw l("chairpersonMemberId must refer to active member")}if((s=t.secretaryMemberId)!=null&&s.trim()){let M=await this.repos.memberRepository.getById(t.secretaryMemberId.trim());if(!M||M.deleted)throw w("Member",t.secretaryMemberId.trim());if(M.status!=="active")throw l("secretaryMemberId must refer to active member")}let a=await this.repos.governanceMeetingRepository.update(e,{minutesArtifactRef:t.minutesArtifactRef===void 0?(d=n.minutesArtifactRef)!=null?d:null:((c=t.minutesArtifactRef)==null?void 0:c.trim())||null,attendanceArtifactRef:t.attendanceArtifactRef===void 0?(m=n.attendanceArtifactRef)!=null?m:null:((p=t.attendanceArtifactRef)==null?void 0:p.trim())||null,ratDecisionBundleRef:t.ratDecisionBundleRef===void 0?(u=n.ratDecisionBundleRef)!=null?u:null:((h=t.ratDecisionBundleRef)==null?void 0:h.trim())||null,chairpersonMemberId:t.chairpersonMemberId===void 0?(y=n.chairpersonMemberId)!=null?y:null:((I=t.chairpersonMemberId)==null?void 0:I.trim())||null,secretaryMemberId:t.secretaryMemberId===void 0?(v=n.secretaryMemberId)!=null?v:null:((R=t.secretaryMemberId)==null?void 0:R.trim())||null,version:n.version+1,lastModified:g()});return await S(this.options,{name:"governance.meeting-artifacts-recorded",occurredAt:g(),entityId:a.id,tenantId:a.tenantId,branchId:a.branchId,payload:{minutesArtifactRef:(C=a.minutesArtifactRef)!=null?C:null,attendanceArtifactRef:(A=a.attendanceArtifactRef)!=null?A:null,ratDecisionBundleRef:(k=a.ratDecisionBundleRef)!=null?k:null}}),a})())}async archiveDecisions(e,t={}){return b((async()=>{var h;let n=await this.repos.governanceMeetingRepository.getById(e);if(!n||n.deleted)throw w("GovernanceMeeting",e);if(n.status!=="closed")throw l("Decisions can only be archived after the meeting is closed");let a=await this.repos.governanceDecisionArchiveRepository.getByMeeting(e);if(a)return a;let o=(await this.repos.governanceAgendaRepository.listByMeeting(e)).filter(y=>y.status!=="open"&&!y.deleted);if(o.length===0)throw l("Cannot archive decisions: no decided agenda items found for this meeting");let s=o.map(y=>{var I,v,R,C,A;return{agendaItemId:y.id,title:y.title,orderNo:y.orderNo,status:y.status,decisionNumber:(I=y.decisionNumber)!=null?I:null,decisionArtifactRef:(v=y.decisionArtifactRef)!=null?v:null,decidedAt:(R=y.decidedAt)!=null?R:null,decidedByMemberId:(C=y.decidedByMemberId)!=null?C:null,decisionNote:(A=y.decisionNote)!=null?A:null}}),d=s.filter(y=>y.status==="approved").length,c=s.filter(y=>y.status==="rejected").length,m=s.filter(y=>y.status==="deferred").length,p=g(),u=await this.repos.governanceDecisionArchiveRepository.create({id:this.newArchiveId(),meetingId:e,meetingTitle:n.title,meetingDate:n.meetingDate,archivedAt:p,archivedBy:(h=t.archivedBy)!=null?h:null,totalItems:s.length,approvedCount:d,rejectedCount:c,deferredCount:m,items:s,branchId:n.branchId,tenantId:n.tenantId,version:1,lastModified:p,deleted:!1});return await S(this.options,{name:"governance.decisions-archived",occurredAt:p,entityId:e,tenantId:n.tenantId,branchId:n.branchId,payload:{totalItems:u.totalItems,approvedCount:d,rejectedCount:c,deferredCount:m}}),u})())}async getDecisionArchive(e){return b(this.repos.governanceDecisionArchiveRepository.getByMeeting(e))}};function Xt(r){var e,t,n,a;if(!((e=r.memberId)!=null&&e.trim()))throw l("memberId is required");if(!((t=r.positionTitle)!=null&&t.trim()))throw l("positionTitle is required");if(!((n=r.startDate)!=null&&n.trim()))throw l("startDate is required");if(!((a=r.tenantId)!=null&&a.trim()))throw l("tenantId is required")}function er(r){var e;if(!((e=r.endDate)!=null&&e.trim()))throw l("endDate is required")}function tr(r){var e,t;if(!((e=r.successorMemberId)!=null&&e.trim()))throw l("successorMemberId is required");if(!((t=r.effectiveDate)!=null&&t.trim()))throw l("effectiveDate is required")}var _e=class{constructor(e,t={}){this.repos=e;this.options=t;this.newId=D("leadership-term")}async createLeadershipTerm(e){return b((async()=>{var s,d,c;Xt(e);let t=await this.repos.memberRepository.getById(e.memberId);if(!t||t.deleted)throw w("Member",e.memberId);if(t.status!=="active")throw l("Only active member can hold leadership term");if((await this.repos.leadershipTermRepository.list({includeDeleted:!1,status:"active",roleType:e.roleType,tenantId:e.tenantId,branchId:e.branchId,memberId:e.memberId})).length>0)throw U("Member already has active leadership term for this role");if((await this.repos.leadershipTermRepository.list({includeDeleted:!1,status:"active",roleType:e.roleType,tenantId:e.tenantId,branchId:e.branchId})).some(m=>m.positionTitle.trim().toLowerCase()===e.positionTitle.trim().toLowerCase()))throw U("Position already has active leadership term");let o=await this.repos.leadershipTermRepository.create({id:this.newId(),memberId:e.memberId,roleType:e.roleType,positionTitle:e.positionTitle.trim(),startDate:e.startDate,endDate:(s=e.endDate)!=null?s:null,handoverFromTermId:(d=e.handoverFromTermId)!=null?d:null,status:"active",notes:(c=e.notes)!=null?c:null,tenantId:e.tenantId,branchId:e.branchId,version:1,lastModified:g(),deleted:!1});return await S(this.options,{name:"governance.leadership-term-created",occurredAt:g(),entityId:o.id,tenantId:o.tenantId,branchId:o.branchId,payload:{roleType:o.roleType,memberId:o.memberId}}),o})())}async endLeadershipTerm(e,t){return b((async()=>{var i,o;er(t);let n=await this.repos.leadershipTermRepository.getById(e);if(!n||n.deleted)throw w("LeadershipTerm",e);if(n.status!=="active")throw l("Leadership term is already ended");let a=await this.repos.leadershipTermRepository.update(e,{endDate:t.endDate,notes:(o=(i=t.notes)!=null?i:n.notes)!=null?o:null,status:"ended",version:n.version+1,lastModified:g()});return await S(this.options,{name:"governance.leadership-term-ended",occurredAt:g(),entityId:a.id,tenantId:a.tenantId,branchId:a.branchId,payload:{roleType:a.roleType,memberId:a.memberId}}),a})())}async handoverLeadershipTerm(e,t){return b((async()=>{var d,c,m,p;tr(t);let n=await this.repos.leadershipTermRepository.getById(e);if(!n||n.deleted)throw w("LeadershipTerm",e);if(n.status!=="active")throw l("Leadership term is already ended");if(n.memberId===t.successorMemberId)throw l("successorMemberId must be different from current member");let a=await this.endLeadershipTerm(e,{endDate:t.effectiveDate,notes:(c=(d=t.notes)!=null?d:n.notes)!=null?c:null});if("error"in a)throw new Error(a.error.message);let i=a.data,o=await this.createLeadershipTerm({memberId:t.successorMemberId,roleType:n.roleType,positionTitle:((m=t.positionTitle)==null?void 0:m.trim())||n.positionTitle,startDate:t.effectiveDate,tenantId:n.tenantId,branchId:n.branchId,notes:(p=t.notes)!=null?p:null,handoverFromTermId:n.id});if("error"in o)throw new Error(o.error.message);let s=o.data;return{endedTerm:i,successorTerm:s}})())}async getLeadershipTermById(e){return b((async()=>{let t=await this.repos.leadershipTermRepository.getById(e);return!t||t.deleted?null:t})())}async listLeadershipTerms(e={}){return b(this.repos.leadershipTermRepository.list(e))}};function rr(r){var e,t,n,a,i;if(!((e=r.periodCode)!=null&&e.trim()))throw l("periodCode is required");if(!((t=r.title)!=null&&t.trim()))throw l("title is required");if(!((n=r.summary)!=null&&n.trim()))throw l("summary is required");if(!((a=r.preparedByMemberId)!=null&&a.trim()))throw l("preparedByMemberId is required");if(!((i=r.tenantId)!=null&&i.trim()))throw l("tenantId is required")}function nr(r){var e;if(!((e=r.submittedAt)!=null&&e.trim()))throw l("submittedAt is required")}function ar(r){var e,t;if(!((e=r.reviewerMemberId)!=null&&e.trim()))throw l("reviewerMemberId is required");if(!((t=r.reviewedAt)!=null&&t.trim()))throw l("reviewedAt is required")}function Ot(r){if(!["rapat_anggota","dinas_koperasi","ojk"].includes(r))throw l(`unsupported management report audience: ${r}`)}function ir(r){if(!r||typeof r!="object"||Array.isArray(r))throw l("payload must be an object")}var ln=[{id:"kata-pengantar",title:"Kata Pengantar / Pendahuluan",fields:[{key:"identity.koperasiName",label:"Nama koperasi",required:!0},{key:"identity.bhNumber",label:"Nomor BH",required:!0},{key:"identity.bookYearPeriod",label:"Periode tahun buku",required:!0},{key:"identity.documentDate",label:"Tanggal penyusunan",required:!0},{key:"signatures.ketuaPengurusSignedAt",label:"Tanda tangan Ketua",required:!0},{key:"signatures.sekretarisSignedAt",label:"Tanda tangan Sekretaris",required:!0},{key:"signatures.bendaharaSignedAt",label:"Tanda tangan Bendahara",required:!0}]},{id:"dasar-hukum",title:"Dasar Hukum dan Dasar Pelaporan",fields:[{key:"legal.uu25Pasal22to26",label:"UU 25/1992 Pasal 22-26",required:!0},{key:"legal.adArtRatClause",label:"AD/ART pasal terkait RAT",required:!0},{key:"legal.permenkop19_2015",label:"Permenkop 19/2015",required:!0},{key:"legal.permenkop2_2024",label:"Permenkop 2/2024",required:!0}]},{id:"non-keuangan",title:"Laporan Non-Keuangan (Organisasi & Usaha)",fields:[{key:"members.beginCount",label:"Jumlah anggota awal periode",required:!0},{key:"members.endCount",label:"Jumlah anggota akhir periode",required:!0},{key:"members.inCount",label:"Jumlah anggota masuk",required:!0},{key:"members.outCount",label:"Jumlah anggota keluar",required:!0},{key:"organization.boardStructure",label:"Struktur pengurus & pengawas",required:!0},{key:"business.mainActivities",label:"Kegiatan usaha utama",required:!0},{key:"business.memberTransactionCount",label:"Jumlah transaksi/jasa anggota",required:!0}]},{id:"laporan-keuangan",title:"Laporan Keuangan",fields:[{key:"financial.neracaRef",label:"Referensi Neraca",required:!0},{key:"financial.lphuRef",label:"Referensi LPHU",required:!0},{key:"financial.cashFlowRef",label:"Referensi Arus Kas",required:!0},{key:"financial.equityChangeRef",label:"Referensi Perubahan Ekuitas",required:!0},{key:"financial.notesRef",label:"Referensi Catatan Laporan Keuangan",required:!0}]},{id:"analisis-kinerja",title:"Analisis Kinerja & Penilaian Kesehatan",fields:[{key:"ratios.roaPercent",label:"ROA (%)",required:!0},{key:"ratios.roePercent",label:"ROE (%)",required:!0},{key:"ratios.currentRatioPercent",label:"Current Ratio (%)",required:!0},{key:"ratios.debtToEquityPercent",label:"Debt to Equity (%)",required:!0},{key:"ratios.healthMethod",label:"Metode kesehatan (PEARLS/OJK)",required:!0}]},{id:"realisasi-rencana-kerja",title:"Realisasi Rencana Kerja & Program",fields:[{key:"workPlan.targetVsActualTableRef",label:"Target vs realisasi",required:!0},{key:"workPlan.shuDistributedIdr",label:"SHU dibagikan (IDR)",required:!0}]},{id:"rencana-berikutnya",title:"Rencana Kerja & RAPB Tahun Berikutnya",fields:[{key:"nextPlan.businessPlanSummary",label:"Rencana usaha",required:!0},{key:"nextPlan.revenueTargetIdr",label:"Target pendapatan (IDR)",required:!0},{key:"nextPlan.expenseTargetIdr",label:"Target belanja (IDR)",required:!0},{key:"nextPlan.shuProjectionIdr",label:"Proyeksi SHU (IDR)",required:!0}]},{id:"kesimpulan",title:"Kesimpulan & Rekomendasi",fields:[{key:"conclusion.performanceSummary",label:"Ringkasan kinerja",required:!0},{key:"conclusion.constraintsAndSolution",label:"Hambatan & solusi",required:!0}]},{id:"lampiran",title:"Lampiran",fields:[{key:"attachments.supervisorReportRef",label:"Referensi laporan pengawas",required:!0},{key:"attachments.auditorOpinionRef",label:"Referensi opini akuntan",required:!1},{key:"attachments.inventoryListRef",label:"Referensi daftar inventaris",required:!0},{key:"attachments.ratEvidenceRef",label:"Referensi bukti rapat",required:!0}]}],or=[{id:"identitas-pajak",title:"Identitas Pajak",fields:[{key:"pajak.npwp",label:"NPWP koperasi",required:!0},{key:"pajak.namaKpp",label:"Nama KPP terdaftar",required:!0},{key:"pajak.kodeJenisUsaha",label:"Kode jenis usaha",required:!0},{key:"pajak.tanggalPembukuan",label:"Tanggal pembukuan (tutup buku)",required:!0}]},{id:"rekap-keuangan-fiskal",title:"Rekap Keuangan Fiskal",fields:[{key:"fiskal.totalPendapatanBruto",label:"Total pendapatan bruto (IDR)",required:!0},{key:"fiskal.totalBiayaDiakui",label:"Total biaya yang diakui secara fiskal (IDR)",required:!0},{key:"fiskal.koreksiPositif",label:"Koreksi fiskal positif (IDR)",required:!0},{key:"fiskal.koreksiNegatif",label:"Koreksi fiskal negatif (IDR)",required:!0},{key:"fiskal.penghasilanKenaPajak",label:"Penghasilan kena pajak (IDR)",required:!0}]},{id:"kewajiban-pajak",title:"Kewajiban Pajak",fields:[{key:"pajak.pphBadanTarif",label:"PPh Badan tarif (0% jika omzet \u2264 Rp 4,8 M / PP 23/2018)",required:!0},{key:"pajak.pph21Karyawan",label:"Total PPh 21 karyawan (IDR)",required:!0},{key:"pajak.ppnJikaPkp",label:"PPN (jika PKP) (IDR)",required:!1},{key:"pajak.setoranMasaDibayar",label:"Total setoran masa yang sudah dibayar (IDR)",required:!0}]},{id:"shu-dan-dana",title:"SHU dan Dana",fields:[{key:"shu.shuTotal",label:"SHU total tahun buku (IDR)",required:!0},{key:"shu.danaCadangan",label:"Dana cadangan (bukan objek pajak) (IDR)",required:!0},{key:"shu.shuDibagikanKeAnggota",label:"SHU dibagikan ke anggota (per PP 46/2013 / PP 23/2018) (IDR)",required:!0},{key:"shu.basisPemotonganPph",label:"Basis pemotongan PPh anggota (IDR)",required:!0}]},{id:"bukti-lampiran",title:"Bukti dan Lampiran",fields:[{key:"lampiran.sptTahunanRef",label:"Referensi SPT Tahunan",required:!0},{key:"lampiran.buktiPotongRef",label:"Referensi bukti potong PPh",required:!0},{key:"lampiran.neracaFiskalRef",label:"Referensi laporan neraca fiskal",required:!0}]}],mn={rapat_anggota:{lpj_pengurus:ln,lpj_pengawas:[{id:"laporan-pengawas-rat",title:"Laporan Pengawas untuk RAT",fields:[{key:"oversight.findingsCount",label:"Jumlah temuan",required:!0},{key:"oversight.majorFindings",label:"Temuan material",required:!0},{key:"oversight.recommendation",label:"Rekomendasi",required:!0},{key:"oversight.followUpStatus",label:"Status tindak lanjut",required:!0}]}]},dinas_koperasi:{lpj_pengurus:[{id:"identitas-profil",title:"Identitas & Profil Koperasi",fields:[{key:"identity.koperasiName",label:"Nama koperasi",required:!0},{key:"identity.bhNumber",label:"Nomor BH/SK pengesahan",required:!0},{key:"identity.address",label:"Alamat pusat/cabang",required:!0},{key:"identity.coopType",label:"Jenis koperasi",required:!0},{key:"identity.npwp",label:"NPWP",required:!0},{key:"identity.endMemberCount",label:"Jumlah anggota akhir periode",required:!0},{key:"identity.bookYearPeriod",label:"Periode tahun buku",required:!0},{key:"identity.responsiblePerson",label:"Penanggung jawab",required:!0}]},{id:"kepatuhan-dinas",title:"Kepatuhan & Compliance Dinas",fields:[{key:"compliance.ratMinutesRef",label:"Bukti RAT (BA/notulen/daftar hadir)",required:!0},{key:"compliance.shuDistributionRef",label:"Bukti pembagian SHU",required:!0},{key:"compliance.auditStatus",label:"Status audit",required:!0},{key:"compliance.taxSptRef",label:"Kepatuhan pajak (SPT Tahunan)",required:!0},{key:"compliance.adArtCompliance",label:"Kepatuhan AD/ART & PUG-KOPIN",required:!0},{key:"compliance.healthIndex",label:"Indeks kesehatan koperasi",required:!1}]}],lpj_pengawas:[{id:"laporan-pengawas-dinas",title:"Laporan Pengawas untuk Dinas",fields:[{key:"oversight.reviewCycle",label:"Siklus review",required:!0},{key:"oversight.followUpProgress",label:"Progres tindak lanjut",required:!0},{key:"oversight.riskNote",label:"Catatan risiko",required:!0}]}]},pajak:{lpj_pengurus:or,lpj_pengawas:or},ojk:{lpj_pengurus:[{id:"profil-risiko-ojk",title:"Profil Risiko OJK",fields:[{key:"risk.npfNetPercent",label:"NPF Netto (%)",required:!0},{key:"risk.carPercent",label:"CAR (%)",required:!0},{key:"risk.currentRatioPercent",label:"Current Ratio (%)",required:!0},{key:"risk.roaPercent",label:"ROA (%)",required:!0},{key:"risk.fdrPercent",label:"LDR/FDR (%)",required:!0},{key:"risk.bopoPercent",label:"BOPO (%)",required:!0},{key:"risk.eightRiskSummary",label:"8 jenis risiko + mitigasi",required:!0}]},{id:"kepatuhan-ojk",title:"Kepatuhan Regulasi OJK",fields:[{key:"compliance.auditFindingsRef",label:"Daftar temuan audit",required:!0},{key:"compliance.remediationStatus",label:"Status penyelesaian temuan",required:!0},{key:"compliance.managementCommitment",label:"Pernyataan komitmen pengurus/pengawas/pengelola",required:!0}]}],lpj_pengawas:[{id:"laporan-pengawas-ojk",title:"Laporan Pengawas untuk OJK",fields:[{key:"oversight.criticalIssueCount",label:"Jumlah isu kritis",required:!0},{key:"oversight.remediationEta",label:"ETA remediasi",required:!0},{key:"oversight.auditCompletionPercent",label:"Penyelesaian audit internal (%)",required:!0}]}]}},sr=/^LPJ-(RAPAT|DINAS|OJK)-\d{4}-\d{3}-.+\.(pdf|xlsx|xls|docx)$/i,dr=["workflow.readyForReview","signatures.ketuaPengurusSignedAt","signatures.coSignerSignedAt","review.internalSupervisorApproved","attachments.financialStatementsRef","attachments.ratEvidenceRef","attachments.metadataComplete"],cr=["review.supervisorOrAuditorOpinion","approval.approverName","approval.approverRole","approval.approvedAt"];function lr(r,e){return mn[r][e]}function _(r,e){if(r)return e.split(".").reduce((t,n)=>{if(t&&typeof t=="object"&&n in t)return t[n]},r)}function Ve(r){return r==null?!0:typeof r=="string"?r.trim().length===0:!1}var Ge=class{constructor(e,t={}){this.repos=e;this.options=t;this.newId=D("management-report")}async createManagementReport(e){return b((async()=>{var a;rr(e);let t=await this.repos.memberRepository.getById(e.preparedByMemberId);if(!t||t.deleted)throw w("Member",e.preparedByMemberId);let n=await this.repos.managementReportRepository.create({id:this.newId(),reportType:e.reportType,periodCode:e.periodCode.trim(),title:e.title.trim(),summary:e.summary.trim(),preparedByMemberId:e.preparedByMemberId,preparedByLeadershipTermId:(a=e.preparedByLeadershipTermId)!=null?a:null,status:"draft",submittedAt:null,reviewedAt:null,reviewerMemberId:null,reviewNotes:null,payload:{},tenantId:e.tenantId,branchId:e.branchId,version:1,lastModified:g(),deleted:!1});return await S(this.options,{name:"governance.management-report-created",occurredAt:g(),entityId:n.id,tenantId:n.tenantId,branchId:n.branchId,payload:{reportType:n.reportType,periodCode:n.periodCode}}),n})())}async upsertManagementReportPayload(e,t){return b((async()=>{var o;ir(t.payload);let n=await this.repos.managementReportRepository.getById(e);if(!n||n.deleted)throw w("ManagementReport",e);if(n.status!=="draft")throw l("Management report payload can only be edited while report is draft");let a={...(o=n.payload)!=null?o:{},...t.payload},i=await this.repos.managementReportRepository.update(e,{payload:a,version:n.version+1,lastModified:g()});return await S(this.options,{name:"governance.management-report-payload-upserted",occurredAt:g(),entityId:i.id,tenantId:i.tenantId,branchId:i.branchId,payload:{reportType:i.reportType,periodCode:i.periodCode}}),i})())}async submitManagementReport(e,t){return b((async()=>{nr(t);let n=await this.repos.managementReportRepository.getById(e);if(!n||n.deleted)throw w("ManagementReport",e);if(n.status!=="draft")throw l("Only draft management report can be submitted");this.assertSubmitReadiness(n);let a=await this.repos.managementReportRepository.update(e,{status:"submitted",submittedAt:t.submittedAt,version:n.version+1,lastModified:g()});return await S(this.options,{name:"governance.management-report-submitted",occurredAt:g(),entityId:a.id,tenantId:a.tenantId,branchId:a.branchId,payload:{reportType:a.reportType,periodCode:a.periodCode}}),a})())}async approveManagementReport(e,t){return this.reviewManagementReport(e,t,"approved")}async rejectManagementReport(e,t){return this.reviewManagementReport(e,t,"rejected")}async getManagementReportById(e){return b((async()=>{let t=await this.repos.managementReportRepository.getById(e);return!t||t.deleted?null:t})())}async listManagementReports(e){return b(this.repos.managementReportRepository.list(e))}async evaluateManagementReportCompleteness(e,t){return b(this.evaluateCompletenessInternal(e,t))}async evaluateCompletenessInternal(e,t){Ot(t);let n=await this.repos.managementReportRepository.getById(e);if(!n||n.deleted)throw w("ManagementReport",e);let a=lr(t,n.reportType),i=a.flatMap(c=>c.fields).filter(c=>c.required),o=i.filter(c=>{var p;let m=_((p=n.payload)!=null?p:{},c.key);return m==null||typeof m=="string"&&m.trim().length===0}).map(c=>c.key),s=i.length,d=s-o.length;return{audience:t,totalRequired:s,filledRequired:d,missingKeys:o,isComplete:o.length===0,template:a}}async buildManagementReportPackage(e,t){return b((async()=>{var s,d,c,m;Ot(t);let n=await this.repos.managementReportRepository.getById(e);if(!n||n.deleted)throw w("ManagementReport",e);let a=await this.evaluateCompletenessInternal(e,t),i={rapat_anggota:"Paket LPJ untuk Rapat Anggota",dinas_koperasi:"Paket LPJ untuk Dinas Koperasi",ojk:"Paket LPJ untuk OJK",pajak:"Paket Laporan Pajak Koperasi"},o=[{id:"ringkasan-lpj",title:"Ringkasan LPJ",content:n.summary},{id:"catatan-review",title:"Catatan Review",content:(s=n.reviewNotes)!=null?s:"Belum ada catatan review."},{id:"checklist-kelengkapan",title:"Checklist Kelengkapan Audience",content:a.template.flatMap(p=>p.fields.map(u=>{var h;return{key:u.key,required:u.required,value:_((h=n.payload)!=null?h:{},u.key),label:u.label,sectionTitle:p.title}})).map((p,u)=>{let h=p.value!==void 0&&p.value!==null&&!(typeof p.value=="string"&&p.value.trim().length===0),y=p.required?h?"[x]":"[ ]":h?"[x]":"[-]";return`${u+1}. ${y} ${p.sectionTitle} - ${p.label} (${p.key})`}).join(`
|
|
1
|
+
import{CoreRuntime as vn}from"ofcore";import{InMemoryDbAdapter as Ur}from"ofcore";import{asReadonlyStore as In,createStore as Rn}from"ofcore";var f={histories:"ofcoop_histories",members:"ofcoop_members",memberWaConsent:"ofcoop_member_wa_consent",memberExitState:"ofcoop_member_exit_state",memberNumberPolicies:"ofcoop_member_number_policies",governanceMeetings:"ofcoop_governance_meetings",governanceAgendaItems:"ofcoop_governance_agenda_items",governanceVotes:"ofcoop_governance_votes",leadershipTerms:"ofcoop_leadership_terms",managementReports:"ofcoop_management_reports",oversightPolicies:"ofcoop_oversight_policies",riskRegisters:"ofcoop_risk_registers",whistleReports:"ofcoop_whistle_reports",savingPolicies:"ofcoop_saving_policies",savingEntries:"ofcoop_saving_entries",shuConfigs:"ofcoop_shu_configs",shuPeriods:"ofcoop_shu_periods",shuAllocations:"ofcoop_shu_allocations",governanceDecisionArchives:"ofcoop_governance_decision_archives",leadershipAppointments:"ofcoop_leadership_appointments",shuParticipationEntries:"ofcoop_shu_participation_entries",communityProfiles:"ofcoop_community_profiles",memberDependents:"ofcoop_member_dependents",users:"ofcoop_users",roles:"ofcoop_roles"},tn=[{name:f.histories,columns:[{name:"id",type:"string"},{name:"tableName",type:"string",isIndexed:!0},{name:"recordId",type:"string",isIndexed:!0},{name:"action",type:"string",isIndexed:!0},{name:"changes",type:"json",isOptional:!0},{name:"userId",type:"string",isOptional:!0,isIndexed:!0},{name:"timestamp",type:"string",isIndexed:!0},{name:"branchId",type:"string",isOptional:!0,isIndexed:!0},{name:"tenantId",type:"string",isOptional:!0,isIndexed:!0}]},{name:f.members,columns:[{name:"id",type:"string"},{name:"memberNumber",type:"string",isIndexed:!0},{name:"fullName",type:"string"},{name:"status",type:"string",enum:["active","inactive","exited"]},{name:"joinDate",type:"string"},{name:"exitDate",type:"string",isOptional:!0},{name:"branchId",type:"string",isOptional:!0,isIndexed:!0},{name:"tenantId",type:"string",isOptional:!0,isIndexed:!0},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]},{name:f.memberWaConsent,columns:[{name:"id",type:"string"},{name:"granted",type:"boolean"},{name:"source",type:"string",isOptional:!0},{name:"note",type:"string",isOptional:!0},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]},{name:f.memberExitState,columns:[{name:"id",type:"string"},{name:"stage",type:"string",enum:["requested","settled","canceled"]},{name:"reason",type:"string",isOptional:!0},{name:"requestedBy",type:"string",isOptional:!0},{name:"referenceId",type:"string",isOptional:!0},{name:"note",type:"string",isOptional:!0},{name:"simpananPokokReturned",type:"number",isOptional:!0},{name:"simpananWajibReturned",type:"number",isOptional:!0},{name:"simpananSukarelaReturned",type:"number",isOptional:!0},{name:"shuAllocated",type:"number",isOptional:!0},{name:"deductions",type:"number",isOptional:!0},{name:"netSettlementAmount",type:"number",isOptional:!0},{name:"settledBy",type:"string",isOptional:!0},{name:"settledAt",type:"string",isOptional:!0},{name:"settlementNotes",type:"string",isOptional:!0},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]},{name:f.memberNumberPolicies,columns:[{name:"id",type:"string"},{name:"koperasiId",type:"string",isIndexed:!0},{name:"branchId",type:"string",isOptional:!0,isIndexed:!0},{name:"tenantId",type:"string",isOptional:!0,isIndexed:!0},{name:"prefix",type:"string",isOptional:!0},{name:"includeYear",type:"boolean"},{name:"includeMonth",type:"boolean",isOptional:!0},{name:"separator",type:"string"},{name:"paddingDigits",type:"number"},{name:"counterResetPolicy",type:"string",enum:["never","yearly"]},{name:"counterStart",type:"number"},{name:"manualOverrideAllowed",type:"boolean"},{name:"effectiveDate",type:"string"},{name:"approvalRef",type:"string",isOptional:!0},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]},{name:f.governanceMeetings,columns:[{name:"id",type:"string"},{name:"title",type:"string"},{name:"meetingDate",type:"string",isIndexed:!0},{name:"status",type:"string",enum:["draft","voting","closed"],isIndexed:!0},{name:"quorumPercent",type:"number"},{name:"eligibleMemberIds",type:"json",isOptional:!0},{name:"notes",type:"string",isOptional:!0},{name:"minutes",type:"string",isOptional:!0},{name:"decisionSummary",type:"string",isOptional:!0},{name:"minutesArtifactRef",type:"string",isOptional:!0,isIndexed:!0},{name:"attendanceArtifactRef",type:"string",isOptional:!0,isIndexed:!0},{name:"ratDecisionBundleRef",type:"string",isOptional:!0,isIndexed:!0},{name:"chairpersonMemberId",type:"string",isOptional:!0,isIndexed:!0},{name:"secretaryMemberId",type:"string",isOptional:!0,isIndexed:!0},{name:"branchId",type:"string",isOptional:!0,isIndexed:!0},{name:"tenantId",type:"string",isOptional:!0,isIndexed:!0},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]},{name:f.governanceAgendaItems,columns:[{name:"id",type:"string"},{name:"meetingId",type:"string",isIndexed:!0},{name:"title",type:"string"},{name:"description",type:"string",isOptional:!0},{name:"orderNo",type:"number",isIndexed:!0},{name:"status",type:"string",enum:["open","approved","rejected","deferred"],isIndexed:!0},{name:"decisionArtifactRef",type:"string",isOptional:!0,isIndexed:!0},{name:"decisionNumber",type:"string",isOptional:!0,isIndexed:!0},{name:"decidedAt",type:"string",isOptional:!0,isIndexed:!0},{name:"decidedByMemberId",type:"string",isOptional:!0,isIndexed:!0},{name:"decisionNote",type:"string",isOptional:!0},{name:"branchId",type:"string",isOptional:!0,isIndexed:!0},{name:"tenantId",type:"string",isOptional:!0,isIndexed:!0},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]},{name:f.governanceVotes,columns:[{name:"id",type:"string"},{name:"meetingId",type:"string",isIndexed:!0},{name:"agendaItemId",type:"string",isIndexed:!0},{name:"memberId",type:"string",isIndexed:!0},{name:"choice",type:"string",enum:["yes","no","abstain"]},{name:"votedAt",type:"string",isIndexed:!0},{name:"notes",type:"string",isOptional:!0},{name:"branchId",type:"string",isOptional:!0,isIndexed:!0},{name:"tenantId",type:"string",isOptional:!0,isIndexed:!0},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]},{name:f.leadershipTerms,columns:[{name:"id",type:"string"},{name:"memberId",type:"string",isIndexed:!0},{name:"roleType",type:"string",enum:["pengurus","pengawas"],isIndexed:!0},{name:"positionTitle",type:"string"},{name:"startDate",type:"string",isIndexed:!0},{name:"endDate",type:"string",isOptional:!0,isIndexed:!0},{name:"handoverFromTermId",type:"string",isOptional:!0,isIndexed:!0},{name:"status",type:"string",enum:["active","ended"],isIndexed:!0},{name:"notes",type:"string",isOptional:!0},{name:"branchId",type:"string",isOptional:!0,isIndexed:!0},{name:"tenantId",type:"string",isOptional:!0,isIndexed:!0},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]},{name:f.managementReports,columns:[{name:"id",type:"string"},{name:"reportType",type:"string",enum:["lpj_pengurus","lpj_pengawas"],isIndexed:!0},{name:"periodCode",type:"string",isIndexed:!0},{name:"title",type:"string"},{name:"summary",type:"string"},{name:"preparedByMemberId",type:"string",isIndexed:!0},{name:"preparedByLeadershipTermId",type:"string",isOptional:!0,isIndexed:!0},{name:"status",type:"string",enum:["draft","submitted","approved","rejected"],isIndexed:!0},{name:"submittedAt",type:"string",isOptional:!0},{name:"reviewedAt",type:"string",isOptional:!0},{name:"reviewerMemberId",type:"string",isOptional:!0,isIndexed:!0},{name:"reviewNotes",type:"string",isOptional:!0},{name:"payload",type:"json",isOptional:!0},{name:"branchId",type:"string",isOptional:!0,isIndexed:!0},{name:"tenantId",type:"string",isOptional:!0,isIndexed:!0},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]},{name:f.oversightPolicies,columns:[{name:"id",type:"string"},{name:"tenantId",type:"string",isIndexed:!0},{name:"branchId",type:"string",isOptional:!0,isIndexed:!0},{name:"effectiveDate",type:"string",isIndexed:!0},{name:"riskSlaHoursByCategory",type:"json"},{name:"whistleSlaHoursByChannel",type:"json"},{name:"escalationMaxLevel",type:"number"},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]},{name:f.riskRegisters,columns:[{name:"id",type:"string"},{name:"title",type:"string"},{name:"description",type:"string",isOptional:!0},{name:"category",type:"string",enum:["operational","credit","compliance","liquidity","governance","other"],isIndexed:!0},{name:"likelihood",type:"number"},{name:"impact",type:"number"},{name:"riskScore",type:"number",isIndexed:!0},{name:"status",type:"string",enum:["open","mitigating","accepted","closed"],isIndexed:!0},{name:"ownerMemberId",type:"string",isOptional:!0,isIndexed:!0},{name:"mitigationPlan",type:"string",isOptional:!0},{name:"slaDueAt",type:"string",isOptional:!0,isIndexed:!0},{name:"escalationLevel",type:"number",isIndexed:!0},{name:"escalatedAt",type:"string",isOptional:!0,isIndexed:!0},{name:"escalationReason",type:"string",isOptional:!0},{name:"mitigationApprovalStatus",type:"string",enum:["not_required","pending","approved","rejected"],isOptional:!0,isIndexed:!0},{name:"mitigationSubmittedAt",type:"string",isOptional:!0,isIndexed:!0},{name:"mitigationReviewedAt",type:"string",isOptional:!0,isIndexed:!0},{name:"mitigationReviewerMemberId",type:"string",isOptional:!0,isIndexed:!0},{name:"mitigationReviewNote",type:"string",isOptional:!0},{name:"nextReviewDate",type:"string",isOptional:!0,isIndexed:!0},{name:"lastReviewedAt",type:"string",isOptional:!0,isIndexed:!0},{name:"notes",type:"string",isOptional:!0},{name:"branchId",type:"string",isOptional:!0,isIndexed:!0},{name:"tenantId",type:"string",isOptional:!0,isIndexed:!0},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]},{name:f.whistleReports,columns:[{name:"id",type:"string"},{name:"incidentDate",type:"string",isOptional:!0,isIndexed:!0},{name:"subject",type:"string"},{name:"description",type:"string"},{name:"channel",type:"string",enum:["web","email","hotline","other"],isIndexed:!0},{name:"isAnonymous",type:"boolean"},{name:"reporterMemberId",type:"string",isOptional:!0,isIndexed:!0},{name:"evidenceRefs",type:"json",isOptional:!0},{name:"slaDueAt",type:"string",isOptional:!0,isIndexed:!0},{name:"escalationLevel",type:"number",isIndexed:!0},{name:"escalatedAt",type:"string",isOptional:!0,isIndexed:!0},{name:"escalationReason",type:"string",isOptional:!0},{name:"investigationStage",type:"string",enum:["intake","preliminary","formal","recommendation"],isOptional:!0,isIndexed:!0},{name:"investigationUpdatedAt",type:"string",isOptional:!0,isIndexed:!0},{name:"investigationNote",type:"string",isOptional:!0},{name:"status",type:"string",enum:["submitted","in_review","resolved","dismissed"],isIndexed:!0},{name:"assignedToMemberId",type:"string",isOptional:!0,isIndexed:!0},{name:"handledByMemberId",type:"string",isOptional:!0,isIndexed:!0},{name:"resolutionSummary",type:"string",isOptional:!0},{name:"resolvedAt",type:"string",isOptional:!0,isIndexed:!0},{name:"branchId",type:"string",isOptional:!0,isIndexed:!0},{name:"tenantId",type:"string",isOptional:!0,isIndexed:!0},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]},{name:f.savingPolicies,columns:[{name:"id",type:"string"},{name:"koperasiId",type:"string",isIndexed:!0},{name:"branchId",type:"string",isOptional:!0,isIndexed:!0},{name:"tenantId",type:"string",isOptional:!0,isIndexed:!0},{name:"simpananPokokNominalIdr",type:"number"},{name:"monthlyWajibNominalIdr",type:"number"},{name:"gracePeriodMonth",type:"number"},{name:"dendaType",type:"string",enum:["fixed","percentage"]},{name:"dendaAmountIdr",type:"number"},{name:"dendaPercentage",type:"number"},{name:"warningAtMonths",type:"number"},{name:"nonaktifAtMonths",type:"number"},{name:"autoSetAnggotaNonaktif",type:"boolean"},{name:"effectiveDate",type:"string",isIndexed:!0},{name:"changeReason",type:"string",isOptional:!0},{name:"approvalRef",type:"string",isOptional:!0},{name:"isSuperseded",type:"boolean",isOptional:!0,isIndexed:!0},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]},{name:f.savingEntries,columns:[{name:"id",type:"string"},{name:"memberId",type:"string",isIndexed:!0},{name:"savingType",type:"string",enum:["pokok","wajib","sukarela"]},{name:"entryType",type:"string",enum:["credit","debit"]},{name:"amount",type:"number"},{name:"transactionDate",type:"string",isIndexed:!0},{name:"referenceType",type:"string",isOptional:!0},{name:"referenceId",type:"string",isOptional:!0},{name:"notes",type:"string",isOptional:!0},{name:"branchId",type:"string",isOptional:!0,isIndexed:!0},{name:"tenantId",type:"string",isOptional:!0,isIndexed:!0},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]},{name:f.shuConfigs,columns:[{name:"id",type:"string"},{name:"koperasiId",type:"string",isIndexed:!0},{name:"tenantId",type:"string",isOptional:!0,isIndexed:!0},{name:"branchId",type:"string",isOptional:!0,isIndexed:!0},{name:"effectiveDate",type:"string"},{name:"cadanganPercent",type:"number"},{name:"jasaUsahaPercent",type:"number"},{name:"jasaModalPercent",type:"number"},{name:"notes",type:"string",isOptional:!0},{name:"approvalRef",type:"string",isOptional:!0},{name:"formulaModel",type:"string",isOptional:!0},{name:"participationWeights",type:"string",isOptional:!0},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]},{name:f.shuPeriods,columns:[{name:"id",type:"string"},{name:"periodCode",type:"string",isIndexed:!0},{name:"startDate",type:"string"},{name:"endDate",type:"string"},{name:"status",type:"string",enum:["draft","finalized"]},{name:"formulaSnapshot",type:"json"},{name:"branchId",type:"string",isOptional:!0,isIndexed:!0},{name:"tenantId",type:"string",isOptional:!0,isIndexed:!0},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]},{name:f.shuAllocations,columns:[{name:"id",type:"string"},{name:"shuPeriodId",type:"string",isIndexed:!0},{name:"memberId",type:"string",isIndexed:!0},{name:"allocationAmount",type:"number"},{name:"calculationBasis",type:"json"},{name:"branchId",type:"string",isOptional:!0,isIndexed:!0},{name:"tenantId",type:"string",isOptional:!0,isIndexed:!0},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]},{name:f.governanceDecisionArchives,columns:[{name:"id",type:"string"},{name:"meetingId",type:"string",isIndexed:!0},{name:"meetingTitle",type:"string"},{name:"meetingDate",type:"string"},{name:"archivedAt",type:"string"},{name:"archivedBy",type:"string",isOptional:!0},{name:"totalItems",type:"number"},{name:"approvedCount",type:"number"},{name:"rejectedCount",type:"number"},{name:"deferredCount",type:"number"},{name:"items",type:"json"},{name:"branchId",type:"string",isOptional:!0,isIndexed:!0},{name:"tenantId",type:"string",isOptional:!0,isIndexed:!0},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]},{name:f.leadershipAppointments,columns:[{name:"id",type:"string"},{name:"proposedMemberId",type:"string",isIndexed:!0},{name:"roleType",type:"string",enum:["pengurus","pengawas"],isIndexed:!0},{name:"positionTitle",type:"string"},{name:"appointmentType",type:"string",enum:["election","replacement","interim","cooptation"],isIndexed:!0},{name:"replacesTermId",type:"string",isOptional:!0,isIndexed:!0},{name:"governanceMeetingRef",type:"string",isOptional:!0,isIndexed:!0},{name:"status",type:"string",enum:["proposed","endorsed","approved","rejected","installed"],isIndexed:!0},{name:"effectiveDate",type:"string",isIndexed:!0},{name:"endDate",type:"string",isOptional:!0},{name:"proposedAt",type:"string",isIndexed:!0},{name:"endorsedAt",type:"string",isOptional:!0},{name:"endorsedBy",type:"string",isOptional:!0},{name:"approvedAt",type:"string",isOptional:!0},{name:"approvalRef",type:"string",isOptional:!0},{name:"installedAt",type:"string",isOptional:!0},{name:"installedTermId",type:"string",isOptional:!0,isIndexed:!0},{name:"rejectedAt",type:"string",isOptional:!0},{name:"rejectionReason",type:"string",isOptional:!0},{name:"notes",type:"string",isOptional:!0},{name:"tenantId",type:"string",isOptional:!0,isIndexed:!0},{name:"branchId",type:"string",isOptional:!0,isIndexed:!0},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]},{name:f.shuParticipationEntries,columns:[{name:"id",type:"string"},{name:"shuPeriodId",type:"string",isIndexed:!0},{name:"memberId",type:"string",isIndexed:!0},{name:"participationType",type:"string",isIndexed:!0},{name:"amount",type:"number"},{name:"notes",type:"string",isOptional:!0},{name:"tenantId",type:"string",isOptional:!0,isIndexed:!0},{name:"branchId",type:"string",isOptional:!0,isIndexed:!0},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]},{name:f.communityProfiles,columns:[{name:"id",type:"string"},{name:"tenantId",type:"string",isIndexed:!0},{name:"branchId",type:"string",isOptional:!0,isIndexed:!0},{name:"profileType",type:"string",isIndexed:!0},{name:"displayName",type:"string"},{name:"description",type:"string",isOptional:!0},{name:"savingRequirements",type:"string",isOptional:!0},{name:"shuRules",type:"string",isOptional:!0},{name:"membershipRequirements",type:"string",isOptional:!0},{name:"governanceRules",type:"string",isOptional:!0},{name:"customFields",type:"string",isOptional:!0},{name:"isActive",type:"boolean",isIndexed:!0},{name:"notes",type:"string",isOptional:!0},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]},{name:f.memberDependents,columns:[{name:"id",type:"string"},{name:"memberId",type:"string",isIndexed:!0},{name:"fullName",type:"string"},{name:"relationship",type:"string",isIndexed:!0},{name:"birthDate",type:"string",isOptional:!0},{name:"idNumber",type:"string",isOptional:!0},{name:"isInsuranceBeneficiary",type:"boolean"},{name:"notes",type:"string",isOptional:!0},{name:"tenantId",type:"string",isOptional:!0,isIndexed:!0},{name:"branchId",type:"string",isOptional:!0,isIndexed:!0},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]},{name:f.users,columns:[{name:"id",type:"string"},{name:"username",type:"string",isIndexed:!0},{name:"role",type:"string"},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]},{name:f.roles,columns:[{name:"id",type:"string"},{name:"name",type:"string",isIndexed:!0},{name:"permissions",type:"string[]"},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]}],rn={version:20,tables:tn};function Ut(){return rn.tables}var _t=[{toVersion:1,up:async r=>{let e=Ut();for(let t of e)try{await r.addTable(t)}catch{}}},{toVersion:2,up:async r=>{let e=[{name:"note",type:"string",isOptional:!0},{name:"simpananPokokReturned",type:"number",isOptional:!0},{name:"simpananWajibReturned",type:"number",isOptional:!0},{name:"simpananSukarelaReturned",type:"number",isOptional:!0},{name:"shuAllocated",type:"number",isOptional:!0},{name:"deductions",type:"number",isOptional:!0},{name:"netSettlementAmount",type:"number",isOptional:!0},{name:"settledBy",type:"string",isOptional:!0},{name:"settledAt",type:"string",isOptional:!0},{name:"settlementNotes",type:"string",isOptional:!0}];for(let t of e)try{await r.addColumn(f.memberExitState,t)}catch{}try{await r.addColumn(f.savingPolicies,{name:"isSuperseded",type:"boolean",isOptional:!0,isIndexed:!0})}catch{}}},{toVersion:3,up:async r=>{try{await r.addTable({name:f.governanceDecisionArchives,columns:[{name:"id",type:"string"},{name:"meetingId",type:"string",isIndexed:!0},{name:"meetingTitle",type:"string"},{name:"meetingDate",type:"string"},{name:"archivedAt",type:"string"},{name:"archivedBy",type:"string",isOptional:!0},{name:"totalItems",type:"number"},{name:"approvedCount",type:"number"},{name:"rejectedCount",type:"number"},{name:"deferredCount",type:"number"},{name:"items",type:"json"},{name:"branchId",type:"string",isOptional:!0,isIndexed:!0},{name:"tenantId",type:"string",isOptional:!0,isIndexed:!0},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]})}catch{}}},{toVersion:4,up:async r=>{let e=[{name:"formulaModel",type:"string",isOptional:!0},{name:"participationWeights",type:"string",isOptional:!0}];for(let t of e)try{await r.addColumn(f.shuConfigs,t)}catch{}try{await r.addTable({name:f.leadershipAppointments,columns:[{name:"id",type:"string"},{name:"proposedMemberId",type:"string",isIndexed:!0},{name:"roleType",type:"string",isIndexed:!0},{name:"positionTitle",type:"string"},{name:"appointmentType",type:"string",isIndexed:!0},{name:"replacesTermId",type:"string",isOptional:!0,isIndexed:!0},{name:"governanceMeetingRef",type:"string",isOptional:!0,isIndexed:!0},{name:"status",type:"string",isIndexed:!0},{name:"effectiveDate",type:"string",isIndexed:!0},{name:"endDate",type:"string",isOptional:!0},{name:"proposedAt",type:"string",isIndexed:!0},{name:"endorsedAt",type:"string",isOptional:!0},{name:"endorsedBy",type:"string",isOptional:!0},{name:"approvedAt",type:"string",isOptional:!0},{name:"approvalRef",type:"string",isOptional:!0},{name:"installedAt",type:"string",isOptional:!0},{name:"installedTermId",type:"string",isOptional:!0,isIndexed:!0},{name:"rejectedAt",type:"string",isOptional:!0},{name:"rejectionReason",type:"string",isOptional:!0},{name:"notes",type:"string",isOptional:!0},{name:"tenantId",type:"string",isOptional:!0,isIndexed:!0},{name:"branchId",type:"string",isOptional:!0,isIndexed:!0},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]})}catch{}}},{toVersion:5,up:async r=>{try{await r.addTable({name:f.shuParticipationEntries,columns:[{name:"id",type:"string"},{name:"shuPeriodId",type:"string",isIndexed:!0},{name:"memberId",type:"string",isIndexed:!0},{name:"participationType",type:"string",isIndexed:!0},{name:"amount",type:"number"},{name:"notes",type:"string",isOptional:!0},{name:"tenantId",type:"string",isOptional:!0,isIndexed:!0},{name:"branchId",type:"string",isOptional:!0,isIndexed:!0},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]})}catch{}try{await r.addTable({name:f.communityProfiles,columns:[{name:"id",type:"string"},{name:"tenantId",type:"string",isIndexed:!0},{name:"branchId",type:"string",isOptional:!0,isIndexed:!0},{name:"profileType",type:"string",isIndexed:!0},{name:"displayName",type:"string"},{name:"description",type:"string",isOptional:!0},{name:"savingRequirements",type:"string",isOptional:!0},{name:"shuRules",type:"string",isOptional:!0},{name:"membershipRequirements",type:"string",isOptional:!0},{name:"governanceRules",type:"string",isOptional:!0},{name:"customFields",type:"string",isOptional:!0},{name:"isActive",type:"boolean",isIndexed:!0},{name:"notes",type:"string",isOptional:!0},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]})}catch{}try{await r.addTable({name:f.memberDependents,columns:[{name:"id",type:"string"},{name:"memberId",type:"string",isIndexed:!0},{name:"fullName",type:"string"},{name:"relationship",type:"string",isIndexed:!0},{name:"birthDate",type:"string",isOptional:!0},{name:"idNumber",type:"string",isOptional:!0},{name:"isInsuranceBeneficiary",type:"boolean"},{name:"notes",type:"string",isOptional:!0},{name:"tenantId",type:"string",isOptional:!0,isIndexed:!0},{name:"branchId",type:"string",isOptional:!0,isIndexed:!0},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]})}catch{}}}];var nn={logInfo(){},logWarn(){},logError(){}};async function Vt(r,e=nn){e.logInfo("[ofcoop] starting database migration process");let t=[..._t].sort((i,o)=>i.toVersion-o.toVersion),n=t.length>0?t[t.length-1].toVersion:0,a=await r.getSchemaVersion();if((a==null||a<0)&&(a=0),a>=n){e.logInfo(`[ofcoop] database already up-to-date at v${a}`);return}for(let i of t)i.toVersion>a&&(e.logInfo(`[ofcoop] applying migration v${i.toVersion}`),await i.up(r),await r.setSchemaVersion(i.toVersion),a=i.toVersion);e.logInfo(`[ofcoop] migration completed at v${a}`)}import{nowIso as ye,toAndFilter as F}from"ofcore";function Be(r,e){return new Date(r).getTime()<=new Date(e).getTime()}var lt=class{constructor(e){this.db=e}async create(e){return this.db.create(f.members,e)}async update(e,t){return this.db.update(f.members,e,t)}async getById(e){return this.db.get(f.members,e)}async list(e){var n,a;let t=[];return e!=null&&e.includeDeleted||t.push({deleted:!1}),e!=null&&e.status&&t.push({status:e.status}),(e==null?void 0:e.tenantId)!==void 0&&t.push({tenantId:(n=e.tenantId)!=null?n:null}),(e==null?void 0:e.branchId)!==void 0&&t.push({branchId:(a=e.branchId)!=null?a:null}),this.db.query(f.members,{filters:F(t),sort:[{field:"lastModified",direction:"desc"}]})}},mt=class{constructor(e){this.db=e}async set(e,t){var i,o,s;let n=await this.get(e),a={id:e,granted:t.granted,source:(i=t.source)!=null?i:null,note:(o=t.note)!=null?o:null,version:((s=n==null?void 0:n.version)!=null?s:0)+1,lastModified:ye(),deleted:!1};return n?this.db.update(f.memberWaConsent,e,a):this.db.create(f.memberWaConsent,a)}async get(e){return this.db.get(f.memberWaConsent,e)}},ut=class{constructor(e){this.db=e}async set(e,t,n){var s,d,c,m,p,u,h,y,I,v,R,C,P,k,M;let a=await this.get(e),i=(s=n.settlement)!=null?s:null,o={id:e,stage:t,reason:(d=n.reason)!=null?d:null,requestedBy:(c=n.requestedBy)!=null?c:null,referenceId:(m=n.referenceId)!=null?m:null,note:(p=n.note)!=null?p:null,simpananPokokReturned:(u=i==null?void 0:i.simpananPokokReturned)!=null?u:null,simpananWajibReturned:(h=i==null?void 0:i.simpananWajibReturned)!=null?h:null,simpananSukarelaReturned:(y=i==null?void 0:i.simpananSukarelaReturned)!=null?y:null,shuAllocated:(I=i==null?void 0:i.shuAllocated)!=null?I:null,deductions:(v=i==null?void 0:i.deductions)!=null?v:null,netSettlementAmount:(R=i==null?void 0:i.netSettlementAmount)!=null?R:null,settledBy:(C=i==null?void 0:i.settledBy)!=null?C:null,settledAt:(P=i==null?void 0:i.settledAt)!=null?P:null,settlementNotes:(k=i==null?void 0:i.notes)!=null?k:null,version:((M=a==null?void 0:a.version)!=null?M:0)+1,lastModified:ye(),deleted:!1};return a?this.db.update(f.memberExitState,e,o):this.db.create(f.memberExitState,o)}async get(e){return this.db.get(f.memberExitState,e)}async getMemberExitState(e){var a,i,o,s,d,c,m,p,u,h,y;let t=await this.get(e);if(!t)return null;let n=t.stage==="settled"&&t.settledBy?{simpananPokokReturned:(a=t.simpananPokokReturned)!=null?a:0,simpananWajibReturned:(i=t.simpananWajibReturned)!=null?i:0,simpananSukarelaReturned:(o=t.simpananSukarelaReturned)!=null?o:0,shuAllocated:(s=t.shuAllocated)!=null?s:0,deductions:(d=t.deductions)!=null?d:0,netSettlementAmount:(c=t.netSettlementAmount)!=null?c:0,settledBy:t.settledBy,settledAt:(m=t.settledAt)!=null?m:t.lastModified,notes:(p=t.settlementNotes)!=null?p:null}:null;return{memberId:t.id,stage:t.stage,reason:(u=t.reason)!=null?u:null,requestedBy:(h=t.requestedBy)!=null?h:null,referenceId:(y=t.referenceId)!=null?y:null,settlement:n,version:t.version,lastModified:t.lastModified}}},pt=class{constructor(e){this.db=e}async upsert(e){return await this.db.get(f.memberNumberPolicies,e.id)?this.db.update(f.memberNumberPolicies,e.id,e):this.db.create(f.memberNumberPolicies,e)}async getActive(e){var a;let t=ye();return(a=(await this.list(e)).filter(i=>Be(i.effectiveDate,t)).sort((i,o)=>o.effectiveDate.localeCompare(i.effectiveDate))[0])!=null?a:null}async list(e){var t,n;return this.db.query(f.memberNumberPolicies,{filters:{and:[{deleted:!1},{koperasiId:e.koperasiId},{tenantId:(t=e.tenantId)!=null?t:null},{branchId:(n=e.branchId)!=null?n:null}]},sort:[{field:"effectiveDate",direction:"desc"}]})}},gt=class{constructor(e){this.db=e}async create(e){return this.db.create(f.governanceMeetings,e)}async update(e,t){return this.db.update(f.governanceMeetings,e,t)}async getById(e){return this.db.get(f.governanceMeetings,e)}async list(e){var n,a;let t=[];return e!=null&&e.includeDeleted||t.push({deleted:!1}),e!=null&&e.status&&t.push({status:e.status}),(e==null?void 0:e.tenantId)!==void 0&&t.push({tenantId:(n=e.tenantId)!=null?n:null}),(e==null?void 0:e.branchId)!==void 0&&t.push({branchId:(a=e.branchId)!=null?a:null}),this.db.query(f.governanceMeetings,{filters:F(t),sort:[{field:"meetingDate",direction:"desc"}]})}},yt=class{constructor(e){this.db=e}async create(e){return this.db.create(f.governanceAgendaItems,e)}async update(e,t){return this.db.update(f.governanceAgendaItems,e,t)}async getById(e){return this.db.get(f.governanceAgendaItems,e)}async listByMeeting(e){return this.db.query(f.governanceAgendaItems,{filters:{and:[{deleted:!1},{meetingId:e}]},sort:[{field:"orderNo",direction:"asc"},{field:"lastModified",direction:"desc"}]})}},ft=class{constructor(e){this.db=e}async create(e){return this.db.create(f.governanceVotes,e)}async update(e,t){return this.db.update(f.governanceVotes,e,t)}async listByAgenda(e){return this.db.query(f.governanceVotes,{filters:{and:[{deleted:!1},{agendaItemId:e}]},sort:[{field:"votedAt",direction:"desc"}]})}async getByAgendaAndMember(e,t){var a;return(a=(await this.db.query(f.governanceVotes,{filters:{and:[{deleted:!1},{agendaItemId:e},{memberId:t}]},sort:[{field:"lastModified",direction:"desc"}],limit:1}))[0])!=null?a:null}},ht=class{constructor(e){this.db=e}async create(e){return this.db.create(f.leadershipTerms,e)}async update(e,t){return this.db.update(f.leadershipTerms,e,t)}async getById(e){return this.db.get(f.leadershipTerms,e)}async list(e){var n,a;let t=[];return e!=null&&e.includeDeleted||t.push({deleted:!1}),e!=null&&e.status&&t.push({status:e.status}),e!=null&&e.roleType&&t.push({roleType:e.roleType}),(e==null?void 0:e.tenantId)!==void 0&&t.push({tenantId:(n=e.tenantId)!=null?n:null}),(e==null?void 0:e.branchId)!==void 0&&t.push({branchId:(a=e.branchId)!=null?a:null}),e!=null&&e.memberId&&t.push({memberId:e.memberId}),this.db.query(f.leadershipTerms,{filters:F(t),sort:[{field:"startDate",direction:"desc"}]})}},bt=class{constructor(e){this.db=e}async create(e){return this.db.create(f.managementReports,e)}async update(e,t){return this.db.update(f.managementReports,e,t)}async getById(e){return this.db.get(f.managementReports,e)}async list(e){var n,a;let t=[];return e!=null&&e.includeDeleted||t.push({deleted:!1}),e!=null&&e.status&&t.push({status:e.status}),e!=null&&e.reportType&&t.push({reportType:e.reportType}),e!=null&&e.periodCode&&t.push({periodCode:e.periodCode}),(e==null?void 0:e.tenantId)!==void 0&&t.push({tenantId:(n=e.tenantId)!=null?n:null}),(e==null?void 0:e.branchId)!==void 0&&t.push({branchId:(a=e.branchId)!=null?a:null}),this.db.query(f.managementReports,{filters:F(t),sort:[{field:"lastModified",direction:"desc"}]})}},vt=class{constructor(e){this.db=e}async upsert(e){return await this.db.get(f.oversightPolicies,e.id)?this.db.update(f.oversightPolicies,e.id,e):this.db.create(f.oversightPolicies,e)}async getActive(e){var a;let t=ye();return(a=(await this.list(e)).filter(i=>Be(i.effectiveDate,t)).sort((i,o)=>o.effectiveDate.localeCompare(i.effectiveDate))[0])!=null?a:null}async list(e){var t,n;return this.db.query(f.oversightPolicies,{filters:{and:[{deleted:!1},{tenantId:(t=e.tenantId)!=null?t:null},{branchId:(n=e.branchId)!=null?n:null}]},sort:[{field:"effectiveDate",direction:"desc"}]})}},It=class{constructor(e){this.db=e}async create(e){return this.db.create(f.riskRegisters,e)}async update(e,t){return this.db.update(f.riskRegisters,e,t)}async getById(e){return this.db.get(f.riskRegisters,e)}async list(e){var n,a;let t=[];return e!=null&&e.includeDeleted||t.push({deleted:!1}),e!=null&&e.status&&t.push({status:e.status}),e!=null&&e.category&&t.push({category:e.category}),(e==null?void 0:e.tenantId)!==void 0&&t.push({tenantId:(n=e.tenantId)!=null?n:null}),(e==null?void 0:e.branchId)!==void 0&&t.push({branchId:(a=e.branchId)!=null?a:null}),this.db.query(f.riskRegisters,{filters:F(t),sort:[{field:"riskScore",direction:"desc"},{field:"lastModified",direction:"desc"}]})}},Rt=class{constructor(e){this.db=e}async create(e){return this.db.create(f.whistleReports,e)}async update(e,t){return this.db.update(f.whistleReports,e,t)}async getById(e){return this.db.get(f.whistleReports,e)}async list(e){var n,a;let t=[];return e!=null&&e.includeDeleted||t.push({deleted:!1}),e!=null&&e.status&&t.push({status:e.status}),e!=null&&e.channel&&t.push({channel:e.channel}),(e==null?void 0:e.tenantId)!==void 0&&t.push({tenantId:(n=e.tenantId)!=null?n:null}),(e==null?void 0:e.branchId)!==void 0&&t.push({branchId:(a=e.branchId)!=null?a:null}),this.db.query(f.whistleReports,{filters:F(t),sort:[{field:"lastModified",direction:"desc"}]})}},St=class{constructor(e){this.db=e}async create(e){return this.db.create(f.savingPolicies,e)}async markSuperseded(e){await this.db.update(f.savingPolicies,e,{isSuperseded:!0,lastModified:ye()})}async getActive(e){var a;let t=ye();return(a=(await this.getPolicyHistory(e)).filter(i=>Be(i.effectiveDate,t)).sort((i,o)=>o.effectiveDate.localeCompare(i.effectiveDate))[0])!=null?a:null}async getPolicyHistory(e){var t,n;return this.db.query(f.savingPolicies,{filters:{and:[{deleted:!1},{koperasiId:e.koperasiId},{tenantId:(t=e.tenantId)!=null?t:null},{branchId:(n=e.branchId)!=null?n:null}]},sort:[{field:"effectiveDate",direction:"desc"}]})}},Ct=class{constructor(e){this.db=e}async create(e){return this.db.create(f.savingEntries,e)}async listByMember(e,t){var a,i;let n=[{memberId:e}];return t!=null&&t.includeDeleted||n.push({deleted:!1}),t!=null&&t.dateFrom&&n.push({field:"transactionDate",operator:">=",value:t.dateFrom}),t!=null&&t.dateTo&&n.push({field:"transactionDate",operator:"<=",value:t.dateTo}),(t==null?void 0:t.tenantId)!==void 0&&n.push({tenantId:(a=t.tenantId)!=null?a:null}),(t==null?void 0:t.branchId)!==void 0&&n.push({branchId:(i=t.branchId)!=null?i:null}),this.db.query(f.savingEntries,{filters:F(n),sort:[{field:"transactionDate",direction:"desc"}]})}async listAll(e){var n,a;let t=[];return e!=null&&e.includeDeleted||t.push({deleted:!1}),e!=null&&e.dateFrom&&t.push({field:"transactionDate",operator:">=",value:e.dateFrom}),e!=null&&e.dateTo&&t.push({field:"transactionDate",operator:"<=",value:e.dateTo}),(e==null?void 0:e.tenantId)!==void 0&&t.push({tenantId:(n=e.tenantId)!=null?n:null}),(e==null?void 0:e.branchId)!==void 0&&t.push({branchId:(a=e.branchId)!=null?a:null}),this.db.query(f.savingEntries,{filters:F(t),sort:[{field:"transactionDate",direction:"desc"}]})}async findByReference(e){var a,i,o;let t=[{deleted:!1},{memberId:e.memberId},{savingType:e.savingType},{entryType:e.entryType},{referenceType:e.referenceType},{referenceId:e.referenceId}];return e.tenantId!==void 0&&t.push({tenantId:(a=e.tenantId)!=null?a:null}),e.branchId!==void 0&&t.push({branchId:(i=e.branchId)!=null?i:null}),(o=(await this.db.query(f.savingEntries,{filters:F(t),sort:[{field:"lastModified",direction:"desc"}],limit:1}))[0])!=null?o:null}},wt=class{constructor(e){this.db=e}async upsert(e){return await this.db.get(f.shuConfigs,e.id)?this.db.update(f.shuConfigs,e.id,e):this.db.create(f.shuConfigs,e)}async getActive(e){var a;let t=ye();return(a=(await this.list(e)).filter(i=>Be(i.effectiveDate,t)).sort((i,o)=>o.effectiveDate.localeCompare(i.effectiveDate))[0])!=null?a:null}async list(e,t){var a,i;let n=[{koperasiId:e.koperasiId},{tenantId:(a=e.tenantId)!=null?a:null},{branchId:(i=e.branchId)!=null?i:null}];return t!=null&&t.includeDeleted||n.push({deleted:!1}),this.db.query(f.shuConfigs,{filters:F(n),sort:[{field:"effectiveDate",direction:"desc"}]})}},Pt=class{constructor(e){this.db=e}async create(e){return this.db.create(f.shuPeriods,e)}async update(e,t){return this.db.update(f.shuPeriods,e,t)}async getById(e){return this.db.get(f.shuPeriods,e)}async list(e){var n,a;let t=[];return e!=null&&e.includeDeleted||t.push({deleted:!1}),(e==null?void 0:e.tenantId)!==void 0&&t.push({tenantId:(n=e.tenantId)!=null?n:null}),(e==null?void 0:e.branchId)!==void 0&&t.push({branchId:(a=e.branchId)!=null?a:null}),this.db.query(f.shuPeriods,{filters:F(t),sort:[{field:"lastModified",direction:"desc"}]})}},At=class{constructor(e){this.db=e}async createMany(e){return e.length===0?[]:this.db.bulkCreate(f.shuAllocations,e)}async listByPeriod(e,t){let n=[{shuPeriodId:e}];return t!=null&&t.includeDeleted||n.push({deleted:!1}),t!=null&&t.memberId&&n.push({memberId:t.memberId}),this.db.query(f.shuAllocations,{filters:F(n),sort:[{field:"lastModified",direction:"desc"}]})}},Mt=class{constructor(e){this.db=e}async create(e){return this.db.create(f.governanceDecisionArchives,e)}async getByMeeting(e){var n;return(n=(await this.db.query(f.governanceDecisionArchives,{filters:{and:[{deleted:!1},{meetingId:e}]},sort:[{field:"archivedAt",direction:"desc"}],limit:1}))[0])!=null?n:null}},kt=class{constructor(e){this.db=e}async create(e){return this.db.create(f.leadershipAppointments,e)}async update(e,t){return this.db.update(f.leadershipAppointments,e,t)}async getById(e){return this.db.get(f.leadershipAppointments,e)}async list(e){var n,a;let t=[];return e!=null&&e.includeDeleted||t.push({deleted:!1}),e!=null&&e.status&&t.push({status:e.status}),e!=null&&e.roleType&&t.push({roleType:e.roleType}),(e==null?void 0:e.tenantId)!==void 0&&t.push({tenantId:(n=e.tenantId)!=null?n:null}),(e==null?void 0:e.branchId)!==void 0&&t.push({branchId:(a=e.branchId)!=null?a:null}),this.db.query(f.leadershipAppointments,{filters:F(t),sort:[{field:"proposedAt",direction:"desc"}]})}},Dt=class{constructor(e){this.db=e}async create(e){return this.db.create(f.shuParticipationEntries,e)}async createMany(e){return e.length===0?[]:this.db.bulkCreate(f.shuParticipationEntries,e)}async listByPeriod(e,t){var a,i;let n=[{shuPeriodId:e}];return t!=null&&t.includeDeleted||n.push({deleted:!1}),t!=null&&t.memberId&&n.push({memberId:t.memberId}),t!=null&&t.participationType&&n.push({participationType:t.participationType}),(t==null?void 0:t.tenantId)!==void 0&&n.push({tenantId:(a=t.tenantId)!=null?a:null}),(t==null?void 0:t.branchId)!==void 0&&n.push({branchId:(i=t.branchId)!=null?i:null}),this.db.query(f.shuParticipationEntries,{filters:F(n),sort:[{field:"lastModified",direction:"desc"}]})}},Tt=class{constructor(e){this.db=e}async create(e){return this.db.create(f.communityProfiles,e)}async update(e,t){return this.db.update(f.communityProfiles,e,t)}async getById(e){return this.db.get(f.communityProfiles,e)}async list(e){var n,a;let t=[];return e!=null&&e.includeDeleted||t.push({deleted:!1}),e!=null&&e.profileType&&t.push({profileType:e.profileType}),(e==null?void 0:e.isActive)!==void 0&&t.push({isActive:e.isActive}),(e==null?void 0:e.tenantId)!==void 0&&t.push({tenantId:(n=e.tenantId)!=null?n:null}),(e==null?void 0:e.branchId)!==void 0&&t.push({branchId:(a=e.branchId)!=null?a:null}),this.db.query(f.communityProfiles,{filters:F(t),sort:[{field:"lastModified",direction:"desc"}]})}},xt=class{constructor(e){this.db=e}async create(e){return this.db.create(f.memberDependents,e)}async update(e,t){return this.db.update(f.memberDependents,e,t)}async getById(e){return this.db.get(f.memberDependents,e)}async listByMember(e,t){var a,i;let n=[{memberId:e}];return t!=null&&t.includeDeleted||n.push({deleted:!1}),t!=null&&t.relationship&&n.push({relationship:t.relationship}),(t==null?void 0:t.tenantId)!==void 0&&n.push({tenantId:(a=t.tenantId)!=null?a:null}),(t==null?void 0:t.branchId)!==void 0&&n.push({branchId:(i=t.branchId)!=null?i:null}),this.db.query(f.memberDependents,{filters:F(n),sort:[{field:"lastModified",direction:"desc"}]})}};function te(r){return{memberRepository:new lt(r),memberWaConsentRepository:new mt(r),memberExitStateRepository:new ut(r),memberNumberPolicyRepository:new pt(r),governanceMeetingRepository:new gt(r),governanceAgendaRepository:new yt(r),governanceVoteRepository:new ft(r),governanceDecisionArchiveRepository:new Mt(r),leadershipTermRepository:new ht(r),managementReportRepository:new bt(r),oversightPolicyRepository:new vt(r),riskRegisterRepository:new It(r),whistleReportRepository:new Rt(r),savingPolicyRepository:new St(r),savingLedgerRepository:new Ct(r),shuConfigRepository:new wt(r),shuPeriodRepository:new Pt(r),shuAllocationRepository:new At(r),leadershipAppointmentRepository:new kt(r),shuParticipationEntryRepository:new Dt(r),communityProfileRepository:new Tt(r),memberDependentRepository:new xt(r)}}var Me=class extends Error{constructor(t,n){super(n);this.code=t;this.name="OfcoopDomainError"}};function w(r,e){return new Me("RESOURCE_NOT_FOUND",`${r} not found: ${e}`)}function U(r){return new Me("CONFLICT",r)}function l(r){return new Me("INVALID_STATE",r)}function Gt(r){var e,t,n;if(!((e=r.koperasiId)!=null&&e.trim()))throw l("koperasiId is required");if(!((t=r.tenantId)!=null&&t.trim()))throw l("tenantId is required");if(!((n=r.effectiveDate)!=null&&n.trim()))throw l("effectiveDate is required");if(r.paddingDigits<1)throw l("paddingDigits must be >= 1");if(r.counterStart<0)throw l("counterStart must be >= 0");if(r.includeMonth&&!r.includeYear)throw l("includeMonth requires includeYear")}import{cloneValue as an,makeIdFactory as on,nowIso as sn,unwrap as A}from"ofcore";function g(){return sn()}function D(r){return on(r)}function je(r){return an(r)}async function S(r,e){var t;if(r.emitEvent)try{await r.emitEvent(e)}catch(n){(t=r.logger)==null||t.logError(n,{message:"[ofcoop] domain event sink failed",eventName:e.name})}}async function b(r){try{return{data:await r}}catch(e){return{error:{code:e.code||"INTERNAL_ERROR",message:e.message||"An unexpected error occurred",timestamp:g()}}}}var Ne=class{constructor(e,t={}){this.repos=e;this.options=t;this.newId=D("member-number-policy")}async getActiveMemberNumberPolicy(e){return b(this.repos.memberNumberPolicyRepository.getActive(e))}async upsertMemberNumberPolicy(e){return b((async()=>{var o;Gt(e);let t={koperasiId:e.koperasiId,tenantId:e.tenantId,branchId:e.branchId},n=await this.repos.memberNumberPolicyRepository.getActive(t),a=g();if(n){let s=await this.repos.memberNumberPolicyRepository.upsert({...n,...e,version:n.version+1,lastModified:a});return await S(this.options,{name:"member-number.policy-upserted",occurredAt:a,entityId:s.id,tenantId:s.tenantId,branchId:s.branchId,payload:{prefix:s.prefix,includeYear:s.includeYear,includeMonth:s.includeMonth,separator:s.separator,paddingDigits:s.paddingDigits,counterStart:s.counterStart,manualOverrideAllowed:s.manualOverrideAllowed,effectiveDate:s.effectiveDate}}),s}let i=await this.repos.memberNumberPolicyRepository.upsert({id:this.newId(),...e,approvalRef:(o=e.approvalRef)!=null?o:null,version:1,lastModified:a,deleted:!1});return await S(this.options,{name:"member-number.policy-upserted",occurredAt:a,entityId:i.id,tenantId:i.tenantId,branchId:i.branchId,payload:{prefix:i.prefix,includeYear:i.includeYear,includeMonth:i.includeMonth,separator:i.separator,paddingDigits:i.paddingDigits,counterStart:i.counterStart,manualOverrideAllowed:i.manualOverrideAllowed,effectiveDate:i.effectiveDate}}),i})())}};function $t(r){var e,t,n,a;if(!((e=r.memberNumber)!=null&&e.trim()))throw l("memberNumber is required");if(!((t=r.fullName)!=null&&t.trim()))throw l("fullName is required");if(!((n=r.joinDate)!=null&&n.trim()))throw l("joinDate is required");if(!((a=r.tenantId)!=null&&a.trim()))throw l("tenantId is required")}function qe(r){var e;if(!((e=r.reason)!=null&&e.trim()))throw l("member exit reason is required")}var We=class{constructor(e,t,n={}){this.db=e;this.repos=t;this.options=n;this.newId=D("member")}async inTx(e){return this.db.transaction(async t=>e(te(t)))}async createMember(e){return b((async()=>{var a;if($t(e),(await this.repos.memberRepository.list({tenantId:e.tenantId})).some(i=>i.memberNumber===e.memberNumber&&!i.deleted))throw U(`Member number already exists: ${e.memberNumber}`);let n=await this.repos.memberRepository.create({id:this.newId(),memberNumber:e.memberNumber,fullName:e.fullName,status:"active",joinDate:e.joinDate,exitDate:null,branchId:e.branchId,tenantId:e.tenantId,version:1,lastModified:g(),deleted:!1});return(a=this.options.logger)==null||a.logInfo("[ofcoop] member created",{memberId:n.id,tenantId:n.tenantId,branchId:n.branchId}),await S(this.options,{name:"member.created",occurredAt:g(),entityId:n.id,tenantId:n.tenantId,branchId:n.branchId,payload:{memberNumber:n.memberNumber,fullName:n.fullName,status:n.status,joinDate:n.joinDate}}),n})())}async updateMember(e,t){return b((async()=>{var i,o,s;let n=await this.repos.memberRepository.getById(e);if(!n||n.deleted)throw w("Member",e);let a=await this.repos.memberRepository.update(e,{...t.fullName!==void 0?{fullName:t.fullName}:{},...t.memberNumber!==void 0?{memberNumber:t.memberNumber}:{},version:n.version+1,lastModified:g()});return(i=this.options.logger)==null||i.logInfo("[ofcoop] member updated",{memberId:e}),await S(this.options,{name:"member.updated",occurredAt:g(),entityId:a.id,tenantId:(o=a.tenantId)!=null?o:null,branchId:(s=a.branchId)!=null?s:null,payload:{memberNumber:a.memberNumber,fullName:a.fullName,status:a.status,joinDate:a.joinDate}}),a})())}async getMemberById(e){return b((async()=>{let t=await this.repos.memberRepository.getById(e);return!t||t.deleted?null:t})())}async listMembers(e){return b(this.repos.memberRepository.list(e))}async changeMemberStatus(e,t){return b((async()=>{let n=await this.repos.memberRepository.getById(e);if(!n||n.deleted)throw w("Member",e);return this.repos.memberRepository.update(e,{status:t,version:n.version+1,lastModified:g()})})())}async setMemberWaConsent(e,t){return b(this.inTx(async n=>{let a=await n.memberRepository.getById(e);if(!a||a.deleted)throw w("Member",e);return await n.memberWaConsentRepository.set(e,t),n.memberRepository.update(e,{version:a.version+1,lastModified:g()})}))}async requestMemberExit(e,t){return b(this.inTx(async n=>{var s,d,c,m;qe(t);let a=await n.memberRepository.getById(e);if(!a||a.deleted)throw w("Member",e);if(a.status==="exited")throw U("cannot request exit for exited member");let i=await n.memberExitStateRepository.get(e);if((i==null?void 0:i.stage)==="requested")throw U("member exit already requested");await n.memberExitStateRepository.set(e,"requested",t);let o=await n.memberRepository.update(e,{status:"inactive",version:a.version+1,lastModified:g()});return await S(this.options,{name:"member.exit-requested",occurredAt:g(),entityId:e,tenantId:(s=a.tenantId)!=null?s:null,branchId:(d=a.branchId)!=null?d:null,payload:{reason:(c=t.reason)!=null?c:null,requestedBy:(m=t.requestedBy)!=null?m:null}}),o}))}async settleMemberExit(e,t){return b(this.inTx(async n=>{var s,d,c,m;if(this.options.hasActiveLoan&&await this.options.hasActiveLoan(e))throw l(`Member ${e} masih memiliki pinjaman aktif; selesaikan pinjaman sebelum exit.`);qe(t);let a=await n.memberRepository.getById(e);if(!a||a.deleted)throw w("Member",e);let i=await n.memberExitStateRepository.get(e);if(!i||i.stage!=="requested")throw l(`Member ${e} belum dalam status exit-requested; tidak bisa di-settle.`);await n.memberExitStateRepository.set(e,"settled",t);let o=await n.memberRepository.update(e,{status:"exited",exitDate:g(),version:a.version+1,lastModified:g()});return await S(this.options,{name:"member.exit-settled",occurredAt:g(),entityId:e,tenantId:(s=a.tenantId)!=null?s:null,branchId:(d=a.branchId)!=null?d:null,payload:{reason:(c=t.reason)!=null?c:null,requestedBy:(m=t.requestedBy)!=null?m:null,netSettlementAmount:t.settlement.netSettlementAmount,settledBy:t.settlement.settledBy}}),o}))}async cancelMemberExit(e,t){return b(this.inTx(async n=>{var s,d,c,m;qe(t);let a=await n.memberRepository.getById(e);if(!a||a.deleted)throw w("Member",e);let i=await n.memberExitStateRepository.get(e);if(!i||i.stage!=="requested")throw U("member exit can only be canceled from requested stage");await n.memberExitStateRepository.set(e,"canceled",t);let o=await n.memberRepository.update(e,{status:"active",exitDate:null,version:a.version+1,lastModified:g()});return await S(this.options,{name:"member.exit-canceled",occurredAt:g(),entityId:e,tenantId:(s=a.tenantId)!=null?s:null,branchId:(d=a.branchId)!=null?d:null,payload:{reason:(c=t.reason)!=null?c:null,requestedBy:(m=t.requestedBy)!=null?m:null}}),o}))}async getMemberExitState(e){return b(this.repos.memberExitStateRepository.getMemberExitState(e))}};function Qt(r){var e,t;if(!((e=r.tenantId)!=null&&e.trim()))throw l("tenantId is required");if(!((t=r.regulator)!=null&&t.trim()))throw l("regulator is required")}function dn(r){return r==="pass"?1:r==="warn"?.5:0}function cn(r){return r>=80?"ready":r>=50?"partial":"not_ready"}var Fe=class{constructor(e){this.deps=e}async getComplianceReadinessSnapshot(e){return b((async()=>{var q,L;Qt(e);let t={tenantId:e.tenantId,branchId:e.branchId,periodCode:e.periodCode},[n,a,i,o,s]=await Promise.all([this.deps.leadershipTermService.listLeadershipTerms({status:"active",roleType:"pengurus",tenantId:t.tenantId,branchId:t.branchId}),this.deps.leadershipTermService.listLeadershipTerms({status:"active",roleType:"pengawas",tenantId:t.tenantId,branchId:t.branchId}),this.deps.managementReportService.listManagementReports({status:"approved",periodCode:(q=t.periodCode)!=null?q:void 0,tenantId:t.tenantId,branchId:t.branchId}),this.deps.riskRegisterService.listRiskItems({status:"open",tenantId:t.tenantId,branchId:t.branchId}),this.deps.whistleReportService.listWhistleReports({status:"in_review",tenantId:t.tenantId,branchId:t.branchId})]),d=A(n),c=A(a),m=A(i),p=A(o),u=A(s),h=[],y=d.length>0&&c.length>0;h.push({id:"governance.active-roles",label:"Ketersediaan Pengurus dan Pengawas Aktif",status:y?"pass":"fail",detail:y?"Pengurus dan pengawas aktif tersedia.":"Belum ada pengurus/pengawas aktif yang lengkap.",meta:{activePengurus:d.length,activePengawas:c.length}});let I=m.some(N=>N.reportType==="lpj_pengurus"),v=m.some(N=>N.reportType==="lpj_pengawas"),R=I&&v?"pass":I||v?"warn":"fail";h.push({id:"report.approved-both-roles",label:"LPJ Disetujui (Pengurus + Pengawas)",status:R,detail:R==="pass"?"LPJ pengurus dan pengawas sudah disetujui.":R==="warn"?"Baru salah satu LPJ (pengurus/pengawas) yang disetujui.":"Belum ada LPJ disetujui untuk pengurus/pengawas.",meta:{hasPengurusReport:I,hasPengawasReport:v,periodCode:(L=t.periodCode)!=null?L:null}});let P=(await Promise.all(m.map(async N=>({reportId:N.id,reportType:N.reportType,completeness:A(await this.deps.managementReportService.evaluateManagementReportCompleteness(N.id,e.regulator))})))).filter(N=>N.completeness&&!N.completeness.isComplete),k=m.length===0?"fail":P.length===0?"pass":"warn";h.push({id:"report.completeness",label:`Kelengkapan Paket Laporan (${e.regulator})`,status:k,detail:k==="pass"?"Semua LPJ disetujui sudah memenuhi checklist kelengkapan.":k==="warn"?"Masih ada LPJ disetujui yang belum lengkap field wajib.":"Belum ada LPJ disetujui untuk dievaluasi kelengkapannya.",meta:{regulator:e.regulator,approvedReportCount:m.length,incompleteCount:P.length}});let M=await this.deps.riskRegisterService.listRiskItems({tenantId:t.tenantId,branchId:t.branchId}),T=A(M).filter(N=>{var V;return((V=N.escalationLevel)!=null?V:0)>0&&N.status!=="closed"});h.push({id:"risk.open-escalated",label:"Risiko Tereskalasi Terbuka",status:T.length===0?"pass":"warn",detail:T.length===0?"Tidak ada risiko tereskalasi yang masih terbuka.":`${T.length} risiko tereskalasi masih terbuka.`,meta:{openRiskCount:p.length,escalatedOpenRiskCount:T.length}}),h.push({id:"whistle.in-review",label:"Kasus Whistle Sedang Investigasi",status:u.length===0?"pass":"warn",detail:u.length===0?"Tidak ada kasus whistle yang masih in_review.":`${u.length} kasus whistle masih in_review.`,meta:{inReviewWhistleCount:u.length}});let j=h.reduce((N,V)=>N+dn(V.status),0)/h.length,B=Math.round(j*100);return{generatedAt:g(),scope:{tenantId:t.tenantId,branchId:t.branchId,periodCode:t.periodCode},summary:{score:B,status:cn(B),regulator:e.regulator},checks:h}})())}};function Ht(r){var e,t,n;if(!((e=r.title)!=null&&e.trim()))throw l("meeting title is required");if(!((t=r.meetingDate)!=null&&t.trim()))throw l("meetingDate is required");if(!((n=r.tenantId)!=null&&n.trim()))throw l("tenantId is required");if(!Number.isFinite(r.quorumPercent)||r.quorumPercent<=0||r.quorumPercent>100)throw l("quorumPercent must be between 1 and 100");if(r.eligibleMemberIds!==void 0&&r.eligibleMemberIds!==null){if(!Array.isArray(r.eligibleMemberIds))throw l("eligibleMemberIds must be an array when provided");let a=r.eligibleMemberIds.map(i=>typeof i=="string"?i.trim():"");if(a.some(i=>!i))throw l("eligibleMemberIds cannot contain empty memberId");if(new Set(a).size!==a.length)throw l("eligibleMemberIds must not contain duplicate memberId")}}function Kt(r){var e;if(!((e=r.title)!=null&&e.trim()))throw l("agenda title is required");if(!Number.isInteger(r.orderNo)||r.orderNo<=0)throw l("agenda orderNo must be a positive integer")}function Jt(r){var e,t,n;if(!((e=r.agendaItemId)!=null&&e.trim()))throw l("agendaItemId is required");if(!((t=r.memberId)!=null&&t.trim()))throw l("memberId is required");if(!((n=r.votedAt)!=null&&n.trim()))throw l("votedAt is required")}function zt(r){var e;if(!((e=r.minutes)!=null&&e.trim()))throw l("minutes is required")}function Yt(r){var t,n,a;if(!(!!((t=r.minutesArtifactRef)!=null&&t.trim())||!!((n=r.attendanceArtifactRef)!=null&&n.trim())||!!((a=r.ratDecisionBundleRef)!=null&&a.trim())))throw l("at least one meeting artifact reference is required")}function Zt(r){var t,n,a,i;if(!((t=r.status)!=null&&t.trim()))throw l("agenda close status is required");if(r.status==="approved"||r.status==="rejected"){if(!((n=r.decisionArtifactRef)!=null&&n.trim()))throw l("decisionArtifactRef is required when agenda status is approved/rejected");if(!((a=r.decidedAt)!=null&&a.trim()))throw l("decidedAt is required when agenda status is approved/rejected");if(!((i=r.decidedByMemberId)!=null&&i.trim()))throw l("decidedByMemberId is required when agenda status is approved/rejected")}}var Ue=class{constructor(e,t,n={}){this.db=e;this.repos=t;this.options=n;this.newMeetingId=D("gov-meeting");this.newAgendaId=D("gov-agenda");this.newVoteId=D("gov-vote");this.newArchiveId=D("gov-archive")}async inTx(e){return this.db.transaction(async t=>e(te(t)))}async createMeeting(e){return b((async()=>{var a,i;Ht(e);let t=e.eligibleMemberIds&&e.eligibleMemberIds.length>0?[...new Set(e.eligibleMemberIds.map(o=>o.trim()))]:null,n=await this.repos.governanceMeetingRepository.create({id:this.newMeetingId(),title:e.title.trim(),meetingDate:e.meetingDate,status:"draft",quorumPercent:e.quorumPercent,eligibleMemberIds:t,notes:(a=e.notes)!=null?a:null,minutes:null,decisionSummary:null,minutesArtifactRef:null,attendanceArtifactRef:null,ratDecisionBundleRef:null,chairpersonMemberId:null,secretaryMemberId:null,branchId:e.branchId,tenantId:e.tenantId,version:1,lastModified:g(),deleted:!1});return(i=this.options.logger)==null||i.logInfo("[ofcoop] governance meeting created",{meetingId:n.id,tenantId:n.tenantId,branchId:n.branchId}),await S(this.options,{name:"governance.meeting-created",occurredAt:g(),entityId:n.id,tenantId:n.tenantId,branchId:n.branchId,payload:{title:n.title,status:n.status}}),n})())}async getMeetingById(e){return b((async()=>{let t=await this.repos.governanceMeetingRepository.getById(e);return!t||t.deleted?null:t})())}async listMeetings(e){return b(this.repos.governanceMeetingRepository.list(e))}async addAgendaItem(e,t){return b((async()=>{var i;Kt(t);let n=await this.repos.governanceMeetingRepository.getById(e);if(!n||n.deleted)throw w("GovernanceMeeting",e);if(n.status==="closed")throw l("Cannot add agenda item to a closed meeting");let a=await this.repos.governanceAgendaRepository.create({id:this.newAgendaId(),meetingId:e,title:t.title.trim(),description:(i=t.description)!=null?i:null,orderNo:t.orderNo,status:"open",decisionArtifactRef:null,decisionNumber:null,decidedAt:null,decidedByMemberId:null,decisionNote:null,branchId:n.branchId,tenantId:n.tenantId,version:1,lastModified:g(),deleted:!1});return await S(this.options,{name:"governance.agenda-created",occurredAt:g(),entityId:a.id,tenantId:a.tenantId,branchId:a.branchId,payload:{meetingId:e,orderNo:a.orderNo}}),a})())}async listAgendaItems(e){return b(this.repos.governanceAgendaRepository.listByMeeting(e))}async startVoting(e){return b((async()=>{let t=await this.repos.governanceMeetingRepository.getById(e);if(!t||t.deleted)throw w("GovernanceMeeting",e);if(t.status==="closed")throw l("Cannot start voting on closed meeting");let n=await this.repos.governanceMeetingRepository.update(e,{status:"voting",version:t.version+1,lastModified:g()});return await S(this.options,{name:"governance.meeting-voting-started",occurredAt:g(),entityId:n.id,tenantId:n.tenantId,branchId:n.branchId,payload:{status:n.status}}),n})())}async recordVote(e,t){return b(this.inTx(async n=>{var c,m;Jt(t);let a=await n.governanceMeetingRepository.getById(e);if(!a||a.deleted)throw w("GovernanceMeeting",e);if(a.status!=="voting")throw l("Voting is only allowed when meeting status is voting");let i=await n.governanceAgendaRepository.getById(t.agendaItemId);if(!i||i.deleted)throw w("GovernanceAgendaItem",t.agendaItemId);if(i.meetingId!==e)throw U("Agenda item does not belong to the target meeting");if(i.status!=="open")throw l("Voting is only allowed for open agenda item");let o=await n.memberRepository.getById(t.memberId);if(!o||o.deleted)throw w("Member",t.memberId);if(o.status!=="active")throw l("Only active member can vote");if(a.eligibleMemberIds&&a.eligibleMemberIds.length>0&&!a.eligibleMemberIds.includes(t.memberId))throw l("Member is not eligible to vote in this meeting");let s=await n.governanceVoteRepository.getByAgendaAndMember(t.agendaItemId,t.memberId);if(s&&!s.deleted)return n.governanceVoteRepository.update(s.id,{choice:t.choice,votedAt:t.votedAt,notes:(c=t.notes)!=null?c:null,version:s.version+1,lastModified:g()});let d=await n.governanceVoteRepository.create({id:this.newVoteId(),meetingId:e,agendaItemId:t.agendaItemId,memberId:t.memberId,choice:t.choice,votedAt:t.votedAt,notes:(m=t.notes)!=null?m:null,branchId:a.branchId,tenantId:a.tenantId,version:1,lastModified:g(),deleted:!1});return await S(this.options,{name:"governance.vote-recorded",occurredAt:g(),entityId:d.id,tenantId:d.tenantId,branchId:d.branchId,payload:{meetingId:e,agendaItemId:d.agendaItemId,memberId:d.memberId,choice:d.choice}}),d}))}async getAgendaVoteSummary(e){return b((async()=>{let t=await this.repos.governanceAgendaRepository.getById(e);if(!t||t.deleted)throw w("GovernanceAgendaItem",e);let n=await this.repos.governanceMeetingRepository.getById(t.meetingId);if(!n||n.deleted)throw w("GovernanceMeeting",t.meetingId);let a=await this.repos.governanceVoteRepository.listByAgenda(e),i=await this.repos.memberRepository.list({status:"active",tenantId:n.tenantId,branchId:n.branchId}),s=(n.eligibleMemberIds&&n.eligibleMemberIds.length>0?i.filter(p=>{var u;return(u=n.eligibleMemberIds)==null?void 0:u.includes(p.id)}):i).length,d=n.eligibleMemberIds&&n.eligibleMemberIds.length>0?"meeting-eligible-members":"active-members",c=s>0&&a.length/s*100>=n.quorumPercent,m={agendaItemId:e,totalVotes:a.length,eligibleVoters:s,eligibleVotersSource:d,quorumPercent:n.quorumPercent,quorumReached:c,yes:0,no:0,abstain:0};for(let p of a)p.choice==="yes"&&(m.yes+=1),p.choice==="no"&&(m.no+=1),p.choice==="abstain"&&(m.abstain+=1);return m})())}async closeAgendaItem(e,t){return b((async()=>{var s,d,c,m,p,u,h,y,I,v,R,C;Zt(t);let n=await this.repos.governanceAgendaRepository.getById(e);if(!n||n.deleted)throw w("GovernanceAgendaItem",e);let a=await this.repos.governanceMeetingRepository.getById(n.meetingId);if(!a||a.deleted)throw w("GovernanceMeeting",n.meetingId);let i=A(await this.getAgendaVoteSummary(e));if(!i.quorumReached&&t.status!=="deferred")throw l(`Cannot close agenda as ${t.status} because quorum is not reached (${i.totalVotes}/${i.eligibleVoters})`);if(t.status==="approved"&&i.yes<=i.no)throw l("Cannot close agenda as approved when yes votes are not greater than no votes");if(t.status==="rejected"&&i.no<i.yes)throw l("Cannot close agenda as rejected when no votes are lower than yes votes");if((s=t.decidedByMemberId)!=null&&s.trim()){let P=await this.repos.memberRepository.getById(t.decidedByMemberId.trim());if(!P||P.deleted)throw w("Member",t.decidedByMemberId.trim());if(P.status!=="active")throw l("decidedByMemberId must refer to active member")}let o=await this.repos.governanceAgendaRepository.update(e,{status:t.status,decisionArtifactRef:t.decisionArtifactRef===void 0?(d=n.decisionArtifactRef)!=null?d:null:((c=t.decisionArtifactRef)==null?void 0:c.trim())||null,decisionNumber:t.decisionNumber===void 0?(m=n.decisionNumber)!=null?m:null:((p=t.decisionNumber)==null?void 0:p.trim())||null,decidedAt:t.decidedAt===void 0?(u=n.decidedAt)!=null?u:null:t.decidedAt,decidedByMemberId:t.decidedByMemberId===void 0?(h=n.decidedByMemberId)!=null?h:null:((y=t.decidedByMemberId)==null?void 0:y.trim())||null,decisionNote:t.decisionNote===void 0?(I=n.decisionNote)!=null?I:null:(v=t.decisionNote)!=null?v:null,version:n.version+1,lastModified:g()});return await S(this.options,{name:"governance.agenda-closed",occurredAt:g(),entityId:o.id,tenantId:o.tenantId,branchId:o.branchId,payload:{status:o.status,meetingId:o.meetingId,decisionArtifactRef:(R=o.decisionArtifactRef)!=null?R:null,decidedAt:(C=o.decidedAt)!=null?C:null}}),o})())}async closeMeeting(e){return b((async()=>{let t=await this.repos.governanceMeetingRepository.getById(e);if(!t||t.deleted)throw w("GovernanceMeeting",e);let n=await this.repos.governanceMeetingRepository.update(e,{status:"closed",version:t.version+1,lastModified:g()});return await S(this.options,{name:"governance.meeting-closed",occurredAt:g(),entityId:n.id,tenantId:n.tenantId,branchId:n.branchId,payload:{status:n.status}}),n})())}async recordMeetingMinutes(e,t){return b((async()=>{var i;zt(t);let n=await this.repos.governanceMeetingRepository.getById(e);if(!n||n.deleted)throw w("GovernanceMeeting",e);if(n.status!=="closed")throw l("Meeting minutes can only be recorded after meeting is closed");let a=await this.repos.governanceMeetingRepository.update(e,{minutes:t.minutes.trim(),decisionSummary:((i=t.decisionSummary)==null?void 0:i.trim())||null,version:n.version+1,lastModified:g()});return await S(this.options,{name:"governance.meeting-minutes-recorded",occurredAt:g(),entityId:a.id,tenantId:a.tenantId,branchId:a.branchId,payload:{hasDecisionSummary:!!a.decisionSummary}}),a})())}async recordMeetingArtifacts(e,t){return b((async()=>{var i,o,s,d,c,m,p,u,h,y,I,v,R,C,P,k;Yt(t);let n=await this.repos.governanceMeetingRepository.getById(e);if(!n||n.deleted)throw w("GovernanceMeeting",e);if(n.status!=="closed")throw l("Meeting artifacts can only be recorded after meeting is closed");if(!((i=n.minutes)!=null&&i.trim()))throw l("Meeting artifacts require minutes to be recorded first");if((o=t.chairpersonMemberId)!=null&&o.trim()){let M=await this.repos.memberRepository.getById(t.chairpersonMemberId.trim());if(!M||M.deleted)throw w("Member",t.chairpersonMemberId.trim());if(M.status!=="active")throw l("chairpersonMemberId must refer to active member")}if((s=t.secretaryMemberId)!=null&&s.trim()){let M=await this.repos.memberRepository.getById(t.secretaryMemberId.trim());if(!M||M.deleted)throw w("Member",t.secretaryMemberId.trim());if(M.status!=="active")throw l("secretaryMemberId must refer to active member")}let a=await this.repos.governanceMeetingRepository.update(e,{minutesArtifactRef:t.minutesArtifactRef===void 0?(d=n.minutesArtifactRef)!=null?d:null:((c=t.minutesArtifactRef)==null?void 0:c.trim())||null,attendanceArtifactRef:t.attendanceArtifactRef===void 0?(m=n.attendanceArtifactRef)!=null?m:null:((p=t.attendanceArtifactRef)==null?void 0:p.trim())||null,ratDecisionBundleRef:t.ratDecisionBundleRef===void 0?(u=n.ratDecisionBundleRef)!=null?u:null:((h=t.ratDecisionBundleRef)==null?void 0:h.trim())||null,chairpersonMemberId:t.chairpersonMemberId===void 0?(y=n.chairpersonMemberId)!=null?y:null:((I=t.chairpersonMemberId)==null?void 0:I.trim())||null,secretaryMemberId:t.secretaryMemberId===void 0?(v=n.secretaryMemberId)!=null?v:null:((R=t.secretaryMemberId)==null?void 0:R.trim())||null,version:n.version+1,lastModified:g()});return await S(this.options,{name:"governance.meeting-artifacts-recorded",occurredAt:g(),entityId:a.id,tenantId:a.tenantId,branchId:a.branchId,payload:{minutesArtifactRef:(C=a.minutesArtifactRef)!=null?C:null,attendanceArtifactRef:(P=a.attendanceArtifactRef)!=null?P:null,ratDecisionBundleRef:(k=a.ratDecisionBundleRef)!=null?k:null}}),a})())}async archiveDecisions(e,t={}){return b((async()=>{var h;let n=await this.repos.governanceMeetingRepository.getById(e);if(!n||n.deleted)throw w("GovernanceMeeting",e);if(n.status!=="closed")throw l("Decisions can only be archived after the meeting is closed");let a=await this.repos.governanceDecisionArchiveRepository.getByMeeting(e);if(a)return a;let o=(await this.repos.governanceAgendaRepository.listByMeeting(e)).filter(y=>y.status!=="open"&&!y.deleted);if(o.length===0)throw l("Cannot archive decisions: no decided agenda items found for this meeting");let s=o.map(y=>{var I,v,R,C,P;return{agendaItemId:y.id,title:y.title,orderNo:y.orderNo,status:y.status,decisionNumber:(I=y.decisionNumber)!=null?I:null,decisionArtifactRef:(v=y.decisionArtifactRef)!=null?v:null,decidedAt:(R=y.decidedAt)!=null?R:null,decidedByMemberId:(C=y.decidedByMemberId)!=null?C:null,decisionNote:(P=y.decisionNote)!=null?P:null}}),d=s.filter(y=>y.status==="approved").length,c=s.filter(y=>y.status==="rejected").length,m=s.filter(y=>y.status==="deferred").length,p=g(),u=await this.repos.governanceDecisionArchiveRepository.create({id:this.newArchiveId(),meetingId:e,meetingTitle:n.title,meetingDate:n.meetingDate,archivedAt:p,archivedBy:(h=t.archivedBy)!=null?h:null,totalItems:s.length,approvedCount:d,rejectedCount:c,deferredCount:m,items:s,branchId:n.branchId,tenantId:n.tenantId,version:1,lastModified:p,deleted:!1});return await S(this.options,{name:"governance.decisions-archived",occurredAt:p,entityId:e,tenantId:n.tenantId,branchId:n.branchId,payload:{totalItems:u.totalItems,approvedCount:d,rejectedCount:c,deferredCount:m}}),u})())}async getDecisionArchive(e){return b(this.repos.governanceDecisionArchiveRepository.getByMeeting(e))}};function Xt(r){var e,t,n,a;if(!((e=r.memberId)!=null&&e.trim()))throw l("memberId is required");if(!((t=r.positionTitle)!=null&&t.trim()))throw l("positionTitle is required");if(!((n=r.startDate)!=null&&n.trim()))throw l("startDate is required");if(!((a=r.tenantId)!=null&&a.trim()))throw l("tenantId is required")}function er(r){var e;if(!((e=r.endDate)!=null&&e.trim()))throw l("endDate is required")}function tr(r){var e,t;if(!((e=r.successorMemberId)!=null&&e.trim()))throw l("successorMemberId is required");if(!((t=r.effectiveDate)!=null&&t.trim()))throw l("effectiveDate is required")}var _e=class{constructor(e,t={}){this.repos=e;this.options=t;this.newId=D("leadership-term")}async createLeadershipTerm(e){return b((async()=>{var s,d,c;Xt(e);let t=await this.repos.memberRepository.getById(e.memberId);if(!t||t.deleted)throw w("Member",e.memberId);if(t.status!=="active")throw l("Only active member can hold leadership term");if((await this.repos.leadershipTermRepository.list({includeDeleted:!1,status:"active",roleType:e.roleType,tenantId:e.tenantId,branchId:e.branchId,memberId:e.memberId})).length>0)throw U("Member already has active leadership term for this role");if((await this.repos.leadershipTermRepository.list({includeDeleted:!1,status:"active",roleType:e.roleType,tenantId:e.tenantId,branchId:e.branchId})).some(m=>m.positionTitle.trim().toLowerCase()===e.positionTitle.trim().toLowerCase()))throw U("Position already has active leadership term");let o=await this.repos.leadershipTermRepository.create({id:this.newId(),memberId:e.memberId,roleType:e.roleType,positionTitle:e.positionTitle.trim(),startDate:e.startDate,endDate:(s=e.endDate)!=null?s:null,handoverFromTermId:(d=e.handoverFromTermId)!=null?d:null,status:"active",notes:(c=e.notes)!=null?c:null,tenantId:e.tenantId,branchId:e.branchId,version:1,lastModified:g(),deleted:!1});return await S(this.options,{name:"governance.leadership-term-created",occurredAt:g(),entityId:o.id,tenantId:o.tenantId,branchId:o.branchId,payload:{roleType:o.roleType,memberId:o.memberId}}),o})())}async endLeadershipTerm(e,t){return b((async()=>{var i,o;er(t);let n=await this.repos.leadershipTermRepository.getById(e);if(!n||n.deleted)throw w("LeadershipTerm",e);if(n.status!=="active")throw l("Leadership term is already ended");let a=await this.repos.leadershipTermRepository.update(e,{endDate:t.endDate,notes:(o=(i=t.notes)!=null?i:n.notes)!=null?o:null,status:"ended",version:n.version+1,lastModified:g()});return await S(this.options,{name:"governance.leadership-term-ended",occurredAt:g(),entityId:a.id,tenantId:a.tenantId,branchId:a.branchId,payload:{roleType:a.roleType,memberId:a.memberId}}),a})())}async handoverLeadershipTerm(e,t){return b((async()=>{var d,c,m,p;tr(t);let n=await this.repos.leadershipTermRepository.getById(e);if(!n||n.deleted)throw w("LeadershipTerm",e);if(n.status!=="active")throw l("Leadership term is already ended");if(n.memberId===t.successorMemberId)throw l("successorMemberId must be different from current member");let a=await this.endLeadershipTerm(e,{endDate:t.effectiveDate,notes:(c=(d=t.notes)!=null?d:n.notes)!=null?c:null});if("error"in a)throw new Error(a.error.message);let i=a.data,o=await this.createLeadershipTerm({memberId:t.successorMemberId,roleType:n.roleType,positionTitle:((m=t.positionTitle)==null?void 0:m.trim())||n.positionTitle,startDate:t.effectiveDate,tenantId:n.tenantId,branchId:n.branchId,notes:(p=t.notes)!=null?p:null,handoverFromTermId:n.id});if("error"in o)throw new Error(o.error.message);let s=o.data;return{endedTerm:i,successorTerm:s}})())}async getLeadershipTermById(e){return b((async()=>{let t=await this.repos.leadershipTermRepository.getById(e);return!t||t.deleted?null:t})())}async listLeadershipTerms(e={}){return b(this.repos.leadershipTermRepository.list(e))}};function rr(r){var e,t,n,a,i;if(!((e=r.periodCode)!=null&&e.trim()))throw l("periodCode is required");if(!((t=r.title)!=null&&t.trim()))throw l("title is required");if(!((n=r.summary)!=null&&n.trim()))throw l("summary is required");if(!((a=r.preparedByMemberId)!=null&&a.trim()))throw l("preparedByMemberId is required");if(!((i=r.tenantId)!=null&&i.trim()))throw l("tenantId is required")}function nr(r){var e;if(!((e=r.submittedAt)!=null&&e.trim()))throw l("submittedAt is required")}function ar(r){var e,t;if(!((e=r.reviewerMemberId)!=null&&e.trim()))throw l("reviewerMemberId is required");if(!((t=r.reviewedAt)!=null&&t.trim()))throw l("reviewedAt is required")}function Ot(r){if(!["rapat_anggota","dinas_koperasi","ojk"].includes(r))throw l(`unsupported management report audience: ${r}`)}function ir(r){if(!r||typeof r!="object"||Array.isArray(r))throw l("payload must be an object")}var ln=[{id:"kata-pengantar",title:"Kata Pengantar / Pendahuluan",fields:[{key:"identity.koperasiName",label:"Nama koperasi",required:!0},{key:"identity.bhNumber",label:"Nomor BH",required:!0},{key:"identity.bookYearPeriod",label:"Periode tahun buku",required:!0},{key:"identity.documentDate",label:"Tanggal penyusunan",required:!0},{key:"signatures.ketuaPengurusSignedAt",label:"Tanda tangan Ketua",required:!0},{key:"signatures.sekretarisSignedAt",label:"Tanda tangan Sekretaris",required:!0},{key:"signatures.bendaharaSignedAt",label:"Tanda tangan Bendahara",required:!0}]},{id:"dasar-hukum",title:"Dasar Hukum dan Dasar Pelaporan",fields:[{key:"legal.uu25Pasal22to26",label:"UU 25/1992 Pasal 22-26",required:!0},{key:"legal.adArtRatClause",label:"AD/ART pasal terkait RAT",required:!0},{key:"legal.permenkop19_2015",label:"Permenkop 19/2015",required:!0},{key:"legal.permenkop2_2024",label:"Permenkop 2/2024",required:!0}]},{id:"non-keuangan",title:"Laporan Non-Keuangan (Organisasi & Usaha)",fields:[{key:"members.beginCount",label:"Jumlah anggota awal periode",required:!0},{key:"members.endCount",label:"Jumlah anggota akhir periode",required:!0},{key:"members.inCount",label:"Jumlah anggota masuk",required:!0},{key:"members.outCount",label:"Jumlah anggota keluar",required:!0},{key:"organization.boardStructure",label:"Struktur pengurus & pengawas",required:!0},{key:"business.mainActivities",label:"Kegiatan usaha utama",required:!0},{key:"business.memberTransactionCount",label:"Jumlah transaksi/jasa anggota",required:!0}]},{id:"laporan-keuangan",title:"Laporan Keuangan",fields:[{key:"financial.neracaRef",label:"Referensi Neraca",required:!0},{key:"financial.lphuRef",label:"Referensi LPHU",required:!0},{key:"financial.cashFlowRef",label:"Referensi Arus Kas",required:!0},{key:"financial.equityChangeRef",label:"Referensi Perubahan Ekuitas",required:!0},{key:"financial.notesRef",label:"Referensi Catatan Laporan Keuangan",required:!0}]},{id:"analisis-kinerja",title:"Analisis Kinerja & Penilaian Kesehatan",fields:[{key:"ratios.roaPercent",label:"ROA (%)",required:!0},{key:"ratios.roePercent",label:"ROE (%)",required:!0},{key:"ratios.currentRatioPercent",label:"Current Ratio (%)",required:!0},{key:"ratios.debtToEquityPercent",label:"Debt to Equity (%)",required:!0},{key:"ratios.healthMethod",label:"Metode kesehatan (PEARLS/OJK)",required:!0}]},{id:"realisasi-rencana-kerja",title:"Realisasi Rencana Kerja & Program",fields:[{key:"workPlan.targetVsActualTableRef",label:"Target vs realisasi",required:!0},{key:"workPlan.shuDistributedIdr",label:"SHU dibagikan (IDR)",required:!0}]},{id:"rencana-berikutnya",title:"Rencana Kerja & RAPB Tahun Berikutnya",fields:[{key:"nextPlan.businessPlanSummary",label:"Rencana usaha",required:!0},{key:"nextPlan.revenueTargetIdr",label:"Target pendapatan (IDR)",required:!0},{key:"nextPlan.expenseTargetIdr",label:"Target belanja (IDR)",required:!0},{key:"nextPlan.shuProjectionIdr",label:"Proyeksi SHU (IDR)",required:!0}]},{id:"kesimpulan",title:"Kesimpulan & Rekomendasi",fields:[{key:"conclusion.performanceSummary",label:"Ringkasan kinerja",required:!0},{key:"conclusion.constraintsAndSolution",label:"Hambatan & solusi",required:!0}]},{id:"lampiran",title:"Lampiran",fields:[{key:"attachments.supervisorReportRef",label:"Referensi laporan pengawas",required:!0},{key:"attachments.auditorOpinionRef",label:"Referensi opini akuntan",required:!1},{key:"attachments.inventoryListRef",label:"Referensi daftar inventaris",required:!0},{key:"attachments.ratEvidenceRef",label:"Referensi bukti rapat",required:!0}]}],or=[{id:"identitas-pajak",title:"Identitas Pajak",fields:[{key:"pajak.npwp",label:"NPWP koperasi",required:!0},{key:"pajak.namaKpp",label:"Nama KPP terdaftar",required:!0},{key:"pajak.kodeJenisUsaha",label:"Kode jenis usaha",required:!0},{key:"pajak.tanggalPembukuan",label:"Tanggal pembukuan (tutup buku)",required:!0}]},{id:"rekap-keuangan-fiskal",title:"Rekap Keuangan Fiskal",fields:[{key:"fiskal.totalPendapatanBruto",label:"Total pendapatan bruto (IDR)",required:!0},{key:"fiskal.totalBiayaDiakui",label:"Total biaya yang diakui secara fiskal (IDR)",required:!0},{key:"fiskal.koreksiPositif",label:"Koreksi fiskal positif (IDR)",required:!0},{key:"fiskal.koreksiNegatif",label:"Koreksi fiskal negatif (IDR)",required:!0},{key:"fiskal.penghasilanKenaPajak",label:"Penghasilan kena pajak (IDR)",required:!0}]},{id:"kewajiban-pajak",title:"Kewajiban Pajak",fields:[{key:"pajak.pphBadanTarif",label:"PPh Badan tarif (0% jika omzet \u2264 Rp 4,8 M / PP 23/2018)",required:!0},{key:"pajak.pph21Karyawan",label:"Total PPh 21 karyawan (IDR)",required:!0},{key:"pajak.ppnJikaPkp",label:"PPN (jika PKP) (IDR)",required:!1},{key:"pajak.setoranMasaDibayar",label:"Total setoran masa yang sudah dibayar (IDR)",required:!0}]},{id:"shu-dan-dana",title:"SHU dan Dana",fields:[{key:"shu.shuTotal",label:"SHU total tahun buku (IDR)",required:!0},{key:"shu.danaCadangan",label:"Dana cadangan (bukan objek pajak) (IDR)",required:!0},{key:"shu.shuDibagikanKeAnggota",label:"SHU dibagikan ke anggota (per PP 46/2013 / PP 23/2018) (IDR)",required:!0},{key:"shu.basisPemotonganPph",label:"Basis pemotongan PPh anggota (IDR)",required:!0}]},{id:"bukti-lampiran",title:"Bukti dan Lampiran",fields:[{key:"lampiran.sptTahunanRef",label:"Referensi SPT Tahunan",required:!0},{key:"lampiran.buktiPotongRef",label:"Referensi bukti potong PPh",required:!0},{key:"lampiran.neracaFiskalRef",label:"Referensi laporan neraca fiskal",required:!0}]}],mn={rapat_anggota:{lpj_pengurus:ln,lpj_pengawas:[{id:"laporan-pengawas-rat",title:"Laporan Pengawas untuk RAT",fields:[{key:"oversight.findingsCount",label:"Jumlah temuan",required:!0},{key:"oversight.majorFindings",label:"Temuan material",required:!0},{key:"oversight.recommendation",label:"Rekomendasi",required:!0},{key:"oversight.followUpStatus",label:"Status tindak lanjut",required:!0}]}]},dinas_koperasi:{lpj_pengurus:[{id:"identitas-profil",title:"Identitas & Profil Koperasi",fields:[{key:"identity.koperasiName",label:"Nama koperasi",required:!0},{key:"identity.bhNumber",label:"Nomor BH/SK pengesahan",required:!0},{key:"identity.address",label:"Alamat pusat/cabang",required:!0},{key:"identity.coopType",label:"Jenis koperasi",required:!0},{key:"identity.npwp",label:"NPWP",required:!0},{key:"identity.endMemberCount",label:"Jumlah anggota akhir periode",required:!0},{key:"identity.bookYearPeriod",label:"Periode tahun buku",required:!0},{key:"identity.responsiblePerson",label:"Penanggung jawab",required:!0}]},{id:"kepatuhan-dinas",title:"Kepatuhan & Compliance Dinas",fields:[{key:"compliance.ratMinutesRef",label:"Bukti RAT (BA/notulen/daftar hadir)",required:!0},{key:"compliance.shuDistributionRef",label:"Bukti pembagian SHU",required:!0},{key:"compliance.auditStatus",label:"Status audit",required:!0},{key:"compliance.taxSptRef",label:"Kepatuhan pajak (SPT Tahunan)",required:!0},{key:"compliance.adArtCompliance",label:"Kepatuhan AD/ART & PUG-KOPIN",required:!0},{key:"compliance.healthIndex",label:"Indeks kesehatan koperasi",required:!1}]}],lpj_pengawas:[{id:"laporan-pengawas-dinas",title:"Laporan Pengawas untuk Dinas",fields:[{key:"oversight.reviewCycle",label:"Siklus review",required:!0},{key:"oversight.followUpProgress",label:"Progres tindak lanjut",required:!0},{key:"oversight.riskNote",label:"Catatan risiko",required:!0}]}]},pajak:{lpj_pengurus:or,lpj_pengawas:or},ojk:{lpj_pengurus:[{id:"profil-risiko-ojk",title:"Profil Risiko OJK",fields:[{key:"risk.npfNetPercent",label:"NPF Netto (%)",required:!0},{key:"risk.carPercent",label:"CAR (%)",required:!0},{key:"risk.currentRatioPercent",label:"Current Ratio (%)",required:!0},{key:"risk.roaPercent",label:"ROA (%)",required:!0},{key:"risk.fdrPercent",label:"LDR/FDR (%)",required:!0},{key:"risk.bopoPercent",label:"BOPO (%)",required:!0},{key:"risk.eightRiskSummary",label:"8 jenis risiko + mitigasi",required:!0}]},{id:"kepatuhan-ojk",title:"Kepatuhan Regulasi OJK",fields:[{key:"compliance.auditFindingsRef",label:"Daftar temuan audit",required:!0},{key:"compliance.remediationStatus",label:"Status penyelesaian temuan",required:!0},{key:"compliance.managementCommitment",label:"Pernyataan komitmen pengurus/pengawas/pengelola",required:!0}]}],lpj_pengawas:[{id:"laporan-pengawas-ojk",title:"Laporan Pengawas untuk OJK",fields:[{key:"oversight.criticalIssueCount",label:"Jumlah isu kritis",required:!0},{key:"oversight.remediationEta",label:"ETA remediasi",required:!0},{key:"oversight.auditCompletionPercent",label:"Penyelesaian audit internal (%)",required:!0}]}]}},sr=/^LPJ-(RAPAT|DINAS|OJK)-\d{4}-\d{3}-.+\.(pdf|xlsx|xls|docx)$/i,dr=["workflow.readyForReview","signatures.ketuaPengurusSignedAt","signatures.coSignerSignedAt","review.internalSupervisorApproved","attachments.financialStatementsRef","attachments.ratEvidenceRef","attachments.metadataComplete"],cr=["review.supervisorOrAuditorOpinion","approval.approverName","approval.approverRole","approval.approvedAt"];function lr(r,e){return mn[r][e]}function _(r,e){if(r)return e.split(".").reduce((t,n)=>{if(t&&typeof t=="object"&&n in t)return t[n]},r)}function Ve(r){return r==null?!0:typeof r=="string"?r.trim().length===0:!1}var Ge=class{constructor(e,t={}){this.repos=e;this.options=t;this.newId=D("management-report")}async createManagementReport(e){return b((async()=>{var a;rr(e);let t=await this.repos.memberRepository.getById(e.preparedByMemberId);if(!t||t.deleted)throw w("Member",e.preparedByMemberId);let n=await this.repos.managementReportRepository.create({id:this.newId(),reportType:e.reportType,periodCode:e.periodCode.trim(),title:e.title.trim(),summary:e.summary.trim(),preparedByMemberId:e.preparedByMemberId,preparedByLeadershipTermId:(a=e.preparedByLeadershipTermId)!=null?a:null,status:"draft",submittedAt:null,reviewedAt:null,reviewerMemberId:null,reviewNotes:null,payload:{},tenantId:e.tenantId,branchId:e.branchId,version:1,lastModified:g(),deleted:!1});return await S(this.options,{name:"governance.management-report-created",occurredAt:g(),entityId:n.id,tenantId:n.tenantId,branchId:n.branchId,payload:{reportType:n.reportType,periodCode:n.periodCode}}),n})())}async upsertManagementReportPayload(e,t){return b((async()=>{var o;ir(t.payload);let n=await this.repos.managementReportRepository.getById(e);if(!n||n.deleted)throw w("ManagementReport",e);if(n.status!=="draft")throw l("Management report payload can only be edited while report is draft");let a={...(o=n.payload)!=null?o:{},...t.payload},i=await this.repos.managementReportRepository.update(e,{payload:a,version:n.version+1,lastModified:g()});return await S(this.options,{name:"governance.management-report-payload-upserted",occurredAt:g(),entityId:i.id,tenantId:i.tenantId,branchId:i.branchId,payload:{reportType:i.reportType,periodCode:i.periodCode}}),i})())}async submitManagementReport(e,t){return b((async()=>{nr(t);let n=await this.repos.managementReportRepository.getById(e);if(!n||n.deleted)throw w("ManagementReport",e);if(n.status!=="draft")throw l("Only draft management report can be submitted");this.assertSubmitReadiness(n);let a=await this.repos.managementReportRepository.update(e,{status:"submitted",submittedAt:t.submittedAt,version:n.version+1,lastModified:g()});return await S(this.options,{name:"governance.management-report-submitted",occurredAt:g(),entityId:a.id,tenantId:a.tenantId,branchId:a.branchId,payload:{reportType:a.reportType,periodCode:a.periodCode}}),a})())}async approveManagementReport(e,t){return this.reviewManagementReport(e,t,"approved")}async rejectManagementReport(e,t){return this.reviewManagementReport(e,t,"rejected")}async getManagementReportById(e){return b((async()=>{let t=await this.repos.managementReportRepository.getById(e);return!t||t.deleted?null:t})())}async listManagementReports(e){return b(this.repos.managementReportRepository.list(e))}async evaluateManagementReportCompleteness(e,t){return b(this.evaluateCompletenessInternal(e,t))}async evaluateCompletenessInternal(e,t){Ot(t);let n=await this.repos.managementReportRepository.getById(e);if(!n||n.deleted)throw w("ManagementReport",e);let a=lr(t,n.reportType),i=a.flatMap(c=>c.fields).filter(c=>c.required),o=i.filter(c=>{var p;let m=_((p=n.payload)!=null?p:{},c.key);return m==null||typeof m=="string"&&m.trim().length===0}).map(c=>c.key),s=i.length,d=s-o.length;return{audience:t,totalRequired:s,filledRequired:d,missingKeys:o,isComplete:o.length===0,template:a}}async buildManagementReportPackage(e,t){return b((async()=>{var s,d,c,m;Ot(t);let n=await this.repos.managementReportRepository.getById(e);if(!n||n.deleted)throw w("ManagementReport",e);let a=await this.evaluateCompletenessInternal(e,t),i={rapat_anggota:"Paket LPJ untuk Rapat Anggota",dinas_koperasi:"Paket LPJ untuk Dinas Koperasi",ojk:"Paket LPJ untuk OJK",pajak:"Paket Laporan Pajak Koperasi"},o=[{id:"ringkasan-lpj",title:"Ringkasan LPJ",content:n.summary},{id:"catatan-review",title:"Catatan Review",content:(s=n.reviewNotes)!=null?s:"Belum ada catatan review."},{id:"checklist-kelengkapan",title:"Checklist Kelengkapan Audience",content:a.template.flatMap(p=>p.fields.map(u=>{var h;return{key:u.key,required:u.required,value:_((h=n.payload)!=null?h:{},u.key),label:u.label,sectionTitle:p.title}})).map((p,u)=>{let h=p.value!==void 0&&p.value!==null&&!(typeof p.value=="string"&&p.value.trim().length===0),y=p.required?h?"[x]":"[ ]":h?"[x]":"[-]";return`${u+1}. ${y} ${p.sectionTitle} - ${p.label} (${p.key})`}).join(`
|
|
2
2
|
`)}];return o.push(...this.buildFinancialTemplateSections((d=n.payload)!=null?d:{})),{reportId:n.id,reportType:n.reportType,audience:t,title:`${i[t]} - ${n.title}`,periodCode:n.periodCode,generatedAt:g(),sections:o,metadata:{tenantId:n.tenantId,branchId:n.branchId,submittedAt:(c=n.submittedAt)!=null?c:null,reviewedAt:(m=n.reviewedAt)!=null?m:null,status:n.status,completeness:a}}})())}async reviewManagementReport(e,t,n){return b((async()=>{var s;ar(t);let a=await this.repos.managementReportRepository.getById(e);if(!a||a.deleted)throw w("ManagementReport",e);if(a.status!=="submitted")throw l("Only submitted management report can be reviewed");this.assertApproveReadiness(a);let i=await this.repos.memberRepository.getById(t.reviewerMemberId);if(!i||i.deleted)throw w("Member",t.reviewerMemberId);let o=await this.repos.managementReportRepository.update(e,{status:n,reviewedAt:t.reviewedAt,reviewerMemberId:t.reviewerMemberId,reviewNotes:(s=t.reviewNotes)!=null?s:null,version:a.version+1,lastModified:g()});return await S(this.options,{name:n==="approved"?"governance.management-report-approved":"governance.management-report-rejected",occurredAt:g(),entityId:o.id,tenantId:o.tenantId,branchId:o.branchId,payload:{reportType:o.reportType,periodCode:o.periodCode}}),o})())}assertSubmitReadiness(e){let t=[];for(let i of dr){let o=_(e.payload,i);(Ve(o)||o===!1)&&t.push(i)}let n=_(e.payload,"attachments.financialStatementsRef"),a=_(e.payload,"attachments.ratEvidenceRef");for(let i of[n,a])typeof i=="string"&&i.trim()&&(sr.test(i.trim())||t.push(`invalid-attachment-id:${i}`));if(t.length>0)throw l(`Management report submit requirements are not complete: ${t.join(", ")}`)}assertApproveReadiness(e){let t=[];for(let a of cr){let i=_(e.payload,a);Ve(i)&&t.push(a)}if(_(e.payload,"approval.requiresRegistrationNumber")===!0){let a=_(e.payload,"approval.registrationNumber");Ve(a)&&t.push("approval.registrationNumber")}if(t.length>0)throw l(`Management report approve requirements are not complete: ${t.join(", ")}`)}buildFinancialTemplateSections(e){var d,c,m,p,u,h,y,I,v;let t=_(e,"financial.accountingSummary");if(!t||typeof t!="object")return[];let n=_(e,"financial.accountingSummary.balanceSheet"),a=_(e,"financial.accountingSummary.incomeStatement"),i=_(e,"financial.accountingSummary.cashflow"),o=_(e,"workPlan.targetVsActualRows"),s=_(e,"financial.hasilUsahaSummary.rows");return[{id:"template-laporan-keuangan",title:"Template Laporan Keuangan (Neraca/LPHU/Arus Kas)",content:[`Neraca: aset=${(d=n==null?void 0:n.assets)!=null?d:0}, liabilitas=${(c=n==null?void 0:n.liabilities)!=null?c:0}, ekuitas=${(m=n==null?void 0:n.equity)!=null?m:0}`,`LPHU: pendapatan=${(p=a==null?void 0:a.revenue)!=null?p:0}, beban=${(u=a==null?void 0:a.expense)!=null?u:0}, laba-bersih=${(h=a==null?void 0:a.netIncome)!=null?h:0}`,`Arus Kas: kas-masuk=${(y=i==null?void 0:i.operatingInflow)!=null?y:0}, kas-keluar=${(I=i==null?void 0:i.operatingOutflow)!=null?I:0}, kas-bersih=${(v=i==null?void 0:i.netOperatingCashflow)!=null?v:0}`].join(`
|
|
3
|
-
`)},{id:"template-rapb-realisasi",title:"Template RAPB vs Realisasi",content:Array.isArray(o)&&o.length?o.map((R,C)=>{var
|
|
4
|
-
`):"Belum ada data RAPB vs realisasi."},{id:"template-hasil-usaha-periodik",title:"Template Perhitungan Hasil Usaha Periodik",content:Array.isArray(s)&&s.length?s.map((R,C)=>{var
|
|
5
|
-
`):"Belum ada ringkasan hasil usaha periodik."}]}};function mr(r,e){if(!Number.isFinite(e)||e<=0||e>24*365)throw l(`${r} must be > 0 and <= 8760`)}function ur(r){var e,t;if(!((e=r.tenantId)!=null&&e.trim()))throw l("tenantId is required");if(!((t=r.effectiveDate)!=null&&t.trim()))throw l("effectiveDate is required");if(!Number.isInteger(r.escalationMaxLevel)||r.escalationMaxLevel<1||r.escalationMaxLevel>10)throw l("escalationMaxLevel must be an integer between 1 and 10");for(let[n,a]of Object.entries(r.riskSlaHoursByCategory))mr(`riskSlaHoursByCategory.${n}`,a);for(let[n,a]of Object.entries(r.whistleSlaHoursByChannel))mr(`whistleSlaHoursByChannel.${n}`,a)}var $e=class{constructor(e,t={}){this.repos=e;this.options=t;this.newId=D("oversight-policy")}async getActiveOversightPolicy(e){return b(this.repos.oversightPolicyRepository.getActive(e))}async upsertOversightPolicy(e){return b((async()=>{ur(e);let t={tenantId:e.tenantId,branchId:e.branchId},n=await this.repos.oversightPolicyRepository.getActive(t),a=g();if(n){let o=await this.repos.oversightPolicyRepository.upsert({...n,...e,version:n.version+1,lastModified:a});return await S(this.options,{name:"oversight.policy-upserted",occurredAt:g(),entityId:o.id,tenantId:o.tenantId,branchId:o.branchId,payload:{effectiveDate:o.effectiveDate,escalationMaxLevel:o.escalationMaxLevel}}),o}let i=await this.repos.oversightPolicyRepository.upsert({id:this.newId(),...e,version:1,lastModified:a,deleted:!1});return await S(this.options,{name:"oversight.policy-upserted",occurredAt:g(),entityId:i.id,tenantId:i.tenantId,branchId:i.branchId,payload:{effectiveDate:i.effectiveDate,escalationMaxLevel:i.escalationMaxLevel}}),i})())}async listOversightPolicies(e){return b(this.repos.oversightPolicyRepository.list(e))}};function He(r,e){if(!Number.isFinite(e)||e<1||e>5)throw l(`${r} must be between 1 and 5`)}function pr(r){var e,t;if(!((e=r.title)!=null&&e.trim()))throw l("risk title is required");if(!((t=r.tenantId)!=null&&t.trim()))throw l("tenantId is required");if(He("likelihood",r.likelihood),He("impact",r.impact),r.slaDueAt!==void 0&&r.slaDueAt!==null&&!r.slaDueAt.trim())throw l("slaDueAt cannot be empty string")}function gr(r){if(r.title!==void 0&&!r.title.trim())throw l("risk title cannot be empty");if(r.likelihood!==void 0&&He("likelihood",r.likelihood),r.impact!==void 0&&He("impact",r.impact),r.slaDueAt!==void 0&&r.slaDueAt!==null&&!r.slaDueAt.trim())throw l("slaDueAt cannot be empty string")}function yr(r){var e,t;if(!((e=r.status)!=null&&e.trim()))throw l("status is required");if(r.status==="closed"&&!((t=r.notes)!=null&&t.trim()))throw l("notes are required when risk status is closed")}function fr(r){var e;if(!((e=r.reviewedAt)!=null&&e.trim()))throw l("reviewedAt is required")}function hr(r){var e;if(!((e=r.reason)!=null&&e.trim()))throw l("escalation reason is required")}function br(r){if(r&&r.submittedAt!==void 0&&r.submittedAt!==null&&!r.submittedAt.trim())throw l("submittedAt cannot be empty string")}function vr(r){var e;if(!r.decision)throw l("decision is required");if(!((e=r.reviewerMemberId)!=null&&e.trim()))throw l("reviewerMemberId is required");if(r.reviewedAt!==void 0&&r.reviewedAt!==null&&!r.reviewedAt.trim())throw l("reviewedAt cannot be empty string")}function Ir(r,e){return r*e}function un(r,e){return new Date(new Date(r).getTime()+e*60*60*1e3).toISOString()}var Qe=class{constructor(e,t={}){this.repos=e;this.options=t;this.newId=D("risk-item")}canTransitionStatus(e,t){return e===t?!0:e==="open"?t==="mitigating"||t==="accepted"||t==="closed":e==="mitigating"?t==="open"||t==="accepted"||t==="closed":e==="accepted"?t==="mitigating"||t==="closed":!1}async assertValidOwner(e){if(!e)return;let t=await this.repos.memberRepository.getById(e);if(!t||t.deleted)throw w("Member",e);if(t.status!=="active")throw l("Risk owner must be an active member")}async resolveDefaultSlaDueAt(e,t){var i,o;if(e.slaDueAt!==void 0)return(i=e.slaDueAt)!=null?i:null;if(!((o=e.tenantId)!=null&&o.trim()))return null;let n=await this.repos.oversightPolicyRepository.getActive({tenantId:e.tenantId,branchId:e.branchId});if(!n)return null;let a=n.riskSlaHoursByCategory[e.category];return!Number.isFinite(a)||a<=0?null:un(t,a)}async resolveEscalationMaxLevel(e,t){if(!e)return 5;let n=await this.repos.oversightPolicyRepository.getActive({tenantId:e,branchId:t});return n?Math.max(1,n.escalationMaxLevel):5}async createRiskItem(e){return b((async()=>{var i,o,s,d,c,m,p;pr(e),await this.assertValidOwner(e.ownerMemberId);let t=g(),n=await this.resolveDefaultSlaDueAt(e,t),a=await this.repos.riskRegisterRepository.create({id:this.newId(),title:e.title.trim(),description:(i=e.description)!=null?i:null,category:e.category,likelihood:e.likelihood,impact:e.impact,riskScore:Ir(e.likelihood,e.impact),status:"open",ownerMemberId:(o=e.ownerMemberId)!=null?o:null,mitigationPlan:(s=e.mitigationPlan)!=null?s:null,slaDueAt:n,escalationLevel:0,escalatedAt:null,escalationReason:null,mitigationApprovalStatus:(d=e.mitigationPlan)!=null&&d.trim()?"pending":"not_required",mitigationSubmittedAt:(c=e.mitigationPlan)!=null&&c.trim()?t:null,mitigationReviewedAt:null,mitigationReviewerMemberId:null,mitigationReviewNote:null,nextReviewDate:(m=e.nextReviewDate)!=null?m:null,lastReviewedAt:null,notes:(p=e.notes)!=null?p:null,tenantId:e.tenantId,branchId:e.branchId,version:1,lastModified:t,deleted:!1});return await S(this.options,{name:"risk.item-created",occurredAt:g(),entityId:a.id,tenantId:a.tenantId,branchId:a.branchId,payload:{category:a.category,riskScore:a.riskScore,status:a.status}}),a})())}async updateRiskItem(e,t){return b((async()=>{var m,p,u,h,y,I,v,R,C,A,k,M,O,T,j,B;gr(t);let n=await this.repos.riskRegisterRepository.getById(e);if(!n||n.deleted)throw w("RiskRegisterItem",e);if(n.status==="closed")throw l("Closed risk item cannot be updated");let a=t.ownerMemberId===void 0?(m=n.ownerMemberId)!=null?m:null:t.ownerMemberId;await this.assertValidOwner(a);let i=(p=t.likelihood)!=null?p:n.likelihood,o=(u=t.impact)!=null?u:n.impact,s=t.mitigationPlan===void 0?(h=n.mitigationPlan)!=null?h:null:t.mitigationPlan,d=t.mitigationPlan===void 0?(y=n.mitigationApprovalStatus)!=null?y:"not_required":s!=null&&s.trim()?"pending":"not_required",c=await this.repos.riskRegisterRepository.update(e,{title:(v=(I=t.title)==null?void 0:I.trim())!=null?v:n.title,description:t.description===void 0?(R=n.description)!=null?R:null:t.description,category:(C=t.category)!=null?C:n.category,likelihood:i,impact:o,riskScore:Ir(i,o),ownerMemberId:a,mitigationPlan:s,slaDueAt:t.slaDueAt===void 0?(A=n.slaDueAt)!=null?A:null:t.slaDueAt,mitigationApprovalStatus:d,mitigationSubmittedAt:t.mitigationPlan===void 0?(k=n.mitigationSubmittedAt)!=null?k:null:s!=null&&s.trim()?g():null,mitigationReviewedAt:t.mitigationPlan===void 0&&(M=n.mitigationReviewedAt)!=null?M:null,mitigationReviewerMemberId:t.mitigationPlan===void 0&&(O=n.mitigationReviewerMemberId)!=null?O:null,mitigationReviewNote:t.mitigationPlan===void 0&&(T=n.mitigationReviewNote)!=null?T:null,nextReviewDate:t.nextReviewDate===void 0?(j=n.nextReviewDate)!=null?j:null:t.nextReviewDate,notes:t.notes===void 0?(B=n.notes)!=null?B:null:t.notes,version:n.version+1,lastModified:g()});return await S(this.options,{name:"risk.item-updated",occurredAt:g(),entityId:c.id,tenantId:c.tenantId,branchId:c.branchId,payload:{category:c.category,riskScore:c.riskScore}}),c})())}async updateRiskItemStatus(e,t){return b((async()=>{var i,o,s,d;yr(t);let n=await this.repos.riskRegisterRepository.getById(e);if(!n||n.deleted)throw w("RiskRegisterItem",e);if(n.status===t.status)return n;if(!this.canTransitionStatus(n.status,t.status))throw l(`Invalid risk status transition: ${n.status} -> ${t.status}`);if(t.status==="closed"&&((o=(i=n.mitigationPlan)==null?void 0:i.trim())!=null&&o)&&((s=n.mitigationApprovalStatus)!=null?s:"not_required")!=="approved")throw l("Risk item with mitigation plan requires approved mitigation before closing");let a=await this.repos.riskRegisterRepository.update(e,{status:t.status,notes:t.notes===void 0?(d=n.notes)!=null?d:null:t.notes,version:n.version+1,lastModified:g()});return await S(this.options,{name:"risk.item-status-updated",occurredAt:g(),entityId:a.id,tenantId:a.tenantId,branchId:a.branchId,payload:{status:a.status}}),a})())}async recordRiskItemReview(e,t){return b((async()=>{var i;fr(t);let n=await this.repos.riskRegisterRepository.getById(e);if(!n||n.deleted)throw w("RiskRegisterItem",e);let a=await this.repos.riskRegisterRepository.update(e,{lastReviewedAt:t.reviewedAt,notes:t.notes===void 0?(i=n.notes)!=null?i:null:t.notes,version:n.version+1,lastModified:g()});return await S(this.options,{name:"risk.item-reviewed",occurredAt:g(),entityId:a.id,tenantId:a.tenantId,branchId:a.branchId,payload:{reviewedAt:a.lastReviewedAt}}),a})())}async escalateRiskItem(e,t){return b((async()=>{var s,d,c;hr(t);let n=await this.repos.riskRegisterRepository.getById(e);if(!n||n.deleted)throw w("RiskRegisterItem",e);if(n.status==="closed")throw l("Closed risk item cannot be escalated");let a=await this.resolveEscalationMaxLevel(n.tenantId,n.branchId),i=Math.min(((s=n.escalationLevel)!=null?s:0)+1,a);if(i===((d=n.escalationLevel)!=null?d:0))throw l("Risk escalation level already reached policy maximum");let o=await this.repos.riskRegisterRepository.update(e,{escalationLevel:i,escalatedAt:(c=t.escalatedAt)!=null?c:g(),escalationReason:t.reason.trim(),version:n.version+1,lastModified:g()});return await S(this.options,{name:"risk.item-escalated",occurredAt:g(),entityId:o.id,tenantId:o.tenantId,branchId:o.branchId,payload:{escalationLevel:o.escalationLevel,reason:o.escalationReason}}),o})())}async submitRiskMitigationApproval(e,t){return b((async()=>{var o,s,d,c;br(t);let n=await this.repos.riskRegisterRepository.getById(e);if(!n||n.deleted)throw w("RiskRegisterItem",e);if(n.status==="closed")throw l("Closed risk item cannot be submitted for mitigation approval");if(!((s=(o=n.mitigationPlan)==null?void 0:o.trim())!=null&&s))throw l("Mitigation plan is required before submitting mitigation approval");let a=(d=t==null?void 0:t.submittedAt)!=null?d:g(),i=await this.repos.riskRegisterRepository.update(e,{mitigationApprovalStatus:"pending",mitigationSubmittedAt:a,mitigationReviewedAt:null,mitigationReviewerMemberId:null,mitigationReviewNote:(c=t==null?void 0:t.note)!=null?c:null,version:n.version+1,lastModified:g()});return await S(this.options,{name:"risk.item-updated",occurredAt:g(),entityId:i.id,tenantId:i.tenantId,branchId:i.branchId,payload:{mitigationApprovalStatus:i.mitigationApprovalStatus,mitigationSubmittedAt:i.mitigationSubmittedAt}}),i})())}async reviewRiskMitigationApproval(e,t){return b((async()=>{var o,s,d;vr(t);let n=await this.repos.riskRegisterRepository.getById(e);if(!n||n.deleted)throw w("RiskRegisterItem",e);if(n.status==="closed")throw l("Closed risk item cannot be reviewed for mitigation approval");if(((o=n.mitigationApprovalStatus)!=null?o:"not_required")!=="pending")throw l("Only pending mitigation approval can be reviewed");await this.assertValidOwner(t.reviewerMemberId);let a=(s=t.reviewedAt)!=null?s:g(),i=await this.repos.riskRegisterRepository.update(e,{mitigationApprovalStatus:t.decision,mitigationReviewedAt:a,mitigationReviewerMemberId:t.reviewerMemberId,mitigationReviewNote:(d=t.note)!=null?d:null,version:n.version+1,lastModified:g()});return await S(this.options,{name:"risk.item-updated",occurredAt:g(),entityId:i.id,tenantId:i.tenantId,branchId:i.branchId,payload:{mitigationApprovalStatus:i.mitigationApprovalStatus,mitigationReviewerMemberId:i.mitigationReviewerMemberId}}),i})())}async getRiskItemById(e){return b((async()=>{let t=await this.repos.riskRegisterRepository.getById(e);return!t||t.deleted?null:t})())}async listRiskItems(e={}){return b(this.repos.riskRegisterRepository.list(e))}};function Rr(r){var e,t,n;if(!((e=r.subject)!=null&&e.trim()))throw l("whistle report subject is required");if(!((t=r.description)!=null&&t.trim()))throw l("whistle report description is required");if(!((n=r.tenantId)!=null&&n.trim()))throw l("tenantId is required");if(r.evidenceRefs!==void 0&&r.evidenceRefs!==null){if(!Array.isArray(r.evidenceRefs))throw l("evidenceRefs must be an array when provided");if(r.evidenceRefs.some(a=>!a||!a.trim()))throw l("evidenceRefs cannot contain empty value")}if(r.slaDueAt!==void 0&&r.slaDueAt!==null&&!r.slaDueAt.trim())throw l("slaDueAt cannot be empty string")}function Sr(r){var e,t;if(!((e=r.status)!=null&&e.trim()))throw l("whistle report status is required");if((r.status==="resolved"||r.status==="dismissed")&&!((t=r.resolutionSummary)!=null&&t.trim()))throw l("resolutionSummary is required when status is resolved or dismissed")}function Cr(r){var e;if(!((e=r.reason)!=null&&e.trim()))throw l("whistle escalation reason is required")}function wr(r){var e;if(!((e=r.evidenceRef)!=null&&e.trim()))throw l("evidenceRef is required")}function Ar(r){var e;if(!((e=r.stage)!=null&&e.trim()))throw l("investigation stage is required");if(r.updatedAt!==void 0&&r.updatedAt!==null&&!r.updatedAt.trim())throw l("updatedAt cannot be empty string")}function pn(r,e){return new Date(new Date(r).getTime()+e*60*60*1e3).toISOString()}var Et={intake:0,preliminary:1,formal:2,recommendation:3},Ke=class{constructor(e,t={}){this.repos=e;this.options=t;this.newId=D("whistle-report")}canTransitionStatus(e,t){return e===t?!0:e==="submitted"?t==="in_review"||t==="dismissed":e==="in_review"?t==="resolved"||t==="dismissed":!1}async assertMemberExists(e){if(!e)return;let t=await this.repos.memberRepository.getById(e);if(!t||t.deleted)throw w("Member",e)}async resolveDefaultSlaDueAt(e,t){var i,o;if(e.slaDueAt!==void 0)return(i=e.slaDueAt)!=null?i:null;if(!((o=e.tenantId)!=null&&o.trim()))return null;let n=await this.repos.oversightPolicyRepository.getActive({tenantId:e.tenantId,branchId:e.branchId});if(!n)return null;let a=n.whistleSlaHoursByChannel[e.channel];return!Number.isFinite(a)||a<=0?null:pn(t,a)}async resolveEscalationMaxLevel(e,t){if(!e)return 5;let n=await this.repos.oversightPolicyRepository.getActive({tenantId:e,branchId:t});return n?Math.max(1,n.escalationMaxLevel):5}async createWhistleReport(e){return b((async()=>{var i,o,s,d;Rr(e),!e.isAnonymous&&e.reporterMemberId&&await this.assertMemberExists(e.reporterMemberId);let t=g(),n=await this.resolveDefaultSlaDueAt(e,t),a=await this.repos.whistleReportRepository.create({id:this.newId(),incidentDate:(i=e.incidentDate)!=null?i:null,subject:e.subject.trim(),description:e.description.trim(),channel:e.channel,isAnonymous:!!e.isAnonymous,reporterMemberId:e.isAnonymous?null:(o=e.reporterMemberId)!=null?o:null,evidenceRefs:(d=(s=e.evidenceRefs)==null?void 0:s.map(c=>c.trim()))!=null?d:null,slaDueAt:n,escalationLevel:0,escalatedAt:null,escalationReason:null,investigationStage:"intake",investigationUpdatedAt:t,investigationNote:null,status:"submitted",assignedToMemberId:null,handledByMemberId:null,resolutionSummary:null,resolvedAt:null,tenantId:e.tenantId,branchId:e.branchId,version:1,lastModified:t,deleted:!1});return await S(this.options,{name:"whistle.report-created",occurredAt:g(),entityId:a.id,tenantId:a.tenantId,branchId:a.branchId,payload:{channel:a.channel,status:a.status,isAnonymous:a.isAnonymous}}),a})())}async advanceWhistleInvestigationStage(e,t){return b((async()=>{var d,c,m,p,u;Ar(t);let n=await this.repos.whistleReportRepository.getById(e);if(!n||n.deleted)throw w("WhistleReport",e);if(n.status==="resolved"||n.status==="dismissed")throw l("Finalized whistle report cannot advance investigation stage");let a=(d=n.investigationStage)!=null?d:"intake",i=(c=Et[a])!=null?c:0,o=(m=Et[t.stage])!=null?m:-1;if(o<0)throw l(`Unsupported whistle investigation stage: ${t.stage}`);if(o<i)throw l(`Whistle investigation stage cannot move backwards: ${a} -> ${t.stage}`);if(o>i+1)throw l(`Whistle investigation stage must advance sequentially: ${a} -> ${t.stage}`);if(o>=Et.formal&&n.status!=="in_review")throw l("Formal/recommendation investigation stage requires report status in_review");if(o===i&&t.note===void 0&&t.updatedAt===void 0)return n;let s=await this.repos.whistleReportRepository.update(e,{investigationStage:t.stage,investigationUpdatedAt:(p=t.updatedAt)!=null?p:g(),investigationNote:t.note===void 0?(u=n.investigationNote)!=null?u:null:t.note,version:n.version+1,lastModified:g()});return await S(this.options,{name:"whistle.report-stage-updated",occurredAt:g(),entityId:s.id,tenantId:s.tenantId,branchId:s.branchId,payload:{investigationStage:s.investigationStage,investigationUpdatedAt:s.investigationUpdatedAt}}),s})())}async updateWhistleReportStatus(e,t){return b((async()=>{var o,s,d,c,m;Sr(t);let n=await this.repos.whistleReportRepository.getById(e);if(!n||n.deleted)throw w("WhistleReport",e);if(n.status==="resolved"||n.status==="dismissed")throw l("Whistle report is already finalized");if(!this.canTransitionStatus(n.status,t.status))throw l(`Invalid whistle report status transition: ${n.status} -> ${t.status}`);await this.assertMemberExists(t.assignedToMemberId),await this.assertMemberExists(t.handledByMemberId);let a=t.status==="resolved"||t.status==="dismissed",i=await this.repos.whistleReportRepository.update(e,{status:t.status,assignedToMemberId:t.assignedToMemberId===void 0?(o=n.assignedToMemberId)!=null?o:null:t.assignedToMemberId,handledByMemberId:t.handledByMemberId===void 0?(s=n.handledByMemberId)!=null?s:null:t.handledByMemberId,resolutionSummary:t.resolutionSummary===void 0?(d=n.resolutionSummary)!=null?d:null:t.resolutionSummary,resolvedAt:t.resolvedAt===void 0?a?g():(c=n.resolvedAt)!=null?c:null:t.resolvedAt,version:n.version+1,lastModified:g()});return await S(this.options,{name:"whistle.report-status-updated",occurredAt:g(),entityId:i.id,tenantId:i.tenantId,branchId:i.branchId,payload:{status:i.status,assignedToMemberId:(m=i.assignedToMemberId)!=null?m:null}}),i})())}async escalateWhistleReport(e,t){return b((async()=>{var s,d,c;Cr(t);let n=await this.repos.whistleReportRepository.getById(e);if(!n||n.deleted)throw w("WhistleReport",e);if(n.status==="resolved"||n.status==="dismissed")throw l("Finalized whistle report cannot be escalated");let a=await this.resolveEscalationMaxLevel(n.tenantId,n.branchId),i=Math.min(((s=n.escalationLevel)!=null?s:0)+1,a);if(i===((d=n.escalationLevel)!=null?d:0))throw l("Whistle escalation level already reached policy maximum");let o=await this.repos.whistleReportRepository.update(e,{escalationLevel:i,escalatedAt:(c=t.escalatedAt)!=null?c:g(),escalationReason:t.reason.trim(),version:n.version+1,lastModified:g()});return await S(this.options,{name:"whistle.report-escalated",occurredAt:g(),entityId:o.id,tenantId:o.tenantId,branchId:o.branchId,payload:{escalationLevel:o.escalationLevel,reason:o.escalationReason}}),o})())}async addWhistleEvidence(e,t){return b((async()=>{var o,s,d;wr(t);let n=await this.repos.whistleReportRepository.getById(e);if(!n||n.deleted)throw w("WhistleReport",e);if(n.status==="resolved"||n.status==="dismissed")throw l("Finalized whistle report cannot be updated");let a=new Set([...(o=n.evidenceRefs)!=null?o:[],t.evidenceRef.trim()]),i=await this.repos.whistleReportRepository.update(e,{evidenceRefs:Array.from(a),version:n.version+1,lastModified:g()});return await S(this.options,{name:"whistle.report-evidence-added",occurredAt:g(),entityId:i.id,tenantId:i.tenantId,branchId:i.branchId,payload:{totalEvidence:(d=(s=i.evidenceRefs)==null?void 0:s.length)!=null?d:0}}),i})())}async getWhistleReportById(e){return b((async()=>{let t=await this.repos.whistleReportRepository.getById(e);return!t||t.deleted?null:t})())}async listWhistleReports(e={}){return b(this.repos.whistleReportRepository.list(e))}};function Pr(r,e,t){return t?e>=r?"compliant":"underpaid":"no-policy"}var Je=class{constructor(e){this.repos=e}async buildSnapshot(e,t,n){var h;let i=(await this.repos.savingLedgerRepository.listByMember(e.id,{includeDeleted:!1,tenantId:t.tenantId,branchId:t.branchId})).filter(y=>y.savingType==="wajib"),o=i.filter(y=>y.entryType==="credit").reduce((y,I)=>y+I.amount,0),s=i.filter(y=>y.entryType==="debit").reduce((y,I)=>y+I.amount,0),d=o-s,c=(h=n==null?void 0:n.monthlyWajibNominalIdr)!=null?h:0,m=Pr(c,d,!!n),p=m==="underpaid"?1:0,u=m==="compliant"?"none":m==="no-policy"?"set_active_saving_policy":"followup_wajib_payment";return{id:`snapshot-${e.id}`,memberId:e.id,koperasiId:t.koperasiId,tenantId:e.tenantId,branchId:e.branchId,referenceDate:g(),monthlyWajibNominalIdr:c,wajibCreditTotalIdr:o,wajibDebitTotalIdr:s,wajibNetTotalIdr:d,status:m,monthsInArrears:p,recommendedAction:u,metadata:{memberNumber:e.memberNumber},version:1,lastModified:g(),deleted:!1}}async listComplianceSnapshots(e,t={}){return b((async()=>{var o;let n=await this.repos.savingPolicyRepository.getActive({koperasiId:e.koperasiId,tenantId:e.tenantId,branchId:e.branchId}),a=await this.repos.memberRepository.list({includeDeleted:(o=t.includeDeleted)!=null?o:!1,status:"active",tenantId:e.tenantId,branchId:e.branchId});return(await Promise.all(a.filter(s=>t.memberId?s.id===t.memberId:!0).map(s=>this.buildSnapshot(s,e,n)))).filter(s=>t.status?s.status===t.status:!0).map(s=>je(s))})())}async getComplianceSnapshotByMember(e,t){return b((async()=>{var a;let n=await this.listComplianceSnapshots(t,{memberId:e});if("error"in n)throw new Error(n.error.message);return(a=n.data[0])!=null?a:null})())}};function Mr(r){var n,a,i,o;let e=r.entry.entryType==="credit"?"saving-deposit":"saving-withdrawal",t=(n=r.referencePrefix)!=null?n:"saving-ledger";return{kind:e,context:{journalId:(a=r.journalId)!=null?a:`journal-${r.entry.id}`,tenantId:(i=r.entry.tenantId)!=null?i:"tenant-unknown",branchId:(o=r.entry.branchId)!=null?o:void 0,occurredAt:r.entry.transactionDate,reference:`${t}:${r.entry.id}`},input:{amount:r.entry.amount,scopedAccountMapping:r.scopedAccountMapping}}}function kr(r){var e,t;if(!((e=r.memberId)!=null&&e.trim()))throw l("memberId is required");if(!((t=r.transactionDate)!=null&&t.trim()))throw l("transactionDate is required");if(Number.isNaN(Number(r.amount))||Number(r.amount)<=0)throw l("amount must be > 0")}var ze=class{constructor(e,t,n={}){this.db=e;this.repos=t;this.options=n;this.newId=D("saving-ledger")}async inTx(e){return this.db.transaction(async t=>e(te(t)))}async addEntry(e,t){return kr(t),this.inTx(async n=>{var o,s,d,c,m,p;let a=await n.memberRepository.getById(t.memberId);if(!a||a.deleted)throw w("Member",t.memberId);if(a.status!=="active")throw U(`Cannot record saving entry for inactive member: ${t.memberId}`);if(t.referenceType&&t.referenceId){let u=await n.savingLedgerRepository.findByReference({memberId:t.memberId,savingType:t.savingType,entryType:e,referenceType:t.referenceType,referenceId:t.referenceId,tenantId:t.tenantId,branchId:t.branchId});if(u)return(o=this.options.logger)==null||o.logInfo("[ofcoop] saving entry idempotent hit",{memberId:t.memberId,referenceType:t.referenceType,referenceId:t.referenceId}),u}let i=await n.savingLedgerRepository.create({id:this.newId(),memberId:t.memberId,savingType:t.savingType,entryType:e,amount:t.amount,transactionDate:t.transactionDate,referenceType:(s=t.referenceType)!=null?s:null,referenceId:(d=t.referenceId)!=null?d:null,notes:(c=t.notes)!=null?c:null,branchId:t.branchId,tenantId:t.tenantId,version:1,lastModified:g(),deleted:!1});if((m=this.options.logger)==null||m.logInfo("[ofcoop] saving entry recorded",{entryId:i.id,memberId:i.memberId,savingType:i.savingType,entryType:i.entryType,amount:i.amount}),await S(this.options,{name:"saving.entry-recorded",occurredAt:g(),entityId:i.id,tenantId:i.tenantId,branchId:i.branchId,payload:{memberId:i.memberId,savingType:i.savingType,entryType:i.entryType,amount:i.amount}}),this.options.financeProjectionSink&&this.options.savingAccountMapping)try{let u=Mr({entry:i,scopedAccountMapping:this.options.savingAccountMapping});await this.options.financeProjectionSink(u)}catch(u){(p=this.options.logger)==null||p.logError(u,{message:"[ofcoop] finance projection sink failed for saving entry",entryId:i.id})}return i})}async recordSavingCredit(e){return b(this.addEntry("credit",e))}async recordSavingDebit(e){return b(this.addEntry("debit",e))}async recordSavingWithdrawal(e){return b((async()=>{var n;if(e.savingType!=="sukarela")throw U(`recordSavingWithdrawal only supports sukarela saving type, received: ${e.savingType}`);let t=P(await this.getSavingBalanceByMember(e.memberId));if(e.amount>t.sukarela)throw U(`Insufficient sukarela balance for member: ${e.memberId}`);return this.addEntry("debit",{...e,notes:(n=e.notes)!=null?n:"withdrawal"})})())}async listSavingEntriesByMember(e,t={}){return b(this.repos.savingLedgerRepository.listByMember(e,t))}async getSavingBalanceByMember(e){return b((async()=>{let t=P(await this.listSavingEntriesByMember(e)),n={pokok:0,wajib:0,sukarela:0,total:0};for(let a of t){let i=a.entryType==="credit"?1:-1;n[a.savingType]+=i*a.amount}return n.total=n.pokok+n.wajib+n.sukarela,n})())}};function Dr(r){var e,t,n;if(!((e=r.koperasiId)!=null&&e.trim()))throw l("koperasiId is required");if(!((t=r.tenantId)!=null&&t.trim()))throw l("tenantId is required");if(!((n=r.effectiveDate)!=null&&n.trim()))throw l("effectiveDate is required");if(r.simpananPokokNominalIdr<0)throw l("simpananPokokNominalIdr must be >= 0");if(r.monthlyWajibNominalIdr<0)throw l("monthlyWajibNominalIdr must be >= 0")}function Tr(r,e){return r-e}var Ye=class{constructor(e,t={}){this.repos=e;this.options=t;this.newId=D("saving-policy")}async getActiveSavingPolicy(e){return b(this.repos.savingPolicyRepository.getActive(e))}async upsertSavingPolicy(e){return b((async()=>{var s,d;Dr(e);let t={koperasiId:e.koperasiId,tenantId:e.tenantId,branchId:e.branchId},n=await this.repos.savingPolicyRepository.getPolicyHistory(t);if(n.length>0){let c=n[0].effectiveDate;if(e.effectiveDate<=c)throw U(`effectiveDate "${e.effectiveDate}" harus lebih baru dari policy terbaru "${c}".`)}let a=g(),i=await this.repos.savingPolicyRepository.getActive(t);i&&!i.isSuperseded&&(await this.repos.savingPolicyRepository.markSuperseded(i.id),await S(this.options,{name:"saving.policy-superseded",occurredAt:a,entityId:i.id,tenantId:i.tenantId,branchId:i.branchId,payload:{supersededBy:e.effectiveDate}}));let o=await this.repos.savingPolicyRepository.create({id:this.newId(),...e,changeReason:(s=e.changeReason)!=null?s:null,approvalRef:(d=e.approvalRef)!=null?d:null,isSuperseded:!1,version:1,lastModified:a,deleted:!1});return await S(this.options,{name:"saving.policy-upserted",occurredAt:a,entityId:o.id,tenantId:o.tenantId,branchId:o.branchId,payload:{effectiveDate:o.effectiveDate}}),o})())}async getPolicyHistory(e){return b(this.repos.savingPolicyRepository.getPolicyHistory(e))}async evaluateWajibCompliance(e){return b((async()=>{let t=P(await this.getActiveSavingPolicy(e)),a=(await this.repos.savingLedgerRepository.listAll({includeDeleted:!1,tenantId:e.tenantId,branchId:e.branchId})).filter(s=>s.savingType==="wajib"),i=a.filter(s=>s.entryType==="credit").reduce((s,d)=>s+d.amount,0),o=a.filter(s=>s.entryType==="debit").reduce((s,d)=>s+d.amount,0);return{summary:{activePolicy:t?1:0,wajibCreditTotal:i,wajibDebitTotal:o,wajibNetTotal:Tr(i,o)},referenceDate:g()}})())}async getComplianceWorklist(e){return b((async()=>{let t=P(await this.getActiveSavingPolicy(e));if(!t)return[];let n=await this.repos.memberRepository.list({includeDeleted:!1,status:"active",tenantId:e.tenantId,branchId:e.branchId}),a=new Date;return Promise.all(n.map(async i=>{let s=(await this.repos.savingLedgerRepository.listByMember(i.id,{tenantId:e.tenantId,branchId:e.branchId})).reduce((y,I)=>I.savingType!=="wajib"?y:y+(I.entryType==="credit"?I.amount:-I.amount),0),c=Math.max(1,this.monthDiffInclusive(i.joinDate,a.toISOString().slice(0,10)))*t.monthlyWajibNominalIdr,m=Math.max(0,c-s),p=t.monthlyWajibNominalIdr>0?Math.ceil(m/t.monthlyWajibNominalIdr):0,u=p*30,h=u>90?"critical":u>30?"high":u>7?"medium":"low";return{id:`worklist-${i.id}`,memberId:i.id,scopeRef:{tenantId:e.tenantId,branchId:e.branchId},urgency:h,reasonCode:"WJ-REVIEW",reasonText:`[${i.memberNumber}] ${i.fullName} \u2014 policy: ${t.id}`,suggestedActions:["verify_monthly_wajib"],metrics:{expectedWajib:c,wajibNet:s,arrearsAmount:m,monthsInArrears:p,daysInArrears:u},timestamp:a.toISOString()}}))})())}monthDiffInclusive(e,t){let n=new Date(e),a=new Date(t);if(Number.isNaN(n.getTime())||Number.isNaN(a.getTime()))return 1;let i=a.getUTCFullYear()-n.getUTCFullYear(),o=a.getUTCMonth()-n.getUTCMonth();return i*12+o+1}};function xr(r){var t,n,a;if(!((t=r.koperasiId)!=null&&t.trim()))throw l("koperasiId is required");if(!((n=r.tenantId)!=null&&n.trim()))throw l("tenantId is required");if(!((a=r.effectiveDate)!=null&&a.trim()))throw l("effectiveDate is required");let e=r.cadanganPercent+r.jasaUsahaPercent+r.jasaModalPercent;if(e!==100)throw l(`SHU config percent total must be exactly 100, got ${e}`)}function Or(r){switch(r){case"ksp":return{simpananWeight:40,jasaUsahaWeight:60};case"konsumen":return{simpananWeight:30,jasaUsahaWeight:70};case"produsen":return{simpananWeight:30,jasaUsahaWeight:70};case"pemasaran":return{simpananWeight:25,jasaUsahaWeight:50,pemasaranWeight:25};case"serba_usaha":return{simpananWeight:30,jasaUsahaWeight:40,pemasaranWeight:30};case"custom":return{simpananWeight:50,jasaUsahaWeight:50}}}function Er(r){return r==null?null:JSON.stringify(r)}function gn(r){if(r==null)return null;if(typeof r=="string")try{return JSON.parse(r)}catch{return null}return typeof r=="object"?r:null}function Ze(r){return{...r,participationWeights:gn(r.participationWeights)}}var Xe=class{constructor(e,t={}){this.repos=e;this.options=t;this.newId=D("shu-config")}async getActiveShuConfig(e){return b((async()=>{let t=await this.repos.shuConfigRepository.getActive(e);return t?Ze(t):null})())}async upsertShuConfig(e){return b((async()=>{var s,d,c,m,p,u,h;xr(e);let t={koperasiId:e.koperasiId,tenantId:e.tenantId,branchId:e.branchId},a=(s=(await this.repos.shuConfigRepository.list(t)).find(y=>y.effectiveDate===e.effectiveDate))!=null?s:null,i=g();if(a){let y=await this.repos.shuConfigRepository.upsert({...a,...e,notes:(d=e.notes)!=null?d:null,approvalRef:(c=e.approvalRef)!=null?c:null,formulaModel:(m=e.formulaModel)!=null?m:null,participationWeights:Er(e.participationWeights),version:a.version+1,lastModified:i});return await S(this.options,{name:"shu.config-upserted",occurredAt:g(),entityId:y.id,tenantId:y.tenantId,branchId:y.branchId,payload:{effectiveDate:y.effectiveDate}}),Ze(y)}let o=await this.repos.shuConfigRepository.upsert({id:this.newId(),...e,notes:(p=e.notes)!=null?p:null,approvalRef:(u=e.approvalRef)!=null?u:null,formulaModel:(h=e.formulaModel)!=null?h:null,participationWeights:Er(e.participationWeights),version:1,lastModified:i,deleted:!1});return await S(this.options,{name:"shu.config-upserted",occurredAt:g(),entityId:o.id,tenantId:o.tenantId,branchId:o.branchId,payload:{effectiveDate:o.effectiveDate}}),Ze(o)})())}async listShuConfigs(e,t={}){return b((async()=>(await this.repos.shuConfigRepository.list(e,t)).map(a=>Ze(a)))())}async getDefaultParticipationWeights(e){return b(Promise.resolve(Or(e)))}};function Lr(r){var e,t,n,a;if(!((e=r.periodCode)!=null&&e.trim()))throw l("periodCode is required");if(!((t=r.startDate)!=null&&t.trim()))throw l("startDate is required");if(!((n=r.endDate)!=null&&n.trim()))throw l("endDate is required");if(!((a=r.tenantId)!=null&&a.trim()))throw l("tenantId is required")}var et=class{constructor(e,t,n={}){this.db=e;this.repos=t;this.options=n;this.newPeriodId=D("shu-period");this.newAllocationId=D("shu-allocation")}async inTx(e){return this.db.transaction(async t=>e(te(t)))}toDateOnly(e){return e.slice(0,10)}dateToUtcMs(e){return Date.parse(`${this.toDateOnly(e)}T00:00:00.000Z`)}diffDaysInclusive(e,t){let n=this.dateToUtcMs(t)-this.dateToUtcMs(e);return Math.floor(n/864e5)+1}getEligibleWindow(e,t,n){if(e.status!=="active"&&e.status!=="exited")return null;let a=this.toDateOnly(e.joinDate),i=e.exitDate?this.toDateOnly(e.exitDate):null;if(e.status==="exited"&&!i)return null;let o=a>t?a:t,s=i&&i<n?i:n;if(o>s)return null;let d=this.diffDaysInclusive(o,s),c=this.diffDaysInclusive(t,n);return{start:o,end:s,activeDays:d,proRataFactor:c>0?d/c:0}}applySavingEntryToBalance(e,t,n){var i;let a=t.entryType==="debit"?-1:1;if(t.savingType==="pokok"&&(e.pokok+=a*t.amount),t.savingType==="wajib"&&(e.wajib+=a*t.amount),t.savingType==="sukarela"){if(!n||n.size===0)return;let o=((i=t.referenceType)!=null?i:"").trim();if(!n.has(o))return;e.sukarela+=a*t.amount}}async computeAverageModalBasis(e){var p,u;let n=(await e.repos.savingLedgerRepository.listByMember(e.memberId,{includeDeleted:!1,dateTo:e.periodEnd,tenantId:(p=e.tenantId)!=null?p:void 0,branchId:(u=e.branchId)!=null?u:void 0})).slice().sort((h,y)=>this.toDateOnly(h.transactionDate).localeCompare(this.toDateOnly(y.transactionDate))),a={pokok:0,wajib:0,sukarela:0},i=this.dateToUtcMs(e.activeStart),o=this.dateToUtcMs(e.activeEnd)+864e5,s=this.diffDaysInclusive(e.periodStart,e.periodEnd),d=0,c=this.dateToUtcMs(e.periodStart),m=0;for(;m<n.length&&this.dateToUtcMs(n[m].transactionDate)<c;)this.applySavingEntryToBalance(a,n[m],e.includeSukarela?e.allowedSukarelaReferenceTypes:null),m+=1;for(;c<o;){let h=m<n.length?this.dateToUtcMs(n[m].transactionDate):o,y=Math.min(h,o);if(y>c){let I=Math.max(c,i),v=Math.min(y,o);if(v>I){let R=Math.floor((v-I)/864e5),C=a.pokok+a.wajib+(e.includeSukarela?a.sukarela:0);d+=C*R}c=y}else c+=864e5;for(;m<n.length&&this.dateToUtcMs(n[m].transactionDate)===y;)this.applySavingEntryToBalance(a,n[m],e.includeSukarela?e.allowedSukarelaReferenceTypes:null),m+=1}return s>0?d/s:0}allocateWithLargestRemainder(e){var d;let t=e.members.reduce((c,m)=>c+m.score,0);if(t<=0)throw l("SHU allocation requires non-zero total score; escalate to RAT decision");let n=new Map,a=e.members.map(c=>{let m=e.poolAmount*c.score/t,p=Math.floor(m);return n.set(c.memberId,p),{memberId:c.memberId,remainder:m-p}}),i=Array.from(n.values()).reduce((c,m)=>c+m,0),o=e.poolAmount-i;a.sort((c,m)=>m.remainder!==c.remainder?m.remainder-c.remainder:c.memberId.localeCompare(m.memberId));let s=0;for(;o>0&&a.length>0;){let c=a[s%a.length];n.set(c.memberId,((d=n.get(c.memberId))!=null?d:0)+1),o-=1,s+=1}return n}async createShuPeriod(e){return b((async()=>{var n;Lr(e);let t=await this.repos.shuPeriodRepository.create({id:this.newPeriodId(),periodCode:e.periodCode,startDate:e.startDate,endDate:e.endDate,status:"draft",formulaSnapshot:je(e.formulaSnapshot),branchId:e.branchId,tenantId:e.tenantId,version:1,lastModified:g(),deleted:!1});return(n=this.options.logger)==null||n.logInfo("[ofcoop] shu period created",{periodId:t.id,periodCode:t.periodCode}),await S(this.options,{name:"shu.period-created",occurredAt:g(),entityId:t.id,tenantId:t.tenantId,branchId:t.branchId,payload:{periodCode:t.periodCode}}),t})())}async finalizeShuPeriod(e){return b((async()=>{let t=await this.repos.shuPeriodRepository.getById(e);if(!t||t.deleted)throw w("SHU period",e);let n=await this.repos.shuPeriodRepository.update(e,{status:"finalized",version:t.version+1,lastModified:g()});return await S(this.options,{name:"shu.period-finalized",occurredAt:g(),entityId:n.id,tenantId:n.tenantId,branchId:n.branchId,payload:{status:n.status}}),n})())}async listShuPeriods(e={}){return b((async()=>(await this.repos.shuPeriodRepository.list({includeDeleted:e.includeDeleted,tenantId:e.tenantId,branchId:e.branchId})).filter(n=>{if(e.status&&n.status!==e.status)return!1;if(e.dateContains){let a=e.dateContains.slice(0,10);if(n.startDate>a||n.endDate<a)return!1}return!0}))())}async generateShuAllocations(e){return b(this.inTx(async t=>{var c,m,p,u,h,y,I,v,R,C,A,k,M,O,T,j,B,q,L,N,V,se,ve,de,Ie,Re,ce,Se,Ce,le,we;let n=await t.shuPeriodRepository.getById(e);if(!n||n.deleted)throw w("SHU period",e);let a=await t.memberRepository.list({includeDeleted:!1,tenantId:(c=n.tenantId)!=null?c:void 0,branchId:(m=n.branchId)!=null?m:void 0});if(a.length===0)return[];let i=n.formulaSnapshot,o=String((p=i.distributionMode)!=null?p:"equal-share"),s=[];if(o==="score-weighted-v1"){let G=this.toDateOnly(n.startDate),$=this.toDateOnly(n.endDate),H=Number((h=(u=i.shuTahunBukuIdr)!=null?u:i.totalDistributableShuIdr)!=null?h:0),K=Number((y=i.cadanganPercent)!=null?y:0),W=Number((I=i.poolAnggotaPercent)!=null?I:0),z=Number((v=i.bobotTransaksiPercent)!=null?v:0),Y=Number((R=i.bobotModalPercent)!=null?R:0),Q=!!((C=i.includeSukarelaInModalBasis)!=null&&C),Z=Array.isArray(i.sukarelaModalReferenceTypes)?i.sukarelaModalReferenceTypes.map(E=>String(E).trim()).filter(E=>E.length>0):[],me=new Set(Z),ne=i.transactionScoreByMemberId&&typeof i.transactionScoreByMemberId=="object"?i.transactionScoreByMemberId:{};if(!Number.isFinite(H)||H<=0)throw l("shuTahunBukuIdr must be provided for score-weighted-v1 allocation");if(!Number.isFinite(K)||K<0||K>100)throw l("cadanganPercent must be in range 0-100 for score-weighted-v1 allocation");if(!Number.isFinite(W)||W<0||W>100)throw l("poolAnggotaPercent must be in range 0-100 for score-weighted-v1 allocation");if(!Number.isFinite(z)||!Number.isFinite(Y)||z<0||Y<0||z+Y!==100)throw l("bobotTransaksiPercent + bobotModalPercent must equal 100 for score-weighted-v1 allocation");let ue=Math.max(0,Math.floor(H-H*K/100)),ae=Math.max(0,Math.floor(ue*W/100));if(ae<=0)return[];let X=[];for(let E of a){let J=this.getEligibleWindow(E,G,$);if(!J)continue;let xe=await this.computeAverageModalBasis({memberId:E.id,tenantId:n.tenantId,branchId:n.branchId,periodStart:G,periodEnd:$,activeStart:J.start,activeEnd:J.end,includeSukarela:Q,allowedSukarelaReferenceTypes:me,repos:t}),ge=Number((A=ne[E.id])!=null?A:0),Ae=Number.isFinite(ge)&&ge>0?ge*J.proRataFactor:0,Oe=xe>0?xe:0,Ee=z/100*Ae+Y/100*Oe;X.push({member:E,proRataFactor:J.proRataFactor,modalScore:Oe,transaksiScore:Ae,score:Ee,activeDays:J.activeDays})}let oe=X.filter(E=>E.score>0),pe=this.allocateWithLargestRemainder({poolAmount:ae,members:oe.map(E=>({memberId:E.member.id,score:E.score}))});for(let E of oe)s.push({id:this.newAllocationId(),shuPeriodId:e,memberId:E.member.id,allocationAmount:(k=pe.get(E.member.id))!=null?k:0,calculationBasis:{mode:"score-weighted-v1",shuTahunBukuIdr:H,cadanganPercent:K,shuSetelahCadangan:ue,poolAnggotaPercent:W,poolShuAnggota:ae,bobotTransaksiPercent:z,bobotModalPercent:Y,includeSukarelaInModalBasis:Q,sukarelaModalReferenceTypes:Z,proRataFactor:E.proRataFactor,activeDays:E.activeDays,transaksiScore:E.transaksiScore,modalScore:E.modalScore,score:E.score},branchId:(M=E.member.branchId)!=null?M:n.branchId,tenantId:(O=E.member.tenantId)!=null?O:n.tenantId,version:1,lastModified:g(),deleted:!1})}else if(o==="jma-jua-v1"){let G=this.toDateOnly(n.startDate),$=this.toDateOnly(n.endDate),H=Number((T=i.shuTahunBukuIdr)!=null?T:0),K=Number((j=i.cadanganPercent)!=null?j:0),W=Number((B=i.pendidikanPercent)!=null?B:0),z=Number((q=i.sosialPercent)!=null?q:0),Y=Number((L=i.pengurusPercent)!=null?L:0),Q=Number((N=i.jasaModalPercent)!=null?N:0),Z=Number((V=i.jasaUsahaPercent)!=null?V:0),me=!!((se=i.includeSukarelaInModalBasis)!=null&&se),ne=Array.isArray(i.sukarelaModalReferenceTypes)?i.sukarelaModalReferenceTypes.map(x=>String(x).trim()).filter(x=>x.length>0):[],ue=new Set(ne),ae=K+W+z+Y+Q+Z;if(Math.abs(ae-100)>.01)throw l(`jma-jua-v1: cadanganPercent+pendidikanPercent+sosialPercent+pengurusPercent+jasaModalPercent+jasaUsahaPercent must sum to 100, got ${ae}`);let X=Math.floor(H*(Q+Z)/100),oe=Q+Z,pe=oe>0?Math.floor(X*Q/oe):0,E=X-pe;if(X<=0)return[];let J=[],xe=await t.shuParticipationEntryRepository.listByPeriod(e,{includeDeleted:!1}),ge=new Map;for(let x of xe){let ee=(ve=ge.get(x.memberId))!=null?ve:0;ge.set(x.memberId,ee+x.amount)}for(let x of a){let ee=this.getEligibleWindow(x,G,$);if(!ee)continue;let Pe=await this.computeAverageModalBasis({memberId:x.id,tenantId:n.tenantId,branchId:n.branchId,periodStart:G,periodEnd:$,activeStart:ee.start,activeEnd:ee.end,includeSukarela:me,allowedSukarelaReferenceTypes:ue,repos:t}),Le=(de=ge.get(x.id))!=null?de:0;Pe<=0&&Le<=0||J.push({member:x,proRataFactor:ee.proRataFactor,activeDays:ee.activeDays,modalBasis:Pe,juaScore:Le})}if(J.length===0)return[];let Ae=J.filter(x=>x.modalBasis>0),Oe=Ae.length>0?this.allocateWithLargestRemainder({poolAmount:pe,members:Ae.map(x=>({memberId:x.member.id,score:x.modalBasis}))}):new Map,Ee=J.filter(x=>x.juaScore>0),en=Ee.length>0?this.allocateWithLargestRemainder({poolAmount:E,members:Ee.map(x=>({memberId:x.member.id,score:x.juaScore}))}):new Map;for(let x of J){let ee=(Ie=Oe.get(x.member.id))!=null?Ie:0,Pe=(Re=en.get(x.member.id))!=null?Re:0,Le=ee+Pe;s.push({id:this.newAllocationId(),shuPeriodId:e,memberId:x.member.id,allocationAmount:Le,calculationBasis:{mode:"jma-jua-v1",shuTahunBukuIdr:H,shuDibagikan:X,jasaModalPercent:Q,jasaUsahaPercent:Z,poolJMA:pe,poolJUA:E,includeSukarelaInModalBasis:me,sukarelaModalReferenceTypes:ne,proRataFactor:x.proRataFactor,activeDays:x.activeDays,modalScore:x.modalBasis,juaScore:x.juaScore,jmaAmount:ee,juaAmount:Pe},branchId:(ce=x.member.branchId)!=null?ce:n.branchId,tenantId:(Se=x.member.tenantId)!=null?Se:n.tenantId,version:1,lastModified:g(),deleted:!1})}}else{let G=a.filter(W=>W.status==="active");if(G.length===0)return[];let $=Number(i.totalDistributableShuIdr||0),H=Number.isFinite($)&&$>0?$:G.length*1e5,K=Math.floor(H/G.length);for(let W of G)s.push({id:this.newAllocationId(),shuPeriodId:e,memberId:W.id,allocationAmount:K,calculationBasis:{mode:"equal-share",memberCount:G.length,sourceTotal:H},branchId:(Ce=W.branchId)!=null?Ce:n.branchId,tenantId:(le=W.tenantId)!=null?le:n.tenantId,version:1,lastModified:g(),deleted:!1})}let d=await t.shuAllocationRepository.createMany(s);return(we=this.options.logger)==null||we.logInfo("[ofcoop] shu allocations generated",{periodId:e,allocations:d.length}),await S(this.options,{name:"shu.allocations-generated",occurredAt:g(),entityId:e,tenantId:n.tenantId,branchId:n.branchId,payload:{allocations:d.length}}),d}))}async listShuAllocations(e,t={}){return b(this.repos.shuAllocationRepository.listByPeriod(e,t))}async exportShuAllocationsCsv(e){return b((async()=>{let n=["allocationId,shuPeriodId,memberId,allocationAmount",...P(await this.listShuAllocations(e,{includeDeleted:!1})).map(a=>`${a.id},${a.shuPeriodId},${a.memberId},${a.allocationAmount}`)].join(`
|
|
6
|
-
`);return{filename:`shu-allocations-${e}.csv`,contentType:"text/csv",body:n}})())}};function Br(r){var e,t,n,a,i;if(!((e=r.proposedMemberId)!=null&&e.trim()))throw l("proposedMemberId is required");if(!((t=r.positionTitle)!=null&&t.trim()))throw l("positionTitle is required");if(!((n=r.effectiveDate)!=null&&n.trim()))throw l("effectiveDate is required");if(!((a=r.roleType)!=null&&a.trim()))throw l("roleType is required");if(!((i=r.appointmentType)!=null&&i.trim()))throw l("appointmentType is required")}function jr(r){var e;if(!((e=r.endorsedBy)!=null&&e.trim()))throw l("endorsedBy is required")}function yo(r){}function Nr(r){var e;if(!((e=r.rejectionReason)!=null&&e.trim()))throw l("rejectionReason is required")}var tt=class{constructor(e,t={}){this.repos=e;this.options=t;this.newId=D("leadership-appointment")}async proposeAppointment(e){return b((async()=>{var a,i,o,s;Br(e);let t=g(),n=await this.repos.leadershipAppointmentRepository.create({id:this.newId(),proposedMemberId:e.proposedMemberId,roleType:e.roleType,positionTitle:e.positionTitle.trim(),appointmentType:e.appointmentType,replacesTermId:(a=e.replacesTermId)!=null?a:null,governanceMeetingRef:(i=e.governanceMeetingRef)!=null?i:null,status:"proposed",effectiveDate:e.effectiveDate,endDate:(o=e.endDate)!=null?o:null,proposedAt:t,endorsedAt:null,endorsedBy:null,approvedAt:null,approvalRef:null,installedAt:null,installedTermId:null,rejectedAt:null,rejectionReason:null,notes:(s=e.notes)!=null?s:null,tenantId:e.tenantId,branchId:e.branchId,version:1,lastModified:t,deleted:!1});return await S(this.options,{name:"governance.appointment-proposed",occurredAt:g(),entityId:n.id,tenantId:n.tenantId,branchId:n.branchId,payload:{proposedMemberId:n.proposedMemberId,roleType:n.roleType}}),n})())}async endorseAppointment(e,t){return b((async()=>{var o,s,d;jr(t);let n=await this.repos.leadershipAppointmentRepository.getById(e);if(!n||n.deleted)throw w("LeadershipAppointment",e);if(n.status!=="proposed")throw l(`Appointment must be in 'proposed' status to endorse, got '${n.status}'`);let a=g(),i=await this.repos.leadershipAppointmentRepository.update(e,{status:"endorsed",endorsedBy:t.endorsedBy,endorsedAt:(o=t.endorsedAt)!=null?o:a,governanceMeetingRef:(d=(s=t.governanceMeetingRef)!=null?s:n.governanceMeetingRef)!=null?d:null,version:n.version+1,lastModified:a});return await S(this.options,{name:"governance.appointment-endorsed",occurredAt:g(),entityId:i.id,tenantId:i.tenantId,branchId:i.branchId,payload:{endorsedBy:i.endorsedBy}}),i})())}async approveAppointment(e,t){return b((async()=>{var o,s;let n=await this.repos.leadershipAppointmentRepository.getById(e);if(!n||n.deleted)throw w("LeadershipAppointment",e);if(n.status!=="endorsed")throw l(`Appointment must be in 'endorsed' status to approve, got '${n.status}'`);let a=g(),i=await this.repos.leadershipAppointmentRepository.update(e,{status:"approved",approvedAt:(o=t.approvedAt)!=null?o:a,approvalRef:(s=t.approvalRef)!=null?s:null,version:n.version+1,lastModified:a});return await S(this.options,{name:"governance.appointment-approved",occurredAt:g(),entityId:i.id,tenantId:i.tenantId,branchId:i.branchId,payload:{approvalRef:i.approvalRef}}),i})())}async installAppointment(e,t){return b((async()=>{var c,m,p,u;let n=await this.repos.leadershipAppointmentRepository.getById(e);if(!n||n.deleted)throw w("LeadershipAppointment",e);if(n.status!=="approved")throw l(`Appointment must be in 'approved' status to install, got '${n.status}'`);let a=g(),i=(c=t==null?void 0:t.installedAt)!=null?c:a;if(n.replacesTermId){let h=await this.repos.leadershipTermRepository.getById(n.replacesTermId);h&&!h.deleted&&h.status==="active"&&await this.repos.leadershipTermRepository.update(n.replacesTermId,{status:"ended",endDate:n.effectiveDate,version:h.version+1,lastModified:a})}let o=D("leadership-term")(),s=await this.repos.leadershipTermRepository.create({id:o,memberId:n.proposedMemberId,roleType:n.roleType,positionTitle:n.positionTitle,startDate:n.effectiveDate,endDate:(m=n.endDate)!=null?m:null,handoverFromTermId:(p=n.replacesTermId)!=null?p:null,status:"active",notes:(u=n.notes)!=null?u:null,tenantId:n.tenantId,branchId:n.branchId,version:1,lastModified:a,deleted:!1}),d=await this.repos.leadershipAppointmentRepository.update(e,{status:"installed",installedAt:i,installedTermId:s.id,version:n.version+1,lastModified:a});return await S(this.options,{name:"governance.appointment-installed",occurredAt:g(),entityId:d.id,tenantId:d.tenantId,branchId:d.branchId,payload:{installedTermId:s.id,proposedMemberId:n.proposedMemberId}}),d})())}async rejectAppointment(e,t){return b((async()=>{var o;Nr(t);let n=await this.repos.leadershipAppointmentRepository.getById(e);if(!n||n.deleted)throw w("LeadershipAppointment",e);if(n.status==="installed")throw l("Cannot reject an already installed appointment");let a=g(),i=await this.repos.leadershipAppointmentRepository.update(e,{status:"rejected",rejectedAt:(o=t.rejectedAt)!=null?o:a,rejectionReason:t.rejectionReason,version:n.version+1,lastModified:a});return await S(this.options,{name:"governance.appointment-rejected",occurredAt:g(),entityId:i.id,tenantId:i.tenantId,branchId:i.branchId,payload:{rejectionReason:i.rejectionReason}}),i})())}async getAppointmentById(e){return b((async()=>{let t=await this.repos.leadershipAppointmentRepository.getById(e);return!t||t.deleted?null:t})())}async listAppointments(e){return b(this.repos.leadershipAppointmentRepository.list(e))}};function Lt(r){var e,t,n;if(!((e=r.shuPeriodId)!=null&&e.trim()))throw l("shuPeriodId is required");if(!((t=r.memberId)!=null&&t.trim()))throw l("memberId is required");if(!((n=r.participationType)!=null&&n.trim()))throw l("participationType is required");if(!Number.isFinite(r.amount)||r.amount<0)throw l("amount must be >= 0")}var rt=class{constructor(e,t={}){this.repos=e;this.options=t;this.newId=D("shu-participation")}async recordParticipation(e){return b((async()=>{var n,a;Lt(e);let t=await this.repos.shuParticipationEntryRepository.create({id:this.newId(),shuPeriodId:e.shuPeriodId,memberId:e.memberId,participationType:e.participationType,amount:e.amount,notes:(n=e.notes)!=null?n:null,tenantId:e.tenantId,branchId:e.branchId,version:1,lastModified:g(),deleted:!1});return(a=this.options.logger)==null||a.logInfo("[ofcoop] shu participation recorded",{entryId:t.id,memberId:t.memberId,periodId:t.shuPeriodId}),await S(this.options,{name:"shu.participation-recorded",occurredAt:g(),entityId:t.id,tenantId:t.tenantId,branchId:t.branchId,payload:{memberId:t.memberId,shuPeriodId:t.shuPeriodId,participationType:t.participationType}}),t})())}async bulkRecordParticipation(e){return b((async()=>{var a,i;let t=[];for(let o of e.entries)Lt(o),t.push({id:this.newId(),shuPeriodId:o.shuPeriodId,memberId:o.memberId,participationType:o.participationType,amount:o.amount,notes:(a=o.notes)!=null?a:null,tenantId:o.tenantId,branchId:o.branchId,version:1,lastModified:g(),deleted:!1});let n=await this.repos.shuParticipationEntryRepository.createMany(t);return(i=this.options.logger)==null||i.logInfo("[ofcoop] shu participation bulk recorded",{count:n.length}),await S(this.options,{name:"shu.participation-bulk-recorded",occurredAt:g(),payload:{count:n.length}}),n})())}async listParticipationByPeriod(e,t={}){return b(this.repos.shuParticipationEntryRepository.listByPeriod(e,t))}async summarizeParticipationByPeriod(e,t={}){return b((async()=>{var i;let n=await this.repos.shuParticipationEntryRepository.listByPeriod(e,t),a=new Map;for(let o of n){let s=a.get(o.memberId);s||(s={memberId:o.memberId,totalByType:{},grandTotal:0},a.set(o.memberId,s));let d=(i=s.totalByType[o.participationType])!=null?i:0;s.totalByType[o.participationType]=d+o.amount,s.grandTotal+=o.amount}return Array.from(a.values())})())}};function qr(r){var e,t,n;if(!((e=r.tenantId)!=null&&e.trim()))throw l("tenantId is required");if(!((t=r.displayName)!=null&&t.trim()))throw l("displayName is required");if(!((n=r.profileType)!=null&&n.trim()))throw l("profileType is required")}function re(r){return r==null?null:JSON.stringify(r)}function ke(r){if(r==null)return null;if(typeof r=="string")try{return JSON.parse(r)}catch{return null}return typeof r=="object"?r:null}function De(r){return{...r,savingRequirements:ke(r.savingRequirements),shuRules:ke(r.shuRules),membershipRequirements:ke(r.membershipRequirements),governanceRules:ke(r.governanceRules),customFields:ke(r.customFields)}}var nt=class{constructor(e,t={}){this.repos=e;this.options=t;this.newId=D("community-profile")}async createCommunityProfile(e){return b((async()=>{var n,a,i;qr(e);let t=await this.repos.communityProfileRepository.create({id:this.newId(),tenantId:e.tenantId,branchId:e.branchId,profileType:e.profileType,displayName:e.displayName,description:(n=e.description)!=null?n:null,savingRequirements:re(e.savingRequirements),shuRules:re(e.shuRules),membershipRequirements:re(e.membershipRequirements),governanceRules:re(e.governanceRules),customFields:re(e.customFields),isActive:!0,notes:(a=e.notes)!=null?a:null,version:1,lastModified:g(),deleted:!1});return(i=this.options.logger)==null||i.logInfo("[ofcoop] community profile created",{profileId:t.id,tenantId:t.tenantId}),await S(this.options,{name:"community-profile.created",occurredAt:g(),entityId:t.id,tenantId:t.tenantId,branchId:t.branchId,payload:{profileType:t.profileType,displayName:t.displayName}}),De(t)})())}async updateCommunityProfile(e,t){return b((async()=>{let n=await this.repos.communityProfileRepository.getById(e);if(!n||n.deleted)throw w("CommunityProfile",e);let a={version:n.version+1,lastModified:g()};t.displayName!==void 0&&(a.displayName=t.displayName),t.description!==void 0&&(a.description=t.description),t.savingRequirements!==void 0&&(a.savingRequirements=re(t.savingRequirements)),t.shuRules!==void 0&&(a.shuRules=re(t.shuRules)),t.membershipRequirements!==void 0&&(a.membershipRequirements=re(t.membershipRequirements)),t.governanceRules!==void 0&&(a.governanceRules=re(t.governanceRules)),t.customFields!==void 0&&(a.customFields=re(t.customFields)),t.isActive!==void 0&&(a.isActive=t.isActive),t.notes!==void 0&&(a.notes=t.notes);let i=await this.repos.communityProfileRepository.update(e,a);return await S(this.options,{name:"community-profile.updated",occurredAt:g(),entityId:i.id,tenantId:i.tenantId,branchId:i.branchId,payload:{profileType:i.profileType}}),De(i)})())}async getCommunityProfileById(e){return b((async()=>{let t=await this.repos.communityProfileRepository.getById(e);return!t||t.deleted?null:De(t)})())}async getActiveCommunityProfile(e,t){return b((async()=>{let n=await this.repos.communityProfileRepository.list({includeDeleted:!1,isActive:!0,tenantId:e,branchId:t});return n.length>0?De(n[0]):null})())}async listCommunityProfiles(e={}){return b((async()=>(await this.repos.communityProfileRepository.list(e)).map(n=>De(n)))())}};function Wr(r){var e,t,n;if(!((e=r.memberId)!=null&&e.trim()))throw l("memberId is required");if(!((t=r.fullName)!=null&&t.trim()))throw l("fullName is required");if(!((n=r.relationship)!=null&&n.trim()))throw l("relationship is required")}var at=class{constructor(e,t={}){this.repos=e;this.options=t;this.newId=D("member-dependent")}async addDependent(e){return b((async()=>{var n,a,i,o,s;Wr(e);let t=await this.repos.memberDependentRepository.create({id:this.newId(),memberId:e.memberId,fullName:e.fullName,relationship:e.relationship,birthDate:(n=e.birthDate)!=null?n:null,idNumber:(a=e.idNumber)!=null?a:null,isInsuranceBeneficiary:(i=e.isInsuranceBeneficiary)!=null?i:!1,notes:(o=e.notes)!=null?o:null,tenantId:e.tenantId,branchId:e.branchId,version:1,lastModified:g(),deleted:!1});return(s=this.options.logger)==null||s.logInfo("[ofcoop] member dependent added",{dependentId:t.id,memberId:t.memberId}),await S(this.options,{name:"member.dependent-added",occurredAt:g(),entityId:t.id,tenantId:t.tenantId,branchId:t.branchId,payload:{memberId:t.memberId,relationship:t.relationship}}),t})())}async updateDependent(e,t){return b((async()=>{let n=await this.repos.memberDependentRepository.getById(e);if(!n||n.deleted)throw w("MemberDependent",e);let a={version:n.version+1,lastModified:g()};t.fullName!==void 0&&(a.fullName=t.fullName),t.relationship!==void 0&&(a.relationship=t.relationship),t.birthDate!==void 0&&(a.birthDate=t.birthDate),t.idNumber!==void 0&&(a.idNumber=t.idNumber),t.isInsuranceBeneficiary!==void 0&&(a.isInsuranceBeneficiary=t.isInsuranceBeneficiary),t.notes!==void 0&&(a.notes=t.notes);let i=await this.repos.memberDependentRepository.update(e,a);return await S(this.options,{name:"member.dependent-updated",occurredAt:g(),entityId:i.id,tenantId:i.tenantId,branchId:i.branchId,payload:{memberId:i.memberId}}),i})())}async removeDependent(e){return b((async()=>{let t=await this.repos.memberDependentRepository.getById(e);if(!t||t.deleted)throw w("MemberDependent",e);let n=await this.repos.memberDependentRepository.update(e,{deleted:!0,version:t.version+1,lastModified:g()});return await S(this.options,{name:"member.dependent-removed",occurredAt:g(),entityId:n.id,tenantId:n.tenantId,branchId:n.branchId,payload:{memberId:n.memberId}}),n})())}async listDependentsByMember(e,t={}){return b(this.repos.memberDependentRepository.listByMember(e,t))}async getDependentById(e){return b((async()=>{let t=await this.repos.memberDependentRepository.getById(e);return!t||t.deleted?null:t})())}};async function Fr(r,e={}){let t=te(r),n=new We(r,t,e),a=new Ne(t),i=new Ue(r,t,e),o=new _e(t,e),s=new Ge(t,e),d=new $e(t,e),c=new Qe(t,e),m=new Ke(t,e),p=new ze(r,t,e),u=new Ye(t,e),h=new Je(t),y=new Xe(t,e),I=new et(r,t,e),v=new tt(t,e),R=new rt(t,e),C=new nt(t,e),A=new at(t,e),k=new Fe({leadershipTermService:o,managementReportService:s,riskRegisterService:c,whistleReportService:m});return{memberService:n,memberNumberPolicyService:a,complianceReadinessService:k,governanceMeetingService:i,leadershipTermService:o,managementReportService:s,oversightPolicyService:d,riskRegisterService:c,whistleReportService:m,savingLedgerService:p,savingPolicyService:u,savingComplianceSnapshotService:h,shuConfigService:y,shuService:I,leadershipAppointmentService:v,shuParticipationEntryService:R,communityProfileService:C,memberDependentService:A}}var it=class{constructor(e){this.context=e;this.dbTable="ofcoop_users"}setActiveSession(e){this.activeSession=e}logoutLocal(){this.activeSession=void 0}getActiveSession(){return this.activeSession}async fetchUsers(e){var n;let t=(n=this.context.registry)==null?void 0:n.dbAdapter;return t?t.query(this.dbTable,e):[]}};function bn(r){return r.startsWith("member.")?f.members:r.startsWith("governance.meeting-")?f.governanceMeetings:r.startsWith("governance.agenda-")?f.governanceAgendaItems:r==="governance.vote-recorded"?f.governanceVotes:r.startsWith("governance.leadership-term-")?f.leadershipTerms:r.startsWith("governance.management-report-")?f.managementReports:r.startsWith("oversight.policy-")?f.oversightPolicies:r.startsWith("risk.item-")?f.riskRegisters:r.startsWith("whistle.report-")?f.whistleReports:r.startsWith("saving.entry-")?f.savingEntries:r.startsWith("saving.policy-")?f.savingPolicies:r.startsWith("shu.config-")?f.shuConfigs:r.startsWith("shu.period-")?f.shuPeriods:r.startsWith("shu.allocations-")?f.shuAllocations:null}function vn(r){return r.endsWith(".created")||r.endsWith("-created")||r.endsWith("-generated")||r.endsWith("-recorded")?"INSERT":"UPDATE"}var Bt=class{constructor(e,t){this.runtime=e;this.runtimeStateStore=t;this.runtimeStore=fn(this.runtimeStateStore)}static builder(){return new jt}get registry(){return this.runtime.registry}async start(e={}){this.runtimeStateStore.setState({phase:"starting",started:!1,lastError:null,lastTransitionAt:new Date().toISOString()});try{await this.runtime.start(e),this.domainServices=this.runtime.domainServices,this.runtimeStateStore.setState(t=>({...t,phase:"started",started:!0,startCount:t.startCount+1,lastError:null,lastTransitionAt:new Date().toISOString()}))}catch(t){throw this.runtimeStateStore.setState({phase:"error",started:!1,lastError:t instanceof Error?t.message:String(t),lastTransitionAt:new Date().toISOString()}),t}}async init(e={}){this.runtimeStateStore.setState({phase:"starting",started:!1,lastError:null,lastTransitionAt:new Date().toISOString()});try{await this.runtime.init(e),this.domainServices=this.runtime.domainServices,this.runtimeStateStore.setState(t=>({...t,phase:"started",started:!0,startCount:t.startCount+1,lastError:null,lastTransitionAt:new Date().toISOString()}))}catch(t){throw this.runtimeStateStore.setState({phase:"error",started:!1,lastError:t instanceof Error?t.message:String(t),lastTransitionAt:new Date().toISOString()}),t}}async stop(){this.runtimeStateStore.setState({phase:"stopping",started:this.runtime.isStarted(),lastError:null,lastTransitionAt:new Date().toISOString()});try{await this.runtime.stop(),this.runtimeStateStore.setState(e=>({...e,phase:"stopped",started:!1,stopCount:e.stopCount+1,lastError:null,lastTransitionAt:new Date().toISOString()}))}catch(e){throw this.runtimeStateStore.setState({phase:"error",started:this.runtime.isStarted(),lastError:e instanceof Error?e.message:String(e),lastTransitionAt:new Date().toISOString()}),e}}async restart(){this.runtimeStateStore.setState({phase:"starting",started:this.runtime.isStarted(),lastError:null,lastTransitionAt:new Date().toISOString()});try{await this.runtime.restart(),this.domainServices=this.runtime.domainServices,this.runtimeStateStore.setState(e=>({...e,phase:"started",started:!0,startCount:e.startCount+1,lastError:null,lastTransitionAt:new Date().toISOString()}))}catch(e){throw this.runtimeStateStore.setState({phase:"error",started:this.runtime.isStarted(),lastError:e instanceof Error?e.message:String(e),lastTransitionAt:new Date().toISOString()}),e}}isStarted(){return this.runtime.isStarted()}createCorrelationId(e="ofcoop"){return this.runtime.createCorrelationId(e)}use(e,t,n=[]){return this.runtime.use(e,async()=>t(this),n),this}},jt=class{constructor(){this.runtimeBuilder=yn.builder();this.domainServiceOverrides={};this.runtimeHooks={};this.extraServiceOptions={};this.runtimeBuilder.withDbAdapter(()=>new Ur)}withPlatformAdapter(e){return this.runtimeBuilder.withPlatformAdapter(e),this}withDbAdapter(e){return this.runtimeBuilder.withDbAdapter(e),this}withHttpAdapter(e){return this.runtimeBuilder.withHttpAdapter(e),this}withSocketAdapter(e){return this.runtimeBuilder.withSocketAdapter(e),this}withLoggerAdapter(e){return this.runtimeBuilder.withLoggerAdapter(e),this}withActivitySink(e){return this.runtimeBuilder.withActivitySink(e),this}withExtension(e,t){return this.runtimeBuilder.withExtension(e,t),this}withDomainServicesFactory(e){return this.domainServicesFactory=e,this}overrideDomainServices(e){return this.domainServiceOverrides={...this.domainServiceOverrides,...e},this}withRuntimeHooks(e){return this.runtimeHooks={...this.runtimeHooks,...e},this}withMigrationRunner(e){return this.withRuntimeHooks({runMigrations:e})}withDomainEventSink(e){return this.domainEventSink=e,this}withServiceRuntimeOptions(e){return this.extraServiceOptions={...this.extraServiceOptions,...e},this}build(){var i;let e=hn({phase:"idle",started:!1,startCount:0,stopCount:0,lastError:null,lastTransitionAt:new Date().toISOString()}),t=async o=>{var d,c;let s=(d=o.registry)==null?void 0:d.dbAdapter;s&&await Vt(s,(c=o.registry)==null?void 0:c.loggerAdapter)};this.runtimeBuilder.withHooks({...this.runtimeHooks,runMigrations:(i=this.runtimeHooks.runMigrations)!=null?i:t,createDomainServices:async o=>{var c,m,p;let s=async u=>{var v,R,C,A,k,M,O,T,j,B,q;let h=[],y=(v=o.registry)==null?void 0:v.dbAdapter,I=bn(u.name);if(y&&I&&u.entityId)try{await y.create(f.histories,{id:o.createCorrelationId("ofcoop-history"),tableName:I,recordId:u.entityId,action:vn(u.name),changes:(R=u.payload)!=null?R:null,userId:(M=(k=(A=(C=this.coreInstance)==null?void 0:C.userService)==null?void 0:A.getActiveSession())==null?void 0:k.id)!=null?M:null,timestamp:u.occurredAt,branchId:(O=u.branchId)!=null?O:null,tenantId:(T=u.tenantId)!=null?T:null})}catch(L){h.push(L)}if(this.domainEventSink)try{await this.domainEventSink(u)}catch(L){h.push(L)}if((j=o.registry)!=null&&j.activitySink)try{await o.registry.activitySink.publish({activityId:o.createCorrelationId("ofcoop-event"),activityType:`ofcoop.${u.name}`,occurredAt:u.occurredAt,scopeRef:{domain:"ofcoop",...u.tenantId?{tenantId:u.tenantId}:{},...u.branchId?{branchId:u.branchId}:{}},payload:{entityId:(B=u.entityId)!=null?B:null,...(q=u.payload)!=null?q:{}},correlationId:o.createCorrelationId("ofcoop-corr")})}catch(L){h.push(L)}if(h.length>0)throw h[0]};return{...this.domainServicesFactory?await this.domainServicesFactory():await Fr((m=(c=o.registry)==null?void 0:c.dbAdapter)!=null?m:new Ur,{logger:(p=o.registry)==null?void 0:p.loggerAdapter,emitEvent:s,...this.extraServiceOptions}),...this.domainServiceOverrides}}});let n=this.runtimeBuilder.build(),a=new Bt(n,e);return this.coreInstance=a,a.userService=new it(a),a}};function In(r){return`${r.from.slice(0,10)}_${r.to.slice(0,10)}`}function gs(r,e,t={}){var i,o,s,d,c,m,p,u,h;let n=In(r.period),a=(i=t.targetVsActualRows)!=null?i:[{label:"Pendapatan",targetIdr:r.accounting.incomeStatement.revenue,actualIdr:r.accounting.incomeStatement.revenue},{label:"Beban",targetIdr:r.accounting.incomeStatement.expense,actualIdr:r.accounting.incomeStatement.expense},{label:"SHU / Laba Bersih",targetIdr:r.accounting.incomeStatement.netIncome,actualIdr:r.accounting.incomeStatement.netIncome}];return{identity:{koperasiName:(s=(o=t.identity)==null?void 0:o.koperasiName)!=null?s:null,bhNumber:(c=(d=t.identity)==null?void 0:d.bhNumber)!=null?c:null,bookYearPeriod:(p=(m=t.identity)==null?void 0:m.bookYearPeriod)!=null?p:n,documentDate:(h=(u=t.identity)==null?void 0:u.documentDate)!=null?h:r.period.to},financial:{neracaRef:`AUTO-NERACA-${n}`,lphuRef:`AUTO-LPHU-${n}`,cashFlowRef:`AUTO-ARUSKAS-${n}`,equityChangeRef:`AUTO-EKUITAS-${n}`,notesRef:`AUTO-CALK-${n}`,accountingSummary:r.accounting,hasilUsahaSummary:e},ratios:{roaPercent:r.crossDomain.memberActivationRate*100,roePercent:r.crossDomain.shuPerActiveMember>0?r.crossDomain.memberActivationRate*100:0,currentRatioPercent:r.accounting.balanceSheet.liabilities>0?Number((r.accounting.balanceSheet.assets/r.accounting.balanceSheet.liabilities*100).toFixed(2)):0,debtToEquityPercent:r.accounting.balanceSheet.equity>0?Number((r.accounting.balanceSheet.liabilities/r.accounting.balanceSheet.equity*100).toFixed(2)):0,healthMethod:"internal-baseline"},workPlan:{targetVsActualTableRef:`AUTO-RAPB-REALISASI-${n}`,targetVsActualRows:a,shuDistributedIdr:r.shu.totalAllocatedAmount},nextPlan:t.nextPlan?{businessPlanSummary:t.nextPlan.businessPlanSummary,revenueTargetIdr:t.nextPlan.revenueTargetIdr,expenseTargetIdr:t.nextPlan.expenseTargetIdr,shuProjectionIdr:t.nextPlan.shuProjectionIdr}:null}}async function bs(r,e){var c,m,p,u,h,y,I;if(!((c=e.transactionDate)!=null&&c.trim()))throw l("transactionDate is required");let t=Math.max(0,(m=e.initialPokokDepositIdr)!=null?m:0),n=Math.max(0,(p=e.initialWajibDepositIdr)!=null?p:0),a=Math.max(0,(u=e.initialSukarelaDepositIdr)!=null?u:0);if(r.savingPolicyService&&e.koperasiId&&e.member.tenantId){let v=await r.savingPolicyService.getActiveSavingPolicy({koperasiId:e.koperasiId,tenantId:e.member.tenantId,branchId:(h=e.member.branchId)!=null?h:void 0}),R=P(v);if(R&&t<R.simpananPokokNominalIdr)throw l(`initialPokokDepositIdr must be >= ${R.simpananPokokNominalIdr}`)}let i=await r.memberService.createMember(e.member),o=P(i),s=[],d={memberId:o.id,transactionDate:e.transactionDate,tenantId:(y=o.tenantId)!=null?y:void 0,branchId:(I=o.branchId)!=null?I:void 0};if(t>0){let v=await r.savingLedgerService.recordSavingCredit({...d,savingType:"pokok",amount:t});s.push(P(v))}if(n>0){let v=await r.savingLedgerService.recordSavingCredit({...d,savingType:"wajib",amount:n});s.push(P(v))}if(a>0){let v=await r.savingLedgerService.recordSavingCredit({...d,savingType:"sukarela",amount:a});s.push(P(v))}return{member:o,ledgerEntries:s}}async function vs(r,e){var c;let t=await r.savingPolicyService.upsertSavingPolicy(e),n=P(t),a={koperasiId:e.koperasiId,tenantId:e.tenantId,branchId:(c=e.branchId)!=null?c:void 0},i=await r.savingPolicyService.evaluateWajibCompliance(a),o=P(i),s=await r.savingPolicyService.getComplianceWorklist(a),d=P(s);return{policy:n,evaluation:o,worklist:d}}async function Is(r,e){let t=await r.shuService.createShuPeriod(e),n=P(t),a=await r.shuService.generateShuAllocations(n.id),i=P(a),o=await r.shuService.exportShuAllocationsCsv(n.id),s=P(o);return{period:n,allocations:i,csv:s}}function Rn(r){var t;let e=r.accessContext;if(e&&e.role==="anggota"){if(!((t=e.actorMemberId)!=null&&t.trim()))throw l("member360 access denied: anggota context requires actorMemberId");if(e.actorMemberId!==r.memberId)throw l("member360 access denied: anggota can only access own memberId")}}function Sn(r){return r.map(e=>({itemId:`saving-${e.id}`,occurredAt:e.transactionDate,source:"saving-ledger",title:`${e.entryType} ${e.savingType}`,detail:`${e.amount}`}))}function Cn(r){var e;return(e=r==null?void 0:r.recentLoans)!=null&&e.length?r.recentLoans.map(t=>({itemId:`loan-${t.loanId}`,occurredAt:t.startDate,source:"credit",title:`loan ${t.status}`,detail:`${t.principalAmount}`})):[]}function wn(r){return r.map(e=>{var t;return{itemId:`audit-${e.eventId}`,occurredAt:e.occurredAt,source:"audit",title:e.eventType,detail:(t=e.message)!=null?t:e.eventType}})}async function ws(r,e){var v,R,C,A,k,M,O,T,j,B,q,L,N;Rn(e);let t=await r.memberService.getMemberById(e.memberId),n=P(t);if(!n||n.deleted)return null;let a={...(v=e.savingQuery)!=null?v:{},...(R=e.scope)!=null&&R.tenantId?{tenantId:e.scope.tenantId}:{},...(C=e.scope)!=null&&C.branchId?{branchId:e.scope.branchId}:{}},[i,o,s,d,c]=await Promise.all([r.savingLedgerService.getSavingBalanceByMember(n.id),r.savingLedgerService.listSavingEntriesByMember(n.id,a),(M=(k=(A=r.providers)==null?void 0:A.getCreditByMember)==null?void 0:k.call(A,n.id,e.scope))!=null?M:Promise.resolve(null),(j=(T=(O=r.providers)==null?void 0:O.getAuditByMember)==null?void 0:T.call(O,n.id,e.scope))!=null?j:Promise.resolve([]),(L=(q=(B=r.providers)==null?void 0:B.getSettlementSummaryByMember)==null?void 0:q.call(B,n.id,e.scope))!=null?L:Promise.resolve(null)]),m=P(i),p=P(o),u=Sn(p),h=Cn(s),y=wn(d),I=[...u,...h,...y].sort((V,se)=>se.occurredAt.localeCompare(V.occurredAt));return{member:n,savings:{balance:m,recentEntries:p},credit:s,settlement:c,audit:d,timeline:I.slice(0,Math.max(1,(N=e.timelineLimit)!=null?N:20))}}function Ps(r){var n,a,i,o,s,d,c,m,p,u,h,y,I,v,R;let e=(n=r.credit)==null?void 0:n.summary,t=r.settlement;return{member:{id:r.member.id,memberNumber:r.member.memberNumber,fullName:r.member.fullName,status:r.member.status,joinDate:r.member.joinDate,exitDate:(a=r.member.exitDate)!=null?a:null,tenantId:(i=r.member.tenantId)!=null?i:null,branchId:(o=r.member.branchId)!=null?o:null},kpiCards:[{id:"saving-total",label:"Total Simpanan",value:r.savings.balance.total,unit:"IDR"},{id:"saving-pokok",label:"Simpanan Pokok",value:r.savings.balance.pokok,unit:"IDR"},{id:"saving-wajib",label:"Simpanan Wajib",value:r.savings.balance.wajib,unit:"IDR"},{id:"saving-sukarela",label:"Simpanan Sukarela",value:r.savings.balance.sukarela,unit:"IDR"},{id:"active-loans",label:"Pinjaman Aktif",value:(s=e==null?void 0:e.activeLoans)!=null?s:0},{id:"settlement-overdue",label:"Tunggakan Settlement",value:(d=t==null?void 0:t.totalOverdue)!=null?d:0,unit:"IDR"}],sections:[{id:"credit-summary",title:"Ringkasan Kredit",rows:[{key:"totalLoans",label:"Total Pinjaman",value:(c=e==null?void 0:e.totalLoans)!=null?c:0},{key:"activeLoans",label:"Pinjaman Aktif",value:(m=e==null?void 0:e.activeLoans)!=null?m:0},{key:"closedLoans",label:"Pinjaman Lunas",value:(p=e==null?void 0:e.closedLoans)!=null?p:0},{key:"defaultedLoans",label:"Pinjaman Macet",value:(u=e==null?void 0:e.defaultedLoans)!=null?u:0},{key:"totalPrincipalAmount",label:"Total Pokok Pinjaman",value:(h=e==null?void 0:e.totalPrincipalAmount)!=null?h:0,unit:"IDR"}]},{id:"settlement-summary",title:"Ringkasan Settlement",rows:[{key:"totalOutstanding",label:"Total Outstanding",value:(y=t==null?void 0:t.totalOutstanding)!=null?y:0,unit:"IDR"},{key:"totalOverdue",label:"Total Overdue",value:(I=t==null?void 0:t.totalOverdue)!=null?I:0,unit:"IDR"},{key:"settlementStatus",label:"Status Settlement",value:(v=t==null?void 0:t.settlementStatus)!=null?v:"clear"},{key:"notes",label:"Catatan",value:(R=t==null?void 0:t.notes)!=null?R:"-"}]},{id:"audit-summary",title:"Ringkasan Audit",rows:[{key:"auditCount",label:"Jumlah Event Audit",value:r.audit.length}]}],timeline:r.timeline}}function An(r){return[...r].sort((e,t)=>t.occurredAt.localeCompare(e.occurredAt))}async function Pn(r,e,t){for(let n of r){if(!n.provider.getCreditByMember)continue;let a=await n.provider.getCreditByMember(e,t);if(a)return a}return null}async function Mn(r,e,t){let n=await Promise.all(r.map(a=>{var i,o,s;return(s=(o=(i=a.provider).getAuditByMember)==null?void 0:o.call(i,e,t))!=null?s:Promise.resolve([])}));return An(n.flat()).slice(0,100)}async function kn(r,e,t){for(let n of r){if(!n.provider.getSettlementSummaryByMember)continue;let a=await n.provider.getSettlementSummaryByMember(e,t);if(a)return a}return null}function ks(r){return{async getCreditByMember(e,t){return Pn(r,e,t)},async getAuditByMember(e,t){return Mn(r,e,t)},async getSettlementSummaryByMember(e,t){return kn(r,e,t)}}}var _r=1440*60*1e3;function Vr(r){return r.slice(0,10)}function Nt(r){return Date.parse(`${r}T00:00:00.000Z`)}function Dn(r,e){let t=[];for(let n=Nt(r);n<=Nt(e);n+=_r)t.push(new Date(n).toISOString().slice(0,10));return t}function Gr(r,e){let t=Vr(r),n=Nt(t),a=n-(e-1)*_r;return{fromDate:new Date(a).toISOString().slice(0,10),toDate:new Date(n).toISOString().slice(0,10)}}function $r(r,e,t){let n=new Map;for(let a of Dn(e,t))n.set(a,{date:a,masuk:0,keluar:0,net:0});for(let a of r){let i=Vr(a.transactionDate),o=n.get(i);o&&(a.entryType==="credit"?(o.masuk+=a.amount,o.net+=a.amount):(o.keluar+=a.amount,o.net-=a.amount))}return Array.from(n.values())}function Tn(r){var t;let e=r.accessContext;if(!(!e||e.role!=="anggota")){if(!((t=e.actorMemberId)!=null&&t.trim()))throw l("anggota dashboard access denied: actorMemberId is required");if(e.actorMemberId!==r.memberId)throw l("anggota dashboard access denied: only self memberId is allowed")}}function xn(r){let e=r.accessContext;if(e&&e.role!=="pengawas")throw l("pengawas dashboard access denied: role must be pengawas")}function On(r){let e=r.accessContext;if(e&&e.role!=="pengurus")throw l("pengurus dashboard access denied: role must be pengurus")}async function En(r,e,t,n){let a=`${e}T00:00:00.000Z`,i=`${t}T23:59:59.999Z`,o=P(await r.memberService.listMembers({includeDeleted:!1,...n!=null&&n.tenantId?{tenantId:n.tenantId}:{},...n!=null&&n.branchId?{branchId:n.branchId}:{}}));return(await Promise.all(o.map(d=>r.savingLedgerService.listSavingEntriesByMember(d.id,{includeDeleted:!1,dateFrom:a,dateTo:i,...n!=null&&n.tenantId?{tenantId:n.tenantId}:{},...n!=null&&n.branchId?{branchId:n.branchId}:{}})))).map(d=>P(d)).flat()}async function Ln(r,e){var a;if((a=r.providers)!=null&&a.getRiskRegisterOverview)return r.providers.getRiskRegisterOverview(e);if(!r.riskRegisterService)return{open:0,mitigating:0,accepted:0,closed:0,escalated:0,overdueSla:0};let t=Date.now();return P(await r.riskRegisterService.listRiskItems({includeDeleted:!1,...e!=null&&e.tenantId?{tenantId:e.tenantId}:{},...e!=null&&e.branchId?{branchId:e.branchId}:{}})).reduce((i,o)=>{var s;return o.status==="open"&&(i.open+=1),o.status==="mitigating"&&(i.mitigating+=1),o.status==="accepted"&&(i.accepted+=1),o.status==="closed"&&(i.closed+=1),((s=o.escalationLevel)!=null?s:0)>0&&(i.escalated+=1),o.status!=="closed"&&o.slaDueAt&&Date.parse(o.slaDueAt)<t&&(i.overdueSla+=1),i},{open:0,mitigating:0,accepted:0,closed:0,escalated:0,overdueSla:0})}async function Bn(r,e){var a;if((a=r.providers)!=null&&a.getWhistleOverview)return r.providers.getWhistleOverview(e);if(!r.whistleReportService)return{submitted:0,inReview:0,resolved:0,dismissed:0,escalated:0,overdueSla:0};let t=Date.now();return P(await r.whistleReportService.listWhistleReports({includeDeleted:!1,...e!=null&&e.tenantId?{tenantId:e.tenantId}:{},...e!=null&&e.branchId?{branchId:e.branchId}:{}})).reduce((i,o)=>{var s;return o.status==="submitted"&&(i.submitted+=1),o.status==="in_review"&&(i.inReview+=1),o.status==="resolved"&&(i.resolved+=1),o.status==="dismissed"&&(i.dismissed+=1),((s=o.escalationLevel)!=null?s:0)>0&&(i.escalated+=1),o.status!=="resolved"&&o.status!=="dismissed"&&o.slaDueAt&&Date.parse(o.slaDueAt)<t&&(i.overdueSla+=1),i},{submitted:0,inReview:0,resolved:0,dismissed:0,escalated:0,overdueSla:0})}async function Os(r,e={}){var M,O,T,j,B,q,L,N,V,se,ve,de,Ie,Re,ce,Se,Ce,le,we,G,$,H,K,W,z,Y,Q,Z,me,ne,ue,ae,X,oe;On(e);let t=Math.max(1,Math.min(90,(M=e.rollingDays)!=null?M:30)),n=(O=e.referenceDate)!=null?O:new Date().toISOString(),{fromDate:a,toDate:i}=Gr(n,t),[o,s,d,c,m,p,u,h,y,I]=await Promise.all([En(r,a,i,e.scope),(B=(j=(T=r.providers)==null?void 0:T.getLoanStatusComposition)==null?void 0:j.call(T,e.scope))!=null?B:Promise.resolve({aktif:0,jatuhTempo:0,macet:0,lunas:0}),(N=(L=(q=r.providers)==null?void 0:q.getLoanAgingBuckets)==null?void 0:L.call(q,e.scope))!=null?N:Promise.resolve({d0to7:0,d8to30:0,d31to60:0,dOver60:0}),(ve=(se=(V=r.providers)==null?void 0:V.getOnboardingFunnel)==null?void 0:se.call(V,e.scope))!=null?ve:Promise.resolve({daftar:0,verifikasiPokok:0,aktif:0}),(Re=(Ie=(de=r.providers)==null?void 0:de.getWajibComplianceTrend)==null?void 0:Ie.call(de,e.scope))!=null?Re:Promise.resolve([]),(Ce=(Se=(ce=r.providers)==null?void 0:ce.getSavingTypeCompositionByPeriod)==null?void 0:Se.call(ce,e.scope))!=null?Ce:Promise.resolve([]),(G=(we=(le=r.providers)==null?void 0:le.getMemberGrowthTrend)==null?void 0:we.call(le,e.scope))!=null?G:Promise.resolve([]),(K=(H=($=r.providers)==null?void 0:$.getShuDistributionSummary)==null?void 0:H.call($,e.scope))!=null?K:Promise.resolve([]),(Y=(z=(W=r.providers)==null?void 0:W.getOperationalActivityHeatmap)==null?void 0:z.call(W,e.scope))!=null?Y:Promise.resolve([]),(me=(Z=(Q=r.providers)==null?void 0:Q.getLoanRiskMap)==null?void 0:Z.call(Q,e.scope))!=null?me:Promise.resolve([])]),v=(ae=await((ue=(ne=r.providers)==null?void 0:ne.getTotalOverdueAmount)==null?void 0:ue.call(ne,e.scope)))!=null?ae:0,R=$r(o,a,i),C=R.reduce((pe,E)=>pe+E.net,0),A=await r.memberService.listMembers({includeDeleted:!1,status:"active",...(X=e.scope)!=null&&X.tenantId?{tenantId:e.scope.tenantId}:{},...(oe=e.scope)!=null&&oe.branchId?{branchId:e.scope.branchId}:{}});return{kpi:{activeMembers:P(A).length,totalSavingNet:C,activeLoans:s.aktif,totalOverdueAmount:v},savingsCashflow30Days:R,loanStatusComposition:s,loanAgingBuckets:d,advanced:{onboardingFunnel:c,wajibComplianceTrend:m,savingTypeCompositionByPeriod:p,memberGrowthTrend:u,shuDistributionSummary:h,operationalActivityHeatmap:y,loanRiskMap:I}}}async function Es(r,e={}){var c,m,p,u,h,y,I,v,R,C,A,k,M,O,T;xn(e);let[t,n,a,i,o,s,d]=await Promise.all([(p=(m=(c=r.providers)==null?void 0:c.getLoanStatusComposition)==null?void 0:m.call(c,e.scope))!=null?p:Promise.resolve({aktif:0,jatuhTempo:0,macet:0,lunas:0}),(y=(h=(u=r.providers)==null?void 0:u.getLoanAgingBuckets)==null?void 0:h.call(u,e.scope))!=null?y:Promise.resolve({d0to7:0,d8to30:0,d31to60:0,dOver60:0}),(R=(v=(I=r.providers)==null?void 0:I.getTotalOverdueAmount)==null?void 0:v.call(I,e.scope))!=null?R:Promise.resolve(0),(k=(A=(C=r.providers)==null?void 0:C.getWajibComplianceTrend)==null?void 0:A.call(C,e.scope))!=null?k:Promise.resolve([]),(T=(O=(M=r.providers)==null?void 0:M.getMemberGrowthTrend)==null?void 0:O.call(M,e.scope))!=null?T:Promise.resolve([]),Ln(r,e.scope),Bn(r,e.scope)]);return{risk:{loanStatusComposition:t,loanAgingBuckets:n,totalOverdueAmount:a,riskRegister:s,whistle:d},trends:{wajibComplianceTrend:i,memberGrowthTrend:o}}}async function Ls(r,e){var v,R,C,A,k,M,O,T,j,B,q;Tn(e);let t=await r.memberService.getMemberById(e.memberId),n=P(t);if(!n||n.deleted)return null;let a=Math.max(1,Math.min(90,(v=e.rollingDays)!=null?v:30)),i=(R=e.referenceDate)!=null?R:new Date().toISOString(),{fromDate:o,toDate:s}=Gr(i,a),d=`${o}T00:00:00.000Z`,c=`${s}T23:59:59.999Z`,[m,p,u,h]=await Promise.all([r.savingLedgerService.getSavingBalanceByMember(e.memberId),r.savingLedgerService.listSavingEntriesByMember(e.memberId,{includeDeleted:!1,dateFrom:d,dateTo:c,...(C=e.scope)!=null&&C.tenantId?{tenantId:e.scope.tenantId}:{},...(A=e.scope)!=null&&A.branchId?{branchId:e.scope.branchId}:{}}),(O=(M=(k=r.providers)==null?void 0:k.getAnggotaCreditSummary)==null?void 0:M.call(k,e.memberId,e.scope))!=null?O:Promise.resolve({activeLoans:0,outstandingPrincipalAmount:0,totalOverdueAmount:0,nextDueDate:null}),(B=(j=(T=r.providers)==null?void 0:T.getAnggotaComplianceStatus)==null?void 0:j.call(T,e.memberId,e.scope))!=null?B:Promise.resolve({status:"unknown",monthsInArrears:0})]),y=P(m),I=P(p);return{memberId:e.memberId,kpi:{totalSavingBalance:y.total,activeLoans:u.activeLoans,outstandingPrincipalAmount:u.outstandingPrincipalAmount,totalOverdueAmount:u.totalOverdueAmount},savingsCashflow30Days:$r(I,o,s),compliance:h,nextDueDate:(q=u.nextDueDate)!=null?q:null}}function js(r){return{role:"pengurus",kpiCards:[{id:"active-members",label:"Anggota Aktif",value:r.kpi.activeMembers},{id:"total-saving-net",label:"Net Simpanan",value:r.kpi.totalSavingNet,unit:"IDR"},{id:"active-loans",label:"Pinjaman Aktif",value:r.kpi.activeLoans},{id:"total-overdue",label:"Total Tunggakan",value:r.kpi.totalOverdueAmount,unit:"IDR"}],charts:[{id:"savings-cashflow-30-days",title:"Arus Kas Simpanan 30 Hari",chartType:"area",series:[{key:"masuk",label:"Masuk",points:r.savingsCashflow30Days.map(e=>({x:e.date,y:e.masuk}))},{key:"keluar",label:"Keluar",points:r.savingsCashflow30Days.map(e=>({x:e.date,y:e.keluar}))},{key:"net",label:"Net",points:r.savingsCashflow30Days.map(e=>({x:e.date,y:e.net}))}]},{id:"loan-status-composition",title:"Komposisi Status Pinjaman",chartType:"donut",series:[{key:"loan-status",label:"Status Pinjaman",points:[{x:"aktif",y:r.loanStatusComposition.aktif},{x:"jatuh_tempo",y:r.loanStatusComposition.jatuhTempo},{x:"macet",y:r.loanStatusComposition.macet},{x:"lunas",y:r.loanStatusComposition.lunas}]}]},{id:"loan-aging-buckets",title:"Aging Jatuh Tempo Pinjaman",chartType:"bar",series:[{key:"aging",label:"Jumlah Pinjaman",points:[{x:"0-7",y:r.loanAgingBuckets.d0to7},{x:"8-30",y:r.loanAgingBuckets.d8to30},{x:"31-60",y:r.loanAgingBuckets.d31to60},{x:">60",y:r.loanAgingBuckets.dOver60}]}]}]}}function Ns(r){return{role:"pengawas",kpiCards:[{id:"total-overdue",label:"Total Tunggakan",value:r.risk.totalOverdueAmount,unit:"IDR"},{id:"risk-open",label:"Risk Open",value:r.risk.riskRegister.open},{id:"risk-overdue-sla",label:"Risk Overdue SLA",value:r.risk.riskRegister.overdueSla},{id:"whistle-in-review",label:"Whistle In Review",value:r.risk.whistle.inReview},{id:"whistle-overdue-sla",label:"Whistle Overdue SLA",value:r.risk.whistle.overdueSla}],charts:[{id:"loan-status-composition",title:"Komposisi Status Pinjaman",chartType:"donut",series:[{key:"loan-status",label:"Status Pinjaman",points:[{x:"aktif",y:r.risk.loanStatusComposition.aktif},{x:"jatuh_tempo",y:r.risk.loanStatusComposition.jatuhTempo},{x:"macet",y:r.risk.loanStatusComposition.macet},{x:"lunas",y:r.risk.loanStatusComposition.lunas}]}]},{id:"loan-aging-buckets",title:"Aging Jatuh Tempo Pinjaman",chartType:"bar",series:[{key:"aging",label:"Jumlah Pinjaman",points:[{x:"0-7",y:r.risk.loanAgingBuckets.d0to7},{x:"8-30",y:r.risk.loanAgingBuckets.d8to30},{x:"31-60",y:r.risk.loanAgingBuckets.d31to60},{x:">60",y:r.risk.loanAgingBuckets.dOver60}]}]},{id:"wajib-compliance-trend",title:"Tren Kepatuhan Simpanan Wajib",chartType:"line",series:[{key:"patuh",label:"Patuh",points:r.trends.wajibComplianceTrend.map(e=>({x:e.month,y:e.patuh}))},{key:"menunggak",label:"Menunggak",points:r.trends.wajibComplianceTrend.map(e=>({x:e.month,y:e.menunggak}))}]},{id:"member-growth-trend",title:"Pertumbuhan Anggota",chartType:"line",series:[{key:"active",label:"Aktif",points:r.trends.memberGrowthTrend.map(e=>({x:e.month,y:e.active}))},{key:"non-active",label:"Non-Aktif",points:r.trends.memberGrowthTrend.map(e=>({x:e.month,y:e.nonActive}))}]},{id:"risk-register-status",title:"Status Risk Register",chartType:"bar",series:[{key:"risk-register",label:"Risk Register",points:[{x:"open",y:r.risk.riskRegister.open},{x:"mitigating",y:r.risk.riskRegister.mitigating},{x:"accepted",y:r.risk.riskRegister.accepted},{x:"closed",y:r.risk.riskRegister.closed},{x:"escalated",y:r.risk.riskRegister.escalated},{x:"overdue_sla",y:r.risk.riskRegister.overdueSla}]}]},{id:"whistle-status",title:"Status Whistle Report",chartType:"bar",series:[{key:"whistle",label:"Whistle Report",points:[{x:"submitted",y:r.risk.whistle.submitted},{x:"in_review",y:r.risk.whistle.inReview},{x:"resolved",y:r.risk.whistle.resolved},{x:"dismissed",y:r.risk.whistle.dismissed},{x:"escalated",y:r.risk.whistle.escalated},{x:"overdue_sla",y:r.risk.whistle.overdueSla}]}]}]}}function qs(r){var e;return{role:"anggota",memberId:r.memberId,kpiCards:[{id:"total-saving-balance",label:"Saldo Simpanan",value:r.kpi.totalSavingBalance,unit:"IDR"},{id:"active-loans",label:"Pinjaman Aktif",value:r.kpi.activeLoans},{id:"outstanding-principal",label:"Outstanding Pokok",value:r.kpi.outstandingPrincipalAmount,unit:"IDR"},{id:"total-overdue",label:"Total Tunggakan",value:r.kpi.totalOverdueAmount,unit:"IDR"}],charts:[{id:"personal-savings-cashflow-30-days",title:"Arus Kas Simpanan Pribadi 30 Hari",chartType:"area",series:[{key:"masuk",label:"Masuk",points:r.savingsCashflow30Days.map(t=>({x:t.date,y:t.masuk}))},{key:"keluar",label:"Keluar",points:r.savingsCashflow30Days.map(t=>({x:t.date,y:t.keluar}))},{key:"net",label:"Net",points:r.savingsCashflow30Days.map(t=>({x:t.date,y:t.net}))}]}],compliance:r.compliance,nextDueDate:(e=r.nextDueDate)!=null?e:null}}var jn={loanCount:0,activeLoanCount:0,closedLoanCount:0,defaultedLoanCount:0,outstandingPrincipalAmount:0,totalOverdueAmount:0},Nn={allocationCount:0,totalAllocatedAmount:0},qn={trialBalance:{totalDebit:0,totalCredit:0,isBalanced:!0},incomeStatement:{revenue:0,expense:0,netIncome:0},balanceSheet:{assets:0,liabilities:0,equity:0},cashflow:{operatingInflow:0,operatingOutflow:0,netOperatingCashflow:0}};function Wn(r){let e=r.from.slice(0,10),t=r.to.slice(0,10);return{fromIso:`${e}T00:00:00.000Z`,toIso:`${t}T23:59:59.999Z`}}function Fn(r){let e=0,t=0,n=0,a=0,i=0;for(let o of r){let s=o.entryType==="credit"?1:-1;o.entryType==="credit"?e+=o.amount:t+=o.amount,o.savingType==="pokok"&&(n+=s*o.amount),o.savingType==="wajib"&&(a+=s*o.amount),o.savingType==="sukarela"&&(i+=s*o.amount)}return{creditTotal:e,debitTotal:t,netTotal:e-t,byType:{pokok:n,wajib:a,sukarela:i}}}function Un(r){return["section,key,value",`period,from,${r.period.from}`,`period,to,${r.period.to}`,`members,total,${r.members.total}`,`members,active,${r.members.active}`,`members,inactive,${r.members.inactive}`,`members,exited,${r.members.exited}`,`savings,creditTotal,${r.savings.creditTotal}`,`savings,debitTotal,${r.savings.debitTotal}`,`savings,netTotal,${r.savings.netTotal}`,`savings,pokokNet,${r.savings.byType.pokok}`,`savings,wajibNet,${r.savings.byType.wajib}`,`savings,sukarelaNet,${r.savings.byType.sukarela}`,`credit,loanCount,${r.credit.loanCount}`,`credit,activeLoanCount,${r.credit.activeLoanCount}`,`credit,closedLoanCount,${r.credit.closedLoanCount}`,`credit,defaultedLoanCount,${r.credit.defaultedLoanCount}`,`credit,outstandingPrincipalAmount,${r.credit.outstandingPrincipalAmount}`,`credit,totalOverdueAmount,${r.credit.totalOverdueAmount}`,`shu,allocationCount,${r.shu.allocationCount}`,`shu,totalAllocatedAmount,${r.shu.totalAllocatedAmount}`,`accounting,trialBalanceTotalDebit,${r.accounting.trialBalance.totalDebit}`,`accounting,trialBalanceTotalCredit,${r.accounting.trialBalance.totalCredit}`,`accounting,trialBalanceBalanced,${r.accounting.trialBalance.isBalanced}`,`accounting,incomeRevenue,${r.accounting.incomeStatement.revenue}`,`accounting,incomeExpense,${r.accounting.incomeStatement.expense}`,`accounting,incomeNet,${r.accounting.incomeStatement.netIncome}`,`accounting,balanceAssets,${r.accounting.balanceSheet.assets}`,`accounting,balanceLiabilities,${r.accounting.balanceSheet.liabilities}`,`accounting,balanceEquity,${r.accounting.balanceSheet.equity}`,`accounting,cashflowOperatingIn,${r.accounting.cashflow.operatingInflow}`,`accounting,cashflowOperatingOut,${r.accounting.cashflow.operatingOutflow}`,`accounting,cashflowOperatingNet,${r.accounting.cashflow.netOperatingCashflow}`,`crossDomain,memberActivationRate,${r.crossDomain.memberActivationRate}`,`crossDomain,creditPenetrationRate,${r.crossDomain.creditPenetrationRate}`,`crossDomain,overdueToOutstandingRatio,${r.crossDomain.overdueToOutstandingRatio}`,`crossDomain,savingsPerActiveMember,${r.crossDomain.savingsPerActiveMember}`,`crossDomain,shuPerActiveMember,${r.crossDomain.shuPerActiveMember}`]}function qt(r,e){return e<=0?0:Number((r/e).toFixed(4))}async function Hr(r,e){var R,C,A,k,M,O,T,j,B,q;let t=(R=e.scope)!=null?R:{},{fromIso:n,toIso:a}=Wn(e.period),i=await r.memberService.listMembers({includeDeleted:!1,...t.tenantId?{tenantId:t.tenantId}:{},...t.branchId?{branchId:t.branchId}:{}}),o=P(i),c=(await Promise.all(o.map(L=>r.savingLedgerService.listSavingEntriesByMember(L.id,{includeDeleted:!1,dateFrom:n,dateTo:a,...t.tenantId?{tenantId:t.tenantId}:{},...t.branchId?{branchId:t.branchId}:{}})))).map(L=>P(L)).flat(),m=Fn(c),p=(k=await((A=(C=r.providers)==null?void 0:C.getCreditSummary)==null?void 0:A.call(C,e.period,t)))!=null?k:jn,u=(T=await((O=(M=r.providers)==null?void 0:M.getShuSummary)==null?void 0:O.call(M,e.period,t)))!=null?T:Nn,h=(q=await((B=(j=r.providers)==null?void 0:j.getAccountingSummary)==null?void 0:B.call(j,e.period,t)))!=null?q:qn,y=o.filter(L=>L.status==="active").length,I=o.length,v={memberActivationRate:qt(y,I),creditPenetrationRate:qt(p.activeLoanCount,y),overdueToOutstandingRatio:qt(p.totalOverdueAmount,p.outstandingPrincipalAmount),savingsPerActiveMember:y>0?Math.round(m.netTotal/y):0,shuPerActiveMember:y>0?Math.round(u.totalAllocatedAmount/y):0};return{period:e.period,scope:t,members:{total:I,active:y,inactive:o.filter(L=>L.status==="inactive").length,exited:o.filter(L=>L.status==="exited").length},savings:m,credit:p,shu:u,accounting:h,crossDomain:v}}async function Us(r,e){let t=await Hr(r,e),n=Un(t).join(`
|
|
7
|
-
`);return{filename:`report-summary-${t.period.from.slice(0,10)}-${t.period.to.slice(0,10)}.csv`,contentType:"text/csv",body:n}}async function _s(r,e){let t=await Hr(r,e),n={schemaVersion:"1",generatedAt:new Date().toISOString(),summary:t};return{filename:`report-summary-${t.period.from.slice(0,10)}-${t.period.to.slice(0,10)}.json`,contentType:"application/json",body:JSON.stringify(n),data:n}}function _n(r,e,t,n){return r<=n&&e>=t}function Vn(r){let e=r.totalDistributableShuIdr;return typeof e=="number"&&Number.isFinite(e)&&e>0?e:0}async function $s(r,e){var d;let t=(d=e.scope)!=null?d:{},n=await r.shuService.listShuPeriods({includeDeleted:!1,...t.tenantId?{tenantId:t.tenantId}:{},...t.branchId?{branchId:t.branchId}:{}}),i=P(n).filter(c=>_n(c.startDate.slice(0,10),c.endDate.slice(0,10),e.period.from.slice(0,10),e.period.to.slice(0,10))),o=[];for(let c of i){let m=await r.shuService.listShuAllocations(c.id,{includeDeleted:!1}),u=P(m).reduce((y,I)=>y+I.allocationAmount,0),h=Vn(c.formulaSnapshot);o.push({shuPeriodId:c.id,periodCode:c.periodCode,startDate:c.startDate,endDate:c.endDate,status:c.status,distributableShuIdr:h,allocatedShuIdr:u,undistributedShuIdr:h-u})}let s=o.reduce((c,m)=>(c.totalDistributableShuIdr+=m.distributableShuIdr,c.totalAllocatedShuIdr+=m.allocatedShuIdr,c.totalUndistributedShuIdr+=m.undistributedShuIdr,c),{totalDistributableShuIdr:0,totalAllocatedShuIdr:0,totalUndistributedShuIdr:0});return{period:e.period,scope:t,periodCount:o.length,...s,rows:o.sort((c,m)=>c.startDate.localeCompare(m.startDate))}}function Qs(r){return{period:r.period,scope:r.scope,kpiCards:[{id:"members-total",label:"Total Anggota",value:r.members.total},{id:"members-active",label:"Anggota Aktif",value:r.members.active},{id:"savings-net",label:"Net Simpanan",value:r.savings.netTotal,unit:"IDR"},{id:"credit-overdue",label:"Total Tunggakan",value:r.credit.totalOverdueAmount,unit:"IDR"},{id:"shu-total",label:"Total SHU Alokasi",value:r.shu.totalAllocatedAmount,unit:"IDR"},{id:"net-income",label:"Laba Bersih",value:r.accounting.incomeStatement.netIncome,unit:"IDR"}],tableSections:[{id:"members",title:"Ringkasan Anggota",rows:[{key:"total",label:"Total",value:r.members.total},{key:"active",label:"Aktif",value:r.members.active},{key:"inactive",label:"Non-Aktif",value:r.members.inactive},{key:"exited",label:"Keluar",value:r.members.exited}]},{id:"savings",title:"Ringkasan Simpanan",rows:[{key:"creditTotal",label:"Total Masuk",value:r.savings.creditTotal,unit:"IDR"},{key:"debitTotal",label:"Total Keluar",value:r.savings.debitTotal,unit:"IDR"},{key:"netTotal",label:"Total Net",value:r.savings.netTotal,unit:"IDR"},{key:"pokokNet",label:"Net Pokok",value:r.savings.byType.pokok,unit:"IDR"},{key:"wajibNet",label:"Net Wajib",value:r.savings.byType.wajib,unit:"IDR"},{key:"sukarelaNet",label:"Net Sukarela",value:r.savings.byType.sukarela,unit:"IDR"}]},{id:"credit",title:"Ringkasan Kredit",rows:[{key:"loanCount",label:"Total Pinjaman",value:r.credit.loanCount},{key:"activeLoanCount",label:"Pinjaman Aktif",value:r.credit.activeLoanCount},{key:"closedLoanCount",label:"Pinjaman Lunas",value:r.credit.closedLoanCount},{key:"defaultedLoanCount",label:"Pinjaman Macet",value:r.credit.defaultedLoanCount},{key:"outstandingPrincipalAmount",label:"Outstanding Pokok",value:r.credit.outstandingPrincipalAmount,unit:"IDR"},{key:"totalOverdueAmount",label:"Total Tunggakan",value:r.credit.totalOverdueAmount,unit:"IDR"}]},{id:"shu",title:"Ringkasan SHU",rows:[{key:"allocationCount",label:"Jumlah Alokasi",value:r.shu.allocationCount},{key:"totalAllocatedAmount",label:"Total Alokasi",value:r.shu.totalAllocatedAmount,unit:"IDR"}]},{id:"accounting",title:"Ringkasan Akuntansi",rows:[{key:"trialBalanceTotalDebit",label:"Trial Balance Total Debit",value:r.accounting.trialBalance.totalDebit,unit:"IDR"},{key:"trialBalanceTotalCredit",label:"Trial Balance Total Credit",value:r.accounting.trialBalance.totalCredit,unit:"IDR"},{key:"trialBalanceBalanced",label:"Trial Balance Seimbang",value:r.accounting.trialBalance.isBalanced?"ya":"tidak"},{key:"incomeRevenue",label:"Pendapatan",value:r.accounting.incomeStatement.revenue,unit:"IDR"},{key:"incomeExpense",label:"Beban",value:r.accounting.incomeStatement.expense,unit:"IDR"},{key:"incomeNet",label:"Laba Bersih",value:r.accounting.incomeStatement.netIncome,unit:"IDR"},{key:"balanceAssets",label:"Aset",value:r.accounting.balanceSheet.assets,unit:"IDR"},{key:"balanceLiabilities",label:"Liabilitas",value:r.accounting.balanceSheet.liabilities,unit:"IDR"},{key:"balanceEquity",label:"Ekuitas",value:r.accounting.balanceSheet.equity,unit:"IDR"},{key:"cashflowOperatingIn",label:"Kas Operasional Masuk",value:r.accounting.cashflow.operatingInflow,unit:"IDR"},{key:"cashflowOperatingOut",label:"Kas Operasional Keluar",value:r.accounting.cashflow.operatingOutflow,unit:"IDR"},{key:"cashflowOperatingNet",label:"Kas Operasional Bersih",value:r.accounting.cashflow.netOperatingCashflow,unit:"IDR"}]},{id:"cross-domain",title:"Metrik Lintas Domain",rows:[{key:"memberActivationRate",label:"Activation Rate Anggota",value:r.crossDomain.memberActivationRate},{key:"creditPenetrationRate",label:"Credit Penetration Rate",value:r.crossDomain.creditPenetrationRate},{key:"overdueToOutstandingRatio",label:"Overdue/Outstanding Ratio",value:r.crossDomain.overdueToOutstandingRatio},{key:"savingsPerActiveMember",label:"Simpanan per Anggota Aktif",value:r.crossDomain.savingsPerActiveMember,unit:"IDR"},{key:"shuPerActiveMember",label:"SHU per Anggota Aktif",value:r.crossDomain.shuPerActiveMember,unit:"IDR"}]}]}}function Gn(r){let e={...r};return e.limit==null&&(e.limit=100),e.limit<1&&(e.limit=1),e.limit>1e3&&(e.limit=1e3),e}function $n(r){return!r||r.length===0?null:new Set(r)}function Hn(r,e){var n;if(!e||!((n=r.eventTypes)!=null&&n.length))return;let t=r.eventTypes.filter(a=>!e.has(a));if(t.length>0)throw l(`audit trail query contains unknown eventTypes: ${t.join(", ")}`)}function Qn(r){var n;let e=Gn(r),t=e.accessContext;if(!t||t.role!=="anggota")return e;if(!((n=t.actorMemberId)!=null&&n.trim()))throw l("audit trail access denied: anggota context requires actorMemberId");if(e.memberId&&e.memberId!==t.actorMemberId)throw l("audit trail access denied: anggota can only query own memberId");return{...e,memberId:t.actorMemberId}}function Kn(r,e){var t;return r.filter(n=>e.memberId?n.memberId===e.memberId:!0).filter(n=>{var a;return(a=e.scope)!=null&&a.tenantId?n.tenantId===e.scope.tenantId:!0}).filter(n=>{var a;return(a=e.scope)!=null&&a.branchId?n.branchId===e.scope.branchId:!0}).filter(n=>{var a;return(a=e.eventTypes)!=null&&a.length?e.eventTypes.includes(n.eventType):!0}).filter(n=>e.fromTimestamp?n.occurredAt>=e.fromTimestamp:!0).filter(n=>e.toTimestamp?n.occurredAt<=e.toTimestamp:!0).sort((n,a)=>a.occurredAt.localeCompare(n.occurredAt)).slice(0,(t=e.limit)!=null?t:100)}async function zs(r,e={}){let t=$n(r.eventCatalog),n=Qn(e);Hn(n,t);let a=await r.providers.listEvents(n),i=t?a.filter(o=>t.has(o.eventType)):a;return Kn(i,n)}function Jn(r){return[...new Set(r)]}function Zs(r){return{eventCatalog:Jn(r.flatMap(t=>{var n;return(n=t.eventCatalog)!=null?n:[]})),auditTrailProvider:{async listEvents(t){return(await Promise.all(r.map(a=>a.provider.listEvents(t)))).flat().sort((a,i)=>i.occurredAt.localeCompare(a.occurredAt)).slice(0,t.limit&&t.limit>0?t.limit:100)}}}}var ot=["LOGIN_SUCCESS","LOGIN_FAILED","LOCKOUT_TRIGGERED","SESSION_REVOKED","CONTEXT_SWITCHED","STEP_UP_CHALLENGED","STEP_UP_PASSED","STEP_UP_FAILED"];function zn(r){return ot.includes(r)}function Yn(r){var e;return{eventId:r.eventId,eventType:r.eventType,occurredAt:r.timestamp,message:(e=r.reasonCode)!=null?e:r.result}}function Zn(r,e){var t,n,a;return{eventId:r.eventId,sourceDomain:"ofauth",eventType:r.eventType,occurredAt:r.timestamp,memberId:e!=null?e:void 0,tenantId:(t=r.scopeRef)==null?void 0:t.tenantId,branchId:(n=r.scopeRef)==null?void 0:n.branchId,summary:(a=r.reasonCode)!=null?a:r.result}}function ed(r,e){return{member360:{async getAuditByMember(a){let i=await e.resolveIdentityIdsByMemberId(a);return i.length===0?[]:(await Promise.all(i.map(s=>r.queryEvents({identityId:s})))).flat().sort((s,d)=>d.timestamp.localeCompare(s.timestamp)).slice(0,100).map(Yn)}},auditTrailProvider:{async listEvents(a){var m;let i=[];if(a.memberId&&(i=await e.resolveIdentityIdsByMemberId(a.memberId),i.length===0))return[];let o=((m=a.eventTypes)!=null?m:[]).filter(zn),s={...a.fromTimestamp?{fromTimestamp:a.fromTimestamp}:{},...a.toTimestamp?{toTimestamp:a.toTimestamp}:{},...o.length>0?{eventTypes:o}:{}},d=i.length>0?await Promise.all(i.map(p=>r.queryEvents({...s,identityId:p}))):[await r.queryEvents(s)];return await Promise.all(d.flat().map(async p=>{var u,h;return Zn(p,p.identityId&&(h=await((u=e.resolveMemberIdByIdentityId)==null?void 0:u.call(e,p.identityId)))!=null?h:null)}))}},eventCatalog:[...ot]}}var st=["member.created","member.updated","saving.entry-recorded","saving.policy-upserted","shu.config-upserted","shu.period-created","shu.period-finalized","shu.allocations-generated"],dt=["loan.created","loan.closed","installment.schedule-generated","installment.payment-recorded","credit-policy.created","credit-policy.updated"];function Xn(r){return st.includes(r)}function ea(r){return dt.includes(r)}function ta(r){return{eventId:r.eventId,eventType:r.name,occurredAt:r.occurredAt,message:r.entityId?`entity:${r.entityId}`:r.name}}function ra(r){var t;let e=(t=r.payload)==null?void 0:t.memberId;return typeof e=="string"&&e.trim()?e:null}function Qr(r,e,t){var n,a,i,o;return{eventId:r.eventId,sourceDomain:e,eventType:r.name,occurredAt:r.occurredAt,memberId:(a=(n=ra(r))!=null?n:t)!=null?a:void 0,tenantId:(i=r.tenantId)!=null?i:void 0,branchId:(o=r.branchId)!=null?o:void 0,summary:r.entityId?`entity:${r.entityId}`:r.name}}function Kr(r){return[...r].sort((e,t)=>t.occurredAt.localeCompare(e.occurredAt))}var na=[...st,...dt];function rd(r){return{member360:{async getAuditByMember(n,a){var s,d,c,m;let[i,o]=await Promise.all([(d=(s=r.ofcoop)==null?void 0:s.queryEvents({memberId:n,...a!=null&&a.tenantId?{tenantId:a.tenantId}:{},...a!=null&&a.branchId?{branchId:a.branchId}:{},limit:100}))!=null?d:Promise.resolve([]),(m=(c=r.ofcoopCredit)==null?void 0:c.queryEvents({memberId:n,...a!=null&&a.tenantId?{tenantId:a.tenantId}:{},...a!=null&&a.branchId?{branchId:a.branchId}:{},limit:100}))!=null?m:Promise.resolve([])]);return Kr([...i,...o]).slice(0,100).map(ta)}},auditTrailProvider:{async listEvents(n){var m,p,u,h,y,I,v,R,C;let a=(m=n.eventTypes)!=null?m:[],i=a.length>0?a.filter(Xn):void 0,o=a.length>0?a.filter(ea):void 0,[s,d]=await Promise.all([(y=(h=r.ofcoop)==null?void 0:h.queryEvents({...n.memberId?{memberId:n.memberId}:{},...n.fromTimestamp?{fromTimestamp:n.fromTimestamp}:{},...n.toTimestamp?{toTimestamp:n.toTimestamp}:{},...(p=n.scope)!=null&&p.tenantId?{tenantId:n.scope.tenantId}:{},...(u=n.scope)!=null&&u.branchId?{branchId:n.scope.branchId}:{},...i?{eventNames:i}:{},...n.limit?{limit:n.limit}:{}}))!=null?y:Promise.resolve([]),(C=(R=r.ofcoopCredit)==null?void 0:R.queryEvents({...n.memberId?{memberId:n.memberId}:{},...n.fromTimestamp?{fromTimestamp:n.fromTimestamp}:{},...n.toTimestamp?{toTimestamp:n.toTimestamp}:{},...(I=n.scope)!=null&&I.tenantId?{tenantId:n.scope.tenantId}:{},...(v=n.scope)!=null&&v.branchId?{branchId:n.scope.branchId}:{},...o?{eventNames:o}:{},...n.limit?{limit:n.limit}:{}}))!=null?C:Promise.resolve([])]),c=[...s.map(A=>Qr(A,"ofcoop",n.memberId)),...d.map(A=>Qr(A,"ofcoop-credit",n.memberId))];return Kr(c)}},eventCatalog:[...na]}}function Jr(r){return[...new Set(r)]}function aa(r){return r.startsWith("ofcoop.")?"ofcoop":r.startsWith("ofcoop-credit.")?"ofcoop-credit":r.startsWith("ofauth.")?"ofauth":"external"}function ia(r){return r.startsWith("ofcoop.")?r.slice(7):r.startsWith("ofcoop-credit.")?r.slice(14):r.startsWith("ofauth.")?r.slice(7).toUpperCase():r}function oa(r){if(!r||r.length===0)return;let e=r.flatMap(t=>[`ofcoop.${t}`,`ofcoop-credit.${t}`,`ofauth.${t.toLowerCase()}`]);return Jr(e)}function od(r,e={}){var n;return{eventCatalog:Jr((n=e.eventCatalog)!=null?n:[...st,...dt,...ot]),auditTrailProvider:{async listEvents(a){var o,s;return(await r.listActivityRecords({fromTimestamp:a.fromTimestamp,toTimestamp:a.toTimestamp,tenantId:(o=a.scope)==null?void 0:o.tenantId,branchId:(s=a.scope)==null?void 0:s.branchId,limit:a.limit,activityTypes:oa(a.eventTypes)})).map(d=>{var p,u,h,y,I;let c=typeof((p=d.payload)==null?void 0:p.memberId)=="string"?d.payload.memberId:null,m=aa(d.activityType);return{eventId:d.activityId,sourceDomain:m,eventType:ia(d.activityType),occurredAt:d.occurredAt,memberId:(u=c!=null?c:a.memberId)!=null?u:void 0,tenantId:(h=d.scopeRef)==null?void 0:h.tenantId,branchId:(y=d.scopeRef)==null?void 0:y.branchId,summary:typeof((I=d.payload)==null?void 0:I.entityId)=="string"&&d.payload.entityId?`entity:${d.payload.entityId}`:d.activityType}}).sort((d,c)=>c.occurredAt.localeCompare(d.occurredAt))}}}}import{unwrap as sa}from"ofcore";function ie(r){return r&&typeof r=="object"&&("data"in r||"error"in r)?sa(r):r}function he(r){return r.slice(0,10)}function da(r,e){let t=new Date(`${r}T00:00:00.000Z`);return t.setUTCDate(t.getUTCDate()+e),t.toISOString().slice(0,10)}function ca(r){let e={aktif:0,jatuhTempo:0,macet:0,lunas:0};for(let t of r){if(t.status==="defaulted"){e.macet+=1;continue}if(t.status==="closed"){e.lunas+=1;continue}t.overdueInstallmentCount>0?e.jatuhTempo+=1:e.aktif+=1}return e}function la(r,e){let t={d0to7:0,d8to30:0,d31to60:0,dOver60:0},n=Date.parse(`${e}T00:00:00.000Z`);for(let a of r){let i=Date.parse(`${he(a.dueDate)}T00:00:00.000Z`),o=Math.max(0,Math.floor((n-i)/(1440*60*1e3)));o<=7?t.d0to7+=1:o<=30?t.d8to30+=1:o<=60?t.d31to60+=1:t.dOver60+=1}return t}function fe(r){return r!=null&&r.tenantId?{tenantId:r.tenantId,...r.branchId?{branchId:r.branchId}:{}}:null}function cd(r){return{member360:{async getCreditByMember(a,i){let o=ie(await r.loanService.listLoansByMember(a,{includeDeleted:!1,...i!=null&&i.tenantId?{tenantId:i.tenantId}:{},...i!=null&&i.branchId?{branchId:i.branchId}:{}})),s={totalLoans:o.length,activeLoans:o.filter(c=>c.status==="active").length,closedLoans:o.filter(c=>c.status==="closed").length,defaultedLoans:o.filter(c=>c.status==="defaulted").length,totalPrincipalAmount:o.reduce((c,m)=>c+m.principalAmount,0)},d=[...o].sort((c,m)=>m.startDate.localeCompare(c.startDate)).slice(0,5).map(c=>({loanId:c.id,status:c.status,principalAmount:c.principalAmount,startDate:c.startDate}));return{summary:s,recentLoans:d}},async getSettlementSummaryByMember(a,i){let o=fe(i);if(!o)return{totalOutstanding:0,totalOverdue:0,settlementStatus:"clear",notes:"tenantId missing in scope"};let s=ie(await r.loanBoardService.listLoanBoard(o,{memberId:a})),d=s.reduce((m,p)=>m+p.outstandingAmount,0),c=s.filter(m=>m.overdueInstallmentCount>0).reduce((m,p)=>m+p.outstandingAmount,0);return{totalOutstanding:d,totalOverdue:c,settlementStatus:c>0?"overdue":d>0?"pending":"clear"}}},dashboard:{async getLoanStatusComposition(a){let i=fe(a);if(!i)return{aktif:0,jatuhTempo:0,macet:0,lunas:0};let o=ie(await r.loanBoardService.listLoanBoard(i));return ca(o)},async getLoanAgingBuckets(a){let i=fe(a);if(!i)return{d0to7:0,d8to30:0,d31to60:0,dOver60:0};let o=he(new Date().toISOString()),s=da(o,-60),d=ie(await r.loanDueWindowService.listLoansDueInWindow(i,{dateFrom:"1970-01-01T00:00:00.000Z",dateTo:`${o}T23:59:59.999Z`})),c=d.filter(u=>u.installmentStatus==="overdue"&&he(u.dueDate)>=s),m=d.filter(u=>u.installmentStatus==="overdue"&&he(u.dueDate)<s),p=la(c,o);return p.dOver60+=m.length,p},async getTotalOverdueAmount(a){let i=fe(a);return i?ie(await r.loanDueWindowService.listLoansDueInWindow(i,{dateFrom:"1970-01-01T00:00:00.000Z",dateTo:`${new Date().toISOString().slice(0,10)}T23:59:59.999Z`})).filter(s=>s.installmentStatus==="overdue").reduce((s,d)=>s+d.outstandingAmount,0):0},async getAnggotaCreditSummary(a,i){var u;let o=fe(i);if(!o)return{activeLoans:0,outstandingPrincipalAmount:0,totalOverdueAmount:0,nextDueDate:null};let s=ie(await r.loanBoardService.listLoanBoard(o,{memberId:a})),d=s.filter(h=>h.status==="active").length,c=s.reduce((h,y)=>h+y.outstandingAmount,0),m=s.filter(h=>h.overdueInstallmentCount>0).reduce((h,y)=>h+y.outstandingAmount,0),p=(u=[...s].map(h=>h.nextDueDate).filter(Boolean).sort((h,y)=>String(h).localeCompare(String(y)))[0])!=null?u:null;return{activeLoans:d,outstandingPrincipalAmount:c,totalOverdueAmount:m,nextDueDate:p}},async getLoanRiskMap(a){var p;let i=fe(a);if(!i)return[];let o=he(new Date().toISOString()),s=ie(await r.loanBoardService.listLoanBoard(i)),d=ie(await r.loanDueWindowService.listLoansDueInWindow(i,{dateFrom:"1970-01-01T00:00:00.000Z",dateTo:`${o}T23:59:59.999Z`})),c=new Map,m=Date.parse(`${o}T00:00:00.000Z`);for(let u of d){if(u.installmentStatus!=="overdue")continue;let h=Date.parse(`${he(u.dueDate)}T00:00:00.000Z`),y=Math.max(0,Math.floor((m-h)/(1440*60*1e3))),I=(p=c.get(u.loanId))!=null?p:0;y>I&&c.set(u.loanId,y)}return s.map(u=>{var I;let h=(I=c.get(u.loanId))!=null?I:0,y=h>60||u.outstandingAmount>=5e6?"high":h>30||u.outstandingAmount>=1e6?"medium":"low";return{loanId:u.loanId,memberId:u.memberId,outstandingAmount:u.outstandingAmount,overdueAgeDays:h,riskLevel:y}})}},report:{async getCreditSummary(a,i){let o=fe(i);if(!o)return{loanCount:0,activeLoanCount:0,closedLoanCount:0,defaultedLoanCount:0,outstandingPrincipalAmount:0,totalOverdueAmount:0};let s=ie(await r.loanBoardService.listLoanBoard(o));return{loanCount:s.length,activeLoanCount:s.filter(d=>d.status==="active").length,closedLoanCount:s.filter(d=>d.status==="closed").length,defaultedLoanCount:s.filter(d=>d.status==="defaulted").length,outstandingPrincipalAmount:s.reduce((d,c)=>d+c.outstandingAmount,0),totalOverdueAmount:s.filter(d=>d.overdueInstallmentCount>0).reduce((d,c)=>d+c.outstandingAmount,0)}}}}}var ma=1440*60*1e3;function Yr(r){return r.slice(0,10)}function zr(r){return r.slice(0,7)}function ua(r){return new Date(`${r}-01T00:00:00.000Z`)}function ct(r){let e=ua(r);return new Date(Date.UTC(e.getUTCFullYear(),e.getUTCMonth()+1,0,23,59,59,999))}function Wt(r,e=new Date().toISOString()){let t=new Date(e),n=[];for(let a=r-1;a>=0;a-=1){let i=new Date(Date.UTC(t.getUTCFullYear(),t.getUTCMonth()-a,1));n.push(`${i.getUTCFullYear()}-${String(i.getUTCMonth()+1).padStart(2,"0")}`)}return n}function be(r){return{...r!=null&&r.tenantId?{tenantId:r.tenantId}:{},...r!=null&&r.branchId?{branchId:r.branchId}:{}}}function pa(r,e){return r.startDate<=e&&r.endDate>=e}function ga(r,e=new Date().toISOString()){var i,o,s,d,c,m;if(r.length===0)return null;let t=Yr(e),n=r.filter(p=>pa(p,t));if(n.length>0)return(o=(i=[...n].sort((p,u)=>u.endDate.localeCompare(p.endDate))[0])==null?void 0:i.id)!=null?o:null;let a=r.filter(p=>p.status==="finalized");return a.length>0?(d=(s=[...a].sort((p,u)=>u.endDate.localeCompare(p.endDate))[0])==null?void 0:s.id)!=null?d:null:(m=(c=[...r].sort((p,u)=>u.endDate.localeCompare(p.endDate))[0])==null?void 0:c.id)!=null?m:null}function ya(r,e){let t=ct(e).toISOString();return!(!(r.joinDate<=t)||r.status!=="active"||r.exitDate&&r.exitDate<=t)}function fa(r,e){let t=ct(e).toISOString();return r.joinDate<=t}async function Ft(r,e,t,n,a){return(await Promise.all(e.map(o=>r.listSavingEntriesByMember(o,{includeDeleted:!1,dateFrom:t,dateTo:n,...be(a)})))).map(o=>P(o)).flat()}function ud(r,e={}){var i,o;let t=Math.max(1,Math.min(24,(i=e.monthsWindow)!=null?i:6)),n=Math.max(1,Math.min(180,(o=e.heatmapDays)!=null?o:30)),a=async s=>{var m;if(e.resolveCurrentShuPeriodId)return e.resolveCurrentShuPeriodId(s);if(!((m=r.shuService)!=null&&m.listShuPeriods))return null;let d=await r.shuService.listShuPeriods({includeDeleted:!1,...s!=null&&s.tenantId?{tenantId:s.tenantId}:{},...s!=null&&s.branchId?{branchId:s.branchId}:{}}),c=P(d);return ga(c,e.referenceDate)};return{async getOnboardingFunnel(s){let d=await r.memberService.listMembers({includeDeleted:!1,...be(s)}),c=P(d),p=(await Promise.all(c.map(y=>r.savingLedgerService.getSavingBalanceByMember(y.id)))).map(y=>P(y)),u=p.filter(y=>y.pokok>0).length,h=c.filter((y,I)=>{var v,R;return y.status==="active"&&((R=(v=p[I])==null?void 0:v.pokok)!=null?R:0)>0}).length;return{daftar:c.length,verifikasiPokok:u,aktif:h}},async getWajibComplianceTrend(s){let d=Wt(t,e.referenceDate),c=await r.memberService.listMembers({includeDeleted:!1,status:"active",...be(s)}),p=P(c).map(v=>v.id);if(p.length===0)return d.map(v=>({month:v,patuh:0,menunggak:0}));let u=d[0],h=d[d.length-1],y=await Ft(r.savingLedgerService,p,`${u}-01T00:00:00.000Z`,ct(h).toISOString(),s),I=new Set(y.filter(v=>v.savingType==="wajib"&&v.entryType==="credit"&&v.amount>0).map(v=>`${v.memberId}:${zr(v.transactionDate)}`));return d.map(v=>{let R=0,C=0;for(let A of p)I.has(`${A}:${v}`)?R+=1:C+=1;return{month:v,patuh:R,menunggak:C}})},async getSavingTypeCompositionByPeriod(s){let d=Wt(t,e.referenceDate),c=await r.memberService.listMembers({includeDeleted:!1,...be(s)}),p=P(c).map(v=>v.id);if(p.length===0)return d.map(v=>({period:v,pokok:0,wajib:0,sukarela:0}));let u=d[0],h=d[d.length-1],y=await Ft(r.savingLedgerService,p,`${u}-01T00:00:00.000Z`,ct(h).toISOString(),s),I=new Map;for(let v of d)I.set(v,{period:v,pokok:0,wajib:0,sukarela:0});for(let v of y){let R=zr(v.transactionDate),C=I.get(R);if(!C)continue;let A=v.entryType==="credit"?1:-1;v.savingType==="pokok"&&(C.pokok+=A*v.amount),v.savingType==="wajib"&&(C.wajib+=A*v.amount),v.savingType==="sukarela"&&(C.sukarela+=A*v.amount)}return d.map(v=>{var R;return(R=I.get(v))!=null?R:{period:v,pokok:0,wajib:0,sukarela:0}})},async getMemberGrowthTrend(s){let d=Wt(t,e.referenceDate),c=await r.memberService.listMembers({includeDeleted:!1,...be(s)}),m=P(c);return d.map(p=>{let u=m.filter(y=>fa(y,p)).length,h=m.filter(y=>ya(y,p)).length;return{month:p,active:h,nonActive:Math.max(0,u-h)}})},async getShuDistributionSummary(s){if(!r.shuService)return[];let d=await a(s);if(!d)return[];let c=await r.shuService.listShuAllocations(d,{includeDeleted:!1});return[...P(c).filter(u=>!(s!=null&&s.tenantId&&u.tenantId!==s.tenantId||s!=null&&s.branchId&&u.branchId!==s.branchId))].sort((u,h)=>h.allocationAmount-u.allocationAmount).slice(0,10).map(u=>({memberId:u.memberId,allocationAmount:u.allocationAmount}))},async getOperationalActivityHeatmap(s){var v;let d=await r.memberService.listMembers({includeDeleted:!1,...be(s)}),m=P(d).map(R=>R.id);if(m.length===0)return[];let p=e.referenceDate?new Date(e.referenceDate).getTime():Date.now(),u=new Date(p).toISOString(),h=new Date(p-(n-1)*ma).toISOString(),y=await Ft(r.savingLedgerService,m,h,u,s),I=new Map;for(let R of y){let C=Yr(R.transactionDate),A=new Date(R.transactionDate).getUTCHours(),k=`${C}:${A}`,M=(v=I.get(k))!=null?v:{day:C,hour:A,total:0};M.total+=1,I.set(k,M)}return Array.from(I.values()).sort((R,C)=>R.day===C.day?R.hour-C.hour:R.day.localeCompare(C.day))}}}function Zr(r,e){return{async getShuSummary(t,n){let a=await e.resolveShuPeriodIdsForRange(t,n);if(!a.length)return{allocationCount:0,totalAllocatedAmount:0};let s=(await Promise.all(a.map(d=>r.shuService.listShuAllocations(d,{includeDeleted:!1})))).map(d=>P(d)).flat().filter(d=>!(n!=null&&n.tenantId&&d.tenantId!==n.tenantId||n!=null&&n.branchId&&d.branchId!==n.branchId));return{allocationCount:s.length,totalAllocatedAmount:s.reduce((d,c)=>d+c.allocationAmount,0)}}}}function ha(r){let e=r.reduce((n,a)=>n+a.debit,0),t=r.reduce((n,a)=>n+a.credit,0);return{totalDebit:e,totalCredit:t,isBalanced:e===t}}function ba(r,e,t){var n,a;return{tenantId:(n=e==null?void 0:e.tenantId)!=null?n:void 0,branchId:(a=e==null?void 0:e.branchId)!=null?a:void 0,financeDomainId:t,occurredFrom:`${r.from.slice(0,10)}T00:00:00.000Z`,occurredTo:`${r.to.slice(0,10)}T23:59:59.999Z`}}async function va(r){let e=await r;if(Array.isArray(e))return e;if(e!=null&&e.error){let t=new Error(e.error.message||e.error.code||"OFFINANCE_TRIAL_BALANCE_ERROR");throw t.code=e.error.code,t}return Array.isArray(e==null?void 0:e.data)?e.data:[]}function Te(r){switch(r.accountType){case"asset":case"expense":return r.debit-r.credit;case"liability":case"equity":case"revenue":return r.credit-r.debit;default:return 0}}function Ia(r){let e=r.filter(n=>n.accountType==="revenue").reduce((n,a)=>n+Te(a),0),t=r.filter(n=>n.accountType==="expense").reduce((n,a)=>n+Te(a),0);return{revenue:e,expense:t,netIncome:e-t}}function Ra(r){let e=r.filter(a=>a.accountType==="asset").reduce((a,i)=>a+Te(i),0),t=r.filter(a=>a.accountType==="liability").reduce((a,i)=>a+Te(i),0),n=r.filter(a=>a.accountType==="equity").reduce((a,i)=>a+Te(i),0);return{assets:e,liabilities:t,equity:n}}function Sa(r){let e=r.filter(n=>n.accountType==="revenue").reduce((n,a)=>n+Math.max(0,a.credit-a.debit),0),t=r.filter(n=>n.accountType==="expense").reduce((n,a)=>n+Math.max(0,a.debit-a.credit),0);return{operatingInflow:e,operatingOutflow:t,netOperatingCashflow:e-t}}function Ca(r,e,t,n){return{trialBalance:ha(r),incomeStatement:e,balanceSheet:t,cashflow:n}}function Xr(r,e={}){return{async getAccountingSummary(t,n){var o;let a=r.financeReader.getTrialBalanceByScope?r.financeReader.getTrialBalanceByScope(ba(t,n,(o=e.financeDomainId)!=null?o:"ofcoop")):r.financeReader.getTrialBalance(),i=await va(a);return Ca(i,Ia(i),Ra(i),Sa(i))}}}function vd(r,e){var a;let t=Zr({shuService:r.shuService},{resolveShuPeriodIdsForRange:e.resolveShuPeriodIdsForRange}),n=r.financeReader?Xr({financeReader:r.financeReader},{financeDomainId:(a=e.financeDomainId)!=null?a:"ofcoop"}):{};return{...t,...n}}import{unwrap as Sd}from"ofcore";export{Tt as CommunityProfileRepository,yt as GovernanceAgendaRepository,Mt as GovernanceDecisionArchiveRepository,gt as GovernanceMeetingRepository,ft as GovernanceVoteRepository,kt as LeadershipAppointmentRepository,ht as LeadershipTermRepository,bt as ManagementReportRepository,xt as MemberDependentRepository,ut as MemberExitStateRepository,pt as MemberNumberPolicyRepository,lt as MemberRepository,mt as MemberWaConsentRepository,ot as OFAUTH_AUDIT_EVENT_CATALOG,st as OFCOOP_AUDIT_EVENT_CATALOG,dt as OFCOOP_CREDIT_AUDIT_EVENT_CATALOG,f as OFCOOP_TABLES,Bt as OfcoopCore,jt as OfcoopCoreBuilder,Me as OfcoopDomainError,vt as OversightPolicyRepository,It as RiskRegisterRepository,Ct as SavingLedgerRepository,St as SavingPolicyRepository,Pt as ShuAllocationRepository,wt as ShuConfigRepository,Dt as ShuParticipationEntryRepository,At as ShuPeriodRepository,Rt as WhistleReportRepository,Vt as applyPendingMigrations,Kt as assertValidAddGovernanceAgendaItemInput,Wr as assertValidAddMemberDependentInput,wr as assertValidAddWhistleEvidenceInput,Ar as assertValidAdvanceWhistleInvestigationStageInput,Zt as assertValidCloseGovernanceAgendaInput,qr as assertValidCreateCommunityProfileInput,Qt as assertValidCreateGovernanceMeetingInput,Xt as assertValidCreateLeadershipTermInput,rr as assertValidCreateManagementReportInput,$t as assertValidCreateMemberInput,pr as assertValidCreateRiskRegisterInput,Lr as assertValidCreateShuPeriodInput,Rr as assertValidCreateWhistleReportInput,er as assertValidEndLeadershipTermInput,jr as assertValidEndorseAppointmentInput,hr as assertValidEscalateRiskRegisterInput,Cr as assertValidEscalateWhistleReportInput,Ht as assertValidGetComplianceReadinessInput,tr as assertValidHandoverLeadershipTermInput,yo as assertValidInstallAppointmentInput,Ot as assertValidManagementReportAudience,ir as assertValidManagementReportPayload,qe as assertValidMemberExitInput,Gt as assertValidMemberNumberPolicyInput,ur as assertValidOversightPolicyInput,Br as assertValidProposeAppointmentInput,Yt as assertValidRecordGovernanceMeetingArtifactsInput,zt as assertValidRecordGovernanceMeetingMinutesInput,Jt as assertValidRecordGovernanceVoteInput,fr as assertValidRecordRiskRegisterReviewInput,Lt as assertValidRecordShuParticipationInput,Nr as assertValidRejectAppointmentInput,ar as assertValidReviewManagementReportInput,vr as assertValidReviewRiskMitigationApprovalInput,kr as assertValidSavingEntryInput,Dr as assertValidSavingPolicyInput,xr as assertValidShuConfigInput,nr as assertValidSubmitManagementReportInput,br as assertValidSubmitRiskMitigationApprovalInput,gr as assertValidUpdateRiskRegisterInput,yr as assertValidUpdateRiskRegisterStatusInput,Sr as assertValidUpdateWhistleReportStatusInput,$s as buildHasilUsahaPeriodSummary,Tr as calculateWajibNetTotal,gs as composeManagementReportFinancialPayloadFromSummary,U as conflict,od as createActivityAuditTrailProvider,Zs as createAuditTrailCompositionProvider,Fr as createDbAdapterOfcoopServices,Is as createGenerateAndExportShu,ks as createMember360CompositionProviders,ed as createOfauthCompositionProviders,cd as createOfcoopCreditCompositionProviders,ud as createOfcoopDashboardCompositionProviders,rd as createOfcoopDomainAuditCompositionProviders,Xr as createOfcoopOffinanceReportCompositionProviders,Zr as createOfcoopReportCompositionProviders,te as createOfcoopRepositories,vd as createOfcoopStandardReportProviders,Pr as deriveSavingComplianceStatus,Us as exportReportSummaryCsv,_s as exportReportSummaryJson,Ls as getAnggotaDashboardSummary,Or as getDefaultParticipationWeights,ws as getMember360,Ut as getOfcoopTableSchemas,Es as getPengawasDashboardSummary,Os as getPengurusDashboardSummary,Hr as getReportSummary,l as invalidState,_t as migrations,w as notFound,rn as ofcoopSchema,bs as onboardMemberWithInitialSavings,Mr as projectSavingLedgerToScopedFinance,zs as queryAuditTrail,ga as resolveCurrentShuPeriodIdFromRows,qs as toAnggotaDashboardViewModel,Ps as toMember360ViewModel,Ns as toPengawasDashboardViewModel,js as toPengurusDashboardViewModel,Qs as toReportSummaryViewModel,Sd as unwrap,vs as upsertPolicyAndEvaluateCompliance};
|
|
3
|
+
`)},{id:"template-rapb-realisasi",title:"Template RAPB vs Realisasi",content:Array.isArray(o)&&o.length?o.map((R,C)=>{var P,k,M;return`${C+1}. ${(P=R.label)!=null?P:"Item"} | target=${(k=R.targetIdr)!=null?k:0} | realisasi=${(M=R.actualIdr)!=null?M:0}`}).join(`
|
|
4
|
+
`):"Belum ada data RAPB vs realisasi."},{id:"template-hasil-usaha-periodik",title:"Template Perhitungan Hasil Usaha Periodik",content:Array.isArray(s)&&s.length?s.map((R,C)=>{var P,k,M,O;return`${C+1}. ${(P=R.periodCode)!=null?P:"-"} | distributable=${(k=R.distributableShuIdr)!=null?k:0} | allocated=${(M=R.allocatedShuIdr)!=null?M:0} | undistributed=${(O=R.undistributedShuIdr)!=null?O:0}`}).join(`
|
|
5
|
+
`):"Belum ada ringkasan hasil usaha periodik."}]}};function mr(r,e){if(!Number.isFinite(e)||e<=0||e>24*365)throw l(`${r} must be > 0 and <= 8760`)}function ur(r){var e,t;if(!((e=r.tenantId)!=null&&e.trim()))throw l("tenantId is required");if(!((t=r.effectiveDate)!=null&&t.trim()))throw l("effectiveDate is required");if(!Number.isInteger(r.escalationMaxLevel)||r.escalationMaxLevel<1||r.escalationMaxLevel>10)throw l("escalationMaxLevel must be an integer between 1 and 10");for(let[n,a]of Object.entries(r.riskSlaHoursByCategory))mr(`riskSlaHoursByCategory.${n}`,a);for(let[n,a]of Object.entries(r.whistleSlaHoursByChannel))mr(`whistleSlaHoursByChannel.${n}`,a)}var $e=class{constructor(e,t={}){this.repos=e;this.options=t;this.newId=D("oversight-policy")}async getActiveOversightPolicy(e){return b(this.repos.oversightPolicyRepository.getActive(e))}async upsertOversightPolicy(e){return b((async()=>{ur(e);let t={tenantId:e.tenantId,branchId:e.branchId},n=await this.repos.oversightPolicyRepository.getActive(t),a=g();if(n){let o=await this.repos.oversightPolicyRepository.upsert({...n,...e,version:n.version+1,lastModified:a});return await S(this.options,{name:"oversight.policy-upserted",occurredAt:g(),entityId:o.id,tenantId:o.tenantId,branchId:o.branchId,payload:{effectiveDate:o.effectiveDate,escalationMaxLevel:o.escalationMaxLevel}}),o}let i=await this.repos.oversightPolicyRepository.upsert({id:this.newId(),...e,version:1,lastModified:a,deleted:!1});return await S(this.options,{name:"oversight.policy-upserted",occurredAt:g(),entityId:i.id,tenantId:i.tenantId,branchId:i.branchId,payload:{effectiveDate:i.effectiveDate,escalationMaxLevel:i.escalationMaxLevel}}),i})())}async listOversightPolicies(e){return b(this.repos.oversightPolicyRepository.list(e))}};function Qe(r,e){if(!Number.isFinite(e)||e<1||e>5)throw l(`${r} must be between 1 and 5`)}function pr(r){var e,t;if(!((e=r.title)!=null&&e.trim()))throw l("risk title is required");if(!((t=r.tenantId)!=null&&t.trim()))throw l("tenantId is required");if(Qe("likelihood",r.likelihood),Qe("impact",r.impact),r.slaDueAt!==void 0&&r.slaDueAt!==null&&!r.slaDueAt.trim())throw l("slaDueAt cannot be empty string")}function gr(r){if(r.title!==void 0&&!r.title.trim())throw l("risk title cannot be empty");if(r.likelihood!==void 0&&Qe("likelihood",r.likelihood),r.impact!==void 0&&Qe("impact",r.impact),r.slaDueAt!==void 0&&r.slaDueAt!==null&&!r.slaDueAt.trim())throw l("slaDueAt cannot be empty string")}function yr(r){var e,t;if(!((e=r.status)!=null&&e.trim()))throw l("status is required");if(r.status==="closed"&&!((t=r.notes)!=null&&t.trim()))throw l("notes are required when risk status is closed")}function fr(r){var e;if(!((e=r.reviewedAt)!=null&&e.trim()))throw l("reviewedAt is required")}function hr(r){var e;if(!((e=r.reason)!=null&&e.trim()))throw l("escalation reason is required")}function br(r){if(r&&r.submittedAt!==void 0&&r.submittedAt!==null&&!r.submittedAt.trim())throw l("submittedAt cannot be empty string")}function vr(r){var e;if(!r.decision)throw l("decision is required");if(!((e=r.reviewerMemberId)!=null&&e.trim()))throw l("reviewerMemberId is required");if(r.reviewedAt!==void 0&&r.reviewedAt!==null&&!r.reviewedAt.trim())throw l("reviewedAt cannot be empty string")}function Ir(r,e){return r*e}function un(r,e){return new Date(new Date(r).getTime()+e*60*60*1e3).toISOString()}var He=class{constructor(e,t={}){this.repos=e;this.options=t;this.newId=D("risk-item")}canTransitionStatus(e,t){return e===t?!0:e==="open"?t==="mitigating"||t==="accepted"||t==="closed":e==="mitigating"?t==="open"||t==="accepted"||t==="closed":e==="accepted"?t==="mitigating"||t==="closed":!1}async assertValidOwner(e){if(!e)return;let t=await this.repos.memberRepository.getById(e);if(!t||t.deleted)throw w("Member",e);if(t.status!=="active")throw l("Risk owner must be an active member")}async resolveDefaultSlaDueAt(e,t){var i,o;if(e.slaDueAt!==void 0)return(i=e.slaDueAt)!=null?i:null;if(!((o=e.tenantId)!=null&&o.trim()))return null;let n=await this.repos.oversightPolicyRepository.getActive({tenantId:e.tenantId,branchId:e.branchId});if(!n)return null;let a=n.riskSlaHoursByCategory[e.category];return!Number.isFinite(a)||a<=0?null:un(t,a)}async resolveEscalationMaxLevel(e,t){if(!e)return 5;let n=await this.repos.oversightPolicyRepository.getActive({tenantId:e,branchId:t});return n?Math.max(1,n.escalationMaxLevel):5}async createRiskItem(e){return b((async()=>{var i,o,s,d,c,m,p;pr(e),await this.assertValidOwner(e.ownerMemberId);let t=g(),n=await this.resolveDefaultSlaDueAt(e,t),a=await this.repos.riskRegisterRepository.create({id:this.newId(),title:e.title.trim(),description:(i=e.description)!=null?i:null,category:e.category,likelihood:e.likelihood,impact:e.impact,riskScore:Ir(e.likelihood,e.impact),status:"open",ownerMemberId:(o=e.ownerMemberId)!=null?o:null,mitigationPlan:(s=e.mitigationPlan)!=null?s:null,slaDueAt:n,escalationLevel:0,escalatedAt:null,escalationReason:null,mitigationApprovalStatus:(d=e.mitigationPlan)!=null&&d.trim()?"pending":"not_required",mitigationSubmittedAt:(c=e.mitigationPlan)!=null&&c.trim()?t:null,mitigationReviewedAt:null,mitigationReviewerMemberId:null,mitigationReviewNote:null,nextReviewDate:(m=e.nextReviewDate)!=null?m:null,lastReviewedAt:null,notes:(p=e.notes)!=null?p:null,tenantId:e.tenantId,branchId:e.branchId,version:1,lastModified:t,deleted:!1});return await S(this.options,{name:"risk.item-created",occurredAt:g(),entityId:a.id,tenantId:a.tenantId,branchId:a.branchId,payload:{category:a.category,riskScore:a.riskScore,status:a.status}}),a})())}async updateRiskItem(e,t){return b((async()=>{var m,p,u,h,y,I,v,R,C,P,k,M,O,T,j,B;gr(t);let n=await this.repos.riskRegisterRepository.getById(e);if(!n||n.deleted)throw w("RiskRegisterItem",e);if(n.status==="closed")throw l("Closed risk item cannot be updated");let a=t.ownerMemberId===void 0?(m=n.ownerMemberId)!=null?m:null:t.ownerMemberId;await this.assertValidOwner(a);let i=(p=t.likelihood)!=null?p:n.likelihood,o=(u=t.impact)!=null?u:n.impact,s=t.mitigationPlan===void 0?(h=n.mitigationPlan)!=null?h:null:t.mitigationPlan,d=t.mitigationPlan===void 0?(y=n.mitigationApprovalStatus)!=null?y:"not_required":s!=null&&s.trim()?"pending":"not_required",c=await this.repos.riskRegisterRepository.update(e,{title:(v=(I=t.title)==null?void 0:I.trim())!=null?v:n.title,description:t.description===void 0?(R=n.description)!=null?R:null:t.description,category:(C=t.category)!=null?C:n.category,likelihood:i,impact:o,riskScore:Ir(i,o),ownerMemberId:a,mitigationPlan:s,slaDueAt:t.slaDueAt===void 0?(P=n.slaDueAt)!=null?P:null:t.slaDueAt,mitigationApprovalStatus:d,mitigationSubmittedAt:t.mitigationPlan===void 0?(k=n.mitigationSubmittedAt)!=null?k:null:s!=null&&s.trim()?g():null,mitigationReviewedAt:t.mitigationPlan===void 0&&(M=n.mitigationReviewedAt)!=null?M:null,mitigationReviewerMemberId:t.mitigationPlan===void 0&&(O=n.mitigationReviewerMemberId)!=null?O:null,mitigationReviewNote:t.mitigationPlan===void 0&&(T=n.mitigationReviewNote)!=null?T:null,nextReviewDate:t.nextReviewDate===void 0?(j=n.nextReviewDate)!=null?j:null:t.nextReviewDate,notes:t.notes===void 0?(B=n.notes)!=null?B:null:t.notes,version:n.version+1,lastModified:g()});return await S(this.options,{name:"risk.item-updated",occurredAt:g(),entityId:c.id,tenantId:c.tenantId,branchId:c.branchId,payload:{category:c.category,riskScore:c.riskScore}}),c})())}async updateRiskItemStatus(e,t){return b((async()=>{var i,o,s,d;yr(t);let n=await this.repos.riskRegisterRepository.getById(e);if(!n||n.deleted)throw w("RiskRegisterItem",e);if(n.status===t.status)return n;if(!this.canTransitionStatus(n.status,t.status))throw l(`Invalid risk status transition: ${n.status} -> ${t.status}`);if(t.status==="closed"&&((o=(i=n.mitigationPlan)==null?void 0:i.trim())!=null&&o)&&((s=n.mitigationApprovalStatus)!=null?s:"not_required")!=="approved")throw l("Risk item with mitigation plan requires approved mitigation before closing");let a=await this.repos.riskRegisterRepository.update(e,{status:t.status,notes:t.notes===void 0?(d=n.notes)!=null?d:null:t.notes,version:n.version+1,lastModified:g()});return await S(this.options,{name:"risk.item-status-updated",occurredAt:g(),entityId:a.id,tenantId:a.tenantId,branchId:a.branchId,payload:{status:a.status}}),a})())}async recordRiskItemReview(e,t){return b((async()=>{var i;fr(t);let n=await this.repos.riskRegisterRepository.getById(e);if(!n||n.deleted)throw w("RiskRegisterItem",e);let a=await this.repos.riskRegisterRepository.update(e,{lastReviewedAt:t.reviewedAt,notes:t.notes===void 0?(i=n.notes)!=null?i:null:t.notes,version:n.version+1,lastModified:g()});return await S(this.options,{name:"risk.item-reviewed",occurredAt:g(),entityId:a.id,tenantId:a.tenantId,branchId:a.branchId,payload:{reviewedAt:a.lastReviewedAt}}),a})())}async escalateRiskItem(e,t){return b((async()=>{var s,d,c;hr(t);let n=await this.repos.riskRegisterRepository.getById(e);if(!n||n.deleted)throw w("RiskRegisterItem",e);if(n.status==="closed")throw l("Closed risk item cannot be escalated");let a=await this.resolveEscalationMaxLevel(n.tenantId,n.branchId),i=Math.min(((s=n.escalationLevel)!=null?s:0)+1,a);if(i===((d=n.escalationLevel)!=null?d:0))throw l("Risk escalation level already reached policy maximum");let o=await this.repos.riskRegisterRepository.update(e,{escalationLevel:i,escalatedAt:(c=t.escalatedAt)!=null?c:g(),escalationReason:t.reason.trim(),version:n.version+1,lastModified:g()});return await S(this.options,{name:"risk.item-escalated",occurredAt:g(),entityId:o.id,tenantId:o.tenantId,branchId:o.branchId,payload:{escalationLevel:o.escalationLevel,reason:o.escalationReason}}),o})())}async submitRiskMitigationApproval(e,t){return b((async()=>{var o,s,d,c;br(t);let n=await this.repos.riskRegisterRepository.getById(e);if(!n||n.deleted)throw w("RiskRegisterItem",e);if(n.status==="closed")throw l("Closed risk item cannot be submitted for mitigation approval");if(!((s=(o=n.mitigationPlan)==null?void 0:o.trim())!=null&&s))throw l("Mitigation plan is required before submitting mitigation approval");let a=(d=t==null?void 0:t.submittedAt)!=null?d:g(),i=await this.repos.riskRegisterRepository.update(e,{mitigationApprovalStatus:"pending",mitigationSubmittedAt:a,mitigationReviewedAt:null,mitigationReviewerMemberId:null,mitigationReviewNote:(c=t==null?void 0:t.note)!=null?c:null,version:n.version+1,lastModified:g()});return await S(this.options,{name:"risk.item-updated",occurredAt:g(),entityId:i.id,tenantId:i.tenantId,branchId:i.branchId,payload:{mitigationApprovalStatus:i.mitigationApprovalStatus,mitigationSubmittedAt:i.mitigationSubmittedAt}}),i})())}async reviewRiskMitigationApproval(e,t){return b((async()=>{var o,s,d;vr(t);let n=await this.repos.riskRegisterRepository.getById(e);if(!n||n.deleted)throw w("RiskRegisterItem",e);if(n.status==="closed")throw l("Closed risk item cannot be reviewed for mitigation approval");if(((o=n.mitigationApprovalStatus)!=null?o:"not_required")!=="pending")throw l("Only pending mitigation approval can be reviewed");await this.assertValidOwner(t.reviewerMemberId);let a=(s=t.reviewedAt)!=null?s:g(),i=await this.repos.riskRegisterRepository.update(e,{mitigationApprovalStatus:t.decision,mitigationReviewedAt:a,mitigationReviewerMemberId:t.reviewerMemberId,mitigationReviewNote:(d=t.note)!=null?d:null,version:n.version+1,lastModified:g()});return await S(this.options,{name:"risk.item-updated",occurredAt:g(),entityId:i.id,tenantId:i.tenantId,branchId:i.branchId,payload:{mitigationApprovalStatus:i.mitigationApprovalStatus,mitigationReviewerMemberId:i.mitigationReviewerMemberId}}),i})())}async getRiskItemById(e){return b((async()=>{let t=await this.repos.riskRegisterRepository.getById(e);return!t||t.deleted?null:t})())}async listRiskItems(e={}){return b(this.repos.riskRegisterRepository.list(e))}};function Rr(r){var e,t,n;if(!((e=r.subject)!=null&&e.trim()))throw l("whistle report subject is required");if(!((t=r.description)!=null&&t.trim()))throw l("whistle report description is required");if(!((n=r.tenantId)!=null&&n.trim()))throw l("tenantId is required");if(r.evidenceRefs!==void 0&&r.evidenceRefs!==null){if(!Array.isArray(r.evidenceRefs))throw l("evidenceRefs must be an array when provided");if(r.evidenceRefs.some(a=>!a||!a.trim()))throw l("evidenceRefs cannot contain empty value")}if(r.slaDueAt!==void 0&&r.slaDueAt!==null&&!r.slaDueAt.trim())throw l("slaDueAt cannot be empty string")}function Sr(r){var e,t;if(!((e=r.status)!=null&&e.trim()))throw l("whistle report status is required");if((r.status==="resolved"||r.status==="dismissed")&&!((t=r.resolutionSummary)!=null&&t.trim()))throw l("resolutionSummary is required when status is resolved or dismissed")}function Cr(r){var e;if(!((e=r.reason)!=null&&e.trim()))throw l("whistle escalation reason is required")}function wr(r){var e;if(!((e=r.evidenceRef)!=null&&e.trim()))throw l("evidenceRef is required")}function Pr(r){var e;if(!((e=r.stage)!=null&&e.trim()))throw l("investigation stage is required");if(r.updatedAt!==void 0&&r.updatedAt!==null&&!r.updatedAt.trim())throw l("updatedAt cannot be empty string")}function pn(r,e){return new Date(new Date(r).getTime()+e*60*60*1e3).toISOString()}var Et={intake:0,preliminary:1,formal:2,recommendation:3},Ke=class{constructor(e,t={}){this.repos=e;this.options=t;this.newId=D("whistle-report")}canTransitionStatus(e,t){return e===t?!0:e==="submitted"?t==="in_review"||t==="dismissed":e==="in_review"?t==="resolved"||t==="dismissed":!1}async assertMemberExists(e){if(!e)return;let t=await this.repos.memberRepository.getById(e);if(!t||t.deleted)throw w("Member",e)}async resolveDefaultSlaDueAt(e,t){var i,o;if(e.slaDueAt!==void 0)return(i=e.slaDueAt)!=null?i:null;if(!((o=e.tenantId)!=null&&o.trim()))return null;let n=await this.repos.oversightPolicyRepository.getActive({tenantId:e.tenantId,branchId:e.branchId});if(!n)return null;let a=n.whistleSlaHoursByChannel[e.channel];return!Number.isFinite(a)||a<=0?null:pn(t,a)}async resolveEscalationMaxLevel(e,t){if(!e)return 5;let n=await this.repos.oversightPolicyRepository.getActive({tenantId:e,branchId:t});return n?Math.max(1,n.escalationMaxLevel):5}async createWhistleReport(e){return b((async()=>{var i,o,s,d;Rr(e),!e.isAnonymous&&e.reporterMemberId&&await this.assertMemberExists(e.reporterMemberId);let t=g(),n=await this.resolveDefaultSlaDueAt(e,t),a=await this.repos.whistleReportRepository.create({id:this.newId(),incidentDate:(i=e.incidentDate)!=null?i:null,subject:e.subject.trim(),description:e.description.trim(),channel:e.channel,isAnonymous:!!e.isAnonymous,reporterMemberId:e.isAnonymous?null:(o=e.reporterMemberId)!=null?o:null,evidenceRefs:(d=(s=e.evidenceRefs)==null?void 0:s.map(c=>c.trim()))!=null?d:null,slaDueAt:n,escalationLevel:0,escalatedAt:null,escalationReason:null,investigationStage:"intake",investigationUpdatedAt:t,investigationNote:null,status:"submitted",assignedToMemberId:null,handledByMemberId:null,resolutionSummary:null,resolvedAt:null,tenantId:e.tenantId,branchId:e.branchId,version:1,lastModified:t,deleted:!1});return await S(this.options,{name:"whistle.report-created",occurredAt:g(),entityId:a.id,tenantId:a.tenantId,branchId:a.branchId,payload:{channel:a.channel,status:a.status,isAnonymous:a.isAnonymous}}),a})())}async advanceWhistleInvestigationStage(e,t){return b((async()=>{var d,c,m,p,u;Pr(t);let n=await this.repos.whistleReportRepository.getById(e);if(!n||n.deleted)throw w("WhistleReport",e);if(n.status==="resolved"||n.status==="dismissed")throw l("Finalized whistle report cannot advance investigation stage");let a=(d=n.investigationStage)!=null?d:"intake",i=(c=Et[a])!=null?c:0,o=(m=Et[t.stage])!=null?m:-1;if(o<0)throw l(`Unsupported whistle investigation stage: ${t.stage}`);if(o<i)throw l(`Whistle investigation stage cannot move backwards: ${a} -> ${t.stage}`);if(o>i+1)throw l(`Whistle investigation stage must advance sequentially: ${a} -> ${t.stage}`);if(o>=Et.formal&&n.status!=="in_review")throw l("Formal/recommendation investigation stage requires report status in_review");if(o===i&&t.note===void 0&&t.updatedAt===void 0)return n;let s=await this.repos.whistleReportRepository.update(e,{investigationStage:t.stage,investigationUpdatedAt:(p=t.updatedAt)!=null?p:g(),investigationNote:t.note===void 0?(u=n.investigationNote)!=null?u:null:t.note,version:n.version+1,lastModified:g()});return await S(this.options,{name:"whistle.report-stage-updated",occurredAt:g(),entityId:s.id,tenantId:s.tenantId,branchId:s.branchId,payload:{investigationStage:s.investigationStage,investigationUpdatedAt:s.investigationUpdatedAt}}),s})())}async updateWhistleReportStatus(e,t){return b((async()=>{var o,s,d,c,m;Sr(t);let n=await this.repos.whistleReportRepository.getById(e);if(!n||n.deleted)throw w("WhistleReport",e);if(n.status==="resolved"||n.status==="dismissed")throw l("Whistle report is already finalized");if(!this.canTransitionStatus(n.status,t.status))throw l(`Invalid whistle report status transition: ${n.status} -> ${t.status}`);await this.assertMemberExists(t.assignedToMemberId),await this.assertMemberExists(t.handledByMemberId);let a=t.status==="resolved"||t.status==="dismissed",i=await this.repos.whistleReportRepository.update(e,{status:t.status,assignedToMemberId:t.assignedToMemberId===void 0?(o=n.assignedToMemberId)!=null?o:null:t.assignedToMemberId,handledByMemberId:t.handledByMemberId===void 0?(s=n.handledByMemberId)!=null?s:null:t.handledByMemberId,resolutionSummary:t.resolutionSummary===void 0?(d=n.resolutionSummary)!=null?d:null:t.resolutionSummary,resolvedAt:t.resolvedAt===void 0?a?g():(c=n.resolvedAt)!=null?c:null:t.resolvedAt,version:n.version+1,lastModified:g()});return await S(this.options,{name:"whistle.report-status-updated",occurredAt:g(),entityId:i.id,tenantId:i.tenantId,branchId:i.branchId,payload:{status:i.status,assignedToMemberId:(m=i.assignedToMemberId)!=null?m:null}}),i})())}async escalateWhistleReport(e,t){return b((async()=>{var s,d,c;Cr(t);let n=await this.repos.whistleReportRepository.getById(e);if(!n||n.deleted)throw w("WhistleReport",e);if(n.status==="resolved"||n.status==="dismissed")throw l("Finalized whistle report cannot be escalated");let a=await this.resolveEscalationMaxLevel(n.tenantId,n.branchId),i=Math.min(((s=n.escalationLevel)!=null?s:0)+1,a);if(i===((d=n.escalationLevel)!=null?d:0))throw l("Whistle escalation level already reached policy maximum");let o=await this.repos.whistleReportRepository.update(e,{escalationLevel:i,escalatedAt:(c=t.escalatedAt)!=null?c:g(),escalationReason:t.reason.trim(),version:n.version+1,lastModified:g()});return await S(this.options,{name:"whistle.report-escalated",occurredAt:g(),entityId:o.id,tenantId:o.tenantId,branchId:o.branchId,payload:{escalationLevel:o.escalationLevel,reason:o.escalationReason}}),o})())}async addWhistleEvidence(e,t){return b((async()=>{var o,s,d;wr(t);let n=await this.repos.whistleReportRepository.getById(e);if(!n||n.deleted)throw w("WhistleReport",e);if(n.status==="resolved"||n.status==="dismissed")throw l("Finalized whistle report cannot be updated");let a=new Set([...(o=n.evidenceRefs)!=null?o:[],t.evidenceRef.trim()]),i=await this.repos.whistleReportRepository.update(e,{evidenceRefs:Array.from(a),version:n.version+1,lastModified:g()});return await S(this.options,{name:"whistle.report-evidence-added",occurredAt:g(),entityId:i.id,tenantId:i.tenantId,branchId:i.branchId,payload:{totalEvidence:(d=(s=i.evidenceRefs)==null?void 0:s.length)!=null?d:0}}),i})())}async getWhistleReportById(e){return b((async()=>{let t=await this.repos.whistleReportRepository.getById(e);return!t||t.deleted?null:t})())}async listWhistleReports(e={}){return b(this.repos.whistleReportRepository.list(e))}};function Ar(r,e,t){return t?e>=r?"compliant":"underpaid":"no-policy"}var Je=class{constructor(e){this.repos=e}async buildSnapshot(e,t,n){var h;let i=(await this.repos.savingLedgerRepository.listByMember(e.id,{includeDeleted:!1,tenantId:t.tenantId,branchId:t.branchId})).filter(y=>y.savingType==="wajib"),o=i.filter(y=>y.entryType==="credit").reduce((y,I)=>y+I.amount,0),s=i.filter(y=>y.entryType==="debit").reduce((y,I)=>y+I.amount,0),d=o-s,c=(h=n==null?void 0:n.monthlyWajibNominalIdr)!=null?h:0,m=Ar(c,d,!!n),p=m==="underpaid"?1:0,u=m==="compliant"?"none":m==="no-policy"?"set_active_saving_policy":"followup_wajib_payment";return{id:`snapshot-${e.id}`,memberId:e.id,koperasiId:t.koperasiId,tenantId:e.tenantId,branchId:e.branchId,referenceDate:g(),monthlyWajibNominalIdr:c,wajibCreditTotalIdr:o,wajibDebitTotalIdr:s,wajibNetTotalIdr:d,status:m,monthsInArrears:p,recommendedAction:u,metadata:{memberNumber:e.memberNumber},version:1,lastModified:g(),deleted:!1}}async listComplianceSnapshots(e,t={}){return b((async()=>{var o;let n=await this.repos.savingPolicyRepository.getActive({koperasiId:e.koperasiId,tenantId:e.tenantId,branchId:e.branchId}),a=await this.repos.memberRepository.list({includeDeleted:(o=t.includeDeleted)!=null?o:!1,status:"active",tenantId:e.tenantId,branchId:e.branchId});return(await Promise.all(a.filter(s=>t.memberId?s.id===t.memberId:!0).map(s=>this.buildSnapshot(s,e,n)))).filter(s=>t.status?s.status===t.status:!0).map(s=>je(s))})())}async getComplianceSnapshotByMember(e,t){return b((async()=>{var a;let n=await this.listComplianceSnapshots(t,{memberId:e});if("error"in n)throw new Error(n.error.message);return(a=n.data[0])!=null?a:null})())}};import{buildJournalFromScopedCoopSavingDeposit as gn,buildJournalFromScopedCoopSavingWithdrawal as yn,createFinanceProjectionSink as fn}from"offinance-shared-core";function Mr(r){var n,a,i,o;let e=r.entry.entryType==="credit"?"saving-deposit":"saving-withdrawal",t=(n=r.referencePrefix)!=null?n:"saving-ledger";return{kind:e,context:{journalId:(a=r.journalId)!=null?a:`journal-${r.entry.id}`,tenantId:(i=r.entry.tenantId)!=null?i:"tenant-unknown",branchId:(o=r.entry.branchId)!=null?o:void 0,occurredAt:r.entry.transactionDate,reference:`${t}:${r.entry.id}`},input:{amount:r.entry.amount,scopedAccountMapping:r.scopedAccountMapping}}}function hn(r,e){var n;let t={...r.context,financeDomainId:(n=e.financeDomainId)!=null?n:"ofcoop",ledgerProfileId:e.ledgerProfileId};return r.kind==="saving-deposit"?gn(t,r.input):yn(t,r.input)}function $i(r){var e,t;return{savingAccountMapping:r.savingAccountMapping,financeProjectionSink:fn({dbAdapter:r.dbAdapter,resolveFinanceServices:r.resolveFinanceServices,resolveLedgerProfileId:r.resolveLedgerProfileId,resolveSyncEnqueuer:r.resolveSyncEnqueuer,requiredAccounts:r.requiredAccounts,buildJournalDraft:(n,a)=>{var i;return hn(n,{ledgerProfileId:a,financeDomainId:(i=r.financeDomainId)!=null?i:"ofcoop"})},missingServicesErrorCode:(e=r.missingServicesErrorCode)!=null?e:"COOP_FINANCE_SERVICES_UNAVAILABLE",missingLedgerProfileErrorCode:(t=r.missingLedgerProfileErrorCode)!=null?t:"COOP_LEDGER_PROFILE_REQUIRED"})}}function kr(r){var e,t;if(!((e=r.memberId)!=null&&e.trim()))throw l("memberId is required");if(!((t=r.transactionDate)!=null&&t.trim()))throw l("transactionDate is required");if(Number.isNaN(Number(r.amount))||Number(r.amount)<=0)throw l("amount must be > 0")}var ze=class{constructor(e,t,n={}){this.db=e;this.repos=t;this.options=n;this.newId=D("saving-ledger")}async inTx(e){return this.db.transaction(async t=>e(te(t)))}async addEntry(e,t){return kr(t),this.inTx(async n=>{var o,s,d,c,m,p;let a=await n.memberRepository.getById(t.memberId);if(!a||a.deleted)throw w("Member",t.memberId);if(a.status!=="active")throw U(`Cannot record saving entry for inactive member: ${t.memberId}`);if(t.referenceType&&t.referenceId){let u=await n.savingLedgerRepository.findByReference({memberId:t.memberId,savingType:t.savingType,entryType:e,referenceType:t.referenceType,referenceId:t.referenceId,tenantId:t.tenantId,branchId:t.branchId});if(u)return(o=this.options.logger)==null||o.logInfo("[ofcoop] saving entry idempotent hit",{memberId:t.memberId,referenceType:t.referenceType,referenceId:t.referenceId}),u}let i=await n.savingLedgerRepository.create({id:this.newId(),memberId:t.memberId,savingType:t.savingType,entryType:e,amount:t.amount,transactionDate:t.transactionDate,referenceType:(s=t.referenceType)!=null?s:null,referenceId:(d=t.referenceId)!=null?d:null,notes:(c=t.notes)!=null?c:null,branchId:t.branchId,tenantId:t.tenantId,version:1,lastModified:g(),deleted:!1});if((m=this.options.logger)==null||m.logInfo("[ofcoop] saving entry recorded",{entryId:i.id,memberId:i.memberId,savingType:i.savingType,entryType:i.entryType,amount:i.amount}),await S(this.options,{name:"saving.entry-recorded",occurredAt:g(),entityId:i.id,tenantId:i.tenantId,branchId:i.branchId,payload:{memberId:i.memberId,savingType:i.savingType,entryType:i.entryType,amount:i.amount}}),this.options.financeProjectionSink&&this.options.savingAccountMapping)try{let u=Mr({entry:i,scopedAccountMapping:this.options.savingAccountMapping});await this.options.financeProjectionSink(u)}catch(u){(p=this.options.logger)==null||p.logError(u,{message:"[ofcoop] finance projection sink failed for saving entry",entryId:i.id})}return i})}async recordSavingCredit(e){return b(this.addEntry("credit",e))}async recordSavingDebit(e){return b(this.addEntry("debit",e))}async recordSavingWithdrawal(e){return b((async()=>{var n;if(e.savingType!=="sukarela")throw U(`recordSavingWithdrawal only supports sukarela saving type, received: ${e.savingType}`);let t=A(await this.getSavingBalanceByMember(e.memberId));if(e.amount>t.sukarela)throw U(`Insufficient sukarela balance for member: ${e.memberId}`);return this.addEntry("debit",{...e,notes:(n=e.notes)!=null?n:"withdrawal"})})())}async listSavingEntriesByMember(e,t={}){return b(this.repos.savingLedgerRepository.listByMember(e,t))}async getSavingBalanceByMember(e){return b((async()=>{let t=A(await this.listSavingEntriesByMember(e)),n={pokok:0,wajib:0,sukarela:0,total:0};for(let a of t){let i=a.entryType==="credit"?1:-1;n[a.savingType]+=i*a.amount}return n.total=n.pokok+n.wajib+n.sukarela,n})())}};function Dr(r){var e,t,n;if(!((e=r.koperasiId)!=null&&e.trim()))throw l("koperasiId is required");if(!((t=r.tenantId)!=null&&t.trim()))throw l("tenantId is required");if(!((n=r.effectiveDate)!=null&&n.trim()))throw l("effectiveDate is required");if(r.simpananPokokNominalIdr<0)throw l("simpananPokokNominalIdr must be >= 0");if(r.monthlyWajibNominalIdr<0)throw l("monthlyWajibNominalIdr must be >= 0")}function Tr(r,e){return r-e}var Ye=class{constructor(e,t={}){this.repos=e;this.options=t;this.newId=D("saving-policy")}async getActiveSavingPolicy(e){return b(this.repos.savingPolicyRepository.getActive(e))}async upsertSavingPolicy(e){return b((async()=>{var s,d,c;Dr(e);let t={koperasiId:e.koperasiId,tenantId:e.tenantId,branchId:e.branchId},n=await this.repos.savingPolicyRepository.getPolicyHistory(t);if(n.length>0){let m=n[0].effectiveDate;if(e.effectiveDate<=m)throw U(`effectiveDate "${e.effectiveDate}" harus lebih baru dari policy terbaru "${m}".`)}let a=g(),i=await this.repos.savingPolicyRepository.getActive(t);i&&!i.isSuperseded&&(await this.repos.savingPolicyRepository.markSuperseded(i.id),await S(this.options,{name:"saving.policy-superseded",occurredAt:a,entityId:i.id,tenantId:i.tenantId,branchId:i.branchId,payload:{supersededBy:e.effectiveDate}}));let o=await this.repos.savingPolicyRepository.create({id:this.newId(),...e,changeReason:(s=e.changeReason)!=null?s:null,approvalRef:(d=e.approvalRef)!=null?d:null,isSuperseded:!1,version:1,lastModified:a,deleted:!1});return await S(this.options,{name:"saving.policy-upserted",occurredAt:a,entityId:o.id,tenantId:o.tenantId,branchId:o.branchId,payload:{simpananPokokNominalIdr:o.simpananPokokNominalIdr,monthlyWajibNominalIdr:o.monthlyWajibNominalIdr,gracePeriodMonth:o.gracePeriodMonth,warningAtMonths:o.warningAtMonths,nonaktifAtMonths:o.nonaktifAtMonths,dendaAmountIdr:o.dendaAmountIdr,autoSetAnggotaNonaktif:o.autoSetAnggotaNonaktif,effectiveDate:o.effectiveDate,reason:(c=o.changeReason)!=null?c:null}}),o})())}async getPolicyHistory(e){return b(this.repos.savingPolicyRepository.getPolicyHistory(e))}async evaluateWajibCompliance(e){return b((async()=>{let t=A(await this.getActiveSavingPolicy(e)),a=(await this.repos.savingLedgerRepository.listAll({includeDeleted:!1,tenantId:e.tenantId,branchId:e.branchId})).filter(s=>s.savingType==="wajib"),i=a.filter(s=>s.entryType==="credit").reduce((s,d)=>s+d.amount,0),o=a.filter(s=>s.entryType==="debit").reduce((s,d)=>s+d.amount,0);return{summary:{activePolicy:t?1:0,wajibCreditTotal:i,wajibDebitTotal:o,wajibNetTotal:Tr(i,o)},referenceDate:g()}})())}async getComplianceWorklist(e){return b((async()=>{let t=A(await this.getActiveSavingPolicy(e));if(!t)return[];let n=await this.repos.memberRepository.list({includeDeleted:!1,status:"active",tenantId:e.tenantId,branchId:e.branchId}),a=new Date;return Promise.all(n.map(async i=>{let s=(await this.repos.savingLedgerRepository.listByMember(i.id,{tenantId:e.tenantId,branchId:e.branchId})).reduce((y,I)=>I.savingType!=="wajib"?y:y+(I.entryType==="credit"?I.amount:-I.amount),0),c=Math.max(1,this.monthDiffInclusive(i.joinDate,a.toISOString().slice(0,10)))*t.monthlyWajibNominalIdr,m=Math.max(0,c-s),p=t.monthlyWajibNominalIdr>0?Math.ceil(m/t.monthlyWajibNominalIdr):0,u=p*30,h=u>90?"critical":u>30?"high":u>7?"medium":"low";return{id:`worklist-${i.id}`,memberId:i.id,scopeRef:{tenantId:e.tenantId,branchId:e.branchId},urgency:h,reasonCode:"WJ-REVIEW",reasonText:`[${i.memberNumber}] ${i.fullName} \u2014 policy: ${t.id}`,suggestedActions:["verify_monthly_wajib"],metrics:{expectedWajib:c,wajibNet:s,arrearsAmount:m,monthsInArrears:p,daysInArrears:u},timestamp:a.toISOString()}}))})())}monthDiffInclusive(e,t){let n=new Date(e),a=new Date(t);if(Number.isNaN(n.getTime())||Number.isNaN(a.getTime()))return 1;let i=a.getUTCFullYear()-n.getUTCFullYear(),o=a.getUTCMonth()-n.getUTCMonth();return i*12+o+1}};function xr(r){var t,n,a;if(!((t=r.koperasiId)!=null&&t.trim()))throw l("koperasiId is required");if(!((n=r.tenantId)!=null&&n.trim()))throw l("tenantId is required");if(!((a=r.effectiveDate)!=null&&a.trim()))throw l("effectiveDate is required");let e=r.cadanganPercent+r.jasaUsahaPercent+r.jasaModalPercent;if(e!==100)throw l(`SHU config percent total must be exactly 100, got ${e}`)}function Or(r){switch(r){case"ksp":return{simpananWeight:40,jasaUsahaWeight:60};case"konsumen":return{simpananWeight:30,jasaUsahaWeight:70};case"produsen":return{simpananWeight:30,jasaUsahaWeight:70};case"pemasaran":return{simpananWeight:25,jasaUsahaWeight:50,pemasaranWeight:25};case"serba_usaha":return{simpananWeight:30,jasaUsahaWeight:40,pemasaranWeight:30};case"custom":return{simpananWeight:50,jasaUsahaWeight:50}}}function Er(r){return r==null?null:JSON.stringify(r)}function bn(r){if(r==null)return null;if(typeof r=="string")try{return JSON.parse(r)}catch{return null}return typeof r=="object"?r:null}function Ze(r){return{...r,participationWeights:bn(r.participationWeights)}}var Xe=class{constructor(e,t={}){this.repos=e;this.options=t;this.newId=D("shu-config")}async getActiveShuConfig(e){return b((async()=>{let t=await this.repos.shuConfigRepository.getActive(e);return t?Ze(t):null})())}async upsertShuConfig(e){return b((async()=>{var s,d,c,m,p,u,h,y,I;xr(e);let t={koperasiId:e.koperasiId,tenantId:e.tenantId,branchId:e.branchId},a=(s=(await this.repos.shuConfigRepository.list(t)).find(v=>v.effectiveDate===e.effectiveDate))!=null?s:null,i=g();if(a){let v=await this.repos.shuConfigRepository.upsert({...a,...e,notes:(d=e.notes)!=null?d:null,approvalRef:(c=e.approvalRef)!=null?c:null,formulaModel:(m=e.formulaModel)!=null?m:null,participationWeights:Er(e.participationWeights),version:a.version+1,lastModified:i});return await S(this.options,{name:"shu.config-upserted",occurredAt:g(),entityId:v.id,tenantId:v.tenantId,branchId:v.branchId,payload:{cadanganPercent:v.cadanganPercent,jasaModalPercent:v.jasaModalPercent,jasaUsahaPercent:v.jasaUsahaPercent,notes:(p=v.notes)!=null?p:null,effectiveDate:v.effectiveDate}}),Ze(v)}let o=await this.repos.shuConfigRepository.upsert({id:this.newId(),...e,notes:(u=e.notes)!=null?u:null,approvalRef:(h=e.approvalRef)!=null?h:null,formulaModel:(y=e.formulaModel)!=null?y:null,participationWeights:Er(e.participationWeights),version:1,lastModified:i,deleted:!1});return await S(this.options,{name:"shu.config-upserted",occurredAt:g(),entityId:o.id,tenantId:o.tenantId,branchId:o.branchId,payload:{cadanganPercent:o.cadanganPercent,jasaModalPercent:o.jasaModalPercent,jasaUsahaPercent:o.jasaUsahaPercent,notes:(I=o.notes)!=null?I:null,effectiveDate:o.effectiveDate}}),Ze(o)})())}async listShuConfigs(e,t={}){return b((async()=>(await this.repos.shuConfigRepository.list(e,t)).map(a=>Ze(a)))())}async getDefaultParticipationWeights(e){return b(Promise.resolve(Or(e)))}};function Lr(r){var e,t,n,a;if(!((e=r.periodCode)!=null&&e.trim()))throw l("periodCode is required");if(!((t=r.startDate)!=null&&t.trim()))throw l("startDate is required");if(!((n=r.endDate)!=null&&n.trim()))throw l("endDate is required");if(!((a=r.tenantId)!=null&&a.trim()))throw l("tenantId is required")}var et=class{constructor(e,t,n={}){this.db=e;this.repos=t;this.options=n;this.newPeriodId=D("shu-period");this.newAllocationId=D("shu-allocation")}async inTx(e){return this.db.transaction(async t=>e(te(t)))}toDateOnly(e){return e.slice(0,10)}dateToUtcMs(e){return Date.parse(`${this.toDateOnly(e)}T00:00:00.000Z`)}diffDaysInclusive(e,t){let n=this.dateToUtcMs(t)-this.dateToUtcMs(e);return Math.floor(n/864e5)+1}getEligibleWindow(e,t,n){if(e.status!=="active"&&e.status!=="exited")return null;let a=this.toDateOnly(e.joinDate),i=e.exitDate?this.toDateOnly(e.exitDate):null;if(e.status==="exited"&&!i)return null;let o=a>t?a:t,s=i&&i<n?i:n;if(o>s)return null;let d=this.diffDaysInclusive(o,s),c=this.diffDaysInclusive(t,n);return{start:o,end:s,activeDays:d,proRataFactor:c>0?d/c:0}}applySavingEntryToBalance(e,t,n){var i;let a=t.entryType==="debit"?-1:1;if(t.savingType==="pokok"&&(e.pokok+=a*t.amount),t.savingType==="wajib"&&(e.wajib+=a*t.amount),t.savingType==="sukarela"){if(!n||n.size===0)return;let o=((i=t.referenceType)!=null?i:"").trim();if(!n.has(o))return;e.sukarela+=a*t.amount}}async computeAverageModalBasis(e){var p,u;let n=(await e.repos.savingLedgerRepository.listByMember(e.memberId,{includeDeleted:!1,dateTo:e.periodEnd,tenantId:(p=e.tenantId)!=null?p:void 0,branchId:(u=e.branchId)!=null?u:void 0})).slice().sort((h,y)=>this.toDateOnly(h.transactionDate).localeCompare(this.toDateOnly(y.transactionDate))),a={pokok:0,wajib:0,sukarela:0},i=this.dateToUtcMs(e.activeStart),o=this.dateToUtcMs(e.activeEnd)+864e5,s=this.diffDaysInclusive(e.periodStart,e.periodEnd),d=0,c=this.dateToUtcMs(e.periodStart),m=0;for(;m<n.length&&this.dateToUtcMs(n[m].transactionDate)<c;)this.applySavingEntryToBalance(a,n[m],e.includeSukarela?e.allowedSukarelaReferenceTypes:null),m+=1;for(;c<o;){let h=m<n.length?this.dateToUtcMs(n[m].transactionDate):o,y=Math.min(h,o);if(y>c){let I=Math.max(c,i),v=Math.min(y,o);if(v>I){let R=Math.floor((v-I)/864e5),C=a.pokok+a.wajib+(e.includeSukarela?a.sukarela:0);d+=C*R}c=y}else c+=864e5;for(;m<n.length&&this.dateToUtcMs(n[m].transactionDate)===y;)this.applySavingEntryToBalance(a,n[m],e.includeSukarela?e.allowedSukarelaReferenceTypes:null),m+=1}return s>0?d/s:0}allocateWithLargestRemainder(e){var d;let t=e.members.reduce((c,m)=>c+m.score,0);if(t<=0)throw l("SHU allocation requires non-zero total score; escalate to RAT decision");let n=new Map,a=e.members.map(c=>{let m=e.poolAmount*c.score/t,p=Math.floor(m);return n.set(c.memberId,p),{memberId:c.memberId,remainder:m-p}}),i=Array.from(n.values()).reduce((c,m)=>c+m,0),o=e.poolAmount-i;a.sort((c,m)=>m.remainder!==c.remainder?m.remainder-c.remainder:c.memberId.localeCompare(m.memberId));let s=0;for(;o>0&&a.length>0;){let c=a[s%a.length];n.set(c.memberId,((d=n.get(c.memberId))!=null?d:0)+1),o-=1,s+=1}return n}async createShuPeriod(e){return b((async()=>{var n;Lr(e);let t=await this.repos.shuPeriodRepository.create({id:this.newPeriodId(),periodCode:e.periodCode,startDate:e.startDate,endDate:e.endDate,status:"draft",formulaSnapshot:je(e.formulaSnapshot),branchId:e.branchId,tenantId:e.tenantId,version:1,lastModified:g(),deleted:!1});return(n=this.options.logger)==null||n.logInfo("[ofcoop] shu period created",{periodId:t.id,periodCode:t.periodCode}),await S(this.options,{name:"shu.period-created",occurredAt:g(),entityId:t.id,tenantId:t.tenantId,branchId:t.branchId,payload:{periodCode:t.periodCode,startDate:t.startDate,endDate:t.endDate}}),t})())}async finalizeShuPeriod(e){return b((async()=>{let t=await this.repos.shuPeriodRepository.getById(e);if(!t||t.deleted)throw w("SHU period",e);let n=await this.repos.shuPeriodRepository.update(e,{status:"finalized",version:t.version+1,lastModified:g()});return await S(this.options,{name:"shu.period-finalized",occurredAt:g(),entityId:n.id,tenantId:n.tenantId,branchId:n.branchId,payload:{status:n.status}}),n})())}async listShuPeriods(e={}){return b((async()=>(await this.repos.shuPeriodRepository.list({includeDeleted:e.includeDeleted,tenantId:e.tenantId,branchId:e.branchId})).filter(n=>{if(e.status&&n.status!==e.status)return!1;if(e.dateContains){let a=e.dateContains.slice(0,10);if(n.startDate>a||n.endDate<a)return!1}return!0}))())}async generateShuAllocations(e){return b(this.inTx(async t=>{var c,m,p,u,h,y,I,v,R,C,P,k,M,O,T,j,B,q,L,N,V,se,ve,de,Ie,Re,ce,Se,Ce,le,we;let n=await t.shuPeriodRepository.getById(e);if(!n||n.deleted)throw w("SHU period",e);let a=await t.memberRepository.list({includeDeleted:!1,tenantId:(c=n.tenantId)!=null?c:void 0,branchId:(m=n.branchId)!=null?m:void 0});if(a.length===0)return[];let i=n.formulaSnapshot,o=String((p=i.distributionMode)!=null?p:"equal-share"),s=[];if(o==="score-weighted-v1"){let G=this.toDateOnly(n.startDate),$=this.toDateOnly(n.endDate),Q=Number((h=(u=i.shuTahunBukuIdr)!=null?u:i.totalDistributableShuIdr)!=null?h:0),K=Number((y=i.cadanganPercent)!=null?y:0),W=Number((I=i.poolAnggotaPercent)!=null?I:0),z=Number((v=i.bobotTransaksiPercent)!=null?v:0),Y=Number((R=i.bobotModalPercent)!=null?R:0),H=!!((C=i.includeSukarelaInModalBasis)!=null&&C),Z=Array.isArray(i.sukarelaModalReferenceTypes)?i.sukarelaModalReferenceTypes.map(E=>String(E).trim()).filter(E=>E.length>0):[],me=new Set(Z),ne=i.transactionScoreByMemberId&&typeof i.transactionScoreByMemberId=="object"?i.transactionScoreByMemberId:{};if(!Number.isFinite(Q)||Q<=0)throw l("shuTahunBukuIdr must be provided for score-weighted-v1 allocation");if(!Number.isFinite(K)||K<0||K>100)throw l("cadanganPercent must be in range 0-100 for score-weighted-v1 allocation");if(!Number.isFinite(W)||W<0||W>100)throw l("poolAnggotaPercent must be in range 0-100 for score-weighted-v1 allocation");if(!Number.isFinite(z)||!Number.isFinite(Y)||z<0||Y<0||z+Y!==100)throw l("bobotTransaksiPercent + bobotModalPercent must equal 100 for score-weighted-v1 allocation");let ue=Math.max(0,Math.floor(Q-Q*K/100)),ae=Math.max(0,Math.floor(ue*W/100));if(ae<=0)return[];let X=[];for(let E of a){let J=this.getEligibleWindow(E,G,$);if(!J)continue;let xe=await this.computeAverageModalBasis({memberId:E.id,tenantId:n.tenantId,branchId:n.branchId,periodStart:G,periodEnd:$,activeStart:J.start,activeEnd:J.end,includeSukarela:H,allowedSukarelaReferenceTypes:me,repos:t}),ge=Number((P=ne[E.id])!=null?P:0),Pe=Number.isFinite(ge)&&ge>0?ge*J.proRataFactor:0,Oe=xe>0?xe:0,Ee=z/100*Pe+Y/100*Oe;X.push({member:E,proRataFactor:J.proRataFactor,modalScore:Oe,transaksiScore:Pe,score:Ee,activeDays:J.activeDays})}let oe=X.filter(E=>E.score>0),pe=this.allocateWithLargestRemainder({poolAmount:ae,members:oe.map(E=>({memberId:E.member.id,score:E.score}))});for(let E of oe)s.push({id:this.newAllocationId(),shuPeriodId:e,memberId:E.member.id,allocationAmount:(k=pe.get(E.member.id))!=null?k:0,calculationBasis:{mode:"score-weighted-v1",shuTahunBukuIdr:Q,cadanganPercent:K,shuSetelahCadangan:ue,poolAnggotaPercent:W,poolShuAnggota:ae,bobotTransaksiPercent:z,bobotModalPercent:Y,includeSukarelaInModalBasis:H,sukarelaModalReferenceTypes:Z,proRataFactor:E.proRataFactor,activeDays:E.activeDays,transaksiScore:E.transaksiScore,modalScore:E.modalScore,score:E.score},branchId:(M=E.member.branchId)!=null?M:n.branchId,tenantId:(O=E.member.tenantId)!=null?O:n.tenantId,version:1,lastModified:g(),deleted:!1})}else if(o==="jma-jua-v1"){let G=this.toDateOnly(n.startDate),$=this.toDateOnly(n.endDate),Q=Number((T=i.shuTahunBukuIdr)!=null?T:0),K=Number((j=i.cadanganPercent)!=null?j:0),W=Number((B=i.pendidikanPercent)!=null?B:0),z=Number((q=i.sosialPercent)!=null?q:0),Y=Number((L=i.pengurusPercent)!=null?L:0),H=Number((N=i.jasaModalPercent)!=null?N:0),Z=Number((V=i.jasaUsahaPercent)!=null?V:0),me=!!((se=i.includeSukarelaInModalBasis)!=null&&se),ne=Array.isArray(i.sukarelaModalReferenceTypes)?i.sukarelaModalReferenceTypes.map(x=>String(x).trim()).filter(x=>x.length>0):[],ue=new Set(ne),ae=K+W+z+Y+H+Z;if(Math.abs(ae-100)>.01)throw l(`jma-jua-v1: cadanganPercent+pendidikanPercent+sosialPercent+pengurusPercent+jasaModalPercent+jasaUsahaPercent must sum to 100, got ${ae}`);let X=Math.floor(Q*(H+Z)/100),oe=H+Z,pe=oe>0?Math.floor(X*H/oe):0,E=X-pe;if(X<=0)return[];let J=[],xe=await t.shuParticipationEntryRepository.listByPeriod(e,{includeDeleted:!1}),ge=new Map;for(let x of xe){let ee=(ve=ge.get(x.memberId))!=null?ve:0;ge.set(x.memberId,ee+x.amount)}for(let x of a){let ee=this.getEligibleWindow(x,G,$);if(!ee)continue;let Ae=await this.computeAverageModalBasis({memberId:x.id,tenantId:n.tenantId,branchId:n.branchId,periodStart:G,periodEnd:$,activeStart:ee.start,activeEnd:ee.end,includeSukarela:me,allowedSukarelaReferenceTypes:ue,repos:t}),Le=(de=ge.get(x.id))!=null?de:0;Ae<=0&&Le<=0||J.push({member:x,proRataFactor:ee.proRataFactor,activeDays:ee.activeDays,modalBasis:Ae,juaScore:Le})}if(J.length===0)return[];let Pe=J.filter(x=>x.modalBasis>0),Oe=Pe.length>0?this.allocateWithLargestRemainder({poolAmount:pe,members:Pe.map(x=>({memberId:x.member.id,score:x.modalBasis}))}):new Map,Ee=J.filter(x=>x.juaScore>0),en=Ee.length>0?this.allocateWithLargestRemainder({poolAmount:E,members:Ee.map(x=>({memberId:x.member.id,score:x.juaScore}))}):new Map;for(let x of J){let ee=(Ie=Oe.get(x.member.id))!=null?Ie:0,Ae=(Re=en.get(x.member.id))!=null?Re:0,Le=ee+Ae;s.push({id:this.newAllocationId(),shuPeriodId:e,memberId:x.member.id,allocationAmount:Le,calculationBasis:{mode:"jma-jua-v1",shuTahunBukuIdr:Q,shuDibagikan:X,jasaModalPercent:H,jasaUsahaPercent:Z,poolJMA:pe,poolJUA:E,includeSukarelaInModalBasis:me,sukarelaModalReferenceTypes:ne,proRataFactor:x.proRataFactor,activeDays:x.activeDays,modalScore:x.modalBasis,juaScore:x.juaScore,jmaAmount:ee,juaAmount:Ae},branchId:(ce=x.member.branchId)!=null?ce:n.branchId,tenantId:(Se=x.member.tenantId)!=null?Se:n.tenantId,version:1,lastModified:g(),deleted:!1})}}else{let G=a.filter(W=>W.status==="active");if(G.length===0)return[];let $=Number(i.totalDistributableShuIdr||0),Q=Number.isFinite($)&&$>0?$:G.length*1e5,K=Math.floor(Q/G.length);for(let W of G)s.push({id:this.newAllocationId(),shuPeriodId:e,memberId:W.id,allocationAmount:K,calculationBasis:{mode:"equal-share",memberCount:G.length,sourceTotal:Q},branchId:(Ce=W.branchId)!=null?Ce:n.branchId,tenantId:(le=W.tenantId)!=null?le:n.tenantId,version:1,lastModified:g(),deleted:!1})}let d=await t.shuAllocationRepository.createMany(s);return(we=this.options.logger)==null||we.logInfo("[ofcoop] shu allocations generated",{periodId:e,allocations:d.length}),await S(this.options,{name:"shu.allocations-generated",occurredAt:g(),entityId:e,tenantId:n.tenantId,branchId:n.branchId,payload:{allocations:d.length}}),d}))}async listShuAllocations(e,t={}){return b(this.repos.shuAllocationRepository.listByPeriod(e,t))}async exportShuAllocationsCsv(e){return b((async()=>{let n=["allocationId,shuPeriodId,memberId,allocationAmount",...A(await this.listShuAllocations(e,{includeDeleted:!1})).map(a=>`${a.id},${a.shuPeriodId},${a.memberId},${a.allocationAmount}`)].join(`
|
|
6
|
+
`);return{filename:`shu-allocations-${e}.csv`,contentType:"text/csv",body:n}})())}};function Br(r){var e,t,n,a,i;if(!((e=r.proposedMemberId)!=null&&e.trim()))throw l("proposedMemberId is required");if(!((t=r.positionTitle)!=null&&t.trim()))throw l("positionTitle is required");if(!((n=r.effectiveDate)!=null&&n.trim()))throw l("effectiveDate is required");if(!((a=r.roleType)!=null&&a.trim()))throw l("roleType is required");if(!((i=r.appointmentType)!=null&&i.trim()))throw l("appointmentType is required")}function jr(r){var e;if(!((e=r.endorsedBy)!=null&&e.trim()))throw l("endorsedBy is required")}function Ro(r){}function Nr(r){var e;if(!((e=r.rejectionReason)!=null&&e.trim()))throw l("rejectionReason is required")}var tt=class{constructor(e,t={}){this.repos=e;this.options=t;this.newId=D("leadership-appointment")}async proposeAppointment(e){return b((async()=>{var a,i,o,s;Br(e);let t=g(),n=await this.repos.leadershipAppointmentRepository.create({id:this.newId(),proposedMemberId:e.proposedMemberId,roleType:e.roleType,positionTitle:e.positionTitle.trim(),appointmentType:e.appointmentType,replacesTermId:(a=e.replacesTermId)!=null?a:null,governanceMeetingRef:(i=e.governanceMeetingRef)!=null?i:null,status:"proposed",effectiveDate:e.effectiveDate,endDate:(o=e.endDate)!=null?o:null,proposedAt:t,endorsedAt:null,endorsedBy:null,approvedAt:null,approvalRef:null,installedAt:null,installedTermId:null,rejectedAt:null,rejectionReason:null,notes:(s=e.notes)!=null?s:null,tenantId:e.tenantId,branchId:e.branchId,version:1,lastModified:t,deleted:!1});return await S(this.options,{name:"governance.appointment-proposed",occurredAt:g(),entityId:n.id,tenantId:n.tenantId,branchId:n.branchId,payload:{proposedMemberId:n.proposedMemberId,roleType:n.roleType}}),n})())}async endorseAppointment(e,t){return b((async()=>{var o,s,d;jr(t);let n=await this.repos.leadershipAppointmentRepository.getById(e);if(!n||n.deleted)throw w("LeadershipAppointment",e);if(n.status!=="proposed")throw l(`Appointment must be in 'proposed' status to endorse, got '${n.status}'`);let a=g(),i=await this.repos.leadershipAppointmentRepository.update(e,{status:"endorsed",endorsedBy:t.endorsedBy,endorsedAt:(o=t.endorsedAt)!=null?o:a,governanceMeetingRef:(d=(s=t.governanceMeetingRef)!=null?s:n.governanceMeetingRef)!=null?d:null,version:n.version+1,lastModified:a});return await S(this.options,{name:"governance.appointment-endorsed",occurredAt:g(),entityId:i.id,tenantId:i.tenantId,branchId:i.branchId,payload:{endorsedBy:i.endorsedBy}}),i})())}async approveAppointment(e,t){return b((async()=>{var o,s;let n=await this.repos.leadershipAppointmentRepository.getById(e);if(!n||n.deleted)throw w("LeadershipAppointment",e);if(n.status!=="endorsed")throw l(`Appointment must be in 'endorsed' status to approve, got '${n.status}'`);let a=g(),i=await this.repos.leadershipAppointmentRepository.update(e,{status:"approved",approvedAt:(o=t.approvedAt)!=null?o:a,approvalRef:(s=t.approvalRef)!=null?s:null,version:n.version+1,lastModified:a});return await S(this.options,{name:"governance.appointment-approved",occurredAt:g(),entityId:i.id,tenantId:i.tenantId,branchId:i.branchId,payload:{approvalRef:i.approvalRef}}),i})())}async installAppointment(e,t){return b((async()=>{var c,m,p,u;let n=await this.repos.leadershipAppointmentRepository.getById(e);if(!n||n.deleted)throw w("LeadershipAppointment",e);if(n.status!=="approved")throw l(`Appointment must be in 'approved' status to install, got '${n.status}'`);let a=g(),i=(c=t==null?void 0:t.installedAt)!=null?c:a;if(n.replacesTermId){let h=await this.repos.leadershipTermRepository.getById(n.replacesTermId);h&&!h.deleted&&h.status==="active"&&await this.repos.leadershipTermRepository.update(n.replacesTermId,{status:"ended",endDate:n.effectiveDate,version:h.version+1,lastModified:a})}let o=D("leadership-term")(),s=await this.repos.leadershipTermRepository.create({id:o,memberId:n.proposedMemberId,roleType:n.roleType,positionTitle:n.positionTitle,startDate:n.effectiveDate,endDate:(m=n.endDate)!=null?m:null,handoverFromTermId:(p=n.replacesTermId)!=null?p:null,status:"active",notes:(u=n.notes)!=null?u:null,tenantId:n.tenantId,branchId:n.branchId,version:1,lastModified:a,deleted:!1}),d=await this.repos.leadershipAppointmentRepository.update(e,{status:"installed",installedAt:i,installedTermId:s.id,version:n.version+1,lastModified:a});return await S(this.options,{name:"governance.appointment-installed",occurredAt:g(),entityId:d.id,tenantId:d.tenantId,branchId:d.branchId,payload:{installedTermId:s.id,proposedMemberId:n.proposedMemberId}}),d})())}async rejectAppointment(e,t){return b((async()=>{var o;Nr(t);let n=await this.repos.leadershipAppointmentRepository.getById(e);if(!n||n.deleted)throw w("LeadershipAppointment",e);if(n.status==="installed")throw l("Cannot reject an already installed appointment");let a=g(),i=await this.repos.leadershipAppointmentRepository.update(e,{status:"rejected",rejectedAt:(o=t.rejectedAt)!=null?o:a,rejectionReason:t.rejectionReason,version:n.version+1,lastModified:a});return await S(this.options,{name:"governance.appointment-rejected",occurredAt:g(),entityId:i.id,tenantId:i.tenantId,branchId:i.branchId,payload:{rejectionReason:i.rejectionReason}}),i})())}async getAppointmentById(e){return b((async()=>{let t=await this.repos.leadershipAppointmentRepository.getById(e);return!t||t.deleted?null:t})())}async listAppointments(e){return b(this.repos.leadershipAppointmentRepository.list(e))}};function Lt(r){var e,t,n;if(!((e=r.shuPeriodId)!=null&&e.trim()))throw l("shuPeriodId is required");if(!((t=r.memberId)!=null&&t.trim()))throw l("memberId is required");if(!((n=r.participationType)!=null&&n.trim()))throw l("participationType is required");if(!Number.isFinite(r.amount)||r.amount<0)throw l("amount must be >= 0")}var rt=class{constructor(e,t={}){this.repos=e;this.options=t;this.newId=D("shu-participation")}async recordParticipation(e){return b((async()=>{var n,a;Lt(e);let t=await this.repos.shuParticipationEntryRepository.create({id:this.newId(),shuPeriodId:e.shuPeriodId,memberId:e.memberId,participationType:e.participationType,amount:e.amount,notes:(n=e.notes)!=null?n:null,tenantId:e.tenantId,branchId:e.branchId,version:1,lastModified:g(),deleted:!1});return(a=this.options.logger)==null||a.logInfo("[ofcoop] shu participation recorded",{entryId:t.id,memberId:t.memberId,periodId:t.shuPeriodId}),await S(this.options,{name:"shu.participation-recorded",occurredAt:g(),entityId:t.id,tenantId:t.tenantId,branchId:t.branchId,payload:{memberId:t.memberId,shuPeriodId:t.shuPeriodId,participationType:t.participationType}}),t})())}async bulkRecordParticipation(e){return b((async()=>{var a,i;let t=[];for(let o of e.entries)Lt(o),t.push({id:this.newId(),shuPeriodId:o.shuPeriodId,memberId:o.memberId,participationType:o.participationType,amount:o.amount,notes:(a=o.notes)!=null?a:null,tenantId:o.tenantId,branchId:o.branchId,version:1,lastModified:g(),deleted:!1});let n=await this.repos.shuParticipationEntryRepository.createMany(t);return(i=this.options.logger)==null||i.logInfo("[ofcoop] shu participation bulk recorded",{count:n.length}),await S(this.options,{name:"shu.participation-bulk-recorded",occurredAt:g(),payload:{count:n.length}}),n})())}async listParticipationByPeriod(e,t={}){return b(this.repos.shuParticipationEntryRepository.listByPeriod(e,t))}async summarizeParticipationByPeriod(e,t={}){return b((async()=>{var i;let n=await this.repos.shuParticipationEntryRepository.listByPeriod(e,t),a=new Map;for(let o of n){let s=a.get(o.memberId);s||(s={memberId:o.memberId,totalByType:{},grandTotal:0},a.set(o.memberId,s));let d=(i=s.totalByType[o.participationType])!=null?i:0;s.totalByType[o.participationType]=d+o.amount,s.grandTotal+=o.amount}return Array.from(a.values())})())}};function qr(r){var e,t,n;if(!((e=r.tenantId)!=null&&e.trim()))throw l("tenantId is required");if(!((t=r.displayName)!=null&&t.trim()))throw l("displayName is required");if(!((n=r.profileType)!=null&&n.trim()))throw l("profileType is required")}function re(r){return r==null?null:JSON.stringify(r)}function ke(r){if(r==null)return null;if(typeof r=="string")try{return JSON.parse(r)}catch{return null}return typeof r=="object"?r:null}function De(r){return{...r,savingRequirements:ke(r.savingRequirements),shuRules:ke(r.shuRules),membershipRequirements:ke(r.membershipRequirements),governanceRules:ke(r.governanceRules),customFields:ke(r.customFields)}}var nt=class{constructor(e,t={}){this.repos=e;this.options=t;this.newId=D("community-profile")}async createCommunityProfile(e){return b((async()=>{var n,a,i;qr(e);let t=await this.repos.communityProfileRepository.create({id:this.newId(),tenantId:e.tenantId,branchId:e.branchId,profileType:e.profileType,displayName:e.displayName,description:(n=e.description)!=null?n:null,savingRequirements:re(e.savingRequirements),shuRules:re(e.shuRules),membershipRequirements:re(e.membershipRequirements),governanceRules:re(e.governanceRules),customFields:re(e.customFields),isActive:!0,notes:(a=e.notes)!=null?a:null,version:1,lastModified:g(),deleted:!1});return(i=this.options.logger)==null||i.logInfo("[ofcoop] community profile created",{profileId:t.id,tenantId:t.tenantId}),await S(this.options,{name:"community-profile.created",occurredAt:g(),entityId:t.id,tenantId:t.tenantId,branchId:t.branchId,payload:{profileType:t.profileType,displayName:t.displayName}}),De(t)})())}async updateCommunityProfile(e,t){return b((async()=>{let n=await this.repos.communityProfileRepository.getById(e);if(!n||n.deleted)throw w("CommunityProfile",e);let a={version:n.version+1,lastModified:g()};t.displayName!==void 0&&(a.displayName=t.displayName),t.description!==void 0&&(a.description=t.description),t.savingRequirements!==void 0&&(a.savingRequirements=re(t.savingRequirements)),t.shuRules!==void 0&&(a.shuRules=re(t.shuRules)),t.membershipRequirements!==void 0&&(a.membershipRequirements=re(t.membershipRequirements)),t.governanceRules!==void 0&&(a.governanceRules=re(t.governanceRules)),t.customFields!==void 0&&(a.customFields=re(t.customFields)),t.isActive!==void 0&&(a.isActive=t.isActive),t.notes!==void 0&&(a.notes=t.notes);let i=await this.repos.communityProfileRepository.update(e,a);return await S(this.options,{name:"community-profile.updated",occurredAt:g(),entityId:i.id,tenantId:i.tenantId,branchId:i.branchId,payload:{profileType:i.profileType}}),De(i)})())}async getCommunityProfileById(e){return b((async()=>{let t=await this.repos.communityProfileRepository.getById(e);return!t||t.deleted?null:De(t)})())}async getActiveCommunityProfile(e,t){return b((async()=>{let n=await this.repos.communityProfileRepository.list({includeDeleted:!1,isActive:!0,tenantId:e,branchId:t});return n.length>0?De(n[0]):null})())}async listCommunityProfiles(e={}){return b((async()=>(await this.repos.communityProfileRepository.list(e)).map(n=>De(n)))())}};function Wr(r){var e,t,n;if(!((e=r.memberId)!=null&&e.trim()))throw l("memberId is required");if(!((t=r.fullName)!=null&&t.trim()))throw l("fullName is required");if(!((n=r.relationship)!=null&&n.trim()))throw l("relationship is required")}var at=class{constructor(e,t={}){this.repos=e;this.options=t;this.newId=D("member-dependent")}async addDependent(e){return b((async()=>{var n,a,i,o,s;Wr(e);let t=await this.repos.memberDependentRepository.create({id:this.newId(),memberId:e.memberId,fullName:e.fullName,relationship:e.relationship,birthDate:(n=e.birthDate)!=null?n:null,idNumber:(a=e.idNumber)!=null?a:null,isInsuranceBeneficiary:(i=e.isInsuranceBeneficiary)!=null?i:!1,notes:(o=e.notes)!=null?o:null,tenantId:e.tenantId,branchId:e.branchId,version:1,lastModified:g(),deleted:!1});return(s=this.options.logger)==null||s.logInfo("[ofcoop] member dependent added",{dependentId:t.id,memberId:t.memberId}),await S(this.options,{name:"member.dependent-added",occurredAt:g(),entityId:t.id,tenantId:t.tenantId,branchId:t.branchId,payload:{memberId:t.memberId,relationship:t.relationship}}),t})())}async updateDependent(e,t){return b((async()=>{let n=await this.repos.memberDependentRepository.getById(e);if(!n||n.deleted)throw w("MemberDependent",e);let a={version:n.version+1,lastModified:g()};t.fullName!==void 0&&(a.fullName=t.fullName),t.relationship!==void 0&&(a.relationship=t.relationship),t.birthDate!==void 0&&(a.birthDate=t.birthDate),t.idNumber!==void 0&&(a.idNumber=t.idNumber),t.isInsuranceBeneficiary!==void 0&&(a.isInsuranceBeneficiary=t.isInsuranceBeneficiary),t.notes!==void 0&&(a.notes=t.notes);let i=await this.repos.memberDependentRepository.update(e,a);return await S(this.options,{name:"member.dependent-updated",occurredAt:g(),entityId:i.id,tenantId:i.tenantId,branchId:i.branchId,payload:{memberId:i.memberId}}),i})())}async removeDependent(e){return b((async()=>{let t=await this.repos.memberDependentRepository.getById(e);if(!t||t.deleted)throw w("MemberDependent",e);let n=await this.repos.memberDependentRepository.update(e,{deleted:!0,version:t.version+1,lastModified:g()});return await S(this.options,{name:"member.dependent-removed",occurredAt:g(),entityId:n.id,tenantId:n.tenantId,branchId:n.branchId,payload:{memberId:n.memberId}}),n})())}async listDependentsByMember(e,t={}){return b(this.repos.memberDependentRepository.listByMember(e,t))}async getDependentById(e){return b((async()=>{let t=await this.repos.memberDependentRepository.getById(e);return!t||t.deleted?null:t})())}};async function Fr(r,e={}){let t=te(r),n=new We(r,t,e),a=new Ne(t,e),i=new Ue(r,t,e),o=new _e(t,e),s=new Ge(t,e),d=new $e(t,e),c=new He(t,e),m=new Ke(t,e),p=new ze(r,t,e),u=new Ye(t,e),h=new Je(t),y=new Xe(t,e),I=new et(r,t,e),v=new tt(t,e),R=new rt(t,e),C=new nt(t,e),P=new at(t,e),k=new Fe({leadershipTermService:o,managementReportService:s,riskRegisterService:c,whistleReportService:m});return{memberService:n,memberNumberPolicyService:a,complianceReadinessService:k,governanceMeetingService:i,leadershipTermService:o,managementReportService:s,oversightPolicyService:d,riskRegisterService:c,whistleReportService:m,savingLedgerService:p,savingPolicyService:u,savingComplianceSnapshotService:h,shuConfigService:y,shuService:I,leadershipAppointmentService:v,shuParticipationEntryService:R,communityProfileService:C,memberDependentService:P}}var it=class{constructor(e){this.context=e;this.dbTable="ofcoop_users"}setActiveSession(e){this.activeSession=e}logoutLocal(){this.activeSession=void 0}getActiveSession(){return this.activeSession}async fetchUsers(e){var n;let t=(n=this.context.registry)==null?void 0:n.dbAdapter;return t?t.query(this.dbTable,e):[]}};function Sn(r){return r.startsWith("member.")?f.members:r.startsWith("governance.meeting-")?f.governanceMeetings:r.startsWith("governance.agenda-")?f.governanceAgendaItems:r==="governance.vote-recorded"?f.governanceVotes:r.startsWith("governance.leadership-term-")?f.leadershipTerms:r.startsWith("governance.management-report-")?f.managementReports:r.startsWith("oversight.policy-")?f.oversightPolicies:r.startsWith("risk.item-")?f.riskRegisters:r.startsWith("whistle.report-")?f.whistleReports:r.startsWith("saving.entry-")?f.savingEntries:r.startsWith("saving.policy-")?f.savingPolicies:r.startsWith("shu.config-")?f.shuConfigs:r.startsWith("shu.period-")?f.shuPeriods:r.startsWith("shu.allocations-")?f.shuAllocations:null}function Cn(r){return r.endsWith(".created")||r.endsWith("-created")||r.endsWith("-generated")||r.endsWith("-recorded")?"INSERT":"UPDATE"}var Bt=class{constructor(e,t){this.runtime=e;this.runtimeStateStore=t;this.runtimeStore=In(this.runtimeStateStore)}static builder(){return new jt}get registry(){return this.runtime.registry}async start(e={}){this.runtimeStateStore.setState({phase:"starting",started:!1,lastError:null,lastTransitionAt:new Date().toISOString()});try{await this.runtime.start(e),this.domainServices=this.runtime.domainServices,this.runtimeStateStore.setState(t=>({...t,phase:"started",started:!0,startCount:t.startCount+1,lastError:null,lastTransitionAt:new Date().toISOString()}))}catch(t){throw this.runtimeStateStore.setState({phase:"error",started:!1,lastError:t instanceof Error?t.message:String(t),lastTransitionAt:new Date().toISOString()}),t}}async init(e={}){this.runtimeStateStore.setState({phase:"starting",started:!1,lastError:null,lastTransitionAt:new Date().toISOString()});try{await this.runtime.init(e),this.domainServices=this.runtime.domainServices,this.runtimeStateStore.setState(t=>({...t,phase:"started",started:!0,startCount:t.startCount+1,lastError:null,lastTransitionAt:new Date().toISOString()}))}catch(t){throw this.runtimeStateStore.setState({phase:"error",started:!1,lastError:t instanceof Error?t.message:String(t),lastTransitionAt:new Date().toISOString()}),t}}async stop(){this.runtimeStateStore.setState({phase:"stopping",started:this.runtime.isStarted(),lastError:null,lastTransitionAt:new Date().toISOString()});try{await this.runtime.stop(),this.runtimeStateStore.setState(e=>({...e,phase:"stopped",started:!1,stopCount:e.stopCount+1,lastError:null,lastTransitionAt:new Date().toISOString()}))}catch(e){throw this.runtimeStateStore.setState({phase:"error",started:this.runtime.isStarted(),lastError:e instanceof Error?e.message:String(e),lastTransitionAt:new Date().toISOString()}),e}}async restart(){this.runtimeStateStore.setState({phase:"starting",started:this.runtime.isStarted(),lastError:null,lastTransitionAt:new Date().toISOString()});try{await this.runtime.restart(),this.domainServices=this.runtime.domainServices,this.runtimeStateStore.setState(e=>({...e,phase:"started",started:!0,startCount:e.startCount+1,lastError:null,lastTransitionAt:new Date().toISOString()}))}catch(e){throw this.runtimeStateStore.setState({phase:"error",started:this.runtime.isStarted(),lastError:e instanceof Error?e.message:String(e),lastTransitionAt:new Date().toISOString()}),e}}isStarted(){return this.runtime.isStarted()}createCorrelationId(e="ofcoop"){return this.runtime.createCorrelationId(e)}use(e,t,n=[]){return this.runtime.use(e,async()=>t(this),n),this}},jt=class{constructor(){this.runtimeBuilder=vn.builder();this.domainServiceOverrides={};this.runtimeHooks={};this.extraServiceOptions={};this.runtimeBuilder.withDbAdapter(()=>new Ur)}withPlatformAdapter(e){return this.runtimeBuilder.withPlatformAdapter(e),this}withDbAdapter(e){return this.runtimeBuilder.withDbAdapter(e),this}withHttpAdapter(e){return this.runtimeBuilder.withHttpAdapter(e),this}withSocketAdapter(e){return this.runtimeBuilder.withSocketAdapter(e),this}withLoggerAdapter(e){return this.runtimeBuilder.withLoggerAdapter(e),this}withActivitySink(e){return this.runtimeBuilder.withActivitySink(e),this}withExtension(e,t){return this.runtimeBuilder.withExtension(e,t),this}withDomainServicesFactory(e){return this.domainServicesFactory=e,this}overrideDomainServices(e){return this.domainServiceOverrides={...this.domainServiceOverrides,...e},this}withRuntimeHooks(e){return this.runtimeHooks={...this.runtimeHooks,...e},this}withMigrationRunner(e){return this.withRuntimeHooks({runMigrations:e})}withDomainEventSink(e){return this.domainEventSink=e,this}withServiceRuntimeOptions(e){return this.extraServiceOptions={...this.extraServiceOptions,...e},this}build(){var i;let e=Rn({phase:"idle",started:!1,startCount:0,stopCount:0,lastError:null,lastTransitionAt:new Date().toISOString()}),t=async o=>{var d,c;let s=(d=o.registry)==null?void 0:d.dbAdapter;s&&await Vt(s,(c=o.registry)==null?void 0:c.loggerAdapter)};this.runtimeBuilder.withHooks({...this.runtimeHooks,runMigrations:(i=this.runtimeHooks.runMigrations)!=null?i:t,createDomainServices:async o=>{var c,m,p;let s=async u=>{var v,R,C,P,k,M,O,T,j,B,q;let h=[],y=(v=o.registry)==null?void 0:v.dbAdapter,I=Sn(u.name);if(y&&I&&u.entityId)try{await y.create(f.histories,{id:o.createCorrelationId("ofcoop-history"),tableName:I,recordId:u.entityId,action:Cn(u.name),changes:(R=u.payload)!=null?R:null,userId:(M=(k=(P=(C=this.coreInstance)==null?void 0:C.userService)==null?void 0:P.getActiveSession())==null?void 0:k.id)!=null?M:null,timestamp:u.occurredAt,branchId:(O=u.branchId)!=null?O:null,tenantId:(T=u.tenantId)!=null?T:null})}catch(L){h.push(L)}if(this.domainEventSink)try{await this.domainEventSink(u)}catch(L){h.push(L)}if((j=o.registry)!=null&&j.activitySink)try{await o.registry.activitySink.publish({activityId:o.createCorrelationId("ofcoop-event"),activityType:`ofcoop.${u.name}`,occurredAt:u.occurredAt,scopeRef:{domain:"ofcoop",...u.tenantId?{tenantId:u.tenantId}:{},...u.branchId?{branchId:u.branchId}:{}},payload:{entityId:(B=u.entityId)!=null?B:null,...(q=u.payload)!=null?q:{}},correlationId:o.createCorrelationId("ofcoop-corr")})}catch(L){h.push(L)}if(h.length>0)throw h[0]};return{...this.domainServicesFactory?await this.domainServicesFactory():await Fr((m=(c=o.registry)==null?void 0:c.dbAdapter)!=null?m:new Ur,{logger:(p=o.registry)==null?void 0:p.loggerAdapter,emitEvent:s,...this.extraServiceOptions}),...this.domainServiceOverrides}}});let n=this.runtimeBuilder.build(),a=new Bt(n,e);return this.coreInstance=a,a.userService=new it(a),a}};function wn(r){return`${r.from.slice(0,10)}_${r.to.slice(0,10)}`}function Is(r,e,t={}){var i,o,s,d,c,m,p,u,h;let n=wn(r.period),a=(i=t.targetVsActualRows)!=null?i:[{label:"Pendapatan",targetIdr:r.accounting.incomeStatement.revenue,actualIdr:r.accounting.incomeStatement.revenue},{label:"Beban",targetIdr:r.accounting.incomeStatement.expense,actualIdr:r.accounting.incomeStatement.expense},{label:"SHU / Laba Bersih",targetIdr:r.accounting.incomeStatement.netIncome,actualIdr:r.accounting.incomeStatement.netIncome}];return{identity:{koperasiName:(s=(o=t.identity)==null?void 0:o.koperasiName)!=null?s:null,bhNumber:(c=(d=t.identity)==null?void 0:d.bhNumber)!=null?c:null,bookYearPeriod:(p=(m=t.identity)==null?void 0:m.bookYearPeriod)!=null?p:n,documentDate:(h=(u=t.identity)==null?void 0:u.documentDate)!=null?h:r.period.to},financial:{neracaRef:`AUTO-NERACA-${n}`,lphuRef:`AUTO-LPHU-${n}`,cashFlowRef:`AUTO-ARUSKAS-${n}`,equityChangeRef:`AUTO-EKUITAS-${n}`,notesRef:`AUTO-CALK-${n}`,accountingSummary:r.accounting,hasilUsahaSummary:e},ratios:{roaPercent:r.crossDomain.memberActivationRate*100,roePercent:r.crossDomain.shuPerActiveMember>0?r.crossDomain.memberActivationRate*100:0,currentRatioPercent:r.accounting.balanceSheet.liabilities>0?Number((r.accounting.balanceSheet.assets/r.accounting.balanceSheet.liabilities*100).toFixed(2)):0,debtToEquityPercent:r.accounting.balanceSheet.equity>0?Number((r.accounting.balanceSheet.liabilities/r.accounting.balanceSheet.equity*100).toFixed(2)):0,healthMethod:"internal-baseline"},workPlan:{targetVsActualTableRef:`AUTO-RAPB-REALISASI-${n}`,targetVsActualRows:a,shuDistributedIdr:r.shu.totalAllocatedAmount},nextPlan:t.nextPlan?{businessPlanSummary:t.nextPlan.businessPlanSummary,revenueTargetIdr:t.nextPlan.revenueTargetIdr,expenseTargetIdr:t.nextPlan.expenseTargetIdr,shuProjectionIdr:t.nextPlan.shuProjectionIdr}:null}}async function ws(r,e){var c,m,p,u,h,y,I;if(!((c=e.transactionDate)!=null&&c.trim()))throw l("transactionDate is required");let t=Math.max(0,(m=e.initialPokokDepositIdr)!=null?m:0),n=Math.max(0,(p=e.initialWajibDepositIdr)!=null?p:0),a=Math.max(0,(u=e.initialSukarelaDepositIdr)!=null?u:0);if(r.savingPolicyService&&e.koperasiId&&e.member.tenantId){let v=await r.savingPolicyService.getActiveSavingPolicy({koperasiId:e.koperasiId,tenantId:e.member.tenantId,branchId:(h=e.member.branchId)!=null?h:void 0}),R=A(v);if(R&&t<R.simpananPokokNominalIdr)throw l(`initialPokokDepositIdr must be >= ${R.simpananPokokNominalIdr}`)}let i=await r.memberService.createMember(e.member),o=A(i),s=[],d={memberId:o.id,transactionDate:e.transactionDate,tenantId:(y=o.tenantId)!=null?y:void 0,branchId:(I=o.branchId)!=null?I:void 0};if(t>0){let v=await r.savingLedgerService.recordSavingCredit({...d,savingType:"pokok",amount:t});s.push(A(v))}if(n>0){let v=await r.savingLedgerService.recordSavingCredit({...d,savingType:"wajib",amount:n});s.push(A(v))}if(a>0){let v=await r.savingLedgerService.recordSavingCredit({...d,savingType:"sukarela",amount:a});s.push(A(v))}return{member:o,ledgerEntries:s}}async function Ps(r,e){var c;let t=await r.savingPolicyService.upsertSavingPolicy(e),n=A(t),a={koperasiId:e.koperasiId,tenantId:e.tenantId,branchId:(c=e.branchId)!=null?c:void 0},i=await r.savingPolicyService.evaluateWajibCompliance(a),o=A(i),s=await r.savingPolicyService.getComplianceWorklist(a),d=A(s);return{policy:n,evaluation:o,worklist:d}}async function As(r,e){let t=await r.shuService.createShuPeriod(e),n=A(t),a=await r.shuService.generateShuAllocations(n.id),i=A(a),o=await r.shuService.exportShuAllocationsCsv(n.id),s=A(o);return{period:n,allocations:i,csv:s}}function Pn(r){var t;let e=r.accessContext;if(e&&e.role==="anggota"){if(!((t=e.actorMemberId)!=null&&t.trim()))throw l("member360 access denied: anggota context requires actorMemberId");if(e.actorMemberId!==r.memberId)throw l("member360 access denied: anggota can only access own memberId")}}function An(r){return r.map(e=>({itemId:`saving-${e.id}`,occurredAt:e.transactionDate,source:"saving-ledger",title:`${e.entryType} ${e.savingType}`,detail:`${e.amount}`}))}function Mn(r){var e;return(e=r==null?void 0:r.recentLoans)!=null&&e.length?r.recentLoans.map(t=>({itemId:`loan-${t.loanId}`,occurredAt:t.startDate,source:"credit",title:`loan ${t.status}`,detail:`${t.principalAmount}`})):[]}function kn(r){return r.map(e=>{var t;return{itemId:`audit-${e.eventId}`,occurredAt:e.occurredAt,source:"audit",title:e.eventType,detail:(t=e.message)!=null?t:e.eventType}})}async function Ts(r,e){var v,R,C,P,k,M,O,T,j,B,q,L,N;Pn(e);let t=await r.memberService.getMemberById(e.memberId),n=A(t);if(!n||n.deleted)return null;let a={...(v=e.savingQuery)!=null?v:{},...(R=e.scope)!=null&&R.tenantId?{tenantId:e.scope.tenantId}:{},...(C=e.scope)!=null&&C.branchId?{branchId:e.scope.branchId}:{}},[i,o,s,d,c]=await Promise.all([r.savingLedgerService.getSavingBalanceByMember(n.id),r.savingLedgerService.listSavingEntriesByMember(n.id,a),(M=(k=(P=r.providers)==null?void 0:P.getCreditByMember)==null?void 0:k.call(P,n.id,e.scope))!=null?M:Promise.resolve(null),(j=(T=(O=r.providers)==null?void 0:O.getAuditByMember)==null?void 0:T.call(O,n.id,e.scope))!=null?j:Promise.resolve([]),(L=(q=(B=r.providers)==null?void 0:B.getSettlementSummaryByMember)==null?void 0:q.call(B,n.id,e.scope))!=null?L:Promise.resolve(null)]),m=A(i),p=A(o),u=An(p),h=Mn(s),y=kn(d),I=[...u,...h,...y].sort((V,se)=>se.occurredAt.localeCompare(V.occurredAt));return{member:n,savings:{balance:m,recentEntries:p},credit:s,settlement:c,audit:d,timeline:I.slice(0,Math.max(1,(N=e.timelineLimit)!=null?N:20))}}function Os(r){var n,a,i,o,s,d,c,m,p,u,h,y,I,v,R;let e=(n=r.credit)==null?void 0:n.summary,t=r.settlement;return{member:{id:r.member.id,memberNumber:r.member.memberNumber,fullName:r.member.fullName,status:r.member.status,joinDate:r.member.joinDate,exitDate:(a=r.member.exitDate)!=null?a:null,tenantId:(i=r.member.tenantId)!=null?i:null,branchId:(o=r.member.branchId)!=null?o:null},kpiCards:[{id:"saving-total",label:"Total Simpanan",value:r.savings.balance.total,unit:"IDR"},{id:"saving-pokok",label:"Simpanan Pokok",value:r.savings.balance.pokok,unit:"IDR"},{id:"saving-wajib",label:"Simpanan Wajib",value:r.savings.balance.wajib,unit:"IDR"},{id:"saving-sukarela",label:"Simpanan Sukarela",value:r.savings.balance.sukarela,unit:"IDR"},{id:"active-loans",label:"Pinjaman Aktif",value:(s=e==null?void 0:e.activeLoans)!=null?s:0},{id:"settlement-overdue",label:"Tunggakan Settlement",value:(d=t==null?void 0:t.totalOverdue)!=null?d:0,unit:"IDR"}],sections:[{id:"credit-summary",title:"Ringkasan Kredit",rows:[{key:"totalLoans",label:"Total Pinjaman",value:(c=e==null?void 0:e.totalLoans)!=null?c:0},{key:"activeLoans",label:"Pinjaman Aktif",value:(m=e==null?void 0:e.activeLoans)!=null?m:0},{key:"closedLoans",label:"Pinjaman Lunas",value:(p=e==null?void 0:e.closedLoans)!=null?p:0},{key:"defaultedLoans",label:"Pinjaman Macet",value:(u=e==null?void 0:e.defaultedLoans)!=null?u:0},{key:"totalPrincipalAmount",label:"Total Pokok Pinjaman",value:(h=e==null?void 0:e.totalPrincipalAmount)!=null?h:0,unit:"IDR"}]},{id:"settlement-summary",title:"Ringkasan Settlement",rows:[{key:"totalOutstanding",label:"Total Outstanding",value:(y=t==null?void 0:t.totalOutstanding)!=null?y:0,unit:"IDR"},{key:"totalOverdue",label:"Total Overdue",value:(I=t==null?void 0:t.totalOverdue)!=null?I:0,unit:"IDR"},{key:"settlementStatus",label:"Status Settlement",value:(v=t==null?void 0:t.settlementStatus)!=null?v:"clear"},{key:"notes",label:"Catatan",value:(R=t==null?void 0:t.notes)!=null?R:"-"}]},{id:"audit-summary",title:"Ringkasan Audit",rows:[{key:"auditCount",label:"Jumlah Event Audit",value:r.audit.length}]}],timeline:r.timeline}}function Dn(r){return[...r].sort((e,t)=>t.occurredAt.localeCompare(e.occurredAt))}async function Tn(r,e,t){for(let n of r){if(!n.provider.getCreditByMember)continue;let a=await n.provider.getCreditByMember(e,t);if(a)return a}return null}async function xn(r,e,t){let n=await Promise.all(r.map(a=>{var i,o,s;return(s=(o=(i=a.provider).getAuditByMember)==null?void 0:o.call(i,e,t))!=null?s:Promise.resolve([])}));return Dn(n.flat()).slice(0,100)}async function On(r,e,t){for(let n of r){if(!n.provider.getSettlementSummaryByMember)continue;let a=await n.provider.getSettlementSummaryByMember(e,t);if(a)return a}return null}function Ls(r){return{async getCreditByMember(e,t){return Tn(r,e,t)},async getAuditByMember(e,t){return xn(r,e,t)},async getSettlementSummaryByMember(e,t){return On(r,e,t)}}}var _r=1440*60*1e3;function Vr(r){return r.slice(0,10)}function Nt(r){return Date.parse(`${r}T00:00:00.000Z`)}function En(r,e){let t=[];for(let n=Nt(r);n<=Nt(e);n+=_r)t.push(new Date(n).toISOString().slice(0,10));return t}function Gr(r,e){let t=Vr(r),n=Nt(t),a=n-(e-1)*_r;return{fromDate:new Date(a).toISOString().slice(0,10),toDate:new Date(n).toISOString().slice(0,10)}}function $r(r,e,t){let n=new Map;for(let a of En(e,t))n.set(a,{date:a,masuk:0,keluar:0,net:0});for(let a of r){let i=Vr(a.transactionDate),o=n.get(i);o&&(a.entryType==="credit"?(o.masuk+=a.amount,o.net+=a.amount):(o.keluar+=a.amount,o.net-=a.amount))}return Array.from(n.values())}function Ln(r){var t;let e=r.accessContext;if(!(!e||e.role!=="anggota")){if(!((t=e.actorMemberId)!=null&&t.trim()))throw l("anggota dashboard access denied: actorMemberId is required");if(e.actorMemberId!==r.memberId)throw l("anggota dashboard access denied: only self memberId is allowed")}}function Bn(r){let e=r.accessContext;if(e&&e.role!=="pengawas")throw l("pengawas dashboard access denied: role must be pengawas")}function jn(r){let e=r.accessContext;if(e&&e.role!=="pengurus")throw l("pengurus dashboard access denied: role must be pengurus")}async function Nn(r,e,t,n){let a=`${e}T00:00:00.000Z`,i=`${t}T23:59:59.999Z`,o=A(await r.memberService.listMembers({includeDeleted:!1,...n!=null&&n.tenantId?{tenantId:n.tenantId}:{},...n!=null&&n.branchId?{branchId:n.branchId}:{}}));return(await Promise.all(o.map(d=>r.savingLedgerService.listSavingEntriesByMember(d.id,{includeDeleted:!1,dateFrom:a,dateTo:i,...n!=null&&n.tenantId?{tenantId:n.tenantId}:{},...n!=null&&n.branchId?{branchId:n.branchId}:{}})))).map(d=>A(d)).flat()}async function qn(r,e){var a;if((a=r.providers)!=null&&a.getRiskRegisterOverview)return r.providers.getRiskRegisterOverview(e);if(!r.riskRegisterService)return{open:0,mitigating:0,accepted:0,closed:0,escalated:0,overdueSla:0};let t=Date.now();return A(await r.riskRegisterService.listRiskItems({includeDeleted:!1,...e!=null&&e.tenantId?{tenantId:e.tenantId}:{},...e!=null&&e.branchId?{branchId:e.branchId}:{}})).reduce((i,o)=>{var s;return o.status==="open"&&(i.open+=1),o.status==="mitigating"&&(i.mitigating+=1),o.status==="accepted"&&(i.accepted+=1),o.status==="closed"&&(i.closed+=1),((s=o.escalationLevel)!=null?s:0)>0&&(i.escalated+=1),o.status!=="closed"&&o.slaDueAt&&Date.parse(o.slaDueAt)<t&&(i.overdueSla+=1),i},{open:0,mitigating:0,accepted:0,closed:0,escalated:0,overdueSla:0})}async function Wn(r,e){var a;if((a=r.providers)!=null&&a.getWhistleOverview)return r.providers.getWhistleOverview(e);if(!r.whistleReportService)return{submitted:0,inReview:0,resolved:0,dismissed:0,escalated:0,overdueSla:0};let t=Date.now();return A(await r.whistleReportService.listWhistleReports({includeDeleted:!1,...e!=null&&e.tenantId?{tenantId:e.tenantId}:{},...e!=null&&e.branchId?{branchId:e.branchId}:{}})).reduce((i,o)=>{var s;return o.status==="submitted"&&(i.submitted+=1),o.status==="in_review"&&(i.inReview+=1),o.status==="resolved"&&(i.resolved+=1),o.status==="dismissed"&&(i.dismissed+=1),((s=o.escalationLevel)!=null?s:0)>0&&(i.escalated+=1),o.status!=="resolved"&&o.status!=="dismissed"&&o.slaDueAt&&Date.parse(o.slaDueAt)<t&&(i.overdueSla+=1),i},{submitted:0,inReview:0,resolved:0,dismissed:0,escalated:0,overdueSla:0})}async function qs(r,e={}){var M,O,T,j,B,q,L,N,V,se,ve,de,Ie,Re,ce,Se,Ce,le,we,G,$,Q,K,W,z,Y,H,Z,me,ne,ue,ae,X,oe;jn(e);let t=Math.max(1,Math.min(90,(M=e.rollingDays)!=null?M:30)),n=(O=e.referenceDate)!=null?O:new Date().toISOString(),{fromDate:a,toDate:i}=Gr(n,t),[o,s,d,c,m,p,u,h,y,I]=await Promise.all([Nn(r,a,i,e.scope),(B=(j=(T=r.providers)==null?void 0:T.getLoanStatusComposition)==null?void 0:j.call(T,e.scope))!=null?B:Promise.resolve({aktif:0,jatuhTempo:0,macet:0,lunas:0}),(N=(L=(q=r.providers)==null?void 0:q.getLoanAgingBuckets)==null?void 0:L.call(q,e.scope))!=null?N:Promise.resolve({d0to7:0,d8to30:0,d31to60:0,dOver60:0}),(ve=(se=(V=r.providers)==null?void 0:V.getOnboardingFunnel)==null?void 0:se.call(V,e.scope))!=null?ve:Promise.resolve({daftar:0,verifikasiPokok:0,aktif:0}),(Re=(Ie=(de=r.providers)==null?void 0:de.getWajibComplianceTrend)==null?void 0:Ie.call(de,e.scope))!=null?Re:Promise.resolve([]),(Ce=(Se=(ce=r.providers)==null?void 0:ce.getSavingTypeCompositionByPeriod)==null?void 0:Se.call(ce,e.scope))!=null?Ce:Promise.resolve([]),(G=(we=(le=r.providers)==null?void 0:le.getMemberGrowthTrend)==null?void 0:we.call(le,e.scope))!=null?G:Promise.resolve([]),(K=(Q=($=r.providers)==null?void 0:$.getShuDistributionSummary)==null?void 0:Q.call($,e.scope))!=null?K:Promise.resolve([]),(Y=(z=(W=r.providers)==null?void 0:W.getOperationalActivityHeatmap)==null?void 0:z.call(W,e.scope))!=null?Y:Promise.resolve([]),(me=(Z=(H=r.providers)==null?void 0:H.getLoanRiskMap)==null?void 0:Z.call(H,e.scope))!=null?me:Promise.resolve([])]),v=(ae=await((ue=(ne=r.providers)==null?void 0:ne.getTotalOverdueAmount)==null?void 0:ue.call(ne,e.scope)))!=null?ae:0,R=$r(o,a,i),C=R.reduce((pe,E)=>pe+E.net,0),P=await r.memberService.listMembers({includeDeleted:!1,status:"active",...(X=e.scope)!=null&&X.tenantId?{tenantId:e.scope.tenantId}:{},...(oe=e.scope)!=null&&oe.branchId?{branchId:e.scope.branchId}:{}});return{kpi:{activeMembers:A(P).length,totalSavingNet:C,activeLoans:s.aktif,totalOverdueAmount:v},savingsCashflow30Days:R,loanStatusComposition:s,loanAgingBuckets:d,advanced:{onboardingFunnel:c,wajibComplianceTrend:m,savingTypeCompositionByPeriod:p,memberGrowthTrend:u,shuDistributionSummary:h,operationalActivityHeatmap:y,loanRiskMap:I}}}async function Ws(r,e={}){var c,m,p,u,h,y,I,v,R,C,P,k,M,O,T;Bn(e);let[t,n,a,i,o,s,d]=await Promise.all([(p=(m=(c=r.providers)==null?void 0:c.getLoanStatusComposition)==null?void 0:m.call(c,e.scope))!=null?p:Promise.resolve({aktif:0,jatuhTempo:0,macet:0,lunas:0}),(y=(h=(u=r.providers)==null?void 0:u.getLoanAgingBuckets)==null?void 0:h.call(u,e.scope))!=null?y:Promise.resolve({d0to7:0,d8to30:0,d31to60:0,dOver60:0}),(R=(v=(I=r.providers)==null?void 0:I.getTotalOverdueAmount)==null?void 0:v.call(I,e.scope))!=null?R:Promise.resolve(0),(k=(P=(C=r.providers)==null?void 0:C.getWajibComplianceTrend)==null?void 0:P.call(C,e.scope))!=null?k:Promise.resolve([]),(T=(O=(M=r.providers)==null?void 0:M.getMemberGrowthTrend)==null?void 0:O.call(M,e.scope))!=null?T:Promise.resolve([]),qn(r,e.scope),Wn(r,e.scope)]);return{risk:{loanStatusComposition:t,loanAgingBuckets:n,totalOverdueAmount:a,riskRegister:s,whistle:d},trends:{wajibComplianceTrend:i,memberGrowthTrend:o}}}async function Fs(r,e){var v,R,C,P,k,M,O,T,j,B,q;Ln(e);let t=await r.memberService.getMemberById(e.memberId),n=A(t);if(!n||n.deleted)return null;let a=Math.max(1,Math.min(90,(v=e.rollingDays)!=null?v:30)),i=(R=e.referenceDate)!=null?R:new Date().toISOString(),{fromDate:o,toDate:s}=Gr(i,a),d=`${o}T00:00:00.000Z`,c=`${s}T23:59:59.999Z`,[m,p,u,h]=await Promise.all([r.savingLedgerService.getSavingBalanceByMember(e.memberId),r.savingLedgerService.listSavingEntriesByMember(e.memberId,{includeDeleted:!1,dateFrom:d,dateTo:c,...(C=e.scope)!=null&&C.tenantId?{tenantId:e.scope.tenantId}:{},...(P=e.scope)!=null&&P.branchId?{branchId:e.scope.branchId}:{}}),(O=(M=(k=r.providers)==null?void 0:k.getAnggotaCreditSummary)==null?void 0:M.call(k,e.memberId,e.scope))!=null?O:Promise.resolve({activeLoans:0,outstandingPrincipalAmount:0,totalOverdueAmount:0,nextDueDate:null}),(B=(j=(T=r.providers)==null?void 0:T.getAnggotaComplianceStatus)==null?void 0:j.call(T,e.memberId,e.scope))!=null?B:Promise.resolve({status:"unknown",monthsInArrears:0})]),y=A(m),I=A(p);return{memberId:e.memberId,kpi:{totalSavingBalance:y.total,activeLoans:u.activeLoans,outstandingPrincipalAmount:u.outstandingPrincipalAmount,totalOverdueAmount:u.totalOverdueAmount},savingsCashflow30Days:$r(I,o,s),compliance:h,nextDueDate:(q=u.nextDueDate)!=null?q:null}}function _s(r){return{role:"pengurus",kpiCards:[{id:"active-members",label:"Anggota Aktif",value:r.kpi.activeMembers},{id:"total-saving-net",label:"Net Simpanan",value:r.kpi.totalSavingNet,unit:"IDR"},{id:"active-loans",label:"Pinjaman Aktif",value:r.kpi.activeLoans},{id:"total-overdue",label:"Total Tunggakan",value:r.kpi.totalOverdueAmount,unit:"IDR"}],charts:[{id:"savings-cashflow-30-days",title:"Arus Kas Simpanan 30 Hari",chartType:"area",series:[{key:"masuk",label:"Masuk",points:r.savingsCashflow30Days.map(e=>({x:e.date,y:e.masuk}))},{key:"keluar",label:"Keluar",points:r.savingsCashflow30Days.map(e=>({x:e.date,y:e.keluar}))},{key:"net",label:"Net",points:r.savingsCashflow30Days.map(e=>({x:e.date,y:e.net}))}]},{id:"loan-status-composition",title:"Komposisi Status Pinjaman",chartType:"donut",series:[{key:"loan-status",label:"Status Pinjaman",points:[{x:"aktif",y:r.loanStatusComposition.aktif},{x:"jatuh_tempo",y:r.loanStatusComposition.jatuhTempo},{x:"macet",y:r.loanStatusComposition.macet},{x:"lunas",y:r.loanStatusComposition.lunas}]}]},{id:"loan-aging-buckets",title:"Aging Jatuh Tempo Pinjaman",chartType:"bar",series:[{key:"aging",label:"Jumlah Pinjaman",points:[{x:"0-7",y:r.loanAgingBuckets.d0to7},{x:"8-30",y:r.loanAgingBuckets.d8to30},{x:"31-60",y:r.loanAgingBuckets.d31to60},{x:">60",y:r.loanAgingBuckets.dOver60}]}]}]}}function Vs(r){return{role:"pengawas",kpiCards:[{id:"total-overdue",label:"Total Tunggakan",value:r.risk.totalOverdueAmount,unit:"IDR"},{id:"risk-open",label:"Risk Open",value:r.risk.riskRegister.open},{id:"risk-overdue-sla",label:"Risk Overdue SLA",value:r.risk.riskRegister.overdueSla},{id:"whistle-in-review",label:"Whistle In Review",value:r.risk.whistle.inReview},{id:"whistle-overdue-sla",label:"Whistle Overdue SLA",value:r.risk.whistle.overdueSla}],charts:[{id:"loan-status-composition",title:"Komposisi Status Pinjaman",chartType:"donut",series:[{key:"loan-status",label:"Status Pinjaman",points:[{x:"aktif",y:r.risk.loanStatusComposition.aktif},{x:"jatuh_tempo",y:r.risk.loanStatusComposition.jatuhTempo},{x:"macet",y:r.risk.loanStatusComposition.macet},{x:"lunas",y:r.risk.loanStatusComposition.lunas}]}]},{id:"loan-aging-buckets",title:"Aging Jatuh Tempo Pinjaman",chartType:"bar",series:[{key:"aging",label:"Jumlah Pinjaman",points:[{x:"0-7",y:r.risk.loanAgingBuckets.d0to7},{x:"8-30",y:r.risk.loanAgingBuckets.d8to30},{x:"31-60",y:r.risk.loanAgingBuckets.d31to60},{x:">60",y:r.risk.loanAgingBuckets.dOver60}]}]},{id:"wajib-compliance-trend",title:"Tren Kepatuhan Simpanan Wajib",chartType:"line",series:[{key:"patuh",label:"Patuh",points:r.trends.wajibComplianceTrend.map(e=>({x:e.month,y:e.patuh}))},{key:"menunggak",label:"Menunggak",points:r.trends.wajibComplianceTrend.map(e=>({x:e.month,y:e.menunggak}))}]},{id:"member-growth-trend",title:"Pertumbuhan Anggota",chartType:"line",series:[{key:"active",label:"Aktif",points:r.trends.memberGrowthTrend.map(e=>({x:e.month,y:e.active}))},{key:"non-active",label:"Non-Aktif",points:r.trends.memberGrowthTrend.map(e=>({x:e.month,y:e.nonActive}))}]},{id:"risk-register-status",title:"Status Risk Register",chartType:"bar",series:[{key:"risk-register",label:"Risk Register",points:[{x:"open",y:r.risk.riskRegister.open},{x:"mitigating",y:r.risk.riskRegister.mitigating},{x:"accepted",y:r.risk.riskRegister.accepted},{x:"closed",y:r.risk.riskRegister.closed},{x:"escalated",y:r.risk.riskRegister.escalated},{x:"overdue_sla",y:r.risk.riskRegister.overdueSla}]}]},{id:"whistle-status",title:"Status Whistle Report",chartType:"bar",series:[{key:"whistle",label:"Whistle Report",points:[{x:"submitted",y:r.risk.whistle.submitted},{x:"in_review",y:r.risk.whistle.inReview},{x:"resolved",y:r.risk.whistle.resolved},{x:"dismissed",y:r.risk.whistle.dismissed},{x:"escalated",y:r.risk.whistle.escalated},{x:"overdue_sla",y:r.risk.whistle.overdueSla}]}]}]}}function Gs(r){var e;return{role:"anggota",memberId:r.memberId,kpiCards:[{id:"total-saving-balance",label:"Saldo Simpanan",value:r.kpi.totalSavingBalance,unit:"IDR"},{id:"active-loans",label:"Pinjaman Aktif",value:r.kpi.activeLoans},{id:"outstanding-principal",label:"Outstanding Pokok",value:r.kpi.outstandingPrincipalAmount,unit:"IDR"},{id:"total-overdue",label:"Total Tunggakan",value:r.kpi.totalOverdueAmount,unit:"IDR"}],charts:[{id:"personal-savings-cashflow-30-days",title:"Arus Kas Simpanan Pribadi 30 Hari",chartType:"area",series:[{key:"masuk",label:"Masuk",points:r.savingsCashflow30Days.map(t=>({x:t.date,y:t.masuk}))},{key:"keluar",label:"Keluar",points:r.savingsCashflow30Days.map(t=>({x:t.date,y:t.keluar}))},{key:"net",label:"Net",points:r.savingsCashflow30Days.map(t=>({x:t.date,y:t.net}))}]}],compliance:r.compliance,nextDueDate:(e=r.nextDueDate)!=null?e:null}}var Fn={loanCount:0,activeLoanCount:0,closedLoanCount:0,defaultedLoanCount:0,outstandingPrincipalAmount:0,totalOverdueAmount:0},Un={allocationCount:0,totalAllocatedAmount:0},_n={trialBalance:{totalDebit:0,totalCredit:0,isBalanced:!0},incomeStatement:{revenue:0,expense:0,netIncome:0},balanceSheet:{assets:0,liabilities:0,equity:0},cashflow:{operatingInflow:0,operatingOutflow:0,netOperatingCashflow:0}};function Vn(r){let e=r.from.slice(0,10),t=r.to.slice(0,10);return{fromIso:`${e}T00:00:00.000Z`,toIso:`${t}T23:59:59.999Z`}}function Gn(r){let e=0,t=0,n=0,a=0,i=0;for(let o of r){let s=o.entryType==="credit"?1:-1;o.entryType==="credit"?e+=o.amount:t+=o.amount,o.savingType==="pokok"&&(n+=s*o.amount),o.savingType==="wajib"&&(a+=s*o.amount),o.savingType==="sukarela"&&(i+=s*o.amount)}return{creditTotal:e,debitTotal:t,netTotal:e-t,byType:{pokok:n,wajib:a,sukarela:i}}}function $n(r){return["section,key,value",`period,from,${r.period.from}`,`period,to,${r.period.to}`,`members,total,${r.members.total}`,`members,active,${r.members.active}`,`members,inactive,${r.members.inactive}`,`members,exited,${r.members.exited}`,`savings,creditTotal,${r.savings.creditTotal}`,`savings,debitTotal,${r.savings.debitTotal}`,`savings,netTotal,${r.savings.netTotal}`,`savings,pokokNet,${r.savings.byType.pokok}`,`savings,wajibNet,${r.savings.byType.wajib}`,`savings,sukarelaNet,${r.savings.byType.sukarela}`,`credit,loanCount,${r.credit.loanCount}`,`credit,activeLoanCount,${r.credit.activeLoanCount}`,`credit,closedLoanCount,${r.credit.closedLoanCount}`,`credit,defaultedLoanCount,${r.credit.defaultedLoanCount}`,`credit,outstandingPrincipalAmount,${r.credit.outstandingPrincipalAmount}`,`credit,totalOverdueAmount,${r.credit.totalOverdueAmount}`,`shu,allocationCount,${r.shu.allocationCount}`,`shu,totalAllocatedAmount,${r.shu.totalAllocatedAmount}`,`accounting,trialBalanceTotalDebit,${r.accounting.trialBalance.totalDebit}`,`accounting,trialBalanceTotalCredit,${r.accounting.trialBalance.totalCredit}`,`accounting,trialBalanceBalanced,${r.accounting.trialBalance.isBalanced}`,`accounting,incomeRevenue,${r.accounting.incomeStatement.revenue}`,`accounting,incomeExpense,${r.accounting.incomeStatement.expense}`,`accounting,incomeNet,${r.accounting.incomeStatement.netIncome}`,`accounting,balanceAssets,${r.accounting.balanceSheet.assets}`,`accounting,balanceLiabilities,${r.accounting.balanceSheet.liabilities}`,`accounting,balanceEquity,${r.accounting.balanceSheet.equity}`,`accounting,cashflowOperatingIn,${r.accounting.cashflow.operatingInflow}`,`accounting,cashflowOperatingOut,${r.accounting.cashflow.operatingOutflow}`,`accounting,cashflowOperatingNet,${r.accounting.cashflow.netOperatingCashflow}`,`crossDomain,memberActivationRate,${r.crossDomain.memberActivationRate}`,`crossDomain,creditPenetrationRate,${r.crossDomain.creditPenetrationRate}`,`crossDomain,overdueToOutstandingRatio,${r.crossDomain.overdueToOutstandingRatio}`,`crossDomain,savingsPerActiveMember,${r.crossDomain.savingsPerActiveMember}`,`crossDomain,shuPerActiveMember,${r.crossDomain.shuPerActiveMember}`]}function qt(r,e){return e<=0?0:Number((r/e).toFixed(4))}async function Qr(r,e){var R,C,P,k,M,O,T,j,B,q;let t=(R=e.scope)!=null?R:{},{fromIso:n,toIso:a}=Vn(e.period),i=await r.memberService.listMembers({includeDeleted:!1,...t.tenantId?{tenantId:t.tenantId}:{},...t.branchId?{branchId:t.branchId}:{}}),o=A(i),c=(await Promise.all(o.map(L=>r.savingLedgerService.listSavingEntriesByMember(L.id,{includeDeleted:!1,dateFrom:n,dateTo:a,...t.tenantId?{tenantId:t.tenantId}:{},...t.branchId?{branchId:t.branchId}:{}})))).map(L=>A(L)).flat(),m=Gn(c),p=(k=await((P=(C=r.providers)==null?void 0:C.getCreditSummary)==null?void 0:P.call(C,e.period,t)))!=null?k:Fn,u=(T=await((O=(M=r.providers)==null?void 0:M.getShuSummary)==null?void 0:O.call(M,e.period,t)))!=null?T:Un,h=(q=await((B=(j=r.providers)==null?void 0:j.getAccountingSummary)==null?void 0:B.call(j,e.period,t)))!=null?q:_n,y=o.filter(L=>L.status==="active").length,I=o.length,v={memberActivationRate:qt(y,I),creditPenetrationRate:qt(p.activeLoanCount,y),overdueToOutstandingRatio:qt(p.totalOverdueAmount,p.outstandingPrincipalAmount),savingsPerActiveMember:y>0?Math.round(m.netTotal/y):0,shuPerActiveMember:y>0?Math.round(u.totalAllocatedAmount/y):0};return{period:e.period,scope:t,members:{total:I,active:y,inactive:o.filter(L=>L.status==="inactive").length,exited:o.filter(L=>L.status==="exited").length},savings:m,credit:p,shu:u,accounting:h,crossDomain:v}}async function Hs(r,e){let t=await Qr(r,e),n=$n(t).join(`
|
|
7
|
+
`);return{filename:`report-summary-${t.period.from.slice(0,10)}-${t.period.to.slice(0,10)}.csv`,contentType:"text/csv",body:n}}async function Ks(r,e){let t=await Qr(r,e),n={schemaVersion:"1",generatedAt:new Date().toISOString(),summary:t};return{filename:`report-summary-${t.period.from.slice(0,10)}-${t.period.to.slice(0,10)}.json`,contentType:"application/json",body:JSON.stringify(n),data:n}}function Qn(r,e,t,n){return r<=n&&e>=t}function Hn(r){let e=r.totalDistributableShuIdr;return typeof e=="number"&&Number.isFinite(e)&&e>0?e:0}async function Ys(r,e){var d;let t=(d=e.scope)!=null?d:{},n=await r.shuService.listShuPeriods({includeDeleted:!1,...t.tenantId?{tenantId:t.tenantId}:{},...t.branchId?{branchId:t.branchId}:{}}),i=A(n).filter(c=>Qn(c.startDate.slice(0,10),c.endDate.slice(0,10),e.period.from.slice(0,10),e.period.to.slice(0,10))),o=[];for(let c of i){let m=await r.shuService.listShuAllocations(c.id,{includeDeleted:!1}),u=A(m).reduce((y,I)=>y+I.allocationAmount,0),h=Hn(c.formulaSnapshot);o.push({shuPeriodId:c.id,periodCode:c.periodCode,startDate:c.startDate,endDate:c.endDate,status:c.status,distributableShuIdr:h,allocatedShuIdr:u,undistributedShuIdr:h-u})}let s=o.reduce((c,m)=>(c.totalDistributableShuIdr+=m.distributableShuIdr,c.totalAllocatedShuIdr+=m.allocatedShuIdr,c.totalUndistributedShuIdr+=m.undistributedShuIdr,c),{totalDistributableShuIdr:0,totalAllocatedShuIdr:0,totalUndistributedShuIdr:0});return{period:e.period,scope:t,periodCount:o.length,...s,rows:o.sort((c,m)=>c.startDate.localeCompare(m.startDate))}}function Xs(r){return{period:r.period,scope:r.scope,kpiCards:[{id:"members-total",label:"Total Anggota",value:r.members.total},{id:"members-active",label:"Anggota Aktif",value:r.members.active},{id:"savings-net",label:"Net Simpanan",value:r.savings.netTotal,unit:"IDR"},{id:"credit-overdue",label:"Total Tunggakan",value:r.credit.totalOverdueAmount,unit:"IDR"},{id:"shu-total",label:"Total SHU Alokasi",value:r.shu.totalAllocatedAmount,unit:"IDR"},{id:"net-income",label:"Laba Bersih",value:r.accounting.incomeStatement.netIncome,unit:"IDR"}],tableSections:[{id:"members",title:"Ringkasan Anggota",rows:[{key:"total",label:"Total",value:r.members.total},{key:"active",label:"Aktif",value:r.members.active},{key:"inactive",label:"Non-Aktif",value:r.members.inactive},{key:"exited",label:"Keluar",value:r.members.exited}]},{id:"savings",title:"Ringkasan Simpanan",rows:[{key:"creditTotal",label:"Total Masuk",value:r.savings.creditTotal,unit:"IDR"},{key:"debitTotal",label:"Total Keluar",value:r.savings.debitTotal,unit:"IDR"},{key:"netTotal",label:"Total Net",value:r.savings.netTotal,unit:"IDR"},{key:"pokokNet",label:"Net Pokok",value:r.savings.byType.pokok,unit:"IDR"},{key:"wajibNet",label:"Net Wajib",value:r.savings.byType.wajib,unit:"IDR"},{key:"sukarelaNet",label:"Net Sukarela",value:r.savings.byType.sukarela,unit:"IDR"}]},{id:"credit",title:"Ringkasan Kredit",rows:[{key:"loanCount",label:"Total Pinjaman",value:r.credit.loanCount},{key:"activeLoanCount",label:"Pinjaman Aktif",value:r.credit.activeLoanCount},{key:"closedLoanCount",label:"Pinjaman Lunas",value:r.credit.closedLoanCount},{key:"defaultedLoanCount",label:"Pinjaman Macet",value:r.credit.defaultedLoanCount},{key:"outstandingPrincipalAmount",label:"Outstanding Pokok",value:r.credit.outstandingPrincipalAmount,unit:"IDR"},{key:"totalOverdueAmount",label:"Total Tunggakan",value:r.credit.totalOverdueAmount,unit:"IDR"}]},{id:"shu",title:"Ringkasan SHU",rows:[{key:"allocationCount",label:"Jumlah Alokasi",value:r.shu.allocationCount},{key:"totalAllocatedAmount",label:"Total Alokasi",value:r.shu.totalAllocatedAmount,unit:"IDR"}]},{id:"accounting",title:"Ringkasan Akuntansi",rows:[{key:"trialBalanceTotalDebit",label:"Trial Balance Total Debit",value:r.accounting.trialBalance.totalDebit,unit:"IDR"},{key:"trialBalanceTotalCredit",label:"Trial Balance Total Credit",value:r.accounting.trialBalance.totalCredit,unit:"IDR"},{key:"trialBalanceBalanced",label:"Trial Balance Seimbang",value:r.accounting.trialBalance.isBalanced?"ya":"tidak"},{key:"incomeRevenue",label:"Pendapatan",value:r.accounting.incomeStatement.revenue,unit:"IDR"},{key:"incomeExpense",label:"Beban",value:r.accounting.incomeStatement.expense,unit:"IDR"},{key:"incomeNet",label:"Laba Bersih",value:r.accounting.incomeStatement.netIncome,unit:"IDR"},{key:"balanceAssets",label:"Aset",value:r.accounting.balanceSheet.assets,unit:"IDR"},{key:"balanceLiabilities",label:"Liabilitas",value:r.accounting.balanceSheet.liabilities,unit:"IDR"},{key:"balanceEquity",label:"Ekuitas",value:r.accounting.balanceSheet.equity,unit:"IDR"},{key:"cashflowOperatingIn",label:"Kas Operasional Masuk",value:r.accounting.cashflow.operatingInflow,unit:"IDR"},{key:"cashflowOperatingOut",label:"Kas Operasional Keluar",value:r.accounting.cashflow.operatingOutflow,unit:"IDR"},{key:"cashflowOperatingNet",label:"Kas Operasional Bersih",value:r.accounting.cashflow.netOperatingCashflow,unit:"IDR"}]},{id:"cross-domain",title:"Metrik Lintas Domain",rows:[{key:"memberActivationRate",label:"Activation Rate Anggota",value:r.crossDomain.memberActivationRate},{key:"creditPenetrationRate",label:"Credit Penetration Rate",value:r.crossDomain.creditPenetrationRate},{key:"overdueToOutstandingRatio",label:"Overdue/Outstanding Ratio",value:r.crossDomain.overdueToOutstandingRatio},{key:"savingsPerActiveMember",label:"Simpanan per Anggota Aktif",value:r.crossDomain.savingsPerActiveMember,unit:"IDR"},{key:"shuPerActiveMember",label:"SHU per Anggota Aktif",value:r.crossDomain.shuPerActiveMember,unit:"IDR"}]}]}}function Kn(r){let e={...r};return e.limit==null&&(e.limit=100),e.limit<1&&(e.limit=1),e.limit>1e3&&(e.limit=1e3),e}function Jn(r){return!r||r.length===0?null:new Set(r)}function zn(r,e){var n;if(!e||!((n=r.eventTypes)!=null&&n.length))return;let t=r.eventTypes.filter(a=>!e.has(a));if(t.length>0)throw l(`audit trail query contains unknown eventTypes: ${t.join(", ")}`)}function Yn(r){var n;let e=Kn(r),t=e.accessContext;if(!t||t.role!=="anggota")return e;if(!((n=t.actorMemberId)!=null&&n.trim()))throw l("audit trail access denied: anggota context requires actorMemberId");if(e.memberId&&e.memberId!==t.actorMemberId)throw l("audit trail access denied: anggota can only query own memberId");return{...e,memberId:t.actorMemberId}}function Zn(r,e){var t;return r.filter(n=>e.memberId?n.memberId===e.memberId:!0).filter(n=>{var a;return(a=e.scope)!=null&&a.tenantId?n.tenantId===e.scope.tenantId:!0}).filter(n=>{var a;return(a=e.scope)!=null&&a.branchId?n.branchId===e.scope.branchId:!0}).filter(n=>{var a;return(a=e.eventTypes)!=null&&a.length?e.eventTypes.includes(n.eventType):!0}).filter(n=>e.fromTimestamp?n.occurredAt>=e.fromTimestamp:!0).filter(n=>e.toTimestamp?n.occurredAt<=e.toTimestamp:!0).sort((n,a)=>a.occurredAt.localeCompare(n.occurredAt)).slice(0,(t=e.limit)!=null?t:100)}async function rd(r,e={}){let t=Jn(r.eventCatalog),n=Yn(e);zn(n,t);let a=await r.providers.listEvents(n),i=t?a.filter(o=>t.has(o.eventType)):a;return Zn(i,n)}function Xn(r){return[...new Set(r)]}function ad(r){return{eventCatalog:Xn(r.flatMap(t=>{var n;return(n=t.eventCatalog)!=null?n:[]})),auditTrailProvider:{async listEvents(t){return(await Promise.all(r.map(a=>a.provider.listEvents(t)))).flat().sort((a,i)=>i.occurredAt.localeCompare(a.occurredAt)).slice(0,t.limit&&t.limit>0?t.limit:100)}}}}var ot=["LOGIN_SUCCESS","LOGIN_FAILED","LOCKOUT_TRIGGERED","SESSION_REVOKED","CONTEXT_SWITCHED","STEP_UP_CHALLENGED","STEP_UP_PASSED","STEP_UP_FAILED"];function ea(r){return ot.includes(r)}function ta(r){var e;return{eventId:r.eventId,eventType:r.eventType,occurredAt:r.timestamp,message:(e=r.reasonCode)!=null?e:r.result}}function ra(r,e){var t,n,a;return{eventId:r.eventId,sourceDomain:"ofauth",eventType:r.eventType,occurredAt:r.timestamp,memberId:e!=null?e:void 0,tenantId:(t=r.scopeRef)==null?void 0:t.tenantId,branchId:(n=r.scopeRef)==null?void 0:n.branchId,summary:(a=r.reasonCode)!=null?a:r.result}}function od(r,e){return{member360:{async getAuditByMember(a){let i=await e.resolveIdentityIdsByMemberId(a);return i.length===0?[]:(await Promise.all(i.map(s=>r.queryEvents({identityId:s})))).flat().sort((s,d)=>d.timestamp.localeCompare(s.timestamp)).slice(0,100).map(ta)}},auditTrailProvider:{async listEvents(a){var m;let i=[];if(a.memberId&&(i=await e.resolveIdentityIdsByMemberId(a.memberId),i.length===0))return[];let o=((m=a.eventTypes)!=null?m:[]).filter(ea),s={...a.fromTimestamp?{fromTimestamp:a.fromTimestamp}:{},...a.toTimestamp?{toTimestamp:a.toTimestamp}:{},...o.length>0?{eventTypes:o}:{}},d=i.length>0?await Promise.all(i.map(p=>r.queryEvents({...s,identityId:p}))):[await r.queryEvents(s)];return await Promise.all(d.flat().map(async p=>{var u,h;return ra(p,p.identityId&&(h=await((u=e.resolveMemberIdByIdentityId)==null?void 0:u.call(e,p.identityId)))!=null?h:null)}))}},eventCatalog:[...ot]}}var st=["member.created","member.updated","saving.entry-recorded","saving.policy-upserted","shu.config-upserted","shu.period-created","shu.period-finalized","shu.allocations-generated"],dt=["loan.created","loan.closed","installment.schedule-generated","installment.payment-recorded","credit-policy.created","credit-policy.updated"];function na(r){return st.includes(r)}function aa(r){return dt.includes(r)}function ia(r){return{eventId:r.eventId,eventType:r.name,occurredAt:r.occurredAt,message:r.entityId?`entity:${r.entityId}`:r.name}}function oa(r){var t;let e=(t=r.payload)==null?void 0:t.memberId;return typeof e=="string"&&e.trim()?e:null}function Hr(r,e,t){var n,a,i,o;return{eventId:r.eventId,sourceDomain:e,eventType:r.name,occurredAt:r.occurredAt,memberId:(a=(n=oa(r))!=null?n:t)!=null?a:void 0,tenantId:(i=r.tenantId)!=null?i:void 0,branchId:(o=r.branchId)!=null?o:void 0,summary:r.entityId?`entity:${r.entityId}`:r.name}}function Kr(r){return[...r].sort((e,t)=>t.occurredAt.localeCompare(e.occurredAt))}var sa=[...st,...dt];function dd(r){return{member360:{async getAuditByMember(n,a){var s,d,c,m;let[i,o]=await Promise.all([(d=(s=r.ofcoop)==null?void 0:s.queryEvents({memberId:n,...a!=null&&a.tenantId?{tenantId:a.tenantId}:{},...a!=null&&a.branchId?{branchId:a.branchId}:{},limit:100}))!=null?d:Promise.resolve([]),(m=(c=r.ofcoopCredit)==null?void 0:c.queryEvents({memberId:n,...a!=null&&a.tenantId?{tenantId:a.tenantId}:{},...a!=null&&a.branchId?{branchId:a.branchId}:{},limit:100}))!=null?m:Promise.resolve([])]);return Kr([...i,...o]).slice(0,100).map(ia)}},auditTrailProvider:{async listEvents(n){var m,p,u,h,y,I,v,R,C;let a=(m=n.eventTypes)!=null?m:[],i=a.length>0?a.filter(na):void 0,o=a.length>0?a.filter(aa):void 0,[s,d]=await Promise.all([(y=(h=r.ofcoop)==null?void 0:h.queryEvents({...n.memberId?{memberId:n.memberId}:{},...n.fromTimestamp?{fromTimestamp:n.fromTimestamp}:{},...n.toTimestamp?{toTimestamp:n.toTimestamp}:{},...(p=n.scope)!=null&&p.tenantId?{tenantId:n.scope.tenantId}:{},...(u=n.scope)!=null&&u.branchId?{branchId:n.scope.branchId}:{},...i?{eventNames:i}:{},...n.limit?{limit:n.limit}:{}}))!=null?y:Promise.resolve([]),(C=(R=r.ofcoopCredit)==null?void 0:R.queryEvents({...n.memberId?{memberId:n.memberId}:{},...n.fromTimestamp?{fromTimestamp:n.fromTimestamp}:{},...n.toTimestamp?{toTimestamp:n.toTimestamp}:{},...(I=n.scope)!=null&&I.tenantId?{tenantId:n.scope.tenantId}:{},...(v=n.scope)!=null&&v.branchId?{branchId:n.scope.branchId}:{},...o?{eventNames:o}:{},...n.limit?{limit:n.limit}:{}}))!=null?C:Promise.resolve([])]),c=[...s.map(P=>Hr(P,"ofcoop",n.memberId)),...d.map(P=>Hr(P,"ofcoop-credit",n.memberId))];return Kr(c)}},eventCatalog:[...sa]}}function Jr(r){return[...new Set(r)]}function da(r){return r.startsWith("ofcoop.")?"ofcoop":r.startsWith("ofcoop-credit.")?"ofcoop-credit":r.startsWith("ofauth.")?"ofauth":"external"}function ca(r){return r.startsWith("ofcoop.")?r.slice(7):r.startsWith("ofcoop-credit.")?r.slice(14):r.startsWith("ofauth.")?r.slice(7).toUpperCase():r}function la(r){if(!r||r.length===0)return;let e=r.flatMap(t=>[`ofcoop.${t}`,`ofcoop-credit.${t}`,`ofauth.${t.toLowerCase()}`]);return Jr(e)}function ud(r,e={}){var n;return{eventCatalog:Jr((n=e.eventCatalog)!=null?n:[...st,...dt,...ot]),auditTrailProvider:{async listEvents(a){var o,s;return(await r.listActivityRecords({fromTimestamp:a.fromTimestamp,toTimestamp:a.toTimestamp,tenantId:(o=a.scope)==null?void 0:o.tenantId,branchId:(s=a.scope)==null?void 0:s.branchId,limit:a.limit,activityTypes:la(a.eventTypes)})).map(d=>{var p,u,h,y,I;let c=typeof((p=d.payload)==null?void 0:p.memberId)=="string"?d.payload.memberId:null,m=da(d.activityType);return{eventId:d.activityId,sourceDomain:m,eventType:ca(d.activityType),occurredAt:d.occurredAt,memberId:(u=c!=null?c:a.memberId)!=null?u:void 0,tenantId:(h=d.scopeRef)==null?void 0:h.tenantId,branchId:(y=d.scopeRef)==null?void 0:y.branchId,summary:typeof((I=d.payload)==null?void 0:I.entityId)=="string"&&d.payload.entityId?`entity:${d.payload.entityId}`:d.activityType}}).sort((d,c)=>c.occurredAt.localeCompare(d.occurredAt))}}}}import{unwrap as ma}from"ofcore";function ie(r){return r&&typeof r=="object"&&("data"in r||"error"in r)?ma(r):r}function he(r){return r.slice(0,10)}function ua(r,e){let t=new Date(`${r}T00:00:00.000Z`);return t.setUTCDate(t.getUTCDate()+e),t.toISOString().slice(0,10)}function pa(r){let e={aktif:0,jatuhTempo:0,macet:0,lunas:0};for(let t of r){if(t.status==="defaulted"){e.macet+=1;continue}if(t.status==="closed"){e.lunas+=1;continue}t.overdueInstallmentCount>0?e.jatuhTempo+=1:e.aktif+=1}return e}function ga(r,e){let t={d0to7:0,d8to30:0,d31to60:0,dOver60:0},n=Date.parse(`${e}T00:00:00.000Z`);for(let a of r){let i=Date.parse(`${he(a.dueDate)}T00:00:00.000Z`),o=Math.max(0,Math.floor((n-i)/(1440*60*1e3)));o<=7?t.d0to7+=1:o<=30?t.d8to30+=1:o<=60?t.d31to60+=1:t.dOver60+=1}return t}function fe(r){return r!=null&&r.tenantId?{tenantId:r.tenantId,...r.branchId?{branchId:r.branchId}:{}}:null}function yd(r){return{member360:{async getCreditByMember(a,i){let o=ie(await r.loanService.listLoansByMember(a,{includeDeleted:!1,...i!=null&&i.tenantId?{tenantId:i.tenantId}:{},...i!=null&&i.branchId?{branchId:i.branchId}:{}})),s={totalLoans:o.length,activeLoans:o.filter(c=>c.status==="active").length,closedLoans:o.filter(c=>c.status==="closed").length,defaultedLoans:o.filter(c=>c.status==="defaulted").length,totalPrincipalAmount:o.reduce((c,m)=>c+m.principalAmount,0)},d=[...o].sort((c,m)=>m.startDate.localeCompare(c.startDate)).slice(0,5).map(c=>({loanId:c.id,status:c.status,principalAmount:c.principalAmount,startDate:c.startDate}));return{summary:s,recentLoans:d}},async getSettlementSummaryByMember(a,i){let o=fe(i);if(!o)return{totalOutstanding:0,totalOverdue:0,settlementStatus:"clear",notes:"tenantId missing in scope"};let s=ie(await r.loanBoardService.listLoanBoard(o,{memberId:a})),d=s.reduce((m,p)=>m+p.outstandingAmount,0),c=s.filter(m=>m.overdueInstallmentCount>0).reduce((m,p)=>m+p.outstandingAmount,0);return{totalOutstanding:d,totalOverdue:c,settlementStatus:c>0?"overdue":d>0?"pending":"clear"}}},dashboard:{async getLoanStatusComposition(a){let i=fe(a);if(!i)return{aktif:0,jatuhTempo:0,macet:0,lunas:0};let o=ie(await r.loanBoardService.listLoanBoard(i));return pa(o)},async getLoanAgingBuckets(a){let i=fe(a);if(!i)return{d0to7:0,d8to30:0,d31to60:0,dOver60:0};let o=he(new Date().toISOString()),s=ua(o,-60),d=ie(await r.loanDueWindowService.listLoansDueInWindow(i,{dateFrom:"1970-01-01T00:00:00.000Z",dateTo:`${o}T23:59:59.999Z`})),c=d.filter(u=>u.installmentStatus==="overdue"&&he(u.dueDate)>=s),m=d.filter(u=>u.installmentStatus==="overdue"&&he(u.dueDate)<s),p=ga(c,o);return p.dOver60+=m.length,p},async getTotalOverdueAmount(a){let i=fe(a);return i?ie(await r.loanDueWindowService.listLoansDueInWindow(i,{dateFrom:"1970-01-01T00:00:00.000Z",dateTo:`${new Date().toISOString().slice(0,10)}T23:59:59.999Z`})).filter(s=>s.installmentStatus==="overdue").reduce((s,d)=>s+d.outstandingAmount,0):0},async getAnggotaCreditSummary(a,i){var u;let o=fe(i);if(!o)return{activeLoans:0,outstandingPrincipalAmount:0,totalOverdueAmount:0,nextDueDate:null};let s=ie(await r.loanBoardService.listLoanBoard(o,{memberId:a})),d=s.filter(h=>h.status==="active").length,c=s.reduce((h,y)=>h+y.outstandingAmount,0),m=s.filter(h=>h.overdueInstallmentCount>0).reduce((h,y)=>h+y.outstandingAmount,0),p=(u=[...s].map(h=>h.nextDueDate).filter(Boolean).sort((h,y)=>String(h).localeCompare(String(y)))[0])!=null?u:null;return{activeLoans:d,outstandingPrincipalAmount:c,totalOverdueAmount:m,nextDueDate:p}},async getLoanRiskMap(a){var p;let i=fe(a);if(!i)return[];let o=he(new Date().toISOString()),s=ie(await r.loanBoardService.listLoanBoard(i)),d=ie(await r.loanDueWindowService.listLoansDueInWindow(i,{dateFrom:"1970-01-01T00:00:00.000Z",dateTo:`${o}T23:59:59.999Z`})),c=new Map,m=Date.parse(`${o}T00:00:00.000Z`);for(let u of d){if(u.installmentStatus!=="overdue")continue;let h=Date.parse(`${he(u.dueDate)}T00:00:00.000Z`),y=Math.max(0,Math.floor((m-h)/(1440*60*1e3))),I=(p=c.get(u.loanId))!=null?p:0;y>I&&c.set(u.loanId,y)}return s.map(u=>{var I;let h=(I=c.get(u.loanId))!=null?I:0,y=h>60||u.outstandingAmount>=5e6?"high":h>30||u.outstandingAmount>=1e6?"medium":"low";return{loanId:u.loanId,memberId:u.memberId,outstandingAmount:u.outstandingAmount,overdueAgeDays:h,riskLevel:y}})}},report:{async getCreditSummary(a,i){let o=fe(i);if(!o)return{loanCount:0,activeLoanCount:0,closedLoanCount:0,defaultedLoanCount:0,outstandingPrincipalAmount:0,totalOverdueAmount:0};let s=ie(await r.loanBoardService.listLoanBoard(o));return{loanCount:s.length,activeLoanCount:s.filter(d=>d.status==="active").length,closedLoanCount:s.filter(d=>d.status==="closed").length,defaultedLoanCount:s.filter(d=>d.status==="defaulted").length,outstandingPrincipalAmount:s.reduce((d,c)=>d+c.outstandingAmount,0),totalOverdueAmount:s.filter(d=>d.overdueInstallmentCount>0).reduce((d,c)=>d+c.outstandingAmount,0)}}}}}var ya=1440*60*1e3;function Yr(r){return r.slice(0,10)}function zr(r){return r.slice(0,7)}function fa(r){return new Date(`${r}-01T00:00:00.000Z`)}function ct(r){let e=fa(r);return new Date(Date.UTC(e.getUTCFullYear(),e.getUTCMonth()+1,0,23,59,59,999))}function Wt(r,e=new Date().toISOString()){let t=new Date(e),n=[];for(let a=r-1;a>=0;a-=1){let i=new Date(Date.UTC(t.getUTCFullYear(),t.getUTCMonth()-a,1));n.push(`${i.getUTCFullYear()}-${String(i.getUTCMonth()+1).padStart(2,"0")}`)}return n}function be(r){return{...r!=null&&r.tenantId?{tenantId:r.tenantId}:{},...r!=null&&r.branchId?{branchId:r.branchId}:{}}}function ha(r,e){return r.startDate<=e&&r.endDate>=e}function ba(r,e=new Date().toISOString()){var i,o,s,d,c,m;if(r.length===0)return null;let t=Yr(e),n=r.filter(p=>ha(p,t));if(n.length>0)return(o=(i=[...n].sort((p,u)=>u.endDate.localeCompare(p.endDate))[0])==null?void 0:i.id)!=null?o:null;let a=r.filter(p=>p.status==="finalized");return a.length>0?(d=(s=[...a].sort((p,u)=>u.endDate.localeCompare(p.endDate))[0])==null?void 0:s.id)!=null?d:null:(m=(c=[...r].sort((p,u)=>u.endDate.localeCompare(p.endDate))[0])==null?void 0:c.id)!=null?m:null}function va(r,e){let t=ct(e).toISOString();return!(!(r.joinDate<=t)||r.status!=="active"||r.exitDate&&r.exitDate<=t)}function Ia(r,e){let t=ct(e).toISOString();return r.joinDate<=t}async function Ft(r,e,t,n,a){return(await Promise.all(e.map(o=>r.listSavingEntriesByMember(o,{includeDeleted:!1,dateFrom:t,dateTo:n,...be(a)})))).map(o=>A(o)).flat()}function bd(r,e={}){var i,o;let t=Math.max(1,Math.min(24,(i=e.monthsWindow)!=null?i:6)),n=Math.max(1,Math.min(180,(o=e.heatmapDays)!=null?o:30)),a=async s=>{var m;if(e.resolveCurrentShuPeriodId)return e.resolveCurrentShuPeriodId(s);if(!((m=r.shuService)!=null&&m.listShuPeriods))return null;let d=await r.shuService.listShuPeriods({includeDeleted:!1,...s!=null&&s.tenantId?{tenantId:s.tenantId}:{},...s!=null&&s.branchId?{branchId:s.branchId}:{}}),c=A(d);return ba(c,e.referenceDate)};return{async getOnboardingFunnel(s){let d=await r.memberService.listMembers({includeDeleted:!1,...be(s)}),c=A(d),p=(await Promise.all(c.map(y=>r.savingLedgerService.getSavingBalanceByMember(y.id)))).map(y=>A(y)),u=p.filter(y=>y.pokok>0).length,h=c.filter((y,I)=>{var v,R;return y.status==="active"&&((R=(v=p[I])==null?void 0:v.pokok)!=null?R:0)>0}).length;return{daftar:c.length,verifikasiPokok:u,aktif:h}},async getWajibComplianceTrend(s){let d=Wt(t,e.referenceDate),c=await r.memberService.listMembers({includeDeleted:!1,status:"active",...be(s)}),p=A(c).map(v=>v.id);if(p.length===0)return d.map(v=>({month:v,patuh:0,menunggak:0}));let u=d[0],h=d[d.length-1],y=await Ft(r.savingLedgerService,p,`${u}-01T00:00:00.000Z`,ct(h).toISOString(),s),I=new Set(y.filter(v=>v.savingType==="wajib"&&v.entryType==="credit"&&v.amount>0).map(v=>`${v.memberId}:${zr(v.transactionDate)}`));return d.map(v=>{let R=0,C=0;for(let P of p)I.has(`${P}:${v}`)?R+=1:C+=1;return{month:v,patuh:R,menunggak:C}})},async getSavingTypeCompositionByPeriod(s){let d=Wt(t,e.referenceDate),c=await r.memberService.listMembers({includeDeleted:!1,...be(s)}),p=A(c).map(v=>v.id);if(p.length===0)return d.map(v=>({period:v,pokok:0,wajib:0,sukarela:0}));let u=d[0],h=d[d.length-1],y=await Ft(r.savingLedgerService,p,`${u}-01T00:00:00.000Z`,ct(h).toISOString(),s),I=new Map;for(let v of d)I.set(v,{period:v,pokok:0,wajib:0,sukarela:0});for(let v of y){let R=zr(v.transactionDate),C=I.get(R);if(!C)continue;let P=v.entryType==="credit"?1:-1;v.savingType==="pokok"&&(C.pokok+=P*v.amount),v.savingType==="wajib"&&(C.wajib+=P*v.amount),v.savingType==="sukarela"&&(C.sukarela+=P*v.amount)}return d.map(v=>{var R;return(R=I.get(v))!=null?R:{period:v,pokok:0,wajib:0,sukarela:0}})},async getMemberGrowthTrend(s){let d=Wt(t,e.referenceDate),c=await r.memberService.listMembers({includeDeleted:!1,...be(s)}),m=A(c);return d.map(p=>{let u=m.filter(y=>Ia(y,p)).length,h=m.filter(y=>va(y,p)).length;return{month:p,active:h,nonActive:Math.max(0,u-h)}})},async getShuDistributionSummary(s){if(!r.shuService)return[];let d=await a(s);if(!d)return[];let c=await r.shuService.listShuAllocations(d,{includeDeleted:!1});return[...A(c).filter(u=>!(s!=null&&s.tenantId&&u.tenantId!==s.tenantId||s!=null&&s.branchId&&u.branchId!==s.branchId))].sort((u,h)=>h.allocationAmount-u.allocationAmount).slice(0,10).map(u=>({memberId:u.memberId,allocationAmount:u.allocationAmount}))},async getOperationalActivityHeatmap(s){var v;let d=await r.memberService.listMembers({includeDeleted:!1,...be(s)}),m=A(d).map(R=>R.id);if(m.length===0)return[];let p=e.referenceDate?new Date(e.referenceDate).getTime():Date.now(),u=new Date(p).toISOString(),h=new Date(p-(n-1)*ya).toISOString(),y=await Ft(r.savingLedgerService,m,h,u,s),I=new Map;for(let R of y){let C=Yr(R.transactionDate),P=new Date(R.transactionDate).getUTCHours(),k=`${C}:${P}`,M=(v=I.get(k))!=null?v:{day:C,hour:P,total:0};M.total+=1,I.set(k,M)}return Array.from(I.values()).sort((R,C)=>R.day===C.day?R.hour-C.hour:R.day.localeCompare(C.day))}}}function Zr(r,e){return{async getShuSummary(t,n){let a=await e.resolveShuPeriodIdsForRange(t,n);if(!a.length)return{allocationCount:0,totalAllocatedAmount:0};let s=(await Promise.all(a.map(d=>r.shuService.listShuAllocations(d,{includeDeleted:!1})))).map(d=>A(d)).flat().filter(d=>!(n!=null&&n.tenantId&&d.tenantId!==n.tenantId||n!=null&&n.branchId&&d.branchId!==n.branchId));return{allocationCount:s.length,totalAllocatedAmount:s.reduce((d,c)=>d+c.allocationAmount,0)}}}}function Ra(r){let e=r.reduce((n,a)=>n+a.debit,0),t=r.reduce((n,a)=>n+a.credit,0);return{totalDebit:e,totalCredit:t,isBalanced:e===t}}function Sa(r,e,t){var n,a;return{tenantId:(n=e==null?void 0:e.tenantId)!=null?n:void 0,branchId:(a=e==null?void 0:e.branchId)!=null?a:void 0,financeDomainId:t,occurredFrom:`${r.from.slice(0,10)}T00:00:00.000Z`,occurredTo:`${r.to.slice(0,10)}T23:59:59.999Z`}}async function Ca(r){let e=await r;if(Array.isArray(e))return e;if(e!=null&&e.error){let t=new Error(e.error.message||e.error.code||"OFFINANCE_TRIAL_BALANCE_ERROR");throw t.code=e.error.code,t}return Array.isArray(e==null?void 0:e.data)?e.data:[]}function Te(r){switch(r.accountType){case"asset":case"expense":return r.debit-r.credit;case"liability":case"equity":case"revenue":return r.credit-r.debit;default:return 0}}function wa(r){let e=r.filter(n=>n.accountType==="revenue").reduce((n,a)=>n+Te(a),0),t=r.filter(n=>n.accountType==="expense").reduce((n,a)=>n+Te(a),0);return{revenue:e,expense:t,netIncome:e-t}}function Pa(r){let e=r.filter(a=>a.accountType==="asset").reduce((a,i)=>a+Te(i),0),t=r.filter(a=>a.accountType==="liability").reduce((a,i)=>a+Te(i),0),n=r.filter(a=>a.accountType==="equity").reduce((a,i)=>a+Te(i),0);return{assets:e,liabilities:t,equity:n}}function Aa(r){let e=r.filter(n=>n.accountType==="revenue").reduce((n,a)=>n+Math.max(0,a.credit-a.debit),0),t=r.filter(n=>n.accountType==="expense").reduce((n,a)=>n+Math.max(0,a.debit-a.credit),0);return{operatingInflow:e,operatingOutflow:t,netOperatingCashflow:e-t}}function Ma(r,e,t,n){return{trialBalance:Ra(r),incomeStatement:e,balanceSheet:t,cashflow:n}}function Xr(r,e={}){return{async getAccountingSummary(t,n){var o;let a=r.financeReader.getTrialBalanceByScope?r.financeReader.getTrialBalanceByScope(Sa(t,n,(o=e.financeDomainId)!=null?o:"ofcoop")):r.financeReader.getTrialBalance(),i=await Ca(a);return Ma(i,wa(i),Pa(i),Aa(i))}}}function Pd(r,e){var a;let t=Zr({shuService:r.shuService},{resolveShuPeriodIdsForRange:e.resolveShuPeriodIdsForRange}),n=r.financeReader?Xr({financeReader:r.financeReader},{financeDomainId:(a=e.financeDomainId)!=null?a:"ofcoop"}):{};return{...t,...n}}import{unwrap as kd}from"ofcore";export{Tt as CommunityProfileRepository,yt as GovernanceAgendaRepository,Mt as GovernanceDecisionArchiveRepository,gt as GovernanceMeetingRepository,ft as GovernanceVoteRepository,kt as LeadershipAppointmentRepository,ht as LeadershipTermRepository,bt as ManagementReportRepository,xt as MemberDependentRepository,ut as MemberExitStateRepository,pt as MemberNumberPolicyRepository,lt as MemberRepository,mt as MemberWaConsentRepository,ot as OFAUTH_AUDIT_EVENT_CATALOG,st as OFCOOP_AUDIT_EVENT_CATALOG,dt as OFCOOP_CREDIT_AUDIT_EVENT_CATALOG,f as OFCOOP_TABLES,Bt as OfcoopCore,jt as OfcoopCoreBuilder,Me as OfcoopDomainError,vt as OversightPolicyRepository,It as RiskRegisterRepository,Ct as SavingLedgerRepository,St as SavingPolicyRepository,At as ShuAllocationRepository,wt as ShuConfigRepository,Dt as ShuParticipationEntryRepository,Pt as ShuPeriodRepository,Rt as WhistleReportRepository,Vt as applyPendingMigrations,Kt as assertValidAddGovernanceAgendaItemInput,Wr as assertValidAddMemberDependentInput,wr as assertValidAddWhistleEvidenceInput,Pr as assertValidAdvanceWhistleInvestigationStageInput,Zt as assertValidCloseGovernanceAgendaInput,qr as assertValidCreateCommunityProfileInput,Ht as assertValidCreateGovernanceMeetingInput,Xt as assertValidCreateLeadershipTermInput,rr as assertValidCreateManagementReportInput,$t as assertValidCreateMemberInput,pr as assertValidCreateRiskRegisterInput,Lr as assertValidCreateShuPeriodInput,Rr as assertValidCreateWhistleReportInput,er as assertValidEndLeadershipTermInput,jr as assertValidEndorseAppointmentInput,hr as assertValidEscalateRiskRegisterInput,Cr as assertValidEscalateWhistleReportInput,Qt as assertValidGetComplianceReadinessInput,tr as assertValidHandoverLeadershipTermInput,Ro as assertValidInstallAppointmentInput,Ot as assertValidManagementReportAudience,ir as assertValidManagementReportPayload,qe as assertValidMemberExitInput,Gt as assertValidMemberNumberPolicyInput,ur as assertValidOversightPolicyInput,Br as assertValidProposeAppointmentInput,Yt as assertValidRecordGovernanceMeetingArtifactsInput,zt as assertValidRecordGovernanceMeetingMinutesInput,Jt as assertValidRecordGovernanceVoteInput,fr as assertValidRecordRiskRegisterReviewInput,Lt as assertValidRecordShuParticipationInput,Nr as assertValidRejectAppointmentInput,ar as assertValidReviewManagementReportInput,vr as assertValidReviewRiskMitigationApprovalInput,kr as assertValidSavingEntryInput,Dr as assertValidSavingPolicyInput,xr as assertValidShuConfigInput,nr as assertValidSubmitManagementReportInput,br as assertValidSubmitRiskMitigationApprovalInput,gr as assertValidUpdateRiskRegisterInput,yr as assertValidUpdateRiskRegisterStatusInput,Sr as assertValidUpdateWhistleReportStatusInput,Ys as buildHasilUsahaPeriodSummary,hn as buildJournalDraftFromCoopSavingFinanceProjection,Tr as calculateWajibNetTotal,Is as composeManagementReportFinancialPayloadFromSummary,U as conflict,ud as createActivityAuditTrailProvider,ad as createAuditTrailCompositionProvider,$i as createCoopSavingFinanceRuntimeOptions,Fr as createDbAdapterOfcoopServices,As as createGenerateAndExportShu,Ls as createMember360CompositionProviders,od as createOfauthCompositionProviders,yd as createOfcoopCreditCompositionProviders,bd as createOfcoopDashboardCompositionProviders,dd as createOfcoopDomainAuditCompositionProviders,Xr as createOfcoopOffinanceReportCompositionProviders,Zr as createOfcoopReportCompositionProviders,te as createOfcoopRepositories,Pd as createOfcoopStandardReportProviders,Ar as deriveSavingComplianceStatus,Hs as exportReportSummaryCsv,Ks as exportReportSummaryJson,Fs as getAnggotaDashboardSummary,Or as getDefaultParticipationWeights,Ts as getMember360,Ut as getOfcoopTableSchemas,Ws as getPengawasDashboardSummary,qs as getPengurusDashboardSummary,Qr as getReportSummary,l as invalidState,_t as migrations,w as notFound,rn as ofcoopSchema,ws as onboardMemberWithInitialSavings,Mr as projectSavingLedgerToScopedFinance,rd as queryAuditTrail,ba as resolveCurrentShuPeriodIdFromRows,Gs as toAnggotaDashboardViewModel,Os as toMember360ViewModel,Vs as toPengawasDashboardViewModel,_s as toPengurusDashboardViewModel,Xs as toReportSummaryViewModel,kd as unwrap,Ps as upsertPolicyAndEvaluateCompliance};
|