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 { 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 { 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 { 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 { 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 { 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 { 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; }> { 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();