113 lines
4.4 KiB
TypeScript
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();
|