import { useState, useEffect } from 'react' import { useAlert } from '../context/AlertContext' import { useAuth } from '../context/AuthContext' import Forbidden from '../components/Forbidden' import { useNavigate, Link } from 'react-router-dom' import { motion } from 'framer-motion' import AdminDatePicker from '../components/AdminDatePicker' import FormField from '../components/FormField' import apiFetch from '../utils/api' const API_BASE = '/api/admin' interface User { id: number | string name: string } interface CreateForm { user_id: string shift_date: string leave_type: string leave_hours: number arrival_date: string arrival_time: string break_start_date: string break_start_time: string break_end_date: string break_end_time: string departure_date: string departure_time: string notes: string } export default function AttendanceCreate() { const alert = useAlert() const { hasPermission } = useAuth() const navigate = useNavigate() const [loading, setLoading] = useState(true) const [submitting, setSubmitting] = useState(false) const [users, setUsers] = useState([]) const today = new Date().toISOString().split('T')[0] const [form, setForm] = useState({ user_id: '', shift_date: today, leave_type: 'work', leave_hours: 8, arrival_date: today, arrival_time: '', break_start_date: today, break_start_time: '', break_end_date: today, break_end_time: '', departure_date: today, departure_time: '', notes: '' }) useEffect(() => { const fetchUsers = async () => { try { const response = await apiFetch(`${API_BASE}/users`) const result = await response.json() if (result.success) { setUsers(Array.isArray(result.data) ? result.data : result.data?.items || []) } } catch { alert.error('Nepodařilo se načíst uživatele') } finally { setLoading(false) } } fetchUsers() }, [alert]) const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() if (!form.user_id || !form.shift_date) { alert.error('Vyplňte zaměstnance a datum směny') return } setSubmitting(true) try { const response = await apiFetch(`${API_BASE}/attendance`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(form) }) const result = await response.json() if (result.success) { alert.success(result.message) navigate(`/attendance/admin?month=${form.shift_date.substring(0, 7)}`) } else { alert.error(result.error) } } catch { alert.error('Chyba připojení') } finally { setSubmitting(false) } } const handleShiftDateChange = (newDate: string) => { setForm({ ...form, shift_date: newDate, arrival_date: newDate, break_start_date: newDate, break_end_date: newDate, departure_date: newDate }) } const isWorkType = form.leave_type === 'work' if (!hasPermission('attendance.admin')) return if (loading) { return (
{[0, 1, 2, 3, 4].map(i => (
))}
) } return (

Přidat záznam docházky

← Zpět na správu
handleShiftDateChange(val)} required />
{!isWorkType && ( setForm({ ...form, leave_hours: parseFloat(e.target.value) })} min="0.5" max="24" step="0.5" className="admin-form-input" /> Výchozí 8 hodin pro celý den )} {isWorkType && ( <>
setForm({ ...form, arrival_date: val })} /> setForm({ ...form, arrival_time: val })} />
setForm({ ...form, break_start_date: val })} /> setForm({ ...form, break_start_time: val })} />
setForm({ ...form, break_end_date: val })} /> setForm({ ...form, break_end_time: val })} />
setForm({ ...form, departure_date: val })} /> setForm({ ...form, departure_time: val })} />
)}