import { useAlert } from '../context/AlertContext' import { useAuth } from '../context/AuthContext' import Forbidden from '../components/Forbidden' import { motion } from 'framer-motion' import ConfirmModal from '../components/ConfirmModal' import AdminDatePicker from '../components/AdminDatePicker' import BulkAttendanceModal from '../components/BulkAttendanceModal' import ShiftFormModal from '../components/ShiftFormModal' import AttendanceShiftTable from '../components/AttendanceShiftTable' import useModalLock from '../hooks/useModalLock' import useAttendanceAdmin from '../hooks/useAttendanceAdmin' import { formatMinutes } from '../utils/attendanceHelpers' function getFundBarBackground(data) { if (data.overtime > 0) return 'linear-gradient(135deg, var(--warning), #d97706)' if (data.covered >= data.fund) return 'linear-gradient(135deg, var(--success), #059669)' return 'var(--gradient)' } export default function AttendanceAdmin() { const alert = useAlert() const { hasPermission } = useAuth() const { loading, month, setMonth, filterUserId, setFilterUserId, data, hasData, showBulkModal, setShowBulkModal, bulkSubmitting, bulkForm, setBulkForm, showCreateModal, setShowCreateModal, createForm, setCreateForm, showEditModal, setShowEditModal, editingRecord, editForm, setEditForm, deleteConfirm, setDeleteConfirm, projectList, createProjectLogs, setCreateProjectLogs, editProjectLogs, setEditProjectLogs, openCreateModal, handleCreateShiftDateChange, handleCreateSubmit, openBulkModal, toggleBulkUser, toggleAllBulkUsers, handleBulkSubmit, openEditModal, handleEditSubmit, handleDelete, handlePrint } = useAttendanceAdmin({ alert }) useModalLock(showBulkModal) useModalLock(showEditModal) useModalLock(showCreateModal) if (!hasPermission('attendance.admin')) return return (

Správa docházky

{hasData && ( <> )}
{/* Filters */}
setMonth(val)} />
{/* User Totals */} {loading && (
{[0, 1, 2].map(i => (
))}
)} {!loading && Object.keys(data.user_totals).length > 0 && ( {Object.entries(data.user_totals).map(([uid, userData]) => (
{userData.name} {userData.working ? '✓' : '✗'}
{formatMinutes(userData.minutes)}
odpracováno
{userData.vacation_hours > 0 && ( Dov: {userData.vacation_hours}h )} {userData.sick_hours > 0 && ( Nem: {userData.sick_hours}h )} {userData.holiday_hours > 0 && ( Sv: {userData.holiday_hours}h )} {userData.unpaid_hours > 0 && ( Nep: {userData.unpaid_hours}h )}
{userData.fund !== null && (
Fond: {userData.worked_hours}h / {userData.fund}h {userData.overtime > 0 && ( +{userData.overtime}h )} {userData.overtime <= 0 && userData.missing > 0 && ( -{userData.missing}h )}
)} {data.leave_balances[uid] && (
Zbývá dovolené: {data.leave_balances[uid].vacation_remaining.toFixed(1)}h / {data.leave_balances[uid].vacation_total}h
)}
))} )} {/* Records Table */}
{loading && (
{[0, 1, 2, 3, 4].map(i => (
))}
)} {!loading && ( setDeleteConfirm({ show: true, record })} /> )}
{/* Modals */} setShowBulkModal(false)} form={bulkForm} setForm={setBulkForm} users={data.users} onSubmit={handleBulkSubmit} submitting={bulkSubmitting} toggleUser={toggleBulkUser} toggleAllUsers={toggleAllBulkUsers} /> setShowCreateModal(false)} onSubmit={handleCreateSubmit} form={createForm} setForm={setCreateForm} projectLogs={createProjectLogs} setProjectLogs={setCreateProjectLogs} projectList={projectList} users={data.users} onShiftDateChange={handleCreateShiftDateChange} /> setShowEditModal(false)} onSubmit={handleEditSubmit} form={editForm} setForm={setEditForm} projectLogs={editProjectLogs} setProjectLogs={setEditProjectLogs} projectList={projectList} editingRecord={editingRecord} /> setDeleteConfirm({ show: false, record: null })} onConfirm={handleDelete} title="Smazat záznam" message="Opravdu chcete smazat tento záznam docházky?" confirmText="Smazat" confirmVariant="danger" />
) }