feat: extended insurance parsing, pass info urls to view

This commit is contained in:
Björn Fromme
2026-03-16 11:59:10 +01:00
parent 201b223813
commit e3081e56f8
8 changed files with 277 additions and 23 deletions
+36
View File
@@ -607,6 +607,10 @@ class TravelDataService
try {
$insurances = $this->insuranceLoader->loadAll();
$travel->insurances = array_values($insurances);
// Hydrate package relationships after loading
// Packages lose their containedInsurances during serialization, so rebuild them
$this->hydrateInsurancePackageRelationships($travel->insurances);
} catch (\Exception $e) {
$this->logger->warning('Failed to load insurance data', [
'travelId' => $travel->id,
@@ -614,4 +618,36 @@ class TravelDataService
]);
}
}
/**
* Reconstructs containedInsurances arrays for insurance packages.
*
* Insurance packages reference other insurances via containedInsuranceIds.
* After deserialization, the containedInsurances array is empty due to
* circular reference prevention. This method rebuilds those relationships.
*
* @param array<Insurance> $insurances All insurances including packages
*/
private function hydrateInsurancePackageRelationships(array $insurances): void
{
// Build lookup map of all insurances by ID (includes complementary insurances)
$insuranceById = [];
foreach ($insurances as $insurance) {
$insuranceById[$insurance->id] = $insurance;
}
// Reconstruct containedInsurances for each package
foreach ($insurances as $insurance) {
if (!$insurance->package || empty($insurance->containedInsuranceIds)) {
continue;
}
$insurance->containedInsurances = [];
foreach ($insurance->containedInsuranceIds as $containedId) {
if (isset($insuranceById[$containedId])) {
$insurance->containedInsurances[] = $insuranceById[$containedId];
}
}
}
}
}