Files
myep-team/src/Command/BpnImportCommand.php
T

126 lines
4.5 KiB
PHP

<?php
namespace App\Command;
use App\BusProNet\DataProvider\HotelDataProvider;
use App\BusProNet\DataProvider\PickupDataProvider;
use Doctrine\DBAL\Connection;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;
use Symfony\Component\Finder\Finder;
#[AsCommand(
name: 'app:bpn-import',
description: 'Imports dates, products and hotels from BusProNet',
)]
class BpnImportCommand extends Command
{
public function __construct(
private readonly Connection $connection,
private readonly HotelDataProvider $hotelDataProvider,
private readonly PickupDataProvider $pickupDataProvider,
private readonly string $xmlFilesPath
) {
parent::__construct();
}
protected function execute(InputInterface $input, OutputInterface $output): int
{
$io = new SymfonyStyle($input, $output);
// Get all xml files
$xmlFiles = (new Finder())
->name('Ziel_*.xml')
->in($this->xmlFilesPath)
;
$totalCount = count($xmlFiles);
if (0 === $totalCount) {
$io->error('No XML files available or found');
return Command::FAILURE;
}
// Flush dates
$this
->connection
->executeQuery('TRUNCATE TABLE bpn_date')
;
$io->info('Found '.$totalCount.' XML files');
$datesCount = 0;
// Iterate over xml files
foreach ($xmlFiles as $xmlFile) {
// Load xml file into simplexml object
$xml = simplexml_load_file($xmlFile);
// Iterate over all dates
foreach ($xml->xpath('reise/termin') as $dateXml) {
$product = (string) $dateXml->xpath('text')[0];
$busProId = (int) $dateXml->attributes()['idbuspro'];
$code = (string) $dateXml->attributes()['code'];
$dateFrom = \DateTimeImmutable::createFromFormat('d.m.Y', (string) $dateXml->attributes()['termin']);
$dateTo = \DateTimeImmutable::createFromFormat('d.m.Y', (string) $dateXml->attributes()['bis']);
$bus = false;
// Iterate over all service entries and look for 'bus'
foreach ($dateXml->xpath('lei_befoerderung/leistung') as $serviceXml) {
if ('BUS' === (string) $serviceXml->attributes()['unterart']) {
$bus = true;
break;
}
}
// Find pickups
$datePickups = [];
foreach ($dateXml->xpath('zustiege/zustieg') as $pickupXml) {
$pickupBusProId = (int) $pickupXml->attributes()['idbuspro'];
if ($pickupBusProId) {
$pickup = $this->pickupDataProvider->get($pickupBusProId);
$datePickups[] = [
'busProId' => $pickupBusProId,
'city' => $pickup->getCity(),
'street' => $pickup->getStreet(),
'time' => (string) $pickupXml->attributes()['zeit'],
];
}
}
// Iterate over all hotel entries
foreach ($dateXml->xpath('hotel') as $hotelXml) {
$hotelBusProId = (int) $hotelXml->attributes()['idbuspro'];
$hotel = $this->hotelDataProvider->get($hotelBusProId);
// Finally store collected data
$this
->connection
->insert('bpn_date', [
'code' => $code,
'bus_pro_id' => $busProId,
'date_from' => $dateFrom->format('Y-m-d'),
'date_to' => $dateTo->format('Y-m-d'),
'product' => $product,
'hotel' => $hotel->getName(),
'hotel_code' => $hotel->getCode(),
'hotel_bus_pro_id' => $hotelBusProId,
'bus' => (int) $bus,
'pickups' => json_encode($datePickups),
])
;
++$datesCount;
}
}
}
$io->info('Imported '.$datesCount.' dates');
return Command::SUCCESS;
}
}