migrations/Version20251123225008.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\DBAL\Types\Types;
  6. use Doctrine\Migrations\AbstractMigration;
  7. /**
  8.  * MYC-16 Update MyCMCM signup process entities.
  9.  */
  10. final class Version20251123225008 extends AbstractMigration
  11. {
  12.     public function getDescription(): string
  13.     {
  14.         return 'MYC-16 Update MyCMCM signup process entities: rename validatedAt to emailVerifiedAt, add accessLevel enum, update MyCmcmUserInvitation fields, add MemberApplication relationship';
  15.     }
  16.     public function up(Schema $schema): void
  17.     {
  18.         $this->skipIf(
  19.             $schema->hasTable('mycmcm_user') && $schema->getTable('mycmcm_user')->hasColumn('email_verified_at'),
  20.             'Migration already executed'
  21.         );
  22.         // Update MyCmcmUser table
  23.         $mycmcmUserTable $schema->getTable('mycmcm_user');
  24.         // Add email_verified_at column (will replace validated_at)
  25.         $mycmcmUserTable->addColumn('email_verified_at'Types::DATETIME_IMMUTABLE, [
  26.             'notnull' => false,
  27.             'default' => null,
  28.         ]);
  29.         // Add access_level column
  30.         $mycmcmUserTable->addColumn('access_level'Types::STRING, [
  31.             'length' => 20,
  32.             'notnull' => false,
  33.             'default' => null,
  34.             'columnDefinition' => 'VARCHAR(20) DEFAULT NULL COMMENT \'(DC2Type:accessLevel)\'',
  35.         ]);
  36.         // Add access_level_updated_at column
  37.         $mycmcmUserTable->addColumn('access_level_updated_at'Types::DATETIME_IMMUTABLE, [
  38.             'notnull' => false,
  39.             'default' => null,
  40.         ]);
  41.         // Update MyCmcmUserInvitation table
  42.         $mycmcmUserInvitationTable $schema->getTable('mycmcm_user_invitation');
  43.         // Add exported_at column (will replace document_created_at)
  44.         $mycmcmUserInvitationTable->addColumn('exported_at'Types::DATETIME_IMMUTABLE, [
  45.             'notnull' => false,
  46.             'default' => null,
  47.         ]);
  48.         // Add contract_number column
  49.         $mycmcmUserInvitationTable->addColumn('contract_number'Types::STRING, [
  50.             'length' => 255,
  51.             'notnull' => false,
  52.             'default' => null,
  53.         ]);
  54.         // Add social_security_number column
  55.         $mycmcmUserInvitationTable->addColumn('social_security_number'Types::STRING, [
  56.             'length' => 255,
  57.             'notnull' => false,
  58.             'default' => null,
  59.         ]);
  60.         // Add code_verified_at column
  61.         $mycmcmUserInvitationTable->addColumn('code_verified_at'Types::DATETIME_IMMUTABLE, [
  62.             'notnull' => false,
  63.             'default' => null,
  64.         ]);
  65.         // Drop birth_date column
  66.         $mycmcmUserInvitationTable->dropColumn('birth_date');
  67.         // Update MemberApplication table
  68.         $memberApplicationTable $schema->getTable('member_application');
  69.         // Add mycmcm_user_id column
  70.         $memberApplicationTable->addColumn('mycmcm_user_id'Types::STRING, [
  71.             'length' => 255,
  72.             'notnull' => false,
  73.             'default' => null,
  74.         ]);
  75.         // Add foreign key constraint
  76.         $memberApplicationTable->addForeignKeyConstraint(
  77.             'mycmcm_user',
  78.             ['mycmcm_user_id'],
  79.             ['id'],
  80.             [],
  81.             'FK_7D66C9033289A11F'
  82.         );
  83.         // Add unique index
  84.         $memberApplicationTable->addUniqueIndex(['mycmcm_user_id'], 'UNIQ_7D66C9033289A11F');
  85.     }
  86.     public function postUp(Schema $schema): void
  87.     {
  88.         // Copy data from old columns to new columns
  89.         $this->connection->executeQuery(
  90.             'UPDATE mycmcm_user SET email_verified_at = validated_at WHERE validated_at IS NOT NULL'
  91.         );
  92.         $this->connection->executeQuery(
  93.             'UPDATE mycmcm_user_invitation SET exported_at = document_created_at WHERE document_created_at IS NOT NULL'
  94.         );
  95.         // Drop old columns after data is copied
  96.         $mycmcmUserTable $schema->getTable('mycmcm_user');
  97.         $mycmcmUserTable->dropColumn('validated_at');
  98.         $mycmcmUserInvitationTable $schema->getTable('mycmcm_user_invitation');
  99.         $mycmcmUserInvitationTable->dropColumn('document_created_at');
  100.     }
  101.     public function down(Schema $schema): void
  102.     {
  103.         $this->skipIf(
  104.             $schema->hasTable('mycmcm_user') && $schema->getTable('mycmcm_user')->hasColumn('validated_at'),
  105.             'Migration already reverted'
  106.         );
  107.         // Revert MyCmcmUser table
  108.         $mycmcmUserTable $schema->getTable('mycmcm_user');
  109.         // Add validated_at column (will replace email_verified_at)
  110.         $mycmcmUserTable->addColumn('validated_at'Types::DATETIME_IMMUTABLE, [
  111.             'notnull' => false,
  112.             'default' => null,
  113.         ]);
  114.         // Drop access_level column
  115.         $mycmcmUserTable->dropColumn('access_level');
  116.         // Drop access_level_updated_at column
  117.         $mycmcmUserTable->dropColumn('access_level_updated_at');
  118.         // Revert MyCmcmUserInvitation table
  119.         $mycmcmUserInvitationTable $schema->getTable('mycmcm_user_invitation');
  120.         // Add document_created_at column (will replace exported_at)
  121.         $mycmcmUserInvitationTable->addColumn('document_created_at'Types::DATETIME_IMMUTABLE, [
  122.             'notnull' => false,
  123.             'default' => null,
  124.         ]);
  125.         // Drop new columns
  126.         $mycmcmUserInvitationTable->dropColumn('contract_number');
  127.         $mycmcmUserInvitationTable->dropColumn('social_security_number');
  128.         $mycmcmUserInvitationTable->dropColumn('code_verified_at');
  129.         // Re-add birth_date column
  130.         $mycmcmUserInvitationTable->addColumn('birth_date'Types::DATETIME_IMMUTABLE, [
  131.             'notnull' => true,
  132.         ]);
  133.         // Revert MemberApplication table
  134.         $memberApplicationTable $schema->getTable('member_application');
  135.         // Drop foreign key and index
  136.         $memberApplicationTable->removeForeignKey('FK_7D66C9033289A11F');
  137.         $memberApplicationTable->dropIndex('UNIQ_7D66C9033289A11F');
  138.         // Drop mycmcm_user_id column
  139.         $memberApplicationTable->dropColumn('mycmcm_user_id');
  140.     }
  141.     public function postDown(Schema $schema): void
  142.     {
  143.         // Copy data from new columns back to old columns
  144.         $this->connection->executeQuery(
  145.             'UPDATE mycmcm_user SET validated_at = email_verified_at WHERE email_verified_at IS NOT NULL'
  146.         );
  147.         $this->connection->executeQuery(
  148.             'UPDATE mycmcm_user_invitation SET document_created_at = exported_at WHERE exported_at IS NOT NULL'
  149.         );
  150.         // Drop new columns after data is copied back
  151.         $mycmcmUserTable $schema->getTable('mycmcm_user');
  152.         $mycmcmUserTable->dropColumn('email_verified_at');
  153.         $mycmcmUserInvitationTable $schema->getTable('mycmcm_user_invitation');
  154.         $mycmcmUserInvitationTable->dropColumn('exported_at');
  155.     }
  156. }