feat(dds): upgrade DDS UI - agent, party, daily entry, approvals, product view
- Agent master: tabbed layout, customer search dialog, GL dropdown, account card, view page - Party master: tabbed layout, expected party code, nominee cards, relation from code values - Daily transaction entry: compact style, collections popup, Apply DDS Receipt placement - Approvals: new review modal, Agent Approval tab, DDS routing into product/pending account - DDS product: view page and list buttons; drop Auto Interest Post Day Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -56,6 +56,53 @@ export const TEMP_TABLE_ACCOUNT_ENTITIES: readonly string[] = [
|
||||
'CURRENTACCOUNT'
|
||||
];
|
||||
|
||||
/**
|
||||
* DDS keeps its own approval queue (/dds/approvals), which also describes each entry in the clerk's
|
||||
* terms. Its product and account requests are listed in Product Approval and Pending Account as well,
|
||||
* so a checker finds them where every other product and account waits - but they are read from, and
|
||||
* actioned through, that DDS queue rather than /makercheckers.
|
||||
*/
|
||||
export function isDdsProductEntry(entry: any): boolean {
|
||||
return isDdsRoutedRequest(entry?.entity, entry?.action) && entry?.entity === 'DDSACCOUNTTYPE';
|
||||
}
|
||||
|
||||
export function isDdsAccountEntry(entry: any): boolean {
|
||||
return isDdsRoutedRequest(entry?.entity, entry?.action) && entry?.entity === 'PARTY';
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether a command is a DDS product or DDS account create/edit - one listed under Product Approval or
|
||||
* Pending Account, and so left out of DDS Approvals and the Checker Inbox, which would otherwise show
|
||||
* the same request a second and third time.
|
||||
*/
|
||||
export function isDdsRoutedRequest(
|
||||
entityName: string | undefined | null,
|
||||
actionName: string | undefined | null
|
||||
): boolean {
|
||||
const entity = (entityName ?? '').toUpperCase();
|
||||
// An agent request of any kind waits under Agent Approval: an agent has no voucher and no amount,
|
||||
// so the money columns of DDS Approvals say nothing about one.
|
||||
if (entity === 'AGENT') {
|
||||
return true;
|
||||
}
|
||||
return [
|
||||
'DDSACCOUNTTYPE',
|
||||
'PARTY'
|
||||
].includes(entity) && [
|
||||
'CREATE',
|
||||
'UPDATE'
|
||||
].includes((actionName ?? '').toUpperCase());
|
||||
}
|
||||
|
||||
/** The DDS queue's "2026-10-27 11:04" as a Date, for the tables' date columns. */
|
||||
export function ddsMadeOn(madeOn: string | undefined | null): Date | null {
|
||||
if (!madeOn) {
|
||||
return null;
|
||||
}
|
||||
const d = new Date(String(madeOn).replace(' ', 'T'));
|
||||
return isNaN(d.getTime()) ? null : d;
|
||||
}
|
||||
|
||||
/** Short type badge shown in the Product Approval table, matching the pending-edit productType tags. */
|
||||
export const PRODUCT_ENTITY_TYPE_LABEL: Record<string, string> = {
|
||||
LOANPRODUCT: 'LOAN',
|
||||
@@ -111,7 +158,8 @@ export const PRODUCT_TYPE_DISPLAY_LABEL: Record<string, string> = {
|
||||
FD: 'FIXED DEPOSIT PRODUCT',
|
||||
'FIXED DEPOSIT': 'FIXED DEPOSIT PRODUCT',
|
||||
RD: 'RECURRING DEPOSIT PRODUCT',
|
||||
'RECURRING DEPOSIT': 'RECURRING DEPOSIT PRODUCT'
|
||||
'RECURRING DEPOSIT': 'RECURRING DEPOSIT PRODUCT',
|
||||
DDS: 'DDS PRODUCT'
|
||||
};
|
||||
|
||||
/** Label shown in the Product Approval Type column. Unmapped types render unchanged. */
|
||||
|
||||
Reference in New Issue
Block a user