task-l.3.1

This commit is contained in:
phaichayon
2026-06-22 14:18:26 +07:00
parent 42f403a7ed
commit 1b901efc51
21 changed files with 1320 additions and 102 deletions

View File

@@ -3,7 +3,10 @@ import { HydrationBoundary, dehydrate } from '@tanstack/react-query';
import PageContainer from '@/components/layout/page-container';
import { CustomerDetail } from '@/features/crm/customers/components/customer-detail';
import { customerByIdOptions, customerContactsOptions } from '@/features/crm/customers/api/queries';
import { getCustomerReferenceData } from '@/features/crm/customers/server/service';
import {
getCustomerDetail,
getCustomerReferenceData
} from '@/features/crm/customers/server/service';
import { listCustomerEnquiryRelations } from '@/features/crm/enquiries/server/service';
import { listCustomerQuotationRelations } from '@/features/crm/quotations/server/service';
import { PERMISSIONS } from '@/lib/auth/rbac';
@@ -46,34 +49,55 @@ export default async function CustomerDetailRoute({ params }: PageProps) {
(!!session?.user?.activeOrganizationId &&
(session.user.activeMembershipRole === 'admin' ||
session.user.activePermissions.includes(PERMISSIONS.crmContactDelete)));
const accessContext =
session?.user?.activeOrganizationId && session?.user?.id
? {
organizationId: session.user.activeOrganizationId,
userId: session.user.id,
membershipRole: session.user.activeMembershipRole ?? 'user',
businessRole: session.user.activeBusinessRole ?? 'sales_support',
permissions: session.user.activePermissions ?? [],
branchScopeIds: session.user.activeBranchScopeIds ?? [],
productTypeScopeIds: session.user.activeProductTypeScopeIds ?? [],
ownershipScope: session.user.activeOwnershipScope ?? 'organization',
branchScopeMode: 'all',
productScopeMode: 'all'
}
: null;
const resolvedCanRead =
canRead && accessContext
? await getCustomerDetail(id, session.user.activeOrganizationId!, accessContext)
.then(() => true)
.catch(() => false)
: false;
const queryClient = getQueryClient();
if (canRead) {
if (resolvedCanRead) {
void queryClient.prefetchQuery(customerByIdOptions(id));
}
if (canContactRead) {
if (resolvedCanRead && canContactRead) {
void queryClient.prefetchQuery(customerContactsOptions(id));
}
const referenceData =
canRead && session?.user?.activeOrganizationId
resolvedCanRead && session?.user?.activeOrganizationId
? await getCustomerReferenceData(session.user.activeOrganizationId)
: null;
const relatedEnquiries =
canRead && session?.user?.activeOrganizationId
? await listCustomerEnquiryRelations(id, session.user.activeOrganizationId)
resolvedCanRead && session?.user?.activeOrganizationId && accessContext
? await listCustomerEnquiryRelations(id, session.user.activeOrganizationId, accessContext)
: [];
const relatedQuotations =
canRead && session?.user?.activeOrganizationId
? await listCustomerQuotationRelations(id, session.user.activeOrganizationId)
resolvedCanRead && session?.user?.activeOrganizationId && accessContext
? await listCustomerQuotationRelations(id, session.user.activeOrganizationId, accessContext)
: [];
return (
<PageContainer
pageTitle='Customer Detail'
pageDescription='Customer profile, contacts, audit timeline, and future CRM document handoff.'
access={canRead}
access={resolvedCanRead}
accessFallback={
<div className='text-muted-foreground rounded-lg border border-dashed p-8 text-center'>
You do not have access to this customer record.