import { Router } from 'express'; import { DealerClaimController } from '../controllers/dealerClaim.controller'; import { authenticateToken } from '../middlewares/auth.middleware'; import { asyncHandler } from '../middlewares/errorHandler.middleware'; import multer from 'multer'; import path from 'path'; const router = Router(); const dealerClaimController = new DealerClaimController(); // Configure multer for file uploads (memory storage for direct GCS upload) const upload = multer({ storage: multer.memoryStorage(), limits: { fileSize: 10 * 1024 * 1024, // 10MB }, fileFilter: (req, file, cb) => { const allowedExtensions = ['.pdf', '.doc', '.docx', '.xls', '.xlsx', '.jpg', '.jpeg', '.png', '.zip']; const ext = path.extname(file.originalname).toLowerCase(); if (allowedExtensions.includes(ext)) { cb(null, true); } else { cb(new Error(`File type ${ext} not allowed. Allowed types: ${allowedExtensions.join(', ')}`)); } }, }); /** * @route POST /api/v1/dealer-claims * @desc Create a new dealer claim request * @access Private */ router.post('/', authenticateToken, asyncHandler(dealerClaimController.createClaimRequest.bind(dealerClaimController))); /** * @route GET /api/v1/dealer-claims/:requestId * @desc Get claim details * @access Private */ router.get('/:requestId', authenticateToken, asyncHandler(dealerClaimController.getClaimDetails.bind(dealerClaimController))); /** * @route POST /api/v1/dealer-claims/:requestId/proposal * @desc Submit dealer proposal (Step 1) * @access Private */ router.post('/:requestId/proposal', authenticateToken, upload.single('proposalDocument'), asyncHandler(dealerClaimController.submitProposal.bind(dealerClaimController))); /** * @route POST /api/v1/dealer-claims/:requestId/completion * @desc Submit completion documents (Step 5) * @access Private */ router.post('/:requestId/completion', authenticateToken, upload.fields([ { name: 'completionDocuments', maxCount: 10 }, { name: 'activityPhotos', maxCount: 10 }, { name: 'invoicesReceipts', maxCount: 10 }, { name: 'attendanceSheet', maxCount: 1 }, ]), asyncHandler(dealerClaimController.submitCompletion.bind(dealerClaimController))); /** * @route GET /api/v1/dealer-claims/:requestId/io/validate * @desc Validate/Fetch IO details from SAP (returns dummy data for now) * @access Private */ router.get('/:requestId/io/validate', authenticateToken, asyncHandler(dealerClaimController.validateIO.bind(dealerClaimController))); /** * @route PUT /api/v1/dealer-claims/:requestId/io * @desc Block IO amount in SAP and store in database * @access Private */ router.put('/:requestId/io', authenticateToken, asyncHandler(dealerClaimController.updateIODetails.bind(dealerClaimController))); /** * @route PUT /api/v1/dealer-claims/:requestId/e-invoice * @desc Update e-invoice details (Step 7) * @access Private */ router.put('/:requestId/e-invoice', authenticateToken, asyncHandler(dealerClaimController.updateEInvoice.bind(dealerClaimController))); /** * @route PUT /api/v1/dealer-claims/:requestId/credit-note * @desc Update credit note details (Step 8) * @access Private */ router.put('/:requestId/credit-note', authenticateToken, asyncHandler(dealerClaimController.updateCreditNote.bind(dealerClaimController))); /** * @route POST /api/v1/dealer-claims/:requestId/credit-note/send * @desc Send credit note to dealer and auto-approve Step 8 * @access Private */ router.post('/:requestId/credit-note/send', authenticateToken, asyncHandler(dealerClaimController.sendCreditNoteToDealer.bind(dealerClaimController))); export default router;