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 DocumentBilan DocumentFactureBase(Facture facture)
        {
            DocumentBilan doc = new DocumentBilan
            {
                Uid  = facture.Uid,
                Rno  = facture.Rno,
                No   = facture.No,
                Date = facture.Date.Value,
            };

            return(doc);
        }
        private DocumentBilan DocumentLivraisonBase(Livraison livraison, IEnumerable <DocumentCommande> commandes)
        {
            DocumentCommande commande = commandes.First();
            DocumentBilan    doc      = new DocumentBilan
            {
                Uid  = commande.Uid,
                Rno  = commande.Rno,
                No   = livraison.No,
                Date = livraison.Date.Value,
            };

            return(doc);
        }
        public async Task <AKeyUidRnoNo> Livraison(AKeyUidRno keySite, KeyUidRnoNo keyDocument)
        {
            Func <Commande, bool>       filtreCommandes = c => c.Uid == keyDocument.Uid && c.Rno == keyDocument.Rno;
            Func <DétailCommande, bool> filtreDétails   = d => d.ALivrer.HasValue && d.ALivrer.Value > 0;
            List <Commande>             commandes       = await _utile.CommandesAvecDétailsLivraisonEtFacture(filtreCommandes, filtreDétails, null, null)
                                                          .Where(c => c.Livraison != null && c.Livraison.No == keyDocument.No && c.Livraison.Date.HasValue)
                                                          .ToListAsync();

            if (commandes.Count() == 0)
            {
                return(null);
            }
            List <DocumentCommande> documentCommandes = (await DocumentCommandes(keySite, commandes, filtreDétails, avecDétails: true));
            DocumentBilan           livraison         = DocumentsLivraisonTarif(commandes, documentCommandes).First();

            return(livraison);
        }