3f356f0679
Auto Tag Develop / tag (push) Successful in 9s
## Objectif (ERP-116, 1re iteration minimale) Sortir la liste des pays du **code en dur** cote front et la poser en base comme **referentiel `country`**, source unique du select pays. **Perimetre volontairement minimal** : code ISO + libelle + ordre uniquement — **aucune longueur bancaire/fiscale** (numero de compte, IBAN, TVA, BIC, SIREN) a ce stade. ## Backend - Entite `Country` (`code` ISO 3166-1 alpha-2 unique, `name`, `position`), calquee sur `Bank` : referentiel statique **lecture seule** (`GetCollection` + `Get`), gating `commercial.clients.view OR commercial.suppliers.view`. - Migration `Version20260609100000` : table `country` + `COMMENT ON COLUMN` + seed des **6 pays** (France, Allemagne, Belgique, Espagne, Italie, Royaume-Uni), `ON CONFLICT DO NOTHING`. - `CommercialReferentialFixtures` : re-seed des pays en dev/test. - Garde-fous : ajout au `ColumnCommentsCatalog` + whitelist `EntitiesAreTimestampableBlamableTest`. ## Frontend - `useClientReferentials` charge `/countries` (value = **nom** du pays : l'adresse stocke `country` en chaine libre, **pas de FK ni migration de donnees**). - Les 3 listes `countryOptions` en dur (clients new / edit / consultation) sont supprimees ; la consultation derive ses options de l'embed. ## Hors-scope (iterations suivantes du ticket) - Longueurs bancaires/fiscales par pays + validation associee. - FK `country_id` sur les adresses + migration de donnees. ## Tests - Back : suite complete verte (583), tests API dedies countries (200/seed/405/403/401). - Front : Vitest vert (256), spec `useClientReferentials` mise a jour. - Migration appliquee en dev + test. --------- Co-authored-by: Matthieu <contact@malio.fr> Reviewed-on: #79
103 lines
4.3 KiB
PHP
103 lines
4.3 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace DoctrineMigrations;
|
|
|
|
use Doctrine\DBAL\Schema\Schema;
|
|
use Doctrine\Migrations\AbstractMigration;
|
|
|
|
/**
|
|
* ERP-116 — Referentiel Pays (Country), 1re iteration : creation de la table
|
|
* `country` + seed des 7 pays (France, Allemagne, Belgique, Espagne, Italie,
|
|
* Royaume-Uni, Suisse). Devient la source unique du select pays, en
|
|
* remplacement de la liste codee en dur cote front.
|
|
*
|
|
* Perimetre minimal voulu : code ISO 3166-1 alpha-2 + libelle FR + ordre
|
|
* d'affichage UNIQUEMENT. Aucune longueur bancaire/fiscale (numero de compte,
|
|
* IBAN, TVA, BIC, SIREN) a ce stade — iteration ulterieure du meme ticket.
|
|
*
|
|
* Pas de FK posee sur les adresses (client_address.country / supplier_address)
|
|
* a cette etape : ces colonnes restent des chaines libres (« France »...), donc
|
|
* aucune migration de donnees ni rupture de l'existant.
|
|
*
|
|
* Namespace racine `DoctrineMigrations` (regle ABSOLUE Starseed n°11) comme les
|
|
* migrations M1/M2 du module Commercial : pas de migrations_path modulaire
|
|
* configure pour Commercial, et le tri par timestamp reste garanti.
|
|
*
|
|
* Seed idempotent `ON CONFLICT (code) DO NOTHING` : la table peut deja porter
|
|
* des donnees en prod lors d'un rejeu. Chaque colonne porte un `COMMENT ON
|
|
* COLUMN` (regle ABSOLUE n°12, garde-fou ColumnsHaveSqlCommentTest) ; la table
|
|
* est aussi mirroree dans ColumnCommentsCatalog pour survivre au
|
|
* `schema:update --force` du setup de test.
|
|
*/
|
|
final class Version20260609100000 extends AbstractMigration
|
|
{
|
|
public function getDescription(): string
|
|
{
|
|
return 'ERP-116 : table country (referentiel pays) + seed des 7 pays.';
|
|
}
|
|
|
|
public function up(Schema $schema): void
|
|
{
|
|
$this->addSql(<<<'SQL'
|
|
CREATE TABLE country (
|
|
id INT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
|
|
code VARCHAR(2) NOT NULL,
|
|
name VARCHAR(80) NOT NULL,
|
|
position INT DEFAULT 0 NOT NULL,
|
|
PRIMARY KEY (id)
|
|
)
|
|
SQL);
|
|
$this->addSql('CREATE UNIQUE INDEX uq_country_code ON country (code)');
|
|
|
|
$this->comment('country', '_table', 'Referentiel des pays selectionnables dans les adresses (clients/fournisseurs). Perimetre minimal : code ISO + libelle + ordre (pas de longueurs bancaires/fiscales).');
|
|
$this->comment('country', 'id', 'Identifiant interne auto-incremente.');
|
|
$this->comment('country', 'code', 'Code pays ISO 3166-1 alpha-2 (2 lettres MAJUSCULES, ex: FR) — unique (uq_country_code), fige a la creation.');
|
|
$this->comment('country', 'name', 'Libelle FR du pays (≤ 80 caracteres) — valeur stockee telle quelle dans les adresses (country en chaine libre a ce stade).');
|
|
$this->comment('country', 'position', 'Ordre d affichage croissant dans le selecteur pays (tri position ASC puis name ASC ; France en tete).');
|
|
|
|
// Seed initial. France en tete (position 10) puis ordre alphabetique.
|
|
// Table fraichement creee, mais ON CONFLICT pour rejouabilite en prod.
|
|
$this->addSql(<<<'SQL'
|
|
INSERT INTO country (code, name, position) VALUES
|
|
('FR', 'France', 10),
|
|
('DE', 'Allemagne', 20),
|
|
('BE', 'Belgique', 30),
|
|
('ES', 'Espagne', 40),
|
|
('IT', 'Italie', 50),
|
|
('GB', 'Royaume-Uni', 60),
|
|
('CH', 'Suisse', 70)
|
|
ON CONFLICT (code) DO NOTHING
|
|
SQL);
|
|
}
|
|
|
|
public function down(Schema $schema): void
|
|
{
|
|
$this->addSql('DROP TABLE country');
|
|
}
|
|
|
|
/**
|
|
* Pose un `COMMENT ON TABLE` (colonne speciale `_table`) ou
|
|
* `COMMENT ON COLUMN`. Quoting defensif des identifiants + delimiteur $_$
|
|
* pour ne pas casser sur les apostrophes des descriptions.
|
|
*/
|
|
private function comment(string $table, string $column, string $description): void
|
|
{
|
|
$quotedTable = '"'.str_replace('"', '""', $table).'"';
|
|
|
|
if ('_table' === $column) {
|
|
$this->addSql(sprintf('COMMENT ON TABLE %s IS $_$%s$_$', $quotedTable, $description));
|
|
|
|
return;
|
|
}
|
|
|
|
$this->addSql(sprintf(
|
|
'COMMENT ON COLUMN %s.%s IS $_$%s$_$',
|
|
$quotedTable,
|
|
'"'.str_replace('"', '""', $column).'"',
|
|
$description,
|
|
));
|
|
}
|
|
}
|