/** * Types TypeScript pour les entités BTP */ export interface Client { id: string; nom: string; prenom: string; entreprise?: string; email?: string; telephone?: string; adresse?: string; codePostal?: string; ville?: string; numeroTVA?: string; siret?: string; dateCreation: string; dateModification: string; actif: boolean; nomComplet?: string; adresseComplete?: string; // Relations pour la gestion de projet gestionnairePrincipalId?: string; // ID du gestionnaire principal gestionnairesSecondaires?: string[]; // IDs des gestionnaires secondaires compteClientId?: string; // ID du compte utilisateur CLIENT associé } export interface Chantier { id: string; nom: string; description?: string; adresse: string; codePostal?: string; ville?: string; dateDebut: string; dateFinPrevue?: string; dateFinReelle?: string; statut: StatutChantier; montantPrevu?: number; montantReel?: number; dateCreation: string; dateModification: string; actif: boolean; client: Client; devis?: Devis[]; factures?: Facture[]; // Nouveaux champs pour la gestion avancée typeChantier?: string; // TypeChantier depuis chantier-templates.ts surface?: number; nombreNiveaux?: number; dureeEstimeeJours?: number; complexite?: 'SIMPLE' | 'MOYEN' | 'COMPLEXE' | 'TRES_COMPLEXE'; specificites?: string[]; reglementationsApplicables?: string[]; phasesAutoGenerees?: boolean; } export interface Devis { id: string; numero: string; objet: string; description?: string; dateEmission: string; dateValidite: string; statut: StatutDevis; montantHT?: number; tauxTVA: number; montantTVA?: number; montantTTC?: number; conditionsPaiement?: string; delaiExecution?: number; dateCreation: string; dateModification: string; actif: boolean; client: Client; chantier?: Chantier; lignes?: LigneDevis[]; } export interface LigneDevis { id: string; designation: string; description?: string; quantite: number; unite: string; prixUnitaire: number; montantLigne?: number; ordre: number; dateCreation: string; dateModification: string; devis: Devis; } export interface Facture { id: string; numero: string; objet: string; description?: string; dateEmission: string; dateEcheance: string; datePaiement?: string; statut: StatutFacture; montantHT?: number; tauxTVA: number; montantTVA?: number; montantTTC?: number; montantPaye?: number; conditionsPaiement?: string; typeFacture: TypeFacture; dateCreation: string; dateModification: string; actif: boolean; client: Client; chantier?: Chantier; devis?: Devis; lignes?: LigneFacture[]; } export interface LigneFacture { id: string; designation: string; description?: string; quantite: number; unite: string; prixUnitaire: number; montantLigne?: number; ordre: number; dateCreation: string; dateModification: string; facture: Facture; } // Enums export enum StatutChantier { PLANIFIE = 'PLANIFIE', EN_COURS = 'EN_COURS', TERMINE = 'TERMINE', ANNULE = 'ANNULE', SUSPENDU = 'SUSPENDU' } export enum StatutDevis { BROUILLON = 'BROUILLON', ENVOYE = 'ENVOYE', ACCEPTE = 'ACCEPTE', REFUSE = 'REFUSE', EXPIRE = 'EXPIRE' } export enum StatutFacture { BROUILLON = 'BROUILLON', ENVOYEE = 'ENVOYEE', PAYEE = 'PAYEE', PARTIELLEMENT_PAYEE = 'PARTIELLEMENT_PAYEE', ECHUE = 'ECHUE', ANNULEE = 'ANNULEE' } export enum TypeFacture { FACTURE = 'FACTURE', AVOIR = 'AVOIR', ACOMPTE = 'ACOMPTE' } // Types utilitaires pour le dashboard export interface DashboardStats { totalClients: number; totalChantiers: number; chantiersEnCours: number; chantiersPlanifies: number; chantiersTermines: number; totalDevis: number; devisAcceptes: number; devisEnAttente: number; totalFactures: number; facturesPayees: number; facturesEnRetard: number; chiffreAffaires: number; chiffreAffairesMois: number; chiffreAffairesAnnee: number; } export interface ChantierRecent { id: string; nom: string; client: string; statut: StatutChantier; dateDebut: string; montantPrevu?: number; } export interface FactureEnRetard { id: string; numero: string; client: string; montantTTC: number; dateEcheance: string; joursRetard: number; } export interface DevisEnAttente { id: string; numero: string; client: string; montantTTC: number; dateEmission: string; dateValidite: string; joursRestants: number; } // Types pour les filtres et recherches export interface FilterOptions { statut?: string[]; dateDebut?: string; dateFin?: string; client?: string; montantMin?: number; montantMax?: number; } export interface SearchResult { data: T[]; total: number; page: number; size: number; } export interface ApiResponse { data: T; message?: string; success: boolean; } // Types pour la planification export interface Employe { id: string; nom: string; prenom: string; email?: string; telephone?: string; poste: string; specialites: string[]; tauxHoraire?: number; dateEmbauche: string; statut: StatutEmploye; equipe?: Equipe; planning?: PlanningEvent[]; competences: Competence[]; disponibilites: Disponibilite[]; dateCreation: string; dateModification: string; actif: boolean; } export interface Equipe { id: string; nom: string; description?: string; chef: Employe; membres: Employe[]; specialites: string[]; statut: StatutEquipe; chantiers?: Chantier[]; planning?: PlanningEvent[]; dateCreation: string; dateModification: string; actif: boolean; } export interface Materiel { id: string; nom: string; marque?: string; modele?: string; numeroSerie?: string; type: TypeMateriel; description?: string; dateAchat?: string; valeurAchat?: number; valeurActuelle?: number; statut: StatutMateriel; localisation?: string; proprietaire?: string; // Entreprise ou location coutUtilisation?: number; // Coût par jour/heure maintenances: MaintenanceMateriel[]; planning?: PlanningEvent[]; dateCreation: string; dateModification: string; actif: boolean; } export interface MaintenanceMateriel { id: string; materiel: Materiel; type: TypeMaintenance; description: string; datePrevue: string; dateRealisee?: string; cout?: number; statut: StatutMaintenance; technicien?: string; notes?: string; prochaineMaintenance?: string; dateCreation: string; dateModification: string; } export interface PlanningEvent { id: string; titre: string; description?: string; dateDebut: string; dateFin: string; type: TypePlanningEvent; statut: StatutPlanningEvent; priorite: PrioritePlanningEvent; chantier?: Chantier; equipe?: Equipe; employes: Employe[]; materiels: Materiel[]; notes?: string; couleur?: string; recurrence?: RecurrencePlanningEvent; rappels: RappelPlanningEvent[]; dateCreation: string; dateModification: string; actif: boolean; } export interface Disponibilite { id: string; employe: Employe; dateDebut: string; dateFin: string; type: TypeDisponibilite; motif?: string; approuvee: boolean; dateCreation: string; dateModification: string; } export interface Competence { id: string; nom: string; niveau: NiveauCompetence; certifiee: boolean; dateObtention?: string; dateExpiration?: string; description?: string; } export interface RappelPlanningEvent { id: string; delai: number; // en minutes avant l'événement type: TypeRappel; actif: boolean; } export interface RecurrencePlanningEvent { type: TypeRecurrence; intervalle: number; joursSemaine?: number[]; // 0=dimanche, 1=lundi... dateFin?: string; occurrences?: number; } // Enums pour la planification export enum StatutEmploye { ACTIF = 'ACTIF', INACTIF = 'INACTIF', CONGE = 'CONGE', ARRET_MALADIE = 'ARRET_MALADIE', FORMATION = 'FORMATION' } export enum StatutEquipe { ACTIVE = 'ACTIVE', INACTIVE = 'INACTIVE', EN_FORMATION = 'EN_FORMATION', DISPONIBLE = 'DISPONIBLE', OCCUPEE = 'OCCUPEE' } export enum TypeMateriel { VEHICULE = 'VEHICULE', OUTIL_ELECTRIQUE = 'OUTIL_ELECTRIQUE', OUTIL_MANUEL = 'OUTIL_MANUEL', ECHAFAUDAGE = 'ECHAFAUDAGE', BETONIERE = 'BETONIERE', GRUE = 'GRUE', COMPRESSEUR = 'COMPRESSEUR', GENERATEUR = 'GENERATEUR', ENGIN_CHANTIER = 'ENGIN_CHANTIER', MATERIEL_MESURE = 'MATERIEL_MESURE', EQUIPEMENT_SECURITE = 'EQUIPEMENT_SECURITE', AUTRE = 'AUTRE' } export enum StatutMateriel { DISPONIBLE = 'DISPONIBLE', UTILISE = 'UTILISE', MAINTENANCE = 'MAINTENANCE', HORS_SERVICE = 'HORS_SERVICE', RESERVE = 'RESERVE', EN_REPARATION = 'EN_REPARATION' } export enum TypeMaintenance { PREVENTIVE = 'PREVENTIVE', CORRECTIVE = 'CORRECTIVE', REVISION = 'REVISION', CONTROLE_TECHNIQUE = 'CONTROLE_TECHNIQUE', NETTOYAGE = 'NETTOYAGE' } export enum StatutMaintenance { PLANIFIEE = 'PLANIFIEE', EN_COURS = 'EN_COURS', TERMINEE = 'TERMINEE', REPORTEE = 'REPORTEE', ANNULEE = 'ANNULEE' } export enum TypePlanningEvent { CHANTIER = 'CHANTIER', REUNION = 'REUNION', FORMATION = 'FORMATION', MAINTENANCE = 'MAINTENANCE', CONGE = 'CONGE', RENDEZ_VOUS_CLIENT = 'RENDEZ_VOUS_CLIENT', LIVRAISON = 'LIVRAISON', INSPECTION = 'INSPECTION', AUTRE = 'AUTRE' } export enum StatutPlanningEvent { PLANIFIE = 'PLANIFIE', CONFIRME = 'CONFIRME', EN_COURS = 'EN_COURS', TERMINE = 'TERMINE', ANNULE = 'ANNULE', REPORTE = 'REPORTE' } export enum PrioritePlanningEvent { BASSE = 'BASSE', NORMALE = 'NORMALE', HAUTE = 'HAUTE', CRITIQUE = 'CRITIQUE' } export enum TypeDisponibilite { CONGE_PAYE = 'CONGE_PAYE', CONGE_SANS_SOLDE = 'CONGE_SANS_SOLDE', ARRET_MALADIE = 'ARRET_MALADIE', FORMATION = 'FORMATION', ABSENCE = 'ABSENCE', HORAIRE_REDUIT = 'HORAIRE_REDUIT' } export enum NiveauCompetence { DEBUTANT = 'DEBUTANT', INTERMEDIAIRE = 'INTERMEDIAIRE', AVANCE = 'AVANCE', EXPERT = 'EXPERT' } export enum TypeRappel { EMAIL = 'EMAIL', SMS = 'SMS', NOTIFICATION = 'NOTIFICATION' } export enum TypeRecurrence { QUOTIDIENNE = 'QUOTIDIENNE', HEBDOMADAIRE = 'HEBDOMADAIRE', MENSUELLE = 'MENSUELLE', ANNUELLE = 'ANNUELLE', PERSONNALISEE = 'PERSONNALISEE' } // Types pour les vues de planification export interface PlanningCalendrierView { events: PlanningEvent[]; equipes: Equipe[]; materiels: Materiel[]; chantiers: Chantier[]; conflicts: PlanningConflict[]; } export interface PlanningConflict { id: string; type: TypeConflitPlanification; description: string; events: PlanningEvent[]; ressources: (Employe | Materiel | Equipe)[]; gravite: GraviteConflict; suggestions: string[]; } export enum TypeConflitPlanification { RESSOURCE_DOUBLE_RESERVATION = 'RESSOURCE_DOUBLE_RESERVATION', EMPLOYE_INDISPONIBLE = 'EMPLOYE_INDISPONIBLE', MATERIEL_MAINTENANCE = 'MATERIEL_MAINTENANCE', CHEVAUCHEMENT_HORAIRES = 'CHEVAUCHEMENT_HORAIRES', COMPETENCE_MANQUANTE = 'COMPETENCE_MANQUANTE' } export enum GraviteConflict { INFO = 'INFO', ATTENTION = 'ATTENTION', ERREUR = 'ERREUR', CRITIQUE = 'CRITIQUE' } // Types pour les statistiques de planification export interface PlanningStats { totalEmployes: number; employesActifs: number; employesDisponibles: number; totalEquipes: number; equipesActives: number; totalMateriels: number; materielsDisponibles: number; materielsEnMaintenance: number; evenementsMois: number; conflitsPlanification: number; tauxUtilisationEquipes: number; tauxUtilisationMateriels: number; }