stage transition issue resolved

This commit is contained in:
laxman h 2026-04-28 13:12:20 +05:30
parent b6938abc7c
commit ede68caefc
7 changed files with 2390 additions and 417 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -5,8 +5,8 @@
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Royal Enfield Onboarding</title>
<script type="module" crossorigin src="/assets/index-CAe70IkM.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-DkEVuJwH.css">
<script type="module" crossorigin src="/assets/index-C_7C7ZNJ.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-COwSK6pX.css">
</head>
<body>
<div id="root"></div>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,163 @@
# RE Dealer System - Test Coverage Tracker
This tracker is maintained separately from the test stories document.
Update module by module as execution progresses.
---
## Status Legend
- `Not Started` - Test story not executed yet
- `In Progress` - Execution started but not finalized
- `Executed` - Execution completed
- `Blocked` - Cannot execute due to dependency/environment issue
Result values:
- `Pass`
- `Fail`
- `NA` (Not applicable or not executed yet)
---
## Overall Coverage
| Metric | Count |
|---|---:|
| Total Test Stories | 61 |
| Executed | 0 |
| Passed | 0 |
| Failed | 0 |
| Blocked | 0 |
| Remaining | 61 |
---
## Module Summary
| Module | Total | Executed | Passed | Failed | Blocked | Remaining |
|---|---:|---:|---:|---:|---:|---:|
| Module 1 - Dealer Onboarding | 22 | 0 | 0 | 0 | 0 | 22 |
| Module 2 - Dealer Resignation | 9 | 0 | 0 | 0 | 0 | 9 |
| Module 3 - Dealer Termination | 12 | 0 | 0 | 0 | 0 | 12 |
| Module 4 - Constitutional Change | 3 | 0 | 0 | 0 | 0 | 3 |
| Module 5 - Dealer Relocation | 3 | 0 | 0 | 0 | 0 | 3 |
| Module 6 - Full and Final (F&F) Settlement | 6 | 0 | 0 | 0 | 0 | 6 |
| Module 7 - Finance Dashboard | 2 | 0 | 0 | 0 | 0 | 2 |
| Module 8 - Admin and System Configuration | 4 | 0 | 0 | 0 | 0 | 4 |
---
## Module 1 - Dealer Onboarding
| Test Story ID | Title | Execution Status | Result | Owner | Last Updated | Notes |
|---|---|---|---|---|---|---|
| 1.1.1 | Applicant Submits Application (Opportunity Location) | Not Started | NA | | | |
| 1.1.2 | Applicant Submits Application (Non-Opportunity Location) | Not Started | NA | | | |
| 1.1.3 | Application Submission Validation Failure | Not Started | NA | | | |
| 1.2.1 | Applicant Completes Questionnaire | Not Started | NA | | | |
| 1.3.1 | DD-Admin Shortlists Application | Not Started | NA | | | |
| 1.3.2 | DD-Admin Archives Application | Not Started | NA | | | |
| 1.4.1 | DD-Admin Schedules Interview (Level 1) | Not Started | NA | | | |
| 1.4.2 | DD-ZM + RBM Fill KT Matrix and Feedback (Level 1) | Not Started | NA | | | |
| 1.4.3 | Level 2 Evaluation (DD-Lead + ZBH) | Not Started | NA | | | |
| 1.4.4 | Level 3 Final Evaluation and AI Summary (NBH + DD-Head) | Not Started | NA | | | |
| 1.5.1 | FDD Partner Submits Due Diligence Report | Not Started | NA | | | |
| 1.5.2 | Finance Team Reviews FDD Report | Not Started | NA | | | |
| 1.6.1 | DD-Admin Triggers LOI Document Request | Not Started | NA | | | |
| 1.6.2 | Security Deposit Validation | Not Started | NA | | | |
| 1.6.3 | LOI Approval Chain (Finance -> DD-Head -> NBH) | Not Started | NA | | | |
| 1.6.4 | LOI Issuance to Applicant | Not Started | NA | | | |
| 1.7.1 | DD-Admin Triggers Dealer Code Creation | Not Started | NA | | | |
| 1.8.1 | Architectural Work Assignment and Completion | Not Started | NA | | | |
| 1.8.2 | Statutory Document Collection and Verification | Not Started | NA | | | |
| 1.9.1 | LOA Approval and Issuance | Not Started | NA | | | |
| 1.10.1 | EOR Completion by Functional Teams | Not Started | NA | | | |
| 1.11.1 | Dealership Inauguration and Closure | Not Started | NA | | | |
---
## Module 2 - Dealer Resignation
| Test Story ID | Title | Execution Status | Result | Owner | Last Updated | Notes |
|---|---|---|---|---|---|---|
| 2.1 | Dealer Initiates Resignation via Portal | Not Started | NA | | | |
| 2.2 | DD-ASM Reviews and Forwards Resignation | Not Started | NA | | | |
| 2.3 | RBM + DD-ZM Joint Evaluation | Not Started | NA | | | |
| 2.4 | ZBH Review | Not Started | NA | | | |
| 2.5 | DD-Lead Review and Presentation | Not Started | NA | | | |
| 2.6 | NBH Final Approval | Not Started | NA | | | |
| 2.7 | Legal Issues Resignation Acceptance Letter | Not Started | NA | | | |
| 2.8 | DD-Admin Closure and F&F Trigger | Not Started | NA | | | |
| 2.9 | Dealer Withdraws Resignation Request | Not Started | NA | | | |
---
## Module 3 - Dealer Termination
| Test Story ID | Title | Execution Status | Result | Owner | Last Updated | Notes |
|---|---|---|---|---|---|---|
| 3.1 | ASM Creates Termination Request | Not Started | NA | | | |
| 3.2 | RBM + DD-ZM Review | Not Started | NA | | | |
| 3.3 | ZBH Review | Not Started | NA | | | |
| 3.4 | DD-Lead Review and Legal Assignment | Not Started | NA | | | |
| 3.5 | Legal Verification | Not Started | NA | | | |
| 3.6 | DD-Head Review -> NBH Evaluation | Not Started | NA | | | |
| 3.7 | Show Cause Notice (SCN) Issuance | Not Started | NA | | | |
| 3.8 | Joint Review of Dealer Response -> NBH Final Decision | Not Started | NA | | | |
| 3.9 | CEO and CCO Final Authorization | Not Started | NA | | | |
| 3.10 | Legal Issues Termination Letter | Not Started | NA | | | |
| 3.11 | DD-Admin Communication and F&F Trigger | Not Started | NA | | | |
| 3.12 | Immediate Termination (Unethical Practice) | Not Started | NA | | | |
---
## Module 4 - Constitutional Change
| Test Story ID | Title | Execution Status | Result | Owner | Last Updated | Notes |
|---|---|---|---|---|---|---|
| 4.1 | Dealer Initiates Constitutional Change Request | Not Started | NA | | | |
| 4.2 | Multi-Level Review and Approval | Not Started | NA | | | |
| 4.3 | Legal Validation and Master Data Update | Not Started | NA | | | |
---
## Module 5 - Dealer Relocation
| Test Story ID | Title | Execution Status | Result | Owner | Last Updated | Notes |
|---|---|---|---|---|---|---|
| 5.1 | Dealer Initiates Relocation Request | Not Started | NA | | | |
| 5.2 | Multi-Level Review and Approval | Not Started | NA | | | |
| 5.3 | Final Approval and Master Data Update | Not Started | NA | | | |
---
## Module 6 - Full and Final (F&F) Settlement
| Test Story ID | Title | Execution Status | Result | Owner | Last Updated | Notes |
|---|---|---|---|---|---|---|
| 6.1 | F&F Case Initiation | Not Started | NA | | | |
| 6.2 | Department Clearance Submission (All 16 Departments) | Not Started | NA | | | |
| 6.3 | Finance Consolidates F&F Summary | Not Started | NA | | | |
| 6.4 | Dealer Discussion and Acknowledgment | Not Started | NA | | | |
| 6.5 | Final Finance Approval and Payment Processing | Not Started | NA | | | |
| 6.6 | F&F Closure | Not Started | NA | | | |
---
## Module 7 - Finance Dashboard
| Test Story ID | Title | Execution Status | Result | Owner | Last Updated | Notes |
|---|---|---|---|---|---|---|
| 7.1 | Security Deposit Verification (Onboarding) | Not Started | NA | | | |
| 7.2 | Finance Flags Payment Discrepancy | Not Started | NA | | | |
---
## Module 8 - Admin and System Configuration
| Test Story ID | Title | Execution Status | Result | Owner | Last Updated | Notes |
|---|---|---|---|---|---|---|
| 8.1.1 | Admin Configures SLA for a Workflow Activity | Not Started | NA | | | |
| 8.1.2 | SLA Breach and Escalation Flow | Not Started | NA | | | |
| 8.2.1 | Admin Creates Email Template | Not Started | NA | | | |
| 8.3.1 | Admin Creates New Opportunity Window | Not Started | NA | | | |

View File

@ -45,6 +45,24 @@ const configs = [
{ documentType: 'First Fill Receipt', stageCode: 'LOA Approval', allowedRoles: [ROLES.DEALER, ROLES.FINANCE, ROLES.DD_HEAD, ROLES.NBH, ROLES.SUPER_ADMIN], isMandatory: true },
{ documentType: 'LOI Acknowledgement Copy', stageCode: 'LOI Issue', allowedRoles: ALL_ROLES },
{ documentType: 'Nodal Agreement', stageCode: 'LOI Approval', allowedRoles: [ROLES.LEGAL_ADMIN, ROLES.DEALER, ROLES.SUPER_ADMIN] },
{ documentType: 'DIP Booklet', stageCode: 'LOI Issue', allowedRoles: ALL_ROLES, isMandatory: true, module: 'ONBOARDING' },
{ documentType: 'Profile Sheet', stageCode: 'LOI Issue', allowedRoles: ALL_ROLES, isMandatory: true, module: 'ONBOARDING' },
{ documentType: 'Dealership Application Form', stageCode: 'LOI Issue', allowedRoles: ALL_ROLES, isMandatory: true, module: 'ONBOARDING' },
{ documentType: 'Interview Feedback Forms', stageCode: 'LOI Issue', allowedRoles: ALL_ROLES, isMandatory: true, module: 'ONBOARDING' },
{ documentType: 'Land Selection Criteria Sheet', stageCode: 'LOI Issue', allowedRoles: ALL_ROLES, isMandatory: true, module: 'ONBOARDING' },
{ documentType: 'Logic Note and Comparative Logic Note', stageCode: 'LOI Issue', allowedRoles: ALL_ROLES, isMandatory: true, module: 'ONBOARDING' },
{ documentType: 'Zonal Evaluation Form', stageCode: 'LOI Issue', allowedRoles: ALL_ROLES, isMandatory: true, module: 'ONBOARDING' },
{ documentType: 'Authorization Letter', stageCode: 'LOI Issue', allowedRoles: ALL_ROLES, isMandatory: true, module: 'ONBOARDING' },
{ documentType: 'City Map (PPT)', stageCode: 'LOI Issue', allowedRoles: ALL_ROLES, isMandatory: true, module: 'ONBOARDING' },
{ documentType: 'Proposed Location Photos (minimum 20, PPT)', stageCode: 'LOI Issue', allowedRoles: ALL_ROLES, isMandatory: true, module: 'ONBOARDING' },
{ documentType: 'Layout Drawings (PPT)', stageCode: 'LOI Issue', allowedRoles: ALL_ROLES, isMandatory: true, module: 'ONBOARDING' },
{ documentType: 'Viability Sheet', stageCode: 'LOI Issue', allowedRoles: ALL_ROLES, isMandatory: true, module: 'ONBOARDING' },
{ documentType: 'Project Plan', stageCode: 'LOI Issue', allowedRoles: ALL_ROLES, isMandatory: true, module: 'ONBOARDING' },
{ documentType: 'Self-signed PAN/Aadhaar of all partners', stageCode: 'LOI Issue', allowedRoles: ALL_ROLES, isMandatory: true, module: 'ONBOARDING' },
{ documentType: 'CIBIL Reports of all partners', stageCode: 'LOI Issue', allowedRoles: ALL_ROLES, isMandatory: true, module: 'ONBOARDING' },
{ documentType: 'Dealership Name & Address Email from RBM', stageCode: 'LOI Issue', allowedRoles: ALL_ROLES, isMandatory: true, module: 'ONBOARDING' },
{ documentType: 'Rental / Lease Agreement or Consent Letter from Landlord', stageCode: 'LOI Issue', allowedRoles: ALL_ROLES, isMandatory: true, module: 'ONBOARDING' },
{ documentType: 'Security Deposit Proof', stageCode: 'LOI Issue', allowedRoles: ALL_ROLES, isMandatory: true, module: 'ONBOARDING' },
// Architecture Team Documents
{ documentType: 'Architecture Assignment Document', stageCode: 'Architecture Team Assigned', allowedRoles: [ROLES.ARCHITECTURE, ROLES.SUPER_ADMIN, ROLES.DD_ADMIN] },

View File

@ -264,312 +264,312 @@ async function triggerWorkflow() {
}, leadToken);
const interviewId2 = intv2Response.data.id;
// log(5.1, 'DD-Lead Giving Feedback...');
// await apiRequest('/assessment/level2-feedback', 'POST', {
// interviewId: interviewId2,
// overallScore: 9.5,
// feedbackItems: [
// { type: 'Strategic Vision', comments: 'Excellent strategic planning.' },
// { type: 'Management Capabilities', comments: 'Strong team leadership.' },
// { type: 'Operational Understanding', comments: 'Knows the local market well.' }
// ],
// recommendation: 'Selected'
// }, leadToken);
log(5.1, 'DD-Lead Giving Feedback...');
await apiRequest('/assessment/level2-feedback', 'POST', {
interviewId: interviewId2,
overallScore: 9.5,
feedbackItems: [
{ type: 'Strategic Vision', comments: 'Excellent strategic planning.' },
{ type: 'Management Capabilities', comments: 'Strong team leadership.' },
{ type: 'Operational Understanding', comments: 'Knows the local market well.' }
],
recommendation: 'Selected'
}, leadToken);
// log(5.15, 'ZBH Giving Feedback...');
// const zbhToken = await login(zbhUser.email);
// await apiRequest('/assessment/level2-feedback', 'POST', {
// interviewId: interviewId2,
// overallScore: 9.0,
// feedbackItems: [
// { type: 'Strategic Vision', comments: 'Good alignment with brand.' },
// { type: 'Key Strengths', comments: 'Great location proposed.' },
// { type: 'Areas of Concern', comments: 'None at this time.' }
// ],
// recommendation: 'Selected'
// }, zbhToken);
log(5.15, 'ZBH Giving Feedback...');
const zbhToken = await login(zbhUser.email);
await apiRequest('/assessment/level2-feedback', 'POST', {
interviewId: interviewId2,
overallScore: 9.0,
feedbackItems: [
{ type: 'Strategic Vision', comments: 'Good alignment with brand.' },
{ type: 'Key Strengths', comments: 'Great location proposed.' },
{ type: 'Areas of Concern', comments: 'None at this time.' }
],
recommendation: 'Selected'
}, zbhToken);
// log(5.2, 'DD-Lead Finalizing Level 2 Decision...');
// await apiRequest('/assessment/decision', 'POST', {
// interviewId: interviewId2,
// decision: 'Approved',
// remarks: 'Cleared Level 2'
// }, leadToken);
// log(5, 'Level 2 Complete.');
// await delay();
log(5.2, 'DD-Lead Finalizing Level 2 Decision...');
await apiRequest('/assessment/decision', 'POST', {
interviewId: interviewId2,
decision: 'Approved',
remarks: 'Cleared Level 2'
}, leadToken);
log(5, 'Level 2 Complete.');
await delay();
// // 6. LEVEL-3 INTERVIEW
// log(6, 'Scheduling Level 3 Interview...');
// const headUser = users.data.find(u => u.email === EMAILS.DD_HEAD);
// const nbhUser = users.data.find(u => u.email === EMAILS.NBH);
// 6. LEVEL-3 INTERVIEW
log(6, 'Scheduling Level 3 Interview...');
const headUser = users.data.find(u => u.email === EMAILS.DD_HEAD);
const nbhUser = users.data.find(u => u.email === EMAILS.NBH);
// const intv3Response = await apiRequest('/assessment/interviews', 'POST', {
// applicationId: applicationUUID,
// level: 3,
// scheduledAt: new Date(Date.now() + 259200000).toISOString(),
// type: 'In-Person',
// location: 'HO',
// participants: [headUser.id, nbhUser.id]
// }, leadToken);
// const interviewId3 = intv3Response.data.id;
const intv3Response = await apiRequest('/assessment/interviews', 'POST', {
applicationId: applicationUUID,
level: 3,
scheduledAt: new Date(Date.now() + 259200000).toISOString(),
type: 'In-Person',
location: 'HO',
participants: [headUser.id, nbhUser.id]
}, leadToken);
const interviewId3 = intv3Response.data.id;
// log(6.1, 'NBH Giving Feedback...');
// const nbhToken = await login(EMAILS.NBH);
// await apiRequest('/assessment/level2-feedback', 'POST', {
// interviewId: interviewId3,
// overallScore: 10,
// feedbackItems: [
// { type: 'Business Vision & Strategy', comments: 'Highly recommended for this market.' },
// { type: 'Leadership & Decision Making', comments: 'Shows great potential.' }
// ],
// recommendation: 'Selected'
// }, nbhToken);
log(6.1, 'NBH Giving Feedback...');
const nbhToken = await login(EMAILS.NBH);
await apiRequest('/assessment/level2-feedback', 'POST', {
interviewId: interviewId3,
overallScore: 10,
feedbackItems: [
{ type: 'Business Vision & Strategy', comments: 'Highly recommended for this market.' },
{ type: 'Leadership & Decision Making', comments: 'Shows great potential.' }
],
recommendation: 'Selected'
}, nbhToken);
// log(6.15, 'DD-Head Giving Feedback...');
// const headToken = await login(EMAILS.DD_HEAD);
// await apiRequest('/assessment/level2-feedback', 'POST', {
// interviewId: interviewId3,
// overallScore: 9.5,
// feedbackItems: [
// { type: 'Operational & Financial Readiness', comments: 'Financially sound.' },
// { type: 'Brand Alignment', comments: 'Understands Royal Enfield ethos perfectly.' }
// ],
// recommendation: 'Selected'
// }, headToken);
log(6.15, 'DD-Head Giving Feedback...');
const headToken = await login(EMAILS.DD_HEAD);
await apiRequest('/assessment/level2-feedback', 'POST', {
interviewId: interviewId3,
overallScore: 9.5,
feedbackItems: [
{ type: 'Operational & Financial Readiness', comments: 'Financially sound.' },
{ type: 'Brand Alignment', comments: 'Understands Royal Enfield ethos perfectly.' }
],
recommendation: 'Selected'
}, headToken);
// log(6.2, 'Head Finalizing Level 3 Decision...');
// await apiRequest('/assessment/decision', 'POST', {
// interviewId: interviewId3,
// decision: 'Approved',
// remarks: 'Cleared Level 3. Moving to FDD.'
// }, headToken);
// log(6, 'Level 3 Complete. Stage is now FDD Verification.');
// await delay();
log(6.2, 'Head Finalizing Level 3 Decision...');
await apiRequest('/assessment/decision', 'POST', {
interviewId: interviewId3,
decision: 'Approved',
remarks: 'Cleared Level 3. Moving to FDD.'
}, headToken);
log(6, 'Level 3 Complete. Stage is now FDD Verification.');
await delay();
// // 6.3 FDD ASSIGNMENT
// log(6.3, 'Admin Assigning Application to FDD Agency...');
// const fddUser = users.data.find(u => u.email === EMAILS.FDD);
// await apiRequest('/fdd/assign', 'POST', {
// applicationId: applicationUUID,
// assignedToAgency: fddUser.id
// }, adminToken);
// log(6.3, 'FDD Agency assigned successfully.');
// await delay();
// 6.3 FDD ASSIGNMENT
log(6.3, 'Admin Assigning Application to FDD Agency...');
const fddUser = users.data.find(u => u.email === EMAILS.FDD);
await apiRequest('/fdd/assign', 'POST', {
applicationId: applicationUUID,
assignedToAgency: fddUser.id
}, adminToken);
log(6.3, 'FDD Agency assigned successfully.');
await delay();
// // 7. FDD MILESTONE
// log(7, 'FDD Agency Discovery & Report Upload...');
// const fddToken = await login(EMAILS.FDD);
// 7. FDD MILESTONE
log(7, 'FDD Agency Discovery & Report Upload...');
const fddToken = await login(EMAILS.FDD);
// // FETCH ASSIGNMENT ID
// const assignmentRes = await apiRequest(`/fdd/${applicationUUID}`, 'GET', null, fddToken);
// const assignmentId = assignmentRes.data.id;
// log(7, `Found Assignment ID: ${assignmentId}`);
// FETCH ASSIGNMENT ID
const assignmentRes = await apiRequest(`/fdd/${applicationUUID}`, 'GET', null, fddToken);
const assignmentId = assignmentRes.data.id;
log(7, `Found Assignment ID: ${assignmentId}`);
// await apiRequest('/fdd/report', 'POST', {
// assignmentId,
// findings: 'Finance records clean.',
// recommendation: 'Approved'
// }, fddToken);
await apiRequest('/fdd/report', 'POST', {
assignmentId,
findings: 'Finance records clean.',
recommendation: 'Approved'
}, fddToken);
// log(7.1, 'Admin Approving FDD Final Stage...');
// await apiRequest('/assessment/stage-decision', 'POST', {
// applicationId: applicationUUID,
// stageCode: 'FDD_VERIFICATION',
// decision: 'Approved',
// remarks: 'FDD documents verified.'
// }, adminToken);
// log(7, 'FDD Milestone Complete.');
// await delay();
log(7.1, 'Admin Approving FDD Final Stage...');
await apiRequest('/assessment/stage-decision', 'POST', {
applicationId: applicationUUID,
stageCode: 'FDD_VERIFICATION',
decision: 'Approved',
remarks: 'FDD documents verified.'
}, adminToken);
log(7, 'FDD Milestone Complete.');
await delay();
// log(7.4, 'Uploading mandatory documents prior to LOI generation...');
// const requiredDocs = ['CIBIL Report', 'Proposed Site City Map', 'Bank Statement', 'GST Certificate', 'PAN Card'];
// for (const doc of requiredDocs) {
// await mockUploadDocument(applicationUUID, adminToken, doc);
// }
// await delay(1000);
log(7.4, 'Uploading mandatory documents prior to LOI generation...');
const requiredDocs = ['CIBIL Report', 'Proposed Site City Map', 'Bank Statement', 'GST Certificate', 'PAN Card'];
for (const doc of requiredDocs) {
await mockUploadDocument(applicationUUID, adminToken, doc);
}
await delay(1000);
// // 7.5 LOI APPROVAL
// log(7.5, 'LOI Generation & Approval...');
// const loiRes = await apiRequest('/loi/request', 'POST', { applicationId: applicationUUID }, adminToken);
// const loiRequestId = loiRes.data.id;
// 7.5 LOI APPROVAL
log(7.5, 'LOI Generation & Approval...');
const loiRes = await apiRequest('/loi/request', 'POST', { applicationId: applicationUUID }, adminToken);
const loiRequestId = loiRes.data.id;
// // Head Approval
// await apiRequest(`/loi/request/${loiRequestId}/approve`, 'POST', {
// action: 'Approved',
// remarks: 'Head Authorization for LOI'
// }, headToken);
// Head Approval
await apiRequest(`/loi/request/${loiRequestId}/approve`, 'POST', {
action: 'Approved',
remarks: 'Head Authorization for LOI'
}, headToken);
// // NBH Approval
// await apiRequest(`/loi/request/${loiRequestId}/approve`, 'POST', {
// action: 'Approved',
// remarks: 'NBH Authorization for LOI'
// }, nbhToken);
// NBH Approval
await apiRequest(`/loi/request/${loiRequestId}/approve`, 'POST', {
action: 'Approved',
remarks: 'NBH Authorization for LOI'
}, nbhToken);
// log(7.5, 'LOI Milestone Complete.');
// await delay();
log(7.5, 'LOI Milestone Complete.');
await delay();
// // 8. PAYMENT GATE (SECURITY DEPOSIT FIRST AS PER CURRENT FLOW)
// log(8, 'Finance Verifying SECURITY_DEPOSIT to unlock LOI Issued...');
// const financeToken = await login(EMAILS.FINANCE);
// await apiRequest('/loa/security-deposit', 'POST', {
// applicationId: applicationUUID,
// amount: 500000,
// paymentReference: 'PAY-888999',
// depositType: 'SECURITY_DEPOSIT',
// status: 'Verified'
// }, financeToken);
// log(8, 'Security Deposit Verified.')
// // 9. GENERATE DEALER CODES (align with backend gate: LOI Issued required)
// let statusBeforeCodeGen = await getApplicationStatus(applicationUUID, adminToken);
// log(9, `Current status before code generation: ${statusBeforeCodeGen}`);
// log(9, 'Ensuring mandatory PAN/GST/Bank fields before code generation...');
// await ensureMandatoryCodeGenFields(applicationUUID, adminToken);
// await delay(300);
// 8. PAYMENT GATE (SECURITY DEPOSIT FIRST AS PER CURRENT FLOW)
log(8, 'Finance Verifying SECURITY_DEPOSIT to unlock LOI Issued...');
const financeToken = await login(EMAILS.FINANCE);
await apiRequest('/loa/security-deposit', 'POST', {
applicationId: applicationUUID,
amount: 500000,
paymentReference: 'PAY-888999',
depositType: 'SECURITY_DEPOSIT',
status: 'Verified'
}, financeToken);
log(8, 'Security Deposit Verified.')
// 9. GENERATE DEALER CODES (align with backend gate: LOI Issued required)
let statusBeforeCodeGen = await getApplicationStatus(applicationUUID, adminToken);
log(9, `Current status before code generation: ${statusBeforeCodeGen}`);
log(9, 'Ensuring mandatory PAN/GST/Bank fields before code generation...');
await ensureMandatoryCodeGenFields(applicationUUID, adminToken);
await delay(300);
// if (statusBeforeCodeGen === 'Security Details') {
// log(9, 'Status is Security Details; re-verifying Security Deposit to move to LOI Issued...');
// await apiRequest('/loa/security-deposit', 'POST', {
// applicationId: applicationUUID,
// amount: 500000,
// paymentReference: `PAY-RETRY-${Date.now()}`,
// depositType: 'SECURITY_DEPOSIT',
// status: 'Verified'
// }, financeToken);
// await delay();
// statusBeforeCodeGen = await getApplicationStatus(applicationUUID, adminToken);
// log(9, `Status after re-verify: ${statusBeforeCodeGen}`);
// }
if (statusBeforeCodeGen === 'Security Details') {
log(9, 'Status is Security Details; re-verifying Security Deposit to move to LOI Issued...');
await apiRequest('/loa/security-deposit', 'POST', {
applicationId: applicationUUID,
amount: 500000,
paymentReference: `PAY-RETRY-${Date.now()}`,
depositType: 'SECURITY_DEPOSIT',
status: 'Verified'
}, financeToken);
await delay();
statusBeforeCodeGen = await getApplicationStatus(applicationUUID, adminToken);
log(9, `Status after re-verify: ${statusBeforeCodeGen}`);
}
// // Current backend flow keeps app at "Security Details" until explicit admin transition.
// if (statusBeforeCodeGen === 'Security Details') {
// log(9, 'Applying admin transition from Security Details -> LOI Issued...');
// await apiRequest(`/onboarding/applications/${applicationUUID}/status`, 'PUT', {
// status: 'LOI Issued',
// stage: 'LOI',
// reason: 'E2E script alignment: unlock dealer code generation after Security Details checks.'
// }, adminToken);
// await delay();
// statusBeforeCodeGen = await getApplicationStatus(applicationUUID, adminToken);
// log(9, `Status after admin transition: ${statusBeforeCodeGen}`);
// }
// Current backend flow keeps app at "Security Details" until explicit admin transition.
if (statusBeforeCodeGen === 'Security Details') {
log(9, 'Applying admin transition from Security Details -> LOI Issued...');
await apiRequest(`/onboarding/applications/${applicationUUID}/status`, 'PUT', {
status: 'LOI Issued',
stage: 'LOI',
reason: 'E2E script alignment: unlock dealer code generation after Security Details checks.'
}, adminToken);
await delay();
statusBeforeCodeGen = await getApplicationStatus(applicationUUID, adminToken);
log(9, `Status after admin transition: ${statusBeforeCodeGen}`);
}
// if (statusBeforeCodeGen !== 'LOI Issued' && statusBeforeCodeGen !== 'Dealer Code Generation') {
// throw new Error(`Cannot generate codes: expected LOI Issued/Dealer Code Generation, got ${statusBeforeCodeGen}`);
// }
if (statusBeforeCodeGen !== 'LOI Issued' && statusBeforeCodeGen !== 'Dealer Code Generation') {
throw new Error(`Cannot generate codes: expected LOI Issued/Dealer Code Generation, got ${statusBeforeCodeGen}`);
}
// log(9, 'Admin Generating SAP Dealer Codes...');
// await apiRequest(`/onboarding/applications/${applicationUUID}/generate-codes`, 'POST', {}, adminToken);
// log(9, 'Dealer Codes Generated.');
// await delay();
log(9, 'Admin Generating SAP Dealer Codes...');
await apiRequest(`/onboarding/applications/${applicationUUID}/generate-codes`, 'POST', {}, adminToken);
log(9, 'Dealer Codes Generated.');
await delay();
// // 10. FIRST FILL (POST CODE-GENERATION)
// log(10, 'Finance Verifying FIRST FILL (₹15L)...');
// await apiRequest('/loa/security-deposit', 'POST', {
// applicationId: applicationUUID,
// amount: 1500000,
// paymentReference: 'PAY-FIN-999',
// depositType: 'FIRST_FILL',
// status: 'Verified'
// }, financeToken);
// log(10, 'Final Security Deposit Verified.');
// await delay();
// 10. FIRST FILL (POST CODE-GENERATION)
log(10, 'Finance Verifying FIRST FILL (₹15L)...');
await apiRequest('/loa/security-deposit', 'POST', {
applicationId: applicationUUID,
amount: 1500000,
paymentReference: 'PAY-FIN-999',
depositType: 'FIRST_FILL',
status: 'Verified'
}, financeToken);
log(10, 'Final Security Deposit Verified.');
await delay();
// // 11. ADMIN UPDATING STATUTORY & BANK DETAILS
// log(11, 'Admin Updating Statutory & Bank Details for LOA Approval Gate...');
// await apiRequest(`/onboarding/applications/${applicationUUID}`, 'PUT', {
// accountHolderName: 'Ramesh Automobiles Private Limited',
// panNumber: 'ABCDE1234F',
// gstNumber: '07ABCDE1234F1Z5',
// bankName: 'HDFC Bank',
// accountNumber: '50100223344556',
// ifscCode: 'HDFC0001234'
// }, adminToken);
// log(11, 'Statutory & Bank details updated.');
// await delay();
// 11. ADMIN UPDATING STATUTORY & BANK DETAILS
log(11, 'Admin Updating Statutory & Bank Details for LOA Approval Gate...');
await apiRequest(`/onboarding/applications/${applicationUUID}`, 'PUT', {
accountHolderName: 'Ramesh Automobiles Private Limited',
panNumber: 'ABCDE1234F',
gstNumber: '07ABCDE1234F1Z5',
bankName: 'HDFC Bank',
accountNumber: '50100223344556',
ifscCode: 'HDFC0001234'
}, adminToken);
log(11, 'Statutory & Bank details updated.');
await delay();
// // 12. FINAL LOA APPROVAL
// log(12, 'NBH & Head Approving Final LOA...');
// const loaRes = await apiRequest('/loa/request', 'POST', { applicationId: applicationUUID }, headToken);
// const finalLoaRequestId = loaRes.data.id;
// 12. FINAL LOA APPROVAL
log(12, 'NBH & Head Approving Final LOA...');
const loaRes = await apiRequest('/loa/request', 'POST', { applicationId: applicationUUID }, headToken);
const finalLoaRequestId = loaRes.data.id;
// await apiRequest(`/loa/request/${finalLoaRequestId}/approve`, 'POST', {
// action: 'Approved',
// remarks: 'Head Authorization (Level 1)'
// }, headToken);
await apiRequest(`/loa/request/${finalLoaRequestId}/approve`, 'POST', {
action: 'Approved',
remarks: 'Head Authorization (Level 1)'
}, headToken);
// await apiRequest(`/loa/request/${finalLoaRequestId}/approve`, 'POST', {
// action: 'Approved',
// remarks: 'NBH Approval (Level 2)'
// }, nbhToken);
// log(12, 'LOA Fully Approved.');
// await delay();
await apiRequest(`/loa/request/${finalLoaRequestId}/approve`, 'POST', {
action: 'Approved',
remarks: 'NBH Approval (Level 2)'
}, nbhToken);
log(12, 'LOA Fully Approved.');
await delay();
// // 13. EOR (EVIDENCE OF READINESS) CHECKLIST VERIFICATION
// log(13, 'Admin Initializing EOR Checklist (100% Readiness Requirement)...');
// const eorInit = await apiRequest('/eor', 'POST', { applicationId: applicationUUID }, adminToken);
// const checklistId = eorInit.data.id;
// log(13, `EOR Checklist Created (ID: ${checklistId})`);
// 13. EOR (EVIDENCE OF READINESS) CHECKLIST VERIFICATION
log(13, 'Admin Initializing EOR Checklist (100% Readiness Requirement)...');
const eorInit = await apiRequest('/eor', 'POST', { applicationId: applicationUUID }, adminToken);
const checklistId = eorInit.data.id;
log(13, `EOR Checklist Created (ID: ${checklistId})`);
// log(13.1, 'Auditor Verifying all 12 mandatory EOR items as COMPLIANT...');
// const eorItems = [
// { itemType: 'Sales', description: 'Sales Standards' },
// { itemType: 'Service', description: 'Service & Spares' },
// { itemType: 'IT', description: 'DMS infra' },
// { itemType: 'Training', description: 'Manpower Training' },
// { itemType: 'Statutory', description: 'Trade certificate with test ride bikes registration' },
// { itemType: 'Statutory', description: 'GST certificate including Accessories & Apparels billing' },
// { itemType: 'Finance', description: 'Inventory Funding' },
// { itemType: 'IT', description: 'Virtual code availability' },
// { itemType: 'Finance', description: 'Vendor payments' },
// { itemType: 'Marketing', description: 'Details for website submission' },
// { itemType: 'Insurance', description: 'Infra Insurance both Showroom and Service center' },
// { itemType: 'IT', description: 'Auto ordering' }
// ];
log(13.1, 'Auditor Verifying all 12 mandatory EOR items as COMPLIANT...');
const eorItems = [
{ itemType: 'Sales', description: 'Sales Standards' },
{ itemType: 'Service', description: 'Service & Spares' },
{ itemType: 'IT', description: 'DMS infra' },
{ itemType: 'Training', description: 'Manpower Training' },
{ itemType: 'Statutory', description: 'Trade certificate with test ride bikes registration' },
{ itemType: 'Statutory', description: 'GST certificate including Accessories & Apparels billing' },
{ itemType: 'Finance', description: 'Inventory Funding' },
{ itemType: 'IT', description: 'Virtual code availability' },
{ itemType: 'Finance', description: 'Vendor payments' },
{ itemType: 'Marketing', description: 'Details for website submission' },
{ itemType: 'Insurance', description: 'Infra Insurance both Showroom and Service center' },
{ itemType: 'IT', description: 'Auto ordering' }
];
// for (const item of eorItems) {
// process.stdout.write(`.`); // Visual progress
// await apiRequest(`/eor/item/${checklistId}`, 'POST', {
// ...item,
// isCompliant: true,
// remarks: 'Verified by Auditor - Compliant'
// }, adminToken);
// }
// console.log('\n[STEP 13.1] All EOR items marked as compliant.');
for (const item of eorItems) {
process.stdout.write(`.`); // Visual progress
await apiRequest(`/eor/item/${checklistId}`, 'POST', {
...item,
isCompliant: true,
remarks: 'Verified by Auditor - Compliant'
}, adminToken);
}
console.log('\n[STEP 13.1] All EOR items marked as compliant.');
// log(13.2, 'Auditor Submitting Final EOR Audit...');
// await apiRequest(`/eor/audit/${checklistId}`, 'POST', {
// status: 'Completed',
// overallComments: 'Dealer is 100% ready for inauguration. All infra and statutory items verified.'
// }, adminToken);
log(13.2, 'Auditor Submitting Final EOR Audit...');
await apiRequest(`/eor/audit/${checklistId}`, 'POST', {
status: 'Completed',
overallComments: 'Dealer is 100% ready for inauguration. All infra and statutory items verified.'
}, adminToken);
// // Status check
// const finalAppStatus = await apiRequest(`/onboarding/applications/${applicationUUID}`, 'GET', null, adminToken);
// log(13.2, `Application Status after EOR: ${finalAppStatus.data.overallStatus}`);
// await delay();
// Status check
const finalAppStatus = await apiRequest(`/onboarding/applications/${applicationUUID}`, 'GET', null, adminToken);
log(13.2, `Application Status after EOR: ${finalAppStatus.data.overallStatus}`);
await delay();
// // 14. FINAL ONBOARDING
// log(14, 'Admin Finalizing Dealer Onboarding...');
// await apiRequest('/dealers', 'POST', { applicationId: applicationUUID }, adminToken);
// await delay();
// 14. FINAL ONBOARDING
log(14, 'Admin Finalizing Dealer Onboarding...');
await apiRequest('/dealers', 'POST', { applicationId: applicationUUID }, adminToken);
await delay();
// // 15. VERIFICATION
// log(15, 'Verifying Dealer Record Creation...');
// const dealerRes = await apiRequest(`/dealers/application/${applicationUUID}`, 'GET', null, adminToken);
// if (!dealerRes.success || !dealerRes.data) {
// throw new Error('Verification Failed: Dealer record not found after onboarding.');
// }
// log(15, `Dealer Found: ${dealerRes.data.legalName} (${dealerRes.data.id})`);
// 15. VERIFICATION
log(15, 'Verifying Dealer Record Creation...');
const dealerRes = await apiRequest(`/dealers/application/${applicationUUID}`, 'GET', null, adminToken);
if (!dealerRes.success || !dealerRes.data) {
throw new Error('Verification Failed: Dealer record not found after onboarding.');
}
log(15, `Dealer Found: ${dealerRes.data.legalName} (${dealerRes.data.id})`);
// log(15.1, 'Verifying User Account Role Update...');
// const userRes = await apiRequest(`/admin/users`, 'GET', null, adminToken);
// const dealerUser = userRes.data.find(u => u.email === PROSPECT_EMAIL);
// if (!dealerUser || dealerUser.roleCode !== 'Dealer') {
// throw new Error(`Verification Failed: User role not updated to 'Dealer'. Current role: ${dealerUser?.roleCode}`);
// }
// log(15.1, `User role confirmed: ${dealerUser.roleCode}`);
log(15.1, 'Verifying User Account Role Update...');
const userRes = await apiRequest(`/admin/users`, 'GET', null, adminToken);
const dealerUser = userRes.data.find(u => u.email === PROSPECT_EMAIL);
if (!dealerUser || dealerUser.roleCode !== 'Dealer') {
throw new Error(`Verification Failed: User role not updated to 'Dealer'. Current role: ${dealerUser?.roleCode}`);
}
log(15.1, `User role confirmed: ${dealerUser.roleCode}`);
// log(15.2, '--- WORKFLOW COMPLETED SUCCESSFULLY! ---');
// log(15.2, `The application ${applicationId} is now at 'ONBOARDED' status and Dealer profile is active.`);
log(15.2, '--- WORKFLOW COMPLETED SUCCESSFULLY! ---');
log(15.2, `The application ${applicationId} is now at 'ONBOARDED' status and Dealer profile is active.`);
}
/**