ofcoop-shared-core 0.1.0-alpha.0 → 0.1.0-alpha.1
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 +3 -0
- package/dist/index.js +3 -54
- package/package.json +18 -8
- package/dist/OfcoopCore.js +0 -273
- package/dist/contracts/MemberContract.js +0 -2
- package/dist/contracts/MemberNumberPolicyContract.js +0 -2
- package/dist/contracts/SavingComplianceSnapshotContract.js +0 -2
- package/dist/contracts/SavingLedgerContract.js +0 -2
- package/dist/contracts/SavingPolicyContract.js +0 -2
- package/dist/contracts/ShuConfigContract.js +0 -2
- package/dist/contracts/ShuContract.js +0 -2
- package/dist/contracts/crossDomainPrimitives.js +0 -2
- package/dist/data/applyPendingMigrations.js +0 -30
- package/dist/data/migrations.js +0 -20
- package/dist/data/repositories.js +0 -324
- package/dist/data/schemas.js +0 -179
- package/dist/services/AuditTrailQueryService.js +0 -62
- package/dist/services/CoopOrchestrationService.js +0 -71
- package/dist/services/DailyOpsService.js +0 -7
- package/dist/services/DashboardSummaryService.js +0 -211
- package/dist/services/DashboardViewModelService.js +0 -193
- package/dist/services/Member360Service.js +0 -79
- package/dist/services/Member360ViewModelService.js +0 -66
- package/dist/services/MemberNumberPolicyService.js +0 -18
- package/dist/services/MemberService.js +0 -18
- package/dist/services/ReportSummaryService.js +0 -160
- package/dist/services/ReportViewModelService.js +0 -90
- package/dist/services/SavingComplianceSnapshotService.js +0 -10
- package/dist/services/SavingLedgerService.js +0 -13
- package/dist/services/SavingPolicyService.js +0 -20
- package/dist/services/ShuConfigService.js +0 -16
- package/dist/services/ShuService.js +0 -14
- package/dist/services/createActivityAuditTrailProvider.js +0 -73
- package/dist/services/createAuditTrailCompositionProvider.js +0 -21
- package/dist/services/createDbAdapterOfcoopServices.js +0 -23
- package/dist/services/createMember360CompositionProviders.js +0 -43
- package/dist/services/createOfauthCompositionProviders.js +0 -80
- package/dist/services/createOfcoopCreditCompositionProviders.js +0 -233
- package/dist/services/createOfcoopDashboardCompositionProviders.js +0 -228
- package/dist/services/createOfcoopDomainAuditCompositionProviders.js +0 -117
- package/dist/services/createOfcoopReportCompositionProviders.js +0 -30
- package/dist/services/errors.js +0 -23
- package/dist/services/impl/DbAdapterMemberNumberPolicyService.js +0 -37
- package/dist/services/impl/DbAdapterMemberService.js +0 -142
- package/dist/services/impl/DbAdapterSavingComplianceSnapshotService.js +0 -74
- package/dist/services/impl/DbAdapterSavingLedgerService.js +0 -115
- package/dist/services/impl/DbAdapterSavingPolicyService.js +0 -139
- package/dist/services/impl/DbAdapterShuConfigService.js +0 -62
- package/dist/services/impl/DbAdapterShuService.js +0 -376
- package/dist/services/impl/runtimeSupport.js +0 -29
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import{CoreRuntime as vt}from"ofcore";import{InMemoryDbAdapter as rt}from"ofcore";import{asReadonlyStore as yt,createStore as ht}from"ofcore";var h={members:"ofcoop_members",memberWaConsent:"ofcoop_member_wa_consent",memberExitState:"ofcoop_member_exit_state",memberNumberPolicies:"ofcoop_member_number_policies",savingPolicies:"ofcoop_saving_policies",savingEntries:"ofcoop_saving_entries",shuConfigs:"ofcoop_shu_configs",shuPeriods:"ofcoop_shu_periods",shuAllocations:"ofcoop_shu_allocations"},gt=[{name:h.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:h.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:h.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:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]},{name:h.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:h.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"},{name:"changeReason",type:"string",isOptional:!0},{name:"approvalRef",type:"string",isOptional:!0},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]},{name:h.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:h.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:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]},{name:h.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:h.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}]}],bt={version:1,tables:gt};function Ve(){return bt.tables}var He=[{toVersion:1,up:async t=>{let e=Ve();for(let r of e)try{await t.addTable(r)}catch{}}}];var ft={logInfo(){},logWarn(){},logError(){}};async function Ge(t,e=ft){e.logInfo("[ofcoop] starting database migration process");let r=[...He].sort((o,i)=>o.toVersion-i.toVersion),n=r.length>0?r[r.length-1].toVersion:0,a=await t.getSchemaVersion();if((a==null||a<0)&&(a=0),a>=n){e.logInfo(`[ofcoop] database already up-to-date at v${a}`);return}for(let o of r)o.toVersion>a&&(e.logInfo(`[ofcoop] applying migration v${o.toVersion}`),await o.up(t),await t.setSchemaVersion(o.toVersion),a=o.toVersion);e.logInfo(`[ofcoop] migration completed at v${a}`)}function ue(){return new Date().toISOString()}function je(t,e){return new Date(t).getTime()<=new Date(e).getTime()}function K(t){if(t.length!==0)return t.length===1?t[0]:{and:t}}var Te=class{constructor(e){this.db=e}async create(e){return this.db.create(h.members,e)}async update(e,r){return this.db.update(h.members,e,r)}async getById(e){return this.db.get(h.members,e)}async list(e){var n,a;let r=[];return e!=null&&e.includeDeleted||r.push({deleted:!1}),e!=null&&e.status&&r.push({status:e.status}),(e==null?void 0:e.tenantId)!==void 0&&r.push({tenantId:(n=e.tenantId)!=null?n:null}),(e==null?void 0:e.branchId)!==void 0&&r.push({branchId:(a=e.branchId)!=null?a:null}),this.db.query(h.members,{filters:K(r),sort:[{field:"lastModified",direction:"desc"}]})}},Re=class{constructor(e){this.db=e}async set(e,r){var o,i,s;let n=await this.get(e),a={id:e,granted:r.granted,source:(o=r.source)!=null?o:null,note:(i=r.note)!=null?i:null,version:((s=n==null?void 0:n.version)!=null?s:0)+1,lastModified:ue(),deleted:!1};return n?this.db.update(h.memberWaConsent,e,a):this.db.create(h.memberWaConsent,a)}async get(e){return this.db.get(h.memberWaConsent,e)}},ke=class{constructor(e){this.db=e}async set(e,r,n){var i,s,c,d;let a=await this.get(e),o={id:e,stage:r,reason:(i=n.reason)!=null?i:null,requestedBy:(s=n.requestedBy)!=null?s:null,referenceId:(c=n.referenceId)!=null?c:null,version:((d=a==null?void 0:a.version)!=null?d:0)+1,lastModified:ue(),deleted:!1};return a?this.db.update(h.memberExitState,e,o):this.db.create(h.memberExitState,o)}async get(e){return this.db.get(h.memberExitState,e)}},xe=class{constructor(e){this.db=e}async upsert(e){return await this.db.get(h.memberNumberPolicies,e.id)?this.db.update(h.memberNumberPolicies,e.id,e):this.db.create(h.memberNumberPolicies,e)}async getActive(e){var a;let r=ue();return(a=(await this.list(e)).filter(o=>je(o.effectiveDate,r)).sort((o,i)=>i.effectiveDate.localeCompare(o.effectiveDate))[0])!=null?a:null}async list(e){var r;return this.db.query(h.memberNumberPolicies,{filters:{and:[{deleted:!1},{koperasiId:e.koperasiId},{tenantId:e.tenantId},{branchId:(r=e.branchId)!=null?r:null}]},sort:[{field:"effectiveDate",direction:"desc"}]})}},Oe=class{constructor(e){this.db=e}async upsert(e){return await this.db.get(h.savingPolicies,e.id)?this.db.update(h.savingPolicies,e.id,e):this.db.create(h.savingPolicies,e)}async getActive(e){var a;let r=ue();return(a=(await this.list(e)).filter(o=>je(o.effectiveDate,r)).sort((o,i)=>i.effectiveDate.localeCompare(o.effectiveDate))[0])!=null?a:null}async list(e){var r;return this.db.query(h.savingPolicies,{filters:{and:[{deleted:!1},{koperasiId:e.koperasiId},{tenantId:e.tenantId},{branchId:(r=e.branchId)!=null?r:null}]},sort:[{field:"effectiveDate",direction:"desc"}]})}},Ee=class{constructor(e){this.db=e}async create(e){return this.db.create(h.savingEntries,e)}async listByMember(e,r){var a,o;let n=[{memberId:e}];return r!=null&&r.includeDeleted||n.push({deleted:!1}),r!=null&&r.dateFrom&&n.push({field:"transactionDate",operator:">=",value:r.dateFrom}),r!=null&&r.dateTo&&n.push({field:"transactionDate",operator:"<=",value:r.dateTo}),(r==null?void 0:r.tenantId)!==void 0&&n.push({tenantId:(a=r.tenantId)!=null?a:null}),(r==null?void 0:r.branchId)!==void 0&&n.push({branchId:(o=r.branchId)!=null?o:null}),this.db.query(h.savingEntries,{filters:K(n),sort:[{field:"transactionDate",direction:"desc"}]})}async listAll(e){var n,a;let r=[];return e!=null&&e.includeDeleted||r.push({deleted:!1}),e!=null&&e.dateFrom&&r.push({field:"transactionDate",operator:">=",value:e.dateFrom}),e!=null&&e.dateTo&&r.push({field:"transactionDate",operator:"<=",value:e.dateTo}),(e==null?void 0:e.tenantId)!==void 0&&r.push({tenantId:(n=e.tenantId)!=null?n:null}),(e==null?void 0:e.branchId)!==void 0&&r.push({branchId:(a=e.branchId)!=null?a:null}),this.db.query(h.savingEntries,{filters:K(r),sort:[{field:"transactionDate",direction:"desc"}]})}async findByReference(e){var a,o,i;let r=[{deleted:!1},{memberId:e.memberId},{savingType:e.savingType},{entryType:e.entryType},{referenceType:e.referenceType},{referenceId:e.referenceId}];return e.tenantId!==void 0&&r.push({tenantId:(a=e.tenantId)!=null?a:null}),e.branchId!==void 0&&r.push({branchId:(o=e.branchId)!=null?o:null}),(i=(await this.db.query(h.savingEntries,{filters:K(r),sort:[{field:"lastModified",direction:"desc"}],limit:1}))[0])!=null?i:null}},Le=class{constructor(e){this.db=e}async upsert(e){return await this.db.get(h.shuConfigs,e.id)?this.db.update(h.shuConfigs,e.id,e):this.db.create(h.shuConfigs,e)}async getActive(e){var a;let r=ue();return(a=(await this.list(e)).filter(o=>je(o.effectiveDate,r)).sort((o,i)=>i.effectiveDate.localeCompare(o.effectiveDate))[0])!=null?a:null}async list(e,r){var a;let n=[{koperasiId:e.koperasiId},{tenantId:e.tenantId},{branchId:(a=e.branchId)!=null?a:null}];return r!=null&&r.includeDeleted||n.push({deleted:!1}),this.db.query(h.shuConfigs,{filters:K(n),sort:[{field:"effectiveDate",direction:"desc"}]})}},Ne=class{constructor(e){this.db=e}async create(e){return this.db.create(h.shuPeriods,e)}async update(e,r){return this.db.update(h.shuPeriods,e,r)}async getById(e){return this.db.get(h.shuPeriods,e)}async list(e){var n,a;let r=[];return e!=null&&e.includeDeleted||r.push({deleted:!1}),(e==null?void 0:e.tenantId)!==void 0&&r.push({tenantId:(n=e.tenantId)!=null?n:null}),(e==null?void 0:e.branchId)!==void 0&&r.push({branchId:(a=e.branchId)!=null?a:null}),this.db.query(h.shuPeriods,{filters:K(r),sort:[{field:"lastModified",direction:"desc"}]})}},Be=class{constructor(e){this.db=e}async createMany(e){return e.length===0?[]:this.db.bulkCreate(h.shuAllocations,e)}async listByPeriod(e,r){let n=[{shuPeriodId:e}];return r!=null&&r.includeDeleted||n.push({deleted:!1}),r!=null&&r.memberId&&n.push({memberId:r.memberId}),this.db.query(h.shuAllocations,{filters:K(n),sort:[{field:"lastModified",direction:"desc"}]})}};function U(t){return{memberRepository:new Te(t),memberWaConsentRepository:new Re(t),memberExitStateRepository:new ke(t),memberNumberPolicyRepository:new xe(t),savingPolicyRepository:new Oe(t),savingLedgerRepository:new Ee(t),shuConfigRepository:new Le(t),shuPeriodRepository:new Ne(t),shuAllocationRepository:new Be(t)}}var pe=class extends Error{constructor(r,n){super(n);this.code=r;this.name="OfcoopDomainError"}};function O(t,e){return new pe("RESOURCE_NOT_FOUND",`${t} not found: ${e}`)}function X(t){return new pe("CONFLICT",t)}function y(t){return new pe("INVALID_STATE",t)}function Ke(t){var e,r,n;if(!((e=t.koperasiId)!=null&&e.trim()))throw y("koperasiId is required");if(!((r=t.tenantId)!=null&&r.trim()))throw y("tenantId is required");if(!((n=t.effectiveDate)!=null&&n.trim()))throw y("effectiveDate is required");if(t.paddingDigits<1)throw y("paddingDigits must be >= 1");if(t.counterStart<0)throw y("counterStart must be >= 0");if(t.includeMonth&&!t.includeYear)throw y("includeMonth requires includeYear")}function I(){return new Date().toISOString()}function k(t){let e=0;return()=>(e+=1,`${t}-${Date.now()}-${e}`)}function fe(t){return JSON.parse(JSON.stringify(t))}async function w(t,e){var r;if(t.emitEvent)try{await t.emitEvent(e)}catch(n){(r=t.logger)==null||r.logError(n,{message:"[ofcoop] domain event sink failed",eventName:e.name})}}var ve=class{constructor(e){this.repos=e;this.newId=k("member-number-policy")}async getActiveMemberNumberPolicy(e){return this.repos.memberNumberPolicyRepository.getActive(e)}async upsertMemberNumberPolicy(e){var o;Ke(e);let r={koperasiId:e.koperasiId,tenantId:e.tenantId,branchId:e.branchId},n=await this.repos.memberNumberPolicyRepository.getActive(r),a=I();return n?this.repos.memberNumberPolicyRepository.upsert({...n,...e,version:n.version+1,lastModified:a}):this.repos.memberNumberPolicyRepository.upsert({id:this.newId(),...e,approvalRef:(o=e.approvalRef)!=null?o:null,version:1,lastModified:a,deleted:!1})}};function Ze(t){var e,r,n,a;if(!((e=t.memberNumber)!=null&&e.trim()))throw y("memberNumber is required");if(!((r=t.fullName)!=null&&r.trim()))throw y("fullName is required");if(!((n=t.joinDate)!=null&&n.trim()))throw y("joinDate is required");if(!((a=t.tenantId)!=null&&a.trim()))throw y("tenantId is required")}var ye=class{constructor(e,r,n={}){this.db=e;this.repos=r;this.options=n;this.newId=k("member")}async inTx(e){return this.db.transaction(async r=>e(U(r)))}async createMember(e){var a,o,i,s,c,d;if(Ze(e),(await this.repos.memberRepository.list({tenantId:(a=e.tenantId)!=null?a:null})).some(m=>m.memberNumber===e.memberNumber&&!m.deleted))throw X(`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:(o=e.branchId)!=null?o:null,tenantId:(i=e.tenantId)!=null?i:null,version:1,lastModified:I(),deleted:!1});return(s=this.options.logger)==null||s.logInfo("[ofcoop] member created",{memberId:n.id,tenantId:n.tenantId,branchId:n.branchId}),await w(this.options,{name:"member.created",occurredAt:I(),entityId:n.id,tenantId:(c=n.tenantId)!=null?c:null,branchId:(d=n.branchId)!=null?d:null,payload:{memberNumber:n.memberNumber}}),n}async updateMember(e,r){var o,i,s;let n=await this.repos.memberRepository.getById(e);if(!n||n.deleted)throw O("Member",e);let a=await this.repos.memberRepository.update(e,{...r.fullName!==void 0?{fullName:r.fullName}:{},...r.memberNumber!==void 0?{memberNumber:r.memberNumber}:{},version:n.version+1,lastModified:I()});return(o=this.options.logger)==null||o.logInfo("[ofcoop] member updated",{memberId:e}),await w(this.options,{name:"member.updated",occurredAt:I(),entityId:a.id,tenantId:(i=a.tenantId)!=null?i:null,branchId:(s=a.branchId)!=null?s:null,payload:{memberNumber:a.memberNumber}}),a}async getMemberById(e){let r=await this.repos.memberRepository.getById(e);return!r||r.deleted?null:r}async listMembers(e){return this.repos.memberRepository.list(e)}async changeMemberStatus(e,r){let n=await this.repos.memberRepository.getById(e);if(!n||n.deleted)throw O("Member",e);return this.repos.memberRepository.update(e,{status:r,version:n.version+1,lastModified:I()})}async setMemberWaConsent(e,r){return this.inTx(async n=>{let a=await n.memberRepository.getById(e);if(!a||a.deleted)throw O("Member",e);return await n.memberWaConsentRepository.set(e,r),n.memberRepository.update(e,{version:a.version+1,lastModified:I()})})}async requestMemberExit(e,r){return this.inTx(async n=>{let a=await n.memberRepository.getById(e);if(!a||a.deleted)throw O("Member",e);return await n.memberExitStateRepository.set(e,"requested",r),n.memberRepository.update(e,{status:"inactive",version:a.version+1,lastModified:I()})})}async settleMemberExit(e,r){return this.inTx(async n=>{let a=await n.memberRepository.getById(e);if(!a||a.deleted)throw O("Member",e);return await n.memberExitStateRepository.set(e,"settled",r),n.memberRepository.update(e,{status:"exited",exitDate:I(),version:a.version+1,lastModified:I()})})}async cancelMemberExit(e,r){return this.inTx(async n=>{let a=await n.memberRepository.getById(e);if(!a||a.deleted)throw O("Member",e);return await n.memberExitStateRepository.set(e,"canceled",r),n.memberRepository.update(e,{status:"active",exitDate:null,version:a.version+1,lastModified:I()})})}};function qe(t,e,r){return r?e>=t?"compliant":"underpaid":"no-policy"}var he=class{constructor(e){this.repos=e}async buildSnapshot(e,r,n){var g,b,u,f;let o=(await this.repos.savingLedgerRepository.listByMember(e.id,{includeDeleted:!1,tenantId:r.tenantId,branchId:(g=r.branchId)!=null?g:null})).filter(v=>v.savingType==="wajib"),i=o.filter(v=>v.entryType==="credit").reduce((v,S)=>v+S.amount,0),s=o.filter(v=>v.entryType==="debit").reduce((v,S)=>v+S.amount,0),c=i-s,d=(b=n==null?void 0:n.monthlyWajibNominalIdr)!=null?b:0,m=qe(d,c,!!n),l=m==="underpaid"?1:0,p=m==="compliant"?"none":m==="no-policy"?"set_active_saving_policy":"followup_wajib_payment";return{id:`snapshot-${e.id}`,memberId:e.id,koperasiId:r.koperasiId,tenantId:(u=e.tenantId)!=null?u:null,branchId:(f=e.branchId)!=null?f:null,referenceDate:I(),monthlyWajibNominalIdr:d,wajibCreditTotalIdr:i,wajibDebitTotalIdr:s,wajibNetTotalIdr:c,status:m,monthsInArrears:l,recommendedAction:p,metadata:{memberNumber:e.memberNumber},version:1,lastModified:I(),deleted:!1}}async listComplianceSnapshots(e,r){var i,s,c;let n=await this.repos.savingPolicyRepository.getActive({koperasiId:e.koperasiId,tenantId:e.tenantId,branchId:(i=e.branchId)!=null?i:null}),a=await this.repos.memberRepository.list({includeDeleted:(s=r==null?void 0:r.includeDeleted)!=null?s:!1,status:"active",tenantId:e.tenantId,branchId:(c=e.branchId)!=null?c:null});return(await Promise.all(a.filter(d=>r!=null&&r.memberId?d.id===r.memberId:!0).map(d=>this.buildSnapshot(d,e,n)))).filter(d=>r!=null&&r.status?d.status===r.status:!0).map(d=>fe(d))}async getComplianceSnapshotByMember(e,r){var a;return(a=(await this.listComplianceSnapshots(r,{memberId:e}))[0])!=null?a:null}};function Je(t){var e,r;if(!((e=t.memberId)!=null&&e.trim()))throw y("memberId is required");if(!((r=t.transactionDate)!=null&&r.trim()))throw y("transactionDate is required");if(Number.isNaN(Number(t.amount))||Number(t.amount)<=0)throw y("amount must be > 0")}var Se=class{constructor(e,r,n={}){this.db=e;this.repos=r;this.options=n;this.newId=k("saving-ledger")}async inTx(e){return this.db.transaction(async r=>e(U(r)))}async addEntry(e,r){return Je(r),this.inTx(async n=>{var i,s,c,d,m,l,p,g,b,u,f;let a=await n.memberRepository.getById(r.memberId);if(!a||a.deleted)throw O("Member",r.memberId);if(a.status!=="active")throw X(`Cannot record saving entry for inactive member: ${r.memberId}`);if(r.referenceType&&r.referenceId){let v=await n.savingLedgerRepository.findByReference({memberId:r.memberId,savingType:r.savingType,entryType:e,referenceType:r.referenceType,referenceId:r.referenceId,tenantId:(i=r.tenantId)!=null?i:null,branchId:(s=r.branchId)!=null?s:null});if(v)return(c=this.options.logger)==null||c.logInfo("[ofcoop] saving entry idempotent hit",{memberId:r.memberId,referenceType:r.referenceType,referenceId:r.referenceId}),v}let o=await n.savingLedgerRepository.create({id:this.newId(),memberId:r.memberId,savingType:r.savingType,entryType:e,amount:r.amount,transactionDate:r.transactionDate,referenceType:(d=r.referenceType)!=null?d:null,referenceId:(m=r.referenceId)!=null?m:null,notes:(l=r.notes)!=null?l:null,branchId:(p=r.branchId)!=null?p:null,tenantId:(g=r.tenantId)!=null?g:null,version:1,lastModified:I(),deleted:!1});return(b=this.options.logger)==null||b.logInfo("[ofcoop] saving entry recorded",{entryId:o.id,memberId:o.memberId,savingType:o.savingType,entryType:o.entryType,amount:o.amount}),await w(this.options,{name:"saving.entry-recorded",occurredAt:I(),entityId:o.id,tenantId:(u=o.tenantId)!=null?u:null,branchId:(f=o.branchId)!=null?f:null,payload:{memberId:o.memberId,savingType:o.savingType,entryType:o.entryType,amount:o.amount}}),o})}async recordSavingCredit(e){return this.addEntry("credit",e)}async recordSavingDebit(e){return this.addEntry("debit",e)}async recordSavingWithdrawal(e){var n;if(e.savingType!=="sukarela")throw X(`recordSavingWithdrawal only supports sukarela saving type, received: ${e.savingType}`);let r=await this.getSavingBalanceByMember(e.memberId);if(e.amount>r.sukarela)throw X(`Insufficient sukarela balance for member: ${e.memberId}`);return this.addEntry("debit",{...e,notes:(n=e.notes)!=null?n:"withdrawal"})}async listSavingEntriesByMember(e,r){return this.repos.savingLedgerRepository.listByMember(e,r)}async getSavingBalanceByMember(e){let r=await this.listSavingEntriesByMember(e),n={pokok:0,wajib:0,sukarela:0,total:0};for(let a of r){let o=a.entryType==="credit"?1:-1;n[a.savingType]+=o*a.amount}return n.total=n.pokok+n.wajib+n.sukarela,n}};function Ye(t){var e,r,n;if(!((e=t.koperasiId)!=null&&e.trim()))throw y("koperasiId is required");if(!((r=t.tenantId)!=null&&r.trim()))throw y("tenantId is required");if(!((n=t.effectiveDate)!=null&&n.trim()))throw y("effectiveDate is required");if(t.simpananPokokNominalIdr<0)throw y("simpananPokokNominalIdr must be >= 0");if(t.monthlyWajibNominalIdr<0)throw y("monthlyWajibNominalIdr must be >= 0")}function ze(t,e){return t-e}var Ie=class{constructor(e,r={}){this.repos=e;this.options=r;this.newId=k("saving-policy")}async getActiveSavingPolicy(e){return this.repos.savingPolicyRepository.getActive(e)}async upsertSavingPolicy(e){var i,s,c,d,m,l,p,g;Ye(e);let r={koperasiId:e.koperasiId,tenantId:e.tenantId,branchId:e.branchId},n=await this.repos.savingPolicyRepository.getActive(r),a=I();if(n){let b=await this.repos.savingPolicyRepository.upsert({...n,...e,changeReason:(i=e.changeReason)!=null?i:null,approvalRef:(s=e.approvalRef)!=null?s:null,version:n.version+1,lastModified:a});return await w(this.options,{name:"saving.policy-upserted",occurredAt:I(),entityId:b.id,tenantId:(c=b.tenantId)!=null?c:null,branchId:(d=b.branchId)!=null?d:null,payload:{effectiveDate:b.effectiveDate}}),b}let o=await this.repos.savingPolicyRepository.upsert({id:this.newId(),...e,changeReason:(m=e.changeReason)!=null?m:null,approvalRef:(l=e.approvalRef)!=null?l:null,version:1,lastModified:a,deleted:!1});return await w(this.options,{name:"saving.policy-upserted",occurredAt:I(),entityId:o.id,tenantId:(p=o.tenantId)!=null?p:null,branchId:(g=o.branchId)!=null?g:null,payload:{effectiveDate:o.effectiveDate}}),o}async evaluateWajibCompliance(e){var s;let r=await this.getActiveSavingPolicy(e),a=(await this.repos.savingLedgerRepository.listAll({includeDeleted:!1,tenantId:e.tenantId,branchId:(s=e.branchId)!=null?s:null})).filter(c=>c.savingType==="wajib"),o=a.filter(c=>c.entryType==="credit").reduce((c,d)=>c+d.amount,0),i=a.filter(c=>c.entryType==="debit").reduce((c,d)=>c+d.amount,0);return{summary:{activePolicy:r?1:0,wajibCreditTotal:o,wajibDebitTotal:i,wajibNetTotal:ze(o,i)},referenceDate:I()}}async getComplianceWorklist(e){var o;let r=await this.getActiveSavingPolicy(e);if(!r)return[];let n=await this.repos.memberRepository.list({includeDeleted:!1,status:"active",tenantId:e.tenantId,branchId:(o=e.branchId)!=null?o:null}),a=new Date;return Promise.all(n.map(async i=>{var u;let c=(await this.repos.savingLedgerRepository.listByMember(i.id,{tenantId:e.tenantId,branchId:(u=e.branchId)!=null?u:null})).reduce((f,v)=>v.savingType!=="wajib"?f:f+(v.entryType==="credit"?v.amount:-v.amount),0),m=Math.max(1,this.monthDiffInclusive(i.joinDate,a.toISOString().slice(0,10)))*r.monthlyWajibNominalIdr,l=Math.max(0,m-c),p=r.monthlyWajibNominalIdr>0?Math.ceil(l/r.monthlyWajibNominalIdr):0,g=p*30,b=g>90?"critical":g>30?"high":g>7?"medium":"low";return{id:`worklist-${i.id}`,memberId:i.id,priority:b,reasonCode:"WJ-REVIEW",reasonText:`Review wajib compliance for member ${i.memberNumber}`,recommendedAction:"verify_monthly_wajib",metadata:{policyId:r.id,memberNumber:i.memberNumber,fullName:i.fullName,expectedWajib:m,wajibNet:c,arrearsAmount:l,monthsInArrears:p,daysInArrears:g}}}))}monthDiffInclusive(e,r){let n=new Date(e),a=new Date(r);if(Number.isNaN(n.getTime())||Number.isNaN(a.getTime()))return 1;let o=a.getUTCFullYear()-n.getUTCFullYear(),i=a.getUTCMonth()-n.getUTCMonth();return o*12+i+1}};function Xe(t){var r,n,a;if(!((r=t.koperasiId)!=null&&r.trim()))throw y("koperasiId is required");if(!((n=t.tenantId)!=null&&n.trim()))throw y("tenantId is required");if(!((a=t.effectiveDate)!=null&&a.trim()))throw y("effectiveDate is required");let e=t.cadanganPercent+t.jasaUsahaPercent+t.jasaModalPercent;if(e!==100)throw y(`SHU config percent total must be exactly 100, got ${e}`)}var Ce=class{constructor(e,r={}){this.repos=e;this.options=r;this.newId=k("shu-config")}async getActiveShuConfig(e){return this.repos.shuConfigRepository.getActive(e)}async upsertShuConfig(e){var i,s,c,d,m,l,p,g;Xe(e);let r={koperasiId:e.koperasiId,tenantId:e.tenantId,branchId:e.branchId},n=await this.repos.shuConfigRepository.getActive(r),a=I();if(n){let b=await this.repos.shuConfigRepository.upsert({...n,...e,notes:(i=e.notes)!=null?i:null,approvalRef:(s=e.approvalRef)!=null?s:null,version:n.version+1,lastModified:a});return await w(this.options,{name:"shu.config-upserted",occurredAt:I(),entityId:b.id,tenantId:(c=b.tenantId)!=null?c:null,branchId:(d=b.branchId)!=null?d:null,payload:{effectiveDate:b.effectiveDate}}),b}let o=await this.repos.shuConfigRepository.upsert({id:this.newId(),...e,notes:(m=e.notes)!=null?m:null,approvalRef:(l=e.approvalRef)!=null?l:null,version:1,lastModified:a,deleted:!1});return await w(this.options,{name:"shu.config-upserted",occurredAt:I(),entityId:o.id,tenantId:(p=o.tenantId)!=null?p:null,branchId:(g=o.branchId)!=null?g:null,payload:{effectiveDate:o.effectiveDate}}),o}async listShuConfigs(e,r){return this.repos.shuConfigRepository.list(e,r)}};function et(t){var e,r,n,a;if(!((e=t.periodCode)!=null&&e.trim()))throw y("periodCode is required");if(!((r=t.startDate)!=null&&r.trim()))throw y("startDate is required");if(!((n=t.endDate)!=null&&n.trim()))throw y("endDate is required");if(!((a=t.tenantId)!=null&&a.trim()))throw y("tenantId is required")}var Pe=class{constructor(e,r,n={}){this.db=e;this.repos=r;this.options=n;this.newPeriodId=k("shu-period");this.newAllocationId=k("shu-allocation")}async inTx(e){return this.db.transaction(async r=>e(U(r)))}toDateOnly(e){return e.slice(0,10)}dateToUtcMs(e){return Date.parse(`${this.toDateOnly(e)}T00:00:00.000Z`)}diffDaysInclusive(e,r){let n=this.dateToUtcMs(r)-this.dateToUtcMs(e);return Math.floor(n/864e5)+1}getEligibleWindow(e,r,n){if(e.status!=="active"&&e.status!=="exited")return null;let a=this.toDateOnly(e.joinDate),o=e.exitDate?this.toDateOnly(e.exitDate):null;if(e.status==="exited"&&!o)return null;let i=a>r?a:r,s=o&&o<n?o:n;if(i>s)return null;let c=this.diffDaysInclusive(i,s),d=this.diffDaysInclusive(r,n);return{start:i,end:s,activeDays:c,proRataFactor:d>0?c/d:0}}applySavingEntryToBalance(e,r,n){var o;let a=r.entryType==="debit"?-1:1;if(r.savingType==="pokok"&&(e.pokok+=a*r.amount),r.savingType==="wajib"&&(e.wajib+=a*r.amount),r.savingType==="sukarela"){if(!n||n.size===0)return;let i=((o=r.referenceType)!=null?o:"").trim();if(!n.has(i))return;e.sukarela+=a*r.amount}}async computeAverageModalBasis(e){var l,p;let n=(await e.repos.savingLedgerRepository.listByMember(e.memberId,{includeDeleted:!1,dateTo:e.periodEnd,tenantId:(l=e.tenantId)!=null?l:null,branchId:(p=e.branchId)!=null?p:null})).slice().sort((g,b)=>this.toDateOnly(g.transactionDate).localeCompare(this.toDateOnly(b.transactionDate))),a={pokok:0,wajib:0,sukarela:0},o=this.dateToUtcMs(e.activeStart),i=this.dateToUtcMs(e.activeEnd)+864e5,s=this.diffDaysInclusive(e.periodStart,e.periodEnd),c=0,d=this.dateToUtcMs(e.periodStart),m=0;for(;m<n.length&&this.dateToUtcMs(n[m].transactionDate)<d;)this.applySavingEntryToBalance(a,n[m],e.includeSukarela?e.allowedSukarelaReferenceTypes:null),m+=1;for(;d<i;){let g=m<n.length?this.dateToUtcMs(n[m].transactionDate):i,b=Math.min(g,i);if(b>d){let u=Math.max(d,o),f=Math.min(b,i);if(f>u){let v=Math.floor((f-u)/864e5),S=a.pokok+a.wajib+(e.includeSukarela?a.sukarela:0);c+=S*v}d=b}else d+=864e5;for(;m<n.length&&this.dateToUtcMs(n[m].transactionDate)===b;)this.applySavingEntryToBalance(a,n[m],e.includeSukarela?e.allowedSukarelaReferenceTypes:null),m+=1}return s>0?c/s:0}allocateWithLargestRemainder(e){var c;let r=e.members.reduce((d,m)=>d+m.score,0);if(r<=0)throw y("SHU allocation requires non-zero total score; escalate to RAT decision");let n=new Map,a=e.members.map(d=>{let m=e.poolAmount*d.score/r,l=Math.floor(m);return n.set(d.memberId,l),{memberId:d.memberId,remainder:m-l}}),o=Array.from(n.values()).reduce((d,m)=>d+m,0),i=e.poolAmount-o;a.sort((d,m)=>m.remainder!==d.remainder?m.remainder-d.remainder:d.memberId.localeCompare(m.memberId));let s=0;for(;i>0&&a.length>0;){let d=a[s%a.length];n.set(d.memberId,((c=n.get(d.memberId))!=null?c:0)+1),i-=1,s+=1}return n}async createShuPeriod(e){var n,a,o,i,s;et(e);let r=await this.repos.shuPeriodRepository.create({id:this.newPeriodId(),periodCode:e.periodCode,startDate:e.startDate,endDate:e.endDate,status:"draft",formulaSnapshot:fe(e.formulaSnapshot),branchId:(n=e.branchId)!=null?n:null,tenantId:(a=e.tenantId)!=null?a:null,version:1,lastModified:I(),deleted:!1});return(o=this.options.logger)==null||o.logInfo("[ofcoop] shu period created",{periodId:r.id,periodCode:r.periodCode}),await w(this.options,{name:"shu.period-created",occurredAt:I(),entityId:r.id,tenantId:(i=r.tenantId)!=null?i:null,branchId:(s=r.branchId)!=null?s:null,payload:{periodCode:r.periodCode}}),r}async finalizeShuPeriod(e){var a,o;let r=await this.repos.shuPeriodRepository.getById(e);if(!r||r.deleted)throw O("SHU period",e);let n=await this.repos.shuPeriodRepository.update(e,{status:"finalized",version:r.version+1,lastModified:I()});return await w(this.options,{name:"shu.period-finalized",occurredAt:I(),entityId:n.id,tenantId:(a=n.tenantId)!=null?a:null,branchId:(o=n.branchId)!=null?o:null,payload:{status:n.status}}),n}async listShuPeriods(e={}){return(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 this.inTx(async r=>{var d,m,l,p,g,b,u,f,v,S,C,D,A,M,E,_,N,Q,V,H,re,ne,G,ae,oe;let n=await r.shuPeriodRepository.getById(e);if(!n||n.deleted)throw O("SHU period",e);let a=await r.memberRepository.list({includeDeleted:!1,tenantId:(d=n.tenantId)!=null?d:void 0,branchId:(m=n.branchId)!=null?m:void 0});if(a.length===0)return[];let o=n.formulaSnapshot,i=String((l=o.distributionMode)!=null?l:"equal-share"),s=[];if(i==="score-weighted-v1"){let R=this.toDateOnly(n.startDate),j=this.toDateOnly(n.endDate),L=Number((g=(p=o.shuTahunBukuIdr)!=null?p:o.totalDistributableShuIdr)!=null?g:0),x=Number((b=o.cadanganPercent)!=null?b:0),T=Number((u=o.poolAnggotaPercent)!=null?u:0),$=Number((f=o.bobotTransaksiPercent)!=null?f:0),B=Number((v=o.bobotModalPercent)!=null?v:0),ie=!!((S=o.includeSukarelaInModalBasis)!=null&&S),se=Array.isArray(o.sukarelaModalReferenceTypes)?o.sukarelaModalReferenceTypes.map(P=>String(P).trim()).filter(P=>P.length>0):[],q=new Set(se),ge=o.transactionScoreByMemberId&&typeof o.transactionScoreByMemberId=="object"?o.transactionScoreByMemberId:{};if(!Number.isFinite(L)||L<=0)throw y("shuTahunBukuIdr must be provided for score-weighted-v1 allocation");if(!Number.isFinite(x)||x<0||x>100)throw y("cadanganPercent must be in range 0-100 for score-weighted-v1 allocation");if(!Number.isFinite(T)||T<0||T>100)throw y("poolAnggotaPercent must be in range 0-100 for score-weighted-v1 allocation");if(!Number.isFinite($)||!Number.isFinite(B)||$<0||B<0||$+B!==100)throw y("bobotTransaksiPercent + bobotModalPercent must equal 100 for score-weighted-v1 allocation");let ce=Math.max(0,Math.floor(L-L*x/100)),W=Math.max(0,Math.floor(ce*T/100));if(W<=0)return[];let de=[];for(let P of a){let F=this.getEligibleWindow(P,R,j);if(!F)continue;let le=await this.computeAverageModalBasis({memberId:P.id,tenantId:(C=n.tenantId)!=null?C:null,branchId:(D=n.branchId)!=null?D:null,periodStart:R,periodEnd:j,activeStart:F.start,activeEnd:F.end,includeSukarela:ie,allowedSukarelaReferenceTypes:q,repos:r}),Y=Number((A=ge[P.id])!=null?A:0),z=Number.isFinite(Y)&&Y>0?Y*F.proRataFactor:0,be=le>0?le:0,pt=$/100*z+B/100*be;de.push({member:P,proRataFactor:F.proRataFactor,modalScore:be,transaksiScore:z,score:pt,activeDays:F.activeDays})}let me=de.filter(P=>P.score>0),J=this.allocateWithLargestRemainder({poolAmount:W,members:me.map(P=>({memberId:P.member.id,score:P.score}))});for(let P of me)s.push({id:this.newAllocationId(),shuPeriodId:e,memberId:P.member.id,allocationAmount:(M=J.get(P.member.id))!=null?M:0,calculationBasis:{mode:"score-weighted-v1",shuTahunBukuIdr:L,cadanganPercent:x,shuSetelahCadangan:ce,poolAnggotaPercent:T,poolShuAnggota:W,bobotTransaksiPercent:$,bobotModalPercent:B,includeSukarelaInModalBasis:ie,sukarelaModalReferenceTypes:se,proRataFactor:P.proRataFactor,activeDays:P.activeDays,transaksiScore:P.transaksiScore,modalScore:P.modalScore,score:P.score},branchId:(_=(E=P.member.branchId)!=null?E:n.branchId)!=null?_:null,tenantId:(Q=(N=P.member.tenantId)!=null?N:n.tenantId)!=null?Q:null,version:1,lastModified:I(),deleted:!1})}else{let R=a.filter(T=>T.status==="active");if(R.length===0)return[];let j=Number(o.totalDistributableShuIdr||0),L=Number.isFinite(j)&&j>0?j:R.length*1e5,x=Math.floor(L/R.length);for(let T of R)s.push({id:this.newAllocationId(),shuPeriodId:e,memberId:T.id,allocationAmount:x,calculationBasis:{mode:"equal-share",memberCount:R.length,sourceTotal:L},branchId:(H=(V=T.branchId)!=null?V:n.branchId)!=null?H:null,tenantId:(ne=(re=T.tenantId)!=null?re:n.tenantId)!=null?ne:null,version:1,lastModified:I(),deleted:!1})}let c=await r.shuAllocationRepository.createMany(s);return(G=this.options.logger)==null||G.logInfo("[ofcoop] shu allocations generated",{periodId:e,allocations:c.length}),await w(this.options,{name:"shu.allocations-generated",occurredAt:I(),entityId:e,tenantId:(ae=n.tenantId)!=null?ae:null,branchId:(oe=n.branchId)!=null?oe:null,payload:{allocations:c.length}}),c})}async listShuAllocations(e,r){return this.repos.shuAllocationRepository.listByPeriod(e,r)}async exportShuAllocationsCsv(e){let n=["allocationId,shuPeriodId,memberId,allocationAmount",...(await this.listShuAllocations(e,{includeDeleted:!1})).map(a=>`${a.id},${a.shuPeriodId},${a.memberId},${a.allocationAmount}`)].join(`
|
|
2
|
+
`);return{filename:`shu-allocations-${e}.csv`,contentType:"text/csv",body:n}}};async function tt(t,e={}){let r=U(t);return{memberService:new ye(t,r,e),memberNumberPolicyService:new ve(r),savingLedgerService:new Se(t,r,e),savingPolicyService:new Ie(r,e),savingComplianceSnapshotService:new he(r),shuConfigService:new Ce(r,e),shuService:new Pe(t,r,e)}}var Fe=class{constructor(e,r){this.runtime=e;this.runtimeStateStore=r;this.runtimeStore=yt(this.runtimeStateStore)}static builder(){return new _e}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(r=>({...r,phase:"started",started:!0,startCount:r.startCount+1,lastError:null,lastTransitionAt:new Date().toISOString()}))}catch(r){throw this.runtimeStateStore.setState({phase:"error",started:!1,lastError:r instanceof Error?r.message:String(r),lastTransitionAt:new Date().toISOString()}),r}}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(r=>({...r,phase:"started",started:!0,startCount:r.startCount+1,lastError:null,lastTransitionAt:new Date().toISOString()}))}catch(r){throw this.runtimeStateStore.setState({phase:"error",started:!1,lastError:r instanceof Error?r.message:String(r),lastTransitionAt:new Date().toISOString()}),r}}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,r,n=[]){return this.runtime.use(e,async()=>r(this),n),this}},_e=class{constructor(){this.runtimeBuilder=vt.builder();this.domainServiceOverrides={};this.runtimeHooks={};this.runtimeBuilder.withDbAdapter(()=>new rt)}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,r){return this.runtimeBuilder.withExtension(e,r),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})}withSeedRunner(e){return this.withRuntimeHooks({runSeed:e})}withDomainEventSink(e){return this.domainEventSink=e,this}build(){var a;let e=ht({phase:"idle",started:!1,startCount:0,stopCount:0,lastError:null,lastTransitionAt:new Date().toISOString()}),r=async o=>{var s,c;let i=(s=o.registry)==null?void 0:s.dbAdapter;i&&await Ge(i,(c=o.registry)==null?void 0:c.loggerAdapter)};this.runtimeBuilder.withHooks({...this.runtimeHooks,runMigrations:(a=this.runtimeHooks.runMigrations)!=null?a:r,createDomainServices:async o=>{var c,d,m;let i=async l=>{var g,b,u;let p=[];if(this.domainEventSink)try{await this.domainEventSink(l)}catch(f){p.push(f)}if((g=o.registry)!=null&&g.activitySink)try{await o.registry.activitySink.publish({activityId:o.createCorrelationId("ofcoop-event"),activityType:`ofcoop.${l.name}`,occurredAt:l.occurredAt,scopeRef:{domain:"ofcoop",...l.tenantId?{tenantId:l.tenantId}:{},...l.branchId?{branchId:l.branchId}:{}},payload:{entityId:(b=l.entityId)!=null?b:null,...(u=l.payload)!=null?u:{}},correlationId:o.createCorrelationId("ofcoop-corr")})}catch(f){p.push(f)}if(p.length>0)throw p[0]};return{...this.domainServicesFactory?await this.domainServicesFactory():await tt((d=(c=o.registry)==null?void 0:c.dbAdapter)!=null?d:new rt,{logger:(m=o.registry)==null?void 0:m.loggerAdapter,emitEvent:i}),...this.domainServiceOverrides}}});let n=this.runtimeBuilder.build();return new Fe(n,e)}};async function Cn(t,e){var c,d,m,l,p,g,b;if(!((c=e.transactionDate)!=null&&c.trim()))throw y("transactionDate is required");let r=Math.max(0,(d=e.initialPokokDepositIdr)!=null?d:0),n=Math.max(0,(m=e.initialWajibDepositIdr)!=null?m:0),a=Math.max(0,(l=e.initialSukarelaDepositIdr)!=null?l:0);if(t.savingPolicyService&&e.koperasiId&&e.member.tenantId){let u=await t.savingPolicyService.getActiveSavingPolicy({koperasiId:e.koperasiId,tenantId:e.member.tenantId,branchId:(p=e.member.branchId)!=null?p:null});if(u&&r<u.simpananPokokNominalIdr)throw y(`initialPokokDepositIdr must be >= ${u.simpananPokokNominalIdr}`)}let o=await t.memberService.createMember(e.member),i=[],s={memberId:o.id,transactionDate:e.transactionDate,tenantId:(g=o.tenantId)!=null?g:null,branchId:(b=o.branchId)!=null?b:null};return r>0&&i.push(await t.savingLedgerService.recordSavingCredit({...s,savingType:"pokok",amount:r})),n>0&&i.push(await t.savingLedgerService.recordSavingCredit({...s,savingType:"wajib",amount:n})),a>0&&i.push(await t.savingLedgerService.recordSavingCredit({...s,savingType:"sukarela",amount:a})),{member:o,ledgerEntries:i}}async function Pn(t,e){var i;let r=await t.savingPolicyService.upsertSavingPolicy(e),n={koperasiId:e.koperasiId,tenantId:e.tenantId,branchId:(i=e.branchId)!=null?i:null},a=await t.savingPolicyService.evaluateWajibCompliance(n),o=await t.savingPolicyService.getComplianceWorklist(n);return{policy:r,evaluation:a,worklist:o}}async function An(t,e){let r=await t.shuService.createShuPeriod(e),n=await t.shuService.generateShuAllocations(r.id),a=await t.shuService.exportShuAllocationsCsv(r.id);return{period:r,allocations:n,csv:a}}function St(t){var r;let e=t.accessContext;if(e&&e.role==="anggota"){if(!((r=e.actorMemberId)!=null&&r.trim()))throw y("member360 access denied: anggota context requires actorMemberId");if(e.actorMemberId!==t.memberId)throw y("member360 access denied: anggota can only access own memberId")}}function It(t){return t.map(e=>({itemId:`saving-${e.id}`,occurredAt:e.transactionDate,source:"saving-ledger",title:`${e.entryType} ${e.savingType}`,detail:`${e.amount}`}))}function Ct(t){var e;return(e=t==null?void 0:t.recentLoans)!=null&&e.length?t.recentLoans.map(r=>({itemId:`loan-${r.loanId}`,occurredAt:r.startDate,source:"credit",title:`loan ${r.status}`,detail:`${r.principalAmount}`})):[]}function Pt(t){return t.map(e=>{var r;return{itemId:`audit-${e.eventId}`,occurredAt:e.occurredAt,source:"audit",title:e.eventType,detail:(r=e.message)!=null?r:e.eventType}})}async function wn(t,e){var g,b,u,f,v,S,C,D,A,M,E,_,N;St(e);let r=await t.memberService.getMemberById(e.memberId);if(!r||r.deleted)return null;let n={...(g=e.savingQuery)!=null?g:{},...(b=e.scope)!=null&&b.tenantId?{tenantId:e.scope.tenantId}:{},...(u=e.scope)!=null&&u.branchId?{branchId:e.scope.branchId}:{}},[a,o,i,s,c]=await Promise.all([t.savingLedgerService.getSavingBalanceByMember(r.id),t.savingLedgerService.listSavingEntriesByMember(r.id,n),(S=(v=(f=t.providers)==null?void 0:f.getCreditByMember)==null?void 0:v.call(f,r.id,e.scope))!=null?S:Promise.resolve(null),(A=(D=(C=t.providers)==null?void 0:C.getAuditByMember)==null?void 0:D.call(C,r.id,e.scope))!=null?A:Promise.resolve([]),(_=(E=(M=t.providers)==null?void 0:M.getSettlementSummaryByMember)==null?void 0:E.call(M,r.id,e.scope))!=null?_:Promise.resolve(null)]),d=It(o),m=Ct(i),l=Pt(s),p=[...d,...m,...l].sort((Q,V)=>V.occurredAt.localeCompare(Q.occurredAt));return{member:r,savings:{balance:a,recentEntries:o},credit:i,settlement:c,audit:s,timeline:p.slice(0,Math.max(1,(N=e.timelineLimit)!=null?N:20))}}function Rn(t){var n,a,o,i,s,c,d,m,l,p,g,b,u,f,v;let e=(n=t.credit)==null?void 0:n.summary,r=t.settlement;return{member:{id:t.member.id,memberNumber:t.member.memberNumber,fullName:t.member.fullName,status:t.member.status,joinDate:t.member.joinDate,exitDate:(a=t.member.exitDate)!=null?a:null,tenantId:(o=t.member.tenantId)!=null?o:null,branchId:(i=t.member.branchId)!=null?i:null},kpiCards:[{id:"saving-total",label:"Total Simpanan",value:t.savings.balance.total,unit:"IDR"},{id:"saving-pokok",label:"Simpanan Pokok",value:t.savings.balance.pokok,unit:"IDR"},{id:"saving-wajib",label:"Simpanan Wajib",value:t.savings.balance.wajib,unit:"IDR"},{id:"saving-sukarela",label:"Simpanan Sukarela",value:t.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:(c=r==null?void 0:r.totalOverdue)!=null?c:0,unit:"IDR"}],sections:[{id:"credit-summary",title:"Ringkasan Kredit",rows:[{key:"totalLoans",label:"Total Pinjaman",value:(d=e==null?void 0:e.totalLoans)!=null?d:0},{key:"activeLoans",label:"Pinjaman Aktif",value:(m=e==null?void 0:e.activeLoans)!=null?m:0},{key:"closedLoans",label:"Pinjaman Lunas",value:(l=e==null?void 0:e.closedLoans)!=null?l:0},{key:"defaultedLoans",label:"Pinjaman Macet",value:(p=e==null?void 0:e.defaultedLoans)!=null?p:0},{key:"totalPrincipalAmount",label:"Total Pokok Pinjaman",value:(g=e==null?void 0:e.totalPrincipalAmount)!=null?g:0,unit:"IDR"}]},{id:"settlement-summary",title:"Ringkasan Settlement",rows:[{key:"totalOutstanding",label:"Total Outstanding",value:(b=r==null?void 0:r.totalOutstanding)!=null?b:0,unit:"IDR"},{key:"totalOverdue",label:"Total Overdue",value:(u=r==null?void 0:r.totalOverdue)!=null?u:0,unit:"IDR"},{key:"settlementStatus",label:"Status Settlement",value:(f=r==null?void 0:r.settlementStatus)!=null?f:"clear"},{key:"notes",label:"Catatan",value:(v=r==null?void 0:r.notes)!=null?v:"-"}]},{id:"audit-summary",title:"Ringkasan Audit",rows:[{key:"auditCount",label:"Jumlah Event Audit",value:t.audit.length}]}],timeline:t.timeline}}function At(t){return[...t].sort((e,r)=>r.occurredAt.localeCompare(e.occurredAt))}async function Dt(t,e,r){for(let n of t){if(!n.provider.getCreditByMember)continue;let a=await n.provider.getCreditByMember(e,r);if(a)return a}return null}async function Mt(t,e,r){let n=await Promise.all(t.map(a=>{var o,i,s;return(s=(i=(o=a.provider).getAuditByMember)==null?void 0:i.call(o,e,r))!=null?s:Promise.resolve([])}));return At(n.flat()).slice(0,100)}async function wt(t,e,r){for(let n of t){if(!n.provider.getSettlementSummaryByMember)continue;let a=await n.provider.getSettlementSummaryByMember(e,r);if(a)return a}return null}function xn(t){return{async getCreditByMember(e,r){return Dt(t,e,r)},async getAuditByMember(e,r){return Mt(t,e,r)},async getSettlementSummaryByMember(e,r){return wt(t,e,r)}}}var nt=1440*60*1e3;function at(t){return t.slice(0,10)}function $e(t){return Date.parse(`${t}T00:00:00.000Z`)}function Tt(t,e){let r=[];for(let n=$e(t);n<=$e(e);n+=nt)r.push(new Date(n).toISOString().slice(0,10));return r}function ot(t,e){let r=at(t),n=$e(r),a=n-(e-1)*nt;return{fromDate:new Date(a).toISOString().slice(0,10),toDate:new Date(n).toISOString().slice(0,10)}}function it(t,e,r){let n=new Map;for(let a of Tt(e,r))n.set(a,{date:a,masuk:0,keluar:0,net:0});for(let a of t){let o=at(a.transactionDate),i=n.get(o);i&&(a.entryType==="credit"?(i.masuk+=a.amount,i.net+=a.amount):(i.keluar+=a.amount,i.net-=a.amount))}return Array.from(n.values())}function Rt(t){var r;let e=t.accessContext;if(!(!e||e.role!=="anggota")){if(!((r=e.actorMemberId)!=null&&r.trim()))throw y("anggota dashboard access denied: actorMemberId is required");if(e.actorMemberId!==t.memberId)throw y("anggota dashboard access denied: only self memberId is allowed")}}function kt(t){let e=t.accessContext;if(e&&e.role!=="pengawas")throw y("pengawas dashboard access denied: role must be pengawas")}function xt(t){let e=t.accessContext;if(e&&e.role!=="pengurus")throw y("pengurus dashboard access denied: role must be pengurus")}async function Ot(t,e,r,n){let a=`${e}T00:00:00.000Z`,o=`${r}T23:59:59.999Z`,i=await t.memberService.listMembers({includeDeleted:!1,...n!=null&&n.tenantId?{tenantId:n.tenantId}:{},...n!=null&&n.branchId?{branchId:n.branchId}:{}});return(await Promise.all(i.map(c=>t.savingLedgerService.listSavingEntriesByMember(c.id,{includeDeleted:!1,dateFrom:a,dateTo:o,...n!=null&&n.tenantId?{tenantId:n.tenantId}:{},...n!=null&&n.branchId?{branchId:n.branchId}:{}})))).flat()}async function Ln(t,e={}){var D,A,M,E,_,N,Q,V,H,re,ne,G,ae,oe,R,j,L,x,T,$,B,ie,se,q,ge,ce,W,de,me,J,P,F,le,Y;xt(e);let r=Math.max(1,Math.min(90,(D=e.rollingDays)!=null?D:30)),n=(A=e.referenceDate)!=null?A:new Date().toISOString(),{fromDate:a,toDate:o}=ot(n,r),[i,s,c,d,m,l,p,g,b,u]=await Promise.all([Ot(t,a,o,e.scope),(_=(E=(M=t.providers)==null?void 0:M.getLoanStatusComposition)==null?void 0:E.call(M,e.scope))!=null?_:Promise.resolve({aktif:0,jatuhTempo:0,macet:0,lunas:0}),(V=(Q=(N=t.providers)==null?void 0:N.getLoanAgingBuckets)==null?void 0:Q.call(N,e.scope))!=null?V:Promise.resolve({d0to7:0,d8to30:0,d31to60:0,dOver60:0}),(ne=(re=(H=t.providers)==null?void 0:H.getOnboardingFunnel)==null?void 0:re.call(H,e.scope))!=null?ne:Promise.resolve({daftar:0,verifikasiPokok:0,aktif:0}),(oe=(ae=(G=t.providers)==null?void 0:G.getWajibComplianceTrend)==null?void 0:ae.call(G,e.scope))!=null?oe:Promise.resolve([]),(L=(j=(R=t.providers)==null?void 0:R.getSavingTypeCompositionByPeriod)==null?void 0:j.call(R,e.scope))!=null?L:Promise.resolve([]),($=(T=(x=t.providers)==null?void 0:x.getMemberGrowthTrend)==null?void 0:T.call(x,e.scope))!=null?$:Promise.resolve([]),(se=(ie=(B=t.providers)==null?void 0:B.getShuDistributionSummary)==null?void 0:ie.call(B,e.scope))!=null?se:Promise.resolve([]),(ce=(ge=(q=t.providers)==null?void 0:q.getOperationalActivityHeatmap)==null?void 0:ge.call(q,e.scope))!=null?ce:Promise.resolve([]),(me=(de=(W=t.providers)==null?void 0:W.getLoanRiskMap)==null?void 0:de.call(W,e.scope))!=null?me:Promise.resolve([])]),f=(F=await((P=(J=t.providers)==null?void 0:J.getTotalOverdueAmount)==null?void 0:P.call(J,e.scope)))!=null?F:0,v=it(i,a,o),S=v.reduce((z,be)=>z+be.net,0);return{kpi:{activeMembers:await t.memberService.listMembers({includeDeleted:!1,status:"active",...(le=e.scope)!=null&&le.tenantId?{tenantId:e.scope.tenantId}:{},...(Y=e.scope)!=null&&Y.branchId?{branchId:e.scope.branchId}:{}}).then(z=>z.length),totalSavingNet:S,activeLoans:s.aktif,totalOverdueAmount:f},savingsCashflow30Days:v,loanStatusComposition:s,loanAgingBuckets:c,advanced:{onboardingFunnel:d,wajibComplianceTrend:m,savingTypeCompositionByPeriod:l,memberGrowthTrend:p,shuDistributionSummary:g,operationalActivityHeatmap:b,loanRiskMap:u}}}async function Nn(t,e={}){var s,c,d,m,l,p,g,b,u,f,v,S,C,D,A;kt(e);let[r,n,a,o,i]=await Promise.all([(d=(c=(s=t.providers)==null?void 0:s.getLoanStatusComposition)==null?void 0:c.call(s,e.scope))!=null?d:Promise.resolve({aktif:0,jatuhTempo:0,macet:0,lunas:0}),(p=(l=(m=t.providers)==null?void 0:m.getLoanAgingBuckets)==null?void 0:l.call(m,e.scope))!=null?p:Promise.resolve({d0to7:0,d8to30:0,d31to60:0,dOver60:0}),(u=(b=(g=t.providers)==null?void 0:g.getTotalOverdueAmount)==null?void 0:b.call(g,e.scope))!=null?u:Promise.resolve(0),(S=(v=(f=t.providers)==null?void 0:f.getWajibComplianceTrend)==null?void 0:v.call(f,e.scope))!=null?S:Promise.resolve([]),(A=(D=(C=t.providers)==null?void 0:C.getMemberGrowthTrend)==null?void 0:D.call(C,e.scope))!=null?A:Promise.resolve([])]);return{risk:{loanStatusComposition:r,loanAgingBuckets:n,totalOverdueAmount:a},trends:{wajibComplianceTrend:o,memberGrowthTrend:i}}}async function Bn(t,e){var g,b,u,f,v,S,C,D,A,M,E;Rt(e);let r=await t.memberService.getMemberById(e.memberId);if(!r||r.deleted)return null;let n=Math.max(1,Math.min(90,(g=e.rollingDays)!=null?g:30)),a=(b=e.referenceDate)!=null?b:new Date().toISOString(),{fromDate:o,toDate:i}=ot(a,n),s=`${o}T00:00:00.000Z`,c=`${i}T23:59:59.999Z`,[d,m,l,p]=await Promise.all([t.savingLedgerService.getSavingBalanceByMember(e.memberId),t.savingLedgerService.listSavingEntriesByMember(e.memberId,{includeDeleted:!1,dateFrom:s,dateTo:c,...(u=e.scope)!=null&&u.tenantId?{tenantId:e.scope.tenantId}:{},...(f=e.scope)!=null&&f.branchId?{branchId:e.scope.branchId}:{}}),(C=(S=(v=t.providers)==null?void 0:v.getAnggotaCreditSummary)==null?void 0:S.call(v,e.memberId,e.scope))!=null?C:Promise.resolve({activeLoans:0,outstandingPrincipalAmount:0,totalOverdueAmount:0,nextDueDate:null}),(M=(A=(D=t.providers)==null?void 0:D.getAnggotaComplianceStatus)==null?void 0:A.call(D,e.memberId,e.scope))!=null?M:Promise.resolve({status:"unknown",monthsInArrears:0})]);return{memberId:e.memberId,kpi:{totalSavingBalance:d.total,activeLoans:l.activeLoans,outstandingPrincipalAmount:l.outstandingPrincipalAmount,totalOverdueAmount:l.totalOverdueAmount},savingsCashflow30Days:it(m,o,i),compliance:p,nextDueDate:(E=l.nextDueDate)!=null?E:null}}function Fn(t){return{role:"pengurus",kpiCards:[{id:"active-members",label:"Anggota Aktif",value:t.kpi.activeMembers},{id:"total-saving-net",label:"Net Simpanan",value:t.kpi.totalSavingNet,unit:"IDR"},{id:"active-loans",label:"Pinjaman Aktif",value:t.kpi.activeLoans},{id:"total-overdue",label:"Total Tunggakan",value:t.kpi.totalOverdueAmount,unit:"IDR"}],charts:[{id:"savings-cashflow-30-days",title:"Arus Kas Simpanan 30 Hari",chartType:"area",series:[{key:"masuk",label:"Masuk",points:t.savingsCashflow30Days.map(e=>({x:e.date,y:e.masuk}))},{key:"keluar",label:"Keluar",points:t.savingsCashflow30Days.map(e=>({x:e.date,y:e.keluar}))},{key:"net",label:"Net",points:t.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:t.loanStatusComposition.aktif},{x:"jatuh_tempo",y:t.loanStatusComposition.jatuhTempo},{x:"macet",y:t.loanStatusComposition.macet},{x:"lunas",y:t.loanStatusComposition.lunas}]}]},{id:"loan-aging-buckets",title:"Aging Jatuh Tempo Pinjaman",chartType:"bar",series:[{key:"aging",label:"Jumlah Pinjaman",points:[{x:"0-7",y:t.loanAgingBuckets.d0to7},{x:"8-30",y:t.loanAgingBuckets.d8to30},{x:"31-60",y:t.loanAgingBuckets.d31to60},{x:">60",y:t.loanAgingBuckets.dOver60}]}]}]}}function _n(t){return{role:"pengawas",kpiCards:[{id:"total-overdue",label:"Total Tunggakan",value:t.risk.totalOverdueAmount,unit:"IDR"}],charts:[{id:"loan-status-composition",title:"Komposisi Status Pinjaman",chartType:"donut",series:[{key:"loan-status",label:"Status Pinjaman",points:[{x:"aktif",y:t.risk.loanStatusComposition.aktif},{x:"jatuh_tempo",y:t.risk.loanStatusComposition.jatuhTempo},{x:"macet",y:t.risk.loanStatusComposition.macet},{x:"lunas",y:t.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:t.risk.loanAgingBuckets.d0to7},{x:"8-30",y:t.risk.loanAgingBuckets.d8to30},{x:"31-60",y:t.risk.loanAgingBuckets.d31to60},{x:">60",y:t.risk.loanAgingBuckets.dOver60}]}]},{id:"wajib-compliance-trend",title:"Tren Kepatuhan Simpanan Wajib",chartType:"line",series:[{key:"patuh",label:"Patuh",points:t.trends.wajibComplianceTrend.map(e=>({x:e.month,y:e.patuh}))},{key:"menunggak",label:"Menunggak",points:t.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:t.trends.memberGrowthTrend.map(e=>({x:e.month,y:e.active}))},{key:"non-active",label:"Non-Aktif",points:t.trends.memberGrowthTrend.map(e=>({x:e.month,y:e.nonActive}))}]}]}}function $n(t){var e;return{role:"anggota",memberId:t.memberId,kpiCards:[{id:"total-saving-balance",label:"Saldo Simpanan",value:t.kpi.totalSavingBalance,unit:"IDR"},{id:"active-loans",label:"Pinjaman Aktif",value:t.kpi.activeLoans},{id:"outstanding-principal",label:"Outstanding Pokok",value:t.kpi.outstandingPrincipalAmount,unit:"IDR"},{id:"total-overdue",label:"Total Tunggakan",value:t.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:t.savingsCashflow30Days.map(r=>({x:r.date,y:r.masuk}))},{key:"keluar",label:"Keluar",points:t.savingsCashflow30Days.map(r=>({x:r.date,y:r.keluar}))},{key:"net",label:"Net",points:t.savingsCashflow30Days.map(r=>({x:r.date,y:r.net}))}]}],compliance:t.compliance,nextDueDate:(e=t.nextDueDate)!=null?e:null}}var Et={loanCount:0,activeLoanCount:0,closedLoanCount:0,defaultedLoanCount:0,outstandingPrincipalAmount:0,totalOverdueAmount:0},Lt={allocationCount:0,totalAllocatedAmount:0};function Nt(t){let e=t.from.slice(0,10),r=t.to.slice(0,10);return{fromIso:`${e}T00:00:00.000Z`,toIso:`${r}T23:59:59.999Z`}}function Bt(t){let e=0,r=0,n=0,a=0,o=0;for(let i of t){let s=i.entryType==="credit"?1:-1;i.entryType==="credit"?e+=i.amount:r+=i.amount,i.savingType==="pokok"&&(n+=s*i.amount),i.savingType==="wajib"&&(a+=s*i.amount),i.savingType==="sukarela"&&(o+=s*i.amount)}return{creditTotal:e,debitTotal:r,netTotal:e-r,byType:{pokok:n,wajib:a,sukarela:o}}}function jt(t){return["section,key,value",`period,from,${t.period.from}`,`period,to,${t.period.to}`,`members,total,${t.members.total}`,`members,active,${t.members.active}`,`members,inactive,${t.members.inactive}`,`members,exited,${t.members.exited}`,`savings,creditTotal,${t.savings.creditTotal}`,`savings,debitTotal,${t.savings.debitTotal}`,`savings,netTotal,${t.savings.netTotal}`,`savings,pokokNet,${t.savings.byType.pokok}`,`savings,wajibNet,${t.savings.byType.wajib}`,`savings,sukarelaNet,${t.savings.byType.sukarela}`,`credit,loanCount,${t.credit.loanCount}`,`credit,activeLoanCount,${t.credit.activeLoanCount}`,`credit,closedLoanCount,${t.credit.closedLoanCount}`,`credit,defaultedLoanCount,${t.credit.defaultedLoanCount}`,`credit,outstandingPrincipalAmount,${t.credit.outstandingPrincipalAmount}`,`credit,totalOverdueAmount,${t.credit.totalOverdueAmount}`,`shu,allocationCount,${t.shu.allocationCount}`,`shu,totalAllocatedAmount,${t.shu.totalAllocatedAmount}`,`crossDomain,memberActivationRate,${t.crossDomain.memberActivationRate}`,`crossDomain,creditPenetrationRate,${t.crossDomain.creditPenetrationRate}`,`crossDomain,overdueToOutstandingRatio,${t.crossDomain.overdueToOutstandingRatio}`,`crossDomain,savingsPerActiveMember,${t.crossDomain.savingsPerActiveMember}`,`crossDomain,shuPerActiveMember,${t.crossDomain.shuPerActiveMember}`]}function We(t,e){return e<=0?0:Number((t/e).toFixed(4))}async function st(t,e){var b,u,f,v,S,C,D;let r=(b=e.scope)!=null?b:{},{fromIso:n,toIso:a}=Nt(e.period),o=await t.memberService.listMembers({includeDeleted:!1,...r.tenantId?{tenantId:r.tenantId}:{},...r.branchId?{branchId:r.branchId}:{}}),s=(await Promise.all(o.map(A=>t.savingLedgerService.listSavingEntriesByMember(A.id,{includeDeleted:!1,dateFrom:n,dateTo:a,...r.tenantId?{tenantId:r.tenantId}:{},...r.branchId?{branchId:r.branchId}:{}})))).flat(),c=Bt(s),d=(v=await((f=(u=t.providers)==null?void 0:u.getCreditSummary)==null?void 0:f.call(u,e.period,r)))!=null?v:Et,m=(D=await((C=(S=t.providers)==null?void 0:S.getShuSummary)==null?void 0:C.call(S,e.period,r)))!=null?D:Lt,l=o.filter(A=>A.status==="active").length,p=o.length,g={memberActivationRate:We(l,p),creditPenetrationRate:We(d.activeLoanCount,l),overdueToOutstandingRatio:We(d.totalOverdueAmount,d.outstandingPrincipalAmount),savingsPerActiveMember:l>0?Math.round(c.netTotal/l):0,shuPerActiveMember:l>0?Math.round(m.totalAllocatedAmount/l):0};return{period:e.period,scope:r,members:{total:p,active:l,inactive:o.filter(A=>A.status==="inactive").length,exited:o.filter(A=>A.status==="exited").length},savings:c,credit:d,shu:m,crossDomain:g}}async function Un(t,e){let r=await st(t,e),n=jt(r).join(`
|
|
3
|
+
`);return{filename:`report-summary-${r.period.from.slice(0,10)}-${r.period.to.slice(0,10)}.csv`,contentType:"text/csv",body:n}}async function Qn(t,e){let r=await st(t,e),n={schemaVersion:"1",generatedAt:new Date().toISOString(),summary:r};return{filename:`report-summary-${r.period.from.slice(0,10)}-${r.period.to.slice(0,10)}.json`,contentType:"application/json",body:JSON.stringify(n),data:n}}function Hn(t){return{period:t.period,scope:t.scope,kpiCards:[{id:"members-total",label:"Total Anggota",value:t.members.total},{id:"members-active",label:"Anggota Aktif",value:t.members.active},{id:"savings-net",label:"Net Simpanan",value:t.savings.netTotal,unit:"IDR"},{id:"credit-overdue",label:"Total Tunggakan",value:t.credit.totalOverdueAmount,unit:"IDR"},{id:"shu-total",label:"Total SHU Alokasi",value:t.shu.totalAllocatedAmount,unit:"IDR"}],tableSections:[{id:"members",title:"Ringkasan Anggota",rows:[{key:"total",label:"Total",value:t.members.total},{key:"active",label:"Aktif",value:t.members.active},{key:"inactive",label:"Non-Aktif",value:t.members.inactive},{key:"exited",label:"Keluar",value:t.members.exited}]},{id:"savings",title:"Ringkasan Simpanan",rows:[{key:"creditTotal",label:"Total Masuk",value:t.savings.creditTotal,unit:"IDR"},{key:"debitTotal",label:"Total Keluar",value:t.savings.debitTotal,unit:"IDR"},{key:"netTotal",label:"Total Net",value:t.savings.netTotal,unit:"IDR"},{key:"pokokNet",label:"Net Pokok",value:t.savings.byType.pokok,unit:"IDR"},{key:"wajibNet",label:"Net Wajib",value:t.savings.byType.wajib,unit:"IDR"},{key:"sukarelaNet",label:"Net Sukarela",value:t.savings.byType.sukarela,unit:"IDR"}]},{id:"credit",title:"Ringkasan Kredit",rows:[{key:"loanCount",label:"Total Pinjaman",value:t.credit.loanCount},{key:"activeLoanCount",label:"Pinjaman Aktif",value:t.credit.activeLoanCount},{key:"closedLoanCount",label:"Pinjaman Lunas",value:t.credit.closedLoanCount},{key:"defaultedLoanCount",label:"Pinjaman Macet",value:t.credit.defaultedLoanCount},{key:"outstandingPrincipalAmount",label:"Outstanding Pokok",value:t.credit.outstandingPrincipalAmount,unit:"IDR"},{key:"totalOverdueAmount",label:"Total Tunggakan",value:t.credit.totalOverdueAmount,unit:"IDR"}]},{id:"shu",title:"Ringkasan SHU",rows:[{key:"allocationCount",label:"Jumlah Alokasi",value:t.shu.allocationCount},{key:"totalAllocatedAmount",label:"Total Alokasi",value:t.shu.totalAllocatedAmount,unit:"IDR"}]},{id:"cross-domain",title:"Metrik Lintas Domain",rows:[{key:"memberActivationRate",label:"Activation Rate Anggota",value:t.crossDomain.memberActivationRate},{key:"creditPenetrationRate",label:"Credit Penetration Rate",value:t.crossDomain.creditPenetrationRate},{key:"overdueToOutstandingRatio",label:"Overdue/Outstanding Ratio",value:t.crossDomain.overdueToOutstandingRatio},{key:"savingsPerActiveMember",label:"Simpanan per Anggota Aktif",value:t.crossDomain.savingsPerActiveMember,unit:"IDR"},{key:"shuPerActiveMember",label:"SHU per Anggota Aktif",value:t.crossDomain.shuPerActiveMember,unit:"IDR"}]}]}}function Ft(t){let e={...t};return e.limit==null&&(e.limit=100),e.limit<1&&(e.limit=1),e.limit>1e3&&(e.limit=1e3),e}function _t(t){return!t||t.length===0?null:new Set(t)}function $t(t,e){var n;if(!e||!((n=t.eventTypes)!=null&&n.length))return;let r=t.eventTypes.filter(a=>!e.has(a));if(r.length>0)throw y(`audit trail query contains unknown eventTypes: ${r.join(", ")}`)}function Wt(t){var n;let e=Ft(t),r=e.accessContext;if(!r||r.role!=="anggota")return e;if(!((n=r.actorMemberId)!=null&&n.trim()))throw y("audit trail access denied: anggota context requires actorMemberId");if(e.memberId&&e.memberId!==r.actorMemberId)throw y("audit trail access denied: anggota can only query own memberId");return{...e,memberId:r.actorMemberId}}function Ut(t,e){var r;return t.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,(r=e.limit)!=null?r:100)}async function Zn(t,e={}){let r=_t(t.eventCatalog),n=Wt(e);$t(n,r);let a=await t.providers.listEvents(n),o=r?a.filter(i=>r.has(i.eventType)):a;return Ut(o,n)}function Qt(t){return[...new Set(t)]}function Jn(t){return{eventCatalog:Qt(t.flatMap(r=>{var n;return(n=r.eventCatalog)!=null?n:[]})),auditTrailProvider:{async listEvents(r){return(await Promise.all(t.map(a=>a.provider.listEvents(r)))).flat().sort((a,o)=>o.occurredAt.localeCompare(a.occurredAt)).slice(0,r.limit&&r.limit>0?r.limit:100)}}}}var Ae=["LOGIN_SUCCESS","LOGIN_FAILED","LOCKOUT_TRIGGERED","SESSION_REVOKED","CONTEXT_SWITCHED","STEP_UP_CHALLENGED","STEP_UP_PASSED","STEP_UP_FAILED"];function Vt(t){return Ae.includes(t)}function Ht(t){var e;return{eventId:t.eventId,eventType:t.eventType,occurredAt:t.timestamp,message:(e=t.reasonCode)!=null?e:t.result}}function Gt(t,e){var r,n,a;return{eventId:t.eventId,sourceDomain:"ofauth",eventType:t.eventType,occurredAt:t.timestamp,memberId:e!=null?e:void 0,tenantId:(r=t.scopeRef)==null?void 0:r.tenantId,branchId:(n=t.scopeRef)==null?void 0:n.branchId,summary:(a=t.reasonCode)!=null?a:t.result}}function zn(t,e){return{member360:{async getAuditByMember(a){let o=await e.resolveIdentityIdsByMemberId(a);return o.length===0?[]:(await Promise.all(o.map(s=>t.queryEvents({identityId:s})))).flat().sort((s,c)=>c.timestamp.localeCompare(s.timestamp)).slice(0,100).map(Ht)}},auditTrailProvider:{async listEvents(a){var m;let o=[];if(a.memberId&&(o=await e.resolveIdentityIdsByMemberId(a.memberId),o.length===0))return[];let i=((m=a.eventTypes)!=null?m:[]).filter(Vt),s={...a.fromTimestamp?{fromTimestamp:a.fromTimestamp}:{},...a.toTimestamp?{toTimestamp:a.toTimestamp}:{},...i.length>0?{eventTypes:i}:{}},c=o.length>0?await Promise.all(o.map(l=>t.queryEvents({...s,identityId:l}))):[await t.queryEvents(s)];return await Promise.all(c.flat().map(async l=>{var p,g;return Gt(l,l.identityId&&(g=await((p=e.resolveMemberIdByIdentityId)==null?void 0:p.call(e,l.identityId)))!=null?g:null)}))}},eventCatalog:[...Ae]}}var De=["member.created","member.updated","saving.entry-recorded","saving.policy-upserted","shu.config-upserted","shu.period-created","shu.period-finalized","shu.allocations-generated"],Me=["loan.created","loan.closed","installment.schedule-generated","installment.payment-recorded","credit-policy.created","credit-policy.updated"];function Kt(t){return De.includes(t)}function Zt(t){return Me.includes(t)}function qt(t){return{eventId:t.eventId,eventType:t.name,occurredAt:t.occurredAt,message:t.entityId?`entity:${t.entityId}`:t.name}}function Jt(t){var r;let e=(r=t.payload)==null?void 0:r.memberId;return typeof e=="string"&&e.trim()?e:null}function ct(t,e,r){var n,a,o,i;return{eventId:t.eventId,sourceDomain:e,eventType:t.name,occurredAt:t.occurredAt,memberId:(a=(n=Jt(t))!=null?n:r)!=null?a:void 0,tenantId:(o=t.tenantId)!=null?o:void 0,branchId:(i=t.branchId)!=null?i:void 0,summary:t.entityId?`entity:${t.entityId}`:t.name}}function dt(t){return[...t].sort((e,r)=>r.occurredAt.localeCompare(e.occurredAt))}var Yt=[...De,...Me];function ea(t){return{member360:{async getAuditByMember(n,a){var s,c,d,m;let[o,i]=await Promise.all([(c=(s=t.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?c:Promise.resolve([]),(m=(d=t.ofcoopCredit)==null?void 0:d.queryEvents({memberId:n,...a!=null&&a.tenantId?{tenantId:a.tenantId}:{},...a!=null&&a.branchId?{branchId:a.branchId}:{},limit:100}))!=null?m:Promise.resolve([])]);return dt([...o,...i]).slice(0,100).map(qt)}},auditTrailProvider:{async listEvents(n){var m,l,p,g,b,u,f,v,S;let a=(m=n.eventTypes)!=null?m:[],o=a.length>0?a.filter(Kt):void 0,i=a.length>0?a.filter(Zt):void 0,[s,c]=await Promise.all([(b=(g=t.ofcoop)==null?void 0:g.queryEvents({...n.memberId?{memberId:n.memberId}:{},...n.fromTimestamp?{fromTimestamp:n.fromTimestamp}:{},...n.toTimestamp?{toTimestamp:n.toTimestamp}:{},...(l=n.scope)!=null&&l.tenantId?{tenantId:n.scope.tenantId}:{},...(p=n.scope)!=null&&p.branchId?{branchId:n.scope.branchId}:{},...o?{eventNames:o}:{},...n.limit?{limit:n.limit}:{}}))!=null?b:Promise.resolve([]),(S=(v=t.ofcoopCredit)==null?void 0:v.queryEvents({...n.memberId?{memberId:n.memberId}:{},...n.fromTimestamp?{fromTimestamp:n.fromTimestamp}:{},...n.toTimestamp?{toTimestamp:n.toTimestamp}:{},...(u=n.scope)!=null&&u.tenantId?{tenantId:n.scope.tenantId}:{},...(f=n.scope)!=null&&f.branchId?{branchId:n.scope.branchId}:{},...i?{eventNames:i}:{},...n.limit?{limit:n.limit}:{}}))!=null?S:Promise.resolve([])]),d=[...s.map(C=>ct(C,"ofcoop",n.memberId)),...c.map(C=>ct(C,"ofcoop-credit",n.memberId))];return dt(d)}},eventCatalog:[...Yt]}}function mt(t){return[...new Set(t)]}function zt(t){return t.startsWith("ofcoop.")?"ofcoop":t.startsWith("ofcoop-credit.")?"ofcoop-credit":t.startsWith("ofauth.")?"ofauth":"external"}function Xt(t){return t.startsWith("ofcoop.")?t.slice(7):t.startsWith("ofcoop-credit.")?t.slice(14):t.startsWith("ofauth.")?t.slice(7).toUpperCase():t}function er(t){if(!t||t.length===0)return;let e=t.flatMap(r=>[`ofcoop.${r}`,`ofcoop-credit.${r}`,`ofauth.${r.toLowerCase()}`]);return mt(e)}function aa(t,e={}){var n;return{eventCatalog:mt((n=e.eventCatalog)!=null?n:[...De,...Me,...Ae]),auditTrailProvider:{async listEvents(a){var i,s;return(await t.listActivityRecords({fromTimestamp:a.fromTimestamp,toTimestamp:a.toTimestamp,tenantId:(i=a.scope)==null?void 0:i.tenantId,branchId:(s=a.scope)==null?void 0:s.branchId,limit:a.limit,activityTypes:er(a.eventTypes)})).map(c=>{var l,p,g,b,u;let d=typeof((l=c.payload)==null?void 0:l.memberId)=="string"?c.payload.memberId:null,m=zt(c.activityType);return{eventId:c.activityId,sourceDomain:m,eventType:Xt(c.activityType),occurredAt:c.occurredAt,memberId:(p=d!=null?d:a.memberId)!=null?p:void 0,tenantId:(g=c.scopeRef)==null?void 0:g.tenantId,branchId:(b=c.scopeRef)==null?void 0:b.branchId,summary:typeof((u=c.payload)==null?void 0:u.entityId)=="string"&&c.payload.entityId?`entity:${c.payload.entityId}`:c.activityType}}).sort((c,d)=>d.occurredAt.localeCompare(c.occurredAt))}}}}function ee(t){return t.slice(0,10)}function tr(t,e){let r=new Date(`${t}T00:00:00.000Z`);return r.setUTCDate(r.getUTCDate()+e),r.toISOString().slice(0,10)}function rr(t){let e={aktif:0,jatuhTempo:0,macet:0,lunas:0};for(let r of t){if(r.status==="defaulted"){e.macet+=1;continue}if(r.status==="closed"){e.lunas+=1;continue}r.overdueInstallmentCount>0?e.jatuhTempo+=1:e.aktif+=1}return e}function nr(t,e){let r={d0to7:0,d8to30:0,d31to60:0,dOver60:0},n=Date.parse(`${e}T00:00:00.000Z`);for(let a of t){let o=Date.parse(`${ee(a.dueDate)}T00:00:00.000Z`),i=Math.max(0,Math.floor((n-o)/(1440*60*1e3)));i<=7?r.d0to7+=1:i<=30?r.d8to30+=1:i<=60?r.d31to60+=1:r.dOver60+=1}return r}function Z(t){return t!=null&&t.tenantId?{tenantId:t.tenantId,...t.branchId?{branchId:t.branchId}:{}}:null}function ia(t){return{member360:{async getCreditByMember(a,o){let i=await t.loanService.listLoansByMember(a,{includeDeleted:!1,...o!=null&&o.tenantId?{tenantId:o.tenantId}:{},...o!=null&&o.branchId?{branchId:o.branchId}:{}}),s={totalLoans:i.length,activeLoans:i.filter(d=>d.status==="active").length,closedLoans:i.filter(d=>d.status==="closed").length,defaultedLoans:i.filter(d=>d.status==="defaulted").length,totalPrincipalAmount:i.reduce((d,m)=>d+m.principalAmount,0)},c=[...i].sort((d,m)=>m.startDate.localeCompare(d.startDate)).slice(0,5).map(d=>({loanId:d.id,status:d.status,principalAmount:d.principalAmount,startDate:d.startDate}));return{summary:s,recentLoans:c}},async getSettlementSummaryByMember(a,o){let i=Z(o);if(!i)return{totalOutstanding:0,totalOverdue:0,settlementStatus:"clear",notes:"tenantId missing in scope"};let s=await t.loanBoardService.listLoanBoard(i,{memberId:a}),c=s.reduce((m,l)=>m+l.outstandingAmount,0),d=s.filter(m=>m.overdueInstallmentCount>0).reduce((m,l)=>m+l.outstandingAmount,0);return{totalOutstanding:c,totalOverdue:d,settlementStatus:d>0?"overdue":c>0?"pending":"clear"}}},dashboard:{async getLoanStatusComposition(a){let o=Z(a);if(!o)return{aktif:0,jatuhTempo:0,macet:0,lunas:0};let i=await t.loanBoardService.listLoanBoard(o);return rr(i)},async getLoanAgingBuckets(a){let o=Z(a);if(!o)return{d0to7:0,d8to30:0,d31to60:0,dOver60:0};let i=ee(new Date().toISOString()),s=tr(i,-60),c=await t.loanDueWindowService.listLoansDueInWindow(o,{dateFrom:"1970-01-01T00:00:00.000Z",dateTo:`${i}T23:59:59.999Z`}),d=c.filter(p=>p.installmentStatus==="overdue"&&ee(p.dueDate)>=s),m=c.filter(p=>p.installmentStatus==="overdue"&&ee(p.dueDate)<s),l=nr(d,i);return l.dOver60+=m.length,l},async getTotalOverdueAmount(a){let o=Z(a);return o?(await t.loanDueWindowService.listLoansDueInWindow(o,{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,c)=>s+c.outstandingAmount,0):0},async getAnggotaCreditSummary(a,o){var p;let i=Z(o);if(!i)return{activeLoans:0,outstandingPrincipalAmount:0,totalOverdueAmount:0,nextDueDate:null};let s=await t.loanBoardService.listLoanBoard(i,{memberId:a}),c=s.filter(g=>g.status==="active").length,d=s.reduce((g,b)=>g+b.outstandingAmount,0),m=s.filter(g=>g.overdueInstallmentCount>0).reduce((g,b)=>g+b.outstandingAmount,0),l=(p=[...s].map(g=>g.nextDueDate).filter(Boolean).sort((g,b)=>String(g).localeCompare(String(b)))[0])!=null?p:null;return{activeLoans:c,outstandingPrincipalAmount:d,totalOverdueAmount:m,nextDueDate:l}},async getLoanRiskMap(a){var l;let o=Z(a);if(!o)return[];let i=ee(new Date().toISOString()),s=await t.loanBoardService.listLoanBoard(o),c=await t.loanDueWindowService.listLoansDueInWindow(o,{dateFrom:"1970-01-01T00:00:00.000Z",dateTo:`${i}T23:59:59.999Z`}),d=new Map,m=Date.parse(`${i}T00:00:00.000Z`);for(let p of c){if(p.installmentStatus!=="overdue")continue;let g=Date.parse(`${ee(p.dueDate)}T00:00:00.000Z`),b=Math.max(0,Math.floor((m-g)/(1440*60*1e3))),u=(l=d.get(p.loanId))!=null?l:0;b>u&&d.set(p.loanId,b)}return s.map(p=>{var u;let g=(u=d.get(p.loanId))!=null?u:0,b=g>60||p.outstandingAmount>=5e6?"high":g>30||p.outstandingAmount>=1e6?"medium":"low";return{loanId:p.loanId,memberId:p.memberId,outstandingAmount:p.outstandingAmount,overdueAgeDays:g,riskLevel:b}})}},report:{async getCreditSummary(a,o){let i=Z(o);if(!i)return{loanCount:0,activeLoanCount:0,closedLoanCount:0,defaultedLoanCount:0,outstandingPrincipalAmount:0,totalOverdueAmount:0};let s=await t.loanBoardService.listLoanBoard(i);return{loanCount:s.length,activeLoanCount:s.filter(c=>c.status==="active").length,closedLoanCount:s.filter(c=>c.status==="closed").length,defaultedLoanCount:s.filter(c=>c.status==="defaulted").length,outstandingPrincipalAmount:s.reduce((c,d)=>c+d.outstandingAmount,0),totalOverdueAmount:s.filter(c=>c.overdueInstallmentCount>0).reduce((c,d)=>c+d.outstandingAmount,0)}}}}}function ut(t){return t.slice(0,10)}function lt(t){return t.slice(0,7)}function ar(t){return new Date(`${t}-01T00:00:00.000Z`)}function we(t){let e=ar(t);return new Date(Date.UTC(e.getUTCFullYear(),e.getUTCMonth()+1,0,23,59,59,999))}function Ue(t,e=new Date().toISOString()){let r=new Date(e),n=[];for(let a=t-1;a>=0;a-=1){let o=new Date(Date.UTC(r.getUTCFullYear(),r.getUTCMonth()-a,1));n.push(`${o.getUTCFullYear()}-${String(o.getUTCMonth()+1).padStart(2,"0")}`)}return n}function te(t){return{...t!=null&&t.tenantId?{tenantId:t.tenantId}:{},...t!=null&&t.branchId?{branchId:t.branchId}:{}}}function or(t,e){return t.startDate<=e&&t.endDate>=e}function ir(t,e=new Date().toISOString()){var o,i,s,c,d,m;if(t.length===0)return null;let r=ut(e),n=t.filter(l=>or(l,r));if(n.length>0)return(i=(o=[...n].sort((l,p)=>p.endDate.localeCompare(l.endDate))[0])==null?void 0:o.id)!=null?i:null;let a=t.filter(l=>l.status==="finalized");return a.length>0?(c=(s=[...a].sort((l,p)=>p.endDate.localeCompare(l.endDate))[0])==null?void 0:s.id)!=null?c:null:(m=(d=[...t].sort((l,p)=>p.endDate.localeCompare(l.endDate))[0])==null?void 0:d.id)!=null?m:null}function sr(t,e){let r=we(e).toISOString();return!(!(t.joinDate<=r)||t.status!=="active"||t.exitDate&&t.exitDate<=r)}function cr(t,e){let r=we(e).toISOString();return t.joinDate<=r}async function Qe(t,e,r,n,a){return(await Promise.all(e.map(i=>t.listSavingEntriesByMember(i,{includeDeleted:!1,dateFrom:r,dateTo:n,...te(a)})))).flat()}function ca(t,e={}){var o,i;let r=Math.max(1,Math.min(24,(o=e.monthsWindow)!=null?o:6)),n=Math.max(1,Math.min(180,(i=e.heatmapDays)!=null?i:30)),a=async s=>{var d;if(e.resolveCurrentShuPeriodId)return e.resolveCurrentShuPeriodId(s);if(!((d=t.shuService)!=null&&d.listShuPeriods))return null;let c=await t.shuService.listShuPeriods({includeDeleted:!1,...s!=null&&s.tenantId?{tenantId:s.tenantId}:{},...s!=null&&s.branchId?{branchId:s.branchId}:{}});return ir(c,e.referenceDate)};return{async getOnboardingFunnel(s){let c=await t.memberService.listMembers({includeDeleted:!1,...te(s)}),d=await Promise.all(c.map(p=>t.savingLedgerService.getSavingBalanceByMember(p.id))),m=d.filter(p=>p.pokok>0).length,l=c.filter((p,g)=>{var b,u;return p.status==="active"&&((u=(b=d[g])==null?void 0:b.pokok)!=null?u:0)>0}).length;return{daftar:c.length,verifikasiPokok:m,aktif:l}},async getWajibComplianceTrend(s){let c=Ue(r),m=(await t.memberService.listMembers({includeDeleted:!1,status:"active",...te(s)})).map(u=>u.id);if(m.length===0)return c.map(u=>({month:u,patuh:0,menunggak:0}));let l=c[0],p=c[c.length-1],g=await Qe(t.savingLedgerService,m,`${l}-01T00:00:00.000Z`,we(p).toISOString(),s),b=new Set(g.filter(u=>u.savingType==="wajib"&&u.entryType==="credit"&&u.amount>0).map(u=>`${u.memberId}:${lt(u.transactionDate)}`));return c.map(u=>{let f=0,v=0;for(let S of m)b.has(`${S}:${u}`)?f+=1:v+=1;return{month:u,patuh:f,menunggak:v}})},async getSavingTypeCompositionByPeriod(s){let c=Ue(r),m=(await t.memberService.listMembers({includeDeleted:!1,...te(s)})).map(u=>u.id);if(m.length===0)return c.map(u=>({period:u,pokok:0,wajib:0,sukarela:0}));let l=c[0],p=c[c.length-1],g=await Qe(t.savingLedgerService,m,`${l}-01T00:00:00.000Z`,we(p).toISOString(),s),b=new Map;for(let u of c)b.set(u,{period:u,pokok:0,wajib:0,sukarela:0});for(let u of g){let f=lt(u.transactionDate),v=b.get(f);if(!v)continue;let S=u.entryType==="credit"?1:-1;u.savingType==="pokok"&&(v.pokok+=S*u.amount),u.savingType==="wajib"&&(v.wajib+=S*u.amount),u.savingType==="sukarela"&&(v.sukarela+=S*u.amount)}return c.map(u=>{var f;return(f=b.get(u))!=null?f:{period:u,pokok:0,wajib:0,sukarela:0}})},async getMemberGrowthTrend(s){let c=Ue(r),d=await t.memberService.listMembers({includeDeleted:!1,...te(s)});return c.map(m=>{let l=d.filter(g=>cr(g,m)).length,p=d.filter(g=>sr(g,m)).length;return{month:m,active:p,nonActive:Math.max(0,l-p)}})},async getShuDistributionSummary(s){if(!t.shuService)return[];let c=await a(s);return c?[...(await t.shuService.listShuAllocations(c,{includeDeleted:!1})).filter(l=>!(s!=null&&s.tenantId&&l.tenantId!==s.tenantId||s!=null&&s.branchId&&l.branchId!==s.branchId))].sort((l,p)=>p.allocationAmount-l.allocationAmount).slice(0,10).map(l=>({memberId:l.memberId,allocationAmount:l.allocationAmount})):[]},async getOperationalActivityHeatmap(s){var b;let d=(await t.memberService.listMembers({includeDeleted:!1,...te(s)})).map(u=>u.id);if(d.length===0)return[];let m=new Date().toISOString(),l=new Date(Date.now()-(n-1)*864e5).toISOString(),p=await Qe(t.savingLedgerService,d,l,m,s),g=new Map;for(let u of p){let f=ut(u.transactionDate),v=new Date(u.transactionDate).getUTCHours(),S=`${f}:${v}`,C=(b=g.get(S))!=null?b:{day:f,hour:v,total:0};C.total+=1,g.set(S,C)}return Array.from(g.values()).sort((u,f)=>u.day===f.day?u.hour-f.hour:u.day.localeCompare(f.day))}}}function ma(t,e){return{async getShuSummary(r,n){let a=await e.resolveShuPeriodIdsForRange(r,n);if(!a.length)return{allocationCount:0,totalAllocatedAmount:0};let i=(await Promise.all(a.map(s=>t.shuService.listShuAllocations(s,{includeDeleted:!1})))).flat().filter(s=>!(n!=null&&n.tenantId&&s.tenantId!==n.tenantId||n!=null&&n.branchId&&s.branchId!==n.branchId));return{allocationCount:i.length,totalAllocatedAmount:i.reduce((s,c)=>s+c.allocationAmount,0)}}}}export{ke as MemberExitStateRepository,xe as MemberNumberPolicyRepository,Te as MemberRepository,Re as MemberWaConsentRepository,Ae as OFAUTH_AUDIT_EVENT_CATALOG,De as OFCOOP_AUDIT_EVENT_CATALOG,Me as OFCOOP_CREDIT_AUDIT_EVENT_CATALOG,h as OFCOOP_TABLES,Fe as OfcoopCore,_e as OfcoopCoreBuilder,pe as OfcoopDomainError,Ee as SavingLedgerRepository,Oe as SavingPolicyRepository,Be as ShuAllocationRepository,Le as ShuConfigRepository,Ne as ShuPeriodRepository,Ge as applyPendingMigrations,Ze as assertValidCreateMemberInput,et as assertValidCreateShuPeriodInput,Ke as assertValidMemberNumberPolicyInput,Je as assertValidSavingEntryInput,Ye as assertValidSavingPolicyInput,Xe as assertValidShuConfigInput,ze as calculateWajibNetTotal,X as conflict,aa as createActivityAuditTrailProvider,Jn as createAuditTrailCompositionProvider,tt as createDbAdapterOfcoopServices,An as createGenerateAndExportShu,xn as createMember360CompositionProviders,zn as createOfauthCompositionProviders,ia as createOfcoopCreditCompositionProviders,ca as createOfcoopDashboardCompositionProviders,ea as createOfcoopDomainAuditCompositionProviders,ma as createOfcoopReportCompositionProviders,U as createOfcoopRepositories,qe as deriveSavingComplianceStatus,Un as exportReportSummaryCsv,Qn as exportReportSummaryJson,Bn as getAnggotaDashboardSummary,wn as getMember360,Ve as getOfcoopTableSchemas,Nn as getPengawasDashboardSummary,Ln as getPengurusDashboardSummary,st as getReportSummary,y as invalidState,He as migrations,O as notFound,bt as ofcoopSchema,Cn as onboardMemberWithInitialSavings,Zn as queryAuditTrail,ir as resolveCurrentShuPeriodIdFromRows,$n as toAnggotaDashboardViewModel,Rn as toMember360ViewModel,_n as toPengawasDashboardViewModel,Fn as toPengurusDashboardViewModel,Hn as toReportSummaryViewModel,Pn as upsertPolicyAndEvaluateCompliance};
|
package/dist/index.js
CHANGED
|
@@ -1,54 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
-
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
-
};
|
|
16
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
__exportStar(require("./contracts/crossDomainPrimitives"), exports);
|
|
18
|
-
__exportStar(require("./contracts/MemberContract"), exports);
|
|
19
|
-
__exportStar(require("./contracts/SavingLedgerContract"), exports);
|
|
20
|
-
__exportStar(require("./contracts/ShuContract"), exports);
|
|
21
|
-
__exportStar(require("./contracts/MemberNumberPolicyContract"), exports);
|
|
22
|
-
__exportStar(require("./contracts/SavingPolicyContract"), exports);
|
|
23
|
-
__exportStar(require("./contracts/SavingComplianceSnapshotContract"), exports);
|
|
24
|
-
__exportStar(require("./contracts/ShuConfigContract"), exports);
|
|
25
|
-
__exportStar(require("./OfcoopCore"), exports);
|
|
26
|
-
__exportStar(require("./services/MemberService"), exports);
|
|
27
|
-
__exportStar(require("./services/SavingLedgerService"), exports);
|
|
28
|
-
__exportStar(require("./services/ShuService"), exports);
|
|
29
|
-
__exportStar(require("./services/MemberNumberPolicyService"), exports);
|
|
30
|
-
__exportStar(require("./services/SavingPolicyService"), exports);
|
|
31
|
-
__exportStar(require("./services/SavingComplianceSnapshotService"), exports);
|
|
32
|
-
__exportStar(require("./services/ShuConfigService"), exports);
|
|
33
|
-
__exportStar(require("./services/CoopOrchestrationService"), exports);
|
|
34
|
-
__exportStar(require("./services/Member360Service"), exports);
|
|
35
|
-
__exportStar(require("./services/Member360ViewModelService"), exports);
|
|
36
|
-
__exportStar(require("./services/createMember360CompositionProviders"), exports);
|
|
37
|
-
__exportStar(require("./services/DashboardSummaryService"), exports);
|
|
38
|
-
__exportStar(require("./services/DashboardViewModelService"), exports);
|
|
39
|
-
__exportStar(require("./services/ReportSummaryService"), exports);
|
|
40
|
-
__exportStar(require("./services/ReportViewModelService"), exports);
|
|
41
|
-
__exportStar(require("./services/AuditTrailQueryService"), exports);
|
|
42
|
-
__exportStar(require("./services/createAuditTrailCompositionProvider"), exports);
|
|
43
|
-
__exportStar(require("./services/createActivityAuditTrailProvider"), exports);
|
|
44
|
-
__exportStar(require("./services/createOfcoopCreditCompositionProviders"), exports);
|
|
45
|
-
__exportStar(require("./services/createOfcoopDashboardCompositionProviders"), exports);
|
|
46
|
-
__exportStar(require("./services/createOfcoopReportCompositionProviders"), exports);
|
|
47
|
-
__exportStar(require("./services/createOfcoopDomainAuditCompositionProviders"), exports);
|
|
48
|
-
__exportStar(require("./services/createOfauthCompositionProviders"), exports);
|
|
49
|
-
__exportStar(require("./services/errors"), exports);
|
|
50
|
-
__exportStar(require("./services/createDbAdapterOfcoopServices"), exports);
|
|
51
|
-
__exportStar(require("./data/schemas"), exports);
|
|
52
|
-
__exportStar(require("./data/migrations"), exports);
|
|
53
|
-
__exportStar(require("./data/applyPendingMigrations"), exports);
|
|
54
|
-
__exportStar(require("./data/repositories"), exports);
|
|
1
|
+
"use strict";var $e=Object.defineProperty;var ht=Object.getOwnPropertyDescriptor;var St=Object.getOwnPropertyNames;var It=Object.prototype.hasOwnProperty;var Ct=(t,e)=>{for(var r in e)$e(t,r,{get:e[r],enumerable:!0})},Pt=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of St(e))!It.call(t,a)&&a!==r&&$e(t,a,{get:()=>e[a],enumerable:!(n=ht(e,a))||n.enumerable});return t};var At=t=>Pt($e({},"__esModule",{value:!0}),t);var Fr={};Ct(Fr,{MemberExitStateRepository:()=>Ie,MemberNumberPolicyRepository:()=>Ce,MemberRepository:()=>he,MemberWaConsentRepository:()=>Se,OFAUTH_AUDIT_EVENT_CATALOG:()=>ge,OFCOOP_AUDIT_EVENT_CATALOG:()=>be,OFCOOP_CREDIT_AUDIT_EVENT_CATALOG:()=>fe,OFCOOP_TABLES:()=>h,OfcoopCore:()=>Be,OfcoopCoreBuilder:()=>je,OfcoopDomainError:()=>ee,SavingLedgerRepository:()=>Ae,SavingPolicyRepository:()=>Pe,ShuAllocationRepository:()=>we,ShuConfigRepository:()=>De,ShuPeriodRepository:()=>Me,applyPendingMigrations:()=>Qe,assertValidCreateMemberInput:()=>Ge,assertValidCreateShuPeriodInput:()=>ze,assertValidMemberNumberPolicyInput:()=>He,assertValidSavingEntryInput:()=>Ze,assertValidSavingPolicyInput:()=>qe,assertValidShuConfigInput:()=>Ye,calculateWajibNetTotal:()=>Je,conflict:()=>Z,createActivityAuditTrailProvider:()=>wr,createAuditTrailCompositionProvider:()=>pr,createDbAdapterOfcoopServices:()=>Xe,createGenerateAndExportShu:()=>Rt,createMember360CompositionProviders:()=>$t,createOfauthCompositionProviders:()=>vr,createOfcoopCreditCompositionProviders:()=>xr,createOfcoopDashboardCompositionProviders:()=>Br,createOfcoopDomainAuditCompositionProviders:()=>Pr,createOfcoopReportCompositionProviders:()=>jr,createOfcoopRepositories:()=>_,deriveSavingComplianceStatus:()=>Ke,exportReportSummaryCsv:()=>nr,exportReportSummaryJson:()=>ar,getAnggotaDashboardSummary:()=>Zt,getMember360:()=>Lt,getOfcoopTableSchemas:()=>We,getPengawasDashboardSummary:()=>Kt,getPengurusDashboardSummary:()=>Gt,getReportSummary:()=>nt,invalidState:()=>y,migrations:()=>Ue,notFound:()=>k,ofcoopSchema:()=>it,onboardMemberWithInitialSavings:()=>wt,queryAuditTrail:()=>lr,resolveCurrentShuPeriodIdFromRows:()=>vt,toAnggotaDashboardViewModel:()=>Yt,toMember360ViewModel:()=>Nt,toPengawasDashboardViewModel:()=>Jt,toPengurusDashboardViewModel:()=>qt,toReportSummaryViewModel:()=>or,upsertPolicyAndEvaluateCompliance:()=>Tt});module.exports=At(Fr);var st=require("ofcore"),et=require("ofcore"),Fe=require("ofcore");var h={members:"ofcoop_members",memberWaConsent:"ofcoop_member_wa_consent",memberExitState:"ofcoop_member_exit_state",memberNumberPolicies:"ofcoop_member_number_policies",savingPolicies:"ofcoop_saving_policies",savingEntries:"ofcoop_saving_entries",shuConfigs:"ofcoop_shu_configs",shuPeriods:"ofcoop_shu_periods",shuAllocations:"ofcoop_shu_allocations"},Dt=[{name:h.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:h.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:h.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:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]},{name:h.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:h.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"},{name:"changeReason",type:"string",isOptional:!0},{name:"approvalRef",type:"string",isOptional:!0},{name:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]},{name:h.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:h.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:"version",type:"number"},{name:"lastModified",type:"string"},{name:"deleted",type:"boolean",isIndexed:!0}]},{name:h.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:h.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}]}],it={version:1,tables:Dt};function We(){return it.tables}var Ue=[{toVersion:1,up:async t=>{let e=We();for(let r of e)try{await t.addTable(r)}catch{}}}];var Mt={logInfo(){},logWarn(){},logError(){}};async function Qe(t,e=Mt){e.logInfo("[ofcoop] starting database migration process");let r=[...Ue].sort((o,i)=>o.toVersion-i.toVersion),n=r.length>0?r[r.length-1].toVersion:0,a=await t.getSchemaVersion();if((a==null||a<0)&&(a=0),a>=n){e.logInfo(`[ofcoop] database already up-to-date at v${a}`);return}for(let o of r)o.toVersion>a&&(e.logInfo(`[ofcoop] applying migration v${o.toVersion}`),await o.up(t),await t.setSchemaVersion(o.toVersion),a=o.toVersion);e.logInfo(`[ofcoop] migration completed at v${a}`)}function pe(){return new Date().toISOString()}function Ve(t,e){return new Date(t).getTime()<=new Date(e).getTime()}function K(t){if(t.length!==0)return t.length===1?t[0]:{and:t}}var he=class{constructor(e){this.db=e}async create(e){return this.db.create(h.members,e)}async update(e,r){return this.db.update(h.members,e,r)}async getById(e){return this.db.get(h.members,e)}async list(e){var n,a;let r=[];return e!=null&&e.includeDeleted||r.push({deleted:!1}),e!=null&&e.status&&r.push({status:e.status}),(e==null?void 0:e.tenantId)!==void 0&&r.push({tenantId:(n=e.tenantId)!=null?n:null}),(e==null?void 0:e.branchId)!==void 0&&r.push({branchId:(a=e.branchId)!=null?a:null}),this.db.query(h.members,{filters:K(r),sort:[{field:"lastModified",direction:"desc"}]})}},Se=class{constructor(e){this.db=e}async set(e,r){var o,i,s;let n=await this.get(e),a={id:e,granted:r.granted,source:(o=r.source)!=null?o:null,note:(i=r.note)!=null?i:null,version:((s=n==null?void 0:n.version)!=null?s:0)+1,lastModified:pe(),deleted:!1};return n?this.db.update(h.memberWaConsent,e,a):this.db.create(h.memberWaConsent,a)}async get(e){return this.db.get(h.memberWaConsent,e)}},Ie=class{constructor(e){this.db=e}async set(e,r,n){var i,s,c,d;let a=await this.get(e),o={id:e,stage:r,reason:(i=n.reason)!=null?i:null,requestedBy:(s=n.requestedBy)!=null?s:null,referenceId:(c=n.referenceId)!=null?c:null,version:((d=a==null?void 0:a.version)!=null?d:0)+1,lastModified:pe(),deleted:!1};return a?this.db.update(h.memberExitState,e,o):this.db.create(h.memberExitState,o)}async get(e){return this.db.get(h.memberExitState,e)}},Ce=class{constructor(e){this.db=e}async upsert(e){return await this.db.get(h.memberNumberPolicies,e.id)?this.db.update(h.memberNumberPolicies,e.id,e):this.db.create(h.memberNumberPolicies,e)}async getActive(e){var a;let r=pe();return(a=(await this.list(e)).filter(o=>Ve(o.effectiveDate,r)).sort((o,i)=>i.effectiveDate.localeCompare(o.effectiveDate))[0])!=null?a:null}async list(e){var r;return this.db.query(h.memberNumberPolicies,{filters:{and:[{deleted:!1},{koperasiId:e.koperasiId},{tenantId:e.tenantId},{branchId:(r=e.branchId)!=null?r:null}]},sort:[{field:"effectiveDate",direction:"desc"}]})}},Pe=class{constructor(e){this.db=e}async upsert(e){return await this.db.get(h.savingPolicies,e.id)?this.db.update(h.savingPolicies,e.id,e):this.db.create(h.savingPolicies,e)}async getActive(e){var a;let r=pe();return(a=(await this.list(e)).filter(o=>Ve(o.effectiveDate,r)).sort((o,i)=>i.effectiveDate.localeCompare(o.effectiveDate))[0])!=null?a:null}async list(e){var r;return this.db.query(h.savingPolicies,{filters:{and:[{deleted:!1},{koperasiId:e.koperasiId},{tenantId:e.tenantId},{branchId:(r=e.branchId)!=null?r:null}]},sort:[{field:"effectiveDate",direction:"desc"}]})}},Ae=class{constructor(e){this.db=e}async create(e){return this.db.create(h.savingEntries,e)}async listByMember(e,r){var a,o;let n=[{memberId:e}];return r!=null&&r.includeDeleted||n.push({deleted:!1}),r!=null&&r.dateFrom&&n.push({field:"transactionDate",operator:">=",value:r.dateFrom}),r!=null&&r.dateTo&&n.push({field:"transactionDate",operator:"<=",value:r.dateTo}),(r==null?void 0:r.tenantId)!==void 0&&n.push({tenantId:(a=r.tenantId)!=null?a:null}),(r==null?void 0:r.branchId)!==void 0&&n.push({branchId:(o=r.branchId)!=null?o:null}),this.db.query(h.savingEntries,{filters:K(n),sort:[{field:"transactionDate",direction:"desc"}]})}async listAll(e){var n,a;let r=[];return e!=null&&e.includeDeleted||r.push({deleted:!1}),e!=null&&e.dateFrom&&r.push({field:"transactionDate",operator:">=",value:e.dateFrom}),e!=null&&e.dateTo&&r.push({field:"transactionDate",operator:"<=",value:e.dateTo}),(e==null?void 0:e.tenantId)!==void 0&&r.push({tenantId:(n=e.tenantId)!=null?n:null}),(e==null?void 0:e.branchId)!==void 0&&r.push({branchId:(a=e.branchId)!=null?a:null}),this.db.query(h.savingEntries,{filters:K(r),sort:[{field:"transactionDate",direction:"desc"}]})}async findByReference(e){var a,o,i;let r=[{deleted:!1},{memberId:e.memberId},{savingType:e.savingType},{entryType:e.entryType},{referenceType:e.referenceType},{referenceId:e.referenceId}];return e.tenantId!==void 0&&r.push({tenantId:(a=e.tenantId)!=null?a:null}),e.branchId!==void 0&&r.push({branchId:(o=e.branchId)!=null?o:null}),(i=(await this.db.query(h.savingEntries,{filters:K(r),sort:[{field:"lastModified",direction:"desc"}],limit:1}))[0])!=null?i:null}},De=class{constructor(e){this.db=e}async upsert(e){return await this.db.get(h.shuConfigs,e.id)?this.db.update(h.shuConfigs,e.id,e):this.db.create(h.shuConfigs,e)}async getActive(e){var a;let r=pe();return(a=(await this.list(e)).filter(o=>Ve(o.effectiveDate,r)).sort((o,i)=>i.effectiveDate.localeCompare(o.effectiveDate))[0])!=null?a:null}async list(e,r){var a;let n=[{koperasiId:e.koperasiId},{tenantId:e.tenantId},{branchId:(a=e.branchId)!=null?a:null}];return r!=null&&r.includeDeleted||n.push({deleted:!1}),this.db.query(h.shuConfigs,{filters:K(n),sort:[{field:"effectiveDate",direction:"desc"}]})}},Me=class{constructor(e){this.db=e}async create(e){return this.db.create(h.shuPeriods,e)}async update(e,r){return this.db.update(h.shuPeriods,e,r)}async getById(e){return this.db.get(h.shuPeriods,e)}async list(e){var n,a;let r=[];return e!=null&&e.includeDeleted||r.push({deleted:!1}),(e==null?void 0:e.tenantId)!==void 0&&r.push({tenantId:(n=e.tenantId)!=null?n:null}),(e==null?void 0:e.branchId)!==void 0&&r.push({branchId:(a=e.branchId)!=null?a:null}),this.db.query(h.shuPeriods,{filters:K(r),sort:[{field:"lastModified",direction:"desc"}]})}},we=class{constructor(e){this.db=e}async createMany(e){return e.length===0?[]:this.db.bulkCreate(h.shuAllocations,e)}async listByPeriod(e,r){let n=[{shuPeriodId:e}];return r!=null&&r.includeDeleted||n.push({deleted:!1}),r!=null&&r.memberId&&n.push({memberId:r.memberId}),this.db.query(h.shuAllocations,{filters:K(n),sort:[{field:"lastModified",direction:"desc"}]})}};function _(t){return{memberRepository:new he(t),memberWaConsentRepository:new Se(t),memberExitStateRepository:new Ie(t),memberNumberPolicyRepository:new Ce(t),savingPolicyRepository:new Pe(t),savingLedgerRepository:new Ae(t),shuConfigRepository:new De(t),shuPeriodRepository:new Me(t),shuAllocationRepository:new we(t)}}var ee=class extends Error{constructor(r,n){super(n);this.code=r;this.name="OfcoopDomainError"}};function k(t,e){return new ee("RESOURCE_NOT_FOUND",`${t} not found: ${e}`)}function Z(t){return new ee("CONFLICT",t)}function y(t){return new ee("INVALID_STATE",t)}function He(t){var e,r,n;if(!((e=t.koperasiId)!=null&&e.trim()))throw y("koperasiId is required");if(!((r=t.tenantId)!=null&&r.trim()))throw y("tenantId is required");if(!((n=t.effectiveDate)!=null&&n.trim()))throw y("effectiveDate is required");if(t.paddingDigits<1)throw y("paddingDigits must be >= 1");if(t.counterStart<0)throw y("counterStart must be >= 0");if(t.includeMonth&&!t.includeYear)throw y("includeMonth requires includeYear")}function I(){return new Date().toISOString()}function x(t){let e=0;return()=>(e+=1,`${t}-${Date.now()}-${e}`)}function Te(t){return JSON.parse(JSON.stringify(t))}async function w(t,e){var r;if(t.emitEvent)try{await t.emitEvent(e)}catch(n){(r=t.logger)==null||r.logError(n,{message:"[ofcoop] domain event sink failed",eventName:e.name})}}var Re=class{constructor(e){this.repos=e;this.newId=x("member-number-policy")}async getActiveMemberNumberPolicy(e){return this.repos.memberNumberPolicyRepository.getActive(e)}async upsertMemberNumberPolicy(e){var o;He(e);let r={koperasiId:e.koperasiId,tenantId:e.tenantId,branchId:e.branchId},n=await this.repos.memberNumberPolicyRepository.getActive(r),a=I();return n?this.repos.memberNumberPolicyRepository.upsert({...n,...e,version:n.version+1,lastModified:a}):this.repos.memberNumberPolicyRepository.upsert({id:this.newId(),...e,approvalRef:(o=e.approvalRef)!=null?o:null,version:1,lastModified:a,deleted:!1})}};function Ge(t){var e,r,n,a;if(!((e=t.memberNumber)!=null&&e.trim()))throw y("memberNumber is required");if(!((r=t.fullName)!=null&&r.trim()))throw y("fullName is required");if(!((n=t.joinDate)!=null&&n.trim()))throw y("joinDate is required");if(!((a=t.tenantId)!=null&&a.trim()))throw y("tenantId is required")}var ke=class{constructor(e,r,n={}){this.db=e;this.repos=r;this.options=n;this.newId=x("member")}async inTx(e){return this.db.transaction(async r=>e(_(r)))}async createMember(e){var a,o,i,s,c,d;if(Ge(e),(await this.repos.memberRepository.list({tenantId:(a=e.tenantId)!=null?a:null})).some(m=>m.memberNumber===e.memberNumber&&!m.deleted))throw Z(`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:(o=e.branchId)!=null?o:null,tenantId:(i=e.tenantId)!=null?i:null,version:1,lastModified:I(),deleted:!1});return(s=this.options.logger)==null||s.logInfo("[ofcoop] member created",{memberId:n.id,tenantId:n.tenantId,branchId:n.branchId}),await w(this.options,{name:"member.created",occurredAt:I(),entityId:n.id,tenantId:(c=n.tenantId)!=null?c:null,branchId:(d=n.branchId)!=null?d:null,payload:{memberNumber:n.memberNumber}}),n}async updateMember(e,r){var o,i,s;let n=await this.repos.memberRepository.getById(e);if(!n||n.deleted)throw k("Member",e);let a=await this.repos.memberRepository.update(e,{...r.fullName!==void 0?{fullName:r.fullName}:{},...r.memberNumber!==void 0?{memberNumber:r.memberNumber}:{},version:n.version+1,lastModified:I()});return(o=this.options.logger)==null||o.logInfo("[ofcoop] member updated",{memberId:e}),await w(this.options,{name:"member.updated",occurredAt:I(),entityId:a.id,tenantId:(i=a.tenantId)!=null?i:null,branchId:(s=a.branchId)!=null?s:null,payload:{memberNumber:a.memberNumber}}),a}async getMemberById(e){let r=await this.repos.memberRepository.getById(e);return!r||r.deleted?null:r}async listMembers(e){return this.repos.memberRepository.list(e)}async changeMemberStatus(e,r){let n=await this.repos.memberRepository.getById(e);if(!n||n.deleted)throw k("Member",e);return this.repos.memberRepository.update(e,{status:r,version:n.version+1,lastModified:I()})}async setMemberWaConsent(e,r){return this.inTx(async n=>{let a=await n.memberRepository.getById(e);if(!a||a.deleted)throw k("Member",e);return await n.memberWaConsentRepository.set(e,r),n.memberRepository.update(e,{version:a.version+1,lastModified:I()})})}async requestMemberExit(e,r){return this.inTx(async n=>{let a=await n.memberRepository.getById(e);if(!a||a.deleted)throw k("Member",e);return await n.memberExitStateRepository.set(e,"requested",r),n.memberRepository.update(e,{status:"inactive",version:a.version+1,lastModified:I()})})}async settleMemberExit(e,r){return this.inTx(async n=>{let a=await n.memberRepository.getById(e);if(!a||a.deleted)throw k("Member",e);return await n.memberExitStateRepository.set(e,"settled",r),n.memberRepository.update(e,{status:"exited",exitDate:I(),version:a.version+1,lastModified:I()})})}async cancelMemberExit(e,r){return this.inTx(async n=>{let a=await n.memberRepository.getById(e);if(!a||a.deleted)throw k("Member",e);return await n.memberExitStateRepository.set(e,"canceled",r),n.memberRepository.update(e,{status:"active",exitDate:null,version:a.version+1,lastModified:I()})})}};function Ke(t,e,r){return r?e>=t?"compliant":"underpaid":"no-policy"}var xe=class{constructor(e){this.repos=e}async buildSnapshot(e,r,n){var g,b,u,f;let o=(await this.repos.savingLedgerRepository.listByMember(e.id,{includeDeleted:!1,tenantId:r.tenantId,branchId:(g=r.branchId)!=null?g:null})).filter(v=>v.savingType==="wajib"),i=o.filter(v=>v.entryType==="credit").reduce((v,S)=>v+S.amount,0),s=o.filter(v=>v.entryType==="debit").reduce((v,S)=>v+S.amount,0),c=i-s,d=(b=n==null?void 0:n.monthlyWajibNominalIdr)!=null?b:0,m=Ke(d,c,!!n),l=m==="underpaid"?1:0,p=m==="compliant"?"none":m==="no-policy"?"set_active_saving_policy":"followup_wajib_payment";return{id:`snapshot-${e.id}`,memberId:e.id,koperasiId:r.koperasiId,tenantId:(u=e.tenantId)!=null?u:null,branchId:(f=e.branchId)!=null?f:null,referenceDate:I(),monthlyWajibNominalIdr:d,wajibCreditTotalIdr:i,wajibDebitTotalIdr:s,wajibNetTotalIdr:c,status:m,monthsInArrears:l,recommendedAction:p,metadata:{memberNumber:e.memberNumber},version:1,lastModified:I(),deleted:!1}}async listComplianceSnapshots(e,r){var i,s,c;let n=await this.repos.savingPolicyRepository.getActive({koperasiId:e.koperasiId,tenantId:e.tenantId,branchId:(i=e.branchId)!=null?i:null}),a=await this.repos.memberRepository.list({includeDeleted:(s=r==null?void 0:r.includeDeleted)!=null?s:!1,status:"active",tenantId:e.tenantId,branchId:(c=e.branchId)!=null?c:null});return(await Promise.all(a.filter(d=>r!=null&&r.memberId?d.id===r.memberId:!0).map(d=>this.buildSnapshot(d,e,n)))).filter(d=>r!=null&&r.status?d.status===r.status:!0).map(d=>Te(d))}async getComplianceSnapshotByMember(e,r){var a;return(a=(await this.listComplianceSnapshots(r,{memberId:e}))[0])!=null?a:null}};function Ze(t){var e,r;if(!((e=t.memberId)!=null&&e.trim()))throw y("memberId is required");if(!((r=t.transactionDate)!=null&&r.trim()))throw y("transactionDate is required");if(Number.isNaN(Number(t.amount))||Number(t.amount)<=0)throw y("amount must be > 0")}var Oe=class{constructor(e,r,n={}){this.db=e;this.repos=r;this.options=n;this.newId=x("saving-ledger")}async inTx(e){return this.db.transaction(async r=>e(_(r)))}async addEntry(e,r){return Ze(r),this.inTx(async n=>{var i,s,c,d,m,l,p,g,b,u,f;let a=await n.memberRepository.getById(r.memberId);if(!a||a.deleted)throw k("Member",r.memberId);if(a.status!=="active")throw Z(`Cannot record saving entry for inactive member: ${r.memberId}`);if(r.referenceType&&r.referenceId){let v=await n.savingLedgerRepository.findByReference({memberId:r.memberId,savingType:r.savingType,entryType:e,referenceType:r.referenceType,referenceId:r.referenceId,tenantId:(i=r.tenantId)!=null?i:null,branchId:(s=r.branchId)!=null?s:null});if(v)return(c=this.options.logger)==null||c.logInfo("[ofcoop] saving entry idempotent hit",{memberId:r.memberId,referenceType:r.referenceType,referenceId:r.referenceId}),v}let o=await n.savingLedgerRepository.create({id:this.newId(),memberId:r.memberId,savingType:r.savingType,entryType:e,amount:r.amount,transactionDate:r.transactionDate,referenceType:(d=r.referenceType)!=null?d:null,referenceId:(m=r.referenceId)!=null?m:null,notes:(l=r.notes)!=null?l:null,branchId:(p=r.branchId)!=null?p:null,tenantId:(g=r.tenantId)!=null?g:null,version:1,lastModified:I(),deleted:!1});return(b=this.options.logger)==null||b.logInfo("[ofcoop] saving entry recorded",{entryId:o.id,memberId:o.memberId,savingType:o.savingType,entryType:o.entryType,amount:o.amount}),await w(this.options,{name:"saving.entry-recorded",occurredAt:I(),entityId:o.id,tenantId:(u=o.tenantId)!=null?u:null,branchId:(f=o.branchId)!=null?f:null,payload:{memberId:o.memberId,savingType:o.savingType,entryType:o.entryType,amount:o.amount}}),o})}async recordSavingCredit(e){return this.addEntry("credit",e)}async recordSavingDebit(e){return this.addEntry("debit",e)}async recordSavingWithdrawal(e){var n;if(e.savingType!=="sukarela")throw Z(`recordSavingWithdrawal only supports sukarela saving type, received: ${e.savingType}`);let r=await this.getSavingBalanceByMember(e.memberId);if(e.amount>r.sukarela)throw Z(`Insufficient sukarela balance for member: ${e.memberId}`);return this.addEntry("debit",{...e,notes:(n=e.notes)!=null?n:"withdrawal"})}async listSavingEntriesByMember(e,r){return this.repos.savingLedgerRepository.listByMember(e,r)}async getSavingBalanceByMember(e){let r=await this.listSavingEntriesByMember(e),n={pokok:0,wajib:0,sukarela:0,total:0};for(let a of r){let o=a.entryType==="credit"?1:-1;n[a.savingType]+=o*a.amount}return n.total=n.pokok+n.wajib+n.sukarela,n}};function qe(t){var e,r,n;if(!((e=t.koperasiId)!=null&&e.trim()))throw y("koperasiId is required");if(!((r=t.tenantId)!=null&&r.trim()))throw y("tenantId is required");if(!((n=t.effectiveDate)!=null&&n.trim()))throw y("effectiveDate is required");if(t.simpananPokokNominalIdr<0)throw y("simpananPokokNominalIdr must be >= 0");if(t.monthlyWajibNominalIdr<0)throw y("monthlyWajibNominalIdr must be >= 0")}function Je(t,e){return t-e}var Ee=class{constructor(e,r={}){this.repos=e;this.options=r;this.newId=x("saving-policy")}async getActiveSavingPolicy(e){return this.repos.savingPolicyRepository.getActive(e)}async upsertSavingPolicy(e){var i,s,c,d,m,l,p,g;qe(e);let r={koperasiId:e.koperasiId,tenantId:e.tenantId,branchId:e.branchId},n=await this.repos.savingPolicyRepository.getActive(r),a=I();if(n){let b=await this.repos.savingPolicyRepository.upsert({...n,...e,changeReason:(i=e.changeReason)!=null?i:null,approvalRef:(s=e.approvalRef)!=null?s:null,version:n.version+1,lastModified:a});return await w(this.options,{name:"saving.policy-upserted",occurredAt:I(),entityId:b.id,tenantId:(c=b.tenantId)!=null?c:null,branchId:(d=b.branchId)!=null?d:null,payload:{effectiveDate:b.effectiveDate}}),b}let o=await this.repos.savingPolicyRepository.upsert({id:this.newId(),...e,changeReason:(m=e.changeReason)!=null?m:null,approvalRef:(l=e.approvalRef)!=null?l:null,version:1,lastModified:a,deleted:!1});return await w(this.options,{name:"saving.policy-upserted",occurredAt:I(),entityId:o.id,tenantId:(p=o.tenantId)!=null?p:null,branchId:(g=o.branchId)!=null?g:null,payload:{effectiveDate:o.effectiveDate}}),o}async evaluateWajibCompliance(e){var s;let r=await this.getActiveSavingPolicy(e),a=(await this.repos.savingLedgerRepository.listAll({includeDeleted:!1,tenantId:e.tenantId,branchId:(s=e.branchId)!=null?s:null})).filter(c=>c.savingType==="wajib"),o=a.filter(c=>c.entryType==="credit").reduce((c,d)=>c+d.amount,0),i=a.filter(c=>c.entryType==="debit").reduce((c,d)=>c+d.amount,0);return{summary:{activePolicy:r?1:0,wajibCreditTotal:o,wajibDebitTotal:i,wajibNetTotal:Je(o,i)},referenceDate:I()}}async getComplianceWorklist(e){var o;let r=await this.getActiveSavingPolicy(e);if(!r)return[];let n=await this.repos.memberRepository.list({includeDeleted:!1,status:"active",tenantId:e.tenantId,branchId:(o=e.branchId)!=null?o:null}),a=new Date;return Promise.all(n.map(async i=>{var u;let c=(await this.repos.savingLedgerRepository.listByMember(i.id,{tenantId:e.tenantId,branchId:(u=e.branchId)!=null?u:null})).reduce((f,v)=>v.savingType!=="wajib"?f:f+(v.entryType==="credit"?v.amount:-v.amount),0),m=Math.max(1,this.monthDiffInclusive(i.joinDate,a.toISOString().slice(0,10)))*r.monthlyWajibNominalIdr,l=Math.max(0,m-c),p=r.monthlyWajibNominalIdr>0?Math.ceil(l/r.monthlyWajibNominalIdr):0,g=p*30,b=g>90?"critical":g>30?"high":g>7?"medium":"low";return{id:`worklist-${i.id}`,memberId:i.id,priority:b,reasonCode:"WJ-REVIEW",reasonText:`Review wajib compliance for member ${i.memberNumber}`,recommendedAction:"verify_monthly_wajib",metadata:{policyId:r.id,memberNumber:i.memberNumber,fullName:i.fullName,expectedWajib:m,wajibNet:c,arrearsAmount:l,monthsInArrears:p,daysInArrears:g}}}))}monthDiffInclusive(e,r){let n=new Date(e),a=new Date(r);if(Number.isNaN(n.getTime())||Number.isNaN(a.getTime()))return 1;let o=a.getUTCFullYear()-n.getUTCFullYear(),i=a.getUTCMonth()-n.getUTCMonth();return o*12+i+1}};function Ye(t){var r,n,a;if(!((r=t.koperasiId)!=null&&r.trim()))throw y("koperasiId is required");if(!((n=t.tenantId)!=null&&n.trim()))throw y("tenantId is required");if(!((a=t.effectiveDate)!=null&&a.trim()))throw y("effectiveDate is required");let e=t.cadanganPercent+t.jasaUsahaPercent+t.jasaModalPercent;if(e!==100)throw y(`SHU config percent total must be exactly 100, got ${e}`)}var Le=class{constructor(e,r={}){this.repos=e;this.options=r;this.newId=x("shu-config")}async getActiveShuConfig(e){return this.repos.shuConfigRepository.getActive(e)}async upsertShuConfig(e){var i,s,c,d,m,l,p,g;Ye(e);let r={koperasiId:e.koperasiId,tenantId:e.tenantId,branchId:e.branchId},n=await this.repos.shuConfigRepository.getActive(r),a=I();if(n){let b=await this.repos.shuConfigRepository.upsert({...n,...e,notes:(i=e.notes)!=null?i:null,approvalRef:(s=e.approvalRef)!=null?s:null,version:n.version+1,lastModified:a});return await w(this.options,{name:"shu.config-upserted",occurredAt:I(),entityId:b.id,tenantId:(c=b.tenantId)!=null?c:null,branchId:(d=b.branchId)!=null?d:null,payload:{effectiveDate:b.effectiveDate}}),b}let o=await this.repos.shuConfigRepository.upsert({id:this.newId(),...e,notes:(m=e.notes)!=null?m:null,approvalRef:(l=e.approvalRef)!=null?l:null,version:1,lastModified:a,deleted:!1});return await w(this.options,{name:"shu.config-upserted",occurredAt:I(),entityId:o.id,tenantId:(p=o.tenantId)!=null?p:null,branchId:(g=o.branchId)!=null?g:null,payload:{effectiveDate:o.effectiveDate}}),o}async listShuConfigs(e,r){return this.repos.shuConfigRepository.list(e,r)}};function ze(t){var e,r,n,a;if(!((e=t.periodCode)!=null&&e.trim()))throw y("periodCode is required");if(!((r=t.startDate)!=null&&r.trim()))throw y("startDate is required");if(!((n=t.endDate)!=null&&n.trim()))throw y("endDate is required");if(!((a=t.tenantId)!=null&&a.trim()))throw y("tenantId is required")}var Ne=class{constructor(e,r,n={}){this.db=e;this.repos=r;this.options=n;this.newPeriodId=x("shu-period");this.newAllocationId=x("shu-allocation")}async inTx(e){return this.db.transaction(async r=>e(_(r)))}toDateOnly(e){return e.slice(0,10)}dateToUtcMs(e){return Date.parse(`${this.toDateOnly(e)}T00:00:00.000Z`)}diffDaysInclusive(e,r){let n=this.dateToUtcMs(r)-this.dateToUtcMs(e);return Math.floor(n/864e5)+1}getEligibleWindow(e,r,n){if(e.status!=="active"&&e.status!=="exited")return null;let a=this.toDateOnly(e.joinDate),o=e.exitDate?this.toDateOnly(e.exitDate):null;if(e.status==="exited"&&!o)return null;let i=a>r?a:r,s=o&&o<n?o:n;if(i>s)return null;let c=this.diffDaysInclusive(i,s),d=this.diffDaysInclusive(r,n);return{start:i,end:s,activeDays:c,proRataFactor:d>0?c/d:0}}applySavingEntryToBalance(e,r,n){var o;let a=r.entryType==="debit"?-1:1;if(r.savingType==="pokok"&&(e.pokok+=a*r.amount),r.savingType==="wajib"&&(e.wajib+=a*r.amount),r.savingType==="sukarela"){if(!n||n.size===0)return;let i=((o=r.referenceType)!=null?o:"").trim();if(!n.has(i))return;e.sukarela+=a*r.amount}}async computeAverageModalBasis(e){var l,p;let n=(await e.repos.savingLedgerRepository.listByMember(e.memberId,{includeDeleted:!1,dateTo:e.periodEnd,tenantId:(l=e.tenantId)!=null?l:null,branchId:(p=e.branchId)!=null?p:null})).slice().sort((g,b)=>this.toDateOnly(g.transactionDate).localeCompare(this.toDateOnly(b.transactionDate))),a={pokok:0,wajib:0,sukarela:0},o=this.dateToUtcMs(e.activeStart),i=this.dateToUtcMs(e.activeEnd)+864e5,s=this.diffDaysInclusive(e.periodStart,e.periodEnd),c=0,d=this.dateToUtcMs(e.periodStart),m=0;for(;m<n.length&&this.dateToUtcMs(n[m].transactionDate)<d;)this.applySavingEntryToBalance(a,n[m],e.includeSukarela?e.allowedSukarelaReferenceTypes:null),m+=1;for(;d<i;){let g=m<n.length?this.dateToUtcMs(n[m].transactionDate):i,b=Math.min(g,i);if(b>d){let u=Math.max(d,o),f=Math.min(b,i);if(f>u){let v=Math.floor((f-u)/864e5),S=a.pokok+a.wajib+(e.includeSukarela?a.sukarela:0);c+=S*v}d=b}else d+=864e5;for(;m<n.length&&this.dateToUtcMs(n[m].transactionDate)===b;)this.applySavingEntryToBalance(a,n[m],e.includeSukarela?e.allowedSukarelaReferenceTypes:null),m+=1}return s>0?c/s:0}allocateWithLargestRemainder(e){var c;let r=e.members.reduce((d,m)=>d+m.score,0);if(r<=0)throw y("SHU allocation requires non-zero total score; escalate to RAT decision");let n=new Map,a=e.members.map(d=>{let m=e.poolAmount*d.score/r,l=Math.floor(m);return n.set(d.memberId,l),{memberId:d.memberId,remainder:m-l}}),o=Array.from(n.values()).reduce((d,m)=>d+m,0),i=e.poolAmount-o;a.sort((d,m)=>m.remainder!==d.remainder?m.remainder-d.remainder:d.memberId.localeCompare(m.memberId));let s=0;for(;i>0&&a.length>0;){let d=a[s%a.length];n.set(d.memberId,((c=n.get(d.memberId))!=null?c:0)+1),i-=1,s+=1}return n}async createShuPeriod(e){var n,a,o,i,s;ze(e);let r=await this.repos.shuPeriodRepository.create({id:this.newPeriodId(),periodCode:e.periodCode,startDate:e.startDate,endDate:e.endDate,status:"draft",formulaSnapshot:Te(e.formulaSnapshot),branchId:(n=e.branchId)!=null?n:null,tenantId:(a=e.tenantId)!=null?a:null,version:1,lastModified:I(),deleted:!1});return(o=this.options.logger)==null||o.logInfo("[ofcoop] shu period created",{periodId:r.id,periodCode:r.periodCode}),await w(this.options,{name:"shu.period-created",occurredAt:I(),entityId:r.id,tenantId:(i=r.tenantId)!=null?i:null,branchId:(s=r.branchId)!=null?s:null,payload:{periodCode:r.periodCode}}),r}async finalizeShuPeriod(e){var a,o;let r=await this.repos.shuPeriodRepository.getById(e);if(!r||r.deleted)throw k("SHU period",e);let n=await this.repos.shuPeriodRepository.update(e,{status:"finalized",version:r.version+1,lastModified:I()});return await w(this.options,{name:"shu.period-finalized",occurredAt:I(),entityId:n.id,tenantId:(a=n.tenantId)!=null?a:null,branchId:(o=n.branchId)!=null?o:null,payload:{status:n.status}}),n}async listShuPeriods(e={}){return(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 this.inTx(async r=>{var d,m,l,p,g,b,u,f,v,S,C,D,A,M,E,$,N,Q,V,H,ne,ae,G,oe,ie;let n=await r.shuPeriodRepository.getById(e);if(!n||n.deleted)throw k("SHU period",e);let a=await r.memberRepository.list({includeDeleted:!1,tenantId:(d=n.tenantId)!=null?d:void 0,branchId:(m=n.branchId)!=null?m:void 0});if(a.length===0)return[];let o=n.formulaSnapshot,i=String((l=o.distributionMode)!=null?l:"equal-share"),s=[];if(i==="score-weighted-v1"){let R=this.toDateOnly(n.startDate),j=this.toDateOnly(n.endDate),L=Number((g=(p=o.shuTahunBukuIdr)!=null?p:o.totalDistributableShuIdr)!=null?g:0),O=Number((b=o.cadanganPercent)!=null?b:0),T=Number((u=o.poolAnggotaPercent)!=null?u:0),W=Number((f=o.bobotTransaksiPercent)!=null?f:0),B=Number((v=o.bobotModalPercent)!=null?v:0),se=!!((S=o.includeSukarelaInModalBasis)!=null&&S),ce=Array.isArray(o.sukarelaModalReferenceTypes)?o.sukarelaModalReferenceTypes.map(P=>String(P).trim()).filter(P=>P.length>0):[],J=new Set(ce),ve=o.transactionScoreByMemberId&&typeof o.transactionScoreByMemberId=="object"?o.transactionScoreByMemberId:{};if(!Number.isFinite(L)||L<=0)throw y("shuTahunBukuIdr must be provided for score-weighted-v1 allocation");if(!Number.isFinite(O)||O<0||O>100)throw y("cadanganPercent must be in range 0-100 for score-weighted-v1 allocation");if(!Number.isFinite(T)||T<0||T>100)throw y("poolAnggotaPercent must be in range 0-100 for score-weighted-v1 allocation");if(!Number.isFinite(W)||!Number.isFinite(B)||W<0||B<0||W+B!==100)throw y("bobotTransaksiPercent + bobotModalPercent must equal 100 for score-weighted-v1 allocation");let de=Math.max(0,Math.floor(L-L*O/100)),U=Math.max(0,Math.floor(de*T/100));if(U<=0)return[];let me=[];for(let P of a){let F=this.getEligibleWindow(P,R,j);if(!F)continue;let ue=await this.computeAverageModalBasis({memberId:P.id,tenantId:(C=n.tenantId)!=null?C:null,branchId:(D=n.branchId)!=null?D:null,periodStart:R,periodEnd:j,activeStart:F.start,activeEnd:F.end,includeSukarela:se,allowedSukarelaReferenceTypes:J,repos:r}),z=Number((A=ve[P.id])!=null?A:0),X=Number.isFinite(z)&&z>0?z*F.proRataFactor:0,ye=ue>0?ue:0,yt=W/100*X+B/100*ye;me.push({member:P,proRataFactor:F.proRataFactor,modalScore:ye,transaksiScore:X,score:yt,activeDays:F.activeDays})}let le=me.filter(P=>P.score>0),Y=this.allocateWithLargestRemainder({poolAmount:U,members:le.map(P=>({memberId:P.member.id,score:P.score}))});for(let P of le)s.push({id:this.newAllocationId(),shuPeriodId:e,memberId:P.member.id,allocationAmount:(M=Y.get(P.member.id))!=null?M:0,calculationBasis:{mode:"score-weighted-v1",shuTahunBukuIdr:L,cadanganPercent:O,shuSetelahCadangan:de,poolAnggotaPercent:T,poolShuAnggota:U,bobotTransaksiPercent:W,bobotModalPercent:B,includeSukarelaInModalBasis:se,sukarelaModalReferenceTypes:ce,proRataFactor:P.proRataFactor,activeDays:P.activeDays,transaksiScore:P.transaksiScore,modalScore:P.modalScore,score:P.score},branchId:($=(E=P.member.branchId)!=null?E:n.branchId)!=null?$:null,tenantId:(Q=(N=P.member.tenantId)!=null?N:n.tenantId)!=null?Q:null,version:1,lastModified:I(),deleted:!1})}else{let R=a.filter(T=>T.status==="active");if(R.length===0)return[];let j=Number(o.totalDistributableShuIdr||0),L=Number.isFinite(j)&&j>0?j:R.length*1e5,O=Math.floor(L/R.length);for(let T of R)s.push({id:this.newAllocationId(),shuPeriodId:e,memberId:T.id,allocationAmount:O,calculationBasis:{mode:"equal-share",memberCount:R.length,sourceTotal:L},branchId:(H=(V=T.branchId)!=null?V:n.branchId)!=null?H:null,tenantId:(ae=(ne=T.tenantId)!=null?ne:n.tenantId)!=null?ae:null,version:1,lastModified:I(),deleted:!1})}let c=await r.shuAllocationRepository.createMany(s);return(G=this.options.logger)==null||G.logInfo("[ofcoop] shu allocations generated",{periodId:e,allocations:c.length}),await w(this.options,{name:"shu.allocations-generated",occurredAt:I(),entityId:e,tenantId:(oe=n.tenantId)!=null?oe:null,branchId:(ie=n.branchId)!=null?ie:null,payload:{allocations:c.length}}),c})}async listShuAllocations(e,r){return this.repos.shuAllocationRepository.listByPeriod(e,r)}async exportShuAllocationsCsv(e){let n=["allocationId,shuPeriodId,memberId,allocationAmount",...(await this.listShuAllocations(e,{includeDeleted:!1})).map(a=>`${a.id},${a.shuPeriodId},${a.memberId},${a.allocationAmount}`)].join(`
|
|
2
|
+
`);return{filename:`shu-allocations-${e}.csv`,contentType:"text/csv",body:n}}};async function Xe(t,e={}){let r=_(t);return{memberService:new ke(t,r,e),memberNumberPolicyService:new Re(r),savingLedgerService:new Oe(t,r,e),savingPolicyService:new Ee(r,e),savingComplianceSnapshotService:new xe(r),shuConfigService:new Le(r,e),shuService:new Ne(t,r,e)}}var Be=class{constructor(e,r){this.runtime=e;this.runtimeStateStore=r;this.runtimeStore=(0,Fe.asReadonlyStore)(this.runtimeStateStore)}static builder(){return new je}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(r=>({...r,phase:"started",started:!0,startCount:r.startCount+1,lastError:null,lastTransitionAt:new Date().toISOString()}))}catch(r){throw this.runtimeStateStore.setState({phase:"error",started:!1,lastError:r instanceof Error?r.message:String(r),lastTransitionAt:new Date().toISOString()}),r}}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(r=>({...r,phase:"started",started:!0,startCount:r.startCount+1,lastError:null,lastTransitionAt:new Date().toISOString()}))}catch(r){throw this.runtimeStateStore.setState({phase:"error",started:!1,lastError:r instanceof Error?r.message:String(r),lastTransitionAt:new Date().toISOString()}),r}}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,r,n=[]){return this.runtime.use(e,async()=>r(this),n),this}},je=class{constructor(){this.runtimeBuilder=st.CoreRuntime.builder();this.domainServiceOverrides={};this.runtimeHooks={};this.runtimeBuilder.withDbAdapter(()=>new et.InMemoryDbAdapter)}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,r){return this.runtimeBuilder.withExtension(e,r),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})}withSeedRunner(e){return this.withRuntimeHooks({runSeed:e})}withDomainEventSink(e){return this.domainEventSink=e,this}build(){var a;let e=(0,Fe.createStore)({phase:"idle",started:!1,startCount:0,stopCount:0,lastError:null,lastTransitionAt:new Date().toISOString()}),r=async o=>{var s,c;let i=(s=o.registry)==null?void 0:s.dbAdapter;i&&await Qe(i,(c=o.registry)==null?void 0:c.loggerAdapter)};this.runtimeBuilder.withHooks({...this.runtimeHooks,runMigrations:(a=this.runtimeHooks.runMigrations)!=null?a:r,createDomainServices:async o=>{var c,d,m;let i=async l=>{var g,b,u;let p=[];if(this.domainEventSink)try{await this.domainEventSink(l)}catch(f){p.push(f)}if((g=o.registry)!=null&&g.activitySink)try{await o.registry.activitySink.publish({activityId:o.createCorrelationId("ofcoop-event"),activityType:`ofcoop.${l.name}`,occurredAt:l.occurredAt,scopeRef:{domain:"ofcoop",...l.tenantId?{tenantId:l.tenantId}:{},...l.branchId?{branchId:l.branchId}:{}},payload:{entityId:(b=l.entityId)!=null?b:null,...(u=l.payload)!=null?u:{}},correlationId:o.createCorrelationId("ofcoop-corr")})}catch(f){p.push(f)}if(p.length>0)throw p[0]};return{...this.domainServicesFactory?await this.domainServicesFactory():await Xe((d=(c=o.registry)==null?void 0:c.dbAdapter)!=null?d:new et.InMemoryDbAdapter,{logger:(m=o.registry)==null?void 0:m.loggerAdapter,emitEvent:i}),...this.domainServiceOverrides}}});let n=this.runtimeBuilder.build();return new Be(n,e)}};async function wt(t,e){var c,d,m,l,p,g,b;if(!((c=e.transactionDate)!=null&&c.trim()))throw y("transactionDate is required");let r=Math.max(0,(d=e.initialPokokDepositIdr)!=null?d:0),n=Math.max(0,(m=e.initialWajibDepositIdr)!=null?m:0),a=Math.max(0,(l=e.initialSukarelaDepositIdr)!=null?l:0);if(t.savingPolicyService&&e.koperasiId&&e.member.tenantId){let u=await t.savingPolicyService.getActiveSavingPolicy({koperasiId:e.koperasiId,tenantId:e.member.tenantId,branchId:(p=e.member.branchId)!=null?p:null});if(u&&r<u.simpananPokokNominalIdr)throw y(`initialPokokDepositIdr must be >= ${u.simpananPokokNominalIdr}`)}let o=await t.memberService.createMember(e.member),i=[],s={memberId:o.id,transactionDate:e.transactionDate,tenantId:(g=o.tenantId)!=null?g:null,branchId:(b=o.branchId)!=null?b:null};return r>0&&i.push(await t.savingLedgerService.recordSavingCredit({...s,savingType:"pokok",amount:r})),n>0&&i.push(await t.savingLedgerService.recordSavingCredit({...s,savingType:"wajib",amount:n})),a>0&&i.push(await t.savingLedgerService.recordSavingCredit({...s,savingType:"sukarela",amount:a})),{member:o,ledgerEntries:i}}async function Tt(t,e){var i;let r=await t.savingPolicyService.upsertSavingPolicy(e),n={koperasiId:e.koperasiId,tenantId:e.tenantId,branchId:(i=e.branchId)!=null?i:null},a=await t.savingPolicyService.evaluateWajibCompliance(n),o=await t.savingPolicyService.getComplianceWorklist(n);return{policy:r,evaluation:a,worklist:o}}async function Rt(t,e){let r=await t.shuService.createShuPeriod(e),n=await t.shuService.generateShuAllocations(r.id),a=await t.shuService.exportShuAllocationsCsv(r.id);return{period:r,allocations:n,csv:a}}function kt(t){var r;let e=t.accessContext;if(e&&e.role==="anggota"){if(!((r=e.actorMemberId)!=null&&r.trim()))throw y("member360 access denied: anggota context requires actorMemberId");if(e.actorMemberId!==t.memberId)throw y("member360 access denied: anggota can only access own memberId")}}function xt(t){return t.map(e=>({itemId:`saving-${e.id}`,occurredAt:e.transactionDate,source:"saving-ledger",title:`${e.entryType} ${e.savingType}`,detail:`${e.amount}`}))}function Ot(t){var e;return(e=t==null?void 0:t.recentLoans)!=null&&e.length?t.recentLoans.map(r=>({itemId:`loan-${r.loanId}`,occurredAt:r.startDate,source:"credit",title:`loan ${r.status}`,detail:`${r.principalAmount}`})):[]}function Et(t){return t.map(e=>{var r;return{itemId:`audit-${e.eventId}`,occurredAt:e.occurredAt,source:"audit",title:e.eventType,detail:(r=e.message)!=null?r:e.eventType}})}async function Lt(t,e){var g,b,u,f,v,S,C,D,A,M,E,$,N;kt(e);let r=await t.memberService.getMemberById(e.memberId);if(!r||r.deleted)return null;let n={...(g=e.savingQuery)!=null?g:{},...(b=e.scope)!=null&&b.tenantId?{tenantId:e.scope.tenantId}:{},...(u=e.scope)!=null&&u.branchId?{branchId:e.scope.branchId}:{}},[a,o,i,s,c]=await Promise.all([t.savingLedgerService.getSavingBalanceByMember(r.id),t.savingLedgerService.listSavingEntriesByMember(r.id,n),(S=(v=(f=t.providers)==null?void 0:f.getCreditByMember)==null?void 0:v.call(f,r.id,e.scope))!=null?S:Promise.resolve(null),(A=(D=(C=t.providers)==null?void 0:C.getAuditByMember)==null?void 0:D.call(C,r.id,e.scope))!=null?A:Promise.resolve([]),($=(E=(M=t.providers)==null?void 0:M.getSettlementSummaryByMember)==null?void 0:E.call(M,r.id,e.scope))!=null?$:Promise.resolve(null)]),d=xt(o),m=Ot(i),l=Et(s),p=[...d,...m,...l].sort((Q,V)=>V.occurredAt.localeCompare(Q.occurredAt));return{member:r,savings:{balance:a,recentEntries:o},credit:i,settlement:c,audit:s,timeline:p.slice(0,Math.max(1,(N=e.timelineLimit)!=null?N:20))}}function Nt(t){var n,a,o,i,s,c,d,m,l,p,g,b,u,f,v;let e=(n=t.credit)==null?void 0:n.summary,r=t.settlement;return{member:{id:t.member.id,memberNumber:t.member.memberNumber,fullName:t.member.fullName,status:t.member.status,joinDate:t.member.joinDate,exitDate:(a=t.member.exitDate)!=null?a:null,tenantId:(o=t.member.tenantId)!=null?o:null,branchId:(i=t.member.branchId)!=null?i:null},kpiCards:[{id:"saving-total",label:"Total Simpanan",value:t.savings.balance.total,unit:"IDR"},{id:"saving-pokok",label:"Simpanan Pokok",value:t.savings.balance.pokok,unit:"IDR"},{id:"saving-wajib",label:"Simpanan Wajib",value:t.savings.balance.wajib,unit:"IDR"},{id:"saving-sukarela",label:"Simpanan Sukarela",value:t.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:(c=r==null?void 0:r.totalOverdue)!=null?c:0,unit:"IDR"}],sections:[{id:"credit-summary",title:"Ringkasan Kredit",rows:[{key:"totalLoans",label:"Total Pinjaman",value:(d=e==null?void 0:e.totalLoans)!=null?d:0},{key:"activeLoans",label:"Pinjaman Aktif",value:(m=e==null?void 0:e.activeLoans)!=null?m:0},{key:"closedLoans",label:"Pinjaman Lunas",value:(l=e==null?void 0:e.closedLoans)!=null?l:0},{key:"defaultedLoans",label:"Pinjaman Macet",value:(p=e==null?void 0:e.defaultedLoans)!=null?p:0},{key:"totalPrincipalAmount",label:"Total Pokok Pinjaman",value:(g=e==null?void 0:e.totalPrincipalAmount)!=null?g:0,unit:"IDR"}]},{id:"settlement-summary",title:"Ringkasan Settlement",rows:[{key:"totalOutstanding",label:"Total Outstanding",value:(b=r==null?void 0:r.totalOutstanding)!=null?b:0,unit:"IDR"},{key:"totalOverdue",label:"Total Overdue",value:(u=r==null?void 0:r.totalOverdue)!=null?u:0,unit:"IDR"},{key:"settlementStatus",label:"Status Settlement",value:(f=r==null?void 0:r.settlementStatus)!=null?f:"clear"},{key:"notes",label:"Catatan",value:(v=r==null?void 0:r.notes)!=null?v:"-"}]},{id:"audit-summary",title:"Ringkasan Audit",rows:[{key:"auditCount",label:"Jumlah Event Audit",value:t.audit.length}]}],timeline:t.timeline}}function Bt(t){return[...t].sort((e,r)=>r.occurredAt.localeCompare(e.occurredAt))}async function jt(t,e,r){for(let n of t){if(!n.provider.getCreditByMember)continue;let a=await n.provider.getCreditByMember(e,r);if(a)return a}return null}async function Ft(t,e,r){let n=await Promise.all(t.map(a=>{var o,i,s;return(s=(i=(o=a.provider).getAuditByMember)==null?void 0:i.call(o,e,r))!=null?s:Promise.resolve([])}));return Bt(n.flat()).slice(0,100)}async function _t(t,e,r){for(let n of t){if(!n.provider.getSettlementSummaryByMember)continue;let a=await n.provider.getSettlementSummaryByMember(e,r);if(a)return a}return null}function $t(t){return{async getCreditByMember(e,r){return jt(t,e,r)},async getAuditByMember(e,r){return Ft(t,e,r)},async getSettlementSummaryByMember(e,r){return _t(t,e,r)}}}var ct=1440*60*1e3;function dt(t){return t.slice(0,10)}function tt(t){return Date.parse(`${t}T00:00:00.000Z`)}function Wt(t,e){let r=[];for(let n=tt(t);n<=tt(e);n+=ct)r.push(new Date(n).toISOString().slice(0,10));return r}function mt(t,e){let r=dt(t),n=tt(r),a=n-(e-1)*ct;return{fromDate:new Date(a).toISOString().slice(0,10),toDate:new Date(n).toISOString().slice(0,10)}}function lt(t,e,r){let n=new Map;for(let a of Wt(e,r))n.set(a,{date:a,masuk:0,keluar:0,net:0});for(let a of t){let o=dt(a.transactionDate),i=n.get(o);i&&(a.entryType==="credit"?(i.masuk+=a.amount,i.net+=a.amount):(i.keluar+=a.amount,i.net-=a.amount))}return Array.from(n.values())}function Ut(t){var r;let e=t.accessContext;if(!(!e||e.role!=="anggota")){if(!((r=e.actorMemberId)!=null&&r.trim()))throw y("anggota dashboard access denied: actorMemberId is required");if(e.actorMemberId!==t.memberId)throw y("anggota dashboard access denied: only self memberId is allowed")}}function Qt(t){let e=t.accessContext;if(e&&e.role!=="pengawas")throw y("pengawas dashboard access denied: role must be pengawas")}function Vt(t){let e=t.accessContext;if(e&&e.role!=="pengurus")throw y("pengurus dashboard access denied: role must be pengurus")}async function Ht(t,e,r,n){let a=`${e}T00:00:00.000Z`,o=`${r}T23:59:59.999Z`,i=await t.memberService.listMembers({includeDeleted:!1,...n!=null&&n.tenantId?{tenantId:n.tenantId}:{},...n!=null&&n.branchId?{branchId:n.branchId}:{}});return(await Promise.all(i.map(c=>t.savingLedgerService.listSavingEntriesByMember(c.id,{includeDeleted:!1,dateFrom:a,dateTo:o,...n!=null&&n.tenantId?{tenantId:n.tenantId}:{},...n!=null&&n.branchId?{branchId:n.branchId}:{}})))).flat()}async function Gt(t,e={}){var D,A,M,E,$,N,Q,V,H,ne,ae,G,oe,ie,R,j,L,O,T,W,B,se,ce,J,ve,de,U,me,le,Y,P,F,ue,z;Vt(e);let r=Math.max(1,Math.min(90,(D=e.rollingDays)!=null?D:30)),n=(A=e.referenceDate)!=null?A:new Date().toISOString(),{fromDate:a,toDate:o}=mt(n,r),[i,s,c,d,m,l,p,g,b,u]=await Promise.all([Ht(t,a,o,e.scope),($=(E=(M=t.providers)==null?void 0:M.getLoanStatusComposition)==null?void 0:E.call(M,e.scope))!=null?$:Promise.resolve({aktif:0,jatuhTempo:0,macet:0,lunas:0}),(V=(Q=(N=t.providers)==null?void 0:N.getLoanAgingBuckets)==null?void 0:Q.call(N,e.scope))!=null?V:Promise.resolve({d0to7:0,d8to30:0,d31to60:0,dOver60:0}),(ae=(ne=(H=t.providers)==null?void 0:H.getOnboardingFunnel)==null?void 0:ne.call(H,e.scope))!=null?ae:Promise.resolve({daftar:0,verifikasiPokok:0,aktif:0}),(ie=(oe=(G=t.providers)==null?void 0:G.getWajibComplianceTrend)==null?void 0:oe.call(G,e.scope))!=null?ie:Promise.resolve([]),(L=(j=(R=t.providers)==null?void 0:R.getSavingTypeCompositionByPeriod)==null?void 0:j.call(R,e.scope))!=null?L:Promise.resolve([]),(W=(T=(O=t.providers)==null?void 0:O.getMemberGrowthTrend)==null?void 0:T.call(O,e.scope))!=null?W:Promise.resolve([]),(ce=(se=(B=t.providers)==null?void 0:B.getShuDistributionSummary)==null?void 0:se.call(B,e.scope))!=null?ce:Promise.resolve([]),(de=(ve=(J=t.providers)==null?void 0:J.getOperationalActivityHeatmap)==null?void 0:ve.call(J,e.scope))!=null?de:Promise.resolve([]),(le=(me=(U=t.providers)==null?void 0:U.getLoanRiskMap)==null?void 0:me.call(U,e.scope))!=null?le:Promise.resolve([])]),f=(F=await((P=(Y=t.providers)==null?void 0:Y.getTotalOverdueAmount)==null?void 0:P.call(Y,e.scope)))!=null?F:0,v=lt(i,a,o),S=v.reduce((X,ye)=>X+ye.net,0);return{kpi:{activeMembers:await t.memberService.listMembers({includeDeleted:!1,status:"active",...(ue=e.scope)!=null&&ue.tenantId?{tenantId:e.scope.tenantId}:{},...(z=e.scope)!=null&&z.branchId?{branchId:e.scope.branchId}:{}}).then(X=>X.length),totalSavingNet:S,activeLoans:s.aktif,totalOverdueAmount:f},savingsCashflow30Days:v,loanStatusComposition:s,loanAgingBuckets:c,advanced:{onboardingFunnel:d,wajibComplianceTrend:m,savingTypeCompositionByPeriod:l,memberGrowthTrend:p,shuDistributionSummary:g,operationalActivityHeatmap:b,loanRiskMap:u}}}async function Kt(t,e={}){var s,c,d,m,l,p,g,b,u,f,v,S,C,D,A;Qt(e);let[r,n,a,o,i]=await Promise.all([(d=(c=(s=t.providers)==null?void 0:s.getLoanStatusComposition)==null?void 0:c.call(s,e.scope))!=null?d:Promise.resolve({aktif:0,jatuhTempo:0,macet:0,lunas:0}),(p=(l=(m=t.providers)==null?void 0:m.getLoanAgingBuckets)==null?void 0:l.call(m,e.scope))!=null?p:Promise.resolve({d0to7:0,d8to30:0,d31to60:0,dOver60:0}),(u=(b=(g=t.providers)==null?void 0:g.getTotalOverdueAmount)==null?void 0:b.call(g,e.scope))!=null?u:Promise.resolve(0),(S=(v=(f=t.providers)==null?void 0:f.getWajibComplianceTrend)==null?void 0:v.call(f,e.scope))!=null?S:Promise.resolve([]),(A=(D=(C=t.providers)==null?void 0:C.getMemberGrowthTrend)==null?void 0:D.call(C,e.scope))!=null?A:Promise.resolve([])]);return{risk:{loanStatusComposition:r,loanAgingBuckets:n,totalOverdueAmount:a},trends:{wajibComplianceTrend:o,memberGrowthTrend:i}}}async function Zt(t,e){var g,b,u,f,v,S,C,D,A,M,E;Ut(e);let r=await t.memberService.getMemberById(e.memberId);if(!r||r.deleted)return null;let n=Math.max(1,Math.min(90,(g=e.rollingDays)!=null?g:30)),a=(b=e.referenceDate)!=null?b:new Date().toISOString(),{fromDate:o,toDate:i}=mt(a,n),s=`${o}T00:00:00.000Z`,c=`${i}T23:59:59.999Z`,[d,m,l,p]=await Promise.all([t.savingLedgerService.getSavingBalanceByMember(e.memberId),t.savingLedgerService.listSavingEntriesByMember(e.memberId,{includeDeleted:!1,dateFrom:s,dateTo:c,...(u=e.scope)!=null&&u.tenantId?{tenantId:e.scope.tenantId}:{},...(f=e.scope)!=null&&f.branchId?{branchId:e.scope.branchId}:{}}),(C=(S=(v=t.providers)==null?void 0:v.getAnggotaCreditSummary)==null?void 0:S.call(v,e.memberId,e.scope))!=null?C:Promise.resolve({activeLoans:0,outstandingPrincipalAmount:0,totalOverdueAmount:0,nextDueDate:null}),(M=(A=(D=t.providers)==null?void 0:D.getAnggotaComplianceStatus)==null?void 0:A.call(D,e.memberId,e.scope))!=null?M:Promise.resolve({status:"unknown",monthsInArrears:0})]);return{memberId:e.memberId,kpi:{totalSavingBalance:d.total,activeLoans:l.activeLoans,outstandingPrincipalAmount:l.outstandingPrincipalAmount,totalOverdueAmount:l.totalOverdueAmount},savingsCashflow30Days:lt(m,o,i),compliance:p,nextDueDate:(E=l.nextDueDate)!=null?E:null}}function qt(t){return{role:"pengurus",kpiCards:[{id:"active-members",label:"Anggota Aktif",value:t.kpi.activeMembers},{id:"total-saving-net",label:"Net Simpanan",value:t.kpi.totalSavingNet,unit:"IDR"},{id:"active-loans",label:"Pinjaman Aktif",value:t.kpi.activeLoans},{id:"total-overdue",label:"Total Tunggakan",value:t.kpi.totalOverdueAmount,unit:"IDR"}],charts:[{id:"savings-cashflow-30-days",title:"Arus Kas Simpanan 30 Hari",chartType:"area",series:[{key:"masuk",label:"Masuk",points:t.savingsCashflow30Days.map(e=>({x:e.date,y:e.masuk}))},{key:"keluar",label:"Keluar",points:t.savingsCashflow30Days.map(e=>({x:e.date,y:e.keluar}))},{key:"net",label:"Net",points:t.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:t.loanStatusComposition.aktif},{x:"jatuh_tempo",y:t.loanStatusComposition.jatuhTempo},{x:"macet",y:t.loanStatusComposition.macet},{x:"lunas",y:t.loanStatusComposition.lunas}]}]},{id:"loan-aging-buckets",title:"Aging Jatuh Tempo Pinjaman",chartType:"bar",series:[{key:"aging",label:"Jumlah Pinjaman",points:[{x:"0-7",y:t.loanAgingBuckets.d0to7},{x:"8-30",y:t.loanAgingBuckets.d8to30},{x:"31-60",y:t.loanAgingBuckets.d31to60},{x:">60",y:t.loanAgingBuckets.dOver60}]}]}]}}function Jt(t){return{role:"pengawas",kpiCards:[{id:"total-overdue",label:"Total Tunggakan",value:t.risk.totalOverdueAmount,unit:"IDR"}],charts:[{id:"loan-status-composition",title:"Komposisi Status Pinjaman",chartType:"donut",series:[{key:"loan-status",label:"Status Pinjaman",points:[{x:"aktif",y:t.risk.loanStatusComposition.aktif},{x:"jatuh_tempo",y:t.risk.loanStatusComposition.jatuhTempo},{x:"macet",y:t.risk.loanStatusComposition.macet},{x:"lunas",y:t.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:t.risk.loanAgingBuckets.d0to7},{x:"8-30",y:t.risk.loanAgingBuckets.d8to30},{x:"31-60",y:t.risk.loanAgingBuckets.d31to60},{x:">60",y:t.risk.loanAgingBuckets.dOver60}]}]},{id:"wajib-compliance-trend",title:"Tren Kepatuhan Simpanan Wajib",chartType:"line",series:[{key:"patuh",label:"Patuh",points:t.trends.wajibComplianceTrend.map(e=>({x:e.month,y:e.patuh}))},{key:"menunggak",label:"Menunggak",points:t.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:t.trends.memberGrowthTrend.map(e=>({x:e.month,y:e.active}))},{key:"non-active",label:"Non-Aktif",points:t.trends.memberGrowthTrend.map(e=>({x:e.month,y:e.nonActive}))}]}]}}function Yt(t){var e;return{role:"anggota",memberId:t.memberId,kpiCards:[{id:"total-saving-balance",label:"Saldo Simpanan",value:t.kpi.totalSavingBalance,unit:"IDR"},{id:"active-loans",label:"Pinjaman Aktif",value:t.kpi.activeLoans},{id:"outstanding-principal",label:"Outstanding Pokok",value:t.kpi.outstandingPrincipalAmount,unit:"IDR"},{id:"total-overdue",label:"Total Tunggakan",value:t.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:t.savingsCashflow30Days.map(r=>({x:r.date,y:r.masuk}))},{key:"keluar",label:"Keluar",points:t.savingsCashflow30Days.map(r=>({x:r.date,y:r.keluar}))},{key:"net",label:"Net",points:t.savingsCashflow30Days.map(r=>({x:r.date,y:r.net}))}]}],compliance:t.compliance,nextDueDate:(e=t.nextDueDate)!=null?e:null}}var zt={loanCount:0,activeLoanCount:0,closedLoanCount:0,defaultedLoanCount:0,outstandingPrincipalAmount:0,totalOverdueAmount:0},Xt={allocationCount:0,totalAllocatedAmount:0};function er(t){let e=t.from.slice(0,10),r=t.to.slice(0,10);return{fromIso:`${e}T00:00:00.000Z`,toIso:`${r}T23:59:59.999Z`}}function tr(t){let e=0,r=0,n=0,a=0,o=0;for(let i of t){let s=i.entryType==="credit"?1:-1;i.entryType==="credit"?e+=i.amount:r+=i.amount,i.savingType==="pokok"&&(n+=s*i.amount),i.savingType==="wajib"&&(a+=s*i.amount),i.savingType==="sukarela"&&(o+=s*i.amount)}return{creditTotal:e,debitTotal:r,netTotal:e-r,byType:{pokok:n,wajib:a,sukarela:o}}}function rr(t){return["section,key,value",`period,from,${t.period.from}`,`period,to,${t.period.to}`,`members,total,${t.members.total}`,`members,active,${t.members.active}`,`members,inactive,${t.members.inactive}`,`members,exited,${t.members.exited}`,`savings,creditTotal,${t.savings.creditTotal}`,`savings,debitTotal,${t.savings.debitTotal}`,`savings,netTotal,${t.savings.netTotal}`,`savings,pokokNet,${t.savings.byType.pokok}`,`savings,wajibNet,${t.savings.byType.wajib}`,`savings,sukarelaNet,${t.savings.byType.sukarela}`,`credit,loanCount,${t.credit.loanCount}`,`credit,activeLoanCount,${t.credit.activeLoanCount}`,`credit,closedLoanCount,${t.credit.closedLoanCount}`,`credit,defaultedLoanCount,${t.credit.defaultedLoanCount}`,`credit,outstandingPrincipalAmount,${t.credit.outstandingPrincipalAmount}`,`credit,totalOverdueAmount,${t.credit.totalOverdueAmount}`,`shu,allocationCount,${t.shu.allocationCount}`,`shu,totalAllocatedAmount,${t.shu.totalAllocatedAmount}`,`crossDomain,memberActivationRate,${t.crossDomain.memberActivationRate}`,`crossDomain,creditPenetrationRate,${t.crossDomain.creditPenetrationRate}`,`crossDomain,overdueToOutstandingRatio,${t.crossDomain.overdueToOutstandingRatio}`,`crossDomain,savingsPerActiveMember,${t.crossDomain.savingsPerActiveMember}`,`crossDomain,shuPerActiveMember,${t.crossDomain.shuPerActiveMember}`]}function rt(t,e){return e<=0?0:Number((t/e).toFixed(4))}async function nt(t,e){var b,u,f,v,S,C,D;let r=(b=e.scope)!=null?b:{},{fromIso:n,toIso:a}=er(e.period),o=await t.memberService.listMembers({includeDeleted:!1,...r.tenantId?{tenantId:r.tenantId}:{},...r.branchId?{branchId:r.branchId}:{}}),s=(await Promise.all(o.map(A=>t.savingLedgerService.listSavingEntriesByMember(A.id,{includeDeleted:!1,dateFrom:n,dateTo:a,...r.tenantId?{tenantId:r.tenantId}:{},...r.branchId?{branchId:r.branchId}:{}})))).flat(),c=tr(s),d=(v=await((f=(u=t.providers)==null?void 0:u.getCreditSummary)==null?void 0:f.call(u,e.period,r)))!=null?v:zt,m=(D=await((C=(S=t.providers)==null?void 0:S.getShuSummary)==null?void 0:C.call(S,e.period,r)))!=null?D:Xt,l=o.filter(A=>A.status==="active").length,p=o.length,g={memberActivationRate:rt(l,p),creditPenetrationRate:rt(d.activeLoanCount,l),overdueToOutstandingRatio:rt(d.totalOverdueAmount,d.outstandingPrincipalAmount),savingsPerActiveMember:l>0?Math.round(c.netTotal/l):0,shuPerActiveMember:l>0?Math.round(m.totalAllocatedAmount/l):0};return{period:e.period,scope:r,members:{total:p,active:l,inactive:o.filter(A=>A.status==="inactive").length,exited:o.filter(A=>A.status==="exited").length},savings:c,credit:d,shu:m,crossDomain:g}}async function nr(t,e){let r=await nt(t,e),n=rr(r).join(`
|
|
3
|
+
`);return{filename:`report-summary-${r.period.from.slice(0,10)}-${r.period.to.slice(0,10)}.csv`,contentType:"text/csv",body:n}}async function ar(t,e){let r=await nt(t,e),n={schemaVersion:"1",generatedAt:new Date().toISOString(),summary:r};return{filename:`report-summary-${r.period.from.slice(0,10)}-${r.period.to.slice(0,10)}.json`,contentType:"application/json",body:JSON.stringify(n),data:n}}function or(t){return{period:t.period,scope:t.scope,kpiCards:[{id:"members-total",label:"Total Anggota",value:t.members.total},{id:"members-active",label:"Anggota Aktif",value:t.members.active},{id:"savings-net",label:"Net Simpanan",value:t.savings.netTotal,unit:"IDR"},{id:"credit-overdue",label:"Total Tunggakan",value:t.credit.totalOverdueAmount,unit:"IDR"},{id:"shu-total",label:"Total SHU Alokasi",value:t.shu.totalAllocatedAmount,unit:"IDR"}],tableSections:[{id:"members",title:"Ringkasan Anggota",rows:[{key:"total",label:"Total",value:t.members.total},{key:"active",label:"Aktif",value:t.members.active},{key:"inactive",label:"Non-Aktif",value:t.members.inactive},{key:"exited",label:"Keluar",value:t.members.exited}]},{id:"savings",title:"Ringkasan Simpanan",rows:[{key:"creditTotal",label:"Total Masuk",value:t.savings.creditTotal,unit:"IDR"},{key:"debitTotal",label:"Total Keluar",value:t.savings.debitTotal,unit:"IDR"},{key:"netTotal",label:"Total Net",value:t.savings.netTotal,unit:"IDR"},{key:"pokokNet",label:"Net Pokok",value:t.savings.byType.pokok,unit:"IDR"},{key:"wajibNet",label:"Net Wajib",value:t.savings.byType.wajib,unit:"IDR"},{key:"sukarelaNet",label:"Net Sukarela",value:t.savings.byType.sukarela,unit:"IDR"}]},{id:"credit",title:"Ringkasan Kredit",rows:[{key:"loanCount",label:"Total Pinjaman",value:t.credit.loanCount},{key:"activeLoanCount",label:"Pinjaman Aktif",value:t.credit.activeLoanCount},{key:"closedLoanCount",label:"Pinjaman Lunas",value:t.credit.closedLoanCount},{key:"defaultedLoanCount",label:"Pinjaman Macet",value:t.credit.defaultedLoanCount},{key:"outstandingPrincipalAmount",label:"Outstanding Pokok",value:t.credit.outstandingPrincipalAmount,unit:"IDR"},{key:"totalOverdueAmount",label:"Total Tunggakan",value:t.credit.totalOverdueAmount,unit:"IDR"}]},{id:"shu",title:"Ringkasan SHU",rows:[{key:"allocationCount",label:"Jumlah Alokasi",value:t.shu.allocationCount},{key:"totalAllocatedAmount",label:"Total Alokasi",value:t.shu.totalAllocatedAmount,unit:"IDR"}]},{id:"cross-domain",title:"Metrik Lintas Domain",rows:[{key:"memberActivationRate",label:"Activation Rate Anggota",value:t.crossDomain.memberActivationRate},{key:"creditPenetrationRate",label:"Credit Penetration Rate",value:t.crossDomain.creditPenetrationRate},{key:"overdueToOutstandingRatio",label:"Overdue/Outstanding Ratio",value:t.crossDomain.overdueToOutstandingRatio},{key:"savingsPerActiveMember",label:"Simpanan per Anggota Aktif",value:t.crossDomain.savingsPerActiveMember,unit:"IDR"},{key:"shuPerActiveMember",label:"SHU per Anggota Aktif",value:t.crossDomain.shuPerActiveMember,unit:"IDR"}]}]}}function ir(t){let e={...t};return e.limit==null&&(e.limit=100),e.limit<1&&(e.limit=1),e.limit>1e3&&(e.limit=1e3),e}function sr(t){return!t||t.length===0?null:new Set(t)}function cr(t,e){var n;if(!e||!((n=t.eventTypes)!=null&&n.length))return;let r=t.eventTypes.filter(a=>!e.has(a));if(r.length>0)throw y(`audit trail query contains unknown eventTypes: ${r.join(", ")}`)}function dr(t){var n;let e=ir(t),r=e.accessContext;if(!r||r.role!=="anggota")return e;if(!((n=r.actorMemberId)!=null&&n.trim()))throw y("audit trail access denied: anggota context requires actorMemberId");if(e.memberId&&e.memberId!==r.actorMemberId)throw y("audit trail access denied: anggota can only query own memberId");return{...e,memberId:r.actorMemberId}}function mr(t,e){var r;return t.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,(r=e.limit)!=null?r:100)}async function lr(t,e={}){let r=sr(t.eventCatalog),n=dr(e);cr(n,r);let a=await t.providers.listEvents(n),o=r?a.filter(i=>r.has(i.eventType)):a;return mr(o,n)}function ur(t){return[...new Set(t)]}function pr(t){return{eventCatalog:ur(t.flatMap(r=>{var n;return(n=r.eventCatalog)!=null?n:[]})),auditTrailProvider:{async listEvents(r){return(await Promise.all(t.map(a=>a.provider.listEvents(r)))).flat().sort((a,o)=>o.occurredAt.localeCompare(a.occurredAt)).slice(0,r.limit&&r.limit>0?r.limit:100)}}}}var ge=["LOGIN_SUCCESS","LOGIN_FAILED","LOCKOUT_TRIGGERED","SESSION_REVOKED","CONTEXT_SWITCHED","STEP_UP_CHALLENGED","STEP_UP_PASSED","STEP_UP_FAILED"];function gr(t){return ge.includes(t)}function br(t){var e;return{eventId:t.eventId,eventType:t.eventType,occurredAt:t.timestamp,message:(e=t.reasonCode)!=null?e:t.result}}function fr(t,e){var r,n,a;return{eventId:t.eventId,sourceDomain:"ofauth",eventType:t.eventType,occurredAt:t.timestamp,memberId:e!=null?e:void 0,tenantId:(r=t.scopeRef)==null?void 0:r.tenantId,branchId:(n=t.scopeRef)==null?void 0:n.branchId,summary:(a=t.reasonCode)!=null?a:t.result}}function vr(t,e){return{member360:{async getAuditByMember(a){let o=await e.resolveIdentityIdsByMemberId(a);return o.length===0?[]:(await Promise.all(o.map(s=>t.queryEvents({identityId:s})))).flat().sort((s,c)=>c.timestamp.localeCompare(s.timestamp)).slice(0,100).map(br)}},auditTrailProvider:{async listEvents(a){var m;let o=[];if(a.memberId&&(o=await e.resolveIdentityIdsByMemberId(a.memberId),o.length===0))return[];let i=((m=a.eventTypes)!=null?m:[]).filter(gr),s={...a.fromTimestamp?{fromTimestamp:a.fromTimestamp}:{},...a.toTimestamp?{toTimestamp:a.toTimestamp}:{},...i.length>0?{eventTypes:i}:{}},c=o.length>0?await Promise.all(o.map(l=>t.queryEvents({...s,identityId:l}))):[await t.queryEvents(s)];return await Promise.all(c.flat().map(async l=>{var p,g;return fr(l,l.identityId&&(g=await((p=e.resolveMemberIdByIdentityId)==null?void 0:p.call(e,l.identityId)))!=null?g:null)}))}},eventCatalog:[...ge]}}var be=["member.created","member.updated","saving.entry-recorded","saving.policy-upserted","shu.config-upserted","shu.period-created","shu.period-finalized","shu.allocations-generated"],fe=["loan.created","loan.closed","installment.schedule-generated","installment.payment-recorded","credit-policy.created","credit-policy.updated"];function yr(t){return be.includes(t)}function hr(t){return fe.includes(t)}function Sr(t){return{eventId:t.eventId,eventType:t.name,occurredAt:t.occurredAt,message:t.entityId?`entity:${t.entityId}`:t.name}}function Ir(t){var r;let e=(r=t.payload)==null?void 0:r.memberId;return typeof e=="string"&&e.trim()?e:null}function ut(t,e,r){var n,a,o,i;return{eventId:t.eventId,sourceDomain:e,eventType:t.name,occurredAt:t.occurredAt,memberId:(a=(n=Ir(t))!=null?n:r)!=null?a:void 0,tenantId:(o=t.tenantId)!=null?o:void 0,branchId:(i=t.branchId)!=null?i:void 0,summary:t.entityId?`entity:${t.entityId}`:t.name}}function pt(t){return[...t].sort((e,r)=>r.occurredAt.localeCompare(e.occurredAt))}var Cr=[...be,...fe];function Pr(t){return{member360:{async getAuditByMember(n,a){var s,c,d,m;let[o,i]=await Promise.all([(c=(s=t.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?c:Promise.resolve([]),(m=(d=t.ofcoopCredit)==null?void 0:d.queryEvents({memberId:n,...a!=null&&a.tenantId?{tenantId:a.tenantId}:{},...a!=null&&a.branchId?{branchId:a.branchId}:{},limit:100}))!=null?m:Promise.resolve([])]);return pt([...o,...i]).slice(0,100).map(Sr)}},auditTrailProvider:{async listEvents(n){var m,l,p,g,b,u,f,v,S;let a=(m=n.eventTypes)!=null?m:[],o=a.length>0?a.filter(yr):void 0,i=a.length>0?a.filter(hr):void 0,[s,c]=await Promise.all([(b=(g=t.ofcoop)==null?void 0:g.queryEvents({...n.memberId?{memberId:n.memberId}:{},...n.fromTimestamp?{fromTimestamp:n.fromTimestamp}:{},...n.toTimestamp?{toTimestamp:n.toTimestamp}:{},...(l=n.scope)!=null&&l.tenantId?{tenantId:n.scope.tenantId}:{},...(p=n.scope)!=null&&p.branchId?{branchId:n.scope.branchId}:{},...o?{eventNames:o}:{},...n.limit?{limit:n.limit}:{}}))!=null?b:Promise.resolve([]),(S=(v=t.ofcoopCredit)==null?void 0:v.queryEvents({...n.memberId?{memberId:n.memberId}:{},...n.fromTimestamp?{fromTimestamp:n.fromTimestamp}:{},...n.toTimestamp?{toTimestamp:n.toTimestamp}:{},...(u=n.scope)!=null&&u.tenantId?{tenantId:n.scope.tenantId}:{},...(f=n.scope)!=null&&f.branchId?{branchId:n.scope.branchId}:{},...i?{eventNames:i}:{},...n.limit?{limit:n.limit}:{}}))!=null?S:Promise.resolve([])]),d=[...s.map(C=>ut(C,"ofcoop",n.memberId)),...c.map(C=>ut(C,"ofcoop-credit",n.memberId))];return pt(d)}},eventCatalog:[...Cr]}}function gt(t){return[...new Set(t)]}function Ar(t){return t.startsWith("ofcoop.")?"ofcoop":t.startsWith("ofcoop-credit.")?"ofcoop-credit":t.startsWith("ofauth.")?"ofauth":"external"}function Dr(t){return t.startsWith("ofcoop.")?t.slice(7):t.startsWith("ofcoop-credit.")?t.slice(14):t.startsWith("ofauth.")?t.slice(7).toUpperCase():t}function Mr(t){if(!t||t.length===0)return;let e=t.flatMap(r=>[`ofcoop.${r}`,`ofcoop-credit.${r}`,`ofauth.${r.toLowerCase()}`]);return gt(e)}function wr(t,e={}){var n;return{eventCatalog:gt((n=e.eventCatalog)!=null?n:[...be,...fe,...ge]),auditTrailProvider:{async listEvents(a){var i,s;return(await t.listActivityRecords({fromTimestamp:a.fromTimestamp,toTimestamp:a.toTimestamp,tenantId:(i=a.scope)==null?void 0:i.tenantId,branchId:(s=a.scope)==null?void 0:s.branchId,limit:a.limit,activityTypes:Mr(a.eventTypes)})).map(c=>{var l,p,g,b,u;let d=typeof((l=c.payload)==null?void 0:l.memberId)=="string"?c.payload.memberId:null,m=Ar(c.activityType);return{eventId:c.activityId,sourceDomain:m,eventType:Dr(c.activityType),occurredAt:c.occurredAt,memberId:(p=d!=null?d:a.memberId)!=null?p:void 0,tenantId:(g=c.scopeRef)==null?void 0:g.tenantId,branchId:(b=c.scopeRef)==null?void 0:b.branchId,summary:typeof((u=c.payload)==null?void 0:u.entityId)=="string"&&c.payload.entityId?`entity:${c.payload.entityId}`:c.activityType}}).sort((c,d)=>d.occurredAt.localeCompare(c.occurredAt))}}}}function te(t){return t.slice(0,10)}function Tr(t,e){let r=new Date(`${t}T00:00:00.000Z`);return r.setUTCDate(r.getUTCDate()+e),r.toISOString().slice(0,10)}function Rr(t){let e={aktif:0,jatuhTempo:0,macet:0,lunas:0};for(let r of t){if(r.status==="defaulted"){e.macet+=1;continue}if(r.status==="closed"){e.lunas+=1;continue}r.overdueInstallmentCount>0?e.jatuhTempo+=1:e.aktif+=1}return e}function kr(t,e){let r={d0to7:0,d8to30:0,d31to60:0,dOver60:0},n=Date.parse(`${e}T00:00:00.000Z`);for(let a of t){let o=Date.parse(`${te(a.dueDate)}T00:00:00.000Z`),i=Math.max(0,Math.floor((n-o)/(1440*60*1e3)));i<=7?r.d0to7+=1:i<=30?r.d8to30+=1:i<=60?r.d31to60+=1:r.dOver60+=1}return r}function q(t){return t!=null&&t.tenantId?{tenantId:t.tenantId,...t.branchId?{branchId:t.branchId}:{}}:null}function xr(t){return{member360:{async getCreditByMember(a,o){let i=await t.loanService.listLoansByMember(a,{includeDeleted:!1,...o!=null&&o.tenantId?{tenantId:o.tenantId}:{},...o!=null&&o.branchId?{branchId:o.branchId}:{}}),s={totalLoans:i.length,activeLoans:i.filter(d=>d.status==="active").length,closedLoans:i.filter(d=>d.status==="closed").length,defaultedLoans:i.filter(d=>d.status==="defaulted").length,totalPrincipalAmount:i.reduce((d,m)=>d+m.principalAmount,0)},c=[...i].sort((d,m)=>m.startDate.localeCompare(d.startDate)).slice(0,5).map(d=>({loanId:d.id,status:d.status,principalAmount:d.principalAmount,startDate:d.startDate}));return{summary:s,recentLoans:c}},async getSettlementSummaryByMember(a,o){let i=q(o);if(!i)return{totalOutstanding:0,totalOverdue:0,settlementStatus:"clear",notes:"tenantId missing in scope"};let s=await t.loanBoardService.listLoanBoard(i,{memberId:a}),c=s.reduce((m,l)=>m+l.outstandingAmount,0),d=s.filter(m=>m.overdueInstallmentCount>0).reduce((m,l)=>m+l.outstandingAmount,0);return{totalOutstanding:c,totalOverdue:d,settlementStatus:d>0?"overdue":c>0?"pending":"clear"}}},dashboard:{async getLoanStatusComposition(a){let o=q(a);if(!o)return{aktif:0,jatuhTempo:0,macet:0,lunas:0};let i=await t.loanBoardService.listLoanBoard(o);return Rr(i)},async getLoanAgingBuckets(a){let o=q(a);if(!o)return{d0to7:0,d8to30:0,d31to60:0,dOver60:0};let i=te(new Date().toISOString()),s=Tr(i,-60),c=await t.loanDueWindowService.listLoansDueInWindow(o,{dateFrom:"1970-01-01T00:00:00.000Z",dateTo:`${i}T23:59:59.999Z`}),d=c.filter(p=>p.installmentStatus==="overdue"&&te(p.dueDate)>=s),m=c.filter(p=>p.installmentStatus==="overdue"&&te(p.dueDate)<s),l=kr(d,i);return l.dOver60+=m.length,l},async getTotalOverdueAmount(a){let o=q(a);return o?(await t.loanDueWindowService.listLoansDueInWindow(o,{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,c)=>s+c.outstandingAmount,0):0},async getAnggotaCreditSummary(a,o){var p;let i=q(o);if(!i)return{activeLoans:0,outstandingPrincipalAmount:0,totalOverdueAmount:0,nextDueDate:null};let s=await t.loanBoardService.listLoanBoard(i,{memberId:a}),c=s.filter(g=>g.status==="active").length,d=s.reduce((g,b)=>g+b.outstandingAmount,0),m=s.filter(g=>g.overdueInstallmentCount>0).reduce((g,b)=>g+b.outstandingAmount,0),l=(p=[...s].map(g=>g.nextDueDate).filter(Boolean).sort((g,b)=>String(g).localeCompare(String(b)))[0])!=null?p:null;return{activeLoans:c,outstandingPrincipalAmount:d,totalOverdueAmount:m,nextDueDate:l}},async getLoanRiskMap(a){var l;let o=q(a);if(!o)return[];let i=te(new Date().toISOString()),s=await t.loanBoardService.listLoanBoard(o),c=await t.loanDueWindowService.listLoansDueInWindow(o,{dateFrom:"1970-01-01T00:00:00.000Z",dateTo:`${i}T23:59:59.999Z`}),d=new Map,m=Date.parse(`${i}T00:00:00.000Z`);for(let p of c){if(p.installmentStatus!=="overdue")continue;let g=Date.parse(`${te(p.dueDate)}T00:00:00.000Z`),b=Math.max(0,Math.floor((m-g)/(1440*60*1e3))),u=(l=d.get(p.loanId))!=null?l:0;b>u&&d.set(p.loanId,b)}return s.map(p=>{var u;let g=(u=d.get(p.loanId))!=null?u:0,b=g>60||p.outstandingAmount>=5e6?"high":g>30||p.outstandingAmount>=1e6?"medium":"low";return{loanId:p.loanId,memberId:p.memberId,outstandingAmount:p.outstandingAmount,overdueAgeDays:g,riskLevel:b}})}},report:{async getCreditSummary(a,o){let i=q(o);if(!i)return{loanCount:0,activeLoanCount:0,closedLoanCount:0,defaultedLoanCount:0,outstandingPrincipalAmount:0,totalOverdueAmount:0};let s=await t.loanBoardService.listLoanBoard(i);return{loanCount:s.length,activeLoanCount:s.filter(c=>c.status==="active").length,closedLoanCount:s.filter(c=>c.status==="closed").length,defaultedLoanCount:s.filter(c=>c.status==="defaulted").length,outstandingPrincipalAmount:s.reduce((c,d)=>c+d.outstandingAmount,0),totalOverdueAmount:s.filter(c=>c.overdueInstallmentCount>0).reduce((c,d)=>c+d.outstandingAmount,0)}}}}}function ft(t){return t.slice(0,10)}function bt(t){return t.slice(0,7)}function Or(t){return new Date(`${t}-01T00:00:00.000Z`)}function _e(t){let e=Or(t);return new Date(Date.UTC(e.getUTCFullYear(),e.getUTCMonth()+1,0,23,59,59,999))}function at(t,e=new Date().toISOString()){let r=new Date(e),n=[];for(let a=t-1;a>=0;a-=1){let o=new Date(Date.UTC(r.getUTCFullYear(),r.getUTCMonth()-a,1));n.push(`${o.getUTCFullYear()}-${String(o.getUTCMonth()+1).padStart(2,"0")}`)}return n}function re(t){return{...t!=null&&t.tenantId?{tenantId:t.tenantId}:{},...t!=null&&t.branchId?{branchId:t.branchId}:{}}}function Er(t,e){return t.startDate<=e&&t.endDate>=e}function vt(t,e=new Date().toISOString()){var o,i,s,c,d,m;if(t.length===0)return null;let r=ft(e),n=t.filter(l=>Er(l,r));if(n.length>0)return(i=(o=[...n].sort((l,p)=>p.endDate.localeCompare(l.endDate))[0])==null?void 0:o.id)!=null?i:null;let a=t.filter(l=>l.status==="finalized");return a.length>0?(c=(s=[...a].sort((l,p)=>p.endDate.localeCompare(l.endDate))[0])==null?void 0:s.id)!=null?c:null:(m=(d=[...t].sort((l,p)=>p.endDate.localeCompare(l.endDate))[0])==null?void 0:d.id)!=null?m:null}function Lr(t,e){let r=_e(e).toISOString();return!(!(t.joinDate<=r)||t.status!=="active"||t.exitDate&&t.exitDate<=r)}function Nr(t,e){let r=_e(e).toISOString();return t.joinDate<=r}async function ot(t,e,r,n,a){return(await Promise.all(e.map(i=>t.listSavingEntriesByMember(i,{includeDeleted:!1,dateFrom:r,dateTo:n,...re(a)})))).flat()}function Br(t,e={}){var o,i;let r=Math.max(1,Math.min(24,(o=e.monthsWindow)!=null?o:6)),n=Math.max(1,Math.min(180,(i=e.heatmapDays)!=null?i:30)),a=async s=>{var d;if(e.resolveCurrentShuPeriodId)return e.resolveCurrentShuPeriodId(s);if(!((d=t.shuService)!=null&&d.listShuPeriods))return null;let c=await t.shuService.listShuPeriods({includeDeleted:!1,...s!=null&&s.tenantId?{tenantId:s.tenantId}:{},...s!=null&&s.branchId?{branchId:s.branchId}:{}});return vt(c,e.referenceDate)};return{async getOnboardingFunnel(s){let c=await t.memberService.listMembers({includeDeleted:!1,...re(s)}),d=await Promise.all(c.map(p=>t.savingLedgerService.getSavingBalanceByMember(p.id))),m=d.filter(p=>p.pokok>0).length,l=c.filter((p,g)=>{var b,u;return p.status==="active"&&((u=(b=d[g])==null?void 0:b.pokok)!=null?u:0)>0}).length;return{daftar:c.length,verifikasiPokok:m,aktif:l}},async getWajibComplianceTrend(s){let c=at(r),m=(await t.memberService.listMembers({includeDeleted:!1,status:"active",...re(s)})).map(u=>u.id);if(m.length===0)return c.map(u=>({month:u,patuh:0,menunggak:0}));let l=c[0],p=c[c.length-1],g=await ot(t.savingLedgerService,m,`${l}-01T00:00:00.000Z`,_e(p).toISOString(),s),b=new Set(g.filter(u=>u.savingType==="wajib"&&u.entryType==="credit"&&u.amount>0).map(u=>`${u.memberId}:${bt(u.transactionDate)}`));return c.map(u=>{let f=0,v=0;for(let S of m)b.has(`${S}:${u}`)?f+=1:v+=1;return{month:u,patuh:f,menunggak:v}})},async getSavingTypeCompositionByPeriod(s){let c=at(r),m=(await t.memberService.listMembers({includeDeleted:!1,...re(s)})).map(u=>u.id);if(m.length===0)return c.map(u=>({period:u,pokok:0,wajib:0,sukarela:0}));let l=c[0],p=c[c.length-1],g=await ot(t.savingLedgerService,m,`${l}-01T00:00:00.000Z`,_e(p).toISOString(),s),b=new Map;for(let u of c)b.set(u,{period:u,pokok:0,wajib:0,sukarela:0});for(let u of g){let f=bt(u.transactionDate),v=b.get(f);if(!v)continue;let S=u.entryType==="credit"?1:-1;u.savingType==="pokok"&&(v.pokok+=S*u.amount),u.savingType==="wajib"&&(v.wajib+=S*u.amount),u.savingType==="sukarela"&&(v.sukarela+=S*u.amount)}return c.map(u=>{var f;return(f=b.get(u))!=null?f:{period:u,pokok:0,wajib:0,sukarela:0}})},async getMemberGrowthTrend(s){let c=at(r),d=await t.memberService.listMembers({includeDeleted:!1,...re(s)});return c.map(m=>{let l=d.filter(g=>Nr(g,m)).length,p=d.filter(g=>Lr(g,m)).length;return{month:m,active:p,nonActive:Math.max(0,l-p)}})},async getShuDistributionSummary(s){if(!t.shuService)return[];let c=await a(s);return c?[...(await t.shuService.listShuAllocations(c,{includeDeleted:!1})).filter(l=>!(s!=null&&s.tenantId&&l.tenantId!==s.tenantId||s!=null&&s.branchId&&l.branchId!==s.branchId))].sort((l,p)=>p.allocationAmount-l.allocationAmount).slice(0,10).map(l=>({memberId:l.memberId,allocationAmount:l.allocationAmount})):[]},async getOperationalActivityHeatmap(s){var b;let d=(await t.memberService.listMembers({includeDeleted:!1,...re(s)})).map(u=>u.id);if(d.length===0)return[];let m=new Date().toISOString(),l=new Date(Date.now()-(n-1)*864e5).toISOString(),p=await ot(t.savingLedgerService,d,l,m,s),g=new Map;for(let u of p){let f=ft(u.transactionDate),v=new Date(u.transactionDate).getUTCHours(),S=`${f}:${v}`,C=(b=g.get(S))!=null?b:{day:f,hour:v,total:0};C.total+=1,g.set(S,C)}return Array.from(g.values()).sort((u,f)=>u.day===f.day?u.hour-f.hour:u.day.localeCompare(f.day))}}}function jr(t,e){return{async getShuSummary(r,n){let a=await e.resolveShuPeriodIdsForRange(r,n);if(!a.length)return{allocationCount:0,totalAllocatedAmount:0};let i=(await Promise.all(a.map(s=>t.shuService.listShuAllocations(s,{includeDeleted:!1})))).flat().filter(s=>!(n!=null&&n.tenantId&&s.tenantId!==n.tenantId||n!=null&&n.branchId&&s.branchId!==n.branchId));return{allocationCount:i.length,totalAllocatedAmount:i.reduce((s,c)=>s+c.allocationAmount,0)}}}}
|
package/package.json
CHANGED
|
@@ -1,16 +1,28 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ofcoop-shared-core",
|
|
3
|
-
"version": "0.1.0-alpha.
|
|
3
|
+
"version": "0.1.0-alpha.1",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Cooperative shared-core baseline (member/saving/shu/policy) with ofcore primitive bridge.",
|
|
6
|
+
"author": {
|
|
7
|
+
"name": "Agus Made",
|
|
8
|
+
"email": "krisnaparta@gmail.com"
|
|
9
|
+
},
|
|
6
10
|
"main": "dist/index.js",
|
|
11
|
+
"module": "dist/index.esm.js",
|
|
7
12
|
"types": "dist/index.d.ts",
|
|
13
|
+
"exports": {
|
|
14
|
+
".": {
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"import": "./dist/index.esm.js",
|
|
17
|
+
"require": "./dist/index.js"
|
|
18
|
+
}
|
|
19
|
+
},
|
|
8
20
|
"files": [
|
|
9
21
|
"dist"
|
|
10
22
|
],
|
|
11
23
|
"scripts": {
|
|
12
24
|
"clean": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\"",
|
|
13
|
-
"build": "npm run clean && tsc -p tsconfig.build.json",
|
|
25
|
+
"build": "npm run clean && tsc -p tsconfig.build.json && node esbuild.config.js",
|
|
14
26
|
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
15
27
|
"test": "NODE_PATH=.. npm run build && NODE_PATH=.. node --test ./tests/*.test.js",
|
|
16
28
|
"verify:contract": "node ./scripts/verify-surface.js",
|
|
@@ -23,17 +35,15 @@
|
|
|
23
35
|
"verify:residual-conformance": "NODE_PATH=.. npm run build && NODE_PATH=.. node ./scripts/verify-residual-conformance.js",
|
|
24
36
|
"ci:check": "npm run typecheck && npm run verify:contract && npm run verify:ofcore-primitives && npm run verify:governance && npm run verify:factory-boundary && npm run verify:runtime-bridge && npm run test && npm run verify:logic",
|
|
25
37
|
"prepublishOnly": "npm run ci:check",
|
|
26
|
-
"prepack": "npm run build"
|
|
38
|
+
"prepack": "npm run build",
|
|
39
|
+
"bundle": "node esbuild.config.js"
|
|
27
40
|
},
|
|
28
41
|
"dependencies": {
|
|
29
42
|
"ofcore": "0.1.0-alpha.0"
|
|
30
43
|
},
|
|
31
44
|
"devDependencies": {
|
|
32
|
-
"typescript": "^5.9.3"
|
|
33
|
-
|
|
34
|
-
"author": {
|
|
35
|
-
"name": "Agus Made",
|
|
36
|
-
"email": "krisnaparta@gmail.com"
|
|
45
|
+
"typescript": "^5.9.3",
|
|
46
|
+
"esbuild": "^0.25.11"
|
|
37
47
|
},
|
|
38
48
|
"publishConfig": {
|
|
39
49
|
"access": "public"
|