CONVERSIONS UI (8 pages): ✅ Remplacement de tous les composants Shadcn/UI par PrimeReact - Card, Button, Input, Textarea, Badge → Card, Button, InputText, InputTextarea, Tag - Conversion de toutes les icônes lucide-react en primeicons Pages converties: - app/(main)/aide/page.tsx - app/(main)/aide/documentation/page.tsx - app/(main)/aide/tutoriels/page.tsx - app/(main)/aide/support/page.tsx - app/(main)/messages/page.tsx - app/(main)/messages/nouveau/page.tsx - app/(main)/messages/envoyes/page.tsx - app/(main)/messages/archives/page.tsx CORRECTIONS BUILD: ✅ Résolution des conflits de dépendances FullCalendar - @fullcalendar/core: 6.1.4 → ^6.1.19 - Alignement avec daygrid, timegrid, interaction, react ✅ Correction des erreurs TypeScript - DataTable: Ajout de selectionMode="multiple" - InputText number: Conversion number → string avec .toString() ✅ Correction des services API (3 fichiers) - fournisseurService.ts - notificationService.ts - userService.ts - Remplacement des appels apiService.get() par axios direct - Ajout du préfixe /api/v1/ à tous les endpoints - Configuration d'interceptors pour authentication tokens RÉSULTAT: ✅ Build réussi: 126 pages générées ✅ 0 erreurs de compilation ✅ 0 erreurs TypeScript ✅ Architecture cohérente avec PrimeReact 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
241 lines
6.2 KiB
TypeScript
241 lines
6.2 KiB
TypeScript
import axios from 'axios';
|
|
import { API_CONFIG } from '../config/api';
|
|
|
|
export interface Fournisseur {
|
|
id: string;
|
|
nom: string;
|
|
contact: string;
|
|
telephone: string;
|
|
email: string;
|
|
adresse: string;
|
|
ville: string;
|
|
codePostal: string;
|
|
pays: string;
|
|
siret?: string;
|
|
tva?: string;
|
|
conditionsPaiement: string;
|
|
delaiLivraison: number;
|
|
note?: string;
|
|
actif: boolean;
|
|
dateCreation: string;
|
|
dateModification: string;
|
|
}
|
|
|
|
export interface CreateFournisseurRequest {
|
|
nom: string;
|
|
contact: string;
|
|
telephone: string;
|
|
email: string;
|
|
adresse: string;
|
|
ville: string;
|
|
codePostal: string;
|
|
pays: string;
|
|
siret?: string;
|
|
tva?: string;
|
|
conditionsPaiement: string;
|
|
delaiLivraison: number;
|
|
note?: string;
|
|
}
|
|
|
|
export interface UpdateFournisseurRequest {
|
|
nom?: string;
|
|
contact?: string;
|
|
telephone?: string;
|
|
email?: string;
|
|
adresse?: string;
|
|
ville?: string;
|
|
codePostal?: string;
|
|
pays?: string;
|
|
siret?: string;
|
|
tva?: string;
|
|
conditionsPaiement?: string;
|
|
delaiLivraison?: number;
|
|
note?: string;
|
|
actif?: boolean;
|
|
}
|
|
|
|
const api = axios.create({
|
|
baseURL: API_CONFIG.baseURL,
|
|
timeout: API_CONFIG.timeout,
|
|
headers: API_CONFIG.headers,
|
|
});
|
|
|
|
// Interceptor pour ajouter le token
|
|
api.interceptors.request.use((config) => {
|
|
if (typeof window !== 'undefined') {
|
|
const accessToken = localStorage.getItem('accessToken');
|
|
if (accessToken) {
|
|
config.headers['Authorization'] = `Bearer ${accessToken}`;
|
|
}
|
|
}
|
|
return config;
|
|
});
|
|
|
|
export class FournisseurService {
|
|
/**
|
|
* Récupère tous les fournisseurs
|
|
*/
|
|
async getAllFournisseurs(): Promise<Fournisseur[]> {
|
|
try {
|
|
const response = await api.get('/api/v1/fournisseurs');
|
|
return response.data;
|
|
} catch (error) {
|
|
console.error('Erreur lors de la récupération des fournisseurs:', error);
|
|
return this.getMockFournisseurs();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Récupère un fournisseur par ID
|
|
*/
|
|
async getFournisseurById(id: string): Promise<Fournisseur> {
|
|
try {
|
|
const response = await api.get(`/api/v1/fournisseurs/${id}`);
|
|
return response.data;
|
|
} catch (error) {
|
|
console.error('Erreur lors de la récupération du fournisseur:', error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Crée un nouveau fournisseur
|
|
*/
|
|
async createFournisseur(fournisseurData: CreateFournisseurRequest): Promise<Fournisseur> {
|
|
try {
|
|
const response = await api.post('/api/v1/fournisseurs', fournisseurData);
|
|
return response.data;
|
|
} catch (error) {
|
|
console.error('Erreur lors de la création du fournisseur:', error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Met à jour un fournisseur existant
|
|
*/
|
|
async updateFournisseur(id: string, fournisseurData: UpdateFournisseurRequest): Promise<Fournisseur> {
|
|
try {
|
|
const response = await api.put(`/api/v1/fournisseurs/${id}`, fournisseurData);
|
|
return response.data;
|
|
} catch (error) {
|
|
console.error('Erreur lors de la mise à jour du fournisseur:', error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Supprime un fournisseur (soft delete)
|
|
*/
|
|
async deleteFournisseur(id: string): Promise<void> {
|
|
try {
|
|
await api.delete(`/api/v1/fournisseurs/${id}`);
|
|
} catch (error) {
|
|
console.error('Erreur lors de la suppression du fournisseur:', error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Recherche des fournisseurs par nom
|
|
*/
|
|
async searchFournisseurs(searchTerm: string): Promise<Fournisseur[]> {
|
|
try {
|
|
const response = await api.get(`/api/v1/fournisseurs/search?q=${encodeURIComponent(searchTerm)}`);
|
|
return response.data;
|
|
} catch (error) {
|
|
console.error('Erreur lors de la recherche des fournisseurs:', error);
|
|
return [];
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Récupère les statistiques des fournisseurs
|
|
*/
|
|
async getFournisseurStats(): Promise<{
|
|
total: number;
|
|
actifs: number;
|
|
inactifs: number;
|
|
parPays: Record<string, number>;
|
|
}> {
|
|
try {
|
|
const response = await api.get('/api/v1/fournisseurs/stats');
|
|
return response.data;
|
|
} catch (error) {
|
|
console.error('Erreur lors de la récupération des statistiques:', error);
|
|
return {
|
|
total: 0,
|
|
actifs: 0,
|
|
inactifs: 0,
|
|
parPays: {}
|
|
};
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Données mockées pour les fournisseurs
|
|
*/
|
|
private getMockFournisseurs(): Fournisseur[] {
|
|
return [
|
|
{
|
|
id: 'fourn-1',
|
|
nom: 'Matériaux BTP Pro',
|
|
contact: 'Jean Dupont',
|
|
telephone: '01 23 45 67 89',
|
|
email: 'contact@materiaux-btp-pro.fr',
|
|
adresse: '123 Rue de la Construction',
|
|
ville: 'Paris',
|
|
codePostal: '75001',
|
|
pays: 'France',
|
|
siret: '12345678901234',
|
|
tva: 'FR12345678901',
|
|
conditionsPaiement: '30 jours',
|
|
delaiLivraison: 7,
|
|
note: 'Fournisseur fiable pour les gros volumes',
|
|
actif: true,
|
|
dateCreation: '2024-01-15T00:00:00Z',
|
|
dateModification: '2024-01-15T00:00:00Z'
|
|
},
|
|
{
|
|
id: 'fourn-2',
|
|
nom: 'Outillage Express',
|
|
contact: 'Marie Martin',
|
|
telephone: '02 34 56 78 90',
|
|
email: 'contact@outillage-express.fr',
|
|
adresse: '456 Avenue des Outils',
|
|
ville: 'Lyon',
|
|
codePostal: '69001',
|
|
pays: 'France',
|
|
siret: '23456789012345',
|
|
tva: 'FR23456789012',
|
|
conditionsPaiement: '45 jours',
|
|
delaiLivraison: 5,
|
|
note: 'Spécialisé dans les outils de précision',
|
|
actif: true,
|
|
dateCreation: '2024-02-01T00:00:00Z',
|
|
dateModification: '2024-02-01T00:00:00Z'
|
|
},
|
|
{
|
|
id: 'fourn-3',
|
|
nom: 'Engins Chantier SARL',
|
|
contact: 'Pierre Durand',
|
|
telephone: '03 45 67 89 01',
|
|
email: 'contact@engins-chantier.fr',
|
|
adresse: '789 Boulevard des Engins',
|
|
ville: 'Marseille',
|
|
codePostal: '13001',
|
|
pays: 'France',
|
|
siret: '34567890123456',
|
|
tva: 'FR34567890123',
|
|
conditionsPaiement: '60 jours',
|
|
delaiLivraison: 14,
|
|
note: 'Location et vente d\'engins de chantier',
|
|
actif: true,
|
|
dateCreation: '2024-02-15T00:00:00Z',
|
|
dateModification: '2024-02-15T00:00:00Z'
|
|
}
|
|
];
|
|
}
|
|
}
|
|
|
|
export const fournisseurService = new FournisseurService(); |