migrations/Version20251009142530.php line 1

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace DoctrineMigrations;
  4. use Doctrine\DBAL\Schema\Schema;
  5. use Doctrine\Migrations\AbstractMigration;
  6. /**
  7. * Auto-generated Migration: Please modify to your needs!
  8. */
  9. final class Version20251009142530 extends AbstractMigration
  10. {
  11. public function getDescription(): string
  12. {
  13. return '';
  14. }
  15. public function up(Schema $schema): void
  16. {
  17. // this up() migration is auto-generated, please modify it to your needs
  18. $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');
  19. }
  20. public function down(Schema $schema): void
  21. {
  22. // this down() migration is auto-generated, please modify it to your needs
  23. $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');
  24. }
  25. public function postUp(Schema $schema): void
  26. {
  27. // Company addresses
  28. $companies = $this->connection->fetchAllAssociative('SELECT id, address FROM channel_user_data_cursus_company WHERE address IS NOT NULL AND address <> ""');
  29. foreach ($companies as $company) {
  30. $id = $company['id'];
  31. $oldAddress = $company['address'];
  32. $fullAddress = $this->parseFullAddress($oldAddress);
  33. $this->connection->update('channel_user_data_cursus_company', $fullAddress, [
  34. 'id' => $id,
  35. ]);
  36. }
  37. // Internship addresses
  38. $companies = $this->connection->fetchAllAssociative('SELECT id, internship_address FROM channel_user_data_cursus_company WHERE internship_address IS NOT NULL AND internship_address <> ""');
  39. foreach ($companies as $company) {
  40. $id = $company['id'];
  41. $oldAddress = $company['internship_address'];
  42. $fullAddress = $this->parseFullAddress($oldAddress, 'internship_');
  43. $this->connection->update('channel_user_data_cursus_company', $fullAddress, [
  44. 'id' => $id,
  45. ]);
  46. }
  47. }
  48. private function parseFullAddress($oldAddress, string $prefix = ''): array
  49. {
  50. $addressStreet = $oldAddress;
  51. $addressStreet = preg_replace("/\r\n|\r/", "\n", $addressStreet);
  52. $addressStreet = preg_replace('/\s+/u', ' ', $addressStreet);
  53. $addressStreet = trim($addressStreet);
  54. $addressPostCode = null;
  55. $addressCity = null;
  56. $addressCountry = 'FR';
  57. 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)) {
  58. // Adress like "street 0000[0] city"
  59. $addressStreet = trim($matches['street']);
  60. $addressPostCode = trim($matches['postcode']);
  61. $addressCity = trim($matches['city']);
  62. }
  63. if (null === $addressPostCode && null === $addressCity) {
  64. if (preg_match('/^(?P<street>.*?),\s*(?P<city>.*?),\s*(?P<postcode>\d{4,5})$/u', $addressStreet, $matches)) {
  65. // Adress like "street, city, 0000[0]"
  66. $addressStreet = trim($matches['street']);
  67. $addressPostCode = trim($matches['postcode']);
  68. $addressCity = trim($matches['city']);
  69. }
  70. }
  71. $addressStreet = rtrim($addressStreet, ", \t\n\r\0\x0B");
  72. return [
  73. $prefix . 'address_street' => $addressStreet,
  74. $prefix . 'address_post_code' => $addressPostCode,
  75. $prefix . 'address_city' => $addressCity,
  76. $prefix . 'address_country' => $addressCountry,
  77. ];
  78. }
  79. }