DDS Interest & Commission

Calculate, check and post DDS interest and agent commission, and close matured accounts

1

Choose the job

Each month: Calculate first, check the preview, then Post.

@for (group of jobGroups; track group.title) {
{{ group.title }} {{ group.hint }}
@for (code of group.steps; track code; let last = $last) { @if (!last) { } }
}
2

{{ jobTypeLabel }} {{ isPostingJob ? 'Moves money' : 'Calculation only' }}

Which branches, agents and accounts, and as of which date.

Job Type @for (type of jobTypes; track type.code) { {{ type.label }} } {{ isPostingJob ? 'Posting Date' : 'Interest Date' }} Branch @for (scope of branchScopes; track scope) { {{ scope }} } @if (isBranchSelected) {
Branches ({{ selectedOfficeNames.size }} selected)
@for (office of offices; track office.id) { {{ office.name }} } @if (offices.length === 0) { Loading branches... }
}
Agents
From to To
@if (!isCommissionJob) {
Parties
From to To
}
@if (isPostingJob) { {{ jobTypeLabel }} moves what has already been calculated to where it belongs — into the customer's balance, or out to the agent. Generate lists it first; nothing moves until you press Post. } @else { {{ jobTypeLabel }} works out what has been earned since the last run and records it against each account. It does not become spendable until the matching Posting job runs. Generate previews it; nothing is recorded until you press Post. }
@if (pendingPreviews.length > 0) {

Generated, not posted yet

Open a run to check its figures, then Post or Discard it.

@for (run of pendingPreviews; track run.id) { }
}
@if (runStats.running > 0) {
Posting is running. It continues even if you leave this screen — the list below updates when it finishes.
}

Previous runs

Every run, and whether it was applied.

@for (status of runStatuses; track status.code) { } {{ recentRuns.length }} runs in all
@if (hasRunFilters) { }
Job @for (job of runJobOptions; track job.code) { }
@if (runsLoading && recentRuns.length === 0) {
@for (row of [1, 2, 3, 4, 5]; track row) { }
} @else if (recentRuns.length === 0) {

No batch has been run yet.

} @else if (filteredRuns.length === 0) {

No run matches these filters.

} @else {
@for (run of pagedRuns; track run.id) { @if (expandedRunId === run.id) { } }
# Job Job date Entries Amount Status Generated Posted on
#{{ run.id }} {{ labelOf(run.jobType) }} {{ run.jobDate | dateFormat }} {{ run.totalRows }} {{ money(run.totalAmount) }} @switch (run.status) { @case ('POSTED') { Posted } @case ('POSTING') { Running } @case ('FAILED') { Failed } @default { Not posted } } {{ run.generatedOnDate ? (run.generatedOnDate | dateFormat) : '—' }} {{ run.postedOnDate ? (run.postedOnDate | dateFormat) : '—' }}
Branch{{ run.branchScope || '—' }}
Scheme{{ run.subType || 'All schemes' }}
Agents{{ run.agentFrom }} to {{ run.agentTo }}
Parties{{ run.partyFrom }} to {{ run.partyTo }}
Entries posted{{ run.rowsPosted ?? 0 }} of {{ run.totalRows }}
Amount₹ {{ money(run.totalAmount) }}
@if (run.status === 'FAILED') {

{{ run.failureReason || 'No reason recorded' }}

}
{{ hasRunFilters ? 'Total of the ' + filteredRuns.length + ' runs shown' : 'Total' }} {{ money(filteredRunsTotal) }}
}