126 lines
5.4 KiB
Python
126 lines
5.4 KiB
Python
from dataclasses import dataclass
|
|
|
|
from sqlalchemy.orm import Session
|
|
|
|
from app.models.repair import Repair
|
|
from app.repositories.repair_repository import RepairRepository
|
|
from app.schemas.repair import RepairNotificationOverviewResponse, RepairNotificationTemplateResponse, RepairStatus
|
|
|
|
|
|
STATUS_LABELS: dict[str, str] = {
|
|
"new": "Neu",
|
|
"accepted": "Angenommen",
|
|
"diagnosis": "Diagnose",
|
|
"estimate": "Kostenvoranschlag",
|
|
"waiting_for_customer": "Wartet auf Kunde",
|
|
"approved": "Freigegeben",
|
|
"repair": "Reparatur",
|
|
"final_test": "Endprüfung",
|
|
"ready_for_pickup": "Abholbereit",
|
|
"shipped": "Versand",
|
|
"completed": "Abgeschlossen",
|
|
"cancelled": "Storniert",
|
|
}
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class RepairNotificationTemplate:
|
|
event_type: str
|
|
status: RepairStatus | None
|
|
subject: str
|
|
text: str
|
|
html: str | None = None
|
|
|
|
|
|
TEMPLATES: tuple[RepairNotificationTemplate, ...] = (
|
|
RepairNotificationTemplate(
|
|
event_type="repair_created",
|
|
status="new",
|
|
subject="Reparatur {repair_number} wurde erfasst",
|
|
text="Guten Tag {customer_name},\n\nIhre Reparatur {repair_number} für {device} wurde erfasst. Den aktuellen Status finden Sie später unter {public_status_url}.\n\n{company_name}",
|
|
),
|
|
RepairNotificationTemplate(
|
|
event_type="device_accepted",
|
|
status="accepted",
|
|
subject="Gerät zu Reparatur {repair_number} angenommen",
|
|
text="Guten Tag {customer_name},\n\nIhr Gerät {device} wurde angenommen. Aktueller Status: {status_label}.\n\n{company_name}",
|
|
),
|
|
RepairNotificationTemplate(
|
|
event_type="diagnosis_started",
|
|
status="diagnosis",
|
|
subject="Diagnose für Reparatur {repair_number} läuft",
|
|
text="Guten Tag {customer_name},\n\nwir prüfen Ihr Gerät {device}. Aktueller Status: {status_label}.\n\n{company_name}",
|
|
),
|
|
RepairNotificationTemplate(
|
|
event_type="estimate_created",
|
|
status="estimate",
|
|
subject="Kostenvoranschlag zu Reparatur {repair_number}",
|
|
text="Guten Tag {customer_name},\n\nfür Ihr Gerät {device} wurde ein Kostenvoranschlag vorbereitet. Aktueller Status: {status_label}.\n\n{company_name}",
|
|
),
|
|
RepairNotificationTemplate(
|
|
event_type="waiting_for_customer",
|
|
status="waiting_for_customer",
|
|
subject="Freigabe für Reparatur {repair_number} erforderlich",
|
|
text="Guten Tag {customer_name},\n\nfür Ihre Reparatur {repair_number} warten wir auf Ihre Rückmeldung. Aktueller Status: {status_label}.\n\n{company_name}",
|
|
),
|
|
RepairNotificationTemplate(
|
|
event_type="repair_started",
|
|
status="repair",
|
|
subject="Reparatur {repair_number} läuft",
|
|
text="Guten Tag {customer_name},\n\nwir bearbeiten Ihr Gerät {device}. Aktueller Status: {status_label}.\n\n{company_name}",
|
|
),
|
|
RepairNotificationTemplate(
|
|
event_type="final_test",
|
|
status="final_test",
|
|
subject="Endprüfung für Reparatur {repair_number}",
|
|
text="Guten Tag {customer_name},\n\nIhr Gerät {device} befindet sich in der Endprüfung. Aktueller Status: {status_label}.\n\n{company_name}",
|
|
),
|
|
RepairNotificationTemplate(
|
|
event_type="ready_for_pickup",
|
|
status="ready_for_pickup",
|
|
subject="Reparatur {repair_number} ist abholbereit",
|
|
text="Guten Tag {customer_name},\n\nIhr Gerät {device} ist abholbereit. Aktueller Status: {status_label}.\n\n{company_name}",
|
|
),
|
|
RepairNotificationTemplate(
|
|
event_type="shipped",
|
|
status="shipped",
|
|
subject="Reparatur {repair_number} wurde versendet",
|
|
text="Guten Tag {customer_name},\n\nIhr Gerät {device} wurde versendet. Aktueller Status: {status_label}.\n\n{company_name}",
|
|
),
|
|
RepairNotificationTemplate(
|
|
event_type="completed",
|
|
status="completed",
|
|
subject="Reparatur {repair_number} abgeschlossen",
|
|
text="Guten Tag {customer_name},\n\nIhre Reparatur {repair_number} wurde abgeschlossen. Vielen Dank.\n\n{company_name}",
|
|
),
|
|
)
|
|
|
|
|
|
class RepairNotificationService:
|
|
@staticmethod
|
|
def render_templates(repair: Repair, *, public_status_url: str = "") -> list[RepairNotificationTemplateResponse]:
|
|
placeholders = {
|
|
"repair_number": repair.repair_number,
|
|
"customer_name": repair.customer_name,
|
|
"device": f"{repair.device_manufacturer} {repair.device_model}".strip(),
|
|
"status_label": STATUS_LABELS.get(repair.status, repair.status),
|
|
"public_status_url": public_status_url or "wird später bereitgestellt",
|
|
"company_name": "Olympus CRM",
|
|
}
|
|
return [
|
|
RepairNotificationTemplateResponse(
|
|
event_type=template.event_type,
|
|
status=template.status,
|
|
subject=template.subject.format(**placeholders),
|
|
text=template.text.format(**placeholders),
|
|
html=template.html.format(**placeholders) if template.html else None,
|
|
)
|
|
for template in TEMPLATES
|
|
]
|
|
|
|
@staticmethod
|
|
def overview(db: Session, repair: Repair, *, public_status_url: str = "") -> RepairNotificationOverviewResponse:
|
|
return RepairNotificationOverviewResponse(
|
|
templates=RepairNotificationService.render_templates(repair, public_status_url=public_status_url),
|
|
events=RepairRepository.list_notification_events(db, repair.id),
|
|
)
|