travelLoader->generateFilesMap(); } catch (\Throwable $e) { $this->logger->warning('Failed to generate XML file map after sync; snapshot refresh skipped', [ 'error' => $e->getMessage(), ]); return null; } $total = array_sum(array_map(fn (array $entry): int => count($entry['hotels']), $xmlFileMap)); return new BpnXmlSnapshotRefreshPlan($xmlFileMap, $total); } public function refresh( BpnXmlSnapshotRefreshPlan $plan, ?callable $onProgress = null, ): BpnXmlSnapshotRefreshResult { $snapshotResult = $this->travelDataService->syncSnapshotsFromXml( $plan->xmlFileMap, function () use ($onProgress): void { if (null !== $onProgress) { $onProgress(); } }, ); $orphanedDeleted = $this->snapshotService->purgeOrphanedFutureSnapshots(array_keys($plan->xmlFileMap)); return new BpnXmlSnapshotRefreshResult( $snapshotResult['processed'], $snapshotResult['failed'], $orphanedDeleted, ); } }