mirror of
https://gitlab.com/Chill-Projet/chill-bundles.git
synced 2025-07-05 08:26:13 +00:00
88 lines
2.3 KiB
PHP
88 lines
2.3 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
/*
|
|
* Chill is a software for social workers
|
|
*
|
|
* For the full copyright and license information, please view
|
|
* the LICENSE file that was distributed with this source code.
|
|
*/
|
|
|
|
namespace Chill\MainBundle\Service\Import;
|
|
|
|
use Exception;
|
|
use League\Csv\Reader;
|
|
use League\Csv\Statement;
|
|
use Symfony\Contracts\HttpClient\HttpClientInterface;
|
|
use UnexpectedValueException;
|
|
use function is_int;
|
|
|
|
class AddressReferenceFromBano
|
|
{
|
|
private AddressReferenceBaseImporter $baseImporter;
|
|
|
|
private HttpClientInterface $client;
|
|
|
|
public function __construct(HttpClientInterface $client, AddressReferenceBaseImporter $baseImporter)
|
|
{
|
|
$this->client = $client;
|
|
$this->baseImporter = $baseImporter;
|
|
}
|
|
|
|
public function import(string $departementNo): void
|
|
{
|
|
if (!is_numeric($departementNo) || !is_int((int) $departementNo)) {
|
|
throw new UnexpectedValueException('Could not parse this department number');
|
|
}
|
|
|
|
$url = "https://bano.openstreetmap.fr/data/bano-{$departementNo}.csv";
|
|
|
|
$response = $this->client->request('GET', $url);
|
|
|
|
if (200 !== $response->getStatusCode()) {
|
|
throw new Exception('Could not download CSV: ' . $response->getStatusCode());
|
|
}
|
|
|
|
$file = tmpfile();
|
|
|
|
foreach ($this->client->stream($response) as $chunk) {
|
|
fwrite($file, $chunk->getContent());
|
|
}
|
|
|
|
fseek($file, 0);
|
|
|
|
$csv = Reader::createFromStream($file);
|
|
$csv->setDelimiter(',');
|
|
$stmt = Statement::create()
|
|
->process($csv, [
|
|
'refId',
|
|
'streetNumber',
|
|
'street',
|
|
'postcode',
|
|
'city',
|
|
'_o',
|
|
'lat',
|
|
'lon',
|
|
]);
|
|
|
|
foreach ($stmt as $record) {
|
|
$this->baseImporter->importAddress(
|
|
$record['refId'],
|
|
substr($record['refId'], 0, 5), // extract insee from reference
|
|
$record['postcode'],
|
|
$record['street'],
|
|
$record['streetNumber'],
|
|
'BANO.' . $departementNo,
|
|
(float) $record['lat'],
|
|
(float) $record['lon'],
|
|
4326
|
|
);
|
|
}
|
|
|
|
$this->baseImporter->finalize();
|
|
|
|
fclose($file);
|
|
}
|
|
}
|