<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
/**
* Auto-generated Migration: Please modify to your needs!
*/
final class Version20251009142530 extends AbstractMigration
{
public function getDescription(): string
{
return '';
}
public function up(Schema $schema): void
{
// this up() migration is auto-generated, please modify it to your needs
$this->addSql('ALTER TABLE channel_user_data_cursus_company ADD address_street VARCHAR(255) DEFAULT NULL, ADD address_post_code VARCHAR(15) DEFAULT NULL, ADD address_city VARCHAR(255) DEFAULT NULL, ADD address_country VARCHAR(2) DEFAULT NULL, ADD internship_address_street VARCHAR(255) DEFAULT NULL, ADD internship_address_post_code VARCHAR(15) DEFAULT NULL, ADD internship_address_city VARCHAR(255) DEFAULT NULL, ADD internship_address_country VARCHAR(2) DEFAULT NULL');
}
public function down(Schema $schema): void
{
// this down() migration is auto-generated, please modify it to your needs
$this->addSql('ALTER TABLE channel_user_data_cursus_company DROP address_street, DROP address_post_code, DROP address_city, DROP address_country, DROP internship_address_street, DROP internship_address_post_code, DROP internship_address_city, DROP internship_address_country');
}
public function postUp(Schema $schema): void
{
// Company addresses
$companies = $this->connection->fetchAllAssociative('SELECT id, address FROM channel_user_data_cursus_company WHERE address IS NOT NULL AND address <> ""');
foreach ($companies as $company) {
$id = $company['id'];
$oldAddress = $company['address'];
$fullAddress = $this->parseFullAddress($oldAddress);
$this->connection->update('channel_user_data_cursus_company', $fullAddress, [
'id' => $id,
]);
}
// Internship addresses
$companies = $this->connection->fetchAllAssociative('SELECT id, internship_address FROM channel_user_data_cursus_company WHERE internship_address IS NOT NULL AND internship_address <> ""');
foreach ($companies as $company) {
$id = $company['id'];
$oldAddress = $company['internship_address'];
$fullAddress = $this->parseFullAddress($oldAddress, 'internship_');
$this->connection->update('channel_user_data_cursus_company', $fullAddress, [
'id' => $id,
]);
}
}
private function parseFullAddress($oldAddress, string $prefix = ''): array
{
$addressStreet = $oldAddress;
$addressStreet = preg_replace("/\r\n|\r/", "\n", $addressStreet);
$addressStreet = preg_replace('/\s+/u', ' ', $addressStreet);
$addressStreet = trim($addressStreet);
$addressPostCode = null;
$addressCity = null;
$addressCountry = 'FR';
if (preg_match('/^(?P<street>.*?)\s*[-]?\s*(?P<postcode>\d{4,5})\s*[-,]?\s+(?P<city>[\p{L}\-\'\/\s]+(?:\s\d{1,2})?)$/us', $oldAddress, $matches)) {
// Adress like "street 0000[0] city"
$addressStreet = trim($matches['street']);
$addressPostCode = trim($matches['postcode']);
$addressCity = trim($matches['city']);
}
if (null === $addressPostCode && null === $addressCity) {
if (preg_match('/^(?P<street>.*?),\s*(?P<city>.*?),\s*(?P<postcode>\d{4,5})$/u', $addressStreet, $matches)) {
// Adress like "street, city, 0000[0]"
$addressStreet = trim($matches['street']);
$addressPostCode = trim($matches['postcode']);
$addressCity = trim($matches['city']);
}
}
$addressStreet = rtrim($addressStreet, ", \t\n\r\0\x0B");
return [
$prefix . 'address_street' => $addressStreet,
$prefix . 'address_post_code' => $addressPostCode,
$prefix . 'address_city' => $addressCity,
$prefix . 'address_country' => $addressCountry,
];
}
}