feat(customers): add controlled CSV and XLSX customer import

This commit is contained in:
Schubert Ferenc 2026-07-12 15:19:15 +02:00
parent 613ffdc8b7
commit 82e03877b3
566 changed files with 2752 additions and 991 deletions

View file

@ -64,6 +64,7 @@ from app.schemas.domain import (
UserPasswordResetRequest,
)
from app.services.domain_service import CrudService, DomainServices
from app.services.customer_import import CustomerImportService, parse_json_object
from app.services.quickstart_service import QuickStartService
from app.services.report_settings import OrionReportSettingsService
from app.services.validation_workflow import ValidationWorkflowService
@ -214,6 +215,51 @@ def paging(
return {"page": page, "page_size": page_size, "search": search}
@router.post("/customer-imports/preview")
async def preview_customer_import(
file: UploadFile,
mapping: str | None = Form(default=None),
session: Session = Depends(get_session),
_: User = Depends(current_admin),
):
try:
content = await file.read()
parsed_mapping = parse_json_object(mapping) if mapping else None
return CustomerImportService(session).preview(file.filename or "import", content, parsed_mapping)
except ValueError as exc:
raise HTTPException(status_code=422, detail=str(exc)) from exc
except UnicodeDecodeError as exc:
raise HTTPException(status_code=422, detail="Die CSV-Datei muss UTF-8 kodiert sein.") from exc
@router.post("/customer-imports/confirm")
async def confirm_customer_import(
file: UploadFile,
mapping: str = Form(...),
row_actions: str | None = Form(default=None),
ignore_empty_values: bool = Form(default=True),
session: Session = Depends(get_session),
user: User = Depends(current_admin),
):
try:
content = await file.read()
result = CustomerImportService(session).confirm(
file.filename or "import",
content,
parse_json_object(mapping),
parse_json_object(row_actions),
ignore_empty_values,
user,
)
return result
except ValueError as exc:
session.rollback()
raise HTTPException(status_code=422, detail=str(exc)) from exc
except IntegrityError as exc:
session.rollback()
raise HTTPException(status_code=409, detail="Der Kundenimport konnte nicht vollständig gespeichert werden.") from exc
def commit_create(session: Session, service: CrudService, payload):
try:
item = service.create(payload.model_dump())