diff --git a/backend/app/models/file.py b/backend/app/models/file.py
index 5be57b2..b7e43de 100644
--- a/backend/app/models/file.py
+++ b/backend/app/models/file.py
@@ -2,6 +2,7 @@
import uuid
from datetime import datetime
+from typing import TYPE_CHECKING
from sqlalchemy import DateTime, ForeignKey, Integer, String, func
from sqlalchemy.dialects.postgresql import UUID
@@ -9,6 +10,9 @@ from sqlalchemy.orm import Mapped, mapped_column, relationship
from app.database import Base
+if TYPE_CHECKING:
+ from app.models.vehicle import Vehicle
+
class File(Base):
"""File attachment entity linked to a vehicle."""
diff --git a/backend/app/models/retouch.py b/backend/app/models/retouch.py
index b0f6899..00187a9 100644
--- a/backend/app/models/retouch.py
+++ b/backend/app/models/retouch.py
@@ -3,6 +3,7 @@
import enum
import uuid
from datetime import datetime
+from typing import TYPE_CHECKING
from sqlalchemy import DateTime, ForeignKey, String, Text, func
from sqlalchemy.dialects.postgresql import UUID
@@ -10,6 +11,9 @@ from sqlalchemy.orm import Mapped, mapped_column, relationship
from app.database import Base
+if TYPE_CHECKING:
+ from app.models.vehicle import Vehicle
+
class RetouchStatus(str, enum.Enum):
pending = "pending"
diff --git a/backend/app/models/sale.py b/backend/app/models/sale.py
index 47dad1a..d21a36e 100644
--- a/backend/app/models/sale.py
+++ b/backend/app/models/sale.py
@@ -4,6 +4,7 @@ import enum
import uuid
from datetime import date, datetime
from decimal import Decimal
+from typing import TYPE_CHECKING
from sqlalchemy import (
Boolean,
@@ -20,6 +21,10 @@ from sqlalchemy.orm import Mapped, mapped_column, relationship
from app.database import Base
+if TYPE_CHECKING:
+ from app.models.contact import Contact
+ from app.models.vehicle import Vehicle
+
class SaleStatus(str, enum.Enum):
draft = "draft"
diff --git a/backend/app/models/user.py b/backend/app/models/user.py
index 85fd198..ed78787 100644
--- a/backend/app/models/user.py
+++ b/backend/app/models/user.py
@@ -2,7 +2,7 @@
import enum
import uuid
-from datetime import datetime, timezone
+from datetime import datetime
from sqlalchemy import Boolean, DateTime, Enum, String, func
from sqlalchemy.dialects.postgresql import UUID
diff --git a/backend/app/models/vehicle.py b/backend/app/models/vehicle.py
index 7db63a3..5882b5e 100644
--- a/backend/app/models/vehicle.py
+++ b/backend/app/models/vehicle.py
@@ -4,12 +4,12 @@ import enum
import uuid
from datetime import date, datetime
from decimal import Decimal
+from typing import TYPE_CHECKING
from sqlalchemy import (
CheckConstraint,
Date,
DateTime,
- Enum,
ForeignKey,
Integer,
Numeric,
@@ -22,6 +22,9 @@ from sqlalchemy.orm import Mapped, mapped_column, relationship
from app.database import Base
+if TYPE_CHECKING:
+ from app.models.file import File
+
class VehicleCondition(str, enum.Enum):
new = "new"
diff --git a/backend/app/routers/datev.py b/backend/app/routers/datev.py
index 1d628d7..dfc0e02 100644
--- a/backend/app/routers/datev.py
+++ b/backend/app/routers/datev.py
@@ -2,7 +2,7 @@
import uuid
-from fastapi import APIRouter, Depends, HTTPException, Query, status
+from fastapi import APIRouter, Depends, HTTPException, status
from fastapi.responses import Response
from sqlalchemy.ext.asyncio import AsyncSession
diff --git a/backend/app/routers/users.py b/backend/app/routers/users.py
index f5483ad..f512f76 100644
--- a/backend/app/routers/users.py
+++ b/backend/app/routers/users.py
@@ -2,11 +2,11 @@
import uuid
-from fastapi import APIRouter, Depends, HTTPException, Query, status
+from fastapi import APIRouter, Depends, HTTPException, status
from sqlalchemy.ext.asyncio import AsyncSession
from app.database import get_db
-from app.dependencies import get_current_user, get_pagination, require_role
+from app.dependencies import get_pagination, require_role
from app.models.user import User
from app.schemas.user import (
UserCreate,
@@ -17,7 +17,6 @@ from app.schemas.user import (
from app.services.auth_service import (
create_user as svc_create_user,
deactivate_user as svc_deactivate_user,
- get_user_by_id,
list_users as svc_list_users,
update_user as svc_update_user,
)
diff --git a/backend/app/routers/vehicles.py b/backend/app/routers/vehicles.py
index f921fac..0925339 100644
--- a/backend/app/routers/vehicles.py
+++ b/backend/app/routers/vehicles.py
@@ -8,7 +8,6 @@ from sqlalchemy.ext.asyncio import AsyncSession
from app.database import get_db
from app.dependencies import get_current_user, get_pagination
from app.models.user import User
-from app.models.vehicle import Vehicle
from app.schemas.vehicle import (
MobileDePushResponse,
MobileDeStatusResponse,
diff --git a/backend/app/schemas/contact.py b/backend/app/schemas/contact.py
index 5859303..350f96d 100644
--- a/backend/app/schemas/contact.py
+++ b/backend/app/schemas/contact.py
@@ -4,7 +4,7 @@ import uuid
from datetime import datetime
from typing import Literal, Optional
-from pydantic import BaseModel, ConfigDict, EmailStr, Field, field_validator
+from pydantic import BaseModel, ConfigDict, Field, field_validator
from app.utils.ust_validation import validate_vat_id
diff --git a/backend/app/schemas/vehicle.py b/backend/app/schemas/vehicle.py
index 85aceff..287024d 100644
--- a/backend/app/schemas/vehicle.py
+++ b/backend/app/schemas/vehicle.py
@@ -5,7 +5,7 @@ from datetime import date, datetime
from decimal import Decimal
from typing import Literal, Optional
-from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator
+from pydantic import BaseModel, ConfigDict, Field, model_validator
VEHICLE_TYPES = Literal["lkw", "pkw", "baumaschine", "stapler", "transporter"]
diff --git a/backend/app/services/copilot_service.py b/backend/app/services/copilot_service.py
index d317b82..b21bc65 100644
--- a/backend/app/services/copilot_service.py
+++ b/backend/app/services/copilot_service.py
@@ -43,7 +43,7 @@ def _parse_ai_response(raw_content: str) -> dict[str, Any]:
# Strip markdown code fences if present
if text.startswith("```"):
lines = text.split("\n")
- lines = [l for l in lines if not l.strip().startswith("```")]
+ lines = [line for line in lines if not line.strip().startswith("```")]
text = "\n".join(lines).strip()
try:
diff --git a/backend/app/services/datev_service.py b/backend/app/services/datev_service.py
index 489d894..07d1ae0 100644
--- a/backend/app/services/datev_service.py
+++ b/backend/app/services/datev_service.py
@@ -6,7 +6,6 @@ import os
import uuid
from datetime import date
from decimal import Decimal
-from typing import Any
from sqlalchemy import and_, func, select
from sqlalchemy.ext.asyncio import AsyncSession
@@ -14,7 +13,7 @@ from sqlalchemy.orm import selectinload
from app.models.datev_export import DATEVExport
from app.models.sale import Sale
-from app.utils.datev import generate_datev_csv, validate_datev_csv
+from app.utils.datev import generate_datev_csv
async def create_export(
diff --git a/backend/app/services/file_service.py b/backend/app/services/file_service.py
index e0e5c97..1dbdeb2 100644
--- a/backend/app/services/file_service.py
+++ b/backend/app/services/file_service.py
@@ -8,7 +8,6 @@ Enforces MAX_FILE_SIZE_MB from config (default 50MB, but endpoint enforces 20MB)
from __future__ import annotations
import logging
-import os
import uuid
from pathlib import Path
from typing import Optional
diff --git a/backend/app/services/mobilede_service.py b/backend/app/services/mobilede_service.py
index 51d541f..204c535 100644
--- a/backend/app/services/mobilede_service.py
+++ b/backend/app/services/mobilede_service.py
@@ -8,10 +8,9 @@ from __future__ import annotations
import uuid
from datetime import datetime, timezone
-from typing import Any
import httpx
-from sqlalchemy import and_, select
+from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession
from app.config import settings
diff --git a/backend/app/services/ocr_service.py b/backend/app/services/ocr_service.py
index 10b4702..c077d9e 100644
--- a/backend/app/services/ocr_service.py
+++ b/backend/app/services/ocr_service.py
@@ -5,8 +5,6 @@ from __future__ import annotations
import logging
import os
import uuid
-from datetime import datetime, timezone
-from typing import Any
from sqlalchemy import and_, func, select
from sqlalchemy.ext.asyncio import AsyncSession
diff --git a/backend/app/services/price_compare_service.py b/backend/app/services/price_compare_service.py
index ac285fe..366a2b4 100644
--- a/backend/app/services/price_compare_service.py
+++ b/backend/app/services/price_compare_service.py
@@ -5,7 +5,6 @@ from __future__ import annotations
import logging
import random
import uuid
-from typing import Any
from sqlalchemy.ext.asyncio import AsyncSession
@@ -83,7 +82,7 @@ async def compare_prices(
# Calculate average price
if listings:
- average_price = round(sum(l.price for l in listings) / len(listings), 2)
+ average_price = round(sum(listing.price for listing in listings) / len(listings), 2)
else:
average_price = None
diff --git a/backend/app/services/sale_service.py b/backend/app/services/sale_service.py
index e5eca5a..059063a 100644
--- a/backend/app/services/sale_service.py
+++ b/backend/app/services/sale_service.py
@@ -3,8 +3,7 @@
from __future__ import annotations
import uuid
-from datetime import date, datetime, timezone
-from decimal import Decimal
+from datetime import date
from typing import Any
from sqlalchemy import and_, func, select
@@ -26,7 +25,6 @@ async def create_sale(db: AsyncSession, data: dict[str, Any]) -> Sale:
Raises ValueError if vehicle or buyer contact not found.
"""
vehicle_id = data["vehicle_id"]
- buyer_contact_id = data["buyer_contact_id"]
# Verify vehicle exists
vehicle = await db.get(Vehicle, vehicle_id)
diff --git a/backend/app/services/vehicle_service.py b/backend/app/services/vehicle_service.py
index 3d77385..84923ba 100644
--- a/backend/app/services/vehicle_service.py
+++ b/backend/app/services/vehicle_service.py
@@ -8,7 +8,6 @@ from typing import Any
from sqlalchemy import and_, func, or_, select
from sqlalchemy.ext.asyncio import AsyncSession
-from sqlalchemy.orm import selectinload
from app.models.vehicle import Vehicle
diff --git a/backend/app/tasks/ocr_processing.py b/backend/app/tasks/ocr_processing.py
index 6ce020a..34c00f9 100644
--- a/backend/app/tasks/ocr_processing.py
+++ b/backend/app/tasks/ocr_processing.py
@@ -9,7 +9,6 @@ from __future__ import annotations
import logging
import uuid
-from sqlalchemy.ext.asyncio import AsyncSession
from app.database import async_session_factory
from app.services.ocr_service import process_ocr
diff --git a/backend/app/utils/contract_pdf.py b/backend/app/utils/contract_pdf.py
index ba6589c..72074d3 100644
--- a/backend/app/utils/contract_pdf.py
+++ b/backend/app/utils/contract_pdf.py
@@ -10,7 +10,6 @@ from datetime import date
from decimal import Decimal
from typing import Any
-from app.config import settings
# HTML template for the sales contract
diff --git a/backend/app/utils/datev.py b/backend/app/utils/datev.py
index 9147a32..7bb3b23 100644
--- a/backend/app/utils/datev.py
+++ b/backend/app/utils/datev.py
@@ -6,7 +6,6 @@ Datum, Konto, Gegenkonto, Betrag, Belegfeld, Buchungstext
import csv
import io
-from datetime import date
from decimal import Decimal
from typing import Any
diff --git a/backend/app/utils/openrouter.py b/backend/app/utils/openrouter.py
index 79076f9..1a837b7 100644
--- a/backend/app/utils/openrouter.py
+++ b/backend/app/utils/openrouter.py
@@ -84,7 +84,7 @@ def _parse_response(raw_content: str) -> dict[str, Any]:
if text.startswith("```"):
lines = text.split("\n")
# Remove first line (```json or ```) and last line (```)
- lines = [l for l in lines if not l.strip().startswith("```")]
+ lines = [line for line in lines if not line.strip().startswith("```")]
text = "\n".join(lines).strip()
try:
diff --git a/frontend/.eslintrc.json b/frontend/.eslintrc.json
new file mode 100644
index 0000000..2541221
--- /dev/null
+++ b/frontend/.eslintrc.json
@@ -0,0 +1 @@
+{"extends":"next/core-web-vitals"}
diff --git a/frontend/components/files/FileGallery.tsx b/frontend/components/files/FileGallery.tsx
index a69f6a0..6f72823 100644
--- a/frontend/components/files/FileGallery.tsx
+++ b/frontend/components/files/FileGallery.tsx
@@ -7,6 +7,7 @@ import {
getThumbnailUrl,
type FileResponse,
} from '@/lib/files';
+import Image from 'next/image';
import { FilePreview } from './FilePreview';
interface FileGalleryProps {
@@ -76,10 +77,12 @@ export function FileGallery({ vehicleId }: FileGalleryProps) {
data-testid={`gallery-item-${image.id}`}
>
{thumbUrl && (
-
)}
Es wurde noch kein Vertrag generiert.
- Klicken Sie auf "Vertrag neu generieren", um ein PDF zu erstellen. + Klicken Sie auf "Vertrag neu generieren", um ein PDF zu erstellen.