diff --git a/CPRNIMS.WebApps/Views/Shared/PagesView/Receiving/_ReceivingScripts.cshtml b/CPRNIMS.WebApps/Views/Shared/PagesView/Receiving/_ReceivingScripts.cshtml
index 4391c80..45e8f64 100644
--- a/CPRNIMS.WebApps/Views/Shared/PagesView/Receiving/_ReceivingScripts.cshtml
+++ b/CPRNIMS.WebApps/Views/Shared/PagesView/Receiving/_ReceivingScripts.cshtml
@@ -6,7 +6,7 @@
-
+
\ No newline at end of file
diff --git a/CPRNIMS.WebApps/wwwroot/JsFunctions/PO/rowCallBackV4.js b/CPRNIMS.WebApps/wwwroot/JsFunctions/PO/rowCallBackV5.js
similarity index 98%
rename from CPRNIMS.WebApps/wwwroot/JsFunctions/PO/rowCallBackV4.js
rename to CPRNIMS.WebApps/wwwroot/JsFunctions/PO/rowCallBackV5.js
index 5991de8..cec2ebe 100644
--- a/CPRNIMS.WebApps/wwwroot/JsFunctions/PO/rowCallBackV4.js
+++ b/CPRNIMS.WebApps/wwwroot/JsFunctions/PO/rowCallBackV5.js
@@ -28,7 +28,7 @@
$('#poNoHidden').val(data.poNo);
$('#totalAmountSIPO').text(data.itemCategoryName + numberWithCommas(data.totalAmount));
- let formattedDate = formatDate(data.currentDate);
+ let formattedDate = formatDate(data.createdDate ?? data.currentDate);
let formattedDelDate = formatDate(data.deliveryDate);
document.getElementById('C-poDate').innerText = formattedDate;
@@ -61,7 +61,7 @@ function rowApprovedSIPOCallback(row, data) {
$('#poNoHidden').val(data.poNo);
$('#totalAmountSIPO').text(data.itemCategoryName + numberWithCommas(data.totalAmount));
- let formattedDate = formatDate(data.currentDate);
+ let formattedDate = formatDate(data.createdDate ?? data.currentDate);
let formattedDelDate = formatDate(data.deliveryDate);
document.getElementById('C-poDate').innerText = formattedDate;
diff --git a/CPRNIMS.WebApps/wwwroot/JsFunctions/PR/Configv5.js b/CPRNIMS.WebApps/wwwroot/JsFunctions/PR/Configv6.js
similarity index 94%
rename from CPRNIMS.WebApps/wwwroot/JsFunctions/PR/Configv5.js
rename to CPRNIMS.WebApps/wwwroot/JsFunctions/PR/Configv6.js
index 3be66ff..13ff713 100644
--- a/CPRNIMS.WebApps/wwwroot/JsFunctions/PR/Configv5.js
+++ b/CPRNIMS.WebApps/wwwroot/JsFunctions/PR/Configv6.js
@@ -12,6 +12,7 @@
PostPutProjectCode: '/PRMgmt/PostPutProjectCode',
PRItemRemoval: '/PRMgmt/PRItemRemoval',
PutItemDetail: '/PRMgmt/PutItemDetail',
+ PostItemInPR: '/PRMgmt/PostItemInPR',
ApprovedSelectedPRItem: '/PRMgmt/ApprovedSelectedPRItem',
PostPRApproveReject: '/PRMgmt/PostPRApproveReject',
};
\ No newline at end of file
diff --git a/CPRNIMS.WebApps/wwwroot/JsFunctions/PR/PRPutPost.js b/CPRNIMS.WebApps/wwwroot/JsFunctions/PR/PRPostPut.js
similarity index 89%
rename from CPRNIMS.WebApps/wwwroot/JsFunctions/PR/PRPutPost.js
rename to CPRNIMS.WebApps/wwwroot/JsFunctions/PR/PRPostPut.js
index f488215..9e571e6 100644
--- a/CPRNIMS.WebApps/wwwroot/JsFunctions/PR/PRPutPost.js
+++ b/CPRNIMS.WebApps/wwwroot/JsFunctions/PR/PRPostPut.js
@@ -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);
const modal = $('#showProjectCode');
const mode = modal.attr('data-mode');
diff --git a/CPRNIMS.WebApps/wwwroot/JsFunctions/PR/PRV8.js b/CPRNIMS.WebApps/wwwroot/JsFunctions/PR/PRV9.js
similarity index 85%
rename from CPRNIMS.WebApps/wwwroot/JsFunctions/PR/PRV8.js
rename to CPRNIMS.WebApps/wwwroot/JsFunctions/PR/PRV9.js
index 123b68f..078a52b 100644
--- a/CPRNIMS.WebApps/wwwroot/JsFunctions/PR/PRV8.js
+++ b/CPRNIMS.WebApps/wwwroot/JsFunctions/PR/PRV9.js
@@ -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
function refreshCurrentTab() {
if (typeof PRTabs !== 'undefined') {
@@ -257,8 +214,7 @@ function uploadAttachment() {
}
})
.catch(error => {
- console.error('Upload error:', error);
- showToast('error', 'An error occurred during upload.', 'File Upload', 4000);
+ showToast('error', 'Upload error:', error, 'File Upload', 4000);
})
.finally(() => {
// Reset button state
diff --git a/CPRNIMS.WebApps/wwwroot/JsFunctions/PR/PRViewV7.js b/CPRNIMS.WebApps/wwwroot/JsFunctions/PR/PRViewV8.js
similarity index 90%
rename from CPRNIMS.WebApps/wwwroot/JsFunctions/PR/PRViewV7.js
rename to CPRNIMS.WebApps/wwwroot/JsFunctions/PR/PRViewV8.js
index 0d122b5..c0938e7 100644
--- a/CPRNIMS.WebApps/wwwroot/JsFunctions/PR/PRViewV7.js
+++ b/CPRNIMS.WebApps/wwwroot/JsFunctions/PR/PRViewV8.js
@@ -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: '',
+ render: function () {
+ return '';
+ },
+ orderable: false,
+ searchable: false
+ },
+ { data: 'itemNo' },
+ { data: 'itemName' },
+ { data: 'itemDescription' },
+ { data: 'itemCategoryName' },
+ { data: 'qty' },
+ ],
+ "columnDefs": [
+ {
+ "targets": [5],
+ "render": function (data, type, row) {
+ return '';
+ }
+ }
+ ],
+ 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');
@@ -817,8 +902,7 @@ function downloadPRAttachment() {
window.URL.revokeObjectURL(url);
})
.catch(error => {
- console.error("Error downloading attachment:", error);
- alert("Error downloading attachment. Please check if the file exists.");
+ showToast('error', error, 'Submission failed', 4000);
});
}
diff --git a/CPRNIMS.WebApps/wwwroot/JsFunctions/Receiving/ReceivingPostPutV2.js b/CPRNIMS.WebApps/wwwroot/JsFunctions/Receiving/ReceivingPostPutV3.js
similarity index 82%
rename from CPRNIMS.WebApps/wwwroot/JsFunctions/Receiving/ReceivingPostPutV2.js
rename to CPRNIMS.WebApps/wwwroot/JsFunctions/Receiving/ReceivingPostPutV3.js
index b4d4cc0..0999aab 100644
--- a/CPRNIMS.WebApps/wwwroot/JsFunctions/Receiving/ReceivingPostPutV2.js
+++ b/CPRNIMS.WebApps/wwwroot/JsFunctions/Receiving/ReceivingPostPutV3.js
@@ -6,7 +6,7 @@
Remarks = $('#remarks').val();
ItemList = [];
tableElement = $('#RRdataTable').DataTable();
- var isValid = true; // Flag to track validity
+ var isValid = true;
const drNoInput = document.getElementById('suppDocNo');
const docTypeIdInput = document.getElementById('docTypeId');
@@ -23,11 +23,11 @@
if (RRNo == 0) {
rrNoInput.classList.add('error-input');
- alert('RRNo cannot be 0!');
+ showToast('warning', 'RRNo cannot be 0!', 'Submission failed!', 4000);
}
if (!DRNo || !DocTypeId || !ReceivedDate || !RRNo) {
- alert('Please fill the required fields !');
+ showToast('warning', 'Please fill the required fields !', 'Submission failed!', 4000);
if (!DRNo) {
drNoInput.classList.add('error-input');
}
@@ -54,17 +54,17 @@
qtyReceived = parseFloat(qtyReceived);
// Ensure the value is valid (check for NaN)
- if (isNaN(qtyReceived) || qtyReceived <= 0 || qtyReceived === null) {
- alert('Invalid Quantity Received. Please provide a valid number.');
+ if (isNaN(parseFloat(qtyReceived)) || parseFloat(qtyReceived) <= 0 || parseFloat(qtyReceived) === null) {
+ showToast('warning', 'Invalid Quantity Received, Please provide a valid number.', 'Submission failed!', 4000);
qtyReceived = rowData.quantityReceived; // Default to original if invalid
}
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;
return false;
}
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;
return false;
}
@@ -79,7 +79,7 @@
return;
}
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;
}
@@ -221,24 +221,31 @@ function postPOClosing() {
}
}
function deleteSKUCodeRec(prDetailsId) {
- const confirmation = confirm('Are you sure you want to proceed?');
- if (confirmation) {
- var table = $('#RRdataTable').DataTable();
- var rowToRemove = null;
+ showConfirmation({
+ title: 'Remove Item',
+ message: 'Are you sure you want to remove this item? This action cannot be undone.',
+ type: 'danger',
+ confirmText: 'Yes',
+ cancelText: 'No'
+ }).then((confirmed) => {
+ if (confirmed) {
+ var table = $('#RRdataTable').DataTable();
+ var rowToRemove = null;
- table.rows().every(function (rowIdx) {
- var data = this.data();
- if (data && data.prDetailsId == prDetailsId) {
- rowToRemove = this;
- return false;
+ table.rows().every(function (rowIdx) {
+ var data = this.data();
+ if (data && data.prDetailsId == prDetailsId) {
+ rowToRemove = this;
+ 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);
}
- }
+ });
}
\ No newline at end of file