Files
erp-nutzfahrzeuge/.a0/worklog.md
T
Leopoldadmin 2cf433a01c feat(T04): contact management + USt-IdNr. validation + contact UI
- Contact model: company, role (kaeufer/verkaeufer/beide), soft-delete
- ContactPerson model: 1:N relation with CASCADE delete
- USt-IdNr. validation: DE + 10 EU countries
- Contact CRUD: 7 API endpoints with RBAC, search/filter/paginate
- Frontend: ContactList, ContactForm, ContactDetail with EU/Inland toggle
- 73 backend tests (91% coverage), 20 frontend tests
2026-07-14 12:14:21 +02:00

5.6 KiB
Raw Blame History

Worklog - ERP Nutzfahrzeuge

2026-07-13

  • Phase 1 (Discovery + UI Design): Abgeschlossen
    • requirements.md erstellt (703 Zeilen)
    • UI-Prototyp v8d erstellt und auf webspace.media-on.de gepublished
    • component_inventory.md erstellt
  • Phase 2 (Architektur): Abgeschlossen
    • architecture.md erstellt (1162 Zeilen, 14 ADRs)
    • task_graph.json erstellt (8 Tasks T01-T08)
    • AGENTS.md erstellt
  • Git: 2 Commits auf main (afe6d0a, be5a339), auf Forgejo gepusht
  • .gitignore erstellt
  • Bereit für Phase 3 (Implementation), wartet auf User-Freigabe

T01 Auth + User Management + RBAC + Frontend + i18n (2026-07-14)

Backend

  • config.py: Pydantic BaseSettings, alle Env-Vars (DATABASE_URL, REDIS_URL, JWT_SECRET, CORS_ORIGINS, etc.)
  • database.py: Async SQLAlchemy engine, session factory, Base, init_db/drop_db
  • models/user.py: User mit UUID PK, email, password_hash, role (Enum), language, is_active, timestamps
  • schemas/user.py: LoginRequest, TokenResponse, RefreshRequest, UserCreate/Update/Response, UserListResponse
  • utils/jwt.py: create_access_token, create_refresh_token, decode_token, verify_access/refresh_token
  • services/auth_service.py: hash_password, verify_password, authenticate_user, generate_token_pair, refresh_access_token, create_user, list_users, update_user, deactivate_user
  • dependencies.py: get_pagination, get_current_user (JWT extraction), require_role (RBAC)
  • routers/auth.py: POST /login, POST /refresh, GET /me
  • routers/users.py: GET / (list paginated), POST / (create), PUT /:id (update), DELETE /:id (soft-delete) alle admin-only
  • main.py: FastAPI app, CORS middleware, /api/v1 prefix, /health endpoint
  • tests/: conftest.py (async fixtures, PostgreSQL), test_auth.py (12 tests), test_users.py (14 tests), test_health.py (3 tests), test_auth_service.py (21 tests)
  • requirements.txt, .env.example, pytest.ini, .coveragerc

Frontend

  • package.json, tsconfig.json, next.config.js, tailwind.config.ts, vitest.config.ts
  • app/layout.tsx, app/page.tsx, app/globals.css (design tokens als CSS vars)
  • app/(auth)/layout.tsx (I18nProvider + ToastProvider wrapper)
  • app/(auth)/login/page.tsx (Login-Form mit Validation, API call, Toast on error)
  • lib/api.ts (fetch wrapper mit auto-refresh, login, getCurrentUser, listUsers, createUser, deleteUser)
  • lib/auth.ts (useAuth hook, useRequireAuth)
  • lib/i18n.tsx (I18nProvider, useI18n, DE/EN translation)
  • components/ui/: Button, Input, Card, Table, Modal, Toast (alle 6 Komponenten)
  • messages/de.json (31 keys), messages/en.json (31 keys)
  • tests/setup.ts, tests/auth.test.tsx (5 tests), tests/i18n.test.tsx (7 tests)

Test Results

  • Backend: 50/50 passed, 88% total coverage
  • Frontend: 12/12 passed, Next.js build success
  • test_report.md erstellt

T02 Vehicle Management + mobile.de Push + Vehicle UI (2026-07-14)

Backend

  • models/vehicle.py: Vehicle + MobileDeListing models with UUID PK, soft-delete, all fields per spec
  • schemas/vehicle.py: VehicleCreate/Update/Response/ListResponse, MobileDeStatusResponse, MobileDePushResponse with auto-compute power_hp
  • utils/mobilede_mapping.py: map_fields() converts Vehicle to mobile.de Ad format
  • services/vehicle_service.py: CRUD with pagination, filtering, sorting, soft-delete
  • services/mobilede_service.py: push/update/delete listing, get status, retry (max 3)
  • routers/vehicles.py: 7 endpoints (list, create, detail, update, delete, mobile-de push, mobile-de status)
  • config.py: Added MOBILE_DE_API_KEY, MOBILE_DE_SELLER_ID
  • main.py: Registered vehicles router

Frontend

  • lib/vehicles.ts: Full API client with typed interfaces
  • components/vehicles/: VehicleList, VehicleForm, VehicleDetail, MobileDeStatus
  • app/[locale]/fahrzeuge/: list page, neu (create) page, [id] detail page
  • tests/vehicles.test.tsx: 16 tests

Test Results

  • Backend: 73/73 pytest passed, 82% total coverage
  • Frontend: 16/16 vitest passed
  • test_report.md updated

T04: Kontakt-/Kundenverwaltung + Contact UI (2026-07-14)

Backend

  • models/contact.py: Contact + ContactPerson models with UUID PK, soft-delete, CHECK constraints for role/vat_id_status/country
  • schemas/contact.py: ContactCreate/Update/Response/ListResponse + ContactPersonCreate/Response with VAT ID field_validator
  • utils/ust_validation.py: DE + 10 EU country regex patterns, EU fallback, validate_vat_id, validate_vat_id_or_raise, get_country_code_from_vat_id
  • services/contact_service.py: list_contacts (search, role filter with beide inclusion, is_eu filter, is_private filter, sort, pagination), get_contact_by_id, create_contact (with nested persons), update_contact, soft_delete_contact, add_contact_person, remove_contact_person
  • routers/contacts.py: 7 endpoints (list, create, detail, update, delete, add person, remove person) with RBAC (all read, admin+verkaeufer write)
  • main.py: Registered contacts router

Frontend

  • lib/contacts.ts: Full API client with typed interfaces + validateVatIdFormat frontend validation
  • components/contacts/ContactList.tsx: Table with search, role filter, EU/Inland filter, sort, pagination
  • components/contacts/ContactForm.tsx: Create/edit form with USt-IdNr. validation, EU/Inland toggle, country selector, role, legal form, address, contact info, is_private
  • components/contacts/ContactDetail.tsx: Detail view with contact persons management (add/remove via Modal)
  • app/[locale]/kontakte/: list page, neu (create) page, [id] detail page
  • tests/contacts.test.tsx: 20 tests

Test Results

  • Backend: 73/73 pytest passed, 91% coverage on contact modules (service 99%, ust_validation 94%, models 93%, schemas 94%, router 67%)
  • Frontend: 20/20 vitest passed
  • test_report.md updated