389 lines
14 KiB
Markdown
389 lines
14 KiB
Markdown
# Zeiterfassungstool - Projektstruktur
|
|
|
|
## Backend (Go)
|
|
|
|
```
|
|
timetracker-backend/
|
|
├── cmd/ # Einstiegspunkte für die Anwendung
|
|
│ ├── api/ # API-Server
|
|
│ │ └── main.go
|
|
│ └── worker/ # Hintergrundprozesse (Reports, Benachrichtigungen usw.)
|
|
│ └── main.go
|
|
├── internal/ # Interner Code, nicht exportierbar
|
|
│ ├── auth/ # Authentifizierung und Autorisierung
|
|
│ │ ├── jwt.go
|
|
│ │ ├── middleware.go
|
|
│ │ ├── permissions.go
|
|
│ │ └── service.go
|
|
│ ├── tenant/ # Multi-Tenant-Funktionalität
|
|
│ │ ├── middleware.go
|
|
│ │ └── service.go
|
|
│ ├── user/ # Benutzerverwaltung
|
|
│ │ ├── model.go
|
|
│ │ ├── repository.go
|
|
│ │ └── service.go
|
|
│ ├── company/ # Unternehmensverwaltung
|
|
│ │ ├── model.go
|
|
│ │ ├── repository.go
|
|
│ │ └── service.go
|
|
│ ├── customer/ # Kundenverwaltung
|
|
│ │ ├── model.go
|
|
│ │ ├── repository.go
|
|
│ │ └── service.go
|
|
│ ├── project/ # Projektverwaltung
|
|
│ │ ├── model.go
|
|
│ │ ├── repository.go
|
|
│ │ └── service.go
|
|
│ ├── activity/ # Tätigkeitsverwaltung
|
|
│ │ ├── model.go
|
|
│ │ ├── repository.go
|
|
│ │ └── service.go
|
|
│ ├── timetracking/ # Zeiterfassung
|
|
│ │ ├── model.go
|
|
│ │ ├── repository.go
|
|
│ │ └── service.go
|
|
│ ├── billing/ # Abrechnung
|
|
│ │ ├── model.go
|
|
│ │ ├── repository.go
|
|
│ │ └── service.go
|
|
│ ├── reporting/ # Berichtswesen
|
|
│ │ ├── generator.go
|
|
│ │ ├── pdf.go
|
|
│ │ └── service.go
|
|
│ ├── notification/ # Benachrichtigungen
|
|
│ │ ├── email.go
|
|
│ │ ├── inapp.go
|
|
│ │ └── service.go
|
|
│ ├── kanban/ # Kanban-Board (Version 2)
|
|
│ │ ├── model.go
|
|
│ │ ├── repository.go
|
|
│ │ └── service.go
|
|
│ ├── task/ # Task-Management (Version 2)
|
|
│ │ ├── model.go
|
|
│ │ ├── repository.go
|
|
│ │ └── service.go
|
|
│ ├── sprint/ # Sprint-Management (Version 2)
|
|
│ │ ├── model.go
|
|
│ │ ├── repository.go
|
|
│ │ └── service.go
|
|
│ ├── config/ # Konfiguration
|
|
│ │ └── config.go
|
|
│ └── database/ # Datenbankzugriff
|
|
│ ├── migrations/
|
|
│ ├── seeds/
|
|
│ └── connection.go
|
|
├── pkg/ # Öffentliche Pakete, die exportiert werden können
|
|
│ ├── apierror/ # API-Fehlerobjekte
|
|
│ │ └── error.go
|
|
│ ├── logger/ # Logging-Funktionalität
|
|
│ │ └── logger.go
|
|
│ ├── validator/ # Validierungsfunktionen
|
|
│ │ └── validator.go
|
|
│ └── utils/ # Allgemeine Hilfsfunktionen
|
|
│ ├── dates.go
|
|
│ ├── encryption.go
|
|
│ └── helpers.go
|
|
├── api/ # API-Definitionen
|
|
│ ├── handlers/ # API-Handler
|
|
│ │ ├── auth.go
|
|
│ │ ├── user.go
|
|
│ │ ├── company.go
|
|
│ │ ├── customer.go
|
|
│ │ ├── project.go
|
|
│ │ ├── timetracking.go
|
|
│ │ ├── reporting.go
|
|
│ │ └── task.go
|
|
│ ├── middleware/ # API-Middleware
|
|
│ │ ├── auth.go
|
|
│ │ ├── tenant.go
|
|
│ │ └── logging.go
|
|
│ ├── routes/ # API-Routen
|
|
│ │ └── routes.go
|
|
│ └── swagger/ # Swagger-Dokumentation
|
|
│ └── swagger.yaml
|
|
├── test/ # Tests
|
|
│ ├── integration/
|
|
│ ├── unit/
|
|
│ └── mocks/
|
|
├── scripts/ # Skripte für Build, Deployment usw.
|
|
│ ├── build.sh
|
|
│ ├── migrate.sh
|
|
│ └── seed.sh
|
|
├── docker/ # Docker-Konfiguration
|
|
│ ├── Dockerfile
|
|
│ └── docker-compose.yml
|
|
├── go.mod
|
|
├── go.sum
|
|
├── .env.example
|
|
└── README.md
|
|
```
|
|
|
|
## Frontend (NextJS)
|
|
|
|
```
|
|
timetracker-frontend/
|
|
├── public/ # Statische Dateien
|
|
│ ├── assets/
|
|
│ │ ├── images/
|
|
│ │ ├── icons/
|
|
│ │ └── fonts/
|
|
│ └── locales/ # Mehrsprachige Inhalte
|
|
│ ├── de/
|
|
│ └── en/
|
|
├── src/
|
|
│ ├── app/ # Next.js 13+ App Router
|
|
│ │ ├── api/ # API-Routen (falls nötig)
|
|
│ │ ├── (auth)/ # Authentifizierungsseiten
|
|
│ │ │ ├── login/
|
|
│ │ │ └── register/
|
|
│ │ ├── dashboard/ # Dashboard-Seiten
|
|
│ │ │ ├── page.tsx
|
|
│ │ │ └── layout.tsx
|
|
│ │ ├── time-tracking/ # Zeiterfassungsseiten
|
|
│ │ │ ├── page.tsx
|
|
│ │ │ ├── [id]/
|
|
│ │ │ └── components/
|
|
│ │ ├── projects/ # Projektseiten
|
|
│ │ │ ├── page.tsx
|
|
│ │ │ └── [id]/
|
|
│ │ ├── customers/ # Kundenseiten
|
|
│ │ │ ├── page.tsx
|
|
│ │ │ └── [id]/
|
|
│ │ ├── reports/ # Berichtsseiten
|
|
│ │ │ ├── page.tsx
|
|
│ │ │ └── [type]/
|
|
│ │ ├── admin/ # Administrationsseiten
|
|
│ │ │ ├── users/
|
|
│ │ │ ├── companies/
|
|
│ │ │ └── settings/
|
|
│ │ ├── kanban/ # Kanban-Boards (Version 2)
|
|
│ │ │ ├── page.tsx
|
|
│ │ │ └── [id]/
|
|
│ │ ├── layout.tsx
|
|
│ │ └── page.tsx
|
|
│ ├── components/ # Wiederverwendbare Komponenten
|
|
│ │ ├── common/ # Allgemeine Komponenten
|
|
│ │ │ ├── Button.tsx
|
|
│ │ │ ├── Card.tsx
|
|
│ │ │ ├── Input.tsx
|
|
│ │ │ └── ...
|
|
│ │ ├── layout/ # Layout-Komponenten
|
|
│ │ │ ├── Navbar.tsx
|
|
│ │ │ ├── Sidebar.tsx
|
|
│ │ │ ├── Footer.tsx
|
|
│ │ │ └── ...
|
|
│ │ ├── dashboard/ # Dashboard-Komponenten
|
|
│ │ │ ├── ActivityChart.tsx
|
|
│ │ │ ├── RecentEntries.tsx
|
|
│ │ │ └── ...
|
|
│ │ ├── timetracker/ # Zeiterfassungskomponenten
|
|
│ │ │ ├── Timer.tsx
|
|
│ │ │ ├── EntryForm.tsx
|
|
│ │ │ └── ...
|
|
│ │ ├── reports/ # Berichtskomponenten
|
|
│ │ │ ├── ReportFilter.tsx
|
|
│ │ │ ├── Chart.tsx
|
|
│ │ │ └── ...
|
|
│ │ └── kanban/ # Kanban-Komponenten (Version 2)
|
|
│ │ ├── Board.tsx
|
|
│ │ ├── Column.tsx
|
|
│ │ ├── Card.tsx
|
|
│ │ └── ...
|
|
│ ├── hooks/ # Custom React Hooks
|
|
│ │ ├── useAuth.ts
|
|
│ │ ├── useTimeTracking.ts
|
|
│ │ ├── useProjects.ts
|
|
│ │ └── ...
|
|
│ ├── lib/ # Hilfsfunktionen und Bibliotheken
|
|
│ │ ├── api.ts # API Client
|
|
│ │ ├── auth.ts # Auth-Utilities
|
|
│ │ ├── date-utils.ts # Date-Helpers
|
|
│ │ └── ...
|
|
│ ├── types/ # TypeScript-Typdefinitionen
|
|
│ │ ├── auth.ts
|
|
│ │ ├── user.ts
|
|
│ │ ├── timeTracking.ts
|
|
│ │ ├── project.ts
|
|
│ │ └── ...
|
|
│ ├── store/ # State Management (falls benötigt)
|
|
│ │ ├── slices/
|
|
│ │ └── index.ts
|
|
│ ├── styles/ # CSS/SCSS Styles
|
|
│ │ ├── globals.css
|
|
│ │ └── theme.ts
|
|
│ └── utils/ # Allgemeine Hilfsfunktionen
|
|
│ ├── format.ts
|
|
│ ├── validation.ts
|
|
│ └── ...
|
|
├── .env.local.example
|
|
├── .eslintrc.json
|
|
├── next.config.js
|
|
├── package.json
|
|
├── tailwind.config.js
|
|
├── tsconfig.json
|
|
├── jest.config.js # Test-Konfiguration
|
|
├── postcss.config.js # PostCSS-Konfiguration
|
|
└── README.md
|
|
```
|
|
|
|
## Datenbankschema (PostgreSQL)
|
|
|
|
```sql
|
|
-- Multi-Tenant
|
|
CREATE TABLE companies (
|
|
id UUID PRIMARY KEY,
|
|
name VARCHAR(255) NOT NULL,
|
|
address TEXT,
|
|
contact_email VARCHAR(255),
|
|
contact_phone VARCHAR(50),
|
|
logo_url TEXT,
|
|
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
-- Benutzer und Rollen
|
|
CREATE TABLE roles (
|
|
id SERIAL PRIMARY KEY,
|
|
name VARCHAR(50) UNIQUE NOT NULL,
|
|
permissions JSONB
|
|
);
|
|
|
|
CREATE TABLE users (
|
|
id UUID PRIMARY KEY,
|
|
company_id UUID REFERENCES companies(id),
|
|
email VARCHAR(255) UNIQUE NOT NULL,
|
|
password_hash VARCHAR(255) NOT NULL,
|
|
first_name VARCHAR(100),
|
|
last_name VARCHAR(100),
|
|
role_id INTEGER REFERENCES roles(id),
|
|
hourly_rate DECIMAL(10, 2),
|
|
is_active BOOLEAN DEFAULT TRUE,
|
|
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
-- Kunden
|
|
CREATE TABLE customers (
|
|
id UUID PRIMARY KEY,
|
|
company_id UUID NOT NULL REFERENCES companies(id),
|
|
name VARCHAR(255) NOT NULL,
|
|
contact_person VARCHAR(255),
|
|
email VARCHAR(255),
|
|
phone VARCHAR(50),
|
|
address TEXT,
|
|
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
-- Projekte
|
|
CREATE TABLE projects (
|
|
id UUID PRIMARY KEY,
|
|
company_id UUID NOT NULL REFERENCES companies(id),
|
|
customer_id UUID REFERENCES customers(id),
|
|
name VARCHAR(255) NOT NULL,
|
|
description TEXT,
|
|
start_date DATE,
|
|
end_date DATE,
|
|
status VARCHAR(50),
|
|
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
-- Tätigkeiten
|
|
CREATE TABLE activities (
|
|
id UUID PRIMARY KEY,
|
|
company_id UUID NOT NULL REFERENCES companies(id),
|
|
name VARCHAR(255) NOT NULL,
|
|
description TEXT,
|
|
billing_rate DECIMAL(10, 2),
|
|
is_active BOOLEAN DEFAULT TRUE,
|
|
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
-- Zeitbuchungen
|
|
CREATE TABLE time_entries (
|
|
id UUID PRIMARY KEY,
|
|
company_id UUID NOT NULL REFERENCES companies(id),
|
|
user_id UUID NOT NULL REFERENCES users(id),
|
|
project_id UUID NOT NULL REFERENCES projects(id),
|
|
activity_id UUID NOT NULL REFERENCES activities(id),
|
|
start_time TIMESTAMP NOT NULL,
|
|
end_time TIMESTAMP NOT NULL,
|
|
duration INTEGER NOT NULL, -- in minutes
|
|
description TEXT,
|
|
billable_percentage INTEGER NOT NULL DEFAULT 100,
|
|
billing_rate DECIMAL(10, 2),
|
|
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
-- Version 2: Sprint/Task Management
|
|
CREATE TABLE sprints (
|
|
id UUID PRIMARY KEY,
|
|
project_id UUID NOT NULL REFERENCES projects(id),
|
|
name VARCHAR(255) NOT NULL,
|
|
start_date DATE NOT NULL,
|
|
end_date DATE NOT NULL,
|
|
status VARCHAR(50),
|
|
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
CREATE TABLE task_statuses (
|
|
id SERIAL PRIMARY KEY,
|
|
company_id UUID NOT NULL REFERENCES companies(id),
|
|
name VARCHAR(100) NOT NULL,
|
|
color VARCHAR(7),
|
|
position INTEGER NOT NULL,
|
|
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
CREATE TABLE tasks (
|
|
id UUID PRIMARY KEY,
|
|
company_id UUID NOT NULL REFERENCES companies(id),
|
|
project_id UUID NOT NULL REFERENCES projects(id),
|
|
sprint_id UUID REFERENCES sprints(id),
|
|
title VARCHAR(255) NOT NULL,
|
|
description TEXT,
|
|
assignee_id UUID REFERENCES users(id),
|
|
status_id INTEGER REFERENCES task_statuses(id),
|
|
priority VARCHAR(50),
|
|
estimate INTEGER, -- in minutes
|
|
due_date TIMESTAMP,
|
|
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
CREATE TABLE kanban_boards (
|
|
id UUID PRIMARY KEY,
|
|
company_id UUID NOT NULL REFERENCES companies(id),
|
|
project_id UUID NOT NULL REFERENCES projects(id),
|
|
name VARCHAR(255) NOT NULL,
|
|
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
CREATE TABLE kanban_columns (
|
|
id UUID PRIMARY KEY,
|
|
board_id UUID NOT NULL REFERENCES kanban_boards(id),
|
|
name VARCHAR(100) NOT NULL,
|
|
position INTEGER NOT NULL,
|
|
task_status_id INTEGER REFERENCES task_statuses(id),
|
|
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
-- Verknüpfung zwischen Zeitbuchungen und Tasks
|
|
ALTER TABLE time_entries ADD COLUMN task_id UUID REFERENCES tasks(id);
|
|
|
|
-- Indizes für Performance
|
|
CREATE INDEX idx_time_entries_user ON time_entries(user_id);
|
|
CREATE INDEX idx_time_entries_project ON time_entries(project_id);
|
|
CREATE INDEX idx_time_entries_date ON time_entries(start_time);
|
|
CREATE INDEX idx_projects_company ON projects(company_id);
|
|
CREATE INDEX idx_users_company ON users(company_id);
|
|
CREATE INDEX idx_tasks_project ON tasks(project_id);
|
|
CREATE INDEX idx_tasks_sprint ON tasks(sprint_id);
|
|
``` |