$(document).ready(function () {
loader = $('#overlay, #loader');
tableName = '#PODataTable';
totalSelectedLabel = $('#totalSelected');
tableElement = $(tableName);
poDataTable = $(tableName).DataTable({
initComplete: function () {
var api = this.api();
var data = api.ajax.json();
if (!data || !data.data || data.data === "No Data") {
$('.dataTables_empty').html("No record available");
toggleSubmitButton();
}
calculateTotalPesoAmount();
},
columns: colCustomPO,
columnDefs:colDefCustomPO,
language: {
emptyTable: "No items added yet"
}
});
});
async function fetchAndPopulatePOFormData(poType, poId = null) {
loader = $('#overlay, #loader').css('z-index', 1060);
return new Promise((resolve, reject) => {
$.ajax({
url: '/POMgmt/GetPOFormData',
type: 'GET',
data: { poId: poId },
beforeSend: function () {
loader.show();
},
complete: function () {
loader.hide();
},
success: function (response) {
const d = response;
document.getElementById("poType").value = poType;
$('#poNoFinal').val($('#poNo').val());
// --- Header Fields ---
if (d.header) {
document.getElementById("supplierName").value = d.header.supplierName || '';
$('#supplierId').val(d.header.supplierId || 0);
if (d.header?.deliveryDate) {
let deliveryDate = d.header.deliveryDate.split("T")[0];
$('#deliveryDate').val(deliveryDate);
}
if (d.header?.profInvoiceDate) {
let profInvoiceDate = d.header.profInvoiceDate.split("T")[0];
$('#piDate').val(profInvoiceDate);
}
$('#deliverTo').val(d.header.deliverTo || '');
$('#piNo').val(d.header.profInvoiceNo || '');
$('#currencyCER').val(d.header.currencyCER || '59.00');
$('#podId').val(d.header.podId || 0);
$('#shippingInstructionId').val(1);
$('#discount').val(d.header.discount || 0);
$('#C-paymentTerms').val(d.header.paymentTerms || '');
$('#C-paymentTermsId').val(d.header.paymentTermsId || 0);
$('#remarks').val(d.header.remarks || '');
$('#grossAmountUSD').val(d.header.grossAmountUSD || 0);
$('#finalAmountUSD').val(d.header.finalAmountUSD || 0);
$('#grossAmountPHP').val(d.header.grossAmountPHP || 0);
$('#finalAmountPHP').val(d.header.finalAmountPHP || 0);
$('#finalAmount').val(d.header.finalAmountPHP || 0);
$('#grossAmount').val(d.header.grossAmountPHP || 0);
$('#incoTermsId').val(d.header.incoTermsId);
$('#incotermsName').val(d.header.incotermsName || '');
}
// --- DataTable: Line Items ---
if (poDataTable) {
poDataTable.clear();
if (d.lineItems && d.lineItems.length > 0) {
poDataTable.rows.add(d.lineItems).draw();
}
}
// --- DataTable: Charges ---
if (d.charges && d.charges.length > 0) {
const $tbody = $('#DestChargesTable tbody');
$tbody.empty();
d.charges.forEach(function (charge) {
var newRow = '
' +
'| ' + charge.otherChargesId + ' | ' +
'' + charge.otherChargesName + ' | ' +
'' + charge.amount + ' | ' +
' | ' +
'
';
$tbody.append(newRow);
});
}
// --- Docs Required ---
if (d.docsRequired && d.docsRequired.length > 0) {
$('#docRequiredId').val(
d.docsRequired.map(x => x.docName).join('\n')
);
}
resolve();
},
error: function (xhr, status, error) {
console.error("Error loading PO form data:", error);
reject(error);
}
});
});
}
function enablePONoAutocomplete() {
clearCustomTable();
document.getElementById('customPOHeading').innerHTML = 'Custom P.O. Modification';
customFormPOElemComponent(4);
document.getElementById("poNo").removeAttribute("readonly");
document.getElementById("poNo").value ='';
document.getElementById("poNo").focus();
document.getElementById("poType").value = "0";
popPONo();
}
function clearCustomTable() {
poDataTable.clear().draw();
}
// =====================================================================
// UTILITIES
// =====================================================================
function getGrossFromTable() {
let gross = 0;
const table = $('#PODataTable').DataTable();
table.rows().every(function () {
const rowNode = this.node();
const cellText = $(rowNode).find('td').eq(8).text().replace(/,/g, '');
const val = parseFloat(cellText) || 0;
gross += val;
});
return gross;
}
function getChargesFromTable() {
let charges = 0;
$('#DestChargesTable tbody tr').each(function () {
const val = parseFloat($(this).find('td').eq(2).text().replace(/,/g, '')) || 0;
charges += val;
});
return charges;
}
function getDiscount() {
return parseFloat($('#discount').val()) || 0;
}
function getPoTypeId() {
return parseInt($('#poTypeId').val()) || 0;
}
function recalculateAll() {
const poTypeId = getPoTypeId();
const grossAmount = getGrossFromTable();
const chargesAmount = getChargesFromTable();
const discount = getDiscount();
const currencyCER = parseFloat($('#currencyCER').val()) || 1;
const grossAfterDiscount = grossAmount - parseFloat(discount.toFixed(4));
if (poTypeId === 3) {
const finalAmountUSD = grossAfterDiscount + chargesAmount;
const grossAmountPHP = grossAfterDiscount * currencyCER;
const finalAmountPHP = finalAmountUSD * currencyCER;
$('#grossAmountUSD').val(numberWithCommas(grossAfterDiscount.toFixed(4)));
$('#finalAmountUSD').val(numberWithCommas(finalAmountUSD.toFixed(4)));
$('#grossAmountPHP').val(numberWithCommas(grossAmountPHP.toFixed(4)));
$('#finalAmountPHP').val(numberWithCommas(finalAmountPHP.toFixed(4)));
// Hide PHP-only fields, show USD fields
$('#grossAmount, #finalAmount').val('');
} else if (poTypeId === 1 ) {
const vatRate = parseFloat($('#vatRate').val()) || 0;
const vatAmount = (vatRate / 100) * grossAfterDiscount;
const finalAmountPHP = grossAfterDiscount + vatAmount + chargesAmount;
$('#grossAmount').val(numberWithCommas(grossAfterDiscount.toFixed(4)));
$('#finalAmount').val(numberWithCommas(finalAmountPHP.toFixed(4)));
$('#grossAmountUSD, #finalAmountUSD, #grossAmountPHP, #finalAmountPHP').val('');
} else {
const finalAmount = grossAfterDiscount + chargesAmount;
$('#grossAmount').val(numberWithCommas(grossAfterDiscount.toFixed(4)));
$('#finalAmount').val(numberWithCommas(finalAmount.toFixed(4)));
$('#grossAmountUSD, #finalAmountUSD, #grossAmountPHP, #finalAmountPHP').val('');
}
}
// =====================================================================
// ROW-LEVEL: Update TotalAmount cell then trigger recalc
// =====================================================================
function bindTableInputEvents() {
$(tableName + ' tbody').on('input', '.unitPrice, .qty', function () {
const $row = $(this).closest('tr');
const qty = parseFloat($row.find('.qty').eq(0).val()) || 0;
const price = parseFloat($row.find('.unitPrice').eq(0).val()) || 0;
$row.find('td').eq(8).text((qty * price).toFixed(4));
recalculateAll();
});
}
// =====================================================================
// SECONDARY INPUT TRIGGERS
// =====================================================================
function bindSecondaryInputEvents() {
// Discount changed → recalculate
$('#discount').on('input', function () {
recalculateAll();
});
// VAT rate changed → recalculate (only relevant for POTypeId=1)
$('#vatRate').on('input', function () {
recalculateAll();
});
// Currency exchange rate changed → recalculate (only relevant for POTypeId=3)
$('#currencyCER').on('input', function () {
recalculateAll();
});
// PO Type changed → recalculate with new logic branch
$('#poTypeId').on('change', function () {
recalculateAll();
});
// Charges table changes → recalculate
$('#DestChargesTable').on('input change', function () {
recalculateAll();
});
}
// =====================================================================
// INIT — call on page load / form load
// =====================================================================
function initPOCalculations() {
bindTableInputEvents();
bindSecondaryInputEvents();
recalculateAll(); // Populate on load from existing data
}
// ─── Kept for backward compatibility if called elsewhere ────────────
function lessDiscount() { recalculateAll(); }
function calculateFinalPesoAmount() { recalculateAll(); }
function calculateFinalUsdAmount() { recalculateAll(); }
function calculateTotalPesoAmount() { bindTableInputEvents(); }
function calculateTotalUsdAmount() { bindTableInputEvents(); }