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' }); } };