Dealer_Onboarding_Backend/simulate-clearances.js

103 lines
4.7 KiB
JavaScript

const BASE_URL = 'http://localhost:5000/api';
const FINANCE_EMAIL = 'finance@royalenfield.com';
const PASSWORD = 'Admin@123';
async function simulateFullClearance() {
try {
console.log('--- STARTING COMPREHENSIVE F&F SIMULATION (16 DEPARTMENTS) ---');
// 1. Login
const loginRes = await fetch(`${BASE_URL}/auth/login`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ email: FINANCE_EMAIL, password: PASSWORD })
});
const loginData = await loginRes.json();
const token = loginData.token;
const headers = { 'Content-Type': 'application/json', 'Authorization': `Bearer ${token}` };
// 2. Resolve target F&F
const res = await fetch(`${BASE_URL}/settlement/fnf`, { headers });
const data = await res.json();
const latestFnF = data.settlements[0];
if (!latestFnF) {
console.error('No F&F record found.');
return;
}
const fnfId = latestFnF.id;
console.log(`Targeting F&F: ${fnfId} for ${latestFnF.outlet?.name}`);
// 3. Define departmental scenarios
const scenarios = [
{ dept: 'Sales', type: 'Receivable', amount: 45000, desc: 'Pending vehicle stock dues' },
{ dept: 'Service', type: 'Payable', amount: 12000, desc: 'Unprocessed warranty claims' },
{ dept: 'Spares / Parts', type: 'Receivable', amount: 8500, desc: 'Missing spare parts inventory' },
{ dept: 'Warranty', type: 'Payable', amount: 3400, desc: 'Settled warranty credit' },
{ dept: 'Accounts', type: 'Receivable', amount: 1500, desc: 'Audit penalty' },
{ dept: 'Marketing', type: 'Payable', amount: 20000, desc: 'Signage reimbursement' }
];
// 4. Add Line Items
console.log('\nAdding financial line items...');
for (const item of scenarios) {
await fetch(`${BASE_URL}/settlement/fnf/${fnfId}/line-items`, {
method: 'POST',
headers,
body: JSON.stringify({
itemType: item.type,
description: item.desc,
department: item.dept,
amount: item.amount
})
});
console.log(`[+] Added ${item.type} for ${item.dept}: ₹${item.amount}`);
}
// 5. Submit Clearances for ALL 16 Departments
console.log('\nSubmitting clearances for all 16 departments...');
const allDepts = latestFnF.clearances;
for (const clearance of allDepts) {
const hasDues = scenarios.some(s => s.dept === clearance.department);
await fetch(`${BASE_URL}/settlement/fnf/${fnfId}/clearances/${clearance.id}`, {
method: 'PUT',
headers,
body: JSON.stringify({
status: 'Cleared', // Backend will auto-convert to 'NOC Submitted' or 'Dues Pending'
remarks: hasDues
? `Clearance submitted with outstanding dues as listed in calculations.`
: `No dues found. Department NOC issued successfully.`,
supportingDocument: `https://re-dealer-onboard.s3.amazonaws.com/noc/${clearance.department.replace(/\s/g, '_')}_NOC.pdf`
})
});
console.log(`[OK] Cleared ${clearance.department} (${hasDues ? 'With Dues' : 'Full NOC'})`);
}
// 6. Verify Final State
const finalRes = await fetch(`${BASE_URL}/settlement/fnf/${fnfId}`, { headers });
const finalData = await finalRes.json();
const f = finalData.fnf;
console.log('\n--- FINAL VERIFICATION ---');
console.log(`Case Number: ${f.resignation?.resignationId || f.id}`);
console.log(`Overall Status: ${f.status}`);
console.log(`Overall Progress: ${f.progressPercentage}%`);
console.log(`Net Settlement Amount: ₹${f.netAmount}`);
console.log(`Departments with Dues: ${f.clearances.filter(c => c.status === 'Dues Pending').length}`);
console.log(`Departments with NOC: ${f.clearances.filter(c => c.status === 'NOC Submitted').length}`);
console.log('\nUI CHECKLIST:');
console.log('1. Verify Step 2 of progress bar is Green (Completed).');
console.log('2. Verify Step 3 (Finance Summary) is Blue (In Progress).');
console.log('3. Verify Status Badges in table: 6 Red (Dues Pending), 10 Green (NOC Submitted).');
console.log('4. Verify Net Amount matches the sum of added items.');
} catch (error) {
console.error('Simulation Failed:', error);
}
}
simulateFullClearance();