using CPRNIMS.Domain.Services; using CPRNIMS.Domain.UIContracts.Account; using CPRNIMS.Domain.UIContracts.PR; using CPRNIMS.Infrastructure.Dto.PR; using CPRNIMS.Infrastructure.Helper; using CPRNIMS.Infrastructure.ViewModel.PR; using CPRNIMS.WebApps.Controllers.Base; using Microsoft.AspNetCore.Mvc; namespace CPRNIMS.WebApps.Controllers.PR { public class PRMgmtController : BaseMethod { List? response; private readonly IPRequest _pRequest; public PRMgmtController(TokenHelper tokenHelper, ErrorLogHelper errorMessageService, IWebHostEnvironment webHostEnvironment , IPRequest pRequest, IConfiguration configuration,IAccount account) : base(errorMessageService, webHostEnvironment, tokenHelper, account) { _pRequest = pRequest; } #region Get public async Task GetAllPR(PRVM viewModels) { response = await _pRequest.GetAllPR(GetUser(), viewModels); return GetResponse(response); } public async Task GetApprovedPR(PRVM viewModels) { response = await _pRequest.GetApprovedPR(GetUser(), viewModels); return GetResponse(response); } public async Task GetRemovedPR(PRVM viewModels) { response = await _pRequest.GetRemovedPR(GetUser(), viewModels); return GetResponse(response); } [HttpGet] public async Task GetPRAttachment(string fileName) { try { if (string.IsNullOrWhiteSpace(fileName) || fileName.Contains("..")) { // Return a 400 Bad Request so the frontend 'catch' or '!response.ok' triggers return BadRequest(new { success = false, message = "File does not exist!" }); } var uploadsPath = Path.Combine(_webHostEnvironment.WebRootPath, "Content/Uploads", "PRAttachment"); var filePath = Path.Combine(uploadsPath, fileName); if (!System.IO.File.Exists(filePath)) { return NotFound(new { success = false, message = "File not found on server." }); } // Stream the file for better performance var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read); var contentType = "application/octet-stream"; // Or use a provider to get actual type return File(fileStream, contentType, fileName, enableRangeProcessing: true); } catch (Exception ex) { return StatusCode(500, "Error retrieving file"); } } public async Task GetProjectCodes(PRVM viewModels) { response = await _pRequest.GetProjectCodes(GetUser(), viewModels); return GetResponse(response); } public async Task GetApproverNameByPRNo(PRVM viewModels) { response = await _pRequest.GetApproverNameByPRNo(GetUser(), viewModels); return GetResponse(response); } public async Task GetApproverName(PRVM viewModels) { response = await _pRequest.GetApproverName(GetUser(), viewModels); return GetResponse(response); } public async Task GetPRDetailByPRNo(PRVM viewModels) { response = await _pRequest.GetPRDetailByPRNo(GetUser(), viewModels); return GetResponse(response); } public async Task GetPRListByPRNo(PRVM viewModels) { response = await _pRequest.GetPRListByPRNo(GetUser(), viewModels); return GetResponse(response); } public async Task GetMyPR(PRVM viewModels) { response = await _pRequest.GetMyPR(GetUser(), viewModels); return GetResponse(response); } public async Task GetForReceiving() { var viewModels = new PRVM(); response = await _pRequest.GetForReceiving(GetUser(), viewModels); return GetResponse(response); } public async Task GetDeniedItem(PRVM viewModels) { response = await _pRequest.GetForReceiving(GetUser(), viewModels); return GetResponse(response); } public async Task GetPRByRRId(PRVM viewModel) { response = await _pRequest.GetPRByRRId(GetUser(), viewModel); return GetResponse(response); } public async Task GetRRDetailByPO(PRVM viewModel) { response = await _pRequest.GetRRDetailByPO(GetUser(), viewModel); return GetResponse(response); } public async Task GetPRStatusById(PRVM viewModel) { response = await _pRequest.GetPRStatusById(GetUser(), viewModel); return GetResponse(response); } public async Task GetItemDetailForReceiving(PRVM viewModel) { response = await _pRequest.GetItemDetailForReceiving(GetUser(), viewModel); return GetResponse(response); } public async Task GetDetailedPRTracking(PRVM viewModel) { response = await _pRequest.GetDetailedPRTracking(GetUser(), viewModel); return GetResponse(response); } public async Task GetSupplierAlternativeOffer(PRVM viewModel) { response = await _pRequest.GetSupplierAlternativeOffer(GetUser(), viewModel); return GetResponse(response); } public async Task GetSupplierAlterOfferDetails(PRVM viewModel) { response = await _pRequest.GetSupplierAlterOfferDetails(GetUser(), viewModel); return GetResponse(response); } public async Task GetDashBoard() { response = await _pRequest.GetDashBoard(GetUser(), new PRVM()); return GetResponse(response); } private PRList MapToPRItemList(IEnumerable prList) { if (prList == null || !prList.Any()) { return new PRList { PRDetailsId = new List(), ItemNo = new List(), }; } return new PRList { PRDetailsId = prList.SelectMany(ic => ic.PRDetailsId).ToList(), ItemNo = prList.SelectMany(ic => ic.ItemNo).ToList() }; } #endregion #region POST PUT public async Task UploadAttachment(IFormFile? file, [FromForm] string? oldFileName, [FromForm] long prId) { var uploadsPath = Path.Combine( _webHostEnvironment.WebRootPath, "Content", "Uploads", "PRAttachment"); Directory.CreateDirectory(uploadsPath); // If no new file uploaded, return old filename if (file == null) return BadRequest(new { success = false, message = "File does not exist!" }); // Delete old file if exists if (!string.IsNullOrWhiteSpace(oldFileName)) { await DeleteAttachmentAsync(oldFileName); } // Validate file extension var allowedExtensions = new[] { ".csv", ".xlsx", ".xls", ".pdf" }; var fileExtension = Path.GetExtension(file.FileName).ToLowerInvariant(); if (!allowedExtensions.Contains(fileExtension)) { throw new InvalidOperationException("Invalid file type. Only CSV, Excel, and PDF files are allowed."); } // Validate file size (5MB max) if (file.Length > 5 * 1024 * 1024) { throw new InvalidOperationException("File size exceeds 5MB limit."); } // Generate new unique filename with original extension var newFileName = $"{Guid.NewGuid()}{fileExtension}"; var newFilePath = Path.Combine(uploadsPath, newFileName); // Save new file await using var stream = new FileStream(newFilePath, FileMode.Create); await file.CopyToAsync(stream); var prVM = new PRVM() { FileName = newFileName, OrigFileName = file.FileName, PRId = prId }; var prResponse = await _pRequest.PostPutAttachment(GetUser(),prVM); if (prResponse.messCode == 0) { return BadRequest(new { success = false, message = "File does not exist!"}); } // Return only filename (NOT full path) return Json(new { success = true, message = "Attachment successfully uploaded!", newFileName = newFileName }); } private async Task DeleteAttachmentAsync(string fileName) { if (string.IsNullOrWhiteSpace(fileName)) return; var uploadsPath = Path.Combine( _webHostEnvironment.WebRootPath, "Content", "Uploads", "PRAttachment"); var filePath = Path.Combine(uploadsPath, fileName); if (System.IO.File.Exists(filePath)) { await Task.Run(() => System.IO.File.Delete(filePath)); } } public async Task PostPutProjectCode([FromBody] PRVM viewModel) { var postPutItem = await _pRequest.PostPutProjectCode(GetUser(), viewModel); if (postPutItem.messCode != 0) { return Json(new { success = true, Response = postPutItem.Message }); } return Json(new { success = false, Response = postPutItem.Message }); } public async Task ApprovedSelectedPRItem(PRVM viewModel, List PRList) { viewModel.PRList = MapToPRItemList(PRList); var postPutItem = await _pRequest.ApprovedSelectedPRItem(GetUser(), viewModel); if (postPutItem.messCode != 0) { return Json(new { success = true }); } return Json(new { success = false, Response = postPutItem.Message }); } public async Task PostPutDeniedItem(PRVM viewModel, List ItemList) { if (ItemList.Count > 0) { viewModel.ItemList = new ItemReceivingList { PRDetailsId = ItemList.SelectMany(ic => ic.PRDetailsId).ToList(), PRNo = ItemList.SelectMany(ic => ic.PRNo).ToList(), ItemNo = ItemList.SelectMany(ic => ic.ItemNo).ToList(), }; var postPutItem = await _pRequest.PostPutDeniedItem(GetUser(), viewModel); if (postPutItem.messCode != 0) { return Json(new { success = true, Response = postPutItem.Message }); } return Json(new { success = false, Response = postPutItem.Message }); } return Json(new { success = false, Response = "EmptyArray" }); } public async Task PutItemDetail(PRVM viewModel) { var postPutItem = await _pRequest.PutItemDetail(GetUser(), viewModel); if (postPutItem.messCode != 0) { return Json(new { success = true, Response = postPutItem.Message }); } return Json(new { success = false, Response = postPutItem.Message }); } public async Task PostPRApproveReject(PRVM viewModel) { var postPutItem = await _pRequest.PostPRApproveReject(GetUser(), viewModel); if (postPutItem.messCode != 0) { return Json(new { success = true, Response = postPutItem.Message }); } return Json(new { success = false, Response = postPutItem.Message }); } public async Task PutSupplierAlterOffer(PRVM viewModel) { var postPutItem = await _pRequest.PutSupplierAlterOffer(GetUser(), viewModel); if (postPutItem.messCode != 0) { return Json(new { success = true, Response = postPutItem.Message }); } return Json(new { success = false, Response = postPutItem.Message }); } public async Task PRItemRemoval(PRVM viewModel) { var postPutItem = await _pRequest.PRItemRemoval(GetUser(), viewModel); if (postPutItem.messCode != 0) { return Json(new { success = true , Response = postPutItem.Message }); } return Json(new { success = false, Response = postPutItem.Message }); } #endregion #region Views public IActionResult GetDashBoardById(int DashboardId) { return ViewComponent("Dashboard", new { dashboardId = DashboardId }); } public IActionResult GetTabbedById(int TableId) { return ViewComponent("PRTabbed", new { tableId = TableId }); } public async Task DashBoard() { return await IsAuthenTicated(); } public async Task Index() { return await IsAuthenTicated(); } public async Task PRArchived() { return await IsAuthenTicated(); } public async Task DeniedItem() { return await IsAuthenTicated(); } public async Task PRTracking() { return await IsAuthenTicated(); } public async Task AlterOffer() { return await IsAuthenTicated(); } public async Task ProjectCode() { return await IsAuthenTicated(); } #endregion } }