Ejemplo n.º 1
0
        [ProducesResponseType(409)] // Conflict
        public async Task <IActionResult> Envoi([FromQuery] ParamsKeyClient paramsClient)
        {
            vérificateur.Initialise(paramsClient);
            try
            {
                await ClientDeLAction();
                await UtilisateurEstClientActifOuNouveau();

                ContexteCatalogue();
            }
            catch (VérificationException)
            {
                return(vérificateur.Erreur);
            }

            DocCLF dernièreCommande = await _service.DernierDoc(paramsClient.Id, TypeCLF.Commande);

            // la dernière commande doit exister et ne pas être envoyée
            if (dernièreCommande == null || dernièreCommande.Date.HasValue)
            {
                return(RésultatBadRequest("DerniereCommandeAbsenteOuEnvoyée"));
            }

            RetourDeService <CLFDoc> retour = await _service.EnvoiCommande(vérificateur.Site, dernièreCommande);

            if (retour.Ok)
            {
                return(RésultatCréé(retour.Entité));
            }

            return(SaveChangesActionResult(retour));
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Vérifie que vérificateur.DocCLF peut être édité ou supprimé et que l'utilisateur en a le droit.
        /// </summary>
        protected void DocModifiable()
        {
            DocCLF doc = vérificateur.DocCLF;

            if (vérificateur.EstClient)
            {
                // Le client peut modifier un bon de commande qui n'a pas été envoyé (i.e. sans Date) sauf le bon virtuel
                if (doc.Date.HasValue || vérificateur.KeyDoc.No == 0)
                {
                    vérificateur.Erreur = RésultatBadRequest("CommandeEnvoyéeOuVirtuelle");
                    throw new VérificationException();
                }
            }
            else
            {
                // Le fournisseur ne peut modifier que les bons de commande ou de livraison virtuels
                if (doc.Type == TypeCLF.Facture)
                {
                    vérificateur.Erreur = RésultatBadRequest("ModifieFacture");
                    throw new VérificationException();
                }
                if (doc.No != 0)
                {
                    vérificateur.Erreur = RésultatBadRequest("BonNonVirtuel");
                    throw new VérificationException();
                }
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Crée un document à envoyer avec seulement la Date.
        /// </summary>
        /// <param name="docCLF">document dans la bdd</param>
        /// <returns></returns>
        public static CLFDoc DeDate(DocCLF docCLF)
        {
            CLFDoc clfDoc = new CLFDoc
            {
                Date = docCLF.Date
            };

            return(clfDoc);
        }
Ejemplo n.º 4
0
 public async Task FixeSynthétisés(DocCLF docCLF, DbSet <DocCLF> docs)
 {
     if (docCLF.Type != TypeCLF.Commande)
     {
         NoBons = await docs
                  .Where(d => d.Id == docCLF.Id && d.NoGroupe == docCLF.No && d.Type == DocCLF.TypeBon(docCLF.Type))
                  .Select(d => d.No)
                  .ToListAsync();
     }
 }
Ejemplo n.º 5
0
        /// <summary>
        /// Crée un document à envoyer avec seulement le No et le Type.
        /// </summary>
        /// <param name="docCLF">document dans la bdd</param>
        /// <returns></returns>
        public static CLFDoc DeNoType(DocCLF docCLF)
        {
            CLFDoc clfDoc = new CLFDoc
            {
                No   = docCLF.No,
                Type = docCLF.Type
            };

            return(clfDoc);
        }
Ejemplo n.º 6
0
        /// <summary>
        /// Crée un document à envoyer avec seulement l'Id du client et le No du document.
        /// </summary>
        /// <param name="docCLF">document dans la bdd</param>
        /// <returns></returns>
        public static CLFDoc DeKey(DocCLF docCLF)
        {
            CLFDoc clfDoc = new CLFDoc
            {
                Id = docCLF.Id,
                No = docCLF.No
            };

            return(clfDoc);
        }
Ejemplo n.º 7
0
        /// <summary>
        /// Lit le document défini par vérificateur.KeyDoc et vérifie qu'il existe. Fixe vérificateur.DocCLF avec ses lignes.
        /// </summary>
        protected async Task DocExiste()
        {
            DocCLF docCLF = await _service.DocCLFDeKey(vérificateur.KeyDoc, _type);

            if (docCLF == null)
            {
                vérificateur.Erreur = RésultatBadRequest("DocNExistePas");
                throw new VérificationException();
            }
            vérificateur.DocCLF = docCLF;
        }
Ejemplo n.º 8
0
 public async Task FixeSynthèse(DocCLF docCLF, DbSet <DocCLF> docs)
 {
     if (docCLF.NoGroupe != null)
     {
         NoGroupe   = docCLF.NoGroupe;
         DateGroupe = await docs
                      .Where(d => d.Id == docCLF.Id && d.No == docCLF.NoGroupe && d.Type == DocCLF.TypeSynthèse(docCLF.Type))
                      .Select(d => d.Date)
                      .FirstOrDefaultAsync();
     }
 }
Ejemplo n.º 9
0
        /// <summary>
        /// Vérifie que vérificateur.DocCLF est envoyé et sans synthèse.
        /// Un bon virtuel est considéré comme envoyé et sans synthèse.
        /// </summary>
        protected void DocEstASynthétiser()
        {
            DocCLF doc = vérificateur.DocCLF;
            bool   peutEditerAFixer = doc.No == 0 || (doc.Date.HasValue && !doc.NoGroupe.HasValue);

            if (!peutEditerAFixer)
            {
                vérificateur.Erreur = RésultatBadRequest("AFixerNonModifiable");
                throw new VérificationException();
            }
        }
Ejemplo n.º 10
0
        /// <summary>
        /// Crée un document à envoyer avec la key, la Date, les lignes avec ou sans AFixer suivant la fonction de création de ligne.
        /// </summary>
        /// <param name="docCLF">document dans la bdd</param>
        /// <param name="créeLigneData">transforme une ligne de la bdd en une ligne à envoyer</param>
        /// <returns></returns>
        public static CLFDoc AvecLignes(DocCLF docCLF, Func <LigneCLF, CLFLigneData> créeLigneData)
        {
            CLFDoc clfDoc = new CLFDoc
            {
                Id     = docCLF.Id,
                No     = docCLF.No,
                Date   = docCLF.Date,
                Lignes = docCLF.Lignes.Select(l => créeLigneData(l)).ToList()
            };

            return(clfDoc);
        }
Ejemplo n.º 11
0
        public static CLFDoc APréparer(DocCLF docCLF)
        {
            CLFDoc clfDoc = new CLFDoc
            {
                Id        = docCLF.Id,
                No        = docCLF.No,
                Date      = docCLF.Date,
                NbLignes  = docCLF.Lignes.Count,
                Incomplet = !docCLF.Lignes.All(l => l.AFixer.HasValue)
            };

            return(clfDoc);
        }
Ejemplo n.º 12
0
        /// <summary>
        /// Crée un document à envoyer avec la key, la Date, le Type, le NbLignes, le Total et le Incomplet.
        /// Si le document fait partie d'une synthèse, le CLFDoc contient aussi le NoGroupe, la DateGroupe.
        /// </summary>
        /// <param name="docCLF">document dans la bdd</param>
        /// <returns></returns>
        public static async Task <CLFDoc> Résumé(DocCLF docCLF, DbSet <DocCLF> docs)
        {
            CLFDoc clfDoc = new CLFDoc
            {
                Id        = docCLF.Id,
                No        = docCLF.No,
                Type      = docCLF.Type,
                Date      = docCLF.Date,
                NoGroupe  = docCLF.NoGroupe,
                NbLignes  = docCLF.NbLignes,
                Total     = docCLF.Total,
                Incomplet = docCLF.Incomplet
            };
            await clfDoc.FixeSynthèse(docCLF, docs);

            return(clfDoc);
        }
Ejemplo n.º 13
0
 public CLFDoc CopieLignesAvecAFixer(DocCLF docCLF)
 {
     return(CopieLignes(docCLF, CLFLigneData.LigneDataAvecAFixer));
 }
Ejemplo n.º 14
0
 private CLFDoc CopieLignes(DocCLF docCLF, Func <LigneCLF, CLFLigneData> créeLigneData)
 {
     Lignes = docCLF.Lignes.Select(l => créeLigneData(l)).ToList();
     return(this);
 }
Ejemplo n.º 15
0
 public CLFDoc CopieLignes(DocCLF docCLF)
 {
     return(CopieLignes(docCLF, CLFLigneData.LigneData));
 }
Ejemplo n.º 16
0
        /// <summary>
        /// Exécute une action sur chaque ligne des documents d'un client dont le No est dans une liste.
        /// Retourne une erreur si l'un des documents n'est pas à synthétiser.
        /// </summary>
        /// <param name="paramsSynthèse">contient l'Id du client et la liste des No des documents à synthétiser</param>
        /// <param name="action">retourne null si l'action est impossible</param>
        /// <returns></returns>
        protected async Task <IActionResult> Action(ParamsSynthèse paramsSynthèse, Func <List <DocCLF>, Task <RetourDeService> > action)
        {
            vérificateur.Initialise(paramsSynthèse.Id);
            try
            {
                await ClientDeLAction();
                await UtilisateurEstFournisseur();

                ContexteCatalogue();
            }
            catch (VérificationException)
            {
                return(vérificateur.Erreur);
            }

            // Lit la liste des documents synthétisables dont le No est dans la liste.
            List <DocCLF> docs = await _service.DocumentsEnvoyésSansSynthèse(paramsSynthèse, DocCLF.TypeBon(_type));

            if (docs.Count != paramsSynthèse.NoDocs.Count)
            {
                // L'un des No de la liste ne correspond pas à un document synthétisable.
                return(RésultatBadRequest("DocumentsPasEnvoyésOuAvecSynthèse"));
            }

            RetourDeService retour = await action(docs);

            return(SaveChangesActionResult(retour));
        }
Ejemplo n.º 17
0
        /// <summary>
        /// Supprime toutes les modifications apportées à la bdd depuis et y compris la création du Client sur Invitation
        /// </summary>
        /// <param name="clientNouveau">Client qui a été créé en répondant à une Invitation</param>
        /// <returns>RetourDeService  d'un ClientEtatVue contenant un Client identique à celui que l'Invitation invitait à gérer s'il y en avait un, null sinon</returns>
        public new async Task <RetourDeService <ClientEtatVue> > Supprime(Client clientNouveau)
        {
            Client               rétabli  = null;
            ClientEtatVue        vue      = null;
            List <ArchiveClient> archives = await _context.ArchiveClient
                                            .Where(a => a.Id == clientNouveau.Id)
                                            .OrderBy(a => a.Date)
                                            .ToListAsync();

            // index de l'archive ayant enregiistré le
            int indexCréation = archives.FindIndex(a => a.Etat == EtatRole.Nouveau);

            if (indexCréation != 0)
            {
                // le compte existait avant le rattachement au client, il faut le rétablir
                rétabli = new Client
                {
                    Id     = clientNouveau.Id,
                    SiteId = clientNouveau.SiteId
                };
                // date du dernier changement d'état à fixer à partir des archives
                DateTime dateEtat = archives.ElementAt(0).Date;

                // Fixe les champs du Role à rétablir avec les champs non nuls de l'archive
                // Si l'archive a un Etat fixe la date de changement d'état
                ArchiveClient rétablitArchive(ArchiveClient archive)
                {
                    Client.CopieDataSiPasNull(archive, rétabli);
                    ArchiveClient archiveRétablie = new ArchiveClient
                    {
                        Id = clientNouveau.Id
                    };

                    Client.CopieData(archive, archiveRétablie);
                    archiveRétablie.Date = archive.Date;
                    if (archive.Etat != null)
                    {
                        rétabli.Etat = archive.Etat.Value;
                        dateEtat     = archive.Date;
                    }
                    return(archiveRétablie);
                }

                // transforme un RetourDeService avec erreur en RetourDeService<ClientEtatVue> avec la même erreur
                RetourDeService <ClientEtatVue> transformeErreur(RetourDeService retour)
                {
                    // on copie l'erreur dans RetourDeService de ClientEtatVue
                    RetourDeService <ClientEtatVue> retourVue = new RetourDeService <ClientEtatVue>(retour.Type);

                    if (retour.IdentityError)
                    {
                        retourVue.Objet = retour.Objet;
                    }
                    return(retourVue);
                }

                // on doit attribuer au client créé les archives antérieures au passage à l'état nouveau
                // et rétablir ses champs en fonction de ces archives
                List <ArchiveClient> archivesRétablies = archives
                                                         .GetRange(0, indexCréation)
                                                         .Select(a => rétablitArchive(a))
                                                         .ToList();


                // on ajoute seulement à la table Role
                _context.Client.Add(rétabli);
                // il faut sauvegarder pour pouvoir ajouter les élément dépendants
                RetourDeService retour = await SaveChangesAsync();

                if (!retour.Ok)
                {
                    return(transformeErreur(retour));
                }
                vue = new ClientEtatVue
                {
                    Id       = rétabli.Id,
                    Etat     = EtatRole.Actif,
                    DateEtat = dateEtat
                };
                Client.CopieData(rétabli, vue);

                // on ajoute les archives
                _context.ArchiveClient.AddRange(archivesRétablies);

                // date du passage à l'état nouveau
                DateTime dateCréation = archives.ElementAt(indexCréation).Date;
                // on doit attribuer au client créé les documents et les lignes du client créés avant le passage à l'état nouveau
                List <DocCLF> anciensDocs = await _context.Docs
                                            .Where(d => d.Id == clientNouveau.Id && d.Date < dateCréation)
                                            .ToListAsync();

                // s'il n'y a pas de documents, il n'y a rien à réattribuer
                if (anciensDocs.Count != 0)
                {
                    List <LigneCLF> anciennesLignes = await _context.Lignes
                                                      .Where(l => l.Id == clientNouveau.Id && anciensDocs.Where(d => d.No == l.No).Any())
                                                      .ToListAsync();

                    // s'il n'y a pas de lignes, il n'y a rien à réattribuer
                    if (anciennesLignes.Count != 0)
                    {
                        vue.AvecDocuments = true;
                        List <DocCLF> nouveauxDocs = anciensDocs
                                                     .Select(d => DocCLF.Clone(rétabli.Id, d))
                                                     .ToList();
                        List <LigneCLF> nouvellesLignes = anciennesLignes
                                                          .Select(l => LigneCLF.Clone(rétabli.Id, l))
                                                          .ToList();
                        _context.Docs.AddRange(nouveauxDocs);
                        retour = await SaveChangesAsync();

                        if (retour.Ok)
                        {
                            _context.Lignes.AddRange(nouvellesLignes);
                            retour = await SaveChangesAsync();
                        }
                        if (!retour.Ok)
                        {
                            return(transformeErreur(retour));
                        }
                    }
                }
            }
            _context.Client.Remove(clientNouveau);
            return(await SaveChangesAsync(vue));
        }
Ejemplo n.º 18
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="paramsClient"></param>
        /// <param name="copieLignes"></param>
        /// <returns></returns>
        protected async Task <IActionResult> CréeBon(ParamsKeyClient paramsClient, bool copieLignes)
        {
            vérificateur.Initialise(paramsClient);
            try
            {
                await ClientDeLAction();
                await UtilisateurEstClientActifOuNouveauOuFournisseur();

                ContexteCatalogue();
            }
            catch (VérificationException)
            {
                return(vérificateur.Erreur);
            }

            uint   noBon;
            DocCLF docACopier = null;

            if (vérificateur.EstClient)
            {
                if (_type != TypeCLF.Commande)
                {
                    return(RésultatInterdit("Un client ne peut créer que des bons de commande."));
                }
                DocCLF dernièreCommande = await _service.DernierDoc(vérificateur.IdClient, TypeCLF.Commande);

                if (copieLignes)
                {
                    // la dernière commande doit exister et être envoyée
                    if (dernièreCommande == null || !dernièreCommande.Date.HasValue)
                    {
                        return(RésultatBadRequest("DerniereCommandeAbsenteOuPasEnvoyée"));
                    }
                    docACopier = dernièreCommande;
                }
                else
                {
                    // la dernière commande doit ne pas exister ou être envoyée.
                    if (!(dernièreCommande == null || dernièreCommande.Date.HasValue))
                    {
                        return(RésultatBadRequest("DerniereCommandePrésenteEtPasEnvoyée"));
                    }
                }
                noBon = dernièreCommande == null ? 1 : dernièreCommande.No + 1;
            }
            else
            {
                // key du bon virtuel du client
                KeyDocSansType key = new KeyDocSansType
                {
                    Id = vérificateur.IdClient,
                    No = 0
                };
                DocCLF bonVirtuel = await _service.DocCLFDeKey(key, _type);

                if (bonVirtuel != null)
                {
                    // il ne peut y avoir qu'un seul bon virtuel d'un type donné
                    return(RésultatBadRequest("BonVirtuelPrésent"));
                }
                if (copieLignes)
                {
                    // on ne peut copier les lignes que si la synthèse précédente a été réalisée à partir du seul bon virtuel
                    // c'est le cas s'il n'y a pas de bon ayant pour NoGroupe le No de cette synthèse
                    docACopier = await _service.DernierDoc(vérificateur.IdClient, DocCLF.TypeSynthèse(_type));

                    if (docACopier == null)
                    {
                        return(RésultatBadRequest("PasDeDernièreSynthèse"));
                    }
                    if (!(await _service.EstSynthèseSansBons(docACopier)))
                    {
                        return(RésultatBadRequest("DernièreSynthèseAvecBons"));
                    }
                }
                noBon = 0;
            }

            RetourDeService <DocCLF> retour = await _service.AjouteBon(vérificateur.IdClient, vérificateur.Site, _type, noBon);

            if (!retour.Ok)
            {
                return(SaveChangesActionResult(retour));
            }

            if (docACopier != null)
            {
                RetourDeService retour1 = await _service.CopieLignes(retour.Entité, docACopier, vérificateur.Site.DateCatalogue.Value);

                if (!retour1.Ok)
                {
                    return(SaveChangesActionResult(retour1));
                }
            }

            return(RésultatCréé(CLFDoc.DeNo(noBon)));
        }
Ejemplo n.º 19
0
        /// <summary>
        /// Crée un document à envoyer avec la key, la Date, les lignes avec AFixer.
        /// </summary>
        /// <param name="docCLF">document dans la bdd</param>
        /// <returns></returns>
        public static CLFDoc AvecLignesAvecAFixer(DocCLF docCLF)
        {
            CLFDoc clfDoc = CLFDoc.AvecLignes(docCLF, CLFLigneData.LigneDataAvecAFixer);

            return(clfDoc);
        }
Ejemplo n.º 20
0
        /// <summary>
        /// Crée un document de synthèse à partir des documents d'un client dont le No est dans une liste.
        /// L'objet retourné contient un DocCLF contenant uniquement le No et la Date de la synthèse créée.
        /// Retourne une erreur si l'un des documents n'est pas à synthétiser.
        /// </summary>
        /// <param name="paramsSynthèse">contient l'Id du client et la liste des No des documents à synthétiser</param>
        /// <returns></returns>
        protected async Task <IActionResult> Synthèse(ParamsSynthèse paramsSynthèse)
        {
            vérificateur.Initialise(paramsSynthèse.Id);
            try
            {
                await ClientDeLAction();
                await UtilisateurEstFournisseur();

                ContexteCatalogue();
            }
            catch (VérificationException)
            {
                return(vérificateur.Erreur);
            }

            if (paramsSynthèse.NoDocs == null || paramsSynthèse.NoDocs.Count == 0)
            {
                return(RésultatBadRequest("PasDeNosDeDocuments"));
            }

            // Lit la liste des documents synthétisables dont le No est dans la liste.
            List <DocCLF> docs = await _service.DocumentsEnvoyésSansSynthèse(paramsSynthèse, DocCLF.TypeBon(_type));

            if (docs.Count != paramsSynthèse.NoDocs.Count)
            {
                // L'un des No de la liste ne correspond pas à un document synthétisable.
                return(RésultatBadRequest("DocumentsPasEnvoyésOuAvecSynthèse"));
            }

            RetourDeService <DocCLF> retour = await _service.Synthèse(vérificateur.Site, paramsSynthèse.Id, docs, _type);

            if (retour.Ok)
            {
                return(Ok(retour.Entité));
            }

            return(SaveChangesActionResult(retour));
        }
Ejemplo n.º 21
0
        /// <summary>
        /// Crée un nouveau Client et si il y a un ancien Client attribue ses archives et ses documents au client créé.
        /// </summary>
        /// <param name="idSite">Id du Site</param>
        /// <param name="idUtilisateur">Id de l'Utilisateur</param>
        /// <param name="vue">Données du Client à créer</param>
        /// <param name="clientInvité">Client créé par le fournisseur que le nouveau Client va prendre en charge</param>
        /// <returns></returns>
        public async Task <RetourDeService> CréeClient(uint idSite, string idUtilisateur, IClientData vue, Client clientInvité)
        {
            // on crée le Client
            Client client = new Client
            {
                UtilisateurId = idUtilisateur,
                SiteId        = idSite,
                Etat          = EtatRole.Nouveau
            };

            Client.CopieData(vue, client);
            if (clientInvité == null)
            {
                // il n'y a ni archives ni documents à récupérer
                // on ajoute aux tables Client et ArchiveClient
                return(await Ajoute(client));
            }

            // il y a des archives et peut-être des documents à réattribuer
            // on ajoute seulement à la table Client (sans utiliser Ajoute)
            _context.Client.Add(client);
            RetourDeService <Client> retour = await SaveChangesAsync(client);

            if (!retour.Ok)
            {
                return(retour);
            }

            // on doit attribuer au client créé les archives du Client existant
            List <ArchiveClient> archives = await _context.ArchiveClient
                                            .Where(a => a.Id == clientInvité.Id)
                                            .ToListAsync();

            archives = archives
                       .Select(a => ArchiveClient.Clone(client.Id, a))
                       .ToList();
            // et ajouter une archive enregistrant le passage à l'état Nouveau
            ArchiveClient archive = new ArchiveClient
            {
                Id   = client.Id,
                Etat = EtatRole.Nouveau,
                Date = DateTime.Now
            };

            archives.Add(archive);
            _context.ArchiveClient.AddRange(archives);

            // on doit attribuer au client créé les documents et les lignes du client existant et supprimer celui-ci
            List <DocCLF> anciensDocs = await _context.Docs
                                        .Where(d => d.Id == clientInvité.Id)
                                        .ToListAsync();

            // s'il n'y a pas de documents, il n'y a rien à réattribuer
            if (anciensDocs.Count != 0)
            {
                List <LigneCLF> anciennesLignes = await _context.Lignes
                                                  .Where(l => l.Id == clientInvité.Id)
                                                  .ToListAsync();

                // s'il n'y a pas de lignes, il n'y a rien à réattribuer
                if (anciennesLignes.Count != 0)
                {
                    List <DocCLF> nouveauxDocs = anciensDocs
                                                 .Select(d => DocCLF.Clone(client.Id, d))
                                                 .ToList();
                    List <LigneCLF> nouvellesLignes = anciennesLignes
                                                      .Select(l => LigneCLF.Clone(client.Id, l))
                                                      .ToList();
                    _context.Docs.AddRange(nouveauxDocs);
                    var r = await SaveChangesAsync();

                    if (r.Ok)
                    {
                        _context.Lignes.AddRange(nouvellesLignes);
                        r = await SaveChangesAsync();
                    }
                }
            }

            // supprime l'ancien client et en cascade ses archives, ses documents et ses lignes
            SupprimeSansSauver(clientInvité);
            _context.Client.Remove(clientInvité);
            await SaveChangesAsync();

            return(retour);
        }