diff --git a/app/UI/FakturaEdit/edit.latte b/app/UI/FakturaEdit/edit.latte index 4cf6229..671f5ec 100644 --- a/app/UI/FakturaEdit/edit.latte +++ b/app/UI/FakturaEdit/edit.latte @@ -69,7 +69,7 @@ Jedn. Cena/Jedn. Sleva % - Celkem + Celkem @@ -80,11 +80,11 @@ - + - {$p->CENA|number:2, ',', ' '} CZK + @@ -94,8 +94,7 @@ Celková částka: - 0,00 CZK - + 0,00 CZK @@ -244,24 +243,66 @@ document.addEventListener('DOMContentLoaded', () => { }); } - // 3. Výpočet součtů + // 3. Výpočet součtů (celkem ← počet × cena × (1 − sleva)) + function roundMoney(value) { + return Math.round((value + Number.EPSILON) * 100) / 100; + } + + function roundPocet(value) { + return Math.round((value + Number.EPSILON) * 10000) / 10000; + } + + function rowCelkem(row) { + const pocet = parseFloat(row.querySelector('.item-pocet').value) || 0; + const cena = parseFloat(row.querySelector('.item-cena').value) || 0; + const sleva = parseFloat(row.querySelector('.item-sleva').value) || 0; + return (pocet * cena) * (1 - (sleva / 100)); + } + function calculateTotals() { let grandTotal = 0; document.querySelectorAll('.item-row').forEach(row => { - const pocet = parseFloat(row.querySelector('.item-pocet').value) || 0; - const cena = parseFloat(row.querySelector('.item-cena').value) || 0; - const sleva = parseFloat(row.querySelector('.item-sleva').value) || 0; - - const celkem = (pocet * cena) * (1 - (sleva / 100)); + const celkem = rowCelkem(row); grandTotal += celkem; - row.querySelector('.item-celkem-text').textContent = celkem.toLocaleString('cs-CZ', { minimumFractionDigits: 2, maximumFractionDigits: 2 }) + ' CZK'; + const celkemInput = row.querySelector('.item-celkem'); + if (celkemInput && document.activeElement !== celkemInput) { + celkemInput.value = roundMoney(celkem).toFixed(2); + } }); document.getElementById('total-sum').textContent = grandTotal.toLocaleString('cs-CZ', { minimumFractionDigits: 2, maximumFractionDigits: 2 }) + ' CZK'; } + // Úprava celkově: přepočítá počet, cena/jedn. a sleva zůstávají + function recalculatePocetFromCelkem(row) { + const celkem = parseFloat(row.querySelector('.item-celkem').value) || 0; + const cena = parseFloat(row.querySelector('.item-cena').value) || 0; + const sleva = parseFloat(row.querySelector('.item-sleva').value) || 0; + const faktor = cena * (1 - (sleva / 100)); + const pocetInput = row.querySelector('.item-pocet'); + + if (!pocetInput || Math.abs(faktor) < 1e-9) { + return; + } + + pocetInput.value = String(roundPocet(celkem / faktor)); + } + + function updateGrandTotalFromInputs() { + let grandTotal = 0; + document.querySelectorAll('.item-row').forEach(row => { + const celkemInput = row.querySelector('.item-celkem'); + if (celkemInput && document.activeElement === celkemInput) { + grandTotal += parseFloat(celkemInput.value) || 0; + } else { + grandTotal += rowCelkem(row); + } + }); + document.getElementById('total-sum').textContent = grandTotal.toLocaleString('cs-CZ', { minimumFractionDigits: 2, maximumFractionDigits: 2 }) + ' CZK'; + } + function fold(value) { return String(value).normalize('NFD').replace(/[\u0300-\u036f]/g, '').toLowerCase(); } @@ -593,11 +634,11 @@ document.addEventListener('DOMContentLoaded', () => { - + - 0,00 CZK + @@ -621,11 +662,23 @@ document.addEventListener('DOMContentLoaded', () => { }); tbody.addEventListener('input', (e) => { + if (e.target.matches('.item-celkem')) { + recalculatePocetFromCelkem(e.target.closest('.item-row')); + updateGrandTotalFromInputs(); + return; + } if (e.target.matches('.item-pocet, .item-cena, .item-sleva')) { calculateTotals(); } }); + tbody.addEventListener('focusout', (e) => { + if (e.target.matches('.item-celkem')) { + recalculatePocetFromCelkem(e.target.closest('.item-row')); + calculateTotals(); + } + }); + if (document.querySelectorAll('.item-row').length === 0) { btnAdd.click(); } else {