98 lines
3.6 KiB
TypeScript
98 lines
3.6 KiB
TypeScript
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;
|
|
|