# Zeiterfassung (Time Tracking Application) A full-stack time tracking application built with Node.js, Express, SQLite, and containerized with Docker. ## Features - ✅ Track work time entries (date, start time, end time) - ✅ Automatic break calculation according to German labor laws - ✅ Maximum 10-hour net time cap - ✅ Date range filtering - ✅ CSV export with German formatting - ✅ Responsive UI with Tailwind CSS - ✅ Modern date/time picker (Flatpickr) - ✅ Docker containerization ## Technology Stack - **Backend**: Node.js, Express.js - **Database**: SQLite (better-sqlite3) - **Frontend**: Vanilla JavaScript, HTML, Tailwind CSS - **Containerization**: Docker ## Project Structure ``` /zeiterfassung ├── public/ │ ├── index.html # Main UI │ └── app.js # Frontend logic ├── db/ │ └── schema.sql # Database schema ├── server.js # Express server with API endpoints ├── Dockerfile # Multi-stage Docker build ├── package.json └── README.md ``` ## German Break Rules The application automatically calculates break times according to German labor law: - **> 6 hours worked**: 30 minutes break deducted - **> 9 hours worked**: 45 minutes break deducted - **Net hours capped at 10.0 hours maximum** ## API Endpoints - `GET /api/entries?from=YYYY-MM-DD&to=YYYY-MM-DD` - Get all entries in date range - `POST /api/entries` - Create a new entry - `PUT /api/entries/:id` - Update an existing entry - `DELETE /api/entries/:id` - Delete an entry - `GET /api/export?from=YYYY-MM-DD&to=YYYY-MM-DD` - Export entries as CSV ## Running Locally ### Prerequisites - Node.js 18+ installed ### Installation 1. Install dependencies: ```bash npm install ``` 2. Start the server: ```bash npm start ``` 3. Open your browser and navigate to: ``` http://localhost:3000 ``` ## Running with Docker ### Build the Docker image: ```bash docker build -t zeiterfassung . ``` ### Run the container: ```bash docker run -p 3000:3000 -v $(pwd)/db:/app/db zeiterfassung ``` The `-v` flag mounts the database directory to persist data between container restarts. ### Access the application: ``` http://localhost:3000 ``` ## CSV Export Format The exported CSV file includes the following columns: - **Datum**: Date in DD.MM.YYYY format - **Startzeit**: Start time in HH:MM format - **Endzeit**: End time in HH:MM format - **Pause in Minuten**: Break time in minutes - **Gesamtstunden**: Net hours with comma as decimal separator (e.g., 8,50) ## Development The application uses: - **Flatpickr** for date and time selection with mobile-friendly interfaces - **Tailwind CSS** for styling (loaded via CDN) - **SQLite** for lightweight, file-based data persistence - All calculations are performed server-side for data integrity ## License MIT