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 {