<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\DBAL\Types\Types;
use Doctrine\Migrations\AbstractMigration;
/**
* MYC-16 Update MyCMCM signup process entities.
*/
final class Version20251123225008 extends AbstractMigration
{
public function getDescription(): string
{
return 'MYC-16 Update MyCMCM signup process entities: rename validatedAt to emailVerifiedAt, add accessLevel enum, update MyCmcmUserInvitation fields, add MemberApplication relationship';
}
public function up(Schema $schema): void
{
$this->skipIf(
$schema->hasTable('mycmcm_user') && $schema->getTable('mycmcm_user')->hasColumn('email_verified_at'),
'Migration already executed'
);
// Update MyCmcmUser table
$mycmcmUserTable = $schema->getTable('mycmcm_user');
// Add email_verified_at column (will replace validated_at)
$mycmcmUserTable->addColumn('email_verified_at', Types::DATETIME_IMMUTABLE, [
'notnull' => false,
'default' => null,
]);
// Add access_level column
$mycmcmUserTable->addColumn('access_level', Types::STRING, [
'length' => 20,
'notnull' => false,
'default' => null,
'columnDefinition' => 'VARCHAR(20) DEFAULT NULL COMMENT \'(DC2Type:accessLevel)\'',
]);
// Add access_level_updated_at column
$mycmcmUserTable->addColumn('access_level_updated_at', Types::DATETIME_IMMUTABLE, [
'notnull' => false,
'default' => null,
]);
// Update MyCmcmUserInvitation table
$mycmcmUserInvitationTable = $schema->getTable('mycmcm_user_invitation');
// Add exported_at column (will replace document_created_at)
$mycmcmUserInvitationTable->addColumn('exported_at', Types::DATETIME_IMMUTABLE, [
'notnull' => false,
'default' => null,
]);
// Add contract_number column
$mycmcmUserInvitationTable->addColumn('contract_number', Types::STRING, [
'length' => 255,
'notnull' => false,
'default' => null,
]);
// Add social_security_number column
$mycmcmUserInvitationTable->addColumn('social_security_number', Types::STRING, [
'length' => 255,
'notnull' => false,
'default' => null,
]);
// Add code_verified_at column
$mycmcmUserInvitationTable->addColumn('code_verified_at', Types::DATETIME_IMMUTABLE, [
'notnull' => false,
'default' => null,
]);
// Drop birth_date column
$mycmcmUserInvitationTable->dropColumn('birth_date');
// Update MemberApplication table
$memberApplicationTable = $schema->getTable('member_application');
// Add mycmcm_user_id column
$memberApplicationTable->addColumn('mycmcm_user_id', Types::STRING, [
'length' => 255,
'notnull' => false,
'default' => null,
]);
// Add foreign key constraint
$memberApplicationTable->addForeignKeyConstraint(
'mycmcm_user',
['mycmcm_user_id'],
['id'],
[],
'FK_7D66C9033289A11F'
);
// Add unique index
$memberApplicationTable->addUniqueIndex(['mycmcm_user_id'], 'UNIQ_7D66C9033289A11F');
}
public function postUp(Schema $schema): void
{
// Copy data from old columns to new columns
$this->connection->executeQuery(
'UPDATE mycmcm_user SET email_verified_at = validated_at WHERE validated_at IS NOT NULL'
);
$this->connection->executeQuery(
'UPDATE mycmcm_user_invitation SET exported_at = document_created_at WHERE document_created_at IS NOT NULL'
);
// Drop old columns after data is copied
$mycmcmUserTable = $schema->getTable('mycmcm_user');
$mycmcmUserTable->dropColumn('validated_at');
$mycmcmUserInvitationTable = $schema->getTable('mycmcm_user_invitation');
$mycmcmUserInvitationTable->dropColumn('document_created_at');
}
public function down(Schema $schema): void
{
$this->skipIf(
$schema->hasTable('mycmcm_user') && $schema->getTable('mycmcm_user')->hasColumn('validated_at'),
'Migration already reverted'
);
// Revert MyCmcmUser table
$mycmcmUserTable = $schema->getTable('mycmcm_user');
// Add validated_at column (will replace email_verified_at)
$mycmcmUserTable->addColumn('validated_at', Types::DATETIME_IMMUTABLE, [
'notnull' => false,
'default' => null,
]);
// Drop access_level column
$mycmcmUserTable->dropColumn('access_level');
// Drop access_level_updated_at column
$mycmcmUserTable->dropColumn('access_level_updated_at');
// Revert MyCmcmUserInvitation table
$mycmcmUserInvitationTable = $schema->getTable('mycmcm_user_invitation');
// Add document_created_at column (will replace exported_at)
$mycmcmUserInvitationTable->addColumn('document_created_at', Types::DATETIME_IMMUTABLE, [
'notnull' => false,
'default' => null,
]);
// Drop new columns
$mycmcmUserInvitationTable->dropColumn('contract_number');
$mycmcmUserInvitationTable->dropColumn('social_security_number');
$mycmcmUserInvitationTable->dropColumn('code_verified_at');
// Re-add birth_date column
$mycmcmUserInvitationTable->addColumn('birth_date', Types::DATETIME_IMMUTABLE, [
'notnull' => true,
]);
// Revert MemberApplication table
$memberApplicationTable = $schema->getTable('member_application');
// Drop foreign key and index
$memberApplicationTable->removeForeignKey('FK_7D66C9033289A11F');
$memberApplicationTable->dropIndex('UNIQ_7D66C9033289A11F');
// Drop mycmcm_user_id column
$memberApplicationTable->dropColumn('mycmcm_user_id');
}
public function postDown(Schema $schema): void
{
// Copy data from new columns back to old columns
$this->connection->executeQuery(
'UPDATE mycmcm_user SET validated_at = email_verified_at WHERE email_verified_at IS NOT NULL'
);
$this->connection->executeQuery(
'UPDATE mycmcm_user_invitation SET document_created_at = exported_at WHERE exported_at IS NOT NULL'
);
// Drop new columns after data is copied back
$mycmcmUserTable = $schema->getTable('mycmcm_user');
$mycmcmUserTable->dropColumn('email_verified_at');
$mycmcmUserInvitationTable = $schema->getTable('mycmcm_user_invitation');
$mycmcmUserInvitationTable->dropColumn('exported_at');
}
}