/* * 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 ? '| ' + UI.inv + ' | ' + UI.due + ' | ' + UI.unpaid + ' | ' + (hasFx ? '' : '') + ' |
|---|
' + esc(acc) + '' + esc(vs) + '