- Bovine.breedCode (string) remplacé par bovineType (FK BovineType) - Migration : ajout des races manquantes (Aubrac, Croisé, Blonde d'aquitaine), backfill, drop breed_code - Sync EDNOTIF : auto-création d'un BovineType placeholder pour code inconnu - Bovine.building (FK Building, nullable) en plus de buildingCase - Getter effectiveBuilding (case prime sinon building direct) - Feed XLSX : colonne E optionnelle (code bâtiment), set uniquement si pas de buildingCase - Front : DTO + colonnes en variant inventory/case via composable, race et bâtiment ajustés - Excel export utilise bovineType.label Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
51 lines
2.4 KiB
PHP
51 lines
2.4 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace DoctrineMigrations;
|
|
|
|
use Doctrine\DBAL\Schema\Schema;
|
|
use Doctrine\Migrations\AbstractMigration;
|
|
|
|
/**
|
|
* Bascule de Bovine.breed_code (string) vers une relation Bovine.bovine_type_id (FK).
|
|
* Ajoute au passage les BovineType manquants (Aubrac=14, Croisé=39, Blonde d'aquitaine=79).
|
|
*/
|
|
final class Version20260428065800 extends AbstractMigration
|
|
{
|
|
public function getDescription(): string
|
|
{
|
|
return 'Migration breedCode -> relation BovineType + ajout des races manquantes.';
|
|
}
|
|
|
|
public function up(Schema $schema): void
|
|
{
|
|
// 1. Insertion des BovineType manquants (idempotent via NOT EXISTS).
|
|
$this->addSql("INSERT INTO bovine_type (label, code) SELECT 'Aubrac', '14' WHERE NOT EXISTS (SELECT 1 FROM bovine_type WHERE code = '14')");
|
|
$this->addSql("INSERT INTO bovine_type (label, code) SELECT 'Croisé', '39' WHERE NOT EXISTS (SELECT 1 FROM bovine_type WHERE code = '39')");
|
|
$this->addSql("INSERT INTO bovine_type (label, code) SELECT 'Blonde d''aquitaine', '79' WHERE NOT EXISTS (SELECT 1 FROM bovine_type WHERE code = '79')");
|
|
|
|
// 2. Ajout de la colonne FK + index.
|
|
$this->addSql('ALTER TABLE bovine ADD bovine_type_id INT DEFAULT NULL');
|
|
$this->addSql('CREATE INDEX IDX_2068337F7899F32E ON bovine (bovine_type_id)');
|
|
|
|
// 3. Backfill : associe chaque bovin à son BovineType via le code.
|
|
$this->addSql('UPDATE bovine SET bovine_type_id = (SELECT id FROM bovine_type WHERE bovine_type.code = bovine.breed_code) WHERE breed_code IS NOT NULL');
|
|
|
|
// 4. Contrainte de clé étrangère (après backfill pour éviter une violation transitoire).
|
|
$this->addSql('ALTER TABLE bovine ADD CONSTRAINT FK_2068337F7899F32E FOREIGN KEY (bovine_type_id) REFERENCES bovine_type (id)');
|
|
|
|
// 5. Drop de l'ancienne colonne string.
|
|
$this->addSql('ALTER TABLE bovine DROP breed_code');
|
|
}
|
|
|
|
public function down(Schema $schema): void
|
|
{
|
|
$this->addSql('ALTER TABLE bovine ADD breed_code VARCHAR(20) DEFAULT NULL');
|
|
$this->addSql('UPDATE bovine SET breed_code = (SELECT code FROM bovine_type WHERE bovine_type.id = bovine.bovine_type_id) WHERE bovine_type_id IS NOT NULL');
|
|
$this->addSql('ALTER TABLE bovine DROP CONSTRAINT FK_2068337F7899F32E');
|
|
$this->addSql('DROP INDEX IDX_2068337F7899F32E');
|
|
$this->addSql('ALTER TABLE bovine DROP bovine_type_id');
|
|
}
|
|
}
|