import { useEffect, useMemo, useState } from 'preact/hooks'; import ModalShell from '../ui/ModalShell'; const RATE_OPTIONS = [ { value: 'HR', label: 'Hrvatska', amount: '30.00' }, { value: 'BIH', label: 'BiH', amount: '50.00' }, { value: 'SI', label: 'Slovenija', amount: '80.00' }, { value: 'CG', label: 'Crna Gora', amount: '50.00' }, ]; const DEFAULT_ROW = { broj_sati: '0.00', kolicina_dnevnica: '0.00', iznos_dnevnica: '30.00', daily_rate_country: 'HR', }; function parseAmount(value) { const normalized = String(value || '').trim().replace('€', '').replace(/\s+/g, '').replace(',', '.'); const parsed = Number(normalized); return Number.isFinite(parsed) ? parsed : 0; } function toDisplayValue(value) { if (value == null || value === '') return '0.00'; const numeric = Number(String(value).replace(',', '.')); return Number.isFinite(numeric) ? numeric.toFixed(2) : String(value); } function getRateAmount(country) { const option = RATE_OPTIONS.find((item) => item.value === country); return option ? option.amount : DEFAULT_ROW.iznos_dnevnica; } export default function WorkOrderTravelExpensesModal({ open, workOrder, tableData, saving = false, onClose, onSave, }) { const [row, setRow] = useState(DEFAULT_ROW); useEffect(() => { if (!open) { setRow(DEFAULT_ROW); return; } const incoming = tableData && typeof tableData === 'object' ? tableData : {}; const country = String(incoming.daily_rate_country || DEFAULT_ROW.daily_rate_country).toUpperCase(); const amount = incoming.iznos_dnevnica != null && incoming.iznos_dnevnica !== '' ? incoming.iznos_dnevnica : getRateAmount(country); setRow({ broj_sati: toDisplayValue(incoming.broj_sati), kolicina_dnevnica: toDisplayValue(incoming.kolicina_dnevnica), iznos_dnevnica: toDisplayValue(amount), daily_rate_country: country, }); }, [open, tableData]); const total = useMemo(() => ( (parseAmount(row.kolicina_dnevnica) * parseAmount(row.iznos_dnevnica)).toFixed(2) ), [row]); if (!open) return null; const updateField = (field, value) => { setRow((prev) => ({ ...prev, [field]: value })); }; const updateCountry = (country) => { setRow((prev) => ({ ...prev, daily_rate_country: country, iznos_dnevnica: getRateAmount(country), })); }; const handleSave = async () => { await onSave?.({ broj_sati: String(row.broj_sati || '').trim(), kolicina_dnevnica: String(row.kolicina_dnevnica || '').trim(), iznos_dnevnica: String(row.iznos_dnevnica || '').trim(), daily_rate_country: String(row.daily_rate_country || '').trim(), }); }; return (

OBRAČUN PUTNIH TROŠKOVA

{workOrder?.display_code || workOrder?.id || '-'}

Brzi odabir dnevnice

Odabir države automatski postavlja iznos dnevnice. Po potrebi iznos možete ručno izmijeniti.

# Broj sati Količina dnevnica Država Iznos dnevnice Ukupan iznos
1 updateField('broj_sati', event.currentTarget.value)} className="block w-full rounded-lg border border-gray-300 bg-gray-50 px-2.5 py-2 text-xs text-gray-900" /> updateField('kolicina_dnevnica', event.currentTarget.value)} className="block w-full rounded-lg border border-gray-300 bg-gray-50 px-2.5 py-2 text-xs text-gray-900" /> updateField('iznos_dnevnica', event.currentTarget.value)} className="block w-full rounded-lg border border-gray-300 bg-gray-50 px-2.5 py-2 text-xs text-gray-900" />
{total} €
); }