de4aaa1d64
Ajoute la géolocalisation aux adresses Client et Fournisseur, socle de la tournée commerciale (M6 field-sales). Back : - migration : latitude/longitude NUMERIC(10,7), geo_manual BOOLEAN, geocoded_at TIMESTAMPTZ sur client_address et supplier_address (+ COMMENT ON COLUMN FR) - GeolocatableAddressInterface (Shared/Domain/Contract) implémenté par les deux entités ; bornes WGS84 validées (Range -90/90, -180/180, messages FR) - GeocoderInterface + BanGeocoder (api-adresse.data.gouv.fr), branché via AddressGeocoder dans les processors ; géocodage auto au create/update - RG-6.08 : geo_manual=true fige les coordonnées (pas de réécriture auto) - symfony/http-client passe en dépendance de production Front : - AddressGeoPin (Leaflet + OSM) : marqueur déplaçable -> PATCH lat/lng + geoManual=true, bouton Re-géocoder, badges « à géolocaliser » / « pin manuel » - intégration dans les blocs adresse Client et Fournisseur Tests : PHPUnit (géocodage create, non-réécriture RG-6.08, mapping BAN, bornes) + Vitest (drag du pin, badges, re-géocodage).
74 lines
3.3 KiB
PHP
74 lines
3.3 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace DoctrineMigrations;
|
|
|
|
use Doctrine\DBAL\Schema\Schema;
|
|
use Doctrine\Migrations\AbstractMigration;
|
|
|
|
/**
|
|
* Commercial — geolocalisation des adresses Tiers (M6.1 / ERP-122, spec M6
|
|
* § 3.2 / § 4.1).
|
|
*
|
|
* Ajoute sur `client_address` ET `supplier_address` :
|
|
* - latitude / longitude NUMERIC(10,7) null : coordonnees WGS84, alimentees
|
|
* par le geocodage BAN automatique ou par le pin manuel ;
|
|
* - geo_manual BOOLEAN default false : RG-6.08, un pin corrige a la main fige
|
|
* les coordonnees (le geocodage auto ne reecrit plus) ;
|
|
* - geocoded_at TIMESTAMPTZ null : date du dernier geocodage auto reussi.
|
|
*
|
|
* Migration au namespace racine `DoctrineMigrations` (pratique effective du
|
|
* projet : le namespace modulaire Commercial n'est pas enregistre dans
|
|
* doctrine_migrations.yaml et souffrirait du tri FQCN inter-namespaces sur
|
|
* base vide — cf. regle ABSOLUE n°11 / architecture.md § Migrations).
|
|
*/
|
|
final class Version20260611130000 extends AbstractMigration
|
|
{
|
|
private const array TABLES = ['client_address', 'supplier_address'];
|
|
|
|
public function getDescription(): string
|
|
{
|
|
return 'Commercial : geolocalisation des adresses Tiers (latitude/longitude/geo_manual/geocoded_at sur client_address et supplier_address).';
|
|
}
|
|
|
|
public function up(Schema $schema): void
|
|
{
|
|
foreach (self::TABLES as $table) {
|
|
$this->addSql(sprintf('ALTER TABLE %s ADD COLUMN latitude NUMERIC(10, 7) DEFAULT NULL', $table));
|
|
$this->addSql(sprintf('ALTER TABLE %s ADD COLUMN longitude NUMERIC(10, 7) DEFAULT NULL', $table));
|
|
$this->addSql(sprintf('ALTER TABLE %s ADD COLUMN geo_manual BOOLEAN DEFAULT false NOT NULL', $table));
|
|
$this->addSql(sprintf('ALTER TABLE %s ADD COLUMN geocoded_at TIMESTAMP(0) WITH TIME ZONE DEFAULT NULL', $table));
|
|
|
|
$this->comment($table, 'latitude', 'Latitude WGS84 de l adresse (geocodage BAN ou pin manuel). NULL = non geolocalisee, exclue du calcul de tournee (RG-6.05).');
|
|
$this->comment($table, 'longitude', 'Longitude WGS84 de l adresse (geocodage BAN ou pin manuel). NULL = non geolocalisee.');
|
|
$this->comment($table, 'geo_manual', 'Pin positionne/corrige a la main : si vrai, le geocodage auto ne reecrit plus les coordonnees (RG-6.08). Faux par defaut.');
|
|
$this->comment($table, 'geocoded_at', 'Date du dernier geocodage automatique reussi (NULL si jamais geocode ou pin 100% manuel).');
|
|
}
|
|
}
|
|
|
|
public function down(Schema $schema): void
|
|
{
|
|
foreach (self::TABLES as $table) {
|
|
$this->addSql(sprintf('ALTER TABLE %s DROP COLUMN latitude', $table));
|
|
$this->addSql(sprintf('ALTER TABLE %s DROP COLUMN longitude', $table));
|
|
$this->addSql(sprintf('ALTER TABLE %s DROP COLUMN geo_manual', $table));
|
|
$this->addSql(sprintf('ALTER TABLE %s DROP COLUMN geocoded_at', $table));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Emet un `COMMENT ON COLUMN` en dollar-quoting Postgres ($_$...$_$) pour
|
|
* eviter tout echappement.
|
|
*/
|
|
private function comment(string $table, string $column, string $description): void
|
|
{
|
|
$this->addSql(sprintf(
|
|
'COMMENT ON COLUMN %s.%s IS $_$%s$_$',
|
|
'"'.str_replace('"', '""', $table).'"',
|
|
'"'.str_replace('"', '""', $column).'"',
|
|
$description,
|
|
));
|
|
}
|
|
}
|