/* * AGS 92 B2B – faktúry: upozornenie pred splatnosťou, upozornenie po splatnosti, blokácia objednávok (v2) * Súbor: /buxus/docs/splatnost2.js.txt (v3, predtým splatnost.js.txt) (načítaný v pätičke, Container 22 → Content after) * * Platí pre SK, CZ, HU. Na PL a COM beží len prepočet hlavičky, farby a filtre faktúr (žiadne upozornenia, žiadna blokácia). * * Nastavenie (bez zásahu do kódu): Pätička → Container 22 → Content after, riadok * * (záložne META title stránky 652538 „Blokácia objednávok – nastavenie (NEMAZAŤ)“ – načíta sa len bez presmerovania) * - prvé číslo = počet dní po splatnosti, od ktorého sa blokuje (7 = blokácia od 7. dňa po splatnosti) * - pred: N = koľko dní pred splatnosťou sa zobrazí modré upozornenie (predvolené 3) * - od: DD.MM.RRRR = (voliteľné) dátum, od ktorého je tvrdá blokácia aktívna; predtým sa ukazuje len oranžové upozornenie * - vynimky: a, b, c = (voliteľné) čísla faktúr, ktoré sa ignorujú, alebo názvy firiem (časť názvu z hlavičky účtu), * ktoré sa neblokujú (upozornenia vidia) * To isté sa dá napísať aj do textu stránky (v jazyku partnera). Ak sa stránka nedá načítať, platia predvolené hodnoty. * * Logika (pre jednu faktúru so splatnosťou D): * D-3 … D modré: pás na každej stránke + okno raz denne * D+1 … D+6 oranžové: pás + okno pri každom prihlásení a raz denne; objednávať sa dá, text bez termínu * od D+7 červené: pás + okno pri každom prihlásení; OBJEDNAŤ v Súhrne vypnuté, Import produktov do košíka vypnutý, * „Pokračovať“ v košíku vypnuté. Katalóg, košík a faktúry fungujú. * Posudzujú sa všetky nezaplatené faktúry (dobropisy sa ignorujú); rozhoduje najstaršia po splatnosti. * Ak sa stav faktúr nepodarí zistiť (výpadok), objednávka sa NEBLOKUJE (fail-open). * QR platba v okne: SK/CZ z PDF faktúry (skript faktury-nahlad.js); HU zatiaľ bez QR – zapne sa v faktury-nahlad.js (QR_MARKETS). * * Toto je blokácia v prehliadači partnera – ochrana proti omylu, nie proti úmyslu. Tvrdá blokácia patrí na server (ui42) alebo do Money. * * v3 (30. 9. 2026) – DOBIERKA: faktúra s formou úhrady „Dobierkou / Dobírkou / Utánvét (COD)“ (čítané z PDF cez * window.agsFaktura.payForm, skript faktury-nahlad3) nevyvoláva modré ani oranžové upozornenie, neblokuje a neponúka QR – * partner platí kuriérovi, peniaze dlhuje prepravca. Poistka: dobierka viac ako N dní po splatnosti (predvolené 60, * v nastavení „dobierka: N“) sa správa ako bežná faktúra. Neznáma / neprečítaná forma úhrady = bežná faktúra. * V hlavičke riadok „Dobierka – čaká na prepravcu“, v zozname faktúr označenie a filter „Dobierka“. */ (function () { 'use strict'; if (window.__agsSplatnostLoaded) return; window.__agsSplatnostLoaded = true; var SETTINGS_PAGE = 652538; var INVOICES_PAGE = 257; var DEFAULT_DAYS = 7; var DEFAULT_PRE_DAYS = 3; var CACHE_MIN = 20; // ako dlho platí zistený stav mimo Súhrnu objednávky (min) var PER_PAGE = 48; var MAX_PAGES = 20; var ENFORCE_LANGS = /^(sk|cz|hu)$/; // upozornenia + blokácia len tu; PL a COM nie var DEFAULT_COD_DAYS = 60; // dobierka sa ignoruje max. N dní po splatnosti (poistka pri neprevzatej zásielke) var COD_SYNC_MS = 25000; // max. čakanie na zistenie formy úhrady pri výpočte stavu (potom = bežná faktúra) var lang = (location.pathname.split('/')[1] || '').toLowerCase(); if (!/^(sk|cz|hu|pl|com)$/.test(lang)) return; var L = lang === 'com' ? 'en' : lang; var ENFORCE = ENFORCE_LANGS.test(lang); var firmaEl = document.querySelector('.header-basic-info h3'); if (!firmaEl) return; // neprihlásený – nič nerobiť (na prihlasovaciu stránku nikdy nesiahame) // ---------- texty (SK / CZ / HU; PL a EN len pre hlavičku a filtre) ---------- var UI = { sk: { inv: 'Faktúra', due: 'Splatnosť', unpaid: 'Nezaplatené', qr: 'QR platba', more: 'a ďalšie ({n})', list: 'Zobraziť moje faktúry', detail: 'Zobraziť celé upozornenie', close: 'Zavrieť', checking: 'Overujem stav faktúr…', sig: 'AGS 92 s.r.o. · B2B portál', qrLoading: 'Načítavam QR platbu…', qrTitle: 'QR platba', remaining: 'Zostáva uhradiť', iban: 'IBAN', vs: 'Variabilný symbol', save: 'Uložiť QR', copy: 'Kopírovať údaje', copied: 'Skopírované', scan: 'Naskenujte QR kód v mobilnej bankovej aplikácii.', noQr: 'Použite platobné údaje z faktúry.', pre: { title: 'Blíži sa splatnosť faktúry', bar: 'Faktúra {no} ({amt}) je splatná {due}. Uhraďte ju prosím včas – najrýchlejšie QR platbou.', body: '

Vážený obchodný partner,

dovoľujeme si Vás upozorniť, že faktúra {no} vo výške {amt} je splatná {due}. Na rýchlu úhradu môžete použiť QR platbu.

Ak ste platbu už odoslali, považujte prosím toto upozornenie za bezpredmetné.

' }, warn: { title: 'Faktúra po splatnosti', bar: 'Faktúra {no} ({amt}) je po splatnosti od {due}. Uhraďte ju prosím bezodkladne – v prípade neuhradenia bude zadávanie objednávok pozastavené.', body: '

Vážený obchodný partner,

k dnešnému dňu evidujeme neuhradenú faktúru {no} vo výške {amt}, splatnú {due}.

Žiadame Vás o jej bezodkladnú úhradu. V prípade neuhradenia bude v súlade s obchodnými podmienkami pozastavená možnosť zadávať objednávky na B2B portáli, a to až do vyrovnania záväzku. Na okamžitú úhradu použite QR platbu.

Ak ste faktúru už uhradili, platbu spárujeme do 2 pracovných dní a toto upozornenie zmizne. V prípade nejasností kontaktujte svojho obchodného zástupcu ({rep}).

Ďakujeme za korektnú spoluprácu.

' }, blocked: { title: 'Zadávanie objednávok pozastavené', bar: 'Z dôvodu neuhradenej faktúry {no} ({amt}, splatnosť {due}) je zadávanie objednávok pozastavené. Po pripísaní platby bude objednávanie automaticky obnovené.', body: '

Vážený obchodný partner,

faktúra {no} vo výške {amt}, splatná {due}, nebola uhradená. V súlade s obchodnými podmienkami sme preto pozastavili možnosť zadávať nové objednávky.

Objednávanie bude automaticky obnovené po pripísaní platby (spárovanie trvá do 2 pracovných dní). Na okamžitú úhradu použite QR platbu.

Katalóg, ceny a Vaše faktúry zostávajú dostupné. V prípade otázok kontaktujte svojho obchodného zástupcu ({rep}).

', note: 'Objednávku nie je možné odoslať – evidujeme faktúru po splatnosti. Po pripísaní platby bude objednávanie obnovené.', importTitle: 'Import produktov do košíka nie je k dispozícii', cartNote: 'Pokračovať v objednávke nie je možné – evidujeme faktúru po splatnosti.', sumHint: 'Naskenujte QR kód v bankovej aplikácii. Po pripísaní platby (do 2 pracovných dní) bude objednávanie obnovené, košík zostane uložený.' } }, cz: { inv: 'Faktura', due: 'Splatnost', unpaid: 'Neuhrazeno', qr: 'QR platba', more: 'a další ({n})', list: 'Zobrazit moje faktury', detail: 'Zobrazit celé upozornění', close: 'Zavřít', checking: 'Ověřuji stav faktur…', sig: 'AGS 92 s.r.o. · B2B portál', qrLoading: 'Načítám QR platbu…', qrTitle: 'QR platba', remaining: 'Zbývá uhradit', iban: 'IBAN', vs: 'Variabilní symbol', save: 'Uložit QR', copy: 'Kopírovat údaje', copied: 'Zkopírováno', scan: 'Naskenujte QR kód v mobilní bankovní aplikaci.', noQr: 'Použijte platební údaje z faktury.', pre: { title: 'Blíží se splatnost faktury', bar: 'Faktura {no} ({amt}) je splatná {due}. Uhraďte ji prosím včas – nejrychleji QR platbou.', body: '

Vážený obchodní partnere,

dovolujeme si Vás upozornit, že faktura {no} ve výši {amt} je splatná {due}. Pro rychlou úhradu můžete použít QR platbu.

Pokud jste platbu již odeslali, považujte prosím toto upozornění za bezpředmětné.

' }, warn: { title: 'Faktura po splatnosti', bar: 'Faktura {no} ({amt}) je po splatnosti od {due}. Uhraďte ji prosím neprodleně – v případě neuhrazení bude zadávání objednávek pozastaveno.', body: '

Vážený obchodní partnere,

k dnešnímu dni evidujeme neuhrazenou fakturu {no} ve výši {amt}, splatnou {due}.

Žádáme Vás o její neprodlenou úhradu. V případě neuhrazení bude v souladu s obchodními podmínkami pozastavena možnost zadávat objednávky na B2B portálu, a to až do vyrovnání závazku. Pro okamžitou úhradu použijte QR platbu.

Pokud jste fakturu již uhradili, platbu spárujeme do 2 pracovních dnů a toto upozornění zmizí. V případě nejasností kontaktujte svého obchodního zástupce ({rep}).

Děkujeme za korektní spolupráci.

' }, blocked: { title: 'Zadávání objednávek pozastaveno', bar: 'Z důvodu neuhrazené faktury {no} ({amt}, splatnost {due}) je zadávání objednávek pozastaveno. Po připsání platby bude objednávání automaticky obnoveno.', body: '

Vážený obchodní partnere,

faktura {no} ve výši {amt}, splatná {due}, nebyla uhrazena. V souladu s obchodními podmínkami jsme proto pozastavili možnost zadávat nové objednávky.

Objednávání bude automaticky obnoveno po připsání platby (spárování trvá do 2 pracovních dnů). Pro okamžitou úhradu použijte QR platbu.

Katalog, ceny a Vaše faktury zůstávají dostupné. V případě dotazů kontaktujte svého obchodního zástupce ({rep}).

', note: 'Objednávku nelze odeslat – evidujeme fakturu po splatnosti. Po připsání platby bude objednávání obnoveno.', importTitle: 'Import produktů do košíku není k dispozici', cartNote: 'V objednávce nelze pokračovat – evidujeme fakturu po splatnosti.', sumHint: 'Naskenujte QR kód v bankovní aplikaci. Po připsání platby (do 2 pracovních dnů) bude objednávání obnoveno, košík zůstane uložený.' } }, hu: { inv: 'Számla', due: 'Fizetési határidő', unpaid: 'Kiegyenlítetlen', qr: 'QR fizetés', more: 'és további ({n})', list: 'Számláim megtekintése', detail: 'Teljes értesítés', close: 'Bezárás', checking: 'Számlák ellenőrzése…', sig: 'AGS 92 s.r.o. · B2B portál', qrLoading: 'QR fizetés betöltése…', qrTitle: 'QR fizetés', remaining: 'Fizetendő', iban: 'IBAN', vs: 'Közlemény', save: 'QR mentése', copy: 'Adatok másolása', copied: 'Másolva', scan: 'Olvassa be a QR kódot a mobilbanki alkalmazásban.', noQr: 'Használja a számlán szereplő fizetési adatokat.', pre: { title: 'Közeleg a számla fizetési határideje', bar: 'A(z) {no} számla ({amt}) fizetési határideje {due}. Kérjük, egyenlítse ki időben.', body: '

Tisztelt Üzleti Partnerünk!

Tájékoztatjuk, hogy a(z) {no} számú, {amt} összegű számla fizetési határideje {due}.

Amennyiben az átutalást már elindította, kérjük, tekintse ezt az értesítést tárgytalannak.

' }, warn: { title: 'Lejárt fizetési határidejű számla', bar: 'A(z) {no} számla ({amt}) fizetési határideje {due} napján lejárt. Kérjük, haladéktalanul egyenlítse ki – kiegyenlítés hiányában a rendelésfeladás felfüggesztésre kerül.', body: '

Tisztelt Üzleti Partnerünk!

A mai napon a(z) {no} számú, {amt} összegű, {due} napján esedékes számla kiegyenlítetlenként szerepel nyilvántartásunkban.

Kérjük a számla haladéktalan kiegyenlítését. Kiegyenlítés hiányában az általános szerződési feltételekkel összhangban a B2B portálon a rendelésfeladás lehetősége a tartozás rendezéséig felfüggesztésre kerül.

Ha a számlát már kiegyenlítette, a befizetést 2 munkanapon belül párosítjuk, és ez az értesítés eltűnik. Kérdés esetén forduljon kereskedelmi képviselőjéhez ({rep}).

Köszönjük a korrekt együttműködést.

' }, blocked: { title: 'Rendelésfeladás felfüggesztve', bar: 'A(z) {no} számla ({amt}, esedékesség: {due}) kiegyenlítetlensége miatt a rendelésfeladás felfüggesztésre került. A befizetés beérkezése után a rendelés lehetősége automatikusan helyreáll.', body: '

Tisztelt Üzleti Partnerünk!

A(z) {no} számú, {amt} összegű, {due} napján esedékes számla nem került kiegyenlítésre. Az általános szerződési feltételekkel összhangban ezért felfüggesztettük az új rendelések feladásának lehetőségét.

A rendelésfeladás a befizetés beérkezése után automatikusan helyreáll (a párosítás legfeljebb 2 munkanapot vesz igénybe).

A katalógus, az árak és az Ön számlái továbbra is elérhetők. Kérdés esetén forduljon kereskedelmi képviselőjéhez ({rep}).

', note: 'A rendelés nem küldhető el – lejárt fizetési határidejű számlát tartunk nyilván. A befizetés beérkezése után a rendelés lehetősége helyreáll.', importTitle: 'A termékek kosárba importálása nem elérhető', cartNote: 'A rendelés nem folytatható – lejárt fizetési határidejű számlát tartunk nyilván.', sumHint: 'A befizetés beérkezése után (legfeljebb 2 munkanap) a rendelésfeladás helyreáll, a kosár tartalma megmarad.' } } }[L] || {}; // ---------- pomocné ---------- function hash(s) { var h = 0; for (var i = 0; i < s.length; i++) { h = ((h << 5) - h + s.charCodeAt(i)) | 0; } return (h >>> 0).toString(36); } function esc(s) { return String(s == null ? '' : s).replace(/[&<>"']/g, function (c) { return { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }[c]; }); } function today() { var d = new Date(); d.setHours(0, 0, 0, 0); return d; } function addDays(d, n) { var x = new Date(d.getTime()); x.setDate(x.getDate() + n); return x; } function fmt(d) { return ('0' + d.getDate()).slice(-2) + '.' + ('0' + (d.getMonth() + 1)).slice(-2) + '.' + d.getFullYear(); } function lsGet(k) { try { return JSON.parse(localStorage.getItem(k) || 'null'); } catch (e) { return null; } } function lsSet(k, v) { try { localStorage.setItem(k, JSON.stringify(v)); } catch (e) {} } function ssGet(k) { try { return sessionStorage.getItem(k); } catch (e) { return null; } } function ssSet(k, v) { try { sessionStorage.setItem(k, v); } catch (e) {} } function norm(s) { return String(s || '').toLowerCase().normalize ? String(s || '').toLowerCase().normalize('NFD').replace(/[\u0300-\u036f]/g, '') : String(s || '').toLowerCase(); } var MONTHS = { jan: 1, feb: 2, mar: 3, apr: 4, may: 5, jun: 6, jul: 7, aug: 8, sep: 9, oct: 10, nov: 11, dec: 12 }; function parseDate(s) { s = (s || '').trim(); var m = s.match(/^(\d{1,2})\.\s*([A-Za-z]{3}|\d{1,2})\.?\s*(\d{4})/); if (m) { var mo = /\d/.test(m[2]) ? +m[2] : MONTHS[m[2].toLowerCase()]; if (mo) return new Date(+m[3], mo - 1, +m[1]); } m = s.match(/^(\d{4})[.\-\/]\s*(\d{1,2})[.\-\/]\s*(\d{1,2})/); if (m) return new Date(+m[1], +m[2] - 1, +m[3]); return null; } function parseAmount(s) { s = (s || '').replace(/[^\d,.\-]/g, ''); if (s.indexOf(',') > -1 && s.indexOf('.') > -1) s = s.replace(/,/g, ''); else s = s.replace(',', '.'); var v = parseFloat(s); return isNaN(v) ? 0 : v; } var hdrTxt = (document.querySelector('.header-basic-info') || {}).textContent || ''; var emailM = (hdrTxt.match(/[\w.+-]+@[\w.-]+\.\w+/) || [''])[0]; // kontakt na OZ = prvý @ags92.com e-mail v hlavičke účtu; ak účet OZ nemá, v texte ostane len „kontaktujte svojho obchodného zástupcu“ bez adresy var repMail = (((document.querySelector('header') || document.body).textContent || '').match(/[\w.+-]+@ags92\.com/) || [''])[0]; var FIRMA = firmaEl.textContent.trim(); var ACC = hash(FIRMA + '|' + emailM); var CACHE_KEY = 'ags_splat_' + lang + '_' + ACC; var base = '/' + lang + '/buxus/generate_page.php?page_id='; // ---------- nastavenie ---------- function parseSettings(text) { var t = norm(text); var days = parseInt((t.match(/(\d+)/) || [''])[1], 10); var pre = parseInt((t.match(/pred\w*\s*[:=]\s*(\d+)/) || [''])[1], 10); var from = (t.match(/\bod\s*[:=]\s*(\d{1,2}\.\d{1,2}\.\d{4})/) || [''])[1]; var exM = t.match(/v[yý]nimk\w*\s*[:=]\s*([^|\n<]+)/); var ex = exM ? exM[1].split(/[,;]/).map(function (x) { return x.trim(); }).filter(function (x) { return x.length >= 3; }) : []; var cod = parseInt((t.match(/dobierk\w*\s*[:=]\s*(\d+)/) || [''])[1], 10); return { days: isNaN(days) ? DEFAULT_DAYS : days, pre: isNaN(pre) ? DEFAULT_PRE_DAYS : pre, from: from || '', ex: ex, cod: isNaN(cod) ? DEFAULT_COD_DAYS : cod }; } function loadSettings() { // 1) nastavenie z pätičky (Container 22: ) – bez requestu, bez jazyka if (typeof window.agsSplatSettings === 'string' && window.agsSplatSettings.trim()) { var s0 = parseSettings(window.agsSplatSettings); s0.ok = true; return Promise.resolve(s0); } // 2) stránka 652538 – len ak sa vráti priamo (presmerovanie na alias inej jazykovej mutácie by partnera odhlásilo, preto sa nesleduje) return fetch(base + SETTINGS_PAGE, { credentials: 'same-origin', redirect: 'manual' }).then(function (r) { if (r.type === 'opaqueredirect' || !r.ok) throw new Error('settings-redirect'); return r.text(); }).then(function (h) { var d = new DOMParser().parseFromString(h, 'text/html'); var c = d.querySelector('main .content'); var s = parseSettings((d.title || '') + ' | ' + (c ? c.textContent : '')); s.ok = true; return s; }).catch(function () { var s = parseSettings(''); s.ok = false; return s; }); } function loadInvoicePage(p) { var fd = new FormData(); fd.append('date_from', '01.01.2000'); fd.append('date_to', ''); fd.append('sort_by', 'unpaid'); fd.append('summary_filter_box_form', 'Zobraz'); return fetch(base + INVOICES_PAGE + '&results_per_page=' + PER_PAGE + '&page=' + p, { method: 'POST', body: fd, credentials: 'same-origin' }) .then(function (r) { return r.text(); }) .then(function (h) { var d = new DOMParser().parseFromString(h, 'text/html'); if (!d.querySelector('.header-basic-info h3')) throw new Error('not-logged'); if (!d.querySelector('[name="date_from"]')) throw new Error('no-invoice-page'); var rows = [].slice.call(d.querySelectorAll('table tr')).filter(function (r) { return r.querySelectorAll('td').length >= 8; }); return rows.map(function (r) { var c = r.cells; var pdfA = r.querySelector('a[href*="invoice_id="]'); return { no: c[0].textContent.trim(), pdf: pdfA ? pdfA.href : '', due: c[3].textContent.trim(), unpaidTxt: c[7].textContent.trim(), unpaid: parseAmount(c[7].textContent), credit: /dobropis/i.test(r.className) }; }); }); } function loadInvoices() { var all = []; function next(p) { return loadInvoicePage(p).then(function (rows) { all = all.concat(rows); var last = rows[rows.length - 1]; // zoradené podľa nezaplatenej sumy zostupne → ďalšia strana len ak sú na tejto ešte nezaplatené if (rows.length >= PER_PAGE && last && last.unpaid > 0 && p < MAX_PAGES) return next(p + 1); return all; }); } return next(1); } // forma úhrady (zdieľaná cache so skriptom faktury-nahlad3) function fx0() { return window.agsFaktura || null; } function formOf(no) { var f = fx0(); return f && f.payFormCached ? f.payFormCached(no) : ''; } function codDays(s) { return s && s.cod != null ? s.cod : DEFAULT_COD_DAYS; } // dobierka „chránená“ = COD a nie je viac ako N dní po splatnosti function codProtected(no, due, s) { return formOf(no) === 'cod' && !(due && today() > addDays(due, codDays(s))); } // zistí formu úhrady pre zadané faktúry (postupne, s časovým limitom); čo sa nestihne, ostane „neznáme“ = bežná faktúra function detectForms(list, ms) { var f = fx0(); if (!f || !f.payForm) return Promise.resolve(); var todo = list.filter(function (i) { return i.pdf && !formOf(i.no); }); var stop = Date.now() + (ms || COD_SYNC_MS); function next(k) { if (k >= todo.length || Date.now() > stop) return Promise.resolve(); return f.payForm(todo[k].pdf, todo[k].no).catch(function () {}).then(function () { return next(k + 1); }); } return next(0); } function evaluate(invoices, s) { var t = today(), overdue = [], upcoming = []; var sums = { unpaidCount: 0, unpaidSum: 0, overdueCount: 0, overdueSum: 0, codCount: 0, codSum: 0, codOverdueCount: 0, codOverdueSum: 0, cur: '', dec: 2 }; var exInv = {}, firmExempt = false, nf = norm(FIRMA); (s.ex || []).forEach(function (x) { exInv[norm(x)] = 1; if (nf.indexOf(norm(x)) > -1) firmExempt = true; }); invoices.forEach(function (i) { if (i.credit || !(i.unpaid > 0)) return; sums.unpaidCount++; sums.unpaidSum += i.unpaid; if (!sums.cur) { sums.cur = (i.unpaidTxt.match(/[^\d\s.,\-]+\.?$/) || [''])[0]; sums.dec = /[.,]\d{2}\s*\D*$/.test(i.unpaidTxt) ? 2 : 0; } var due = parseDate(i.due); if (!due) return; var rec = { no: i.no, pdf: i.pdf || '', due: fmt(due), dueTs: due.getTime(), unpaidTxt: i.unpaidTxt }; if (formOf(i.no) === 'cod') rec.cod = true; if (codProtected(i.no, due, s)) { // dobierka: bez upozornenia a bez blokácie, v hlavičke zvlášť sums.codCount++; sums.codSum += i.unpaid; if (t > due) { sums.codOverdueCount++; sums.codOverdueSum += i.unpaid; } return; } if (t > due) { sums.overdueCount++; sums.overdueSum += i.unpaid; if (!exInv[norm(i.no)]) overdue.push(rec); } else if (due.getTime() <= addDays(t, s.pre).getTime() && !exInv[norm(i.no)]) upcoming.push(rec); }); overdue.sort(function (a, b) { return a.dueTs - b.dueTs; }); upcoming.sort(function (a, b) { return a.dueTs - b.dueTs; }); if (overdue.length) { var blockDate = addDays(new Date(overdue[0].dueTs), s.days); var fromD = s.from ? parseDate(s.from) : null; var active = !fromD || t >= fromD; var blocked = t >= blockDate && active && !firmExempt; return { state: blocked ? 'blocked' : 'warn', list: overdue, sums: sums, blockDate: fmt(blockDate) }; } if (upcoming.length) return { state: 'pre', list: upcoming, sums: sums }; return { state: 'ok', list: [], sums: sums }; } function getStatus(fresh) { var c = lsGet(CACHE_KEY); if (!fresh && c && c.v === 4 && c.t && (Date.now() - c.t) < CACHE_MIN * 60000 && c.day === fmt(today())) return Promise.resolve(c); var settingsP = (c && c.v === 4 && c.settings && c.settings.ok && (Date.now() - c.t) < CACHE_MIN * 60000) ? Promise.resolve(c.settings) : loadSettings(); return Promise.all([settingsP, loadInvoices()]).then(function (res) { var s = res[0], invs = res[1], t = today(), lim = addDays(t, s.pre); var unpaid = invs.filter(function (i) { return !i.credit && i.unpaid > 0 && parseDate(i.due); }); // najprv faktúry, ktoré ovplyvňujú upozornenie/blokáciu (po splatnosti alebo v okne „pred“), ostatné nezaplatené na pozadí var urgent = unpaid.filter(function (i) { return parseDate(i.due) <= lim; }); return detectForms(urgent).then(function () { var out = build(s, invs); var rest = unpaid.filter(function (i) { return !formOf(i.no); }); if (rest.length) detectForms(rest, 120000).then(function () { var o2 = build(s, invs); patchHeader(o2); if (invForm) { colorRows(); refilter(); } }); return out; }); }); function build(s, invs) { var ev = evaluate(invs, s); var out = { v: 4, t: Date.now(), day: fmt(today()), settings: s, state: ev.state, list: ev.list, sums: ev.sums, blockDate: ev.blockDate || '' }; lsSet(CACHE_KEY, out); return out; } } // ---------- zobrazenie (pás, okno, QR) ---------- var CSS = '' + '.ags-splat-bar{margin:0;padding:12px 16px;font:14px/1.45 Arial,Helvetica,sans-serif;color:#fff;position:relative;z-index:50}' + '.ags-splat-bar.pre{background:#1f5f8b}.ags-splat-bar.warn{background:#d9822b}.ags-splat-bar.blocked{background:#c0392b}' + '.ags-splat-bar .in{max-width:1170px;margin:0 auto}' + '.ags-splat-bar b.t{font-size:15px;display:block;margin-bottom:2px}' + '.ags-splat-bar table{border-collapse:collapse;margin:6px 0;background:rgba(255,255,255,.12)}' + '.ags-splat-bar td,.ags-splat-bar th{padding:2px 12px 2px 0;text-align:left;font-size:13px;color:#fff}' + '.ags-splat-bar td:first-child,.ags-splat-bar th:first-child{padding-left:8px}' + '.ags-splat-bar a{color:#fff;text-decoration:underline;margin-right:16px;cursor:pointer}' + '.ags-splat-md a.ags-splat-qr{color:#1c84c6;cursor:pointer;font-weight:bold;white-space:nowrap}.ags-splat-bar a.ags-splat-qr{margin:0;font-weight:bold}' + '.ags-splat-ov{position:fixed;inset:0;background:rgba(0,0,0,.5);z-index:100000;display:flex;align-items:center;justify-content:center;padding:16px}' + '.ags-splat-md{background:#fff;color:#222;max-width:820px;width:100%;max-height:92vh;overflow:auto;border-radius:6px;box-shadow:0 10px 40px rgba(0,0,0,.3);font:14px/1.5 Arial,Helvetica,sans-serif}' + '.ags-splat-md h3{margin:0;padding:14px 20px;color:#fff;font-size:17px}' + '.ags-splat-md.pre h3{background:#1f5f8b}.ags-splat-md.warn h3{background:#d9822b}.ags-splat-md.blocked h3{background:#c0392b}' + '.ags-splat-md .bd{padding:16px 20px}.ags-splat-md .cols{display:flex;gap:22px;align-items:flex-start;flex-wrap:wrap}.ags-splat-md .cols .txt{flex:1 1 320px;min-width:0}' + '.ags-splat-md table{border-collapse:collapse;width:100%;margin:10px 0}' + '.ags-splat-md td,.ags-splat-md th{border-bottom:1px solid #eee;padding:4px 6px;text-align:left;font-size:13px}' + '.ags-splat-md .sig{margin-top:12px;color:#555;font-size:13px}' + '.ags-splat-md .ft{padding:0 20px 16px;text-align:right}' + '.ags-splat-md .ft a,.ags-splat-md .ft button{display:inline-block;margin-left:8px;padding:7px 14px;border-radius:4px;border:0;font-size:13px;cursor:pointer;text-decoration:none}' + '.ags-splat-md .ft a{background:#1c84c6;color:#fff}.ags-splat-md .ft button{background:#e5e5e5;color:#222}' + '.ags-splat-qrbox{flex:0 0 232px;background:#f6f8fa;border:1px solid #e1e5ea;border-radius:6px;padding:12px;text-align:center;font:12px/1.4 Arial,Helvetica,sans-serif;color:#333}' + '.ags-splat-qrbox img{width:190px;height:190px;image-rendering:pixelated;border:1px solid #ddd;background:#fff;border-radius:4px}' + '.ags-splat-qrbox .amt{font-size:18px;font-weight:bold;margin:6px 0 2px;color:#222}.ags-splat-qrbox .lbl{color:#666;font-size:11px;text-transform:uppercase;letter-spacing:.04em}' + '.ags-splat-qrbox .pr{margin:6px 0 0;text-align:left}.ags-splat-qrbox code{font-size:12px;background:#fff;border:1px solid #e1e5ea;border-radius:3px;padding:1px 4px;display:inline-block;margin-top:2px;word-break:break-all}' + '.ags-splat-qrbox .btns{margin-top:8px;display:flex;gap:6px;justify-content:center;flex-wrap:wrap}' + '.ags-splat-qrbox .btns a{background:#1c84c6;color:#fff;border-radius:4px;padding:5px 9px;font-size:12px;text-decoration:none;cursor:pointer}.ags-splat-qrbox .btns a.sec{background:#e5e5e5;color:#222}' + '.ags-splat-qrbox .msg{color:#666;padding:20px 0}.ags-splat-qrbox .warn{color:#c0392b;margin-top:4px}' + '.ags-splat-note{clear:both;display:block;margin:8px 0 0;padding:10px 12px;background:#fdecea;color:#c0392b;border:1px solid #f5c6cb;border-radius:4px;font-weight:bold;text-align:left}' + '.ags-splat-note.chk{background:#f4f4f4;color:#555;border-color:#ddd;font-weight:normal}' + '.ags-splat-note .ags-splat-qrbox{flex:none;display:inline-block;vertical-align:top;margin:10px 0 0;text-align:center;font-weight:normal;color:#333}' + '.ags-splat-note .hint{display:block;margin-top:6px;font-weight:normal;color:#555}' + '.ags-splat-import{padding:18px;background:#fdecea;border:1px solid #f5c6cb;border-radius:6px;color:#222;font:14px/1.5 Arial,Helvetica,sans-serif;margin:10px 0}' + '.ags-splat-import b{color:#c0392b;display:block;margin-bottom:6px}.ags-splat-import table td,.ags-splat-import table th{padding:2px 12px 2px 0;font-size:13px;text-align:left}' + '.ags-splat-off{opacity:.45!important;cursor:not-allowed!important;pointer-events:none!important}'; function injectCss() { if (document.getElementById('ags-splat-css')) return; var s = document.createElement('style'); s.id = 'ags-splat-css'; s.textContent = CSS; document.head.appendChild(s); } function T(st) { return UI[st.state] || UI.warn; } function fill(s, inv) { return String(s).replace(/\{no\}/g, inv.no).replace(/\{amt\}/g, inv.unpaidTxt).replace(/\{due\}/g, inv.due).replace(/\s*\(\{rep\}\)/g, repMail ? ' (' + repMail + ')' : ''); } function fx() { return window.agsFaktura || null; } function qrMarket() { var f = fx(); return !!(f && f.qrMarket && f.getPayment); } // QR platba / náhľad – ak beží skript faktury-nahlad.js.txt (window.agsFaktura) function invTable(st, max) { var hasFx = !!(fx() && fx().openQR) && qrMarket(); var rows = st.list.slice(0, max).map(function (i) { var act = hasFx && i.pdf && !i.cod ? '' + esc(UI.qr) + '' : ''; return '' + esc(i.no) + '' + esc(i.due) + '' + esc(i.unpaidTxt) + '' + act + ''; }).join(''); var more = st.list.length > max ? '' + esc(UI.more.replace('{n}', st.list.length - max)) + '' : ''; return '' + (hasFx ? '' : '') + '' + rows + more + '
' + UI.inv + '' + UI.due + '' + UI.unpaid + '
'; } function bindQr(root) { [].forEach.call(root.querySelectorAll('a.ags-splat-qr'), function (a) { a.addEventListener('click', function (e) { e.preventDefault(); fx().openQR(a.getAttribute('data-pdf'), a.getAttribute('data-no'), a.getAttribute('data-amt')); }); }); } // blok QR platba (obrázok z PDF faktúry + IBAN/VS + Uložiť/Kopírovať) – len SK/CZ (agsFaktura.qrMarket), inak nič function qrBox(inv) { if (!qrMarket() || !inv || !inv.pdf || inv.cod) return null; var box = document.createElement('div'); box.className = 'ags-splat-qrbox'; box.innerHTML = '
' + esc(UI.qrTitle) + '
' + esc(UI.qrLoading) + '
'; fx().getPayment(inv.pdf).then(function (info) { var h = '
' + esc(UI.qrTitle) + '
'; if (info.qr) h += 'QR'; else h += '
' + esc(UI.noQr) + '
'; h += '
' + esc(UI.remaining) + '
' + esc(inv.unpaidTxt) + '
'; var partial = info.totalTxt && Math.abs(parseAmount(info.totalTxt) - parseAmount(inv.unpaidTxt)) > 0.005; if (partial && fx().labels && fx().labels.partial) h += '
' + esc(fx().labels.partial) + '
'; var acc = info.iban || info.account || '', vs = info.vs || ''; if (acc) h += '
' + esc(UI.iban) + '
' + esc(acc) + '
'; if (vs) h += '
' + esc(UI.vs) + '
' + esc(vs) + '
'; h += '
' + (info.qr ? '' + esc(UI.save) + '' : '') + (acc ? '' + esc(UI.copy) + '' : '') + '
'; box.innerHTML = h; var cp = box.querySelector('a.cp'); if (cp) cp.addEventListener('click', function () { var txt = UI.iban + ': ' + acc + (vs ? '\n' + UI.vs + ': ' + vs : '') + '\n' + UI.remaining + ': ' + inv.unpaidTxt + '\n' + UI.inv + ': ' + inv.no; var done = function () { cp.textContent = UI.copied; setTimeout(function () { cp.textContent = UI.copy; }, 1500); }; if (navigator.clipboard && navigator.clipboard.writeText) navigator.clipboard.writeText(txt).then(done, done); else { var ta = document.createElement('textarea'); ta.value = txt; document.body.appendChild(ta); ta.select(); try { document.execCommand('copy'); } catch (e) {} ta.remove(); done(); } }); }).catch(function () { box.innerHTML = '
' + esc(UI.qrTitle) + '
' + esc(UI.noQr) + '
'; }); return box; } function showBar(st) { var old = document.getElementById('ags-splat-bar'); if (old) old.remove(); if (st.state === 'ok' || !st.list.length) return; var t = T(st), inv = st.list[0]; var bar = document.createElement('div'); bar.id = 'ags-splat-bar'; bar.className = 'ags-splat-bar ' + st.state; bar.setAttribute('role', 'alert'); bar.innerHTML = '
' + esc(t.title) + '' + esc(fill(t.bar, inv)) + invTable(st, 5) + '' + UI.list + '' + UI.detail + '
'; bar.querySelector('.ags-splat-open').addEventListener('click', function () { showModal(st); }); bindQr(bar); document.body.insertBefore(bar, document.body.firstChild); } function showModal(st) { if (document.getElementById('ags-splat-ov') || st.state === 'ok' || !st.list.length) return; var t = T(st), inv = st.list[0]; var ov = document.createElement('div'); ov.id = 'ags-splat-ov'; ov.className = 'ags-splat-ov'; ov.innerHTML = ''; var q = qrBox(inv); if (q) ov.querySelector('.cols').appendChild(q); function close() { ov.remove(); } ov.querySelector('.ft button').addEventListener('click', close); ov.addEventListener('click', function (e) { if (e.target === ov) close(); }); bindQr(ov); document.body.appendChild(ov); } // ---------- blokácia: Súhrn objednávky, Import produktov, košík ---------- var summaryForm = !ENFORCE ? null : (function () { var h = document.querySelector('input[name="b2_b_summary_form"]'); return h ? h.form || h.closest('form') : null; })(); var submitState = 'checking'; var note = null; function setNote(cls, txt, st) { if (!summaryForm) return; if (!note) { note = document.createElement('div'); summaryForm.appendChild(note); } note.className = 'ags-splat-note ' + cls; note.innerHTML = esc(txt); if (st && st.state === 'blocked' && st.list.length) { var q = qrBox(st.list[0]); if (q) { note.appendChild(q); } var hint = document.createElement('span'); hint.className = 'hint'; hint.textContent = UI.blocked.sumHint; note.appendChild(hint); } note.style.display = txt ? '' : 'none'; } function setButtons(disabled) { if (!summaryForm) return; [].forEach.call(summaryForm.querySelectorAll('input[type=submit],button[type=submit],button:not([type])'), function (b) { b.disabled = disabled; b.style.opacity = disabled ? '.45' : ''; b.style.cursor = disabled ? 'not-allowed' : ''; }); } if (summaryForm) { setButtons(true); setNote('chk', UI.checking); summaryForm.addEventListener('submit', function (e) { if (submitState !== 'ok') { e.preventDefault(); e.stopImmediatePropagation(); if (submitState === 'blocked') { var c = lsGet(CACHE_KEY); if (c) showModal(c); } } }, true); } // Import produktov do košíka: formulár skryť, namiesto neho blok s faktúrou function blockImport(st) { var main = document.querySelector('main') || document.body; var inp = main.querySelector('form input[type=file]'); var form = inp ? inp.closest('form') : null; if (!form || form.__agsBlocked) return; form.__agsBlocked = true; form.style.display = 'none'; var d = document.createElement('div'); d.className = 'ags-splat-import'; d.innerHTML = '' + esc(UI.blocked.importTitle) + '' + esc(fill(UI.blocked.bar, st.list[0])) + invTable(st, 5); bindQr(d); form.parentNode.insertBefore(d, form); } // Košík: tlačidlo/odkaz „Pokračovať“ na ďalší krok vypnúť (len na stránke košíka) function blockCart(st) { if (!/\/(obsah-kosika|kosar-tartalma|kosar|cart)\/?$/i.test(location.pathname)) return; var main = document.querySelector('main') || document.body; var els = [].filter.call(main.querySelectorAll('a,button,input[type=submit],input[type=button]'), function (el) { if (el.closest('#ags-splat-bar,.ags-splat-ov,header,nav,aside,li,.header-basic-info')) return false; var txt = norm(el.tagName === 'INPUT' ? el.value : el.textContent); var href = norm(el.getAttribute('href') || ''); return /pokracov|tovabb|continue/.test(txt) || /dodacie|dodaci|szallit|delivery/.test(href); }); if (!els.length) return; els.forEach(function (el) { if (el.__agsBlocked) return; el.__agsBlocked = true; el.classList.add('ags-splat-off'); el.setAttribute('aria-disabled', 'true'); if (el.tagName === 'A') { el.__agsHref = el.getAttribute('href'); el.removeAttribute('href'); } else el.disabled = true; }); if (!main.querySelector('.ags-splat-note.cart')) { var n = document.createElement('div'); n.className = 'ags-splat-note cart'; n.textContent = UI.blocked.cartNote; var last = els[els.length - 1]; (last.parentNode || main).appendChild(n); } } function applyBlocks(st) { if (!ENFORCE || st.state !== 'blocked') return; blockImport(st); blockCart(st); } // ---------- hlavička + zoznam faktúr: prepočet, farby, filtre ---------- var FUI = { sk: { cod: 'Dobierka', codHdr: 'Dobierka – čaká na prepravcu', all: 'Všetky', paid: 'Zaplatené', unpaid: 'V splatnosti', overdue: 'Po splatnosti', due: 'V splatnosti', credit: 'Dobropis', none: 'Pre tento filter nie sú žiadne faktúry.', more: 'Zobrazených je prvých {n} nezaplatených faktúr – ďalšie nájdete na ďalšej strane.', paidNote: 'Filter „Zaplatené“ platí pre práve zobrazenú stranu a obdobie.' }, cz: { cod: 'Dobírka', codHdr: 'Dobírka – čeká na dopravce', all: 'Všechny', paid: 'Zaplacené', unpaid: 'Ve splatnosti', overdue: 'Po splatnosti', due: 'Ve splatnosti', credit: 'Dobropis', none: 'Pro tento filtr nejsou žádné faktury.', more: 'Zobrazeno je prvních {n} nezaplacených faktur – další najdete na další straně.', paidNote: 'Filtr „Zaplacené“ platí pro právě zobrazenou stranu a období.' }, hu: { cod: 'Utánvét', codHdr: 'Utánvét – a futárcégre vár', all: 'Összes', paid: 'Kifizetett', unpaid: 'Nem lejárt', overdue: 'Lejárt', due: 'Nem lejárt', credit: 'Jóváírás', none: 'Ehhez a szűrőhöz nincs számla.', more: 'Az első {n} kifizetetlen számla látható – a többi a következő oldalon.', paidNote: 'A „Kifizetett” szűrő az aktuális oldalra és időszakra vonatkozik.' }, pl: { cod: 'Za pobraniem', codHdr: 'Pobranie – oczekuje na przewoźnika', all: 'Wszystkie', paid: 'Opłacone', unpaid: 'W terminie', overdue: 'Po terminie', due: 'W terminie', credit: 'Korekta', none: 'Brak faktur dla tego filtra.', more: 'Wyświetlono pierwsze {n} nieopłaconych faktur – kolejne na następnej stronie.', paidNote: 'Filtr „Opłacone” dotyczy bieżącej strony i okresu.' }, en: { cod: 'Cash on delivery', codHdr: 'COD – awaiting carrier', all: 'All', paid: 'Paid', unpaid: 'Not yet due', overdue: 'Overdue', due: 'Not yet due', credit: 'Credit note', none: 'No invoices match this filter.', more: 'The first {n} unpaid invoices are shown – see the next page for more.', paidNote: 'The “Paid” filter applies to the current page and period.' } }[L]; var FILTER_KEY = 'ags_inv_filter'; var FILTER_SUBMIT_KEY = 'ags_inv_filter_submitted'; var FROM_ALL = '01.01.2000'; var CSS2 = '' + 'tr.ags-inv-paid>td:not(:last-child){color:#1e7e34!important}' + 'tr.ags-inv-due>td:not(:last-child){color:#d9822b!important}' + 'tr.ags-inv-overdue>td:not(:last-child){color:#c0392b!important;font-weight:bold}' + 'tr.ags-inv-hidden,tr.ags-inv-hidden+tr.ags-inv-detail{display:none!important}' + '.ags-inv-filters{clear:both;display:block;width:100%;float:none;box-sizing:border-box;padding:18px 15px 6px;margin:0;font:13px/1.4 Arial,Helvetica,sans-serif}' + '.ags-inv-filters a{float:none!important;position:static!important;display:inline-block;margin:0 6px 6px 0;padding:5px 12px;border:1px solid #c9d6e2;border-radius:14px;background:#fff;color:#333;cursor:pointer;text-decoration:none}' + '.ags-inv-filters a.ags-on{background:#1c84c6;border-color:#1c84c6;color:#fff}' + '.ags-inv-filters i{display:inline-block;width:9px;height:9px;border-radius:50%;margin-right:6px;vertical-align:0}' + '.header-invoices .row.ags-h-paid,.header-invoices .row.ags-h-paid *{color:#1e7e34!important}' + '.header-invoices .row.ags-h-unpaid,.header-invoices .row.ags-h-unpaid *{color:#d9822b!important}' + '.header-invoices .row.ags-h-overdue,.header-invoices .row.ags-h-overdue *{color:#c0392b!important;font-weight:bold}' + '.header-invoices .row a{cursor:pointer}' + '.ags-inv-msg{padding:4px 0 0;color:#555;font-style:italic}' + 'tr.ags-inv-cod>td:not(:last-child){color:#4a5a6a!important}' + '.ags-cod-b{display:inline-block;margin-left:6px;padding:0 6px;border-radius:9px;background:#e8eef4;color:#4a5a6a;font-size:11px;font-weight:bold;white-space:nowrap}' + '.header-invoices .row.ags-h-cod,.header-invoices .row.ags-h-cod *{color:#4a5a6a!important}'; var DOT = { paid: '#1e7e34', due: '#d9822b', overdue: '#c0392b', credit: '#0000aa', unpaid: '#d9822b', cod: '#4a5a6a', all: '#999' }; function injectCss2() { if (document.getElementById('ags-splat-css2')) return; var s = document.createElement('style'); s.id = 'ags-splat-css2'; s.textContent = CSS2; document.head.appendChild(s); } function fmtMoney(v, cur, dec) { var s = v.toFixed(dec), parts = s.split('.'); parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ' '); return parts.join('.') + (cur ? ' ' + cur : ''); } function invoicesHref() { var a = document.querySelector('.header-invoices h4 a, .header-invoices a'); return a ? a.getAttribute('href').split('#')[0] : base + INVOICES_PAGE; } // filter z odkazu v hlavičke (#ags-f=overdue …) function takeHashFilter() { var m = (location.hash || '').match(/ags-f=(all|paid|unpaid|overdue|cod)/); if (!m) return false; ssSet(FILTER_KEY, m[1]); ssSet(FILTER_KEY + '_ts', String(Date.now())); try { sessionStorage.removeItem(FILTER_SUBMIT_KEY); } catch (e) {} try { history.replaceState(null, '', location.pathname + location.search); } catch (e) {} return true; } function goFilter(f) { ssSet(FILTER_KEY, f); ssSet(FILTER_KEY + '_ts', String(Date.now())); try { sessionStorage.removeItem(FILTER_SUBMIT_KEY); } catch (e) {} var target = invoicesHref(); var here = location.pathname.replace(/\/$/, ''); var tp = target.replace(/^https?:\/\/[^\/]+/, '').split('?')[0].replace(/\/$/, ''); if (invForm && here === tp) { applyInvoiceFilter(); return; } if (f === 'unpaid' || f === 'overdue' || f === 'cod') { // rovno POST s filtrom (celé obdobie, zoradené podľa nezaplatenej sumy) – jedno načítanie, bez preteku s iným skriptom ssSet(FILTER_SUBMIT_KEY, f); var fm = document.createElement('form'); fm.method = 'post'; fm.action = target.split('#')[0].split('?')[0] + '?results_per_page=' + PER_PAGE; fm.style.display = 'none'; [['date_from', FROM_ALL], ['date_to', ''], ['sort_by', 'unpaid'], ['summary_filter_box_form', 'Zobraz']].forEach(function (kv) { var i = document.createElement('input'); i.type = 'hidden'; i.name = kv[0]; i.value = kv[1]; fm.appendChild(i); }); document.body.appendChild(fm); HTMLFormElement.prototype.submit.call(fm); return; } location.href = target; } // kliknutie v hlavičke zachytíme skôr ako iné skripty stránky (capture fáza) var HDR_MAP = ['all', 'paid', 'unpaid', 'overdue', 'cod']; document.addEventListener('click', function (e) { if (e.button !== 0 || e.ctrlKey || e.metaKey || e.shiftKey) return; var a = e.target && e.target.closest ? e.target.closest('.header-invoices .row a') : null; if (!a) return; var row = a.closest('.row'); var idx = [].indexOf.call(document.querySelectorAll('.header-invoices .row'), row); var f = HDR_MAP[idx]; if (!f) return; e.preventDefault(); e.stopImmediatePropagation(); goFilter(f); }, true); // hlavička: Nezaplatené a Po splatnosti cez všetky roky + funkčné odkazy function patchHeader(st) { var box = document.querySelector('.header-invoices'); if (!box) return; var rows = box.querySelectorAll('.row'); var map = ['all', 'paid', 'unpaid', 'overdue']; [].forEach.call(rows, function (row, idx) { var f = map[idx]; if (!f) return; if (f !== 'all') row.classList.add('ags-h-' + f); // odkaz nesie filter v #hashi – funguje aj bez obsluhy kliknutia [].forEach.call(row.querySelectorAll('a'), function (a) { var h = (a.getAttribute('href') || invoicesHref()).split('#')[0]; a.setAttribute('href', h + '#ags-f=' + f); }); if (!st || !st.sums) return; // V splatnosti = nezaplatené mínus po splatnosti mínus dobierky (kategórie sa neprekrývajú) // (overdueCount dobierky neobsahuje – tie sa v evaluate() počítajú len do codCount; unpaidCount obsahuje všetko) var sm = st.sums, cc = sm.codCount || 0, cs = sm.codSum || 0; var cnt = f === 'unpaid' ? sm.unpaidCount - sm.overdueCount - cc : f === 'overdue' ? sm.overdueCount : null; if (cnt === null) return; var sum = Math.max(0, Math.round(((f === 'unpaid' ? sm.unpaidSum - sm.overdueSum - cs : sm.overdueSum)) * 100) / 100); var lab = row.querySelector('span') || row.querySelector('b') || row.querySelector('a'); if (lab) { if (f === 'unpaid') lab.textContent = FUI.unpaid + ' (' + cnt + ')'; else lab.innerHTML = lab.innerHTML.replace(/\(\s*\d+\s*\)/, '(' + cnt + ')'); } var amt = row.querySelector('.text-right'); if (amt) { // mena a počet desatinných miest podľa nezaplatených faktúr, inak podľa riadku „Celkom“ v hlavičke (HU: bez desatinných miest) var ref = ((rows[0] && rows[0].querySelector('.text-right')) || amt).textContent.trim(); var cur = st.sums.cur || ((ref.match(/[^\d\s.,\-]+\.?$/) || [''])[0]); var dec = st.sums.cur ? st.sums.dec : (/[.,]\d{2}\s*\D*$/.test(ref) ? 2 : 0); amt.textContent = fmtMoney(sum, cur, dec); } }); // riadok „Dobierka – čaká na prepravcu“ (kópia riadku Po splatnosti), len ak nejaká je var codRow = box.querySelector('.row.ags-h-cod'); var sm2 = st && st.sums; if (!sm2 || !(sm2.codCount > 0)) { if (codRow) codRow.remove(); return; } var src = rows[3]; if (!src) return; if (!codRow) { codRow = src.cloneNode(true); codRow.classList.remove('ags-h-overdue'); codRow.classList.add('ags-h-cod'); src.parentNode.insertBefore(codRow, src.nextSibling); } [].forEach.call(codRow.querySelectorAll('a'), function (a) { a.setAttribute('href', (a.getAttribute('href') || invoicesHref()).split('#')[0] + '#ags-f=cod'); }); var lb = codRow.querySelector('span') || codRow.querySelector('b') || codRow.querySelector('a'); if (lb) lb.textContent = FUI.codHdr + ' (' + sm2.codCount + ')'; var am = codRow.querySelector('.text-right'); if (am) { var r0 = ((rows[0] && rows[0].querySelector('.text-right')) || am).textContent.trim(); am.textContent = fmtMoney(Math.round(sm2.codSum * 100) / 100, sm2.cur || ((r0.match(/[^\d\s.,\-]+\.?$/) || [''])[0]), sm2.cur ? sm2.dec : (/[.,]\d{2}\s*\D*$/.test(r0) ? 2 : 0)); } } // zoznam faktúr: 4 farby + filter var invForm = (function () { var s = document.querySelector('[name="summary_filter_box_form"]'); return s ? s.form || s.closest('form') : null; })(); function invRows() { var t = invForm && (invForm.parentNode.querySelector('table') || document.querySelector('main table')); if (!t) { var all = document.querySelectorAll('table'); for (var i = 0; i < all.length; i++) if (/splatnost|splatnosť|határid|termin|due/i.test(all[i].textContent.slice(0, 400))) { t = all[i]; break; } } if (!t) return []; return [].slice.call(t.querySelectorAll('tr')).filter(function (r) { return r.cells.length >= 8 && r.querySelector('td') && !/ags-inv-detail/.test(r.className); }); } function invNo(r) { var c = r.cells[0].cloneNode(true), b = c.querySelector('.ags-cod-b'); if (b) b.remove(); return c.textContent.trim(); } function rowStatus(r) { if (/dobropis/i.test(r.className)) return 'credit'; var unpaid = parseAmount(r.cells[7].textContent); if (!(unpaid > 0)) return 'paid'; var due = parseDate(r.cells[3].textContent); var st0 = lsGet(CACHE_KEY); if (codProtected(invNo(r), due, st0 && st0.settings)) return 'cod'; return due && today() > due ? 'overdue' : 'due'; } function colorRows() { invRows().forEach(function (r) { var s = rowStatus(r); r.__agsS = s; r.classList.remove('ags-inv-paid', 'ags-inv-due', 'ags-inv-overdue', 'ags-inv-cod'); if (s !== 'credit') r.classList.add('ags-inv-' + s); // označenie v bunke Splatnosť (nie pri čísle faktúry – to čítajú ďalšie skripty; dátum sa parsuje od začiatku bunky) var b = r.cells[3].querySelector('.ags-cod-b'); if (s === 'cod' && !b) { b = document.createElement('span'); b.className = 'ags-cod-b'; b.textContent = FUI.cod; r.cells[3].appendChild(b); } else if (s !== 'cod' && b) b.remove(); }); } var filterBar = null; function renderFilterBar(active) { if (!invForm) return; if (!filterBar) { filterBar = document.createElement('div'); filterBar.className = 'ags-inv-filters'; invForm.parentNode.insertBefore(filterBar, invForm.nextSibling); } var btns = ['all', 'unpaid', 'overdue', 'cod', 'paid'].map(function (f) { return '' + (f !== 'all' ? '' : '') + FUI[f] + ''; }).join(''); filterBar.innerHTML = btns + ''; [].forEach.call(filterBar.querySelectorAll('a[data-f]'), function (a) { a.addEventListener('click', function () { goFilter(a.getAttribute('data-f')); }); }); } function applyInvoiceFilter() { if (!invForm) return; var f = ssGet(FILTER_KEY) || 'all'; var df = invForm.querySelector('[name="date_from"]'), sb = invForm.querySelector('[name="sort_by"]'); var dt = invForm.querySelector('[name="date_to"]'); // Nezaplatené / Po splatnosti: celé obdobie, zoradené podľa nezaplatenej sumy → všetky nezaplatené sú na 1. strane if ((f === 'unpaid' || f === 'overdue' || f === 'cod') && !(df && df.value === FROM_ALL && sb && sb.value === 'unpaid' && (!dt || !dt.value))) { if (ssGet(FILTER_SUBMIT_KEY) !== f) { ssSet(FILTER_SUBMIT_KEY, f); if (df) df.value = FROM_ALL; if (dt) dt.value = ''; if (sb) sb.value = 'unpaid'; invForm.setAttribute('action', location.pathname + '?results_per_page=' + PER_PAGE); var btn = invForm.querySelector('[name="summary_filter_box_form"]'); var hid = document.createElement('input'); hid.type = 'hidden'; hid.name = 'summary_filter_box_form'; hid.value = btn ? btn.value : 'Zobraz'; invForm.appendChild(hid); HTMLFormElement.prototype.submit.call(invForm); return; } } try { sessionStorage.removeItem(FILTER_SUBMIT_KEY); } catch (e) {} renderFilterBar(f); refilter(); } // len skryť/zobraziť riadky podľa aktívneho filtra (bez odoslania formulára) – volá sa aj po zistení formy úhrady function refilter() { if (!invForm || !filterBar) return; var f = ssGet(FILTER_KEY) || 'all'; var rows = invRows(), shown = 0; rows.forEach(function (r) { var s = r.__agsS || rowStatus(r); var ok = f === 'all' || (f === 'paid' && s === 'paid') || (f === 'unpaid' && s === 'due') || (f === 'overdue' && s === 'overdue') || (f === 'cod' && s === 'cod'); r.classList.toggle('ags-inv-hidden', !ok); if (ok) shown++; }); var msg = filterBar.querySelector('.ags-inv-msg'); var txt = ''; if (f !== 'all' && !shown) txt = FUI.none; else if ((f === 'unpaid' || f === 'overdue' || f === 'cod') && rows.length >= PER_PAGE && rows[rows.length - 1] && parseAmount(rows[rows.length - 1].cells[7].textContent) > 0) txt = FUI.more.replace('{n}', rows.length); else if (f === 'paid') txt = FUI.paidNote; msg.textContent = txt; msg.style.display = txt ? '' : 'none'; } function initInvoicePage() { if (!invForm) return; // filter platí len pri príchode cez naše odkazy (hlavička / tlačidlá) alebo pri stránkovaní; // otvorenie „Moje faktúry“ z menu ukáže všetky faktúry var fresh = Date.now() - (+ssGet(FILTER_KEY + '_ts') || 0) < 15000; if (!fresh) ssSet(FILTER_KEY, 'all'); document.addEventListener('click', function (e) { var a = e.target && e.target.closest ? e.target.closest('a[href*="page="], a[href*="results_per_page="]') : null; if (a) ssSet(FILTER_KEY + '_ts', String(Date.now())); }, true); takeHashFilter(); window.addEventListener('hashchange', function () { if (takeHashFilter()) applyInvoiceFilter(); }); colorRows(); // ručné použitie filtra dátumov (tlačidlo Zobraz) zruší náš filter invForm.addEventListener('submit', function (e) { if (e.isTrusted) { ssSet(FILTER_KEY, 'all'); } }); applyInvoiceFilter(); // forma úhrady zistená na pozadí (faktury-nahlad3) → prefarbiť a prefiltrovať document.addEventListener('ags-payform', function () { colorRows(); refilter(); }); // riadky „Položky“ pridáva reklamačný skript dodatočne – farby udržať var t = invRows()[0]; t = t && t.closest('table'); if (t && window.MutationObserver) new MutationObserver(function () { colorRows(); }).observe(t, { childList: true, subtree: true }); } // ---------- štart ---------- injectCss(); injectCss2(); var cached = lsGet(CACHE_KEY); if (cached && cached.v === 4 && cached.day === fmt(today())) { patchHeader(cached); if (ENFORCE && !summaryForm) { showBar(cached); applyBlocks(cached); } } else patchHeader(null); initInvoicePage(); var loginRef = /vazeni-navstevnici|prihlaseni|kedves-latogatok|logowanie|login/i.test(document.referrer || ''); var seenKey = 'ags_splat_seen_' + ACC; // okno v tomto prihlásení (sessionStorage) var dayKey = 'ags_splat_day_' + lang + '_' + ACC; // okno dnes (localStorage) // kedy otvoriť okno: pred splatnosťou raz denne; po splatnosti pri každom prihlásení a raz denne; v Súhrne pri blokácii vždy function wantModal(st) { if (st.state === 'ok') return false; var tag = fmt(today()) + ':' + st.state; if (summaryForm && st.state === 'blocked') return true; var seenToday = lsGet(dayKey) === tag; if (st.state === 'pre') return !seenToday; return !seenToday || loginRef || !ssGet(seenKey); } function run(attempt) { getStatus(!!summaryForm).then(function (st) { patchHeader(st); if (!ENFORCE) return; showBar(st); applyBlocks(st); if (wantModal(st)) { ssSet(seenKey, '1'); lsSet(dayKey, fmt(today()) + ':' + st.state); showModal(st); } if (summaryForm) { submitState = st.state === 'blocked' ? 'blocked' : 'ok'; setButtons(submitState === 'blocked'); setNote('', submitState === 'blocked' ? UI.blocked.note : '', st); } }).catch(function (err) { if (attempt < 1) return setTimeout(function () { run(attempt + 1); }, 1500); if (window.console) console.warn('[AGS splatnosť] stav faktúr sa nepodarilo zistiť – objednávka sa neblokuje', err); if (summaryForm) { submitState = 'ok'; setButtons(false); setNote('', ''); } }); } run(0); })();