# Importación de puertos (Seaport / UN-LOCODE)

Un solo comando importa filas CSV a la tabla `seaport` asociadas a la **empresa catálogo compartida**.

## Comando

```bash
php -d memory_limit=512M bin/console app:import:seaport-un-locale
```

Recomendación de memoria: en proyectos grandes Symfony puede superar 128M al arrancar el contenedor; `512M` evita fallos al cargar el kernel.

### Simulación (sin escribir en BD)

```bash
php -d memory_limit=512M bin/console app:import:seaport-un-locale --dry-run
```

## Origen del CSV

### Opción A — Carpeta por variable de entorno (recomendado en servidor)

1. Define en `.env`, `.env.local` o en variables del sistema:

   ```env
   SEAPORT_UN_LOCALE_DIR=/ruta/absoluta/a/carpeta/con/csv
   ```

2. Por defecto el comando lee el archivo **`puertos_listos.csv`** dentro de esa carpeta.

3. Otro nombre de archivo:

   ```bash
   php -d memory_limit=512M bin/console app:import:seaport-un-locale --file=otro.csv
   ```

Si no defines `SEAPORT_UN_LOCALE_DIR`, el valor por defecto del proyecto es  
`%kernel.project_dir%/var/import/seaport-un-locale` (ver `config/services.yaml`, parámetros `seaport_un_locale_dir`).

### Opción B — Ruta absoluta al CSV

Ignora `SEAPORT_UN_LOCALE_DIR` y `--file`:

```bash
php -d memory_limit=512M bin/console app:import:seaport-un-locale --csv=/ruta/absoluta/puertos_listos.csv
```

## Empresa dueña de los puertos (maincompany)

- **Por defecto** se usa la empresa cuyo email es el definido en  
  `App\Seaport\SeaportCatalogMaincompany::CANONICAL_EMAIL`  
  (actualmente la cuenta compartida **Multitrack**).

- Si esa fila **no existe**, el comando intenta **crearla** copiando la fila de la `maincompany` con **menor `id`** (solo si el email canónico sigue libre en BD).

- Para forzar otra empresa:

  ```bash
  php -d memory_limit=512M bin/console app:import:seaport-un-locale --maincompany-id=123
  ```

## Formato del CSV

Cabeceras esperadas (mínimo): **`name`**, **`code`**, **`country`** (ISO 3166-1 alpha-2, p. ej. `AE`).

Coordenadas opcionales: **`latitud`** o **`latitude`**, **`longitud`** o **`longitude`**.

Filas sin país resuelto en BD se cuentan como `skipped_unknown_country`.

## Visibilidad en la API

Los listados y la validación de puertos incluyen filas de la compañía actual **o** de la empresa catálogo (email canónico). Ver `SeaportRepository::applyMaincompanyScope`.

## Otras opciones

| Opción | Descripción |
|--------|-------------|
| `--batch-size=200` | Cada cuántas filas se hace `flush` (por defecto 200). |
| `--dry-run` | Solo valida y cuenta; no persiste. |
