Commit Graph

205 Commits

Author SHA1 Message Date
David
0e6383693c fix: admin org creation - send nested address object instead of flat fields 2026-06-07 17:51:50 +02:00
David
1da5570e1c fix: unauthorized on document upload and drag-drop in booking creation
- Replace localStorage.getItem('access_token') with getAuthToken() which
  also checks sessionStorage — fixes Unauthorized error for users logged
  in without 'remember me'
- Add real drag-and-drop support to booking creation page (step 2):
  onDragOver/onDragLeave/onDrop handlers on the dropzone container,
  isDragging state with visual feedback (blue border + text change),
  click-to-browse still works via hidden input ref

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-07 17:42:27 +02:00
David
b344650608 fix: resolve payment access, status labels, and document upload reliability
- Add PENDING_PAYMENT and PENDING_BANK_TRANSFER to document statuses
  translations (was displaying raw i18n key instead of human label)
- Fix getStatusLabel/getStatusColor to handle all booking statuses
- Fix select dropdown in Add Document modal to use getStatusLabel()
  instead of hardcoded PENDING/ACCEPTED binary
- Add direct "Payer" button (orange) on PENDING_PAYMENT rows in both
  desktop table and mobile cards, linking to /dashboard/booking/[id]/pay
- Update detail modal to show payment CTA for PENDING_PAYMENT bookings
- Refactor file handling in document modals to use React state (addFiles,
  replaceFile) instead of reading from DOM ref — fixes upload reliability
  and shows selected filename feedback in the dropzone

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-07 17:26:44 +02:00
David
9950d96fd6 fix: correct 5 reported bugs across booking and document management
- SIRET/SIREN admin: controller applied siren but skipped siret — add missing updateSiret() call
- Document upload on validated booking: backend blocked PENDING_BANK_TRANSFER;
  frontend filter excluded it — both now allow all non-terminal statuses
- Accent encoding in filenames: Multer stores originalname as latin1;
  re-decode to utf8 before storing and displaying
- Drag & drop in document modals: replace bare input with styled dropzone
  supporting click and native drag-and-drop in both Add and Replace modals
- Resume existing booking: add Actions column with View button and booking
  detail modal to the bookings list page

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-07 16:49:12 +02:00
David
87bddcfb95 fix cleanup 2026-06-07 16:31:03 +02:00
David
d3c9fe1438 fix refacto 2026-06-07 15:55:05 +02:00
David
79ea90b165 fix backend 2026-05-14 21:21:57 +02:00
David
ad761372f5 first clean 2026-05-13 17:18:37 +02:00
David
3d65693395 fix blog 2026-05-12 21:01:52 +02:00
David
9acabb6859 fix api key 2026-05-12 01:23:47 +02:00
David
71d131f4cb fix search rates 2026-05-12 01:11:04 +02:00
David
96963b05f0 fix a propos text 2026-05-05 16:03:35 +02:00
David
ec0173483a fix language
All checks were successful
Dev CI / Backend — Lint (push) Successful in 10m23s
Dev CI / Backend — Unit Tests (push) Successful in 10m17s
Dev CI / Frontend — Lint & Type-check (push) Successful in 11m3s
Dev CI / Frontend — Unit Tests (push) Successful in 10m33s
Dev CI / Notify Failure (push) Has been skipped
2026-04-21 18:04:02 +02:00
David
982c893952 fix mobile version 2026-04-09 17:54:48 +02:00
David
40d917e160 chore(ci): remove smoke tests from preprod and prod pipelines
All checks were successful
CD Preprod / Backend — Lint (push) Successful in 10m22s
CD Preprod / Frontend — Lint & Type-check (push) Successful in 10m55s
CD Preprod / Backend — Unit Tests (push) Successful in 10m10s
CD Preprod / Frontend — Unit Tests (push) Successful in 10m34s
CD Preprod / Backend — Integration Tests (push) Successful in 9m57s
CD Preprod / Build Frontend (push) Successful in 47s
CD Preprod / Build Log Exporter (push) Successful in 33s
CD Preprod / Build Backend (push) Successful in 7m24s
CD Preprod / Deploy to Preprod (push) Successful in 24s
CD Preprod / Notify Failure (push) Has been skipped
CD Preprod / Notify Success (push) Successful in 2s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 20:13:17 +02:00
David
a5b21436c7 fix
Some checks failed
CD Preprod / Backend — Lint (push) Successful in 10m21s
CD Preprod / Frontend — Lint & Type-check (push) Successful in 10m54s
CD Preprod / Backend — Unit Tests (push) Successful in 10m12s
CD Preprod / Frontend — Unit Tests (push) Successful in 10m32s
CD Preprod / Backend — Integration Tests (push) Successful in 9m57s
CD Preprod / Build Backend (push) Successful in 50s
CD Preprod / Build Log Exporter (push) Successful in 26s
CD Preprod / Build Frontend (push) Successful in 19m3s
CD Preprod / Deploy to Preprod (push) Successful in 23s
CD Preprod / Notify Success (push) Has been cancelled
CD Preprod / Smoke Tests (push) Has been cancelled
CD Preprod / Notify Failure (push) Has been cancelled
2026-04-06 15:21:01 +02:00
David
bbf059cce9 fix preprod
Some checks failed
CD Preprod / Backend — Lint (push) Successful in 10m22s
CD Preprod / Frontend — Lint & Type-check (push) Successful in 10m55s
CD Preprod / Backend — Unit Tests (push) Successful in 10m12s
CD Preprod / Frontend — Unit Tests (push) Successful in 10m33s
CD Preprod / Backend — Integration Tests (push) Successful in 9m57s
CD Preprod / Build Backend (push) Successful in 7m51s
CD Preprod / Build Log Exporter (push) Successful in 34s
CD Preprod / Build Frontend (push) Successful in 19m46s
CD Preprod / Deploy to Preprod (push) Failing after 1s
CD Preprod / Notify Failure (push) Has been skipped
CD Preprod / Smoke Tests (push) Has been skipped
CD Preprod / Notify Success (push) Has been skipped
2026-04-06 14:21:32 +02:00
David
72141c5f68 fix preprod
Some checks failed
CD Preprod / Backend — Lint (push) Successful in 10m27s
CD Preprod / Frontend — Lint & Type-check (push) Successful in 10m55s
CD Preprod / Backend — Unit Tests (push) Successful in 10m10s
CD Preprod / Frontend — Unit Tests (push) Successful in 10m33s
CD Preprod / Backend — Integration Tests (push) Successful in 10m6s
CD Preprod / Build Backend (push) Successful in 16m5s
CD Preprod / Build Frontend (push) Successful in 35m0s
CD Preprod / Deploy to Preprod (push) Failing after 1s
CD Preprod / Smoke Tests (push) Has been skipped
CD Preprod / Notify Success (push) Has been skipped
CD Preprod / Notify Failure (push) Has been skipped
2026-04-04 17:58:36 +02:00
David
fe7cd1f792 Merge branch 'dev' into preprod
Some checks failed
CD Preprod / Backend — Lint (push) Successful in 10m24s
CD Preprod / Frontend — Lint & Type-check (push) Successful in 11m0s
CD Preprod / Backend — Unit Tests (push) Failing after 5m33s
CD Preprod / Frontend — Unit Tests (push) Successful in 10m33s
CD Preprod / Backend — Integration Tests (push) Has been skipped
CD Preprod / Build Backend (push) Has been skipped
CD Preprod / Build Frontend (push) Has been skipped
CD Preprod / Deploy to Preprod (push) Has been skipped
CD Preprod / Smoke Tests (push) Has been skipped
CD Preprod / Notify Success (push) Has been skipped
CD Preprod / Notify Failure (push) Has been skipped
2026-04-04 17:02:39 +02:00
David
14c5073b12 fix types check
All checks were successful
Dev CI / Backend — Lint (push) Successful in 10m23s
Dev CI / Frontend — Lint & Type-check (push) Successful in 10m57s
Dev CI / Backend — Unit Tests (push) Successful in 10m12s
Dev CI / Frontend — Unit Tests (push) Successful in 10m33s
Dev CI / Notify Failure (push) Has been skipped
2026-04-04 15:28:13 +02:00
David
fca1cf051a fix test
Some checks failed
Dev CI / Notify Failure (push) Blocked by required conditions
Dev CI / Frontend — Lint & Type-check (push) Failing after 6m16s
Dev CI / Frontend — Unit Tests (push) Has been skipped
Dev CI / Backend — Lint (push) Successful in 10m24s
Dev CI / Backend — Unit Tests (push) Has been cancelled
2026-04-04 15:08:53 +02:00
David
1d248b3cc9 fix test 2026-04-04 14:18:41 +02:00
David
21e9584907 chore: sync full codebase from cicd branch
Some checks failed
CD Preprod / Unit Tests (${{ matrix.app }}) (backend) (push) Blocked by required conditions
CD Preprod / Unit Tests (${{ matrix.app }}) (frontend) (push) Blocked by required conditions
CD Preprod / Integration Tests (push) Blocked by required conditions
CD Preprod / Build & Push Backend (push) Blocked by required conditions
CD Preprod / Build & Push Frontend (push) Blocked by required conditions
CD Preprod / Deploy to Preprod (push) Blocked by required conditions
CD Preprod / Smoke Tests (push) Blocked by required conditions
CD Preprod / Deployment Summary (push) Blocked by required conditions
CD Preprod / Notify Success (push) Blocked by required conditions
CD Preprod / Notify Failure (push) Blocked by required conditions
CD Preprod / Quality (${{ matrix.app }}) (backend) (push) Has been cancelled
CD Preprod / Quality (${{ matrix.app }}) (frontend) (push) Has been cancelled
Aligns preprod with the complete application codebase (cicd branch).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-04 12:56:28 +02:00
David
26a3412658 feat(admin): add 3-dot action menus, document deletion, and company email in CSV configs
- Bookings: replace static action cell with vertical dots menu (view details modal, validate transfer, delete)
- Documents: replace download button with dots menu (download, delete) + new admin DELETE endpoint bypassing status/ownership restrictions
- CSV rates: show company email (from upload form metadata) in active configs table, fix header layout (title left, reload right, same line)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-03 23:43:47 +02:00
David
74221d576e feat(contact): wire contact form to real backend — sends email to contact@xpeditis.com 2026-04-02 14:19:50 +02:00
David
ed0f43ba32 fix(contact): remove card links, fix support email, single Paris office, remove Europe map section 2026-04-02 13:47:49 +02:00
David
317de48765 feat: fix auth flows — reset password, 2-step register, remember me, SIRET
- Backend: add forgot-password and reset-password endpoints with token-based
  flow (1h expiry, secure random token, email via existing EmailPort)
- Backend: add PasswordResetTokenOrmEntity + migration
- Backend: add siret field to RegisterOrganizationDto and pass it to org creation
- Backend: remove MinLength(12) from LoginDto.password (wrong for login use case)
- Backend: add rememberMe to LoginDto (optional, informational)
- Frontend: register page rewritten as 2-step flow (account info → org info)
  with SIRET field, Suspense wrapper, "Centre d'aide" link removed
- Frontend: forgot-password page rewritten in French, matching login style
- Frontend: reset-password page rewritten in French, matching login style, with Suspense
- Frontend: remember me now works — localStorage when checked, sessionStorage otherwise
- Frontend: login page removes "Centre d'aide" link, connects rememberMe to login
- Frontend: auth-context and api/auth updated to pass rememberMe through full chain

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-02 13:10:08 +02:00
David
6a38c236b2 feat: add centralized logging stack with log exporter
- Add Loki + Promtail + Grafana logging infrastructure
- Add log-exporter service (REST API to query logs)
- Add docker-compose.logging.yml (standalone logging stack)
- Add docker-compose.full.yml (merged dev + logging in one file)
- Update docker-compose.dev.yml with network labels for Promtail
- Add admin logs dashboard page
- Fix invitation DTO and users settings page

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-02 12:46:10 +02:00
David
e1f813bd92 fix documentation et landing page 2026-04-01 20:33:22 +02:00
David
0e4c0d7785 fix email and documentation api 2026-04-01 19:51:57 +02:00
David
ccc64b939a fix documentation et api key 2026-03-31 16:19:35 +02:00
David
420e52311c fix system payment and other missing 2026-03-19 19:04:31 +01:00
David
230d06dc98 payment methode 2026-03-18 15:11:09 +01:00
David
1c6edb9d41 adding middleware for auth 2026-03-17 18:39:07 +01:00
David
7f31aa59a9 fix contact 2026-03-17 11:58:29 +01:00
David
071d5f198c fix
All checks were successful
CI/CD Pipeline / Frontend - Build, Test & Push (push) Successful in 12m3s
CI/CD Pipeline / Backend - Build, Test & Push (push) Successful in 15m39s
CI/CD Pipeline / Integration Tests (push) Has been skipped
CI/CD Pipeline / Deployment Summary (push) Successful in 1s
CI/CD Pipeline / Deploy to Portainer (push) Successful in 11s
CI/CD Pipeline / Discord Notification (Failure) (push) Has been skipped
CI/CD Pipeline / Discord Notification (Success) (push) Successful in 1s
2026-02-10 22:48:23 +01:00
David
9bed6b54a7 fix 404
Some checks failed
CI/CD Pipeline / Backend - Build, Test & Push (push) Failing after 10m59s
CI/CD Pipeline / Frontend - Build, Test & Push (push) Successful in 37m59s
CI/CD Pipeline / Integration Tests (push) Has been skipped
CI/CD Pipeline / Deployment Summary (push) Has been skipped
CI/CD Pipeline / Deploy to Portainer (push) Has been skipped
CI/CD Pipeline / Discord Notification (Success) (push) Has been skipped
CI/CD Pipeline / Discord Notification (Failure) (push) Has been skipped
2026-02-10 21:50:40 +01:00
David
baf5981847 fix improve 2026-02-10 17:16:35 +01:00
David
fd1f57dd1d fix 2026-02-05 11:53:22 +01:00
David
1d279a0e12 fix 2026-02-04 21:51:03 +01:00
David
1a86864d1f fix 2026-02-03 22:14:03 +01:00
David
cf19c36586 fix ui 2026-02-03 16:08:00 +01:00
David
3e654af8a3 fix 2026-01-27 19:57:15 +01:00
David
4c7b07a911 fix error login 2026-01-27 19:33:51 +01:00
David
94039598d9 fix
All checks were successful
CI/CD Pipeline / Backend - Build, Test & Push (push) Successful in 20m31s
CI/CD Pipeline / Frontend - Build, Test & Push (push) Successful in 38m16s
CI/CD Pipeline / Integration Tests (push) Has been skipped
CI/CD Pipeline / Deployment Summary (push) Successful in 1s
CI/CD Pipeline / Deploy to Portainer (push) Successful in 12s
CI/CD Pipeline / Discord Notification (Failure) (push) Has been skipped
CI/CD Pipeline / Discord Notification (Success) (push) Successful in 1s
2026-01-26 11:56:46 +01:00
David
a200987288 fix 2026-01-26 00:08:04 +01:00
David
10b45599ae fix 2026-01-25 16:00:22 +01:00
David
40f785ddeb feature track and trace 2026-01-20 15:35:59 +01:00
David
5c7834c7e4 fix licensing 2026-01-20 11:28:54 +01:00
David
dd5d806180 fix wiki 2026-01-19 10:48:19 +01:00
David
de4126a657 fix document 2026-01-17 15:47:03 +01:00
David
0a8e2043cc fix documents 2026-01-17 15:46:55 +01:00
David
0d814e9a94 fix 2026-01-16 15:44:16 +01:00
David
d9868dd49f fix: prevent password fields from being pre-filled in profile page
All checks were successful
CI/CD Pipeline / Backend - Build, Test & Push (push) Successful in 2m42s
CI/CD Pipeline / Frontend - Build, Test & Push (push) Successful in 27m20s
CI/CD Pipeline / Integration Tests (push) Has been skipped
CI/CD Pipeline / Deployment Summary (push) Successful in 1s
CI/CD Pipeline / Deploy to Portainer (push) Successful in 12s
CI/CD Pipeline / Discord Notification (Failure) (push) Has been skipped
CI/CD Pipeline / Discord Notification (Success) (push) Successful in 2s
Fixed issue where password form fields (especially "New Password")
were being pre-filled with values, either from browser autocomplete
or residual form state.

Changes:
1. Added explicit empty defaultValues to password form
   - currentPassword: ''
   - newPassword: ''
   - confirmPassword: ''

2. Added autoComplete attributes to prevent browser pre-fill:
   - currentPassword: autoComplete="current-password"
   - newPassword: autoComplete="new-password"
   - confirmPassword: autoComplete="new-password"

3. Added useEffect to reset password form when switching tabs:
   - Ensures clean state when navigating to "Change Password" tab
   - Prevents stale values from persisting

4. Explicit reset values on successful password change:
   - Previously used passwordForm.reset() without values
   - Now explicitly sets all fields to empty strings

This ensures password fields are always empty and never pre-filled
by the browser or by residual form state.

Refs: apps/frontend/app/dashboard/profile/page.tsx:64-70,85-95

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-12 18:24:13 +01:00
David
2054e73e78 fix: resolve profile page data persistence and password change issues
Fixed critical issues with the profile page (/dashboard/profile):

1. **Form data not persisting on page refresh**:
   - Added useEffect to update form values when user data loads
   - Forms now properly populate after auth context loads user data

2. **Blank page on refresh**:
   - Added loading and error states for better UX
   - Handle case where user is not loaded yet (loading spinner)
   - Handle case where user fails to load (retry button)

3. **Password change API endpoint correction**:
   - Fixed: POST /api/v1/users/change-password (incorrect)
   - Corrected to: PATCH /api/v1/users/me/password (matches backend)
   - Updated return type to include { message: string }

The root cause was that useForm defaultValues were set once at
component mount when user was still null. The form never updated
when user data was subsequently loaded by the auth context.

Now the form properly resets with user data via useEffect, and
proper loading/error states prevent showing a blank page.

Refs: apps/frontend/app/dashboard/profile/page.tsx:68-78

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-12 18:18:04 +01:00
David
905a56888a fix: implement password change functionality in profile page
Fix password change feature that was previously non-functional:
- Add changePassword function in frontend API (src/lib/api/users.ts)
- Update API endpoint to match backend: PATCH /api/v1/users/me/password
- Connect profile page to real API instead of mock implementation
- Export changePassword function from API index

The backend endpoint was already implemented but frontend was using
a placeholder Promise.resolve(). Now properly calls the backend API.

Refs: apps/frontend/app/dashboard/profile/page.tsx:87-105

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-12 17:56:10 +01:00
David
4ce7d2ec07 fix icon
All checks were successful
CI/CD Pipeline / Backend - Build, Test & Push (push) Successful in 2m16s
CI/CD Pipeline / Frontend - Build, Test & Push (push) Successful in 26m44s
CI/CD Pipeline / Integration Tests (push) Has been skipped
CI/CD Pipeline / Deployment Summary (push) Successful in 1s
CI/CD Pipeline / Deploy to Portainer (push) Successful in 12s
CI/CD Pipeline / Discord Notification (Failure) (push) Has been skipped
CI/CD Pipeline / Discord Notification (Success) (push) Successful in 1s
2025-12-23 19:14:13 +01:00
David
13857628bb feat: add theme-adaptive favicon
- Replace full logo (1875x1699) with simplified icon (512x512) optimized for favicon display
- Implement CSS media queries for automatic theme adaptation:
  * Dark mode: white X (#FFFFFF) with cyan dot (#34CCCD)
  * Light mode: dark blue X and dot (#1D3865)
- Remove old logo files (xpeditis-icon.svg, xpeditis-logo.svg)
- Simplified design with clean X shape and accent dot for better visibility at small sizes

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-23 13:43:31 +01:00
David
5878b63a0a chore: update favicon to use full Xpeditis logo
Replace the icon with the full Xpeditis logo (logo-black.svg) as requested.
Updated references in:
- app/icon.svg (favicon)
- app/layout.tsx (metadata and social cards)
- public/manifest.json (PWA icon)

Note: The full logo (1875x1699px) will be scaled down in browser tabs.
Consider creating a square optimized version for better display in small sizes.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-23 13:34:19 +01:00
David
e1aeb9ccd7 feat: add Xpeditis logo as favicon and improve metadata
Add site favicon and enhance metadata for better SEO and social sharing:
- Added app/icon.svg from existing logo for browser tab icon
- Enhanced metadata with Open Graph and Twitter card support
- Created manifest.json for PWA support
- Added metadataBase for proper social image resolution
- Updated .env.example with NEXT_PUBLIC_APP_URL

The Xpeditis logo (blue background with cyan X) now appears in:
- Browser tabs (favicon)
- Bookmarks
- Mobile home screen (PWA)
- Social media shares (Open Graph)

Configuration for different environments:
- Dev: NEXT_PUBLIC_APP_URL=http://localhost:3000
- Preprod: NEXT_PUBLIC_APP_URL=https://app.preprod.xpeditis.com
- Prod: NEXT_PUBLIC_APP_URL=https://xpeditis.com

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-23 13:29:45 +01:00
David
618b3064c3 fix: use environment variable for API URL in carrier accept/reject pages
Replace hardcoded localhost:4000 URLs with NEXT_PUBLIC_API_URL environment variable
in carrier portal pages to support different environments (dev/staging/production).

Pages updated:
- app/carrier/accept/[token]/page.tsx
- app/carrier/reject/[token]/page.tsx

This fixes the issue where preprod environment (app.preprod.xpeditis.com) was calling
localhost:4000 instead of the correct API endpoint (api.preprod.xpeditis.com).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-23 13:04:29 +01:00
David
6603c458d4 fix v1.0
All checks were successful
CI/CD Pipeline / Backend - Build, Test & Push (push) Successful in 18m57s
CI/CD Pipeline / Frontend - Build, Test & Push (push) Successful in 34m42s
CI/CD Pipeline / Integration Tests (push) Has been skipped
CI/CD Pipeline / Deployment Summary (push) Successful in 1s
CI/CD Pipeline / Deploy to Portainer (push) Successful in 12s
CI/CD Pipeline / Discord Notification (Failure) (push) Has been skipped
CI/CD Pipeline / Discord Notification (Success) (push) Successful in 2s
2025-12-23 11:59:53 +01:00
David
a1e255e816 fix v1.0.0
Some checks failed
CI/CD Pipeline / Discord Notification (Failure) (push) Blocked by required conditions
CI/CD Pipeline / Integration Tests (push) Blocked by required conditions
CI/CD Pipeline / Deployment Summary (push) Blocked by required conditions
CI/CD Pipeline / Deploy to Portainer (push) Blocked by required conditions
CI/CD Pipeline / Discord Notification (Success) (push) Blocked by required conditions
CI/CD Pipeline / Backend - Build, Test & Push (push) Failing after 1m20s
CI/CD Pipeline / Frontend - Build, Test & Push (push) Has been cancelled
2025-12-23 11:49:57 +01:00
David
21d7044a61 fix notifications 2025-12-22 12:32:32 +01:00
David
7748a49def fix 2025-12-18 16:56:35 +01:00
David
840ad49dcb fix bookings 2025-12-18 15:33:55 +01:00
David
bd81749c4a fix notifications 2025-12-16 14:15:06 +01:00
David
a8e6ded810 fix dasboard 2025-12-16 13:41:32 +01:00
David
eab3d6f612 feature dashboard 2025-12-16 00:26:03 +01:00
David
71541c79e7 fix pagination 2025-12-15 17:14:56 +01:00
David
368de79a1c merge 2025-12-15 16:51:36 +01:00
David
49b02face6 fix booking validate 2025-12-15 15:03:59 +01:00
David
faf1207300 feature fix branch 2025-12-12 10:31:49 +01:00
David
4279cd291d feature 2025-12-11 15:04:52 +01:00
David
54e7a42601 fix email send 2025-12-05 13:55:40 +01:00
David
3a43558d47 mail changer 2025-12-03 22:37:11 +01:00
David
55e44ab21c fix carte 2025-12-03 22:24:48 +01:00
David
7fc43444a9 fix search 2025-12-03 21:39:50 +01:00
David
a27b1d6cfa fix search booking 2025-11-30 23:27:22 +01:00
David
2da0f0210d fix organisation 2025-11-30 18:58:12 +01:00
David
c76f908d5c fix error get organisation 2025-11-30 18:39:08 +01:00
David
1a92228af5 contexte user reparer 2025-11-30 17:50:05 +01:00
David
cf029b1be4 fix users deleted and actived desactived 2025-11-30 17:36:34 +01:00
David
591213aaf7 layout access admin and manager 2025-11-30 13:48:04 +01:00
David
cca6eda9d3 send invitations 2025-11-30 13:39:32 +01:00
David
a34c850e67 fix register 2025-11-29 12:50:02 +01:00
David
b2f5d9968d fix: repair user management CRUD operations (create, update, delete)
Problems Fixed:

1. **User Creation (Invite)**
   - ❌ Missing password field (required by API)
   - ❌ Hardcoded organizationId 'default-org-id'
   - ❌ Wrong role format (lowercase instead of ADMIN/USER/MANAGER)
   - ✅ Now uses currentUser.organizationId from auth context
   - ✅ Added password field with validation (min 8 chars)
   - ✅ Fixed role enum to match backend (ADMIN, USER, MANAGER, VIEWER)

2. **Role Change (PATCH)**
   - ❌ Used 'as any' masking type errors
   - ❌ Lowercase role values
   - ✅ Proper typing with uppercase roles
   - ✅ Added success/error feedback
   - ✅ Disabled state during mutation

3. **Toggle Active (PATCH)**
   - ✅ Was working but added better feedback
   - ✅ Added disabled state during mutation

4. **Delete User (DELETE)**
   - ✅ Was working but added better feedback
   - ✅ Added disabled state during mutation

5. **UI Improvements**
   - Added success messages with auto-dismiss (3s)
   - Added error messages with auto-dismiss (5s)
   - Added loading states on all action buttons
   - Fixed role badge colors to use uppercase keys
   - Better form validation before API call

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-20 23:35:10 +01:00
David
84c31f38a0 fix: load CSV files from MinIO instead of local filesystem for rate search
All checks were successful
CI/CD Pipeline / Backend - Build, Test & Push (push) Successful in 7m30s
CI/CD Pipeline / Frontend - Build, Test & Push (push) Successful in 11m56s
CI/CD Pipeline / Integration Tests (push) Has been skipped
CI/CD Pipeline / Deployment Summary (push) Successful in 1s
CI/CD Pipeline / Deploy to Portainer (push) Successful in 11s
CI/CD Pipeline / Discord Notification (Failure) (push) Has been skipped
CI/CD Pipeline / Discord Notification (Success) (push) Successful in 1s
Problem:
- CSV files uploaded to MinIO via admin panel
- But getAvailableCsvFiles() only listed local filesystem
- Result: rate search returned 0 results even though files exist in MinIO

Solution:
- Modified getAvailableCsvFiles() to check MinIO first
- Lists files from csv_rate_configs table with minioObjectKey
- Falls back to local filesystem if MinIO not configured
- Logs clearly which source is being used

This ensures rate search uses the uploaded CSV files from MinIO storage.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-20 23:18:03 +01:00
David
dc62166272 fix: correct Argon2 password hash and organization UUIDs in migrations
All checks were successful
CI/CD Pipeline / Backend - Build, Test & Push (push) Successful in 7m52s
CI/CD Pipeline / Frontend - Build, Test & Push (push) Successful in 11m40s
CI/CD Pipeline / Integration Tests (push) Has been skipped
CI/CD Pipeline / Deployment Summary (push) Successful in 1s
CI/CD Pipeline / Deploy to Portainer (push) Successful in 14s
CI/CD Pipeline / Discord Notification (Failure) (push) Has been skipped
CI/CD Pipeline / Discord Notification (Success) (push) Successful in 1s
- Fixed test user migration to use real Argon2id hash for Password123!
- Replaced random uuidv4() with fixed UUIDs in organization seeds
- Updated auth.service.ts to use DEFAULT_ORG_ID constant
- Added ON CONFLICT DO UPDATE to migration for existing users
- Ensures consistent UUIDs across environments (dev/preprod/prod)

Fixes:
- Registration 500 error (foreign key constraint violation)
- Login 401 error (invalid password hash)
- Organization ID mismatch between migrations and application code

Test users (Password: Password123!):
- admin@xpeditis.com (ADMIN)
- manager@xpeditis.com (MANAGER)
- user@xpeditis.com (USER)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-20 20:05:22 +01:00
David
7dadd951bb fix portainer deploy
All checks were successful
CI/CD Pipeline / Backend - Build, Test & Push (push) Successful in 16m18s
CI/CD Pipeline / Frontend - Build, Test & Push (push) Successful in 30m58s
CI/CD Pipeline / Integration Tests (push) Has been skipped
CI/CD Pipeline / Deployment Summary (push) Successful in 2s
CI/CD Pipeline / Discord Notification (Failure) (push) Has been skipped
CI/CD Pipeline / Discord Notification (Success) (push) Successful in 1s
2025-11-19 15:17:53 +01:00
David
88f0cc99bb fix: enable Tailwind CSS compilation in Docker builds
CRITICAL FIX: Frontend was serving raw CSS with uncompiled @tailwind directives,
resulting in completely unstyled pages (plain text without any CSS).

Root cause:
- postcss.config.js and tailwind.config.js/ts were excluded in .dockerignore
- This prevented PostCSS/Tailwind from compiling CSS during Docker builds
- Local builds worked because config files were present

Changes:
1. apps/frontend/.dockerignore:
   - Commented out postcss.config.js exclusion
   - Commented out tailwind.config.js/ts exclusions
   - Added explanatory comments about why these files are needed

2. apps/backend/Dockerfile:
   - Copy src/ directory to production stage for CSV upload paths
   - Create csv-storage/rates directory with proper permissions
   - Fix EACCES errors when uploading CSV files

3. apps/backend/src/application/controllers/admin/csv-rates.controller.ts:
   - Add getCsvUploadPath() helper function
   - Support both local dev and Docker environments
   - Use absolute paths instead of relative paths

4. docker-compose.dev.yml:
   - Change backend port mapping to 4001:4000 (avoid local dev conflicts)
   - Change frontend port mapping to 3001:3000
   - Update CORS_ORIGIN and NEXT_PUBLIC_API_URL accordingly

Impact:
- ✅ Fixes completely broken frontend CSS in Docker/production
- ✅ Applies to CI/CD builds (uses apps/frontend/.dockerignore)
- ✅ Applies to Portainer deployments (pulls from CI/CD images)
- ✅ Fixes CSV upload permission errors in backend
- ✅ Enables local Docker testing on Mac ARM64

Testing:
- Local Docker build now shows compiled Tailwind CSS (60KB+)
- Frontend displays properly styled pages at http://localhost:3001
- Backend CSV uploads work without permission errors

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-19 13:39:05 +01:00
David
f9b1625e20 fix: replace require() with ES6 imports for fs and path
All checks were successful
CI/CD Pipeline / Backend - Build, Test & Push (push) Successful in 7m10s
CI/CD Pipeline / Frontend - Build, Test & Push (push) Successful in 11m27s
CI/CD Pipeline / Integration Tests (push) Has been skipped
CI/CD Pipeline / Deployment Summary (push) Successful in 1s
CI/CD Pipeline / Discord Notification (Failure) (push) Has been skipped
CI/CD Pipeline / Discord Notification (Success) (push) Successful in 2s
- Add fs and path imports at top of file
- Remove inline require() statements that violated ESLint rules
- Fixes 6 @typescript-eslint/no-var-requires errors
2025-11-17 23:26:22 +01:00
David
18098eb6c1 fix: correct import path in delete-orphaned-csv-config script 2025-11-17 23:12:11 +01:00
David
4f0d6f8f08 fix: add StorageModule import to CsvRateModule for S3 support
- Export S3StorageAdapter directly from StorageModule
- Import StorageModule and ConfigModule in CsvRateModule
- Fix dependency injection for S3StorageAdapter in CSV controllers
2025-11-17 20:52:27 +01:00
David
753cfae41d feat: add MinIO storage support for CSV rate files
- Upload CSV files to MinIO/S3 after validation
- Store MinIO object key in database metadata
- Support loading CSV from MinIO with fallback to local files
- Delete from both MinIO and local storage when removing files
- Add migration script to upload existing CSV files to MinIO
- Graceful degradation if MinIO is not configured
2025-11-17 20:12:21 +01:00
David
e030871b4e fix: handle missing CSV files gracefully in rate search with Promise.allSettled 2025-11-17 20:02:49 +01:00
David
f5eabf4861 fix: generate CSV filename from company name instead of using multer callback
Some checks failed
CI/CD Pipeline / Backend - Build, Test & Push (push) Failing after 1m32s
CI/CD Pipeline / Frontend - Build, Test & Push (push) Successful in 11m35s
CI/CD Pipeline / Integration Tests (push) Has been skipped
CI/CD Pipeline / Deployment Summary (push) Has been skipped
CI/CD Pipeline / Discord Notification (Failure) (push) Has been skipped
CI/CD Pipeline / Discord Notification (Success) (push) Has been skipped
Fixed CSV file upload to properly generate filename based on company name. The previous implementation tried to read `req.body.companyName` in multer's filename callback, but the body is not yet parsed at that point, causing files to be named "unknown.csv".

## Solution
1. Use temporary filename during upload (timestamp + random)
2. After validation and parsing, rename file to proper company name format
3. Delete old file if it exists before renaming
4. Store final filename in database configuration

## Changes
- Multer filename callback now generates temporary filename
- Added file renaming logic after successful validation
- Updated database records to use final filename instead of temp name
- Added logging for file operations

## Impact
- New CSV uploads will have correct filenames (e.g., "ssc-consolidation.csv")
- No more "unknown.csv" files
- Existing "unknown.csv" needs to be manually deleted via dashboard

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-17 19:57:10 +01:00
David
aeb3d2a75d fix: use company name from form instead of CSV column
Some checks failed
CI/CD Pipeline / Backend - Build, Test & Push (push) Failing after 1m33s
CI/CD Pipeline / Frontend - Build, Test & Push (push) Has been cancelled
CI/CD Pipeline / Integration Tests (push) Blocked by required conditions
CI/CD Pipeline / Deployment Summary (push) Blocked by required conditions
CI/CD Pipeline / Discord Notification (Success) (push) Blocked by required conditions
CI/CD Pipeline / Discord Notification (Failure) (push) Blocked by required conditions
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>
2025-11-17 19:53:45 +01:00
David
27caca0734 feat: add CSV rates CRUD management to frontend dashboard
Some checks failed
CI/CD Pipeline / Backend - Build, Test & Push (push) Failing after 1m38s
CI/CD Pipeline / Frontend - Build, Test & Push (push) Successful in 25m29s
CI/CD Pipeline / Integration Tests (push) Has been skipped
CI/CD Pipeline / Deployment Summary (push) Has been skipped
CI/CD Pipeline / Discord Notification (Success) (push) Has been skipped
CI/CD Pipeline / Discord Notification (Failure) (push) Has been skipped
Added comprehensive CSV rates management interface to the frontend dashboard with full CRUD operations.

## Backend Changes
- Added `GET /api/v1/admin/csv-rates/files` endpoint to list all uploaded CSV files with metadata
- Added `DELETE /api/v1/admin/csv-rates/files/:filename` endpoint to delete CSV files and their configurations
- Both endpoints provide frontend-compatible responses with file info (filename, size, rowCount, uploadedAt)
- File deletion includes both filesystem cleanup and database configuration removal

## Frontend Changes
- Added "CSV Rates" navigation item to dashboard sidebar (ADMIN only)
- Moved CSV rates page from `/app/admin/csv-rates` to `/app/dashboard/admin/csv-rates` for proper dashboard integration
- Updated CsvUpload component to include required `companyEmail` field
- Component now properly validates and sends all required fields (companyName, companyEmail, file)
- Enhanced form validation with email input type

## Features
- ✅ Upload CSV rate files with company name and email
- ✅ List all uploaded CSV files with metadata (filename, size, row count, upload date)
- ✅ Delete CSV files with confirmation dialog
- ✅ Real-time file validation (format, size limit 10MB)
- ✅ Auto-refresh after successful operations
- ✅ ADMIN role-based access control
- ✅ Integrated into dashboard navigation

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-17 19:11:37 +01:00
David
d8007c0887 fix: allow package-lock.json in frontend Docker build
All checks were successful
CI/CD Pipeline / Backend - Build, Test & Push (push) Successful in 17m2s
CI/CD Pipeline / Frontend - Build, Test & Push (push) Successful in 31m59s
CI/CD Pipeline / Integration Tests (push) Has been skipped
CI/CD Pipeline / Deployment Summary (push) Successful in 1s
The .dockerignore was excluding package-lock.json, causing npm ci to fail
with "The npm ci command can only install with an existing package-lock.json".

Commented out the package-lock.json line in .dockerignore to allow it to be
copied into the Docker build context.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-17 12:33:10 +01:00