diff --git a/CHANGELOG.md b/CHANGELOG.md index fd0014a..9ad4ab1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,9 @@ ## Unreleased +- Áttekintő/Számlák: a Mai fókusz lejárt és közeli számlakártyái ugyanarra a számlalistára visznek, amelyből a darabszám és összeg készül; a számla modul külön Határidő szűrőt kapott. +- Áttekintő: a készpénzes számlák nem számítanak nyitott lejárt tételnek akkor sem, ha régi/importált adatban még fizetésre váró státusz maradt. + ## 0.3.6 - 2026-07-02 - Számla modul: új kimutatás panel a látható/szűrt lista bruttó, nyitott, fizetett, ÁFA, lejárt, kategória és fizetési mód bontásával. diff --git a/src/app.js b/src/app.js index fefdb5b..f5194d4 100644 --- a/src/app.js +++ b/src/app.js @@ -208,7 +208,7 @@ } return tasks.map(function (task) { return [ - '', '', @@ -360,7 +362,7 @@ var activeFilterCount = countActiveInvoiceFilters(context); var hasGlobalSearch = hasInvoiceGlobalSearch(context); var hasLocalSearch = hasInvoiceLocalSearch(); - var usesAllInvoices = hasGlobalSearch || hasLocalSearch || hasProjectQuickFilter() || hasPartnerQuickFilter(); + var usesAllInvoices = hasGlobalSearch || hasLocalSearch || hasProjectQuickFilter() || hasPartnerQuickFilter() || hasInvoiceDueFilter(); var totalBase = usesAllInvoices ? allInvoices.length : monthInvoices.length; var selectedCount = getSelectedInvoiceIds().length; var selectableCount = visibleInvoices.filter(function (invoice) { @@ -626,6 +628,12 @@ window.HRPlatform.notify(); }); + root.querySelector("#invoiceDueFilter").addEventListener("change", function (event) { + uiState.dueState = event.target.value; + uiState.selectedIds = {}; + window.HRPlatform.notify(); + }); + root.querySelectorAll("[data-column-filter]").forEach(function (input) { input.addEventListener("input", function () { uiState.filters[input.getAttribute("data-column-filter")] = input.value; @@ -1082,7 +1090,7 @@ } function getVisibleInvoices(context, invoices) { - var visible = hasInvoiceGlobalSearch(context) || hasInvoiceLocalSearch() || hasProjectQuickFilter() || hasPartnerQuickFilter() + var visible = hasInvoiceGlobalSearch(context) || hasInvoiceLocalSearch() || hasProjectQuickFilter() || hasPartnerQuickFilter() || hasInvoiceDueFilter() ? invoices.slice() : invoices.filter(function (invoice) { return getInvoiceMonth(invoice) === uiState.month; @@ -1110,6 +1118,10 @@ return Boolean(String(uiState.localSearch || "").trim()); } + function hasInvoiceDueFilter() { + return uiState.dueState !== "all"; + } + function countActiveInvoiceFilters(context) { var count = 0; if (context && String(context.searchTerm || "").trim()) { @@ -1124,6 +1136,9 @@ if (uiState.paymentMethod !== "all") { count += 1; } + if (uiState.dueState !== "all") { + count += 1; + } Object.keys(uiState.filters).forEach(function (key) { if (String(uiState.filters[key] || "").trim()) { count += 1; @@ -1135,6 +1150,7 @@ function clearInvoiceFilters() { uiState.status = "all"; uiState.paymentMethod = "all"; + uiState.dueState = "all"; uiState.localSearch = ""; uiState.filters = { date: "", @@ -1157,6 +1173,14 @@ return false; } + if (uiState.dueState === "overdue" && !isOverdue(invoice)) { + return false; + } + + if (uiState.dueState === "dueSoon" && !isDueSoon(invoice)) { + return false; + } + if (uiState.filters.date && !String(invoice.date || "").includes(uiState.filters.date)) { return false; } @@ -2006,6 +2030,11 @@ return dueDate < today; } + function isDueSoon(invoice) { + var days = daysUntilInvoiceDueDate(invoice); + return !isPaidInvoice(invoice) && days != null && days >= 0 && days <= 7; + } + function daysUntilInvoiceDueDate(invoice) { if (!invoice || !invoice.dueDate) { return null; @@ -2020,6 +2049,27 @@ return Math.ceil((dueDate - today) / 86400000); } + function applyLaunchAction(action) { + if (action !== "invoice-overdue" && action !== "invoice-due-soon") { + return; + } + + clearInvoiceFilters(); + uiState.dueState = action === "invoice-overdue" ? "overdue" : "dueSoon"; + uiState.compactMode = true; + uiState.editingId = ""; + uiState.selectedIds = {}; + uiState.sortKey = "dueDate"; + uiState.sortDirection = "asc"; + if (window.HRPlatform && window.HRPlatform.state) { + window.HRPlatform.state.searchTerm = ""; + var searchInput = document.getElementById("globalSearch"); + if (searchInput) { + searchInput.value = ""; + } + } + } + function statCard(label, value, detail) { return '

' + label + "

" + value + "

" + detail + "

"; } @@ -2068,6 +2118,22 @@ ); } + function dueStateSelect() { + var items = [ + { value: "all", label: "Összes határidő" }, + { value: "overdue", label: "Lejárt" }, + { value: "dueSoon", label: "7 napon belül" } + ]; + + return ( + '" + ); + } + function hAttr(value) { return window.HRPlatform.utils.escapeHtml(value); } @@ -2120,6 +2186,7 @@ render: render, afterRender: afterRender, exportRows: exportRows, + applyLaunchAction: applyLaunchAction, isCompact: function () { return uiState.compactMode; }