nové faktúry {result.created}doplnené {result.updated}už boli {result.skipped}noví partneri {result.partners}{result.renamed > 0 && premenované VFA→VF1 {result.renamed}}
{result.warnings.length > 0 && <>
Upozornenia ({result.warnings.length}):
{result.warnings.map((m, i) =>
{m}
)}
>}
)}
{ConfirmUI}
);
}
function DanovaTab({ setToast }) {
const [file, setFile] = React.useState(null);
const [busy, setBusy] = React.useState(false);
const [error, setError] = React.useState(null);
const [result, setResult] = React.useState(null);
const [askConfirm, ConfirmUI] = useConfirm();
const run = async () => {
if (!file) { setError('Vyber súbor JSON z prevodníka zošita.'); return; }
if (!await askConfirm({ title: 'Načítať daňovú evidenciu?', message: `Súbor ${file.name}.\n\nPred importom sa odloží záloha. Príjmy načítané zo zošita skôr sa nahradia, ručne zapísané príjmy ostanú. Faktúry, ktoré tu už sú, dostanú rozdelenie príjmu zo zošita.`, confirmLabel: 'Načítať' })) return;
setBusy(true); setError(null); setResult(null);
try { const r = await uctStore.danova.run(file); setResult(r); setToast('Daňová evidencia načítaná.'); }
catch (e) { setError(e.message); }
setBusy(false);
};
return (
Import zo zošita daňovej evidencie
listy Pohľadávky RRRR a Príjmy RRRR
setError(null)} />
Zošit sa najprv prevedie prevodníkom danova_xlsx_to_json.py (v podkladoch Účtovníčka) na súbor JSON, ten sa vyberie tu. Stĺpce sa čítajú podľa hlavičiek, takže staršie roky s iným rozložením prejdú tiež.
pohľadávky {result.receivables}z toho nové faktúry {result.created}príjmy {result.incomes}roky {result.years}
{result.warnings.length > 0 && <>
Upozornenia ({result.warnings.length}):
{result.warnings.map((m, i) =>
{m}
)}
>}
)}
{ConfirmUI}
);
}
function AccountTab({ setToast }) {
const u = uctStore.auth.user() || {};
const st = uctStore.auth.state() || {};
if (st.oidc) {
return (
Účet
prihlásená ako {u.name || u.login} ({u.login})
Prihlásenie ide cez firemný {st.provider || 'Authentik'}. Heslo, dvojfaktor aj odhlásenie zo všetkých zariadení sa riešia tam, Účtovníček si vlastné heslo nedrží.
Toto mení len miestne heslo pre prihlásenie bez internetu. Heslo do Diarika sa mení v Diariku; pri ďalšom online prihlásení sa miestne heslo zrovná s ním.
);
}
function BackupTab({ setToast }) {
const [error, setError] = React.useState(null);
const [askConfirm, ConfirmUI] = useConfirm();
const fileRef = React.useRef(null);
const restore = async (e) => {
const f = e.target.files && e.target.files[0];
e.target.value = '';
if (!f) return;
let obj;
try { obj = JSON.parse(await f.text()); } catch { setError('Súbor nie je záloha Účtovníčka (nedá sa prečítať).'); return; }
const n = (obj.invoices || []).length, p = (obj.partners || []).length;
if (!await askConfirm({ title: 'Obnoviť zo zálohy?', message: `Záloha z ${obj.exported ? fmt.date(obj.exported) : '?'} obsahuje ${n} ${plural(n, 'faktúru', 'faktúry', 'faktúr')} a ${p} ${plural(p, 'partnera', 'partnerov', 'partnerov')}.\n\nVšetko, čo je v appke teraz, sa nahradí obsahom zálohy.`, confirmLabel: 'Obnoviť', danger: true })) return;
try { await uctStore.backup.importJSON(obj); setToast('Záloha obnovená.'); setError(null); }
catch (err) { setError(err.message); }
};
return (
Stiahnuť zálohu
Jeden súbor so všetkým: firma, partneri, osnova, faktúry, doklady, denník, číselné rady.
Ulož si ho napríklad na USB kľúč. Dá sa z neho vrátiť všetko presne tak, ako to bolo.
Obnoviť zo zálohy
Vyber súbor uctovnicek-RRRR-MM-DD.json
setError(null)} />
Pred obnovou sa appka opýta. Obnova nahradí všetko naraz - buď celá prejde, alebo sa nezmení nič.
Automaticky: pri každom spustení si Účtovníček odloží kópiu databázy každej firmy do priečinka ~/.local/share/uctovnicek/zalohy (raz denne, drží 14 posledných). Aktualizácia appky dáta nikdy neprepíše - databázy sú mimo programu. Záloha je za firmu, ktorú máš práve vybranú.
{ConfirmUI}
);
}
function ImportTab({ setToast }) {
const s = uctStore.settings.get();
const [agenda, setAgenda] = React.useState(null);
const [osnova, setOsnova] = React.useState(null);
const [replace, setReplace] = React.useState(false);
const [busy, setBusy] = React.useState(false);
const [error, setError] = React.useState(null);
const [result, setResult] = React.useState(null);
const [askConfirm, ConfirmUI] = useConfirm();
const run = async () => {
if (!agenda) { setError('Vyber súbor Export agendy (xlsx) z Profit365.'); return; }
if (!await askConfirm({ title: 'Načítať dáta z Profit365?', message: `Súbor ${agenda.name}${osnova ? ' + osnova ' + osnova.name : ''}.\n\nPred importom sa odloží záloha databázy. Import prejde celý, alebo sa nezmení nič.${replace ? '\n\nPredchádzajúci import z Profit365 sa nahradí.' : ''}`, confirmLabel: 'Načítať' })) return;
setBusy(true); setError(null); setResult(null);
try { const r = await uctStore.profit365.run({ agenda, osnova }, replace); setResult(r); setToast('Dáta z Profit365 načítané.'); }
catch (e) { setError(e.message); }
setBusy(false);
};
const pick = (setter) => (e) => { setter(e.target.files && e.target.files[0] || null); };
return (
Import z Profit365
{s.lastImport ? `Naposledy načítané ${fmt.date(s.lastImport)}` : 'Zatiaľ nič nenačítané'}
setError(null)} />
V Profit365 otvor Nástroje → Export agendy, nechaj rok bez výberu a klikni Exportovať. Po chvíli príde odkaz na súbor .xlsx.
Súbor vyber tu a klikni Načítať. Prenesú sa partneri, faktúry, bankové výpisy, pokladňa, interné doklady a celý denník.
{result.adjusted} {plural(result.adjusted, 'faktúra dorovnaná', 'faktúry dorovnané', 'faktúr dorovnaných')} ručnou úhradou podľa saldokonta Profit365 (platba v banke nemala správny VS).
}
Hlavná kniha oproti Profit365: {result.mismatches.length === 0 ? 'všetky účty sedia na cent.' : `${result.mismatches.length} ${plural(result.mismatches.length, 'rozdiel', 'rozdiely', 'rozdielov')}:`}
{result.mismatches.length > 0 &&
{result.mismatches.map((m, i) =>
{m}
)}
}
{result.warnings.length > 0 && <>
Upozornenia ({result.warnings.length}):
{result.warnings.map((m, i) =>
{m}
)}
>}
)}
{ConfirmUI}
);
}
function DemoTab({ setToast }) {
const s = uctStore.settings.get();
const [busy, setBusy] = React.useState(false);
const [error, setError] = React.useState(null);
const [askConfirm, ConfirmUI] = useConfirm();
const run = async (fn, msg) => {
setBusy(true); setError(null);
try { await fn(); setToast(msg); } catch (e) { setError(e.message); }
setBusy(false);
};
const remove = async () => {
if (!await askConfirm({ title: 'Vymazať ukážkové dáta?', message: 'Vymažú sa len záznamy označené ako ukážka. Tvoje vlastné ostanú.', confirmLabel: 'Vymazať', danger: true })) return;
run(uctStore.demo.remove, 'Ukážkové dáta vymazané.');
};
return (
Ukážkové dáta
Vymyslení partneri a faktúry, nech je vidno, ako appka vyzerá
setError(null)} />
{s.demoDataPresent ? 'Ukážkové dáta sú vložené. Keď začneš účtovať naozaj, vymaž ich - číselný rad sa potom nastav v záložke Číselné rady.' : 'Ukážkové dáta nie sú vložené.'}
{s.demoDataPresent
?
: }
{ConfirmUI}
);
}
function AboutTab() {
const a = uctStore.about();
return (
Účtovníček
Verzia {a.version} · podvojné účtovníctvo, fakturácia a daňová evidencia
Rovnaký základ ako Mzdárik, aby sa neskôr dali prepojiť (zaúčtovanie miezd).
Dáta: ~/.local/share/uctovnicek/ (jedna databáza na firmu, účty v ucty.db)