fix: počítání částek v haléřích z důvodu přesnosti
CI / Generate TypeScript types (push) Successful in 21s
CI / Build server (push) Successful in 25s
CI / Server unit tests (push) Successful in 55s
CI / Build client (push) Successful in 33s
CI / Playwright E2E tests (push) Successful in 1m20s
CI / Build and push Docker image (push) Successful in 35s
CI / Notify (push) Successful in 2s

This commit is contained in:
mates committed 2026-05-07 13:09:15 +02:00
1 parent d91c8db49c
commit 8aef00ab05
18 files changed
+370 -380

No files matched your search

@@ -41,7 +41,7 @@ export default function PayForGroupModal({ isOpen, onClose, group, payerLogin, b
const shipping = group.shipping ?? 0;
const tip = group.tip ?? 0;
const totalFees = fees + shipping + tip;
const feeShare = memberCount > 0 ? Math.round(totalFees / memberCount * 100) / 100 : 0;
const feeShare = memberCount > 0 ? Math.round(totalFees / memberCount) : 0;
const getMemberTotal = (entry: DinerEntry): number => {
const base = entry.member.amount ?? 0;
@@ -50,10 +50,10 @@ export default function PayForGroupModal({ isOpen, onClose, group, payerLogin, b
const discountValue = group.discountValue ?? 0;
const discount = discountValue > 0
? (discountType === 'percent'
? Math.round((base + surcharge) * discountValue / 100 * 100) / 100
: Math.round(discountValue / memberCount * 100) / 100)
? Math.round((base + surcharge) * discountValue / 100)
: Math.round(discountValue / memberCount))
: 0;
return Math.round((base + surcharge + feeShare - discount) * 100) / 100;
return base + surcharge + feeShare - discount;
};
const includedNonPayers = diners.filter(d => d.included && d.login !== payerLogin);
@@ -73,11 +73,6 @@ export default function PayForGroupModal({ isOpen, onClose, group, payerLogin, b
setError(`Celková částka pro ${d.login} musí být kladná`);
return;
}
const amountStr = total.toString();
if (amountStr.includes('.') && amountStr.split('.')[1].length > 2) {
setError(`Částka pro ${d.login} má více než 2 desetinná místa`);
return;
}
recipients.push({
login: d.login,
purpose: `Objednávka ${group.name}`.substring(0, 60),
@@ -132,15 +127,15 @@ export default function PayForGroupModal({ isOpen, onClose, group, payerLogin, b
{hasFees && (
<div className="d-flex gap-3 mb-2 text-muted" style={{ fontSize: '0.9em' }}>
{fees > 0 && <span>Poplatky: <strong>{fees} Kč</strong></span>}
{shipping > 0 && <span>Doprava: <strong>{shipping} Kč</strong></span>}
{tip > 0 && <span>Spropitné: <strong>{tip} Kč</strong></span>}
<span>→ {feeShare} Kč/os.</span>
{fees > 0 && <span>Poplatky: <strong>{fees / 100} Kč</strong></span>}
{shipping > 0 && <span>Doprava: <strong>{shipping / 100} Kč</strong></span>}
{tip > 0 && <span>Spropitné: <strong>{tip / 100} Kč</strong></span>}
<span>→ {feeShare / 100} Kč/os.</span>
</div>
)}
{group.discountValue != null && group.discountValue > 0 && (
<div className="mb-2 text-success" style={{ fontSize: '0.9em' }}>
Sleva: {group.discountType === 'percent' ? `${group.discountValue}%` : `${group.discountValue} Kč`}
Sleva: {group.discountType === 'percent' ? `${group.discountValue}%` : `${group.discountValue / 100} Kč`}
</div>
)}
@@ -180,18 +175,18 @@ export default function PayForGroupModal({ isOpen, onClose, group, payerLogin, b
)}
</td>
<td className="text-end">
{(d.member.amount ?? 0) > 0 ? `${d.member.amount} Kč` : <span className="text-muted">—</span>}
{(d.member.amount ?? 0) > 0 ? `${d.member.amount! / 100} Kč` : <span className="text-muted">—</span>}
</td>
<td className="text-end">
{surcharge > 0 ? `${surcharge} Kč` : <span className="text-muted">—</span>}
{surcharge > 0 ? `${surcharge / 100} Kč` : <span className="text-muted">—</span>}
</td>
{hasFees && (
<td className="text-end">
{feeShare > 0 ? `${feeShare} Kč` : '—'}
{feeShare > 0 ? `${feeShare / 100} Kč` : '—'}
</td>
)}
<td className="text-end fw-bold">
{total > 0 ? `${total} Kč` : <span className="text-muted">—</span>}
{total > 0 ? `${total / 100} Kč` : <span className="text-muted">—</span>}
</td>
</tr>
);