xpeditis2.0/apps/frontend/app/dashboard/wiki/calcul-fret/page.tsx
2026-01-19 10:48:19 +01:00

270 lines
11 KiB
TypeScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* Calcul du Fret Maritime - Wiki Page
*
* Comment sont calculés les coûts de transport
*/
import Link from 'next/link';
import { Card, CardHeader, CardTitle, CardContent } from '@/components/ui/card';
const surcharges = [
{
code: 'BAF',
name: 'Bunker Adjustment Factor',
description: 'Surcharge carburant liée aux fluctuations du prix du fuel maritime.',
variation: 'Mensuelle',
},
{
code: 'CAF',
name: 'Currency Adjustment Factor',
description: 'Ajustement monétaire pour compenser les variations de taux de change.',
variation: 'Mensuelle',
},
{
code: 'THC',
name: 'Terminal Handling Charges',
description: 'Frais de manutention au terminal portuaire (chargement/déchargement).',
variation: 'Par port',
},
{
code: 'ISPS',
name: 'International Ship & Port Security',
description: 'Surcharge sécurité conforme au code ISPS (post 11 septembre).',
variation: 'Fixe',
},
{
code: 'LSS',
name: 'Low Sulphur Surcharge',
description: 'Surcharge carburant bas soufre (réglementation IMO 2020).',
variation: 'Mensuelle',
},
{
code: 'PSS',
name: 'Peak Season Surcharge',
description: 'Surcharge haute saison (généralement août-octobre vers l\'Europe).',
variation: 'Saisonnière',
},
{
code: 'GRI',
name: 'General Rate Increase',
description: 'Augmentation générale des tarifs, généralement annoncée à l\'avance.',
variation: 'Variable',
},
{
code: 'EBS',
name: 'Emergency Bunker Surcharge',
description: 'Surcharge d\'urgence en cas de hausse brutale du carburant.',
variation: 'Exceptionnelle',
},
];
const fraisAdditionnels = [
{ name: 'Documentation Fee', description: 'Frais d\'émission du B/L ou autres documents', typical: '35-75 USD' },
{ name: 'Seal Fee', description: 'Coût du plomb de sécurité du conteneur', typical: '10-25 USD' },
{ name: 'VGM Fee', description: 'Frais de certification du poids vérifié', typical: '25-50 USD' },
{ name: 'Container Cleaning', description: 'Nettoyage du conteneur si requis', typical: '50-150 USD' },
{ name: 'Customs Clearance', description: 'Frais de dédouanement (honoraires)', typical: '50-200 USD' },
{ name: 'Inspection Fee', description: 'Frais d\'inspection (scanner, phytosanitaire)', typical: '50-300 USD' },
];
export default function CalculFretPage() {
return (
<div className="space-y-6">
{/* Header with back link */}
<div className="flex items-center gap-4 mb-6">
<Link
href="/dashboard/wiki"
className="flex items-center text-blue-600 hover:text-blue-800 transition-colors"
>
<svg className="w-5 h-5 mr-1" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M15 19l-7-7 7-7" />
</svg>
Retour au Wiki
</Link>
</div>
{/* Title */}
<div className="mb-8">
<div className="flex items-center gap-3">
<span className="text-4xl">🧮</span>
<h1 className="text-3xl font-bold text-gray-900">Calcul du Fret Maritime</h1>
</div>
<p className="mt-3 text-gray-600 max-w-3xl">
Le coût du transport maritime se compose du fret de base et de nombreuses surcharges.
Comprendre ces éléments est essentiel pour bien estimer ses coûts logistiques.
</p>
</div>
{/* Base Calculation */}
<Card className="bg-blue-50 border-blue-200">
<CardContent className="pt-6">
<h3 className="font-semibold text-blue-900 mb-3">📐 Principes de Base</h3>
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
<div>
<h4 className="font-medium text-blue-800">FCL (Conteneur Complet)</h4>
<p className="text-sm text-blue-700 mt-1">
Prix forfaitaire par conteneur (20&apos;, 40&apos;, 40&apos;HC), indépendant du poids (dans les limites).
</p>
<p className="text-xs text-blue-600 mt-2">Ex: 1,500 USD/20&apos; Shanghai Rotterdam</p>
</div>
<div>
<h4 className="font-medium text-blue-800">LCL (Groupage)</h4>
<p className="text-sm text-blue-700 mt-1">
Prix au mètre cube (CBM) ou à la tonne, selon le plus avantageux pour le transporteur.
</p>
<p className="text-xs text-blue-600 mt-2">Ex: 45 USD/CBM (minimum 1 CBM)</p>
</div>
</div>
</CardContent>
</Card>
{/* Weight Calculation */}
<Card className="mt-8 bg-gray-50">
<CardContent className="pt-6">
<h3 className="font-semibold text-gray-900 mb-3"> Poids Taxable (LCL)</h3>
<div className="bg-white p-4 rounded-lg border mb-4">
<div className="text-center">
<p className="text-lg font-mono bg-blue-100 text-blue-800 p-3 rounded inline-block">
Poids taxable = MAX (Volume CBM × 1000, Poids brut kg)
</p>
</div>
</div>
<div className="grid grid-cols-1 md:grid-cols-2 gap-4 text-sm">
<div className="bg-white p-4 rounded-lg border">
<h4 className="font-medium">Exemple 1 : Marchandise légère</h4>
<ul className="text-gray-600 mt-2 space-y-1">
<li>Volume : 2 CBM</li>
<li>Poids : 500 kg</li>
<li>Volume équivalent : 2 × 1000 = 2000 kg</li>
<li className="font-medium text-blue-700"> Taxé sur 2 CBM (ou 2 tonnes)</li>
</ul>
</div>
<div className="bg-white p-4 rounded-lg border">
<h4 className="font-medium">Exemple 2 : Marchandise lourde</h4>
<ul className="text-gray-600 mt-2 space-y-1">
<li>Volume : 1 CBM</li>
<li>Poids : 2000 kg</li>
<li>Volume équivalent : 1 × 1000 = 1000 kg</li>
<li className="font-medium text-blue-700"> Taxé sur 2 tonnes (poids réel)</li>
</ul>
</div>
</div>
<p className="text-xs text-gray-500 mt-3">
Ratio standard : 1 CBM = 1 tonne (1000 kg). Certaines compagnies utilisent 1 CBM = 333 kg pour l&apos;aérien.
</p>
</CardContent>
</Card>
{/* Surcharges */}
<div className="mt-8">
<h2 className="text-xl font-bold text-gray-900 mb-4">📋 Surcharges Courantes</h2>
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
{surcharges.map((sur) => (
<Card key={sur.code} className="bg-white">
<CardHeader className="pb-2">
<CardTitle className="flex items-center gap-2">
<span className="px-3 py-1 bg-purple-600 text-white rounded-md font-mono text-sm">
{sur.code}
</span>
<span className="text-base">{sur.name}</span>
</CardTitle>
</CardHeader>
<CardContent>
<p className="text-gray-600 text-sm">{sur.description}</p>
<p className="text-xs text-gray-500 mt-2">Variation : {sur.variation}</p>
</CardContent>
</Card>
))}
</div>
</div>
{/* Additional fees */}
<div className="mt-8">
<h2 className="text-xl font-bold text-gray-900 mb-4">💵 Frais Additionnels</h2>
<Card className="bg-white">
<CardContent className="pt-6">
<div className="overflow-x-auto">
<table className="w-full text-sm">
<thead>
<tr className="border-b">
<th className="text-left py-2 font-medium">Frais</th>
<th className="text-left py-2 font-medium">Description</th>
<th className="text-right py-2 font-medium">Montant typique</th>
</tr>
</thead>
<tbody>
{fraisAdditionnels.map((frais) => (
<tr key={frais.name} className="border-b last:border-0">
<td className="py-3 font-medium text-gray-900">{frais.name}</td>
<td className="py-3 text-gray-600">{frais.description}</td>
<td className="py-3 text-right font-mono text-gray-700">{frais.typical}</td>
</tr>
))}
</tbody>
</table>
</div>
</CardContent>
</Card>
</div>
{/* Example calculation */}
<Card className="mt-8 bg-green-50 border-green-200">
<CardContent className="pt-6">
<h3 className="font-semibold text-green-900 mb-3">📊 Exemple de Devis FCL</h3>
<div className="bg-white p-4 rounded-lg border">
<p className="text-sm text-gray-600 mb-3">Conteneur 40&apos; Shanghai Le Havre</p>
<div className="space-y-2 font-mono text-sm">
<div className="flex justify-between">
<span>Ocean Freight (base)</span>
<span>1,800 USD</span>
</div>
<div className="flex justify-between">
<span>BAF</span>
<span>450 USD</span>
</div>
<div className="flex justify-between">
<span>LSS</span>
<span>180 USD</span>
</div>
<div className="flex justify-between">
<span>THC Origin</span>
<span>150 USD</span>
</div>
<div className="flex justify-between">
<span>THC Destination</span>
<span>280 EUR</span>
</div>
<div className="flex justify-between">
<span>ISPS</span>
<span>12 USD</span>
</div>
<div className="flex justify-between">
<span>Documentation</span>
<span>45 USD</span>
</div>
<div className="border-t pt-2 flex justify-between font-bold">
<span>Total estimé</span>
<span>~2,637 USD + 280 EUR</span>
</div>
</div>
</div>
</CardContent>
</Card>
{/* Tips */}
<Card className="mt-8 bg-amber-50 border-amber-200">
<CardContent className="pt-6">
<h3 className="font-semibold text-amber-900 mb-3">💡 Conseils pour Optimiser</h3>
<ul className="list-disc list-inside space-y-2 text-amber-800">
<li>Demandez des devis &quot;All-in&quot; pour éviter les surprises de surcharges</li>
<li>Comparez les transitaires sur le total, pas seulement le fret de base</li>
<li>Anticipez la haute saison (septembre-novembre) avec des réservations précoces</li>
<li>Optimisez le remplissage des conteneurs pour réduire le coût unitaire</li>
<li>Vérifiez les surcharges qui peuvent changer entre devis et facture</li>
</ul>
</CardContent>
</Card>
</div>
);
}