diff --git a/README.md b/README.md index b4533f3..2346c5f 100644 --- a/README.md +++ b/README.md @@ -46,17 +46,17 @@ npm run start:dev L'API sera disponible sur `http://localhost:3000/api` -## 🌾 Données de démonstration (usine de triage de céréales) +## 🌾 Données de démonstration (usine céréalière complète) -Le script `npm run seed:demo` permet de remplir la base avec un jeu de données complet représentant une ligne de triage et de séchage de céréales. Il supprime toutes les données existantes (machines, composants, pièces, champs personnalisés, modèles, types...) tout en conservant les sites et profils déjà enregistrés. +Le script `npm run seed:demo` supprime toutes les données existantes (machines, composants, pièces, champs personnalisés, modèles, types...) tout en conservant les sites et profils déjà enregistrés. Il regénère ensuite un jeu de données réaliste couvrant l'ensemble d'une usine de triage et d'expédition de céréales avec des machines indépendantes. ### Contenu généré -- Catégories de composants et de pièces avec champs personnalisés adaptés (élévateurs à godets, convoyeurs à bande, table densimétrique, séchoir, vis sans fin, benne peseuse, armoire de contrôle, Manitou, etc.). -- Modèles de composants multi-niveaux et modèles de pièces cohérents (moteurs, capteurs, courroies, roulements, réducteurs, capteurs de pesage, sondes PT100...). -- Type de machine « Ligne de triage et séchage céréales 120 t/h » incluant exigences de composants/pièces, pièces critiques et champs personnalisés. -- Machine réelle "Ligne de triage Valgrain 2024" avec hiérarchie complète de composants, sous-composants, pièces associées et valeurs de champs personnalisés. -- Pièces de réserve répondant aux exigences de stock (moteur de secours, capteur de vitesse). +- Catégories de composants et de pièces structurées autour de sous-ensembles réels (têtes/pieds d'élévateur, stations de convoyeur, segments de colonne de séchoir, cadres peseurs, flèches de chariot télescopique, etc.) avec champs personnalisés sous forme de listes déroulantes et valeurs par défaut. +- Modèles de composants et de pièces multi-niveaux : moteurs IE3, réducteurs, courroies, roulements, capteurs de vitesse, capteurs de pesage, cartouches de filtration, flexibles hydrauliques... +- Types de machines spécifiques (élévateur à godets, convoyeur à bande, table densimétrique, séchoir continu, vis de reprise, benne peseuse, chariot télescopique) comprenant leurs exigences de composants et de pièces. +- Machines concrètes pour un site de triage (deux élévateurs, deux convoyeurs, table densimétrique, séchoir complet, deux vis sans fin, benne peseuse et Manitou) avec hiérarchies de sous-composants et champs personnalisés renseignés. +- Pièces de réserve associées aux exigences de chaque type (courroies d'avance, capteurs de vitesse et vibration, cartouches de filtre, flexibles hydrauliques, capteurs de pesage, kits de visserie...). ### Exécution diff --git a/scripts/seed-industrial-data.ts b/scripts/seed-industrial-data.ts index 4999677..31f7915 100644 --- a/scripts/seed-industrial-data.ts +++ b/scripts/seed-industrial-data.ts @@ -115,167 +115,6 @@ type TypeMachineRecord = Prisma.TypeMachineGetPayload<{ }>; const componentTypeDefinitions: ComponentTypeDefinition[] = [ - { - code: 'bucket-elevator', - name: 'Élévateur à godets', - description: - "Élévateur vertical utilisé pour monter les grains vers les étages supérieurs de l'usine.", - customFields: [ - { name: 'Débit nominal (t/h)', type: 'number', required: true }, - { name: 'Hauteur de levage (m)', type: 'number' }, - { - name: 'Matériau des godets', - type: 'select', - defaultValue: 'Acier galvanisé', - options: ['Acier galvanisé', 'Acier inoxydable', 'Polypropylène renforcé'], - }, - ], - }, - { - code: 'belt-conveyor', - name: 'Convoyeur à bande', - description: - 'Convoyeur horizontal ou incliné assurant le transfert des grains entre les postes.', - customFields: [ - { name: 'Largeur de bande (mm)', type: 'number', required: true }, - { name: 'Longueur (m)', type: 'number' }, - { - name: 'Type de bande', - type: 'select', - defaultValue: 'Caoutchouc anti-statique', - options: ['Caoutchouc anti-statique', 'PVC alimentaire', 'Polyuréthane grain'], - }, - ], - }, - { - code: 'gravity-separator', - name: 'Table densimétrique', - description: - 'Séparateur gravimétrique permettant de retirer les impuretés lourdes ou légères.', - customFields: [ - { name: 'Capacité de tri (t/h)', type: 'number', required: true }, - { name: 'Fréquence de vibration (Hz)', type: 'number' }, - { - name: 'Type de plateau', - type: 'select', - defaultValue: 'Acier perforé', - options: ['Acier perforé', 'Inox poli', 'Tôle aluminium'], - }, - ], - }, - { - code: 'grain-dryer', - name: 'Séchoir à grains', - description: - "Séchoir continu assurant la réduction du taux d'humidité des céréales.", - customFields: [ - { name: 'Capacité sèche (t/h)', type: 'number', required: true }, - { name: "Nombre d'étages", type: 'number' }, - { - name: "Type d'énergie", - type: 'select', - defaultValue: 'Gaz naturel', - options: ['Gaz naturel', 'Biomasse', 'Fioul léger'], - }, - ], - }, - { - code: 'screw-conveyor', - name: 'Vis sans fin', - description: 'Vis de transfert pour la reprise des grains et le rechargement des silos.', - customFields: [ - { name: 'Diamètre vis (mm)', type: 'number', required: true }, - { name: 'Inclinaison (°)', type: 'number' }, - { name: 'Vitesse (rpm)', type: 'number' }, - ], - }, - { - code: 'weigh-hopper', - name: 'Benna peseuse', - description: 'Benna équipée de capteurs de pesage pour le chargement précis des camions.', - customFields: [ - { name: 'Capacité de pesée (kg)', type: 'number', required: true }, - { name: 'Précision (%)', type: 'number' }, - { - name: 'Mode de vidange', - type: 'select', - defaultValue: 'Trappe motorisée', - options: ['Trappe motorisée', 'Vis doseuse', 'Vanne guillotine'], - }, - ], - }, - { - code: 'control-panel', - name: 'Armoire de contrôle', - description: "Armoire électrique pilotant l'ensemble de la ligne de triage.", - customFields: [ - { - name: 'Automate principal', - type: 'select', - required: true, - defaultValue: 'Schneider Modicon M340', - options: ['Schneider Modicon M340', 'Siemens S7-1500', 'Schneider Modicon M221'], - }, - { name: 'Année de mise à jour', type: 'number' }, - { - name: "Indice de protection", - type: 'select', - defaultValue: 'IP55', - options: ['IP55', 'IP65', 'IP54'], - }, - ], - }, - { - code: 'telehandler', - name: 'Chariot télescopique', - description: - 'Manitou utilisé pour les manutentions ponctuelles et la gestion des sacs big-bags.', - customFields: [ - { name: 'Capacité de levage (t)', type: 'number', required: true }, - { name: 'Hauteur de levage (m)', type: 'number' }, - { - name: "Type d'attache", - type: 'select', - defaultValue: 'Fourches FEM', - options: ['Fourches FEM', 'Godet céréales', 'Pince big-bag'], - }, - ], - }, - { - code: 'burner-module', - name: 'Module brûleur', - description: 'Module de combustion alimentant le séchoir en air chaud.', - customFields: [ - { name: 'Puissance thermique (kW)', type: 'number', required: true }, - { - name: 'Type de carburant', - type: 'select', - defaultValue: 'Gaz naturel', - options: ['Gaz naturel', 'Biométhane', 'Fioul léger'], - }, - { - name: "Système d'allumage", - type: 'select', - defaultValue: 'Double électrode', - options: ['Double électrode', 'Brûleur pilote', 'Allumeur électronique'], - }, - ], - }, - { - code: 'dust-filter', - name: 'Filtre à poussière', - description: 'Filtre à cyclone captant les poussières en sortie de séchoir.', - customFields: [ - { name: 'Efficacité de filtration (%)', type: 'number', required: true }, - { - name: 'Type de média filtrant', - type: 'select', - options: ['Polyester', 'Fibre de verre', 'Polypropylène'], - defaultValue: 'Polyester', - }, - { name: 'Nombre de cartouches', type: 'number' }, - ], - }, { code: 'motor-drive', name: 'Groupe moteur', @@ -299,42 +138,139 @@ const componentTypeDefinitions: ComponentTypeDefinition[] = [ { code: 'gearbox-assembly', name: 'Train réducteur', - description: 'Réducteur de vitesse pour entraînement lourd.', + description: 'Réducteur industriel pour adaptation de vitesse.', customFields: [ { name: 'Rapport de réduction', type: 'select', - defaultValue: '1:28', - options: ['1:28', '1:24', '1:18'], + defaultValue: '1:25', + options: ['1:18', '1:24', '1:28', '1:32'], }, - { name: 'Couple nominal (Nm)', type: 'number' }, + { name: 'Couple nominal (Nm)', type: 'number', required: true }, { name: 'Type de montage', type: 'select', - options: ['À pattes', 'À bride', 'Sur arbre'], + options: ['À bride', 'À pattes', 'Sur arbre'], defaultValue: 'À bride', }, ], }, { - code: 'hydraulic-power-pack', - name: 'Groupe hydraulique', - description: "Groupe hydraulique alimentant les vérins d'un chariot télescopique.", + code: 'bucket-head-section', + name: "Tête d'élévateur", + description: 'Module supérieur avec tambour moteur et trappes de visite.', customFields: [ - { name: 'Débit nominal (l/min)', type: 'number', required: true }, - { name: 'Pression max (bar)', type: 'number' }, + { name: 'Largeur tambour (mm)', type: 'number', required: true }, { - name: 'Type de pompe', + name: 'Type de revêtement', type: 'select', - options: ['Piston axial', 'Palette', 'Engrenages'], - defaultValue: 'Piston axial', + options: ['Caoutchouc rainuré', 'Céramique', 'Acier lisse'], + defaultValue: 'Caoutchouc rainuré', }, + { name: 'Nombre de trappes', type: 'number' }, + ], + }, + { + code: 'bucket-boot-section', + name: "Pied d'élévateur", + description: 'Module inférieur avec trémie et organes de tension.', + customFields: [ + { name: 'Capacité trémie (L)', type: 'number', required: true }, + { + name: 'Mode de tension', + type: 'select', + options: ['Vis manuelle', 'Contrepoids', 'Hydraulique'], + defaultValue: 'Vis manuelle', + }, + { + name: 'Système de nettoyage', + type: 'select', + options: ['Grattoirs', 'Balais', 'Vide-pied'], + defaultValue: 'Grattoirs', + }, + ], + }, + { + code: 'bucket-leg-section', + name: 'Tronçon de gaine', + description: 'Section intermédiaire de gaine pour élévateur.', + customFields: [ + { name: 'Hauteur section (m)', type: 'number', required: true }, + { + name: 'Type de gaine', + type: 'select', + options: ['Boulonnée', 'Soudée', 'Renforcée'], + defaultValue: 'Boulonnée', + }, + ], + }, + { + code: 'belt-drive-station', + name: "Station d'entraînement", + description: 'Station de tête pour convoyeur à bande.', + customFields: [ + { + name: 'Type de tambour', + type: 'select', + options: ['Caoutchouc rainuré', 'Métallique', 'Céramique'], + defaultValue: 'Caoutchouc rainuré', + }, + { + name: 'Système de tension', + type: 'select', + options: ['Vis manuelle', 'Hydraulique', 'Pneumatique'], + defaultValue: 'Vis manuelle', + }, + ], + }, + { + code: 'belt-tail-station', + name: 'Station de retour', + description: 'Tambour de retour et système de nettoyage de bande.', + customFields: [ + { + name: 'Nettoyeur principal', + type: 'select', + options: ['Racleur PU', 'Brosse acier', 'Racleur secondaire'], + defaultValue: 'Racleur PU', + }, + { name: 'Diamètre tambour (mm)', type: 'number', required: true }, + ], + }, + { + code: 'belt-support-frame', + name: 'Ossature convoyeur', + description: 'Structure intermédiaire et rouleaux porteurs.', + customFields: [ + { name: 'Longueur (m)', type: 'number', required: true }, + { name: 'Nombre de rouleaux', type: 'number', required: true }, + { + name: 'Type de châssis', + type: 'select', + options: ['Treillis', 'Caisson', 'Portique'], + defaultValue: 'Treillis', + }, + ], + }, + { + code: 'gravity-vibration-deck', + name: 'Plateau vibrant', + description: 'Plateau densimétrique pour séparation des grains.', + customFields: [ + { + name: 'Type de plateau', + type: 'select', + options: ['Acier perforé', 'Inox poli', 'Composite'], + defaultValue: 'Acier perforé', + }, + { name: 'Fréquence de vibration (Hz)', type: 'number', required: true }, + { name: 'Inclinaison plateau (°)', type: 'number' }, ], }, { code: 'ventilation-fan', name: 'Ventilateur process', - description: "Ventilateur d'extraction pour séchage et dépoussiérage.", + description: "Ventilateur d'aspiration ou d'extraction pour ligne céréalière.", customFields: [ { name: 'Débit (m³/h)', type: 'number', required: true }, { @@ -346,6 +282,208 @@ const componentTypeDefinitions: ComponentTypeDefinition[] = [ { name: 'Vitesse nominale (rpm)', type: 'number' }, ], }, + { + code: 'control-panel', + name: 'Armoire de contrôle', + description: 'Armoire électrique pilotant un équipement ou une machine.', + customFields: [ + { + name: 'Automate principal', + type: 'select', + required: true, + defaultValue: 'Schneider Modicon M340', + options: ['Schneider Modicon M340', 'Siemens S7-1500', 'Schneider Modicon M221'], + }, + { name: 'Année de mise à jour', type: 'number' }, + { + name: "Indice de protection", + type: 'select', + defaultValue: 'IP55', + options: ['IP55', 'IP65', 'IP54'], + }, + ], + }, + { + code: 'burner-module', + name: 'Module brûleur', + description: 'Module de combustion alimentant un séchoir en air chaud.', + customFields: [ + { name: 'Puissance thermique (kW)', type: 'number', required: true }, + { + name: 'Type de carburant', + type: 'select', + defaultValue: 'Gaz naturel', + options: ['Gaz naturel', 'Biomasse', 'Fioul léger'], + }, + { + name: "Système d'allumage", + type: 'select', + defaultValue: 'Double électrode', + options: ['Double électrode', 'Brûleur pilote', 'Allumeur électronique'], + }, + ], + }, + { + code: 'dryer-column-segment', + name: 'Segment de colonne', + description: 'Module de colonne de séchage empilable.', + customFields: [ + { name: 'Hauteur segment (m)', type: 'number', required: true }, + { + name: 'Zone de séchage', + type: 'select', + options: ['Échauffage', 'Tempe', 'Refroidissement'], + defaultValue: 'Échauffage', + }, + { name: 'Capteurs intégrés', type: 'boolean', defaultValue: 'true' }, + ], + }, + { + code: 'dust-filter', + name: 'Filtre à poussière', + description: 'Filtre à manches ou cyclone pour dépoussiérage.', + customFields: [ + { name: 'Efficacité de filtration (%)', type: 'number', required: true }, + { + name: 'Type de média filtrant', + type: 'select', + options: ['Polyester', 'Fibre de verre', 'Polypropylène'], + defaultValue: 'Polyester', + }, + { name: 'Nombre de cartouches', type: 'number' }, + ], + }, + { + code: 'screw-trough-section', + name: 'Caisson de vis', + description: 'Tronçon de vis sans fin avec palier intermédiaire.', + customFields: [ + { name: 'Longueur (m)', type: 'number', required: true }, + { name: 'Diamètre vis (mm)', type: 'number', required: true }, + { + name: 'Matériau', + type: 'select', + options: ['Acier peint', 'Acier inoxydable', 'Galvanisé'], + defaultValue: 'Acier peint', + }, + ], + }, + { + code: 'screw-inlet-hopper', + name: "Trémie d'alimentation", + description: 'Trémie de reprise amont pour vis sans fin.', + customFields: [ + { name: 'Capacité (L)', type: 'number', required: true }, + { + name: 'Type de grille', + type: 'select', + options: ['Grille lisse', 'Grille anti-gravats', 'Grille magnétique'], + defaultValue: 'Grille anti-gravats', + }, + ], + }, + { + code: 'screw-outlet-chute', + name: 'Goulotte de sortie', + description: 'Sortie aval avec vanne de réglage.', + customFields: [ + { + name: 'Type de vanne', + type: 'select', + options: ['Guillotine', 'Papillon', 'By-pass'], + defaultValue: 'Guillotine', + }, + { name: "Orientation (°)", type: 'number' }, + ], + }, + { + code: 'weigh-load-frame', + name: 'Cadre peseur', + description: 'Structure équipée de capteurs de pesage.', + customFields: [ + { name: 'Capacité nominale (kg)', type: 'number', required: true }, + { name: 'Nombre de capteurs', type: 'number', required: true }, + { + name: 'Protection IP', + type: 'select', + options: ['IP54', 'IP65', 'IP67'], + defaultValue: 'IP65', + }, + ], + }, + { + code: 'weigh-discharge-gate', + name: 'Vanne de vidange', + description: 'Organe de vidange motorisé pour benne peseuse.', + customFields: [ + { + name: "Type d'actionneur", + type: 'select', + options: ['Hydraulique', 'Motoréducteur', 'Pneumatique'], + defaultValue: 'Hydraulique', + }, + { name: "Temps d'ouverture (s)", type: 'number' }, + ], + }, + { + code: 'hydraulic-power-pack', + name: 'Groupe hydraulique', + description: 'Groupe hydraulique alimentant vérins et accessoires.', + customFields: [ + { name: 'Débit nominal (l/min)', type: 'number', required: true }, + { name: 'Pression max (bar)', type: 'number', required: true }, + { + name: 'Type de pompe', + type: 'select', + options: ['Piston axial', 'Palette', 'Engrenages'], + defaultValue: 'Piston axial', + }, + ], + }, + { + code: 'telehandler-boom', + name: 'Flèche télescopique', + description: 'Flèche et berceau de levage pour chariot télescopique.', + customFields: [ + { name: 'Hauteur max (m)', type: 'number', required: true }, + { name: 'Sections télescopiques', type: 'number', required: true }, + { + name: 'Type de guidage', + type: 'select', + options: ['Galets', 'Patins composites'], + defaultValue: 'Galets', + }, + ], + }, + { + code: 'telehandler-cab-module', + name: 'Cabine opérateur', + description: 'Cabine pressurisée avec commandes.', + customFields: [ + { + name: 'Type de cabine', + type: 'select', + options: ['Standard', 'Premium climatisée', 'Haute visibilité'], + defaultValue: 'Premium climatisée', + }, + { name: 'Climatisation', type: 'boolean', defaultValue: 'true' }, + { name: 'Nombre de caméras', type: 'number' }, + ], + }, + { + code: 'telehandler-attachment-carrier', + name: 'Support d’outils', + description: 'Plaque porte-outils et attelage rapide.', + customFields: [ + { + name: "Type d'attache", + type: 'select', + options: ['Fourches FEM', 'Attache Euro', 'Attache Manitou'], + defaultValue: 'Attache Manitou', + }, + { name: 'Capacité nominale (t)', type: 'number', required: true }, + ], + }, ]; const pieceTypeDefinitions: PieceTypeDefinition[] = [ @@ -374,7 +512,7 @@ const pieceTypeDefinitions: PieceTypeDefinition[] = [ name: 'Finition', type: 'select', options: ['Zinguée', 'Inox', 'Noire'], - defaultValue: 'Zinguée', + defaultValue: 'Inox', }, ], }, @@ -395,7 +533,7 @@ const pieceTypeDefinitions: PieceTypeDefinition[] = [ { code: 'drive-belt', name: 'Courroie', - description: 'Courroie transporteuse ou de transmission.', + description: 'Courroie transporteuse ou élévatrice.', customFields: [ { name: 'Largeur (mm)', type: 'number', required: true }, { @@ -420,7 +558,7 @@ const pieceTypeDefinitions: PieceTypeDefinition[] = [ { name: "Type d'étanchéité", type: 'select', - options: ['2RS', 'ZZ', 'Ouvert'], + options: ['ZZ', '2RS'], defaultValue: '2RS', }, ], @@ -428,56 +566,56 @@ const pieceTypeDefinitions: PieceTypeDefinition[] = [ { code: 'filter-cartridge', name: 'Cartouche filtrante', - description: 'Cartouche filtrante pour dépoussiérage.', + description: 'Cartouche de dépoussiérage.', customFields: [ + { name: 'Longueur (mm)', type: 'number', required: true }, { - name: 'Classe de filtration', + name: 'Média filtrant', type: 'select', - options: ['G4', 'F7', 'M5'], - defaultValue: 'G4', + options: ['Polyester', 'Fibre de verre', 'Nomex'], + defaultValue: 'Polyester', }, - { name: 'Dimensions (mm)', type: 'string', required: true }, ], }, { code: 'speed-sensor', name: 'Capteur de vitesse', - description: 'Capteur inductif contrôlant la vitesse des organes rotatifs.', + description: 'Capteur inductif pour surveillance de rotation.', customFields: [ { name: 'Type de sortie', type: 'select', - options: ['PNP 4-20 mA', 'PNP tout ou rien', 'NPN'], + options: ['PNP 4-20 mA', 'PNP Tout ou rien'], defaultValue: 'PNP 4-20 mA', }, - { name: 'Plage de mesure (rpm)', type: 'number' }, + { name: 'Plage de mesure (rpm)', type: 'number', required: true }, ], }, { code: 'temperature-probe', name: 'Sonde de température', - description: 'Sonde PT100 pour la surveillance thermique du séchoir.', + description: 'Sonde PT100 pour surveillance du séchage.', customFields: [ { - name: 'Type de sonde', + name: 'Type', type: 'select', - options: ['PT100 classe A', 'PT100 classe B', 'Thermocouple K'], + options: ['PT100 classe A', 'PT100 classe B'], defaultValue: 'PT100 classe A', }, - { name: 'Plage de mesure (°C)', type: 'string', required: true }, + { name: 'Longueur tige (mm)', type: 'number', required: true }, ], }, { - code: 'plc-module', - name: 'Module automate', - description: 'Module PLC assurant des entrées/sorties pour la ligne.', + code: 'fuse-cartridge', + name: 'Fusible', + description: 'Fusible cylindrique pour protection électrique.', customFields: [ - { name: "Nombre d'E/S", type: 'number', required: true }, + { name: 'Calibre (A)', type: 'number', required: true }, { - name: 'Version firmware', + name: 'Type', type: 'select', - options: ['V2.8', 'V2.9', 'V3.0'], - defaultValue: 'V2.9', + options: ['gG', 'aM'], + defaultValue: 'gG', }, ], }, @@ -490,674 +628,177 @@ const pieceTypeDefinitions: PieceTypeDefinition[] = [ { name: 'Type de connexion', type: 'select', - options: ['Câble 4 fils', 'Câble 6 fils', 'Connecteur M12'], + options: ['Câble 4 fils', 'Câble 6 fils'], defaultValue: 'Câble 6 fils', }, ], }, { - code: 'fuse-cartridge', - name: 'Fusible industriel', - description: 'Fusible de protection pour armoire électrique.', + code: 'lubrication-cartridge', + name: 'Cartouche de graisse', + description: 'Cartouche pour point de graissage automatique.', customFields: [ - { name: 'Calibre (A)', type: 'number', required: true }, + { name: 'Volume (cm³)', type: 'number', required: true }, { - name: 'Type de fusible', + name: 'Grade de graisse', type: 'select', - options: ['gG', 'aM', 'gR'], - defaultValue: 'gG', + options: ['NLGI 1', 'NLGI 2'], + defaultValue: 'NLGI 2', }, ], }, + { + code: 'hydraulic-hose', + name: 'Flexible hydraulique', + description: 'Flexible haute pression pour circuit hydraulique.', + customFields: [ + { name: 'Pression max (bar)', type: 'number', required: true }, + { + name: 'Type de renfort', + type: 'select', + options: ['2 tresses acier', '4 nappes acier'], + defaultValue: '2 tresses acier', + }, + { name: 'Longueur (mm)', type: 'number', required: true }, + ], + }, ]; const pieceModelDefinitions: PieceModelDefinition[] = [ - { - code: 'screw-m10x60', - name: 'Vis M10x60 10.9', - description: 'Vis hexagonale classe 10.9 longueur 60 mm.', - typeCode: 'hex-screw', - structure: { - defaultCustomFieldValues: { - 'Diamètre (mm)': '10', - 'Longueur (mm)': '60', - 'Classe acier': '10.9', - }, - }, - }, { code: 'screw-m12x80', name: 'Vis M12x80 8.8', - description: 'Vis hexagonale galvanisée 80 mm.', + description: 'Vis tête hexagonale pour charpente.', + typeCode: 'hex-screw', + structure: { standard: 'ISO 4014' }, + }, + { + code: 'screw-m10x60', + name: 'Vis M10x60 10.9', + description: 'Vis haute résistance pour convoyeur.', typeCode: 'hex-screw', - structure: { - defaultCustomFieldValues: { - 'Diamètre (mm)': '12', - 'Longueur (mm)': '80', - 'Classe acier': '8.8', - }, - }, }, { code: 'screw-m8x30', name: 'Vis M8x30 inox', - description: 'Visserie inox pour équipements alimentaires.', + description: 'Visserie inox pour accessoires.', typeCode: 'hex-screw', - structure: { - defaultCustomFieldValues: { - 'Diamètre (mm)': '8', - 'Longueur (mm)': '30', - 'Classe acier': '8.8', - }, - }, + }, + { + code: 'washer-grower-12', + name: 'Rondelle Grower Ø12', + description: 'Rondelle de sécurité inox.', + typeCode: 'lock-washer', }, { code: 'washer-grower-10', name: 'Rondelle Grower Ø10', - description: 'Rondelle Grower zinguée diamètre 10 mm.', + description: 'Rondelle pour visserie M10.', typeCode: 'lock-washer', - structure: { - defaultCustomFieldValues: { - 'Diamètre (mm)': '10', - 'Finition': 'Zinguée', - }, - }, }, { - code: 'washer-grower-12', - name: 'Rondelle Grower Ø12 inox', - description: 'Rondelle Grower inox diamètre 12 mm.', - typeCode: 'lock-washer', - structure: { - defaultCustomFieldValues: { - 'Diamètre (mm)': '12', - 'Finition': 'Inox', - }, - }, - }, - { - code: 'gasket-nbr-5', - name: 'Joint NBR 5 mm', - description: 'Joint plat NBR épaisseur 5 mm.', + code: 'gasket-ht-200', + name: 'Joint haute température 200°C', + description: 'Joint fibre compressée pour trappe.', typeCode: 'flat-gasket', - structure: { - defaultCustomFieldValues: { - Matière: 'NBR', - 'Épaisseur (mm)': '5', - }, - }, - }, - { - code: 'gasket-ptfe-3', - name: 'Joint PTFE 3 mm', - description: 'Joint plat PTFE pour brides haute température.', - typeCode: 'flat-gasket', - structure: { - defaultCustomFieldValues: { - Matière: 'PTFE', - 'Épaisseur (mm)': '3', - }, - }, }, { code: 'belt-hd-800', - name: 'Courroie renforcée 800 mm', - description: 'Bande transporteuse HD 800 mm.', + name: 'Courroie 800 mm Heavy Duty', + description: 'Courroie caoutchouc nitrile 800 mm.', typeCode: 'drive-belt', - structure: { - defaultCustomFieldValues: { - 'Largeur (mm)': '800', - Matériau: 'Caoutchouc nitrile', - }, - }, }, { code: 'belt-hd-650', - name: 'Courroie renforcée 650 mm', - description: 'Bande transporteuse 650 mm.', + name: 'Courroie 650 mm Agro', + description: 'Courroie polyuréthane 650 mm.', typeCode: 'drive-belt', - structure: { - defaultCustomFieldValues: { - 'Largeur (mm)': '650', - Matériau: 'Polyuréthane', - }, - }, }, { code: 'bearing-ucp210', name: 'Palier UCP210', - description: 'Palier fonte UCP210 graissable.', + description: 'Roulement semelle fonte.', typeCode: 'roller-bearing', - structure: { - defaultCustomFieldValues: { - Série: 'UCP', - "Type d'étanchéité": '2RS', - }, - }, }, { code: 'bearing-ucfl207', name: 'Palier UCFL207', - description: 'Palier à semelle UCFL207.', + description: 'Roulement bride deux trous.', typeCode: 'roller-bearing', - structure: { - defaultCustomFieldValues: { - Série: 'UCFL', - "Type d'étanchéité": 'ZZ', - }, - }, }, { - code: 'filter-g4-500', - name: 'Cartouche G4 500x500', - description: 'Cartouche filtrante G4.', + code: 'filter-dust-610', + name: 'Cartouche filtre 610 mm', + description: 'Cartouche polyester 610 mm.', typeCode: 'filter-cartridge', - structure: { - defaultCustomFieldValues: { - 'Classe de filtration': 'G4', - 'Dimensions (mm)': '500x500x50', - }, - }, }, { - code: 'filter-f7-610', - name: 'Cartouche F7 610x610', - description: 'Cartouche haute efficacité F7.', + code: 'filter-dust-480', + name: 'Cartouche filtre 480 mm', + description: 'Cartouche polyester 480 mm.', typeCode: 'filter-cartridge', - structure: { - defaultCustomFieldValues: { - 'Classe de filtration': 'F7', - 'Dimensions (mm)': '610x610x75', - }, - }, }, { code: 'sensor-speed-m12', - name: 'Capteur inductif M12', - description: 'Capteur de vitesse inductif 4-20 mA.', + name: 'Capteur vitesse M12', + description: 'Capteur inductif M12 PNP 4-20 mA.', typeCode: 'speed-sensor', - structure: { - defaultCustomFieldValues: { - 'Type de sortie': 'PNP 4-20 mA', - 'Plage de mesure (rpm)': '1200', - }, - }, }, { code: 'sensor-speed-m18', - name: 'Capteur inductif M18', - description: 'Capteur de vitesse M18 robuste.', + name: 'Capteur vitesse M18', + description: 'Capteur inductif M18 PNP.', typeCode: 'speed-sensor', - structure: { - defaultCustomFieldValues: { - 'Type de sortie': 'PNP tout ou rien', - 'Plage de mesure (rpm)': '900', - }, - }, }, { code: 'temp-probe-pt100', - name: 'Sonde PT100 250 mm', - description: 'Sonde PT100 pour mesure d’air chaud.', + name: 'Sonde PT100 300 mm', + description: 'Sonde PT100 classe A tige 300 mm.', typeCode: 'temperature-probe', - structure: { - defaultCustomFieldValues: { - 'Type de sonde': 'PT100 classe A', - 'Plage de mesure (°C)': '0-250', - }, - }, }, { code: 'temp-probe-pt100-short', - name: 'Sonde PT100 150 mm', - description: 'Sonde PT100 courte pour supervision.', + name: 'Sonde PT100 200 mm', + description: 'Sonde PT100 compacte.', typeCode: 'temperature-probe', - structure: { - defaultCustomFieldValues: { - 'Type de sonde': 'PT100 classe B', - 'Plage de mesure (°C)': '0-200', - }, - }, - }, - { - code: 'plc-module-s71200', - name: 'Module PLC S7-1200', - description: 'Module d’entrées/sorties Siemens S7-1200.', - typeCode: 'plc-module', - structure: { - defaultCustomFieldValues: { - "Nombre d'E/S": '24', - 'Version firmware': 'V2.8', - }, - }, - }, - { - code: 'plc-module-m340', - name: 'Module PLC Modicon M340', - description: 'Module entrée/sortie Modicon M340.', - typeCode: 'plc-module', - structure: { - defaultCustomFieldValues: { - "Nombre d'E/S": '32', - 'Version firmware': 'V2.9', - }, - }, - }, - { - code: 'load-cell-5t', - name: 'Capteur de pesage 5 t', - description: 'Capteur de pesage IP68 pour benne peseuse.', - typeCode: 'load-cell', - structure: { - defaultCustomFieldValues: { - 'Capacité (kg)': '5000', - 'Type de connexion': 'Câble 6 fils', - }, - }, - }, - { - code: 'load-cell-10t', - name: 'Capteur de pesage 10 t', - description: 'Capteur de pesage haute capacité.', - typeCode: 'load-cell', - structure: { - defaultCustomFieldValues: { - 'Capacité (kg)': '10000', - 'Type de connexion': 'Connecteur M12', - }, - }, }, { code: 'fuse-gg-25a', name: 'Fusible gG 25A', - description: 'Fusible gG calibre 25A.', + description: 'Fusible protection puissance 25A.', typeCode: 'fuse-cartridge', - structure: { - defaultCustomFieldValues: { - 'Calibre (A)': '25', - 'Type de fusible': 'gG', - }, - }, }, { code: 'fuse-gg-40a', name: 'Fusible gG 40A', - description: 'Fusible gG calibre 40A.', + description: 'Fusible protection 40A.', typeCode: 'fuse-cartridge', - structure: { - defaultCustomFieldValues: { - 'Calibre (A)': '40', - 'Type de fusible': 'gG', - }, - }, + }, + { + code: 'load-cell-5t', + name: 'Capteur pesage 5T', + description: 'Capteur compression 5 tonnes.', + typeCode: 'load-cell', + }, + { + code: 'grease-cartridge-400', + name: 'Cartouche graisse 400g', + description: 'Cartouche graisse NLGI2 400g.', + typeCode: 'lubrication-cartridge', + }, + { + code: 'hydraulic-hose-2w', + name: 'Flexible 2 tresses 420 bar', + description: 'Flexible 2 tresses acier 420 bar.', + typeCode: 'hydraulic-hose', }, ]; const componentModelDefinitions: ComponentModelDefinition[] = [ - { - code: 'elevator-z400', - name: 'Élévateur Z400', - description: 'Élévateur à godets 120 t/h, 38 m.', - typeCode: 'bucket-elevator', - structure: { - recommendedCustomFields: { - 'Débit nominal (t/h)': '120', - 'Hauteur de levage (m)': '38', - 'Matériau des godets': 'Acier galvanisé', - }, - defaultPieces: [ - { modelCode: 'belt-hd-800', role: 'Courroie élévatrice' }, - { modelCode: 'screw-m12x80', role: 'Fixations tête' }, - { modelCode: 'washer-grower-12', role: 'Sécurité visserie' }, - ], - subComponents: [ - { modelCode: 'motor-drive-75', role: 'Groupe moteur' }, - { modelCode: 'gearbox-flender', role: 'Train réducteur' }, - ], - }, - }, - { - code: 'elevator-z320', - name: 'Élévateur Z320', - description: 'Élévateur à godets 95 t/h, 32 m.', - typeCode: 'bucket-elevator', - structure: { - recommendedCustomFields: { - 'Débit nominal (t/h)': '95', - 'Hauteur de levage (m)': '32', - 'Matériau des godets': 'Polypropylène renforcé', - }, - defaultPieces: [ - { modelCode: 'belt-hd-650', role: 'Courroie élévatrice' }, - { modelCode: 'screw-m10x60', role: 'Fixations pied' }, - { modelCode: 'washer-grower-10', role: 'Sécurité pied' }, - ], - subComponents: [ - { modelCode: 'motor-drive-55', role: 'Groupe moteur' }, - { modelCode: 'gearbox-bonfiglioli', role: 'Réducteur' }, - ], - }, - }, - { - code: 'conveyor-18m', - name: 'Convoyeur bande 18 m', - description: 'Convoyeur à bande 800 mm, 18 mètres.', - typeCode: 'belt-conveyor', - structure: { - recommendedCustomFields: { - 'Largeur de bande (mm)': '800', - 'Longueur (m)': '18', - 'Type de bande': 'Caoutchouc anti-statique', - }, - defaultPieces: [ - { modelCode: 'belt-hd-800', role: 'Bande transporteuse' }, - { modelCode: 'screw-m10x60', role: 'Kit boulonnerie' }, - ], - subComponents: [ - { modelCode: 'motor-drive-45', role: 'Motorisation' }, - { modelCode: 'gearbox-bonfiglioli', role: 'Réducteur' }, - ], - }, - }, - { - code: 'conveyor-25m', - name: 'Convoyeur bande 25 m', - description: 'Convoyeur à bande 650 mm, 25 mètres.', - typeCode: 'belt-conveyor', - structure: { - recommendedCustomFields: { - 'Largeur de bande (mm)': '650', - 'Longueur (m)': '25', - 'Type de bande': 'PVC alimentaire', - }, - defaultPieces: [ - { modelCode: 'belt-hd-650', role: 'Bande transporteuse' }, - { modelCode: 'screw-m8x30', role: 'Kit tendeur' }, - ], - subComponents: [ - { modelCode: 'motor-drive-37', role: 'Motorisation' }, - { modelCode: 'gearbox-bonfiglioli', role: 'Réducteur' }, - ], - }, - }, - { - code: 'gravity-table-tqx', - name: 'Table densimétrique TQX-120', - description: 'Table densimétrique haute précision 120 t/h.', - typeCode: 'gravity-separator', - structure: { - recommendedCustomFields: { - 'Capacité de tri (t/h)': '120', - 'Fréquence de vibration (Hz)': '45', - 'Type de plateau': 'Acier perforé', - }, - defaultPieces: [ - { modelCode: 'sensor-speed-m12', role: 'Capteur vibration' }, - { modelCode: 'screw-m8x30', role: 'Fixation plateau' }, - ], - subComponents: [{ modelCode: 'motor-drive-18', role: 'Moteur vibration' }], - }, - }, - { - code: 'gravity-table-compact', - name: 'Table densimétrique Compact 80', - description: 'Table densimétrique compacte 80 t/h.', - typeCode: 'gravity-separator', - structure: { - recommendedCustomFields: { - 'Capacité de tri (t/h)': '80', - 'Fréquence de vibration (Hz)': '40', - 'Type de plateau': 'Inox poli', - }, - defaultPieces: [ - { modelCode: 'sensor-speed-m18', role: 'Capteur vibration' }, - { modelCode: 'screw-m8x30', role: 'Fixation plateau' }, - ], - subComponents: [{ modelCode: 'motor-drive-15', role: 'Moteur vibration' }], - }, - }, - { - code: 'grain-dryer-cd6', - name: 'Séchoir continu CD-6', - description: 'Séchoir continu 6 étages avec récupération de chaleur.', - typeCode: 'grain-dryer', - structure: { - recommendedCustomFields: { - 'Capacité sèche (t/h)': '60', - "Nombre d'étages": '6', - "Type d'énergie": 'Gaz naturel', - }, - defaultPieces: [{ modelCode: 'gasket-nbr-5', role: 'Joint trappe inspection' }], - subComponents: [ - { modelCode: 'burner-module-3mw', role: 'Brûleur principal' }, - { modelCode: 'dust-filter-fc12', role: 'Filtre cyclone' }, - { modelCode: 'ventilation-fan-axial90', role: 'Ventilateur extraction' }, - ], - }, - }, - { - code: 'grain-dryer-cd4', - name: 'Séchoir continu CD-4', - description: 'Séchoir continu 4 étages compact.', - typeCode: 'grain-dryer', - structure: { - recommendedCustomFields: { - 'Capacité sèche (t/h)': '40', - "Nombre d'étages": '4', - "Type d'énergie": 'Biomasse', - }, - defaultPieces: [{ modelCode: 'gasket-ptfe-3', role: 'Joint trappe inspection' }], - subComponents: [ - { modelCode: 'burner-module-2mw', role: 'Brûleur biomasse' }, - { modelCode: 'dust-filter-fc8', role: 'Filtre cyclone' }, - { modelCode: 'ventilation-fan-axial60', role: 'Ventilateur extraction' }, - ], - }, - }, - { - code: 'screw-conveyor-v200', - name: 'Vis sans fin V200', - description: 'Vis de reprise diamètre 200 mm.', - typeCode: 'screw-conveyor', - structure: { - recommendedCustomFields: { - 'Diamètre vis (mm)': '200', - 'Inclinaison (°)': '12', - 'Vitesse (rpm)': '140', - }, - defaultPieces: [ - { modelCode: 'screw-m12x80', role: 'Fixations palier' }, - { modelCode: 'bearing-ucp210', role: 'Paliers supports' }, - ], - subComponents: [{ modelCode: 'motor-drive-18', role: 'Motorisation vis' }], - }, - }, - { - code: 'screw-conveyor-v160', - name: 'Vis sans fin V160', - description: 'Vis de transfert diamètre 160 mm.', - typeCode: 'screw-conveyor', - structure: { - recommendedCustomFields: { - 'Diamètre vis (mm)': '160', - 'Inclinaison (°)': '8', - 'Vitesse (rpm)': '110', - }, - defaultPieces: [ - { modelCode: 'screw-m10x60', role: 'Fixations palier' }, - { modelCode: 'bearing-ucfl207', role: 'Paliers supports' }, - ], - subComponents: [{ modelCode: 'motor-drive-15', role: 'Motorisation vis' }], - }, - }, - { - code: 'weigh-hopper-bp5', - name: 'Benna peseuse BP-5', - description: 'Benna peseuse 5 tonnes pour chargement camion.', - typeCode: 'weigh-hopper', - structure: { - recommendedCustomFields: { - 'Capacité de pesée (kg)': '5000', - 'Précision (%)': '0.5', - 'Mode de vidange': 'Trappe motorisée', - }, - defaultPieces: [ - { modelCode: 'load-cell-5t', role: 'Capteurs de pesage' }, - { modelCode: 'screw-m10x60', role: 'Kit fixation capteur' }, - ], - }, - }, - { - code: 'weigh-hopper-bp3', - name: 'Benna peseuse BP-3', - description: 'Benna peseuse 3 tonnes pour chargement big-bags.', - typeCode: 'weigh-hopper', - structure: { - recommendedCustomFields: { - 'Capacité de pesée (kg)': '3000', - 'Précision (%)': '0.3', - 'Mode de vidange': 'Vis doseuse', - }, - defaultPieces: [ - { modelCode: 'load-cell-5t', role: 'Capteurs de pesage' }, - { modelCode: 'screw-m8x30', role: 'Kit fixation capteur' }, - ], - }, - }, - { - code: 'control-panel-m340', - name: 'Armoire Schneider M340', - description: 'Armoire Schneider Electric avec automate M340.', - typeCode: 'control-panel', - structure: { - recommendedCustomFields: { - 'Automate principal': 'Schneider Modicon M340', - 'Année de mise à jour': '2023', - "Indice de protection": 'IP55', - }, - defaultPieces: [ - { modelCode: 'plc-module-m340', role: 'Automate principal' }, - { modelCode: 'fuse-gg-25a', role: 'Protection alimentation' }, - { modelCode: 'sensor-speed-m12', role: 'Entrée vitesse ligne' }, - ], - }, - }, - { - code: 'control-panel-s7', - name: 'Armoire Siemens S7-1500', - description: 'Armoire Siemens S7-1500 pour ligne secondaire.', - typeCode: 'control-panel', - structure: { - recommendedCustomFields: { - 'Automate principal': 'Siemens S7-1500', - 'Année de mise à jour': '2022', - "Indice de protection": 'IP65', - }, - defaultPieces: [ - { modelCode: 'plc-module-s71200', role: 'Module E/S' }, - { modelCode: 'fuse-gg-40a', role: 'Protection puissance' }, - ], - }, - }, - { - code: 'burner-module-3mw', - name: 'Brûleur gaz 3 MW', - description: 'Brûleur gaz modulant 3 MW pour séchoir.', - typeCode: 'burner-module', - structure: { - recommendedCustomFields: { - 'Puissance thermique (kW)': '3000', - 'Type de carburant': 'Gaz naturel', - "Système d'allumage": 'Double électrode', - }, - defaultPieces: [{ modelCode: 'temp-probe-pt100', role: 'Sonde sécurité flamme' }], - }, - }, - { - code: 'burner-module-2mw', - name: 'Brûleur biomasse 2 MW', - description: 'Brûleur biomasse 2 MW pour séchoir compact.', - typeCode: 'burner-module', - structure: { - recommendedCustomFields: { - 'Puissance thermique (kW)': '2000', - 'Type de carburant': 'Biomasse', - "Système d'allumage": 'Brûleur pilote', - }, - defaultPieces: [{ modelCode: 'temp-probe-pt100-short', role: 'Sonde sécurité flamme' }], - }, - }, - { - code: 'dust-filter-fc12', - name: 'Filtre cyclone FC-12', - description: 'Filtre cyclone avec cartouches G4.', - typeCode: 'dust-filter', - structure: { - recommendedCustomFields: { - 'Efficacité de filtration (%)': '95', - 'Type de média filtrant': 'Polyester', - 'Nombre de cartouches': '6', - }, - defaultPieces: [{ modelCode: 'filter-g4-500', role: 'Cartouche filtrante' }], - }, - }, - { - code: 'dust-filter-fc8', - name: 'Filtre cyclone FC-8', - description: 'Filtre cyclone compact avec cartouches F7.', - typeCode: 'dust-filter', - structure: { - recommendedCustomFields: { - 'Efficacité de filtration (%)': '90', - 'Type de média filtrant': 'Fibre de verre', - 'Nombre de cartouches': '4', - }, - defaultPieces: [{ modelCode: 'filter-f7-610', role: 'Cartouche filtrante' }], - }, - }, - { - code: 'telehandler-mlt1040', - name: 'Manitou MLT 1040', - description: 'Chariot télescopique Manitou 4 t.', - typeCode: 'telehandler', - structure: { - recommendedCustomFields: { - 'Capacité de levage (t)': '4', - 'Hauteur de levage (m)': '9.6', - "Type d'attache": 'Fourches FEM', - }, - subComponents: [ - { modelCode: 'motor-drive-75', role: 'Moteur principal' }, - { modelCode: 'hydraulic-pack-pvh98', role: 'Groupe hydraulique' }, - ], - defaultPieces: [ - { modelCode: 'gasket-nbr-5', role: 'Joint clapet' }, - { modelCode: 'fuse-gg-40a', role: 'Protection cabine' }, - ], - }, - }, - { - code: 'telehandler-mlt840', - name: 'Manitou MLT 840', - description: 'Chariot télescopique Manitou 3,5 t.', - typeCode: 'telehandler', - structure: { - recommendedCustomFields: { - 'Capacité de levage (t)': '3.5', - 'Hauteur de levage (m)': '7.5', - "Type d'attache": 'Godet céréales', - }, - subComponents: [ - { modelCode: 'motor-drive-55', role: 'Moteur principal' }, - { modelCode: 'hydraulic-pack-vg80', role: 'Groupe hydraulique' }, - ], - defaultPieces: [{ modelCode: 'fuse-gg-25a', role: 'Protection cabine' }], - }, - }, { code: 'motor-drive-75', - name: 'Groupe moteur IE3 75 kW', - description: 'Moteur IE3 75 kW montage à bride.', + name: 'Moteur 75 kW IE3', + description: 'Moteur IE3 75 kW IP55.', typeCode: 'motor-drive', structure: { recommendedCustomFields: { @@ -1165,255 +806,316 @@ const componentModelDefinitions: ComponentModelDefinition[] = [ 'Classe énergétique': 'IE3', "Indice de protection": 'IP55', }, - defaultPieces: [ - { modelCode: 'screw-m12x80', role: 'Fixations bride' }, - { modelCode: 'washer-grower-12', role: 'Sécurité bride' }, - ], }, }, { code: 'motor-drive-55', - name: 'Groupe moteur IE3 55 kW', - description: 'Moteur IE3 55 kW.', + name: 'Moteur 55 kW IE3', + description: 'Motorisation ligne aval.', typeCode: 'motor-drive', - structure: { - recommendedCustomFields: { - 'Puissance nominale (kW)': '55', - 'Classe énergétique': 'IE3', - "Indice de protection": 'IP55', - }, - defaultPieces: [ - { modelCode: 'screw-m12x80', role: 'Fixations bride' }, - { modelCode: 'washer-grower-12', role: 'Sécurité bride' }, - ], - }, }, { code: 'motor-drive-45', - name: 'Groupe moteur IE3 45 kW', - description: 'Moteur IE3 45 kW pour convoyeurs.', + name: 'Moteur 45 kW IE3', + description: 'Motorisation convoyeur principal.', typeCode: 'motor-drive', - structure: { - recommendedCustomFields: { - 'Puissance nominale (kW)': '45', - 'Classe énergétique': 'IE3', - "Indice de protection": 'IP55', - }, - defaultPieces: [ - { modelCode: 'screw-m10x60', role: 'Fixations bride' }, - { modelCode: 'washer-grower-10', role: 'Sécurité bride' }, - ], - }, }, { code: 'motor-drive-37', - name: 'Groupe moteur IE3 37 kW', - description: 'Moteur IE3 37 kW pour convoyeur long.', + name: 'Moteur 37 kW IE3', + description: 'Motorisation convoyeur secondaire.', typeCode: 'motor-drive', - structure: { - recommendedCustomFields: { - 'Puissance nominale (kW)': '37', - 'Classe énergétique': 'IE3', - "Indice de protection": 'IP55', - }, - defaultPieces: [ - { modelCode: 'screw-m10x60', role: 'Fixations bride' }, - { modelCode: 'washer-grower-10', role: 'Sécurité bride' }, - ], - }, }, { code: 'motor-drive-18', - name: 'Groupe moteur IE3 18,5 kW', - description: 'Moteur IE3 pour vis sans fin.', + name: 'Moteur 18.5 kW IE3', + description: 'Motorisation vis sans fin.', typeCode: 'motor-drive', - structure: { - recommendedCustomFields: { - 'Puissance nominale (kW)': '18.5', - 'Classe énergétique': 'IE3', - "Indice de protection": 'IP55', - }, - defaultPieces: [ - { modelCode: 'screw-m10x60', role: 'Fixations bride' }, - { modelCode: 'washer-grower-10', role: 'Sécurité bride' }, - ], - }, }, { code: 'motor-drive-15', - name: 'Groupe moteur IE3 15 kW', - description: 'Moteur IE3 pour équipements auxiliaires.', + name: 'Moteur 15 kW IE3', + description: 'Motorisation vis compact.', + typeCode: 'motor-drive', + }, + { + code: 'motor-drive-110', + name: 'Moteur 110 kW IE3', + description: 'Motorisation séchoir.', typeCode: 'motor-drive', - structure: { - recommendedCustomFields: { - 'Puissance nominale (kW)': '15', - 'Classe énergétique': 'IE3', - "Indice de protection": 'IP55', - }, - defaultPieces: [ - { modelCode: 'screw-m8x30', role: 'Fixations bride' }, - { modelCode: 'washer-grower-10', role: 'Sécurité bride' }, - ], - }, }, { code: 'gearbox-flender', - name: 'Réducteur Flender FZ', - description: 'Réducteur coaxial pour charge lourde.', + name: 'Réducteur Flender 3200 Nm', + description: 'Réducteur à couple élevé.', typeCode: 'gearbox-assembly', - structure: { - recommendedCustomFields: { - 'Rapport de réduction': '1:28', - 'Couple nominal (Nm)': '3200', - 'Type de montage': 'À bride', - }, - defaultPieces: [{ modelCode: 'gasket-nbr-5', role: 'Joint de bride' }], - }, }, { code: 'gearbox-bonfiglioli', name: 'Réducteur Bonfiglioli TA', - description: 'Réducteur orthogonal Bonfiglioli.', + description: 'Réducteur montage sur arbre.', typeCode: 'gearbox-assembly', - structure: { - recommendedCustomFields: { - 'Rapport de réduction': '1:24', - 'Couple nominal (Nm)': '2100', - 'Type de montage': 'Sur arbre', - }, - defaultPieces: [{ modelCode: 'gasket-ptfe-3', role: 'Joint de bride' }], - }, }, { - code: 'hydraulic-pack-pvh98', - name: 'Groupe hydraulique PVH98', - description: 'Groupe hydraulique 160 l/min.', - typeCode: 'hydraulic-power-pack', - structure: { - recommendedCustomFields: { - 'Débit nominal (l/min)': '160', - 'Pression max (bar)': '320', - 'Type de pompe': 'Piston axial', - }, - defaultPieces: [{ modelCode: 'gasket-nbr-5', role: 'Joint collecteur' }], - }, + code: 'gearbox-sew', + name: 'Réducteur SEW K', + description: 'Réducteur coaxial pour vis.', + typeCode: 'gearbox-assembly', }, { - code: 'hydraulic-pack-vg80', - name: 'Groupe hydraulique VG80', - description: 'Groupe hydraulique 110 l/min.', - typeCode: 'hydraulic-power-pack', - structure: { - recommendedCustomFields: { - 'Débit nominal (l/min)': '110', - 'Pression max (bar)': '260', - 'Type de pompe': 'Engrenages', - }, - defaultPieces: [{ modelCode: 'gasket-ptfe-3', role: 'Joint collecteur' }], - }, + code: 'bucket-head-120', + name: 'Tête élévateur 800 mm', + description: 'Tête renforcée 800 mm.', + typeCode: 'bucket-head-section', }, { - code: 'ventilation-fan-axial90', - name: 'Ventilateur axial 90 kW', - description: 'Ventilateur axial 90 kW.', + code: 'bucket-head-95', + name: 'Tête élévateur 650 mm', + description: 'Tête compacte 650 mm.', + typeCode: 'bucket-head-section', + }, + { + code: 'bucket-boot-heavy', + name: 'Pied élévateur renforcé', + description: 'Pied avec tension à vis.', + typeCode: 'bucket-boot-section', + }, + { + code: 'bucket-boot-compact', + name: 'Pied élévateur compact', + description: 'Pied compact avec tension hydraulique.', + typeCode: 'bucket-boot-section', + }, + { + code: 'bucket-leg-3m', + name: 'Tronçon 3 m', + description: 'Gaine 3 mètres renforcée.', + typeCode: 'bucket-leg-section', + }, + { + code: 'bucket-leg-2-5m', + name: 'Tronçon 2,5 m', + description: 'Gaine 2,5 mètres compacte.', + typeCode: 'bucket-leg-section', + }, + { + code: 'belt-drive-800', + name: "Station entraînement 800", + description: 'Station tête 800 mm.', + typeCode: 'belt-drive-station', + }, + { + code: 'belt-drive-650', + name: "Station entraînement 650", + description: 'Station tête 650 mm.', + typeCode: 'belt-drive-station', + }, + { + code: 'belt-tail-800', + name: 'Station retour 800', + description: 'Retour 800 mm avec racleur.', + typeCode: 'belt-tail-station', + }, + { + code: 'belt-tail-650', + name: 'Station retour 650', + description: 'Retour 650 mm compact.', + typeCode: 'belt-tail-station', + }, + { + code: 'belt-frame-18m', + name: 'Ossature 18 m', + description: 'Châssis convoyeur 18 m.', + typeCode: 'belt-support-frame', + }, + { + code: 'belt-frame-25m', + name: 'Ossature 25 m', + description: 'Châssis convoyeur 25 m.', + typeCode: 'belt-support-frame', + }, + { + code: 'gravity-deck-120', + name: 'Plateau densimétrique 120', + description: 'Plateau haute capacité.', + typeCode: 'gravity-vibration-deck', + }, + { + code: 'gravity-deck-80', + name: 'Plateau densimétrique 80', + description: 'Plateau compact.', + typeCode: 'gravity-vibration-deck', + }, + { + code: 'fan-process-45', + name: 'Ventilateur 45 kW', + description: 'Ventilateur centrifuge 45 kW.', typeCode: 'ventilation-fan', - structure: { - recommendedCustomFields: { - 'Débit (m³/h)': '48000', - 'Type de roue': 'Axiale', - 'Vitesse nominale (rpm)': '980', - }, - defaultPieces: [{ modelCode: 'screw-m12x80', role: 'Fixations châssis' }], - }, }, { - code: 'ventilation-fan-axial60', - name: 'Ventilateur axial 60 kW', - description: 'Ventilateur axial 60 kW compact.', + code: 'fan-process-30', + name: 'Ventilateur 30 kW', + description: 'Ventilateur centrifuge 30 kW.', typeCode: 'ventilation-fan', - structure: { - recommendedCustomFields: { - 'Débit (m³/h)': '32000', - 'Type de roue': 'Axiale', - 'Vitesse nominale (rpm)': '1450', - }, - defaultPieces: [{ modelCode: 'screw-m10x60', role: 'Fixations châssis' }], - }, + }, + { + code: 'control-panel-m340', + name: 'Armoire Schneider M340', + description: 'Armoire Schneider Electric.', + typeCode: 'control-panel', + }, + { + code: 'control-panel-s7', + name: 'Armoire Siemens S7', + description: 'Armoire Siemens S7-1500.', + typeCode: 'control-panel', + }, + { + code: 'burner-module-3mw', + name: 'Brûleur gaz 3 MW', + description: 'Brûleur gaz modulant.', + typeCode: 'burner-module', + }, + { + code: 'burner-module-2mw', + name: 'Brûleur biomasse 2 MW', + description: 'Brûleur biomasse compact.', + typeCode: 'burner-module', + }, + { + code: 'dryer-column-2m', + name: 'Segment colonne 2 m', + description: 'Segment de colonne zone chaude.', + typeCode: 'dryer-column-segment', + }, + { + code: 'dryer-column-1-5m', + name: 'Segment colonne 1,5 m', + description: 'Segment zone refroidissement.', + typeCode: 'dryer-column-segment', + }, + { + code: 'dust-filter-cyclone', + name: 'Filtre cyclone 610', + description: 'Filtre cyclone 6 cartouches.', + typeCode: 'dust-filter', + }, + { + code: 'dust-filter-compact', + name: 'Filtre compact 480', + description: 'Filtre compact 4 cartouches.', + typeCode: 'dust-filter', + }, + { + code: 'screw-trough-200', + name: 'Caisson vis 200', + description: 'Caisson pour vis 200 mm.', + typeCode: 'screw-trough-section', + }, + { + code: 'screw-trough-160', + name: 'Caisson vis 160', + description: 'Caisson pour vis 160 mm.', + typeCode: 'screw-trough-section', + }, + { + code: 'screw-inlet-200', + name: 'Trémie alimentation 200', + description: 'Trémie 200 l anti-gravats.', + typeCode: 'screw-inlet-hopper', + }, + { + code: 'screw-inlet-160', + name: 'Trémie alimentation 160', + description: 'Trémie 160 l compacte.', + typeCode: 'screw-inlet-hopper', + }, + { + code: 'screw-outlet-vanne', + name: 'Goulotte vanne guillotine', + description: 'Goulotte sortie vanne guillotine.', + typeCode: 'screw-outlet-chute', + }, + { + code: 'screw-outlet-flap', + name: 'Goulotte clapet by-pass', + description: 'Goulotte sortie clapet.', + typeCode: 'screw-outlet-chute', + }, + { + code: 'weigh-frame-5t', + name: 'Cadre peseur 5T', + description: 'Cadre peseur 5 tonnes.', + typeCode: 'weigh-load-frame', + }, + { + code: 'weigh-frame-3t', + name: 'Cadre peseur 3T', + description: 'Cadre peseur 3 tonnes.', + typeCode: 'weigh-load-frame', + }, + { + code: 'weigh-gate-hydraulic', + name: 'Vanne hydraulique', + description: 'Vanne hydraulique ouverture rapide.', + typeCode: 'weigh-discharge-gate', + }, + { + code: 'weigh-gate-screw', + name: 'Vanne vis motorisée', + description: 'Vanne motoréducteur vis.', + typeCode: 'weigh-discharge-gate', + }, + { + code: 'hydraulic-pack-tele', + name: 'Groupe hydraulique 140 l/min', + description: 'Groupe hydraulique Manitou.', + typeCode: 'hydraulic-power-pack', + }, + { + code: 'tele-boom-8m', + name: 'Flèche télescopique 8 m', + description: 'Flèche 4 sections 8 m.', + typeCode: 'telehandler-boom', + }, + { + code: 'tele-cab-premium', + name: 'Cabine premium climatisée', + description: 'Cabine Manitou climatisée.', + typeCode: 'telehandler-cab-module', + }, + { + code: 'tele-carrier-quick', + name: 'Attache rapide universelle', + description: 'Support d’outils Manitou.', + typeCode: 'telehandler-attachment-carrier', }, ]; const constructeurDefinitions: ConstructeurDefinition[] = [ - { - key: 'agritech', - name: 'AgriTech Elevators', - email: 'support@agritech-elevators.fr', - phone: '+33 3 74 01 20 10', - }, - { - key: 'valmont', - name: 'Valmont Conveyors', - email: 'info@valmont-conveyors.com', - phone: '+33 3 80 45 77 20', - }, { key: 'buhler', - name: 'Bühler Sortex', - email: 'service@buhlergroup.com', + name: 'Bühler Grain Systems', + email: 'contact@buhlergroup.com', phone: '+41 71 955 11 11', }, + { + key: 'agritech', + name: 'Agritech Elevators', + email: 'info@agritech.fr', + phone: '+33 4 78 12 34 56', + }, + { + key: 'valmont', + name: 'Valmont Handling', + email: 'sales@valmont.fr', + phone: '+33 3 88 77 41 20', + }, { key: 'agridry', - name: 'AgriDry Solutions', - email: 'contact@agridry.eu', - phone: '+33 4 74 22 55 90', - }, - { - key: 'sew', - name: 'SEW-Eurodrive', - email: 'contact@sew-eurodrive.fr', - phone: '+33 3 88 73 67 00', - }, - { - key: 'skf', - name: 'SKF France', - email: 'support@skf.com', - phone: '+33 1 30 57 67 00', - }, - { - key: 'schneider', - name: 'Schneider Electric', - email: 'contact@se.com', - phone: '+33 1 47 29 70 00', - }, - { - key: 'manitou', - name: 'Manitou BF', - email: 'support@manitou-group.com', - phone: '+33 2 40 09 10 11', - }, - { - key: 'flender', - name: 'Flender GmbH', - email: 'service@flender.com', - phone: '+49 521 525 0', - }, - { - key: 'ifm', - name: 'ifm electronic', - email: 'info.fr@ifm.com', - phone: '+33 1 45 12 24 00', - }, - { - key: 'siemens', - name: 'Siemens Industry', - email: 'industry.fr@siemens.com', - phone: '+33 1 85 57 00 00', - }, - { - key: 'bonfiglioli', - name: 'Bonfiglioli Riduttori', - email: 'sales@bonfiglioli.com', - phone: '+39 051 647 3111', + name: 'Agridry Systems', + email: 'support@agridry.eu', + phone: '+33 2 41 52 78 00', }, { key: 'agrifan', @@ -1421,12 +1123,1904 @@ const constructeurDefinitions: ConstructeurDefinition[] = [ email: 'contact@agrifan.fr', phone: '+33 2 44 55 12 32', }, + { + key: 'manitou', + name: 'Manitou Group', + email: 'support@manitou-group.com', + phone: '+33 2 40 09 10 11', + }, + { + key: 'sew', + name: 'SEW-Eurodrive', + email: 'info@sew-eurodrive.fr', + phone: '+33 4 72 24 60 00', + }, + { + key: 'flender', + name: 'Flender GmbH', + email: 'contact@flender.com', + phone: '+49 203 998 0', + }, + { + key: 'bonfiglioli', + name: 'Bonfiglioli Riduttori', + email: 'sales@bonfiglioli.com', + phone: '+39 051 647 3111', + }, { key: 'poclain', name: 'Poclain Hydraulics', email: 'support@poclain-hydraulics.com', phone: '+33 3 44 31 74 00', }, + { + key: 'ifm', + name: 'IFM Electronic', + email: 'contact@ifm.com', + phone: '+33 1 69 11 37 00', + }, + { + key: 'skf', + name: 'SKF France', + email: 'support@skf.com', + phone: '+33 4 37 24 64 00', + }, +]; + +const typeMachineDefinitions: TypeMachineDefinition[] = [ + { + code: 'bucket-elevator', + name: 'Élévateur à godets industriel', + description: 'Machine de manutention verticale pour élévation de céréales.', + category: 'Triage & convoyage', + maintenanceFrequency: + "Inspection journalière des trappes, graissage hebdomadaire des paliers, contrôle courroie mensuel.", + specifications: { + zone: 'Réception', + instrumentation: ['Capteur vitesse', 'Capteur niveau'], + }, + customFields: [ + { name: 'Capacité nominale (t/h)', type: 'number', required: true }, + { name: 'Hauteur de levage (m)', type: 'number', required: true }, + { + name: 'Produit traité', + type: 'select', + options: ['Blé tendre', 'Orge brassicole', 'Maïs grain'], + defaultValue: 'Blé tendre', + required: true, + }, + { name: 'Date de mise en service', type: 'date', required: true }, + ], + componentRequirements: [ + { + label: "Tête d'élévateur", + typeCode: 'bucket-head-section', + minCount: 1, + maxCount: 1, + required: true, + }, + { + label: "Pied d'élévateur", + typeCode: 'bucket-boot-section', + minCount: 1, + maxCount: 1, + required: true, + }, + { + label: 'Tronçons de gaine', + typeCode: 'bucket-leg-section', + minCount: 2, + required: true, + }, + { + label: 'Motorisation principale', + typeCode: 'motor-drive', + minCount: 1, + required: true, + }, + { + label: 'Réducteur principal', + typeCode: 'gearbox-assembly', + minCount: 1, + required: true, + }, + { + label: 'Armoire locale', + typeCode: 'control-panel', + minCount: 1, + maxCount: 1, + required: false, + }, + ], + pieceRequirements: [ + { + label: 'Courroie élévatrice', + typeCode: 'drive-belt', + minCount: 1, + required: true, + }, + { + label: 'Capteur de vitesse', + typeCode: 'speed-sensor', + minCount: 1, + required: false, + }, + { + label: 'Kit visserie structure', + typeCode: 'hex-screw', + minCount: 1, + required: false, + }, + ], + }, + { + code: 'belt-conveyor', + name: 'Convoyeur à bande industriel', + description: 'Convoyeur horizontal ou incliné pour transfert de grains.', + category: 'Triage & convoyage', + maintenanceFrequency: 'Contrôle visuel quotidien, réglage de bande hebdomadaire, révision annuelle.', + specifications: { + zone: 'Transfert', + supports: ['Passerelle', 'Structure acier'], + }, + customFields: [ + { name: 'Débit (t/h)', type: 'number', required: true }, + { name: 'Longueur (m)', type: 'number', required: true }, + { + name: 'Localisation', + type: 'select', + options: ['Réception', 'Nettoyage', 'Expédition'], + defaultValue: 'Réception', + }, + ], + componentRequirements: [ + { + label: "Station d'entraînement", + typeCode: 'belt-drive-station', + minCount: 1, + maxCount: 1, + required: true, + }, + { + label: 'Station de retour', + typeCode: 'belt-tail-station', + minCount: 1, + maxCount: 1, + required: true, + }, + { + label: 'Ossature intermédiaire', + typeCode: 'belt-support-frame', + minCount: 1, + required: true, + }, + { + label: 'Motorisation convoyeur', + typeCode: 'motor-drive', + minCount: 1, + required: true, + }, + { + label: 'Réducteur convoyeur', + typeCode: 'gearbox-assembly', + minCount: 1, + required: true, + }, + { + label: 'Coffret de commande', + typeCode: 'control-panel', + minCount: 1, + required: false, + }, + ], + pieceRequirements: [ + { + label: 'Bande transporteuse', + typeCode: 'drive-belt', + minCount: 1, + required: true, + }, + { + label: 'Paliers supports', + typeCode: 'roller-bearing', + minCount: 2, + required: false, + }, + { + label: 'Visserie ossature', + typeCode: 'hex-screw', + minCount: 1, + required: false, + }, + ], + }, + { + code: 'gravity-separator', + name: 'Table densimétrique', + description: 'Table vibrante pour séparation par densité.', + category: 'Nettoyage', + maintenanceFrequency: 'Nettoyage tamis quotidien, contrôle vibrateurs hebdomadaire.', + specifications: { + zone: 'Nettoyage fin', + aspiration: true, + }, + customFields: [ + { name: 'Capacité de tri (t/h)', type: 'number', required: true }, + { + name: 'Produit traité', + type: 'select', + options: ['Blé', 'Orge', 'Tournesol'], + defaultValue: 'Blé', + }, + { name: 'Date de mise en service', type: 'date', required: true }, + ], + componentRequirements: [ + { + label: 'Plateau vibrant', + typeCode: 'gravity-vibration-deck', + minCount: 1, + required: true, + }, + { + label: 'Ventilateur aspiration', + typeCode: 'ventilation-fan', + minCount: 1, + required: true, + }, + { + label: 'Armoire de réglage', + typeCode: 'control-panel', + minCount: 1, + required: true, + }, + ], + pieceRequirements: [ + { + label: 'Capteur vibration', + typeCode: 'speed-sensor', + minCount: 1, + required: false, + }, + { + label: 'Kit visserie plateau', + typeCode: 'hex-screw', + minCount: 1, + required: false, + }, + { + label: 'Cartouche aspiration', + typeCode: 'filter-cartridge', + minCount: 1, + required: false, + }, + ], + }, + { + code: 'grain-dryer', + name: 'Séchoir à grains continu', + description: 'Système de séchage continu haute capacité.', + category: 'Séchage', + maintenanceFrequency: + 'Contrôle brûleur hebdomadaire, nettoyage filtre et vérification ventilateurs mensuels.', + specifications: { + bâtiment: 'Tour de séchage', + energie: ['Gaz naturel', 'Électricité'], + }, + customFields: [ + { name: 'Capacité sèche (t/h)', type: 'number', required: true }, + { + name: 'Mode d’alimentation', + type: 'select', + options: ['Élévateur principal', 'Vis de reprise'], + defaultValue: 'Élévateur principal', + }, + { name: 'Date de mise en service', type: 'date', required: true }, + ], + componentRequirements: [ + { + label: 'Module brûleur', + typeCode: 'burner-module', + minCount: 1, + required: true, + }, + { + label: 'Colonnes de séchage', + typeCode: 'dryer-column-segment', + minCount: 2, + required: true, + }, + { + label: 'Ventilation process', + typeCode: 'ventilation-fan', + minCount: 1, + required: true, + }, + { + label: 'Filtre poussières', + typeCode: 'dust-filter', + minCount: 1, + required: true, + }, + { + label: 'Armoire de pilotage', + typeCode: 'control-panel', + minCount: 1, + required: true, + }, + ], + pieceRequirements: [ + { + label: 'Sondes température', + typeCode: 'temperature-probe', + minCount: 2, + required: false, + }, + { + label: 'Joints haute température', + typeCode: 'flat-gasket', + minCount: 1, + required: false, + }, + { + label: 'Cartouches dépoussiéreur', + typeCode: 'filter-cartridge', + minCount: 2, + required: false, + }, + ], + }, + { + code: 'screw-conveyor', + name: 'Vis de reprise céréales', + description: 'Vis sans fin pour reprise et rechargement des silos.', + category: 'Convoyage', + maintenanceFrequency: 'Graissage paliers hebdomadaire, inspection trémie mensuelle.', + specifications: { + position: ['Sous cellules', 'Sortie séchoir'], + }, + customFields: [ + { name: 'Diamètre vis (mm)', type: 'number', required: true }, + { name: 'Inclinaison (°)', type: 'number' }, + { name: 'Vitesse (rpm)', type: 'number' }, + ], + componentRequirements: [ + { + label: 'Caisson principal', + typeCode: 'screw-trough-section', + minCount: 1, + required: true, + }, + { + label: "Trémie d'alimentation", + typeCode: 'screw-inlet-hopper', + minCount: 1, + required: true, + }, + { + label: 'Goulotte de sortie', + typeCode: 'screw-outlet-chute', + minCount: 1, + required: true, + }, + { + label: 'Motorisation vis', + typeCode: 'motor-drive', + minCount: 1, + required: true, + }, + { + label: 'Réducteur vis', + typeCode: 'gearbox-assembly', + minCount: 1, + required: true, + }, + ], + pieceRequirements: [ + { + label: 'Paliers de ligne', + typeCode: 'roller-bearing', + minCount: 2, + required: false, + }, + { + label: 'Kit visserie caisson', + typeCode: 'hex-screw', + minCount: 1, + required: false, + }, + { + label: 'Cartouches de graisse', + typeCode: 'lubrication-cartridge', + minCount: 1, + required: false, + }, + ], + }, + { + code: 'weigh-hopper', + name: 'Benne peseuse', + description: 'Benne peseuse pour chargement camions ou big-bags.', + category: 'Expédition', + maintenanceFrequency: 'Vérification capteurs hebdomadaire, recalibrage trimestriel.', + specifications: { + utilisation: ['Chargement camion', 'Conditionnement big-bag'], + }, + customFields: [ + { name: 'Capacité de pesée (kg)', type: 'number', required: true }, + { + name: 'Précision (%)', + type: 'number', + required: true, + }, + { + name: 'Mode de vidange', + type: 'select', + options: ['Trappe motorisée', 'Vis doseuse', 'Vanne guillotine'], + defaultValue: 'Trappe motorisée', + }, + ], + componentRequirements: [ + { + label: 'Cadre peseur', + typeCode: 'weigh-load-frame', + minCount: 1, + required: true, + }, + { + label: 'Vanne de vidange', + typeCode: 'weigh-discharge-gate', + minCount: 1, + required: true, + }, + { + label: 'Coffret de pesage', + typeCode: 'control-panel', + minCount: 1, + required: true, + }, + ], + pieceRequirements: [ + { + label: 'Capteurs de pesage', + typeCode: 'load-cell', + minCount: 2, + required: true, + }, + { + label: 'Fusibles de protection', + typeCode: 'fuse-cartridge', + minCount: 1, + required: false, + }, + { + label: 'Joint trappe', + typeCode: 'flat-gasket', + minCount: 1, + required: false, + }, + ], + }, + { + code: 'telehandler', + name: 'Chariot télescopique logistique', + description: 'Chariot télescopique dédié aux manutentions céréalières.', + category: 'Logistique', + maintenanceFrequency: 'Graissage hebdomadaire, contrôle hydraulique mensuel.', + specifications: { + yardArea: 'Cour logistique', + rotation: '3 équipes', + }, + customFields: [ + { + name: 'Usage principal', + type: 'select', + options: ['Chargement camions', 'Gestion big-bags', 'Maintenance silo'], + defaultValue: 'Chargement camions', + }, + { + name: 'Lieu de stationnement', + type: 'select', + options: ['Hangar nord', 'Cour extérieure', 'Atelier maintenance'], + defaultValue: 'Hangar nord', + }, + { name: "Année d'achat", type: 'number', required: true }, + ], + componentRequirements: [ + { + label: 'Flèche télescopique', + typeCode: 'telehandler-boom', + minCount: 1, + required: true, + }, + { + label: 'Groupe hydraulique', + typeCode: 'hydraulic-power-pack', + minCount: 1, + required: true, + }, + { + label: 'Groupe moteur', + typeCode: 'motor-drive', + minCount: 1, + required: true, + }, + { + label: 'Cabine opérateur', + typeCode: 'telehandler-cab-module', + minCount: 1, + required: true, + }, + { + label: 'Support d’outils', + typeCode: 'telehandler-attachment-carrier', + minCount: 1, + required: true, + }, + ], + pieceRequirements: [ + { + label: 'Flexibles hydrauliques', + typeCode: 'hydraulic-hose', + minCount: 2, + required: false, + }, + { + label: 'Fusibles cabine', + typeCode: 'fuse-cartridge', + minCount: 1, + required: false, + }, + { + label: 'Cartouches graissage', + typeCode: 'lubrication-cartridge', + minCount: 1, + required: false, + }, + ], + }, +]; + +const machineBuilds: MachineBuildSpec[] = [ + { + code: 'bucket-elevator-upstream', + typeMachineCode: 'bucket-elevator', + name: 'Élévateur amont Z400', + reference: 'BE-Z400-01', + prix: '58000', + constructeurKey: 'agritech', + customFieldValues: { + 'Capacité nominale (t/h)': 120, + 'Hauteur de levage (m)': 38, + 'Produit traité': 'Blé tendre', + 'Date de mise en service': new Date('2023-10-12'), + }, + components: [ + { + name: 'Tête haute Z400', + reference: 'BE-TETE-400', + prix: '18500', + typeCode: 'bucket-head-section', + requirementLabel: "Tête d'élévateur", + modelCode: 'bucket-head-120', + constructeur: 'agritech', + customValues: { + 'Largeur tambour (mm)': 820, + 'Type de revêtement': 'Caoutchouc rainuré', + 'Nombre de trappes': 3, + }, + pieces: [ + { + name: 'Kit visserie tête', + reference: 'KIT-TETE-01', + typeCode: 'hex-screw', + modelCode: 'screw-m12x80', + customValues: { + 'Diamètre (mm)': 12, + 'Longueur (mm)': 80, + 'Classe acier': '8.8', + }, + }, + { + name: 'Rondelles de sécurité Ø12', + reference: 'RDL-TETE-01', + typeCode: 'lock-washer', + modelCode: 'washer-grower-12', + customValues: { + 'Diamètre (mm)': 12, + Finition: 'Inox', + }, + }, + ], + children: [ + { + name: 'Motorisation 75 kW', + reference: 'MTR-75-EL1', + typeCode: 'motor-drive', + requirementLabel: 'Motorisation principale', + modelCode: 'motor-drive-75', + constructeur: 'sew', + customValues: { + 'Puissance nominale (kW)': 75, + 'Classe énergétique': 'IE3', + "Indice de protection": 'IP55', + }, + }, + { + name: 'Réducteur Flender 3200', + reference: 'GBX-FL-01', + typeCode: 'gearbox-assembly', + requirementLabel: 'Réducteur principal', + modelCode: 'gearbox-flender', + constructeur: 'flender', + customValues: { + 'Rapport de réduction': '1:28', + 'Couple nominal (Nm)': 3200, + 'Type de montage': 'À bride', + }, + }, + ], + }, + { + name: 'Pied élévateur renforcé', + reference: 'BE-PIED-400', + prix: '14600', + typeCode: 'bucket-boot-section', + requirementLabel: "Pied d'élévateur", + modelCode: 'bucket-boot-heavy', + constructeur: 'agritech', + customValues: { + 'Capacité trémie (L)': 480, + 'Mode de tension': 'Vis manuelle', + 'Système de nettoyage': 'Grattoirs', + }, + pieces: [ + { + name: 'Joint trappe inspection', + reference: 'JNT-PIED-01', + typeCode: 'flat-gasket', + modelCode: 'gasket-ht-200', + customValues: { + Matière: 'Fibre compressée', + 'Épaisseur (mm)': 3, + }, + }, + ], + }, + { + name: 'Gaine intermédiaire 3 m - A', + reference: 'BE-GAINE-1', + typeCode: 'bucket-leg-section', + requirementLabel: 'Tronçons de gaine', + modelCode: 'bucket-leg-3m', + constructeur: 'agritech', + customValues: { + 'Hauteur section (m)': 3, + 'Type de gaine': 'Boulonnée', + }, + }, + { + name: 'Gaine intermédiaire 3 m - B', + reference: 'BE-GAINE-2', + typeCode: 'bucket-leg-section', + requirementLabel: 'Tronçons de gaine', + modelCode: 'bucket-leg-3m', + constructeur: 'agritech', + customValues: { + 'Hauteur section (m)': 3, + 'Type de gaine': 'Renforcée', + }, + }, + { + name: 'Armoire locale tête élévateur', + reference: 'ARM-EL-01', + prix: '7800', + typeCode: 'control-panel', + requirementLabel: 'Armoire locale', + modelCode: 'control-panel-m340', + constructeur: 'buhler', + customValues: { + 'Automate principal': 'Schneider Modicon M340', + 'Année de mise à jour': 2023, + "Indice de protection": 'IP55', + }, + pieces: [ + { + name: 'Fusible alimentation 25A', + reference: 'FS-25A-EL', + typeCode: 'fuse-cartridge', + modelCode: 'fuse-gg-25a', + customValues: { + 'Calibre (A)': 25, + Type: 'gG', + }, + }, + ], + }, + ], + sparePieces: [ + { + name: 'Courroie de rechange 800 mm', + reference: 'SP-BELT-800', + prix: '2200', + typeCode: 'drive-belt', + modelCode: 'belt-hd-800', + constructeur: 'agritech', + requirementLabel: 'Courroie élévatrice', + customValues: { + 'Largeur (mm)': 800, + Matériau: 'Caoutchouc nitrile', + }, + }, + { + name: 'Capteur vitesse secours', + reference: 'SP-SPEED-01', + typeCode: 'speed-sensor', + modelCode: 'sensor-speed-m12', + constructeur: 'ifm', + requirementLabel: 'Capteur de vitesse', + customValues: { + 'Type de sortie': 'PNP 4-20 mA', + 'Plage de mesure (rpm)': 1200, + }, + }, + { + name: 'Jeu visserie structure', + reference: 'SP-VISS-EL', + typeCode: 'hex-screw', + modelCode: 'screw-m12x80', + requirementLabel: 'Kit visserie structure', + customValues: { + 'Diamètre (mm)': 12, + 'Longueur (mm)': 80, + 'Classe acier': '8.8', + }, + }, + ], + }, + { + code: 'bucket-elevator-downstream', + typeMachineCode: 'bucket-elevator', + name: 'Élévateur aval Z320', + reference: 'BE-Z320-02', + prix: '49700', + constructeurKey: 'agritech', + customFieldValues: { + 'Capacité nominale (t/h)': 95, + 'Hauteur de levage (m)': 32, + 'Produit traité': 'Orge brassicole', + 'Date de mise en service': new Date('2022-09-05'), + }, + components: [ + { + name: 'Tête compact Z320', + reference: 'BE-TETE-320', + typeCode: 'bucket-head-section', + requirementLabel: "Tête d'élévateur", + modelCode: 'bucket-head-95', + constructeur: 'agritech', + customValues: { + 'Largeur tambour (mm)': 680, + 'Type de revêtement': 'Céramique', + 'Nombre de trappes': 2, + }, + children: [ + { + name: 'Motorisation 55 kW', + reference: 'MTR-55-EL2', + typeCode: 'motor-drive', + requirementLabel: 'Motorisation principale', + modelCode: 'motor-drive-55', + constructeur: 'sew', + customValues: { + 'Puissance nominale (kW)': 55, + 'Classe énergétique': 'IE3', + "Indice de protection": 'IP55', + }, + }, + { + name: 'Réducteur Bonfiglioli', + reference: 'GBX-BF-02', + typeCode: 'gearbox-assembly', + requirementLabel: 'Réducteur principal', + modelCode: 'gearbox-bonfiglioli', + constructeur: 'bonfiglioli', + customValues: { + 'Rapport de réduction': '1:24', + 'Couple nominal (Nm)': 2100, + 'Type de montage': 'Sur arbre', + }, + }, + ], + }, + { + name: 'Pied élévateur compact', + reference: 'BE-PIED-320', + typeCode: 'bucket-boot-section', + requirementLabel: "Pied d'élévateur", + modelCode: 'bucket-boot-compact', + constructeur: 'agritech', + customValues: { + 'Capacité trémie (L)': 360, + 'Mode de tension': 'Hydraulique', + 'Système de nettoyage': 'Vide-pied', + }, + }, + { + name: 'Gaine intermédiaire 2,5 m', + reference: 'BE-GAINE-3', + typeCode: 'bucket-leg-section', + requirementLabel: 'Tronçons de gaine', + modelCode: 'bucket-leg-2-5m', + constructeur: 'agritech', + customValues: { + 'Hauteur section (m)': 2.5, + 'Type de gaine': 'Boulonnée', + }, + }, + { + name: 'Gaine renfort 3 m', + reference: 'BE-GAINE-4', + typeCode: 'bucket-leg-section', + requirementLabel: 'Tronçons de gaine', + modelCode: 'bucket-leg-3m', + constructeur: 'agritech', + customValues: { + 'Hauteur section (m)': 3, + 'Type de gaine': 'Renforcée', + }, + }, + { + name: 'Coffret local aval', + reference: 'ARM-EL-02', + typeCode: 'control-panel', + requirementLabel: 'Armoire locale', + modelCode: 'control-panel-s7', + constructeur: 'buhler', + customValues: { + 'Automate principal': 'Siemens S7-1500', + 'Année de mise à jour': 2022, + "Indice de protection": 'IP65', + }, + }, + ], + sparePieces: [ + { + name: 'Courroie de secours 650 mm', + reference: 'SP-BELT-650', + typeCode: 'drive-belt', + modelCode: 'belt-hd-650', + requirementLabel: 'Courroie élévatrice', + customValues: { + 'Largeur (mm)': 650, + Matériau: 'Polyuréthane', + }, + }, + { + name: 'Capteur vitesse compact', + reference: 'SP-SPEED-02', + typeCode: 'speed-sensor', + modelCode: 'sensor-speed-m18', + constructeur: 'ifm', + requirementLabel: 'Capteur de vitesse', + customValues: { + 'Type de sortie': 'PNP Tout ou rien', + 'Plage de mesure (rpm)': 900, + }, + }, + { + name: 'Kit visserie élévateur aval', + reference: 'SP-VISS-EL2', + typeCode: 'hex-screw', + modelCode: 'screw-m10x60', + requirementLabel: 'Kit visserie structure', + customValues: { + 'Diamètre (mm)': 10, + 'Longueur (mm)': 60, + 'Classe acier': '10.9', + }, + }, + ], + }, + { + code: 'belt-conveyor-feed', + typeMachineCode: 'belt-conveyor', + name: "Convoyeur alimentation 18 m", + reference: 'CV-ALIM-18', + prix: '32600', + constructeurKey: 'valmont', + customFieldValues: { + 'Débit (t/h)': 110, + 'Longueur (m)': 18, + Localisation: 'Réception', + }, + components: [ + { + name: "Station d'entraînement 800", + reference: 'CV-DRIVE-18', + typeCode: 'belt-drive-station', + requirementLabel: "Station d'entraînement", + modelCode: 'belt-drive-800', + constructeur: 'valmont', + customValues: { + 'Type de tambour': 'Caoutchouc rainuré', + 'Système de tension': 'Hydraulique', + }, + children: [ + { + name: 'Moteur 45 kW', + reference: 'MTR-45-CV1', + typeCode: 'motor-drive', + requirementLabel: 'Motorisation convoyeur', + modelCode: 'motor-drive-45', + constructeur: 'sew', + customValues: { + 'Puissance nominale (kW)': 45, + 'Classe énergétique': 'IE3', + "Indice de protection": 'IP55', + }, + }, + { + name: 'Réducteur Bonfiglioli TA', + reference: 'GBX-TA-CV1', + typeCode: 'gearbox-assembly', + requirementLabel: 'Réducteur convoyeur', + modelCode: 'gearbox-bonfiglioli', + constructeur: 'bonfiglioli', + customValues: { + 'Rapport de réduction': '1:24', + 'Couple nominal (Nm)': 2100, + 'Type de montage': 'Sur arbre', + }, + }, + ], + }, + { + name: 'Station de retour 800', + reference: 'CV-TAIL-18', + typeCode: 'belt-tail-station', + requirementLabel: 'Station de retour', + modelCode: 'belt-tail-800', + constructeur: 'valmont', + customValues: { + 'Nettoyeur principal': 'Racleur PU', + 'Diamètre tambour (mm)': 420, + }, + pieces: [ + { + name: 'Grattoir principal PU', + reference: 'GRAT-800-01', + typeCode: 'flat-gasket', + modelCode: 'gasket-ht-200', + customValues: { + Matière: 'NBR', + 'Épaisseur (mm)': 5, + }, + }, + ], + }, + { + name: 'Ossature 18 m', + reference: 'CV-FRAME-18', + typeCode: 'belt-support-frame', + requirementLabel: 'Ossature intermédiaire', + modelCode: 'belt-frame-18m', + constructeur: 'valmont', + customValues: { + 'Longueur (m)': 18, + 'Nombre de rouleaux': 36, + 'Type de châssis': 'Treillis', + }, + pieces: [ + { + name: 'Roulement UCP210', + reference: 'BRG-UCP210-02', + typeCode: 'roller-bearing', + modelCode: 'bearing-ucp210', + constructeur: 'skf', + customValues: { + Série: 'UCP', + "Type d'étanchéité": '2RS', + }, + }, + ], + }, + { + name: 'Coffret convoyeur réception', + reference: 'ARM-CV-01', + typeCode: 'control-panel', + requirementLabel: 'Coffret de commande', + modelCode: 'control-panel-m340', + constructeur: 'buhler', + customValues: { + 'Automate principal': 'Schneider Modicon M340', + "Indice de protection": 'IP55', + }, + }, + ], + sparePieces: [ + { + name: 'Bande transporteuse 800 mm', + reference: 'SP-BAND-800', + typeCode: 'drive-belt', + modelCode: 'belt-hd-800', + requirementLabel: 'Bande transporteuse', + customValues: { + 'Largeur (mm)': 800, + Matériau: 'Caoutchouc nitrile', + }, + }, + { + name: 'Kit palier de rechange', + reference: 'SP-BRG-800', + typeCode: 'roller-bearing', + modelCode: 'bearing-ucp210', + requirementLabel: 'Paliers supports', + constructeur: 'skf', + customValues: { + Série: 'UCP', + "Type d'étanchéité": '2RS', + }, + }, + { + name: 'Visserie ossature', + reference: 'SP-VISS-CV1', + typeCode: 'hex-screw', + modelCode: 'screw-m10x60', + requirementLabel: 'Visserie ossature', + customValues: { + 'Diamètre (mm)': 10, + 'Longueur (mm)': 60, + 'Classe acier': '10.9', + }, + }, + ], + }, + { + code: 'belt-conveyor-expedition', + typeMachineCode: 'belt-conveyor', + name: 'Convoyeur expédition 25 m', + reference: 'CV-EXP-25', + prix: '35400', + constructeurKey: 'valmont', + customFieldValues: { + 'Débit (t/h)': 90, + 'Longueur (m)': 25, + Localisation: 'Expédition', + }, + components: [ + { + name: 'Station tête 650', + reference: 'CV-DRIVE-25', + typeCode: 'belt-drive-station', + requirementLabel: "Station d'entraînement", + modelCode: 'belt-drive-650', + constructeur: 'valmont', + customValues: { + 'Type de tambour': 'Céramique', + 'Système de tension': 'Vis manuelle', + }, + children: [ + { + name: 'Moteur 37 kW', + reference: 'MTR-37-CV2', + typeCode: 'motor-drive', + requirementLabel: 'Motorisation convoyeur', + modelCode: 'motor-drive-37', + constructeur: 'sew', + customValues: { + 'Puissance nominale (kW)': 37, + 'Classe énergétique': 'IE3', + "Indice de protection": 'IP55', + }, + }, + { + name: 'Réducteur SEW K', + reference: 'GBX-SEW-CV2', + typeCode: 'gearbox-assembly', + requirementLabel: 'Réducteur convoyeur', + modelCode: 'gearbox-sew', + constructeur: 'sew', + customValues: { + 'Rapport de réduction': '1:18', + 'Couple nominal (Nm)': 1800, + 'Type de montage': 'À pattes', + }, + }, + ], + }, + { + name: 'Station retour 650', + reference: 'CV-TAIL-25', + typeCode: 'belt-tail-station', + requirementLabel: 'Station de retour', + modelCode: 'belt-tail-650', + constructeur: 'valmont', + customValues: { + 'Nettoyeur principal': 'Brosse acier', + 'Diamètre tambour (mm)': 360, + }, + }, + { + name: 'Ossature 25 m', + reference: 'CV-FRAME-25', + typeCode: 'belt-support-frame', + requirementLabel: 'Ossature intermédiaire', + modelCode: 'belt-frame-25m', + constructeur: 'valmont', + customValues: { + 'Longueur (m)': 25, + 'Nombre de rouleaux': 48, + 'Type de châssis': 'Portique', + }, + }, + { + name: 'Coffret expédition', + reference: 'ARM-CV-02', + typeCode: 'control-panel', + requirementLabel: 'Coffret de commande', + modelCode: 'control-panel-s7', + constructeur: 'buhler', + customValues: { + 'Automate principal': 'Siemens S7-1500', + 'Année de mise à jour': 2021, + "Indice de protection": 'IP65', + }, + }, + ], + sparePieces: [ + { + name: 'Bande transporteuse 650 mm', + reference: 'SP-BAND-650', + typeCode: 'drive-belt', + modelCode: 'belt-hd-650', + requirementLabel: 'Bande transporteuse', + customValues: { + 'Largeur (mm)': 650, + Matériau: 'Polyuréthane', + }, + }, + { + name: 'Palier UCFL207', + reference: 'SP-BRG-UCFL', + typeCode: 'roller-bearing', + modelCode: 'bearing-ucfl207', + requirementLabel: 'Paliers supports', + constructeur: 'skf', + customValues: { + Série: 'UCFL', + "Type d'étanchéité": 'ZZ', + }, + }, + { + name: 'Visserie tendeurs', + reference: 'SP-VISS-CV2', + typeCode: 'hex-screw', + modelCode: 'screw-m8x30', + requirementLabel: 'Visserie ossature', + customValues: { + 'Diamètre (mm)': 8, + 'Longueur (mm)': 30, + 'Classe acier': '8.8', + }, + }, + ], + }, + { + code: 'gravity-table-main', + typeMachineCode: 'gravity-separator', + name: 'Table densimétrique TQX', + reference: 'TBL-TQX-01', + prix: '68500', + constructeurKey: 'buhler', + customFieldValues: { + 'Capacité de tri (t/h)': 120, + 'Produit traité': 'Blé', + 'Date de mise en service': new Date('2021-03-22'), + }, + components: [ + { + name: 'Plateau TQX-120', + reference: 'TBL-PLT-01', + typeCode: 'gravity-vibration-deck', + requirementLabel: 'Plateau vibrant', + modelCode: 'gravity-deck-120', + constructeur: 'buhler', + customValues: { + 'Type de plateau': 'Acier perforé', + 'Fréquence de vibration (Hz)': 45, + 'Inclinaison plateau (°)': 5, + }, + children: [ + { + name: 'Moteur vibrateur 18,5 kW', + reference: 'MTR-18-VIB', + typeCode: 'motor-drive', + modelCode: 'motor-drive-18', + constructeur: 'sew', + customValues: { + 'Puissance nominale (kW)': 18.5, + 'Classe énergétique': 'IE3', + "Indice de protection": 'IP55', + }, + }, + ], + }, + { + name: 'Ventilateur aspiration 45 kW', + reference: 'VENT-45-01', + typeCode: 'ventilation-fan', + requirementLabel: 'Ventilateur aspiration', + modelCode: 'fan-process-45', + constructeur: 'agrifan', + customValues: { + 'Débit (m³/h)': 45000, + 'Type de roue': 'Centrifuge', + 'Vitesse nominale (rpm)': 1450, + }, + }, + { + name: 'Armoire réglage table', + reference: 'ARM-TBL-01', + typeCode: 'control-panel', + requirementLabel: 'Armoire de réglage', + modelCode: 'control-panel-m340', + constructeur: 'buhler', + customValues: { + 'Automate principal': 'Schneider Modicon M340', + 'Année de mise à jour': 2023, + "Indice de protection": 'IP55', + }, + }, + ], + sparePieces: [ + { + name: 'Capteur vibration M12', + reference: 'SP-SNS-VIB', + typeCode: 'speed-sensor', + modelCode: 'sensor-speed-m12', + requirementLabel: 'Capteur vibration', + customValues: { + 'Type de sortie': 'PNP 4-20 mA', + 'Plage de mesure (rpm)': 1500, + }, + }, + { + name: 'Kit visserie plateau', + reference: 'SP-VISS-TBL', + typeCode: 'hex-screw', + modelCode: 'screw-m8x30', + requirementLabel: 'Kit visserie plateau', + customValues: { + 'Diamètre (mm)': 8, + 'Longueur (mm)': 30, + 'Classe acier': '8.8', + }, + }, + { + name: 'Cartouche aspiration 610', + reference: 'SP-FILT-610', + typeCode: 'filter-cartridge', + modelCode: 'filter-dust-610', + requirementLabel: 'Cartouche aspiration', + customValues: { + 'Longueur (mm)': 610, + 'Média filtrant': 'Polyester', + }, + }, + ], + }, + { + code: 'grain-dryer-main', + typeMachineCode: 'grain-dryer', + name: 'Séchoir continu SC-60', + reference: 'DRY-SC60', + prix: '212000', + constructeurKey: 'agridry', + customFieldValues: { + 'Capacité sèche (t/h)': 60, + 'Mode d’alimentation': 'Élévateur principal', + 'Date de mise en service': new Date('2020-07-15'), + }, + components: [ + { + name: 'Brûleur gaz 3 MW', + reference: 'BRN-3MW-01', + typeCode: 'burner-module', + requirementLabel: 'Module brûleur', + modelCode: 'burner-module-3mw', + constructeur: 'agridry', + customValues: { + 'Puissance thermique (kW)': 3000, + 'Type de carburant': 'Gaz naturel', + "Système d'allumage": 'Double électrode', + }, + }, + { + name: 'Colonne zone chaude', + reference: 'COL-CHAUD-01', + typeCode: 'dryer-column-segment', + requirementLabel: 'Colonnes de séchage', + modelCode: 'dryer-column-2m', + constructeur: 'agridry', + customValues: { + 'Hauteur segment (m)': 2, + 'Zone de séchage': 'Échauffage', + 'Capteurs intégrés': true, + }, + }, + { + name: 'Colonne zone tempérée', + reference: 'COL-TEMP-01', + typeCode: 'dryer-column-segment', + requirementLabel: 'Colonnes de séchage', + modelCode: 'dryer-column-1-5m', + constructeur: 'agridry', + customValues: { + 'Hauteur segment (m)': 1.5, + 'Zone de séchage': 'Tempe', + 'Capteurs intégrés': true, + }, + }, + { + name: 'Ventilateur process principal', + reference: 'VENT-45-DRY', + typeCode: 'ventilation-fan', + requirementLabel: 'Ventilation process', + modelCode: 'fan-process-45', + constructeur: 'agrifan', + customValues: { + 'Débit (m³/h)': 52000, + 'Type de roue': 'Centrifuge', + 'Vitesse nominale (rpm)': 1480, + }, + children: [ + { + name: 'Motorisation ventilateur 110 kW', + reference: 'MTR-110-VENT', + typeCode: 'motor-drive', + modelCode: 'motor-drive-110', + constructeur: 'sew', + customValues: { + 'Puissance nominale (kW)': 110, + 'Classe énergétique': 'IE3', + "Indice de protection": 'IP55', + }, + }, + ], + }, + { + name: 'Filtre cyclone 610', + reference: 'FIL-CYCL-01', + typeCode: 'dust-filter', + requirementLabel: 'Filtre poussières', + modelCode: 'dust-filter-cyclone', + constructeur: 'agrifan', + customValues: { + 'Efficacité de filtration (%)': 98, + 'Type de média filtrant': 'Polyester', + 'Nombre de cartouches': 6, + }, + pieces: [ + { + name: 'Cartouche polyester 610', + reference: 'FILT-610-01', + typeCode: 'filter-cartridge', + modelCode: 'filter-dust-610', + customValues: { + 'Longueur (mm)': 610, + 'Média filtrant': 'Polyester', + }, + }, + ], + }, + { + name: 'Armoire pilotage séchoir', + reference: 'ARM-DRY-01', + typeCode: 'control-panel', + requirementLabel: 'Armoire de pilotage', + modelCode: 'control-panel-m340', + constructeur: 'buhler', + customValues: { + 'Automate principal': 'Schneider Modicon M340', + 'Année de mise à jour': 2024, + "Indice de protection": 'IP55', + }, + }, + ], + sparePieces: [ + { + name: 'Sonde PT100 longue', + reference: 'SP-PT100-01', + typeCode: 'temperature-probe', + modelCode: 'temp-probe-pt100', + requirementLabel: 'Sondes température', + customValues: { + Type: 'PT100 classe A', + 'Longueur tige (mm)': 300, + }, + }, + { + name: 'Sonde PT100 courte', + reference: 'SP-PT100-02', + typeCode: 'temperature-probe', + modelCode: 'temp-probe-pt100-short', + requirementLabel: 'Sondes température', + customValues: { + Type: 'PT100 classe B', + 'Longueur tige (mm)': 200, + }, + }, + { + name: 'Joint trappe brûleur', + reference: 'SP-JOINT-DRY', + typeCode: 'flat-gasket', + modelCode: 'gasket-ht-200', + requirementLabel: 'Joints haute température', + customValues: { + Matière: 'Fibre compressée', + 'Épaisseur (mm)': 4, + }, + }, + { + name: 'Cartouche rechange 480', + reference: 'SP-FILT-480', + typeCode: 'filter-cartridge', + modelCode: 'filter-dust-480', + requirementLabel: 'Cartouches dépoussiéreur', + customValues: { + 'Longueur (mm)': 480, + 'Média filtrant': 'Polyester', + }, + }, + ], + }, + { + code: 'screw-conveyor-north', + typeMachineCode: 'screw-conveyor', + name: 'Vis de reprise nord V200', + reference: 'SC-V200-N', + prix: '27400', + constructeurKey: 'valmont', + customFieldValues: { + 'Diamètre vis (mm)': 200, + 'Inclinaison (°)': 12, + 'Vitesse (rpm)': 140, + }, + components: [ + { + name: 'Caisson principal 200', + reference: 'SC-CAISSON-200', + typeCode: 'screw-trough-section', + requirementLabel: 'Caisson principal', + modelCode: 'screw-trough-200', + constructeur: 'valmont', + customValues: { + 'Longueur (m)': 9, + 'Diamètre vis (mm)': 200, + Matériau: 'Acier peint', + }, + }, + { + name: "Trémie d'alimentation 200", + reference: 'SC-TREMIE-200', + typeCode: 'screw-inlet-hopper', + requirementLabel: "Trémie d'alimentation", + modelCode: 'screw-inlet-200', + constructeur: 'valmont', + customValues: { + 'Capacité (L)': 220, + 'Type de grille': 'Grille anti-gravats', + }, + }, + { + name: 'Goulotte sortie vanne', + reference: 'SC-GOUL-200', + typeCode: 'screw-outlet-chute', + requirementLabel: 'Goulotte de sortie', + modelCode: 'screw-outlet-vanne', + constructeur: 'valmont', + customValues: { + 'Type de vanne': 'Guillotine', + "Orientation (°)": 45, + }, + }, + { + name: 'Moteur vis 18.5 kW', + reference: 'MTR-18-SC1', + typeCode: 'motor-drive', + requirementLabel: 'Motorisation vis', + modelCode: 'motor-drive-18', + constructeur: 'sew', + customValues: { + 'Puissance nominale (kW)': 18.5, + 'Classe énergétique': 'IE3', + "Indice de protection": 'IP55', + }, + }, + { + name: 'Réducteur SEW K', + reference: 'GBX-SEW-SC1', + typeCode: 'gearbox-assembly', + requirementLabel: 'Réducteur vis', + modelCode: 'gearbox-sew', + constructeur: 'sew', + customValues: { + 'Rapport de réduction': '1:32', + 'Couple nominal (Nm)': 1800, + 'Type de montage': 'À pattes', + }, + }, + ], + sparePieces: [ + { + name: 'Palier UCP210', + reference: 'SP-PALIER-200', + typeCode: 'roller-bearing', + modelCode: 'bearing-ucp210', + requirementLabel: 'Paliers de ligne', + constructeur: 'skf', + customValues: { + Série: 'UCP', + "Type d'étanchéité": '2RS', + }, + }, + { + name: 'Kit visserie caisson', + reference: 'SP-VISS-SC1', + typeCode: 'hex-screw', + modelCode: 'screw-m12x80', + requirementLabel: 'Kit visserie caisson', + customValues: { + 'Diamètre (mm)': 12, + 'Longueur (mm)': 80, + 'Classe acier': '8.8', + }, + }, + { + name: 'Cartouche graisse 400g', + reference: 'SP-GRAISSE-01', + typeCode: 'lubrication-cartridge', + modelCode: 'grease-cartridge-400', + requirementLabel: 'Cartouches de graisse', + customValues: { + 'Volume (cm³)': 400, + 'Grade de graisse': 'NLGI 2', + }, + }, + ], + }, + { + code: 'screw-conveyor-south', + typeMachineCode: 'screw-conveyor', + name: 'Vis de reprise sud V160', + reference: 'SC-V160-S', + prix: '23600', + constructeurKey: 'valmont', + customFieldValues: { + 'Diamètre vis (mm)': 160, + 'Inclinaison (°)': 8, + 'Vitesse (rpm)': 110, + }, + components: [ + { + name: 'Caisson principal 160', + reference: 'SC-CAISSON-160', + typeCode: 'screw-trough-section', + requirementLabel: 'Caisson principal', + modelCode: 'screw-trough-160', + constructeur: 'valmont', + customValues: { + 'Longueur (m)': 7, + 'Diamètre vis (mm)': 160, + Matériau: 'Galvanisé', + }, + }, + { + name: "Trémie d'alimentation 160", + reference: 'SC-TREMIE-160', + typeCode: 'screw-inlet-hopper', + requirementLabel: "Trémie d'alimentation", + modelCode: 'screw-inlet-160', + constructeur: 'valmont', + customValues: { + 'Capacité (L)': 160, + 'Type de grille': 'Grille magnétique', + }, + }, + { + name: 'Goulotte clapet', + reference: 'SC-GOUL-160', + typeCode: 'screw-outlet-chute', + requirementLabel: 'Goulotte de sortie', + modelCode: 'screw-outlet-flap', + constructeur: 'valmont', + customValues: { + 'Type de vanne': 'By-pass', + "Orientation (°)": 60, + }, + }, + { + name: 'Moteur vis 15 kW', + reference: 'MTR-15-SC2', + typeCode: 'motor-drive', + requirementLabel: 'Motorisation vis', + modelCode: 'motor-drive-15', + constructeur: 'sew', + customValues: { + 'Puissance nominale (kW)': 15, + 'Classe énergétique': 'IE3', + "Indice de protection": 'IP55', + }, + }, + { + name: 'Réducteur Bonfiglioli', + reference: 'GBX-BF-SC2', + typeCode: 'gearbox-assembly', + requirementLabel: 'Réducteur vis', + modelCode: 'gearbox-bonfiglioli', + constructeur: 'bonfiglioli', + customValues: { + 'Rapport de réduction': '1:28', + 'Couple nominal (Nm)': 1600, + 'Type de montage': 'Sur arbre', + }, + }, + ], + sparePieces: [ + { + name: 'Palier UCFL207', + reference: 'SP-PALIER-160', + typeCode: 'roller-bearing', + modelCode: 'bearing-ucfl207', + requirementLabel: 'Paliers de ligne', + constructeur: 'skf', + customValues: { + Série: 'UCFL', + "Type d'étanchéité": 'ZZ', + }, + }, + { + name: 'Kit visserie vis 160', + reference: 'SP-VISS-SC2', + typeCode: 'hex-screw', + modelCode: 'screw-m10x60', + requirementLabel: 'Kit visserie caisson', + customValues: { + 'Diamètre (mm)': 10, + 'Longueur (mm)': 60, + 'Classe acier': '10.9', + }, + }, + { + name: 'Cartouche graisse 400g', + reference: 'SP-GRAISSE-02', + typeCode: 'lubrication-cartridge', + modelCode: 'grease-cartridge-400', + requirementLabel: 'Cartouches de graisse', + customValues: { + 'Volume (cm³)': 400, + 'Grade de graisse': 'NLGI 2', + }, + }, + ], + }, + { + code: 'weigh-hopper-truck', + typeMachineCode: 'weigh-hopper', + name: 'Benne peseuse camion 5T', + reference: 'BP-5000-01', + prix: '39200', + constructeurKey: 'buhler', + customFieldValues: { + 'Capacité de pesée (kg)': 5000, + 'Précision (%)': 0.5, + 'Mode de vidange': 'Trappe motorisée', + }, + components: [ + { + name: 'Cadre peseur 5T', + reference: 'BP-CADRE-01', + typeCode: 'weigh-load-frame', + requirementLabel: 'Cadre peseur', + modelCode: 'weigh-frame-5t', + constructeur: 'buhler', + customValues: { + 'Capacité nominale (kg)': 5000, + 'Nombre de capteurs': 4, + 'Protection IP': 'IP65', + }, + }, + { + name: 'Vanne hydraulique rapide', + reference: 'BP-VANNE-01', + typeCode: 'weigh-discharge-gate', + requirementLabel: 'Vanne de vidange', + modelCode: 'weigh-gate-hydraulic', + constructeur: 'poclain', + customValues: { + "Type d'actionneur": 'Hydraulique', + "Temps d'ouverture (s)": 4, + }, + }, + { + name: 'Coffret pesage camion', + reference: 'ARM-BP-01', + typeCode: 'control-panel', + requirementLabel: 'Coffret de pesage', + modelCode: 'control-panel-m340', + constructeur: 'buhler', + customValues: { + 'Automate principal': 'Schneider Modicon M340', + 'Année de mise à jour': 2023, + "Indice de protection": 'IP55', + }, + }, + ], + sparePieces: [ + { + name: 'Capteur pesage 5T', + reference: 'SP-LC-5T-01', + typeCode: 'load-cell', + modelCode: 'load-cell-5t', + requirementLabel: 'Capteurs de pesage', + constructeur: 'ifm', + customValues: { + 'Capacité (kg)': 5000, + 'Type de connexion': 'Câble 6 fils', + }, + }, + { + name: 'Capteur pesage secours', + reference: 'SP-LC-5T-02', + typeCode: 'load-cell', + modelCode: 'load-cell-5t', + requirementLabel: 'Capteurs de pesage', + constructeur: 'ifm', + customValues: { + 'Capacité (kg)': 5000, + 'Type de connexion': 'Câble 6 fils', + }, + }, + { + name: 'Fusibles 40A coffret', + reference: 'SP-FS-40A-01', + typeCode: 'fuse-cartridge', + modelCode: 'fuse-gg-40a', + requirementLabel: 'Fusibles de protection', + customValues: { + 'Calibre (A)': 40, + Type: 'gG', + }, + }, + { + name: 'Joint trappe benne', + reference: 'SP-JNT-BP', + typeCode: 'flat-gasket', + modelCode: 'gasket-ht-200', + requirementLabel: 'Joint trappe', + customValues: { + Matière: 'NBR', + 'Épaisseur (mm)': 5, + }, + }, + ], + }, + { + code: 'telehandler-mlt841', + typeMachineCode: 'telehandler', + name: 'Manitou MLT 841 Logistique', + reference: 'MLT-841-01', + prix: '87500', + constructeurKey: 'manitou', + customFieldValues: { + 'Usage principal': 'Chargement camions', + 'Lieu de stationnement': 'Hangar nord', + "Année d'achat": 2021, + }, + components: [ + { + name: 'Flèche télescopique 8 m', + reference: 'MLT-BOOM-01', + typeCode: 'telehandler-boom', + requirementLabel: 'Flèche télescopique', + modelCode: 'tele-boom-8m', + constructeur: 'manitou', + customValues: { + 'Hauteur max (m)': 8, + 'Sections télescopiques': 4, + 'Type de guidage': 'Galets', + }, + }, + { + name: 'Groupe hydraulique 140 l/min', + reference: 'MLT-HYDRO-01', + typeCode: 'hydraulic-power-pack', + requirementLabel: 'Groupe hydraulique', + modelCode: 'hydraulic-pack-tele', + constructeur: 'poclain', + customValues: { + 'Débit nominal (l/min)': 140, + 'Pression max (bar)': 280, + 'Type de pompe': 'Piston axial', + }, + }, + { + name: 'Groupe moteur 110 kW', + reference: 'MLT-MOTEUR-01', + typeCode: 'motor-drive', + requirementLabel: 'Groupe moteur', + modelCode: 'motor-drive-110', + constructeur: 'sew', + customValues: { + 'Puissance nominale (kW)': 110, + 'Classe énergétique': 'IE3', + "Indice de protection": 'IP55', + }, + }, + { + name: 'Cabine premium climatisée', + reference: 'MLT-CAB-01', + typeCode: 'telehandler-cab-module', + requirementLabel: 'Cabine opérateur', + modelCode: 'tele-cab-premium', + constructeur: 'manitou', + customValues: { + 'Type de cabine': 'Premium climatisée', + Climatisation: true, + 'Nombre de caméras': 2, + }, + }, + { + name: 'Support attache rapide', + reference: 'MLT-ATTACHE-01', + typeCode: 'telehandler-attachment-carrier', + requirementLabel: 'Support d’outils', + modelCode: 'tele-carrier-quick', + constructeur: 'manitou', + customValues: { + "Type d'attache": 'Attache Manitou', + 'Capacité nominale (t)': 4.1, + }, + }, + ], + sparePieces: [ + { + name: 'Flexible hydraulique 2 tresses', + reference: 'SP-HOSE-01', + typeCode: 'hydraulic-hose', + modelCode: 'hydraulic-hose-2w', + requirementLabel: 'Flexibles hydrauliques', + constructeur: 'poclain', + customValues: { + 'Pression max (bar)': 420, + 'Type de renfort': '2 tresses acier', + 'Longueur (mm)': 1800, + }, + }, + { + name: 'Fusibles cabine 40A', + reference: 'SP-FS-CAB', + typeCode: 'fuse-cartridge', + modelCode: 'fuse-gg-40a', + requirementLabel: 'Fusibles cabine', + customValues: { + 'Calibre (A)': 40, + Type: 'gG', + }, + }, + { + name: 'Cartouche graisse MLT', + reference: 'SP-GRAISSE-MLT', + typeCode: 'lubrication-cartridge', + modelCode: 'grease-cartridge-400', + requirementLabel: 'Cartouches graissage', + customValues: { + 'Volume (cm³)': 400, + 'Grade de graisse': 'NLGI 2', + }, + }, + ], + }, ]; async function clearDatabaseExceptSitesAndProfiles() { @@ -1546,7 +3140,7 @@ async function createModelTypes() { code: definition.code, category: ModelCategory.PIECE, description: definition.description, - pieceCustomFields: { + customFields: { create: definition.customFields.map((field) => ({ name: field.name, type: field.type, @@ -1556,12 +3150,12 @@ async function createModelTypes() { })), }, }, - include: { pieceCustomFields: true }, + include: { customFields: true }, }); pieceTypeEntries.push([ definition.code, - { id: record.id, customFields: mapCustomFields(record.pieceCustomFields) }, + { id: record.id, customFields: mapCustomFields(record.customFields) }, ]); } @@ -1577,294 +3171,62 @@ async function createModelTypes() { }; } -async function createPieceModels(pieceTypes: Record) { - console.log('🔧 Création des modèles de pièces...'); +async function createPieceModels( + pieceTypes: Record, +) { + console.log('🧩 Création des modèles de pièces...'); + const entries = await Promise.all( pieceModelDefinitions.map(async (definition) => { + const type = pieceTypes[definition.typeCode]; + if (!type) { + throw new Error(`Type de pièce introuvable: ${definition.typeCode}`); + } + const record = await prisma.pieceModel.create({ data: { name: definition.name, description: definition.description, - typePiece: { connect: { id: pieceTypes[definition.typeCode].id } }, - structure: definition.structure ?? Prisma.JsonNull, + typePiece: { connect: { id: type.id } }, + structure: definition.structure, }, }); + return [definition.code, record] as const; }), ); + return Object.fromEntries(entries) as Record; } async function createComponentModels( componentTypes: Record, ) { - console.log('🧱 Création des modèles de composants...'); + console.log('🛠️ Création des modèles de composants...'); + const entries = await Promise.all( componentModelDefinitions.map(async (definition) => { + const type = componentTypes[definition.typeCode]; + if (!type) { + throw new Error(`Type de composant introuvable: ${definition.typeCode}`); + } + const record = await prisma.composantModel.create({ data: { name: definition.name, description: definition.description, - typeComposant: { connect: { id: componentTypes[definition.typeCode].id } }, - structure: definition.structure ?? Prisma.JsonNull, + typeComposant: { connect: { id: type.id } }, + structure: definition.structure, }, }); + return [definition.code, record] as const; }), ); + return Object.fromEntries(entries) as Record; } -const typeMachineDefinitions: TypeMachineDefinition[] = [ - { - code: 'triage-line', - name: 'Ligne de triage céréales 120 t/h', - description: - 'Chaîne automatisée de réception, triage, ventilation et expédition des céréales.', - category: 'Triage et stockage', - maintenanceFrequency: - 'Inspection quotidienne, graissage hebdomadaire, révision trimestrielle.', - specifications: { - nominalThroughput: 120, - shiftsPerDay: 2, - building: 'Hall principal', - }, - customFields: [ - { name: 'Capacité nominale (t/h)', type: 'number', required: true }, - { - name: 'Produit traité', - type: 'select', - required: true, - defaultValue: 'Blé tendre', - options: ['Blé tendre', 'Orge brassicole', 'Maïs grain', 'Pois protéagineux'], - }, - { name: 'Date de mise en service', type: 'date', required: true }, - { - name: 'Responsable de ligne', - type: 'select', - defaultValue: 'Lucie Bernard', - options: ['Lucie Bernard', 'Karim Dubois', 'Anaëlle Petit'], - }, - ], - componentRequirements: [ - { - label: 'Élévateurs principaux', - typeCode: 'bucket-elevator', - minCount: 2, - maxCount: 2, - required: true, - }, - { - label: "Convoyeurs d'alimentation", - typeCode: 'belt-conveyor', - minCount: 2, - required: true, - }, - { - label: 'Table densimétrique', - typeCode: 'gravity-separator', - minCount: 1, - maxCount: 1, - required: true, - }, - { - label: 'Vis de reprise', - typeCode: 'screw-conveyor', - minCount: 2, - required: true, - }, - { - label: 'Poste de pesage', - typeCode: 'weigh-hopper', - minCount: 1, - maxCount: 1, - required: true, - }, - { - label: 'Armoire de contrôle', - typeCode: 'control-panel', - minCount: 1, - maxCount: 1, - required: true, - }, - { - label: 'Ventilation', - typeCode: 'ventilation-fan', - minCount: 1, - required: true, - }, - ], - pieceRequirements: [ - { - label: 'Kit visserie critique', - typeCode: 'hex-screw', - minCount: 1, - required: false, - }, - { - label: 'Capteurs de vitesse de secours', - typeCode: 'speed-sensor', - minCount: 2, - required: false, - }, - { - label: 'Cartouches de filtration', - typeCode: 'filter-cartridge', - minCount: 2, - required: false, - }, - ], - }, - { - code: 'grain-dryer-station', - name: 'Station de séchage et dépoussiérage', - description: 'Poste de séchage haute capacité avec filtration et reprise.', - category: 'Séchage', - maintenanceFrequency: 'Contrôle brûleur hebdomadaire, nettoyage cyclone mensuel.', - specifications: { - nominalThroughput: 60, - building: 'Tour de séchage', - nightOperation: true, - }, - customFields: [ - { - name: 'Produit séché', - type: 'select', - defaultValue: 'Maïs grain', - options: ['Maïs grain', 'Blé dur', 'Tournesol'], - required: true, - }, - { - name: 'Mode d’alimentation', - type: 'select', - options: ['Élévateur principal', 'Vis de reprise', 'Chargement manuel'], - defaultValue: 'Élévateur principal', - }, - { name: 'Date de mise en service', type: 'date', required: true }, - ], - componentRequirements: [ - { - label: 'Séchoir continu', - typeCode: 'grain-dryer', - minCount: 1, - maxCount: 1, - required: true, - }, - { - label: 'Module brûleur', - typeCode: 'burner-module', - minCount: 1, - required: true, - }, - { - label: 'Filtration poussières', - typeCode: 'dust-filter', - minCount: 1, - required: true, - }, - { - label: 'Ventilation process', - typeCode: 'ventilation-fan', - minCount: 1, - required: true, - }, - { - label: 'Vis de reprise', - typeCode: 'screw-conveyor', - minCount: 1, - required: true, - }, - { - label: 'Armoire de supervision', - typeCode: 'control-panel', - minCount: 1, - required: true, - }, - ], - pieceRequirements: [ - { - label: 'Joints haute température', - typeCode: 'flat-gasket', - minCount: 2, - required: false, - }, - { - label: 'Sondes de température de secours', - typeCode: 'temperature-probe', - minCount: 2, - required: false, - }, - ], - }, - { - code: 'telehandler-support', - name: 'Chariot télescopique logistique', - description: 'Chariot télescopique dédié aux manutentions céréalières.', - category: 'Logistique', - maintenanceFrequency: 'Graissage hebdomadaire, contrôle hydraulique mensuel.', - specifications: { - yardArea: 'Cour logistique', - rotation: '3 équipes', - }, - customFields: [ - { - name: 'Usage principal', - type: 'select', - options: ['Chargement camions', 'Gestion big-bags', 'Maintenance silo'], - defaultValue: 'Chargement camions', - }, - { - name: 'Lieu de stationnement', - type: 'select', - options: ['Hangar nord', 'Cour extérieure', 'Atelier maintenance'], - defaultValue: 'Hangar nord', - }, - { name: "Année d'achat", type: 'number', required: true }, - ], - componentRequirements: [ - { - label: 'Châssis télescopique', - typeCode: 'telehandler', - minCount: 1, - maxCount: 1, - required: true, - }, - { - label: 'Groupe moteur', - typeCode: 'motor-drive', - minCount: 1, - required: true, - }, - { - label: 'Groupe hydraulique', - typeCode: 'hydraulic-power-pack', - minCount: 1, - required: true, - }, - { - label: 'Armoire de contrôle cabine', - typeCode: 'control-panel', - minCount: 1, - required: false, - }, - ], - pieceRequirements: [ - { - label: 'Fusibles cabine', - typeCode: 'fuse-cartridge', - minCount: 1, - required: false, - }, - { - label: 'Joints hydrauliques de secours', - typeCode: 'flat-gasket', - minCount: 1, - required: false, - }, - ], - }, -]; - async function createTypeMachines( componentTypes: Record, pieceTypes: Record, @@ -1986,18 +3348,16 @@ async function createComponentHierarchy( prix: component.prix ? new Prisma.Decimal(component.prix) : undefined, machine: { connect: { id: machineId } }, parentComposant: parentId ? { connect: { id: parentId } } : undefined, - typeComposant: { - connect: { id: context.componentTypes[component.typeCode].id }, - }, + typeComposant: { connect: { id: context.componentTypes[component.typeCode].id } }, composantModel: { connect: { id: context.componentModels[component.modelCode].id }, }, - typeMachineComponentRequirement: requirementId - ? { connect: { id: requirementId } } - : undefined, constructeur: component.constructeur ? { connect: { id: context.constructeurs[component.constructeur].id } } : undefined, + typeMachineComponentRequirement: requirementId + ? { connect: { id: requirementId } } + : undefined, customFieldValues: buildCustomFieldValues( context.componentTypes[component.typeCode].customFields, component.customValues, @@ -2040,1028 +3400,6 @@ async function createComponentHierarchy( return record; } -const machineBuilds: MachineBuildSpec[] = [ - { - code: 'triage-line-main', - typeMachineCode: 'triage-line', - name: 'Ligne de triage Valgrain 2024', - reference: 'VT-TRI-2024', - prix: '725000', - constructeurKey: 'buhler', - customFieldValues: { - 'Capacité nominale (t/h)': 120, - 'Produit traité': 'Blé tendre', - 'Date de mise en service': new Date('2024-02-01'), - 'Responsable de ligne': 'Lucie Bernard', - }, - components: [ - { - name: 'Élévateur amont Z400', - reference: 'BE-Z400-01', - prix: '58000', - typeCode: 'bucket-elevator', - requirementLabel: 'Élévateurs principaux', - modelCode: 'elevator-z400', - constructeur: 'agritech', - customValues: { - 'Débit nominal (t/h)': 120, - 'Hauteur de levage (m)': 38, - 'Matériau des godets': 'Acier galvanisé', - }, - pieces: [ - { - name: 'Courroie élévateur 800 mm', - reference: 'BLT-800-01', - prix: '2300', - typeCode: 'drive-belt', - modelCode: 'belt-hd-800', - constructeur: 'agritech', - customValues: { - 'Largeur (mm)': 800, - Matériau: 'Caoutchouc nitrile', - }, - }, - { - name: 'Kit visserie tête élévateur', - reference: 'KIT-VIS-EL-01', - typeCode: 'hex-screw', - modelCode: 'screw-m12x80', - customValues: { - 'Diamètre (mm)': 12, - 'Longueur (mm)': 80, - 'Classe acier': '8.8', - }, - }, - { - name: 'Rondelles Grower Ø12', - reference: 'RW-12-EL-01', - typeCode: 'lock-washer', - modelCode: 'washer-grower-12', - customValues: { - 'Diamètre (mm)': 12, - Finition: 'Inox', - }, - }, - ], - children: [ - { - name: 'Moteur élévateur 75 kW', - reference: 'MTR-75-01', - typeCode: 'motor-drive', - modelCode: 'motor-drive-75', - constructeur: 'sew', - customValues: { - 'Puissance nominale (kW)': 75, - 'Classe énergétique': 'IE3', - "Indice de protection": 'IP55', - }, - }, - { - name: 'Réducteur tête Flender', - reference: 'GBX-FZ-01', - typeCode: 'gearbox-assembly', - modelCode: 'gearbox-flender', - constructeur: 'flender', - customValues: { - 'Rapport de réduction': '1:28', - 'Couple nominal (Nm)': 3200, - 'Type de montage': 'À bride', - }, - }, - ], - }, - { - name: 'Élévateur aval Z320', - reference: 'BE-Z320-02', - prix: '49700', - typeCode: 'bucket-elevator', - requirementLabel: 'Élévateurs principaux', - modelCode: 'elevator-z320', - constructeur: 'agritech', - customValues: { - 'Débit nominal (t/h)': 95, - 'Hauteur de levage (m)': 32, - 'Matériau des godets': 'Polypropylène renforcé', - }, - pieces: [ - { - name: 'Courroie élévateur 650 mm', - reference: 'BLT-650-02', - typeCode: 'drive-belt', - modelCode: 'belt-hd-650', - customValues: { - 'Largeur (mm)': 650, - Matériau: 'Polyuréthane', - }, - }, - { - name: 'Kit visserie pied élévateur', - reference: 'KIT-VIS-EL-02', - typeCode: 'hex-screw', - modelCode: 'screw-m10x60', - customValues: { - 'Diamètre (mm)': 10, - 'Longueur (mm)': 60, - 'Classe acier': '10.9', - }, - }, - { - name: 'Rondelles Grower Ø10', - reference: 'RW-10-EL-02', - typeCode: 'lock-washer', - modelCode: 'washer-grower-10', - customValues: { - 'Diamètre (mm)': 10, - Finition: 'Zinguée', - }, - }, - ], - children: [ - { - name: 'Moteur élévateur 55 kW', - reference: 'MTR-55-02', - typeCode: 'motor-drive', - modelCode: 'motor-drive-55', - constructeur: 'sew', - customValues: { - 'Puissance nominale (kW)': 55, - 'Classe énergétique': 'IE3', - "Indice de protection": 'IP55', - }, - }, - { - name: 'Réducteur Bonfiglioli TA', - reference: 'GBX-TA-02', - typeCode: 'gearbox-assembly', - modelCode: 'gearbox-bonfiglioli', - constructeur: 'bonfiglioli', - customValues: { - 'Rapport de réduction': '1:24', - 'Couple nominal (Nm)': 2100, - 'Type de montage': 'Sur arbre', - }, - }, - ], - }, - { - name: "Convoyeur d'alimentation A", - reference: 'CV-18-01', - prix: '36200', - typeCode: 'belt-conveyor', - requirementLabel: "Convoyeurs d'alimentation", - modelCode: 'conveyor-18m', - constructeur: 'valmont', - customValues: { - 'Largeur de bande (mm)': 800, - 'Longueur (m)': 18, - 'Type de bande': 'Caoutchouc anti-statique', - }, - pieces: [ - { - name: 'Bande transporteuse 800 mm', - reference: 'BAND-800-A', - typeCode: 'drive-belt', - modelCode: 'belt-hd-800', - customValues: { - 'Largeur (mm)': 800, - Matériau: 'Caoutchouc nitrile', - }, - }, - { - name: 'Kit tendeur M10', - reference: 'KIT-TEN-01', - typeCode: 'hex-screw', - modelCode: 'screw-m10x60', - customValues: { - 'Diamètre (mm)': 10, - 'Longueur (mm)': 60, - 'Classe acier': '10.9', - }, - }, - ], - children: [ - { - name: 'Motorisation convoyeur A', - reference: 'MTR-45-01', - typeCode: 'motor-drive', - modelCode: 'motor-drive-45', - constructeur: 'sew', - customValues: { - 'Puissance nominale (kW)': 45, - 'Classe énergétique': 'IE3', - "Indice de protection": 'IP55', - }, - }, - { - name: 'Réducteur convoyeur A', - reference: 'GBX-TA-03', - typeCode: 'gearbox-assembly', - modelCode: 'gearbox-bonfiglioli', - constructeur: 'bonfiglioli', - customValues: { - 'Rapport de réduction': '1:24', - 'Couple nominal (Nm)': 2100, - 'Type de montage': 'Sur arbre', - }, - }, - ], - }, - { - name: "Convoyeur d'expédition B", - reference: 'CV-25-02', - prix: '41800', - typeCode: 'belt-conveyor', - requirementLabel: "Convoyeurs d'alimentation", - modelCode: 'conveyor-25m', - constructeur: 'valmont', - customValues: { - 'Largeur de bande (mm)': 650, - 'Longueur (m)': 25, - 'Type de bande': 'PVC alimentaire', - }, - pieces: [ - { - name: 'Bande transporteuse 650 mm', - reference: 'BAND-650-B', - typeCode: 'drive-belt', - modelCode: 'belt-hd-650', - customValues: { - 'Largeur (mm)': 650, - Matériau: 'Polyuréthane', - }, - }, - { - name: 'Kit visserie tendeur inox', - reference: 'KIT-TEN-02', - typeCode: 'hex-screw', - modelCode: 'screw-m8x30', - customValues: { - 'Diamètre (mm)': 8, - 'Longueur (mm)': 30, - 'Classe acier': '8.8', - }, - }, - ], - children: [ - { - name: 'Motorisation convoyeur B', - reference: 'MTR-37-02', - typeCode: 'motor-drive', - modelCode: 'motor-drive-37', - constructeur: 'sew', - customValues: { - 'Puissance nominale (kW)': 37, - 'Classe énergétique': 'IE3', - "Indice de protection": 'IP55', - }, - }, - { - name: 'Réducteur convoyeur B', - reference: 'GBX-TA-04', - typeCode: 'gearbox-assembly', - modelCode: 'gearbox-bonfiglioli', - constructeur: 'bonfiglioli', - customValues: { - 'Rapport de réduction': '1:24', - 'Couple nominal (Nm)': 2100, - 'Type de montage': 'Sur arbre', - }, - }, - ], - }, - { - name: 'Table densimétrique TQX', - reference: 'TBL-TQX-01', - prix: '68500', - typeCode: 'gravity-separator', - requirementLabel: 'Table densimétrique', - modelCode: 'gravity-table-tqx', - constructeur: 'buhler', - customValues: { - 'Capacité de tri (t/h)': 120, - 'Fréquence de vibration (Hz)': 45, - 'Type de plateau': 'Acier perforé', - }, - pieces: [ - { - name: 'Capteur vibration table', - reference: 'SNS-VIB-01', - typeCode: 'speed-sensor', - modelCode: 'sensor-speed-m12', - constructeur: 'ifm', - customValues: { - 'Type de sortie': 'PNP 4-20 mA', - 'Plage de mesure (rpm)': 1200, - }, - }, - { - name: 'Kit visserie plateau', - reference: 'KIT-VIS-PL-01', - typeCode: 'hex-screw', - modelCode: 'screw-m8x30', - customValues: { - 'Diamètre (mm)': 8, - 'Longueur (mm)': 30, - 'Classe acier': '8.8', - }, - }, - ], - children: [ - { - name: 'Moteur vibration 18,5 kW', - reference: 'MTR-18-01', - typeCode: 'motor-drive', - modelCode: 'motor-drive-18', - constructeur: 'sew', - customValues: { - 'Puissance nominale (kW)': 18.5, - 'Classe énergétique': 'IE3', - "Indice de protection": 'IP55', - }, - }, - ], - }, - { - name: 'Vis de reprise nord', - reference: 'SC-V200-N', - prix: '27400', - typeCode: 'screw-conveyor', - requirementLabel: 'Vis de reprise', - modelCode: 'screw-conveyor-v200', - constructeur: 'valmont', - customValues: { - 'Diamètre vis (mm)': 200, - 'Inclinaison (°)': 12, - 'Vitesse (rpm)': 140, - }, - pieces: [ - { - name: 'Palier UCP 210', - reference: 'BRG-UCP210-01', - typeCode: 'roller-bearing', - modelCode: 'bearing-ucp210', - constructeur: 'skf', - customValues: { - Série: 'UCP', - "Type d'étanchéité": '2RS', - }, - }, - { - name: 'Kit visserie palier', - reference: 'KIT-VIS-PA-01', - typeCode: 'hex-screw', - modelCode: 'screw-m12x80', - customValues: { - 'Diamètre (mm)': 12, - 'Longueur (mm)': 80, - 'Classe acier': '8.8', - }, - }, - ], - children: [ - { - name: 'Motorisation vis nord', - reference: 'MTR-18-02', - typeCode: 'motor-drive', - modelCode: 'motor-drive-18', - constructeur: 'sew', - customValues: { - 'Puissance nominale (kW)': 18.5, - 'Classe énergétique': 'IE3', - "Indice de protection": 'IP55', - }, - }, - ], - }, - { - name: 'Vis de reprise sud', - reference: 'SC-V160-S', - prix: '23600', - typeCode: 'screw-conveyor', - requirementLabel: 'Vis de reprise', - modelCode: 'screw-conveyor-v160', - constructeur: 'valmont', - customValues: { - 'Diamètre vis (mm)': 160, - 'Inclinaison (°)': 8, - 'Vitesse (rpm)': 110, - }, - pieces: [ - { - name: 'Palier UCFL207', - reference: 'BRG-UCFL207-01', - typeCode: 'roller-bearing', - modelCode: 'bearing-ucfl207', - constructeur: 'skf', - customValues: { - Série: 'UCFL', - "Type d'étanchéité": 'ZZ', - }, - }, - { - name: 'Kit visserie palier UCFL', - reference: 'KIT-VIS-PA-02', - typeCode: 'hex-screw', - modelCode: 'screw-m10x60', - customValues: { - 'Diamètre (mm)': 10, - 'Longueur (mm)': 60, - 'Classe acier': '10.9', - }, - }, - ], - children: [ - { - name: 'Motorisation vis sud', - reference: 'MTR-15-01', - typeCode: 'motor-drive', - modelCode: 'motor-drive-15', - constructeur: 'sew', - customValues: { - 'Puissance nominale (kW)': 15, - 'Classe énergétique': 'IE3', - "Indice de protection": 'IP55', - }, - }, - ], - }, - { - name: 'Poste de pesage BP-5', - reference: 'BP-5000-01', - prix: '39200', - typeCode: 'weigh-hopper', - requirementLabel: 'Poste de pesage', - modelCode: 'weigh-hopper-bp5', - constructeur: 'buhler', - customValues: { - 'Capacité de pesée (kg)': 5000, - 'Précision (%)': 0.5, - 'Mode de vidange': 'Trappe motorisée', - }, - pieces: [ - { - name: 'Capteur pesage 1', - reference: 'LC-5000-01', - typeCode: 'load-cell', - modelCode: 'load-cell-5t', - constructeur: 'ifm', - customValues: { - 'Capacité (kg)': 5000, - 'Type de connexion': 'Câble 6 fils', - }, - }, - { - name: 'Capteur pesage 2', - reference: 'LC-5000-02', - typeCode: 'load-cell', - modelCode: 'load-cell-5t', - constructeur: 'ifm', - customValues: { - 'Capacité (kg)': 5000, - 'Type de connexion': 'Câble 6 fils', - }, - }, - { - name: 'Capteur pesage 3', - reference: 'LC-5000-03', - typeCode: 'load-cell', - modelCode: 'load-cell-5t', - constructeur: 'ifm', - customValues: { - 'Capacité (kg)': 5000, - 'Type de connexion': 'Câble 6 fils', - }, - }, - { - name: 'Capteur pesage 4', - reference: 'LC-5000-04', - typeCode: 'load-cell', - modelCode: 'load-cell-5t', - constructeur: 'ifm', - customValues: { - 'Capacité (kg)': 5000, - 'Type de connexion': 'Câble 6 fils', - }, - }, - ], - }, - { - name: 'Armoire Schneider M340', - reference: 'CTRL-M340-01', - prix: '46500', - typeCode: 'control-panel', - requirementLabel: 'Armoire de contrôle', - modelCode: 'control-panel-m340', - constructeur: 'schneider', - customValues: { - 'Automate principal': 'Schneider Modicon M340', - 'Année de mise à jour': 2023, - "Indice de protection": 'IP55', - }, - pieces: [ - { - name: 'Module PLC M340', - reference: 'PLC-M340-01', - typeCode: 'plc-module', - modelCode: 'plc-module-m340', - constructeur: 'schneider', - customValues: { - "Nombre d'E/S": 32, - 'Version firmware': 'V2.9', - }, - }, - { - name: 'Fusible alimentation 25A', - reference: 'FUS-25A-01', - typeCode: 'fuse-cartridge', - modelCode: 'fuse-gg-25a', - constructeur: 'schneider', - customValues: { - 'Calibre (A)': 25, - 'Type de fusible': 'gG', - }, - }, - { - name: 'Entrée vitesse ligne', - reference: 'SNS-VIT-CTRL-01', - typeCode: 'speed-sensor', - modelCode: 'sensor-speed-m12', - constructeur: 'ifm', - customValues: { - 'Type de sortie': 'PNP 4-20 mA', - 'Plage de mesure (rpm)': 1000, - }, - }, - ], - }, - { - name: "Ventilateur d'extraction principal", - reference: 'FAN-AX-90', - prix: '32500', - typeCode: 'ventilation-fan', - requirementLabel: 'Ventilation', - modelCode: 'ventilation-fan-axial90', - constructeur: 'agrifan', - customValues: { - 'Débit (m³/h)': 48000, - 'Type de roue': 'Axiale', - 'Vitesse nominale (rpm)': 980, - }, - pieces: [ - { - name: 'Kit fixation ventilateur', - reference: 'KIT-FAN-01', - typeCode: 'hex-screw', - modelCode: 'screw-m12x80', - customValues: { - 'Diamètre (mm)': 12, - 'Longueur (mm)': 80, - 'Classe acier': '8.8', - }, - }, - ], - }, - ], - sparePieces: [ - { - requirementLabel: 'Kit visserie critique', - name: 'Kit visserie M12 galvanisé', - reference: 'KIT-VIS-M12', - prix: '180', - typeCode: 'hex-screw', - modelCode: 'screw-m12x80', - constructeur: 'agritech', - customValues: { - 'Diamètre (mm)': 12, - 'Longueur (mm)': 80, - 'Classe acier': '8.8', - }, - }, - { - requirementLabel: 'Capteurs de vitesse de secours', - name: 'Capteur vitesse M12 de secours', - reference: 'SNS-VIT-SPARE-01', - prix: '190', - typeCode: 'speed-sensor', - modelCode: 'sensor-speed-m12', - constructeur: 'ifm', - customValues: { - 'Type de sortie': 'PNP 4-20 mA', - 'Plage de mesure (rpm)': 1200, - }, - }, - { - requirementLabel: 'Cartouches de filtration', - name: 'Cartouche G4 de rechange', - reference: 'FLT-G4-SPARE', - prix: '140', - typeCode: 'filter-cartridge', - modelCode: 'filter-g4-500', - constructeur: 'agrifan', - customValues: { - 'Classe de filtration': 'G4', - 'Dimensions (mm)': '500x500x50', - }, - }, - ], - }, - { - code: 'dryer-station', - typeMachineCode: 'grain-dryer-station', - name: 'Poste de séchage CD-6', - reference: 'VT-DRY-01', - prix: '512000', - constructeurKey: 'agridry', - customFieldValues: { - 'Produit séché': 'Maïs grain', - 'Mode d’alimentation': 'Élévateur principal', - 'Date de mise en service': new Date('2023-09-15'), - }, - components: [ - { - name: 'Séchoir continu CD-6', - reference: 'DRY-CD6-01', - prix: '265000', - typeCode: 'grain-dryer', - requirementLabel: 'Séchoir continu', - modelCode: 'grain-dryer-cd6', - constructeur: 'agridry', - customValues: { - 'Capacité sèche (t/h)': 60, - "Nombre d'étages": 6, - "Type d'énergie": 'Gaz naturel', - }, - pieces: [ - { - name: 'Joint trappe inspection', - reference: 'JNT-DRY-01', - typeCode: 'flat-gasket', - modelCode: 'gasket-nbr-5', - customValues: { - Matière: 'NBR', - 'Épaisseur (mm)': 5, - }, - }, - ], - children: [ - { - name: 'Brûleur gaz principal', - reference: 'BRN-3MW-01', - typeCode: 'burner-module', - requirementLabel: 'Module brûleur', - modelCode: 'burner-module-3mw', - constructeur: 'agridry', - customValues: { - 'Puissance thermique (kW)': 3000, - 'Type de carburant': 'Gaz naturel', - "Système d'allumage": 'Double électrode', - }, - pieces: [ - { - name: 'Sonde flamme PT100', - reference: 'TMP-SEC-01', - typeCode: 'temperature-probe', - modelCode: 'temp-probe-pt100', - constructeur: 'ifm', - customValues: { - 'Type de sonde': 'PT100 classe A', - 'Plage de mesure (°C)': '0-250', - }, - }, - ], - }, - { - name: 'Filtre cyclone FC-12', - reference: 'FIL-FC12-01', - typeCode: 'dust-filter', - requirementLabel: 'Filtration poussières', - modelCode: 'dust-filter-fc12', - constructeur: 'agrifan', - customValues: { - 'Efficacité de filtration (%)': 95, - 'Type de média filtrant': 'Polyester', - 'Nombre de cartouches': 6, - }, - pieces: [ - { - name: 'Cartouche filtrante G4', - reference: 'FLT-G4-01', - typeCode: 'filter-cartridge', - modelCode: 'filter-g4-500', - constructeur: 'agrifan', - customValues: { - 'Classe de filtration': 'G4', - 'Dimensions (mm)': '500x500x50', - }, - }, - ], - }, - ], - }, - { - name: 'Ventilateur extraction séchoir', - reference: 'FAN-DRY-01', - prix: '43500', - typeCode: 'ventilation-fan', - requirementLabel: 'Ventilation process', - modelCode: 'ventilation-fan-axial90', - constructeur: 'agrifan', - customValues: { - 'Débit (m³/h)': 48000, - 'Type de roue': 'Axiale', - 'Vitesse nominale (rpm)': 980, - }, - pieces: [ - { - name: 'Kit fixation ventilateur séchoir', - reference: 'KIT-FAN-DRY', - typeCode: 'hex-screw', - modelCode: 'screw-m12x80', - customValues: { - 'Diamètre (mm)': 12, - 'Longueur (mm)': 80, - 'Classe acier': '8.8', - }, - }, - ], - }, - { - name: 'Vis de reprise séchoir', - reference: 'SC-DRY-01', - prix: '24800', - typeCode: 'screw-conveyor', - requirementLabel: 'Vis de reprise', - modelCode: 'screw-conveyor-v200', - constructeur: 'valmont', - customValues: { - 'Diamètre vis (mm)': 200, - 'Inclinaison (°)': 10, - 'Vitesse (rpm)': 130, - }, - pieces: [ - { - name: 'Palier UCP 210', - reference: 'BRG-UCP210-05', - typeCode: 'roller-bearing', - modelCode: 'bearing-ucp210', - constructeur: 'skf', - customValues: { - Série: 'UCP', - "Type d'étanchéité": '2RS', - }, - }, - ], - children: [ - { - name: 'Motorisation vis séchoir', - reference: 'MTR-18-05', - typeCode: 'motor-drive', - modelCode: 'motor-drive-18', - constructeur: 'sew', - customValues: { - 'Puissance nominale (kW)': 18.5, - 'Classe énergétique': 'IE3', - "Indice de protection": 'IP55', - }, - }, - ], - }, - { - name: 'Armoire supervision séchage', - reference: 'CTRL-S7-DRY', - prix: '38900', - typeCode: 'control-panel', - requirementLabel: 'Armoire de supervision', - modelCode: 'control-panel-s7', - constructeur: 'siemens', - customValues: { - 'Automate principal': 'Siemens S7-1500', - 'Année de mise à jour': 2022, - "Indice de protection": 'IP65', - }, - pieces: [ - { - name: 'Module S7-1200', - reference: 'PLC-S7-01', - typeCode: 'plc-module', - modelCode: 'plc-module-s71200', - constructeur: 'siemens', - customValues: { - "Nombre d'E/S": 24, - 'Version firmware': 'V2.8', - }, - }, - { - name: 'Fusible puissance 40A', - reference: 'FUS-40A-DRY', - typeCode: 'fuse-cartridge', - modelCode: 'fuse-gg-40a', - constructeur: 'schneider', - customValues: { - 'Calibre (A)': 40, - 'Type de fusible': 'gG', - }, - }, - ], - }, - ], - sparePieces: [ - { - requirementLabel: 'Joints haute température', - name: 'Joint PTFE 3 mm de rechange', - reference: 'JNT-PTFE-SPARE', - typeCode: 'flat-gasket', - modelCode: 'gasket-ptfe-3', - constructeur: 'agridry', - customValues: { - Matière: 'PTFE', - 'Épaisseur (mm)': 3, - }, - }, - { - requirementLabel: 'Sondes de température de secours', - name: 'Sonde PT100 courte', - reference: 'TMP-SPARE-02', - typeCode: 'temperature-probe', - modelCode: 'temp-probe-pt100-short', - constructeur: 'ifm', - customValues: { - 'Type de sonde': 'PT100 classe B', - 'Plage de mesure (°C)': '0-200', - }, - }, - ], - }, - { - code: 'telehandler-logistics', - typeMachineCode: 'telehandler-support', - name: 'Manitou MLT 1040 logistique', - reference: 'VT-MAN-01', - prix: '73500', - constructeurKey: 'manitou', - customFieldValues: { - 'Usage principal': 'Gestion big-bags', - 'Lieu de stationnement': 'Hangar nord', - "Année d'achat": 2021, - }, - components: [ - { - name: 'Chariot télescopique MLT 1040', - reference: 'MLT-1040-01', - prix: '73500', - typeCode: 'telehandler', - requirementLabel: 'Châssis télescopique', - modelCode: 'telehandler-mlt1040', - constructeur: 'manitou', - customValues: { - 'Capacité de levage (t)': 4, - 'Hauteur de levage (m)': 9.6, - "Type d'attache": 'Fourches FEM', - }, - pieces: [ - { - name: 'Cartouche cabine 40A', - reference: 'FUS-CAB-40A', - typeCode: 'fuse-cartridge', - modelCode: 'fuse-gg-40a', - constructeur: 'schneider', - customValues: { - 'Calibre (A)': 40, - 'Type de fusible': 'gG', - }, - }, - { - name: 'Joint clapet direction', - reference: 'JNT-DIR-01', - typeCode: 'flat-gasket', - modelCode: 'gasket-nbr-5', - constructeur: 'manitou', - customValues: { - Matière: 'NBR', - 'Épaisseur (mm)': 5, - }, - }, - ], - children: [ - { - name: 'Moteur principal 75 kW', - reference: 'MTR-MAN-01', - typeCode: 'motor-drive', - requirementLabel: 'Groupe moteur', - modelCode: 'motor-drive-75', - constructeur: 'sew', - customValues: { - 'Puissance nominale (kW)': 75, - 'Classe énergétique': 'IE3', - "Indice de protection": 'IP55', - }, - pieces: [ - { - name: 'Kit fixation moteur Manitou', - reference: 'KIT-MTR-MAN', - typeCode: 'hex-screw', - modelCode: 'screw-m12x80', - customValues: { - 'Diamètre (mm)': 12, - 'Longueur (mm)': 80, - 'Classe acier': '8.8', - }, - }, - ], - }, - { - name: 'Groupe hydraulique PVH98', - reference: 'HYD-PVH98-01', - typeCode: 'hydraulic-power-pack', - requirementLabel: 'Groupe hydraulique', - modelCode: 'hydraulic-pack-pvh98', - constructeur: 'poclain', - customValues: { - 'Débit nominal (l/min)': 160, - 'Pression max (bar)': 320, - 'Type de pompe': 'Piston axial', - }, - pieces: [ - { - name: 'Joint collecteur hydraulique', - reference: 'JNT-HYD-01', - typeCode: 'flat-gasket', - modelCode: 'gasket-nbr-5', - customValues: { - Matière: 'NBR', - 'Épaisseur (mm)': 5, - }, - }, - ], - }, - { - name: 'Tableau cabine M340', - reference: 'CTRL-CAB-01', - typeCode: 'control-panel', - requirementLabel: 'Armoire de contrôle cabine', - modelCode: 'control-panel-m340', - constructeur: 'schneider', - customValues: { - 'Automate principal': 'Schneider Modicon M340', - 'Année de mise à jour': 2023, - "Indice de protection": 'IP55', - }, - pieces: [ - { - name: 'Module PLC cabine', - reference: 'PLC-CAB-01', - typeCode: 'plc-module', - modelCode: 'plc-module-m340', - constructeur: 'schneider', - customValues: { - "Nombre d'E/S": 32, - 'Version firmware': 'V2.9', - }, - }, - { - name: 'Fusible cabine 25A', - reference: 'FUS-CAB-25A', - typeCode: 'fuse-cartridge', - modelCode: 'fuse-gg-25a', - constructeur: 'schneider', - customValues: { - 'Calibre (A)': 25, - 'Type de fusible': 'gG', - }, - }, - ], - }, - ], - }, - ], - sparePieces: [ - { - requirementLabel: 'Fusibles cabine', - name: 'Fusible cabine gG 25A', - reference: 'FUS-SPARE-25A', - typeCode: 'fuse-cartridge', - modelCode: 'fuse-gg-25a', - constructeur: 'schneider', - customValues: { - 'Calibre (A)': 25, - 'Type de fusible': 'gG', - }, - }, - { - requirementLabel: 'Joints hydrauliques de secours', - name: 'Kit joints NBR Manitou', - reference: 'KIT-JNT-MAN', - typeCode: 'flat-gasket', - modelCode: 'gasket-nbr-5', - constructeur: 'manitou', - customValues: { - Matière: 'NBR', - 'Épaisseur (mm)': 5, - }, - }, - ], - }, -]; async function createMachines( siteId: string, typeMachines: Record, @@ -3129,6 +3467,9 @@ async function createMachines( console.log(`📦 ${build.name} - enregistrement des pièces de réserve...`); for (const spare of build.sparePieces) { const pieceType = context.pieceTypes[spare.typeCode]; + if (!pieceType) { + throw new Error(`Type de pièce inconnu pour pièce de secours: ${spare.typeCode}`); + } const requirementId = spare.requirementLabel ? pieceRequirementMap.get(spare.requirementLabel) : undefined;