76 lines
3.3 KiB
Python
76 lines
3.3 KiB
Python
from __future__ import annotations
|
|
|
|
from pathlib import Path
|
|
|
|
from sqlalchemy.orm import Session
|
|
|
|
from app.modules.orion.components import (
|
|
AttachmentComponent,
|
|
ChecklistComponent,
|
|
CoverComponent,
|
|
CustomerComponent,
|
|
DeviceComponent,
|
|
DryingComponent,
|
|
EnvironmentComponent,
|
|
EquipmentComponent,
|
|
LoadingComponent,
|
|
MeasurementComponent,
|
|
ProgramComponent,
|
|
RecommendationComponent,
|
|
ReportComponent,
|
|
StaticTextComponent,
|
|
SummaryComponent,
|
|
TocComponent,
|
|
)
|
|
from app.modules.orion.context import OrionContextBuilder, ReportContext
|
|
from app.modules.orion.templates.report import render_document
|
|
|
|
|
|
class OrionReportService:
|
|
def __init__(self, session: Session, generated_dir: Path | None = None) -> None:
|
|
self.session = session
|
|
self.generated_dir = generated_dir or Path("/app/reports")
|
|
|
|
def render_html(self, validation_id: str) -> str:
|
|
context = OrionContextBuilder(self.session, self.generated_dir).build(validation_id)
|
|
components = self._components()
|
|
chapters = [component.render(context) for component in components]
|
|
return render_document(context, chapters)
|
|
|
|
def render_pdf(self, validation_id: str) -> Path:
|
|
from weasyprint import HTML
|
|
|
|
context = OrionContextBuilder(self.session, self.generated_dir).build(validation_id)
|
|
output_path = context.generated_dir / f"{context.validation.report_number}.pdf"
|
|
html = self.render_html(validation_id)
|
|
HTML(string=html, base_url=str(context.generated_dir)).write_pdf(output_path)
|
|
return output_path
|
|
|
|
def _components(self) -> list[ReportComponent]:
|
|
chapters: list[ReportComponent] = [
|
|
StaticTextComponent("bq", "1. Funktionsqualifikation (BQ)", "Anlass, Ziel und gesetzliche Grundlagen werden anhand der erfassten Validierungsdaten bewertet."),
|
|
StaticTextComponent("bq-goal", "1.1 Anlass und Ziel der Pruefung"),
|
|
StaticTextComponent("legal", "1.2 Gesetzliche Grundlagen"),
|
|
DeviceComponent(),
|
|
StaticTextComponent("performance", "1.4 Leistungsueberpruefung"),
|
|
ChecklistComponent(),
|
|
StaticTextComponent("work-instructions", "Arbeitsanweisungen"),
|
|
EnvironmentComponent(),
|
|
StaticTextComponent("batch-control", "1.9 Chargenkontrolle"),
|
|
ProgramComponent(),
|
|
LoadingComponent(),
|
|
StaticTextComponent("reference-load", "1.12 Referenzbeladung"),
|
|
EquipmentComponent(),
|
|
StaticTextComponent("equipment-thermo", "2.2 Pruefmittel zur thermoelektrischen Untersuchung"),
|
|
StaticTextComponent("configuration", "3. Pruefkonfiguration"),
|
|
MeasurementComponent(),
|
|
StaticTextComponent("results", "4. Ergebnisse der Validierung"),
|
|
DryingComponent(),
|
|
RecommendationComponent(),
|
|
AttachmentComponent(),
|
|
StaticTextComponent("cycles", "6. Programmablaeufe / Zyklen"),
|
|
StaticTextComponent("risk", "7. Risikoeinstufung und Abschlussgespraech"),
|
|
StaticTextComponent("certificates", "8. Zertifikate"),
|
|
StaticTextComponent("calibration-certificates", "9. Kalibrierzertifikate"),
|
|
]
|
|
return [CoverComponent(), SummaryComponent(), TocComponent(chapters), CustomerComponent(), *chapters]
|