/* ===================================================== GLOBAL STATE ===================================================== */ let addedYears = []; /* ===================================================== INITIALIZE YEARS FROM DATABASE HEADERS ===================================================== */ document.addEventListener("DOMContentLoaded", () => { const headers = document.querySelectorAll("#tableHeader th"); headers.forEach(th => { if (th.innerText.startsWith("Utilized")) { const year = th.innerText.replace("Utilized", "").trim(); if (!addedYears.includes(year)) { addedYears.push(year); } } }); }); /* ===================================================== ADD YEAR COLUMN (DYNAMIC) ===================================================== */ function addYearColumn() { const yearSelect = document.getElementById("yearSelect"); const year = yearSelect.value; if (!year) { alert("Please select AY"); return; } if (addedYears.includes(year)) { alert("This AY is already added"); return; } addedYears.push(year); // Add header column const headerRow = document.getElementById("tableHeader"); const th = document.createElement("th"); th.innerText = "Utilized " + year; // Insert before Balance column headerRow.insertBefore(th, headerRow.children[headerRow.children.length - 2]); // Add input cells to all existing rows document.querySelectorAll("#matTable tbody tr").forEach(tr => { const td = document.createElement("td"); td.innerHTML = ``; tr.insertBefore(td, tr.children[tr.children.length - 2]); }); } /* ===================================================== ADD NEW ROW ===================================================== */ function addRow() { const tbody = document.querySelector("#matTable tbody"); const tr = document.createElement("tr"); let utilizedCols = ""; addedYears.forEach(() => { utilizedCols += ``; }); tr.innerHTML = ` ${utilizedCols} `; tbody.appendChild(tr); } /* ===================================================== SAVE SINGLE ROW ===================================================== */ function saveRow(btn) { const tr = btn.closest("tr"); const inputs = tr.querySelectorAll("input"); const financialYear = tr.children[0].innerText.trim(); if (!financialYear) { alert("AY is required"); return; } let payload = { financial_year: financialYear, mat_credit: inputs[0].value || 0, balance: inputs[inputs.length - 1].value || 0, utilization: [] }; addedYears.forEach((year, i) => { const value = inputs[i + 1].value; if (value) { payload.utilization.push({ year: year, amount: value }); } }); fetch("/save_mat_row", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(payload) }) .then(res => res.json().then(j => ({ ok: res.ok, data: j }))) .then(res => { if (res.ok) { alert("✅ " + res.data.message); } else { alert("⚠️ " + res.data.error); } }) .catch(() => { alert("Server error"); }); } /* ===================================================== SAVE ALL ROWS ===================================================== */ function saveAll() { let rows = []; document.querySelectorAll("#matTable tbody tr").forEach(tr => { const inputs = tr.querySelectorAll("input"); const financialYear = tr.children[0].innerText.trim(); if (!financialYear) return; let row = { financial_year: financialYear, mat_credit: inputs[0].value || 0, balance: inputs[inputs.length - 1].value || 0, utilization: [] }; addedYears.forEach((year, i) => { const value = inputs[i + 1].value; if (value) { row.utilization.push({ year: year, amount: value }); } }); rows.push(row); }); if (!rows.length) { alert("No data to save"); return; } fetch("/save_mat_all", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(rows) }) .then(res => res.json()) .then(res => { let msg = "✅ " + res.message; if (res.skipped && res.skipped.length) { msg += "\n\nSkipped AY:\n" + res.skipped.join(", "); } alert(msg); }) .catch(() => { alert("Server error"); }); }