184 lines
4.9 KiB
JavaScript
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' });
|
|
}
|
|
};
|