dealer made to validate with common principle code

This commit is contained in:
laxman h 2026-03-26 21:09:20 +05:30
parent 67d73878c9
commit 3769dc9dc0
4 changed files with 82 additions and 21 deletions

View File

@ -208,6 +208,8 @@ export function ClaimManagementWizard({ onBack, onSubmit }: ClaimManagementWizar
city: result['re city'] || result.city || '', city: result['re city'] || result.city || '',
state: result['re state code'] || result.state || '', state: result['re state code'] || result.state || '',
isLoggedIn: true, // We'll verify this in the next step isLoggedIn: true, // We'll verify this in the next step
parentCode: result.parentcode || null,
itemGroup: result['item group'] || null,
}; };
setDealerSearchResults([mappedDealer]); setDealerSearchResults([mappedDealer]);
} else { } else {
@ -589,11 +591,20 @@ export function ClaimManagementWizard({ onBack, onSubmit }: ClaimManagementWizar
<SelectTrigger className="mt-2 !h-12 data-[size=default]:!h-12" id="activityType"> <SelectTrigger className="mt-2 !h-12 data-[size=default]:!h-12" id="activityType">
<SelectValue placeholder={loadingActivityTypes ? "Loading activity types..." : "Select activity type"} /> <SelectValue placeholder={loadingActivityTypes ? "Loading activity types..." : "Select activity type"} />
</SelectTrigger> </SelectTrigger>
<SelectContent> <SelectContent className="max-h-80">
{activityTypes.length > 0 ? ( {activityTypes.length > 0 ? (
activityTypes.map((type) => ( activityTypes.map((type) => (
<SelectItem key={type.activityTypeId} value={type.title}> <SelectItem key={type.activityTypeId} value={type.title} className="focus:bg-blue-600 focus:text-white group">
<div className="flex flex-col py-0.5">
<span className="font-medium text-[13px] leading-[1.1] text-gray-900 group-focus:text-white">
{type.title} {type.title}
</span>
<div className="flex items-center gap-1 text-[9px] text-gray-500 group-focus:text-blue-100 uppercase font-bold tracking-wider leading-none mt-0.5">
{type.creditPostingOn && <span>{type.creditPostingOn}</span>}
{type.creditPostingOn && type.taxationType && <span className="opacity-40 select-none"></span>}
{type.taxationType && <span>{type.taxationType}</span>}
</div>
</div>
</SelectItem> </SelectItem>
)) ))
) : ( ) : (
@ -662,19 +673,22 @@ export function ClaimManagementWizard({ onBack, onSubmit }: ClaimManagementWizar
<div className="font-medium text-gray-900"> <div className="font-medium text-gray-900">
{dealer.dealerName || dealer.displayName} {dealer.dealerName || dealer.displayName}
</div> </div>
<div className="text-xs text-gray-600"> <div className="text-[10px] text-gray-600 mt-0.5 font-medium flex items-center gap-1.5">
<span className="font-mono">{dealer.dealerCode}</span> <span className="font-mono">{dealer.dealerCode}</span>
{dealer.email && ( {dealer.email && (
<> <>
<span className="mx-1"></span> <span className="opacity-40"></span>
<span>{dealer.email}</span> <span>{dealer.email}</span>
</> </>
)} )}
</div> </div>
{dealer.city && dealer.state && ( <div className="text-[10px] text-gray-500 mt-0.5">
<div className="text-xs text-gray-500">
{dealer.city}, {dealer.state} {dealer.city}, {dealer.state}
</div> </div>
{dealer.itemGroup && (
<div className="text-[9px] text-blue-600 font-bold uppercase tracking-wider mt-0.5">
{dealer.itemGroup}
</div>
)} )}
</div> </div>
<div className="ml-2 flex-shrink-0"> <div className="ml-2 flex-shrink-0">

View File

@ -47,6 +47,7 @@ interface CostBreakdownItem {
amount: number; amount: number;
gstAmt?: number; gstAmt?: number;
totalAmt?: number; totalAmt?: number;
hsnCode?: string;
} }
interface RoleBasedVisibility { interface RoleBasedVisibility {
@ -320,12 +321,32 @@ export function ProcessDetailsCard({
</div> </div>
<div className="space-y-1.5 pt-1"> <div className="space-y-1.5 pt-1">
{estimatedBudgetBreakdown.map((item, index) => ( {estimatedBudgetBreakdown.map((item, index) => (
<div key={index} className="flex justify-between items-center text-[10px] sm:text-xs"> <div key={index} className="space-y-0.5 pb-1.5 last:pb-0">
<div className="text-gray-700 truncate mr-2" title={item.description}>{item.description}</div> <div className="flex justify-between items-center text-[10px] sm:text-xs">
<span className="font-medium text-gray-900 whitespace-nowrap"> <div className="text-gray-700 truncate mr-2 font-medium" title={item.description}>
{item.description}
</div>
<span className="font-bold text-gray-900 whitespace-nowrap">
{formatCurrency(item.totalAmt ?? (item.amount + (item.gstAmt ?? 0)))} {formatCurrency(item.totalAmt ?? (item.amount + (item.gstAmt ?? 0)))}
</span> </span>
</div> </div>
{(item.gstAmt ?? 0) > 0 && (
<div className="flex justify-between items-center text-[9px] text-gray-500 pl-2 italic">
<div className="flex gap-2">
<span>Base: {formatCurrency(item.amount)}</span>
<span>GST: {formatCurrency(item.gstAmt)}</span>
</div>
{item.hsnCode && (
<span>HSN/SAC: {item.hsnCode}</span>
)}
</div>
)}
{!(item.gstAmt ?? 0) && item.hsnCode && (
<div className="text-[9px] text-gray-500 pl-2 italic">
HSN/SAC: {item.hsnCode}
</div>
)}
</div>
))} ))}
<div className="pt-2 border-t border-amber-200 flex justify-between items-center"> <div className="pt-2 border-t border-amber-200 flex justify-between items-center">
<span className="font-semibold text-gray-900 text-xs">Total</span> <span className="font-semibold text-gray-900 text-xs">Total</span>
@ -348,12 +369,32 @@ export function ProcessDetailsCard({
</div> </div>
<div className="space-y-1.5 pt-1"> <div className="space-y-1.5 pt-1">
{closedExpensesBreakdown.map((item, index) => ( {closedExpensesBreakdown.map((item, index) => (
<div key={index} className="flex justify-between items-center text-[10px] sm:text-xs"> <div key={index} className="space-y-0.5 pb-1.5 last:pb-0">
<div className="text-gray-700 truncate mr-2" title={item.description}>{item.description}</div> <div className="flex justify-between items-center text-[10px] sm:text-xs">
<span className="font-medium text-gray-900 whitespace-nowrap"> <div className="text-gray-700 truncate mr-2 font-medium" title={item.description}>
{item.description}
</div>
<span className="font-bold text-gray-900 whitespace-nowrap">
{formatCurrency(item.totalAmt ?? (item.amount + (item.gstAmt ?? 0)))} {formatCurrency(item.totalAmt ?? (item.amount + (item.gstAmt ?? 0)))}
</span> </span>
</div> </div>
{(item.gstAmt ?? 0) > 0 && (
<div className="flex justify-between items-center text-[9px] text-gray-500 pl-2 italic">
<div className="flex gap-2">
<span>Base: {formatCurrency(item.amount)}</span>
<span>GST: {formatCurrency(item.gstAmt)}</span>
</div>
{item.hsnCode && (
<span>HSN/SAC: {item.hsnCode}</span>
)}
</div>
)}
{!(item.gstAmt ?? 0) && item.hsnCode && (
<div className="text-[9px] text-gray-500 pl-2 italic">
HSN/SAC: {item.hsnCode}
</div>
)}
</div>
))} ))}
<div className="pt-2 border-t border-indigo-200 flex justify-between items-center"> <div className="pt-2 border-t border-indigo-200 flex justify-between items-center">
<span className="font-semibold text-gray-900 text-xs">Total</span> <span className="font-semibold text-gray-900 text-xs">Total</span>

View File

@ -27,6 +27,7 @@ export interface DealerInfo {
dealerPrincipalName?: string | null; dealerPrincipalName?: string | null;
dealerPrincipalEmailId?: string | null; dealerPrincipalEmailId?: string | null;
itemGroup?: string | null; itemGroup?: string | null;
parentCode?: string | null;
} }
/** /**

View File

@ -36,6 +36,7 @@ export interface ClaimManagementRequest {
sgstAmt?: number; sgstAmt?: number;
igstAmt?: number; igstAmt?: number;
totalAmt?: number; totalAmt?: number;
hsnCode?: string;
}>; }>;
description?: string; description?: string;
}; };
@ -61,6 +62,7 @@ export interface ClaimManagementRequest {
sgstAmt?: number; sgstAmt?: number;
igstAmt?: number; igstAmt?: number;
totalAmt?: number; totalAmt?: number;
hsnCode?: string;
}>; }>;
totalEstimatedBudget: number; totalEstimatedBudget: number;
timelineMode?: 'date' | 'days'; timelineMode?: 'date' | 'days';
@ -184,7 +186,8 @@ export function mapToClaimManagementRequest(
cgstAmt: exp.cgstAmt ?? exp.cgst_amt, cgstAmt: exp.cgstAmt ?? exp.cgst_amt,
sgstAmt: exp.sgstAmt ?? exp.sgst_amt, sgstAmt: exp.sgstAmt ?? exp.sgst_amt,
igstAmt: exp.igstAmt ?? exp.igst_amt, igstAmt: exp.igstAmt ?? exp.igst_amt,
totalAmt: exp.totalAmt ?? exp.total_amt totalAmt: exp.totalAmt ?? exp.total_amt,
hsnCode: exp.hsnCode || exp.hsn_code || exp.hsnCd || exp.hsn_cd || ''
})) }))
: (completionDetails?.closedExpenses || : (completionDetails?.closedExpenses ||
completionDetails?.closed_expenses || completionDetails?.closed_expenses ||
@ -260,7 +263,8 @@ export function mapToClaimManagementRequest(
cgstAmt: Number(item.cgstAmt ?? item.cgst_amt ?? 0), cgstAmt: Number(item.cgstAmt ?? item.cgst_amt ?? 0),
sgstAmt: Number(item.sgstAmt ?? item.sgst_amt ?? 0), sgstAmt: Number(item.sgstAmt ?? item.sgst_amt ?? 0),
igstAmt: Number(item.igstAmt ?? item.igst_amt ?? 0), igstAmt: Number(item.igstAmt ?? item.igst_amt ?? 0),
totalAmt: Number(item.totalAmt ?? item.total_amt ?? 0) totalAmt: Number(item.totalAmt ?? item.total_amt ?? 0),
hsnCode: item.hsnCode || item.hsn_code || ''
})) }))
: Array.isArray(proposalDetails.costBreakup || proposalDetails.cost_breakup) : Array.isArray(proposalDetails.costBreakup || proposalDetails.cost_breakup)
? (proposalDetails.costBreakup || proposalDetails.cost_breakup).map((item: any) => ({ ? (proposalDetails.costBreakup || proposalDetails.cost_breakup).map((item: any) => ({
@ -271,7 +275,8 @@ export function mapToClaimManagementRequest(
cgstAmt: item.cgstAmt ?? item.cgst_amt, cgstAmt: item.cgstAmt ?? item.cgst_amt,
sgstAmt: item.sgstAmt ?? item.sgst_amt, sgstAmt: item.sgstAmt ?? item.sgst_amt,
igstAmt: item.igstAmt ?? item.igst_amt, igstAmt: item.igstAmt ?? item.igst_amt,
totalAmt: item.totalAmt ?? item.total_amt totalAmt: item.totalAmt ?? item.total_amt,
hsnCode: item.hsnCode || item.hsn_code || ''
})) }))
: [], : [],
totalEstimatedBudget: proposalDetails.totalEstimatedBudget || proposalDetails.total_estimated_budget || 0, totalEstimatedBudget: proposalDetails.totalEstimatedBudget || proposalDetails.total_estimated_budget || 0,