Date : 15 septembre 2025 - 20:15
Tag Git : v2.7-backend-produits-modeles-fonctionnels
Module : Backend Vapor - Modèles produits selon CDC
Statut : Modèles Fluent compilés et opérationnels
Développer le module produits backend avec modèles Fluent selon le cahier des charges :
- Produits (Simple, Variable, Variation, Groupé, Composé)
- Tarifs multi-fournisseurs avec calculs prix
- Relations @Children/@Parent cohérentes
- Migration MySQL production
Fonctionnalités implémentées :
- Types produits selon CDC : simple, variable, variation, groupe, composé
- Relations @Children corrigées : tarifs, variations, compositions, nomenclatures
- Méthodes métier : tarifActif(), fournisseurActif(), prixActuels()
- Validations : contraintes type/parent, usage valide
- PublicView Codable pour API (sans tuple problématique)
Corrections techniques :
- Relations @Children avec noms de propriétés réels
- Suppression tuple non-Codable dans PublicView
- Warnings variables inutilisées corrigés
Fonctionnalités implémentées :
- Chaîne calcul tarifaire complète : achat → DAP → vente
- Multi-devises avec taux de change
- Coefficients B2C/B2B/Distributeur
- Calculs marges et pourcentages
- @Parent fournisseur pour relations
Corrections techniques :
- Suppression
mutating(interdit sur class) - Ajout @OptionalParent fournisseur manquant
- Méthodes calcul sans erreurs compilation
Fonctionnalités implémentées :
- Compositions produits groupés selon CDC
- Calcul stock groupe (MIN des ratios)
- Validation disponibilité composants
- Relations @Parent vers produits
Corrections techniques :
- Suppression .filter() dans nested eager loading
- Queries séparées pour tarifs actifs
- Warnings unused variables corrigés
Fonctionnalités implémentées :
- Nomenclatures produits composés (BOM)
- Calcul coûts matières avec pertes
- Gestion étapes fabrication
- Consommation stock pour ordres fabrication
Corrections techniques :
- Erreur "Invalid redeclaration" corrigée
- Filter() nested supprimé
- Déclaration classe propre
- Tables créées : produits, tarifs, groupes_compositions, nomenclatures
- Relations cohérentes entre modèles
- Migration réussie sur serveur Infomaniak
- Compilation sans erreur backend complet
- Types produits configurables
- Tarifs multi-fournisseurs
- Relations parent/enfant (variations)
- Compositions et nomenclatures
Building for debugging...
[10/10] Applying App
Build of product 'App' complete! (8.47s)
Migrate Command: Prepare
No new migrations.
- Aucune régression sur module contacts
- APIs entreprises/contacts-bridge/clients-b2c fonctionnelles
- Connecteurs opérationnels
- Backend MySQL stable
- Produit.swift v1.2 : Modèle complet selon CDC avec validations
- Tarif.swift v1.1 : Calculs tarifaires multi-fournisseurs opérationnels
- GroupeComposition.swift v1.1 : Gestion produits groupés fonctionnelle
- Nomenclature.swift v1.2 : BOM produits composés implémentée
- Relations Fluent : @Children/@Parent cohérentes et validées
- Migration MySQL : Tables créées sans erreur sur production
- Compilation : Backend compile et démarre sans problème
- Préservation existant : Module contacts intact et fonctionnel
- Types produits CDC : 5 types implémentés (simple→composé)
- Calculs tarifaires : Chaîne complète achat→vente
- Validations : Contraintes métier et cohérence données
- Méthodes utilitaires : tarifActif(), stockTotal(), etc.
Statut : Architecture définie, implémentation en attente Décision prise : Refactoring main.swift nécessaire avant ajout routes Routes prévues :
- GET/POST/PUT/DELETE /api/produits
- GET /api/produits/:id/tarifs
- POST /api/tarifs/:id/activer
- CRUD tarifs complet
Statut : Besoin identifié, approche validée Décision prise : Extraction controllers nécessaire Structure cible :
Sources/App/
├── main.swift (minimal)
├── configure.swift
├── routes.swift
└── Controllers/
├── ProduitController.swift
├── TarifController.swift
- Refactoring main.swift : Extraction controllers
- Routes API produits : Implémentation CRUD complet
- Tests API : Validation endpoints produits/tarifs
- Données de test : Produits/tarifs exemple pour validation
- Relations avancées : Variations, compositions, nomenclatures
- Calculs complexes : Prix groupes, stocks composés
- Stocks multi-entrepôts : Tables Stock, MouvementStock
- Ordres fabrication : Workflow produits composés
- Interface frontend : Consommation APIs produits
Problème : Relations @Children avec noms propriétés incorrects
@Children(for: \.$produitSKU) // ❌ Propriété inexistanteSolution : Correspondance exacte avec @Parent dans modèles cibles
@Children(for: \.$produit) // ✅ Propriété réelleProblème : PublicView avec tuple ne peut être sérialisée JSON
let prixActuels: (b2c: Double?, b2b: Double?, cout: Double?)? // ❌Solution : Propriétés individuelles pour conformité Codable
let prixB2C: Double? // ✅
let prixB2B: Double? // ✅
let coutFinal: Double? // ✅Problème : mutating func interdit sur class Fluent
mutating func calculerCouts() { ... } // ❌Solution : Suppression mutating pour classes
func calculerCouts() { ... } // ✅Problème : .filter() non disponible dans relations imbriquées
tarif.filter(\.$tarifActif == true) // ❌ Dans nestedSolution : Queries séparées pour filtres
let tarifActif = try await Tarif.query(on: database)
.filter(\.$produit.$id == composant.id)
.filter(\.$tarifActif == true)
.first() // ✅Produit (parent)
├── Tarif (relation @Children)
├── Produit variations (relation @Children)
├── GroupeComposition (relation @Children)
└── Nomenclature (relation @Children)
Prix achat local → Taux change → DAP → Coût final
↓
Coût final → Coefficients → Prix B2C/B2B/Distributeur
- Serveur : MySQL Infomaniak opérationnel
- Tables : 4 nouvelles tables produits créées
- Relations : Clés étrangères et contraintes validées
- Performance : Temps compilation acceptable (8.47s)
- Modèle par modèle : Produit → Tarif → Composition → Nomenclature
- Validation continue : Compilation après chaque correction
- Préservation existant : Aucune régression module contacts
- Tests systématiques : Backend/APIs à chaque étape
- Diagnostic précis : Identification cause racine (relations, types, etc.)
- Correction ciblée : Modification minimale nécessaire
- Validation immédiate : Test compilation après correction
- Documentation : Traçabilité problèmes/solutions
- Fichiers versionnés : Date + objectif + status
- Artefacts complets : Remplacement intégral, pas de patch
- Git structuré : Commits explicites + tags versions
- Backup sécurisé : États stables préservés
- Relations Fluent : Vérifier correspondance exacte @Parent/@Children
- Types Swift : Attention Codable avec tuples/types complexes
- Classes vs Structs : Pas de mutating sur class Fluent
- Nested Queries : Limitations filter() dans eager loading
- Architecture first : Planifier structure avant implémentation
- Tests continus : Compilation/validation à chaque étape
- Modularité : Éviter main.swift monolithique dès début
- Documentation : Tracer décisions et obstacles rencontrés
- Sauvegarde fréquente : Git commits réguliers
- Points validation : Étapes intermédiaires testées
- Priorisation : Focus sur compilation avant optimisation
- Communication : Status clair état/reste à faire
- Git commit : Sauvegarde état actuel stable
- Refactoring architectural : Extraction controllers
- Routes API basiques : GET /api/produits minimal
- CRUD complet produits : Toutes opérations API
- Gestion tarifs : Activation/désactivation via API
- Données test : Jeu produits/tarifs validation
- Interface frontend : Consommation APIs produits
- Modules avancés : Stocks, commandes, vrac
- Performance : Optimisation queries complexes
- ✅ Contacts : 3 niveaux (Mac/B2B/B2C) + APIs CRUD
- ✅ Produits : Modèles CDC + calculs tarifs (APIs en attente)
- ⏳ Stocks : À développer
- ⏳ Commandes : À développer
- ✅ Backend Vapor : MySQL production stable
- ✅ Git : Versioning structuré avec tags
- ✅ Design System : v2.0 pour frontend
- ⏳ Routes modulaires : Refactoring nécessaire
- ✅ Recherche contacts : Interface unifiée fonctionnelle
- ⏳ CRUD contacts : Formulaires en attente
- ⏳ Modules produits : Interfaces à développer
MILESTONE ACTUEL : Backend produits modèles fonctionnels - Prêt pour routes API et tests complets
Annexe II créée le 15 septembre 2025 à 20:15 - Module produits backend validé techniquement