private DocumentBilan DocumentBilanTarif(DocumentBilan doc, List <DocumentCommande> commandes, Func <decimal, DétailCommandeData, decimal> agrégeDétails) { Func <DétailCommandeData, DocumentCommande, DataDétailProduit> détail_Produit = (détail, commande) => { ProduitData produit = commande.Tarif.Produits.Where(p => p.No == détail.No).First(); CatégorieData catégorie = commande.Tarif.Catégories.Where(c => c.No == produit.CategorieNo).First(); return(new DataDétailProduit { Détail = détail, Produit = produit, Catégorie = catégorie }); }; Func <IEnumerable <DataDétailProduit>, DocumentCommande, IEnumerable <DataDétailProduit> > agrége = (détails, commande) => détails.Concat(commande.Détails.Select(d => détail_Produit(d, commande))); var x = commandes .Aggregate(new List <DataDétailProduit>(), agrége) .GroupBy(dp => new { dp.Produit.No, dp.Produit.Date }) .Select(dps => new { produit = dps.First().Produit, catégorie = dps.First().Catégorie, détails = dps.Select(dp => dp.Détail) }); List <ProduitData> produits = x.Select(pcds => pcds.produit).ToList(); List <CatégorieData> catégories = x.Select(pcds => pcds.catégorie) .GroupBy(c => new { c.No, c.Date }) .Select(cs => cs.First()) .ToList(); doc.Produits = x.Select(pcds => BilanProduit(pcds.produit, pcds.détails, agrégeDétails)).ToList(); doc.Tarif = new Catalogue { Produits = produits, Catégories = catégories }; return(doc); }
private List <DocumentBilan> DocumentFactureBilan(List <Commande> commandesAvecFacture, List <DocumentCommande> documentCommandes) { IEnumerable <Facture> factures = commandesAvecFacture .GroupBy(c => c.Livraison.Facture) .Select(g => g.Key); var x = factures .Select(facture => new { document = DocumentFactureBase(facture), tarif = DocumentBilanTarif(DocumentFactureBase(facture), documentCommandes, (af, d) => af + d.AFacturer.Value) }) .ToList(); Func <DocumentBilan, DocumentBilan, DocumentBilan> créeBilan = (DocumentBilan doc, DocumentBilan avecTarif) => { doc.Lignes = avecTarif.Produits.Count(); decimal zéro = 0; doc.Total = avecTarif.Produits.Aggregate(zéro, (total, bp) => { ProduitData produitData = avecTarif.Tarif.Produits.Where(p => p.No == bp.No && p.Date == bp.Date).First(); return(total + produitData.Prix.Value * bp.Total); }); return(doc); }; List <DocumentBilan> documents = x.Select(dt => créeBilan(dt.document, dt.tarif)) .ToList(); return(documents); }
public decimal CoûtAFacturer(IEnumerable <DétailCommandeData> détails, Catalogue catalogue) { decimal coûtTotal = 0; détails.ToList().ForEach(détail => { ProduitData produit = catalogue.Produits.Where(p => p.No == détail.No).First(); coûtTotal += produit.Prix.Value * détail.AFacturer.Value; }); return(coûtTotal); }
private BilanProduit BilanProduit(ProduitData produit, IEnumerable <DétailCommandeData> détails, Func <decimal, DétailCommandeData, decimal> agrégeDétails) { decimal zéro = 0; return(new BilanProduit { No = produit.No, Date = produit.Date, Total = détails.Aggregate(zéro, agrégeDétails) }); }
public decimal CoûtDemande(IEnumerable <DétailCommandeData> détails, Catalogue catalogue, out bool incomplet) { decimal coûtTotal = 0; bool complet = true; détails.ToList().ForEach(détail => { ProduitData produit = catalogue.Produits.Where(p => p.No == détail.No).First(); bool calculable = détail.TypeCommande == null || détail.TypeCommande == UnitéDeMesure.UnitéDeCommandeParDéfaut(produit.TypeMesure); if (détail.Demande.HasValue && calculable) { coûtTotal += produit.Prix.Value * détail.Demande.Value; } else { complet = false; } }); incomplet = !complet; return(coûtTotal); }