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]