Dealer_Onboarding_Backend/controllers/constitutionalController.js

184 lines
4.9 KiB
JavaScript

const { ConstitutionalChange, Outlet, User, Worknote } = require('../models');
const { v4: uuidv4 } = require('uuid');
const { Op } = require('sequelize'); // Required for Op.or
exports.submitRequest = async (req, res) => {
try {
const {
outletId, changeType, currentConstitution, proposedConstitution,
reason, effectiveDate, newEntityDetails
} = req.body;
const requestId = `CC-${Date.now()}-${uuidv4().substring(0, 4).toUpperCase()}`;
const request = await ConstitutionalChange.create({
requestId,
outletId,
dealerId: req.user.id,
changeType,
description: reason,
currentConstitution,
proposedConstitution,
effectiveDate,
newEntityDetails: JSON.stringify(newEntityDetails), // Store as JSON string
currentStage: 'RBM Review',
status: 'Pending',
progressPercentage: 0,
timeline: [{
stage: 'Submitted',
timestamp: new Date(),
user: req.user.full_name, // Assuming req.user.full_name is available
action: 'Request submitted'
}]
});
res.status(201).json({
success: true,
message: 'Constitutional change request submitted successfully',
requestId: request.requestId
});
} catch (error) {
console.error('Submit constitutional change error:', error);
res.status(500).json({ success: false, message: 'Error submitting request' });
}
};
exports.getRequests = async (req, res) => {
try {
const where = {};
if (req.user.role === 'Dealer') {
where.dealerId = req.user.id;
}
const requests = await ConstitutionalChange.findAll({
where,
include: [
{
model: Outlet,
as: 'outlet',
attributes: ['code', 'name']
},
{
model: User,
as: 'dealer',
attributes: ['full_name'] // Changed from 'name' to 'full_name' based on original code
}
],
order: [['createdAt', 'DESC']]
});
res.json({ success: true, requests });
} catch (error) {
console.error('Get constitutional changes error:', error);
res.status(500).json({ success: false, message: 'Error fetching requests' });
}
};
exports.getRequestById = async (req, res) => {
try {
const { id } = req.params;
const request = await ConstitutionalChange.findOne({
where: {
[Op.or]: [
{ id },
{ requestId: id }
]
},
include: [
{
model: Outlet,
as: 'outlet'
},
{
model: User,
as: 'dealer',
attributes: ['full_name', 'email'] // Changed from 'name' to 'full_name'
},
{
model: Worknote,
as: 'worknotes' // Assuming Worknote model is associated as 'worknotes'
}
]
});
if (!request) {
return res.status(404).json({ success: false, message: 'Request not found' });
}
res.json({ success: true, request });
} catch (error) {
console.error('Get constitutional change details error:', error);
res.status(500).json({ success: false, message: 'Error fetching details' });
}
};
exports.takeAction = async (req, res) => {
try {
const { id } = req.params;
const { action, comments } = req.body;
const request = await ConstitutionalChange.findOne({
where: {
[Op.or]: [
{ id },
{ requestId: id }
]
}
});
if (!request) {
return res.status(404).json({ success: false, message: 'Request not found' });
}
const timeline = [...request.timeline, {
stage: 'Review',
timestamp: new Date(),
user: req.user.full_name, // Assuming req.user.full_name is available
action,
remarks: comments
}];
await request.update({
status: action, // Assuming action directly maps to status (e.g., 'Approved', 'Rejected')
timeline,
updatedAt: new Date()
});
res.json({ success: true, message: `Request ${action.toLowerCase()} successfully` });
} catch (error) {
console.error('Take action error:', error);
res.status(500).json({ success: false, message: 'Error processing action' });
}
};
exports.uploadDocuments = async (req, res) => {
try {
const { id } = req.params;
const { documents } = req.body;
const request = await ConstitutionalChange.findOne({
where: {
[Op.or]: [
{ id },
{ requestId: id }
]
}
});
if (!request) {
return res.status(404).json({ success: false, message: 'Request not found' });
}
await request.update({
documents: documents, // Assuming documents is an array or object that can be stored directly
updatedAt: new Date()
});
res.json({ success: true, message: 'Documents uploaded successfully' });
} catch (error) {
console.error('Upload documents error:', error);
res.status(500).json({ success: false, message: 'Error uploading documents' });
}
};