approval and project code maintenance is working properly

This commit is contained in:
rowell_m_soriano 2026-02-16 09:18:27 +08:00
parent 6e0551707e
commit 9419130ee3
12 changed files with 94 additions and 68 deletions

View File

@ -21,7 +21,7 @@ namespace CPRNIMS.Domain.UIContracts.Items
Task<List<ItemVM>> GetItemUOM(User user, ItemVM viewModel);
Task<List<ItemVM>> GetDepartment(User user, ItemVM viewModel);
Task<List<ItemVM>> GetItemCart(User user, ItemVM viewModel);
Task<List<ItemVM>?> GetProjectCode(User user, ItemVM viewModels);
Task<List<ItemVM>?> GetProjectCodeByTerm(User user, ItemVM viewModels);
Task<ItemVM> PostPurchRequest(User user, ItemVM viewModel);
Task<ItemVM> PostPutItem(User user, ItemVM viewModel);
Task<ItemVM> PutItemDetail(User user, ItemVM viewModel);

View File

@ -129,10 +129,10 @@ namespace CPRNIMS.Domain.UIServices.Items
}
#endregion
#region Get Method
public async Task<List<ItemVM>> GetProjectCode(Infrastructure.Models.Account.User user, ItemVM viewModel)
public async Task<List<ItemVM>> GetProjectCodeByTerm(Infrastructure.Models.Account.User user, ItemVM viewModel)
{
return await SendGetApiRequest(user, viewModel,
_configuration["LLI:NonInvent:ItemMgmt:GetProjectCode"]);
_configuration["LLI:NonInvent:ItemMgmt:GetProjectCodeByTerm"]);
}
public async Task<List<ItemVM>> GetItemDetail(Infrastructure.Models.Account.User user,
ItemVM viewModel)

View File

@ -60,5 +60,6 @@ namespace CPRNIMS.Infrastructure.ViewModel.Items
public long PRId { get; set; }
public string? ProjectCode { get; set; }
public string? OrigFileName { get; set; }
public string? ProjectName { get; set; }
}
}

View File

@ -109,7 +109,7 @@ namespace CPRNIMS.WebApi.Controllers.Items
PRId = dto.PRId
};
await _item.PostPutAttachment(attachment);
// await SendNotificationEmail(dto);
await SendNotificationEmail(dto);
}
return dto;
@ -171,13 +171,20 @@ namespace CPRNIMS.WebApi.Controllers.Items
});
}
}
[HttpPost("GetProjectCodeByTerm")]
public async Task<IActionResult> GetProjectCodeByTerm(ItemCodeDto itemDto)
{
return await ExecuteWithErrorHandling(
() => _item.GetProjectCodeByTerm(itemDto.FileName),
nameof(GetProjectCodeByTerm), false
);
}
[HttpPost("GetProjectCode")]
public async Task<IActionResult> GetProjectCode(ItemCodeDto itemDto)
{
var results = await _item.GetProjectCodeByTerm(itemDto.FileName);
return Ok( new {message="success", messCode=1, data= results });
var results = await _item.GetProjectCode();
return Ok(new { message = "success", messCode = 1, data = results });
}
[HttpPost("GetDepartment")]
public async Task<IActionResult> GetDepartment(ItemCodeDto itemDto)
{

View File

@ -4,8 +4,10 @@ using CPRNIMS.Domain.UIContracts.Account;
using CPRNIMS.Domain.UIContracts.Items;
using CPRNIMS.Domain.UIServices.Updater;
using CPRNIMS.Infrastructure.Dto.Items;
using CPRNIMS.Infrastructure.Entities.Purchasing;
using CPRNIMS.Infrastructure.Helper;
using CPRNIMS.Infrastructure.ViewModel.Items;
using CPRNIMS.Infrastructure.ViewModel.PO;
using CPRNIMS.WebApps.Controllers.Base;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.SignalR;
@ -197,7 +199,7 @@ namespace CPRNIMS.WebApps.Controllers.Items
[FromForm] byte RequestTypeId,
[FromForm] int ChargeTo,
[FromForm] string? Remarks,
[FromForm] string? ProjectCode,
[FromForm] int ProjectCodeId,
IFormFile? file)
{
try
@ -216,7 +218,7 @@ namespace CPRNIMS.WebApps.Controllers.Items
RequestTypeId = RequestTypeId,
ChargeTo = ChargeTo,
Remarks = Remarks,
ProjectCode = ProjectCode,
ProjectCodeId = ProjectCodeId,
ItemCartVM = new ItemCartVM
{
ItemCartId = itemCartList.Select(ic => ic.ItemCartId).ToList(),
@ -224,12 +226,19 @@ namespace CPRNIMS.WebApps.Controllers.Items
ItemNo = itemCartList.Select(ic => ic.ItemNo).ToList()
}
};
// Save attachment if provided
if(file?.FileName != null)
{
string? savedFileName = await SaveAttachmentAsync(file, null);
viewModel.FileName = savedFileName;
viewModel.OrigFileName = file.FileName;
viewModel.OrigFileName = file.FileName ?? "N/A";
// Delete uploaded file if request failed
if (!string.IsNullOrWhiteSpace(savedFileName))
{
await DeleteAttachmentAsync(savedFileName);
}
}
var postPutItem = await _item.PostPurchRequest(GetUser(), viewModel);
@ -238,12 +247,6 @@ namespace CPRNIMS.WebApps.Controllers.Items
return Json(new { success = true, message = "Purchase request created successfully" });
}
// Delete uploaded file if request failed
if (!string.IsNullOrWhiteSpace(savedFileName))
{
await DeleteAttachmentAsync(savedFileName);
}
return Json(new { success = false, response = postPutItem.message });
}
catch (Exception ex)
@ -255,12 +258,23 @@ namespace CPRNIMS.WebApps.Controllers.Items
#endregion
#region Get
public async Task<IActionResult> GetProjectCode(string term)
public async Task<IActionResult> GetProjectCodeByTerm(string query)
{
var item = new ItemVM();
item.FileName = term;
response = await _item.GetProjectCode(GetUser(), item);
return GetResponse(response);
item.FileName = query;
var responseQuery = await _item.GetProjectCodeByTerm(GetUser(), item);
if (responseQuery == null)
{
responseQuery = new List<ItemVM>();
}
var formattedData = responseQuery.Select(item => new
{
label = $"{item.ProjectCode} {item.ProjectName}",
value = item.ProjectCodeId,
});
return Json(new { success = true, data = formattedData });
}
public async Task<IActionResult> GetImageFileIds()
{

View File

@ -69,14 +69,10 @@
<label for="projectCode" class="form-label fw-semibold">
Project Code <small class="text-muted">(Optional)</small>
</label>
<input type="text" class="form-control form-control"
id="projectCode" name="projectCode"
placeholder="Start typing here..."
autocomplete="off"
list="projectCodeList" />
<datalist id="projectCodeList">
<input type="search" id="projectCode" placeholder="Start typing here..."
class="form-control mb-2" name="projectCode" />
<input type="hidden" id="projectCodeId" class="form-control" name="projectCodeId" />
<!-- Options will be populated dynamically via JavaScript -->
</datalist>
<div class="form-text">
<i class="bi bi-info-circle me-1"></i>Search and select the appropriate project code
</div>

View File

@ -26,7 +26,7 @@
</table>
</div>
</div>
<link href="~/css/pr/tracking.css" rel="stylesheet" />
<link href="~/css/pr/TrackingV3.css" rel="stylesheet" />
@await Html.PartialAsync("PagesView/PR/_PRTracking")
<script src="~/JsFunctions/PR/ArchivedV2.js"></script>
@await Html.PartialAsync("PagesView/PR/_PRScripts")

View File

@ -5,8 +5,8 @@
<link href="~/lib/bootstrap/dist/fonts/boostrap-icons.css" rel="stylesheet" />
<link href="~/css/common/rowhighlighter.css" rel="stylesheet" />
<script src="~/jsfunctions/items/itemvar.js"></script>
<script src="~/jsfunctions/items/ItemViewV6.js"></script>
<script src="~/jsfunctions/items/PostPutItemV3.js"></script>
<script src="~/jsfunctions/items/ItemViewV7.js"></script>
<script src="~/jsfunctions/items/PostPutItemV4.js"></script>
<script src="~/microsoft-signalr/signalr.min.js"></script>
<script src="~/jsfunctions/updater/CartUpdater.js"></script>

View File

@ -4,7 +4,7 @@
<link href="~/css/common/rowhighlighter.css" rel="stylesheet" />
<script src="~/jsfunctions/pr/PRColumnV7.js"></script>
<script src="~/jsfunctions/pr/PRViewV5.js"></script>
<script src="~/jsfunctions/pr/PRViewV6.js"></script>
<script src="~/jsfunctions/pr/PRPutPost.js"></script>
<script src="~/jsfunctions/pr/PRButtonv3.js"></script>
<script src="~/jsfunctions/pr/PRVarV3.js"></script>

View File

@ -2,7 +2,7 @@
$("#projectCode").autocomplete({
source: function (request, response) {
$.ajax({
url:'/ItemMgmt/GetProjectCode',
url:'/ItemMgmt/GetProjectCodeByTerm',
data: { query: request.term },
success: function (result) {
if (result && result.success && Array.isArray(result.data)) {
@ -24,8 +24,8 @@
},
minLength: 2,
select: function (event, ui) {
$('#projectCodeList').val(ui.item.label);
$('#supplierId').val(ui.item.value);
$('#projectCode').val(ui.item.label);
$('#projectCodeId').val(ui.item.value);
return false;
},

View File

@ -3,7 +3,7 @@
isValid = true;
var Remarks = document.getElementById('requestorRemarks').value;
var ProjectCode = document.getElementById('projectCode').value;
var ProjectCodeId = document.getElementById('projectCodeId').value;
const selectedItems = Object.values(selectedProductsMap);
if (selectedItems.length === 0) {
@ -36,7 +36,7 @@
return;
}
}
console.log('ProjectCodeId', ProjectCodeId);
showConfirmation({
title: 'Purchasing Requisition',
message: 'Are you sure you want to proceed? This action cannot be undone.',
@ -59,7 +59,7 @@
formData.append('RequestTypeId', RequestTypeId);
formData.append('ChargeTo', ChargeTo || '');
formData.append('Remarks', Remarks || '');
formData.append('ProjectCode', ProjectCode || '');
formData.append('ProjectCodeId', ProjectCodeId || 0);
// Append array data - serialize as JSON
formData.append('ItemCartIds', JSON.stringify(requestData));

View File

@ -711,19 +711,10 @@ function viewPRDetails(data) {
tableDestroy(tableElement);
var PRNo = data.prNo;
document.getElementById('label-pr-prNo').innerHTML = data.prNo;
document.getElementById('label-prby').innerHTML = data.createdBy;
document.getElementById('label-pr-Department').innerHTML = data.department;
document.getElementById('label-pr-remarks').innerHTML = data.remarks;
document.getElementById('label-pr-attestedBy').innerHTML = data.attestedBy;
document.getElementById('label-pr-approvedBy').innerHTML = data.approvedBy;
document.getElementById('label-pr-ProjectCode').innerHTML = data.projectCode;
$('#prId').val(data.prId);
console.log('data.prId', data.prId);
document.getElementById('label-pr-dateNeeded').innerHTML = formatDate(data.dateNeeded);
// Populate PR header details
populatePRHeader(data);
prDataTable = tableElement.DataTable({
ajax: $.extend({
@ -736,27 +727,20 @@ function viewPRDetails(data) {
emptyTable: "No record available"
},
initComplete: function () {
var api = this.api();
var response = api.ajax.json();
const api = this.api();
const response = api.ajax.json() || {};
const rows = response.data || [];
// 1. Find the first row that actually has a fileName
const rowWithFile = response?.data?.find(
row => row.fileName && row.fileName.trim() !== ''
);
const rowWithFile = rows.find(r => r.fileName?.trim());
const rowWithProjectCode = rows.find(r => r.projectCode?.trim());
// 2. If a file exists, update the hidden inputs and show the button
if (rowWithFile) {
$('#fileName').val(rowWithFile.fileName);
$('#origFileName').val(rowWithFile.origFileName || ''); // Use empty string if null
$('#btnDownloadAttachment').removeClass('d-none');
} else {
// Clear values and hide button if no attachment is found
$('#fileName').val('');
$('#origFileName').val('');
$('#btnDownloadAttachment').addClass('d-none');
if (rowWithProjectCode) {
document.getElementById('label-pr-ProjectCode').innerHTML =
rowWithProjectCode.projectCode;
}
// Keep your selection initialization
toggleAttachment(rowWithFile);
initializeTableSelection({
tableName: tableName,
dataTable: prDataTable,
@ -778,6 +762,30 @@ function viewPRDetails(data) {
error: errorHandler
});
}
function populatePRHeader(data) {
const set = (id, value) =>
document.getElementById(id).innerHTML = value ?? '';
set('label-pr-prNo', data.prNo);
set('label-prby', data.createdBy);
set('label-pr-Department', data.department);
set('label-pr-remarks', data.remarks);
set('label-pr-attestedBy', data.attestedBy);
set('label-pr-approvedBy', data.approvedBy);
set('label-pr-dateNeeded', formatDate(data.dateNeeded));
}
function toggleAttachment(rowWithFile) {
if (rowWithFile) {
$('#fileName').val(rowWithFile.fileName);
$('#origFileName').val(rowWithFile.origFileName || '');
$('#btnDownloadAttachment').removeClass('d-none');
} else {
$('#fileName').val('');
$('#origFileName').val('');
$('#btnDownloadAttachment').addClass('d-none');
}
}
function downloadPRAttachment() {
let fileName = $('#fileName').val();