<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
/**
* Campaign.editForm: formulario cuya definición JSON se considera la vigente de la campaña.
*
* Gobierna qué campos se muestran (y en qué orden y con qué etiquetas) en el detalle del
* registro y en la exportación, en lugar de las etiquetas que quedaron guardadas en cada
* FormLeadData en el momento del envío.
*/
final class Version20260915144436 extends AbstractMigration
{
public function getDescription(): string
{
return 'Campaign.editForm: formulario cuya definición JSON es la vigente de la campaña';
}
public function up(Schema $schema): void
{
$this->addSql('ALTER TABLE campaign ADD edit_form_id INT DEFAULT NULL');
$this->addSql('ALTER TABLE campaign ADD CONSTRAINT FK_1F1512DDE50820C7 FOREIGN KEY (edit_form_id) REFERENCES form (id) ON DELETE SET NULL');
$this->addSql('CREATE INDEX IDX_1F1512DDE50820C7 ON campaign (edit_form_id)');
// Preasignación best-effort para no obligar a configurarlo a mano en cada entorno:
// se busca, por campaña, el formulario de renovación de la Carta más reciente.
// El LIKE cubre también los ficheros que sube el admin, que llevan hash en el nombre
// (carta-renovacion-<contenthash>.json). Si no hay coincidencia no hace nada y la
// campaña se queda sin formulario vigente (comportamiento anterior).
$this->addSql(<<<'SQL'
UPDATE campaign c
SET c.edit_form_id = (
SELECT MAX(f.id)
FROM form f
WHERE f.campaign_id = c.id
AND f.type = 'edit'
AND f.active = 1
AND f.definition_file LIKE 'carta-renovacion%'
)
WHERE c.edit_form_id IS NULL
SQL);
}
public function down(Schema $schema): void
{
$this->addSql('ALTER TABLE campaign DROP FOREIGN KEY FK_1F1512DDE50820C7');
$this->addSql('DROP INDEX IDX_1F1512DDE50820C7 ON campaign');
$this->addSql('ALTER TABLE campaign DROP edit_form_id');
}
}