Dealer_Onboarding_Backend/verify_approval_sync.ts
2026-03-23 20:12:10 +05:30

113 lines
4.4 KiB
TypeScript

import 'dotenv/config';
import db from './src/database/models/index';
const { Application, Interview, InterviewParticipant, InterviewEvaluation } = db;
import { Op } from 'sequelize';
async function testApprovalSync() {
console.log('--- Testing Synchronized Approval Logic (Direct DB Simulation) ---');
try {
// Setup IDs for test (must exist in DB)
const user1Id = 'fb9ba702-233b-4b3f-ba21-33bedec6209a'; // DD-ZM
const user2Id = 'c3602348-c9bd-4938-83b2-acc3c62791aa'; // RBM
// 1. Setup a test application
console.log('\n1. Creating test application...');
const app = await Application.create({
applicationId: 'APP-' + Date.now(),
registrationNumber: 'TEST-' + Date.now(),
fullName: 'Test Applicant',
applicantName: 'Test Applicant',
email: 'test' + Date.now() + '@example.com',
phone: '1234567890',
businessType: 'Dealership',
overallStatus: 'Level 1 Interview Pending',
currentStage: 'Level 1 Approved', // Mocking stage
zoneId: 'aedf5f64-3f95-4fa7-ac64-52c97cb330e7',
regionId: 'a5ea0aa2-c26c-49a9-95fe-0dbd7283c125'
});
// 2. Create an interview with 2 participants
console.log('2. Creating interview for Level 1...');
const interview = await Interview.create({
applicationId: app.id,
level: 1,
status: 'Scheduled',
interviewType: 'Level 1 Interview'
});
const participant1 = await InterviewParticipant.create({
interviewId: interview.id,
userId: user1Id,
roleInPanel: 'Interviewer'
});
const participant2 = await InterviewParticipant.create({
interviewId: interview.id,
userId: user2Id,
roleInPanel: 'Interviewer'
});
console.log(`Interview created with ID: ${interview.id}`);
// Decision logic
async function submitDecision(userId: string, decision: string) {
console.log(`\nSubmitting ${decision} for User: ${userId}...`);
await InterviewEvaluation.create({
interviewId: interview.id,
evaluatorId: userId,
recommendation: decision,
decision: decision,
remarks: 'Testing'
});
// Replicate the sync check from controller
const participants = await InterviewParticipant.findAll({ where: { interviewId: interview.id } });
const evaluations = await InterviewEvaluation.findAll({ where: { interviewId: interview.id } });
const isFullyEvaluated = evaluations.length >= participants.length;
console.log(`Evaluations: ${evaluations.length}/${participants.length}. Fully Evaluated: ${isFullyEvaluated}`);
if (isFullyEvaluated) {
console.log('Finalizing interview and updating application status...');
await interview.update({ status: 'Completed' });
const nextStatus = 'Level 1 Approved';
await Application.update({
overallStatus: nextStatus,
currentStage: 'Level 1 Approved'
}, { where: { id: app.id } });
console.log(`Application status updated to: ${nextStatus}`);
} else {
console.log('Waiting for more evaluations. Application status remains unchanged.');
}
}
// 3. First participant rejects
await submitDecision(user1Id, 'Rejected');
let currentApp = await Application.findByPk(app.id);
console.log(`Current App Overall Status: ${currentApp.overallStatus}`);
// 4. Second participant approves
await submitDecision(user2Id, 'Approved');
currentApp = await Application.findByPk(app.id);
console.log(`Final App Overall Status: ${currentApp.overallStatus}`);
// Cleanup
console.log('\nCleaning up...');
await InterviewEvaluation.destroy({ where: { interviewId: interview.id } });
await InterviewParticipant.destroy({ where: { interviewId: interview.id } });
await Interview.destroy({ where: { id: interview.id } });
await Application.destroy({ where: { id: app.id } });
} catch (error) {
console.error('Test failed:', error);
} finally {
process.exit(0);
}
}
testApprovalSync();