Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        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)
            });
        }
Ejemplo n.º 5
0
        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);
        }