- Nouvel endpoint GET /csv-bookings/reservation-quota: limite = vrai plan de
l'org (pas l'override ADMIN PLATINIUM), used = bookings PAYES de l'annee
(PENDING_BANK_TRANSFER/PENDING/ACCEPTED), limitReached.
- ShipmentCounter: countPaidShipmentsForOrganizationInYear.
- create-check compte desormais les payes (au lieu de tous).
- Frontend useReservationQuota consomme l'endpoint (fiable meme pour un admin
dont l'overview renvoie PLATINIUM).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Les options du formulaire de recherche etaient collectees mais jamais stockees.
Ajout d'une colonne jsonb options sur csv_bookings (+ migration), stockee a la
creation et a l'edition (editFromRate), renvoyee dans la reponse, et re-pre-
remplie a la reprise (search-advanced <- URL <- booking.options).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Remplace la page d'édition autonome par une reprise du parcours de réservation :
"Modifier" ré-ouvre la recherche pré-remplie (origine/destination/volume/poids/
palettes reconstruits), l'utilisateur ajuste si besoin, choisit une compagnie
(résultats) et passe au paiement — la réservation existante est mise à jour au
lieu d'en créer une nouvelle.
- Backend: PATCH /csv-bookings/:id/rate + UpdateCsvBookingRateDto + service
updateBookingRate + domaine editFromRate (carrier/route/conteneur/transit/
cargo/prix modifiables avant paiement).
- Front: search-advanced pré-rempli via query (+ editBookingId, démarre à
l'étape colis) ; results en mode édition met à jour puis redirige vers /pay ;
liens "Modifier" (liste, modale, paiement) pointent vers le parcours ;
suppression de la page /booking/:id/edit autonome.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Suppression de documents: cause = deleteDocument restreint aux statuts
PENDING/PENDING_PAYMENT + blocage du dernier document. Alignement sur
replaceDocument (aucune restriction de statut) et autorisation de 0 document
(validation domaine assouplie ; creation exige toujours >=1 doc cote service).
- Edition avant paiement: recalcul auto du prix. La page /booking/:id/edit
relance la recherche de tarif (meme transporteur/conteneur/transit) pour le
nouveau volume/poids et met a jour fret/FOB/total ; nouveaux champs de prix
dans UpdateCsvBookingDetailsDto + editDetails.
- Liste reservations: actions regroupees dans un menu 3 points (kebab) en
positionnement fixed (anti-clipping), desktop + mobile.
- Responsive (<=1280px): tables documents & blog admin en overflow-x-auto,
menus documents en fixed, grilles de la page edition en sm:.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Edition d'une reservation avant paiement: page /booking/:id/edit
(volume, poids, palettes, notes + gestion documents), endpoint
PATCH /csv-bookings/:id/details (owner + PENDING_PAYMENT), methode
domaine editDetails. Acces "Modifier" depuis la liste, la modale detail
et la page de paiement.
- Filtre "A finaliser" (PENDING_PAYMENT + PENDING_BANK_TRANSFER) + libelles
et couleurs de tous les statuts.
- Tableau des reservations: 6 colonnes + colonne Actions collante a droite
(plus de scroll horizontal pour atteindre Payer/Voir).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Telechargement docs transporteur: proxy de streaming API (fin des URLs
presignees MinIO injoignables depuis l'exterieur)
- Documents: ajout de l'action "Supprimer" (endpoint DELETE deja existant)
- Blog: suppression reelle de l'image de couverture (null explicite bout en bout)
- Blog: le bouton Retour navigateur ferme l'editeur au lieu de quitter vers Logs
- Paiement: bouton Retour revient au contexte precedent (router.back)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Fixed CSV rate upload to use the company name provided in the upload form instead of reading it from the CSV file's companyName column. This prevents "unknown" or incorrect company names from being used.
## Changes
**Domain Layer**
- Updated `CsvRateLoaderPort` interface to accept optional `companyNameOverride` parameter
- Modified `CsvRateSearchService.loadAllRates()` to pass company name from config when loading rates
**Infrastructure Layer**
- Updated `CsvRateLoaderAdapter.loadRatesFromCsv()` to accept `companyNameOverride` parameter
- Modified `mapToCsvRate()` to use override company name if provided, otherwise fallback to CSV column value
- Added logging to show which company name is being used (from override or CSV)
**Application Layer**
- Updated CSV upload controller to pass `dto.companyName` to the loader
## Impact
- When uploading a CSV file through the admin interface, the company name from the form is now correctly used
- Existing CSV files with "unknown" in the companyName column will now show the correct company name from the database configuration
- Backward compatible: if no override is provided, the CSV column value is still used
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Replace all ../../domain/ imports with @domain/ across 67 files
- Configure NestJS to use tsconfig.build.json with rootDir
- Add tsc-alias to resolve path aliases after build
- This fixes 'Cannot find module' TypeScript compilation errors
Fixed files:
- 30 files in application layer
- 37 files in infrastructure layer