Item removal enhancement on receiving page

This commit is contained in:
rowell_m_soriano 2026-03-05 12:16:05 +08:00
parent d23347c299
commit 199c1271a0
7 changed files with 188 additions and 77 deletions

View File

@ -6,7 +6,7 @@
<script src="~/jsfunctions/receiving/ReceivingViewV4.js"></script> <script src="~/jsfunctions/receiving/ReceivingViewV4.js"></script>
<script src="~/jsfunctions/receiving/receivingcallback.js"></script> <script src="~/jsfunctions/receiving/receivingcallback.js"></script>
<script src="~/jsfunctions/receiving/receivingbutton.js"></script> <script src="~/jsfunctions/receiving/receivingbutton.js"></script>
<script src="~/jsfunctions/receiving/ReceivingPostPutV2.js"></script> <script src="~/jsfunctions/receiving/ReceivingPostPutV3.js"></script>
<script src="~/jsfunctions/utilities/searchengine.js"></script> <script src="~/jsfunctions/utilities/searchengine.js"></script>
<script src="~/jsfunctions/utilities/stylesv3.js"></script> <script src="~/jsfunctions/utilities/stylesv3.js"></script>
<script src="~/jsfunctions/utilities/utilsV3.js"></script> <script src="~/jsfunctions/utilities/utilsV3.js"></script>

View File

@ -28,7 +28,7 @@
$('#poNoHidden').val(data.poNo); $('#poNoHidden').val(data.poNo);
$('#totalAmountSIPO').text(data.itemCategoryName + numberWithCommas(data.totalAmount)); $('#totalAmountSIPO').text(data.itemCategoryName + numberWithCommas(data.totalAmount));
let formattedDate = formatDate(data.currentDate); let formattedDate = formatDate(data.createdDate ?? data.currentDate);
let formattedDelDate = formatDate(data.deliveryDate); let formattedDelDate = formatDate(data.deliveryDate);
document.getElementById('C-poDate').innerText = formattedDate; document.getElementById('C-poDate').innerText = formattedDate;
@ -61,7 +61,7 @@ function rowApprovedSIPOCallback(row, data) {
$('#poNoHidden').val(data.poNo); $('#poNoHidden').val(data.poNo);
$('#totalAmountSIPO').text(data.itemCategoryName + numberWithCommas(data.totalAmount)); $('#totalAmountSIPO').text(data.itemCategoryName + numberWithCommas(data.totalAmount));
let formattedDate = formatDate(data.currentDate); let formattedDate = formatDate(data.createdDate ?? data.currentDate);
let formattedDelDate = formatDate(data.deliveryDate); let formattedDelDate = formatDate(data.deliveryDate);
document.getElementById('C-poDate').innerText = formattedDate; document.getElementById('C-poDate').innerText = formattedDate;

View File

@ -12,6 +12,7 @@
PostPutProjectCode: '/PRMgmt/PostPutProjectCode', PostPutProjectCode: '/PRMgmt/PostPutProjectCode',
PRItemRemoval: '/PRMgmt/PRItemRemoval', PRItemRemoval: '/PRMgmt/PRItemRemoval',
PutItemDetail: '/PRMgmt/PutItemDetail', PutItemDetail: '/PRMgmt/PutItemDetail',
PostItemInPR: '/PRMgmt/PostItemInPR',
ApprovedSelectedPRItem: '/PRMgmt/ApprovedSelectedPRItem', ApprovedSelectedPRItem: '/PRMgmt/ApprovedSelectedPRItem',
PostPRApproveReject: '/PRMgmt/PostPRApproveReject', PostPRApproveReject: '/PRMgmt/PostPRApproveReject',
}; };

View File

@ -1,4 +1,67 @@
function postPutProjectCode() { function postItemInPR() {
loader = $('#overlay, #loader').css('z-index', 1110);
const selectedItems = Object.values(selectedProductsMap);
if (selectedItems.length === 0) {
showToast('warning', 'Please select items first!', 'Submission failed', 4000);
return;
}
const PRItemList = selectedItems.map(item => ({
itemNo: item.itemNo,
qty: parseFloat(item.qty) || 0
}));
const invalidItems = PRItemList.filter(item => !item.qty || item.qty <= 0);
if (invalidItems.length > 0) {
const invalidNames = invalidItems.map(invalid => {
const details = selectedItems.find(i => i.itemNo === invalid.itemNo);
return `${details.itemNo} - ${details.itemName}`;
}).join(', ');
showToast('warning', `Items with 0 or empty qty: ${invalidNames}`, 'Submission failed', 8000);
return;
}
let PRNo = document.getElementById('label-pr-prNo').innerHTML;
if (!PRNo) {
showToast('error', 'Server error, please re-login and try again!', 'Submission failed', 4000);
return;
}
showConfirmation({
title: 'Add New Item',
message: `Are you sure you want to add new item for this PRNo# ${PRNo}? This action cannot be undone.`,
type: 'warning',
confirmText: 'Yes',
cancelText: 'No'
}).then((confirmed) => {
if (confirmed) {
$.ajax({
url: endpoint.PostItemInPR,
type: 'POST',
data: { PRItemList, PRNo },
...beforeComplete(loader),
success: function (response) {
if (response.success) {
prTable.ajax.reload(null, false);
$('#viewItemList, #viewPRDetails').modal('hide');
showToast('success', 'PR item added successfully!', 'Success', 8000);
} else {
showToast('error', response.response, 'Adding item failed', 8000);
}
},
error: errorHandler
});
}
});
}
function postPutProjectCode() {
loader = $('#overlay, #loader').css('z-index', 1070); loader = $('#overlay, #loader').css('z-index', 1070);
const modal = $('#showProjectCode'); const modal = $('#showProjectCode');
const mode = modal.attr('data-mode'); const mode = modal.attr('data-mode');

View File

@ -46,49 +46,6 @@
}); });
} }
/*$(document).ready(function () {
loader = $('#overlay, #loader');
UserRights = document.getElementById("roleRights").value;
prTable = $('#PRTable').DataTable({
ajax: {
url: '/PRMgmt/GetAllPR', // Initial endpoint
type: 'GET',
beforeSend: function () {
// Show the loader before making the AJAX request
loader.show();
},
complete: function () {
loader.hide();
},
error: function (xhr, error, thrown) {
loader.hide();
console.error('Error loading data:', error);
// Optional: Show error notification
if (typeof toastr !== 'undefined') {
toastr.error('Failed to load data. Please try again.');
}
}
},
initComplete: initCompleteCallback,
columns: colOnPRTable,
order: [[10, 'asc']],
rowCallback: rowStatusColorCallback,
responsive: true,
language: {
emptyTable: "No record available",
loadingRecords: "Loading data...",
processing: "Processing..."
},
error: errorHandler
});
// Initialize tabs after DataTable is ready
// The PRTabs.js script will handle tab switching and DataTable reloading
});*/
// Optional: Add helper function to refresh current tab // Optional: Add helper function to refresh current tab
function refreshCurrentTab() { function refreshCurrentTab() {
if (typeof PRTabs !== 'undefined') { if (typeof PRTabs !== 'undefined') {
@ -257,8 +214,7 @@ function uploadAttachment() {
} }
}) })
.catch(error => { .catch(error => {
console.error('Upload error:', error); showToast('error', 'Upload error:', error, 'File Upload', 4000);
showToast('error', 'An error occurred during upload.', 'File Upload', 4000);
}) })
.finally(() => { .finally(() => {
// Reset button state // Reset button state

View File

@ -1,4 +1,89 @@
function showProjectCode(data = {}, isNew = true) { function viewItemList() {
var loader = $('#overlay, #loader').css('z-index', 1100);
$('#viewItemList').modal('show');
$('#viewItemList').css('z-index', 1090);
tableElement = $('#ItemTable');
tableName = '#ItemTable';
tableDestroy(tableElement);
totalSelectedLabel = $('#totalSelectedItem');
clearTableSelection(tableName, selectedProductsMap, () => {
totalSelectedLabel.text(0);
}, 'selected-row', '.select-all-item-checkbox');
var itemListTable = tableElement.DataTable({
ajax: $.extend({
url: '/ItemMgmt/GetItemList',
type: 'POST',
}, beforeComplete(loader)),
responsive: true,
language: {
emptyTable: "No record available"
},
initComplete: function () {
initializeTableSelection({
tableName: tableName,
dataTable: itemListTable,
selectedItemsMap: selectedProductsMap,
idKey: 'itemNo',
idKey2: 'itemCodeId',
checkboxClass: '.select-item-checkbox',
selectAllClass: '.select-all-item-checkbox',
selectedRowClass: 'selected-row',
updateCountCallback: function () {
totalSelectedLabel.text(getSelectedCount(selectedProductsMap));
}
});
},
columns: [
{
data: 'itemNo',
title: '<input type="checkbox" class="select-all-item-checkbox" />',
render: function () {
return '<input type="checkbox" class="select-item-checkbox" style="text-align:center;"/>';
},
orderable: false,
searchable: false
},
{ data: 'itemNo' },
{ data: 'itemName' },
{ data: 'itemDescription' },
{ data: 'itemCategoryName' },
{ data: 'qty' },
],
"columnDefs": [
{
"targets": [5],
"render": function (data, type, row) {
return '<input type="number" class="editable-qty" style="width:60px;" value="' + data + '" />';
}
}
],
pageLength: 5,
lengthMenu: [[5, 10, 25, 50, 100, -1], [5, 10, 25, 50, 100, "All"]],
error: errorHandler
});
// Add this inside viewItemList(), after the DataTable is initialized
$('#ItemTable').on('change', '.editable-qty', function () {
const $row = $(this).closest('tr');
const rowData = itemListTable.row($row).data();
if (!rowData) return;
const newQty = parseFloat($(this).val()) || 0;
const itemId = `${rowData.itemNo}|${rowData.qty}`; // original key
// ✅ If this item is already selected, update its qty in the map
if (selectedProductsMap[itemId]) {
selectedProductsMap[itemId].qty = newQty;
}
// Update the DataTable's internal data too
rowData.qty = newQty;
});
}
function showProjectCode(data = {}, isNew = true) {
const modal = $('#showProjectCode'); const modal = $('#showProjectCode');
@ -817,8 +902,7 @@ function downloadPRAttachment() {
window.URL.revokeObjectURL(url); window.URL.revokeObjectURL(url);
}) })
.catch(error => { .catch(error => {
console.error("Error downloading attachment:", error); showToast('error', error, 'Submission failed', 4000);
alert("Error downloading attachment. Please check if the file exists.");
}); });
} }

View File

@ -6,7 +6,7 @@
Remarks = $('#remarks').val(); Remarks = $('#remarks').val();
ItemList = []; ItemList = [];
tableElement = $('#RRdataTable').DataTable(); tableElement = $('#RRdataTable').DataTable();
var isValid = true; // Flag to track validity var isValid = true;
const drNoInput = document.getElementById('suppDocNo'); const drNoInput = document.getElementById('suppDocNo');
const docTypeIdInput = document.getElementById('docTypeId'); const docTypeIdInput = document.getElementById('docTypeId');
@ -23,11 +23,11 @@
if (RRNo == 0) { if (RRNo == 0) {
rrNoInput.classList.add('error-input'); rrNoInput.classList.add('error-input');
alert('RRNo cannot be 0!'); showToast('warning', 'RRNo cannot be 0!', 'Submission failed!', 4000);
} }
if (!DRNo || !DocTypeId || !ReceivedDate || !RRNo) { if (!DRNo || !DocTypeId || !ReceivedDate || !RRNo) {
alert('Please fill the required fields !'); showToast('warning', 'Please fill the required fields !', 'Submission failed!', 4000);
if (!DRNo) { if (!DRNo) {
drNoInput.classList.add('error-input'); drNoInput.classList.add('error-input');
} }
@ -54,17 +54,17 @@
qtyReceived = parseFloat(qtyReceived); qtyReceived = parseFloat(qtyReceived);
// Ensure the value is valid (check for NaN) // Ensure the value is valid (check for NaN)
if (isNaN(qtyReceived) || qtyReceived <= 0 || qtyReceived === null) { if (isNaN(parseFloat(qtyReceived)) || parseFloat(qtyReceived) <= 0 || parseFloat(qtyReceived) === null) {
alert('Invalid Quantity Received. Please provide a valid number.'); showToast('warning', 'Invalid Quantity Received, Please provide a valid number.', 'Submission failed!', 4000);
qtyReceived = rowData.quantityReceived; // Default to original if invalid qtyReceived = rowData.quantityReceived; // Default to original if invalid
} }
if (parseFloat(qtyReceived) > parseFloat(qtyRequest)) { if (parseFloat(qtyReceived) > parseFloat(qtyRequest)) {
alert('Qty Received cannot be more than Remaining Qty!'); showToast('warning', 'Qty Received cannot be more than Remaining Qty!', 'Submission failed!', 4000);
isValid = false; isValid = false;
return false; return false;
} }
if (qtyReceived <= 0 || qtyReceived == null) { if (qtyReceived <= 0 || qtyReceived == null) {
alert('Qty Received Cannot be 0 or empty!, please remove instead!'); showToast('warning', 'Qty Received Cannot be 0 or empty!, please remove instead!', 'Submission failed!', 4000);
isValid = false; isValid = false;
return false; return false;
} }
@ -79,7 +79,7 @@
return; return;
} }
if (ItemList.length <= 0) { if (ItemList.length <= 0) {
alert("You don't have a list to be received!"); showToast('warning', "You don't have a list to be received!", 'Submission failed!', 4000);
return; return;
} }
@ -221,24 +221,31 @@ function postPOClosing() {
} }
} }
function deleteSKUCodeRec(prDetailsId) { function deleteSKUCodeRec(prDetailsId) {
const confirmation = confirm('Are you sure you want to proceed?'); showConfirmation({
if (confirmation) { title: 'Remove Item',
var table = $('#RRdataTable').DataTable(); message: 'Are you sure you want to remove this item? This action cannot be undone.',
var rowToRemove = null; type: 'danger',
confirmText: 'Yes',
cancelText: 'No'
}).then((confirmed) => {
if (confirmed) {
var table = $('#RRdataTable').DataTable();
var rowToRemove = null;
table.rows().every(function (rowIdx) { table.rows().every(function (rowIdx) {
var data = this.data(); var data = this.data();
if (data && data.prDetailsId == prDetailsId) { if (data && data.prDetailsId == prDetailsId) {
rowToRemove = this; rowToRemove = this;
return false; return false;
}
});
if (rowToRemove) {
rowToRemove.remove();
table.rows().invalidate().draw(false);
} else {
console.log('No matching row found for prDetailsId:', prDetailsId);
} }
});
if (rowToRemove) {
rowToRemove.remove();
table.rows().invalidate().draw(false);
} else {
console.log('No matching row found for prDetailsId:', prDetailsId);
} }
} });
} }