public ActionResult Creer_ordre(DateTime date_provisoire, List <int> listmission, int id_marche)
 {
     if (User.Identity.GetUserId() == dbmetier.Marché.Where(a => a.id_marché == id_marche).Select(a => a.id_responsable_fk).FirstOrDefault())
     {
         Marché        marche        = dbmetier.Marché.Find(id_marche);
         Ordre_service ordre_service = new Ordre_service
         {
             date_debut_ordre       = System.DateTime.Now,
             date_provisoire        = date_provisoire,
             id_projet_ordreservice = marche.Projet.id_projet,
             etat_reception         = false,
             etat_facturation       = false,
         };
         dbmetier.Ordre_service.Add(ordre_service);
         dbmetier.SaveChanges();
         foreach (var item in listmission)
         {
             Mission mission = new Mission();
             mission = dbmetier.Missions.Find(item);
             mission.date_debut_mission = System.DateTime.Now;
             mission.id_ordreservice_fk = ordre_service.id_ordre_service;
         }
         dbmetier.SaveChanges();
     }
     return(RedirectToAction("Dashboardresp", new { id_marche = id_marche }));
 }
        public ActionResult facturation(int id_ordre)
        {
            Ordre_service ordre = dbmetier.Ordre_service.Find(id_ordre);

            ordre.etat_facturation = true;
            dbmetier.SaveChanges();
            return(null);
        }
        public ActionResult reception(int id_ordre)
        {
            Ordre_service ordre = dbmetier.Ordre_service.Find(id_ordre);

            ordre.etat_reception = true;
            ordre.date_fin_ordre = System.DateTime.Now;
            dbmetier.SaveChanges();
            return(RedirectToAction("Dashboardresp"));
        }
        public ActionResult ajouterMission(MVM mission, int id_ordre, int id_marche)
        {
            //ajout de domaine
            int           budget_mission = 0, budget_restant = 0;
            Participation par = dbmetier.Participations.Where(a => a.id_marché_participation == id_marche).First();
            ICollection <Participation_profil> listparti = par.Participation_profil;

            foreach (var item in mission.listeprofils)
            {
                budget_mission += item.charge * (int)listparti.Where(a => a.Profil.libelle_profil == item.libelle).Select(a => a.cout_unit_ht).FirstOrDefault();
            }

            Participation participation = dbmetier.Participations.Where(a => a.id_marché_participation == id_marche).FirstOrDefault();
            Marché        marche        = dbmetier.Marché.Find(id_marche);

            budget_restant = (int)participation.budget_prestation - (int)marche.montant_total;
            if (budget_mission <= budget_restant)
            {
                marche.montant_total += budget_mission;
                Ordre_service ordre = dbmetier.Ordre_service.Find(id_ordre);
                ordre.date_modification = System.DateTime.Now;
                Domaine domaine = dbmetier.Domaines.Where(x => x.libelle_domaine == mission.mission.Domaine.libelle_domaine).FirstOrDefault();
                Mission mision  = new Mission
                {
                    libelle_mission       = mission.mission.libelle_mission,
                    id_domaine_mission_fk = domaine.id_domaine,
                    id_marche_mission     = marche.id_marché
                    ,
                    id_ordreservice_fk = ordre.id_ordre_service
                };
                dbmetier.Missions.Add(mision);
                dbmetier.SaveChanges();
                foreach (var profillib in mission.listeprofils)
                {
                    Profil prof = dbmetier.Profils.Where(x => x.libelle_profil == profillib.libelle).FirstOrDefault();
                    Affectation_profils afectation = new Affectation_profils
                    {
                        id_mission_affectation = mision.id_mission,
                        id_profils_affectation = prof.id_profil,
                        charge_profil          = profillib.charge
                    };
                    dbmetier.Affectation_profils.Add(afectation);
                    dbmetier.SaveChanges();
                }
            }

            return(null);
        }
        public ActionResult ajouteMission(int id_ordre, List <int> listmission, int id_marche)
        {
            if (User.Identity.GetUserId() == dbmetier.Marché.Where(a => a.id_marché == id_marche).Select(a => a.id_responsable_fk).FirstOrDefault())
            {
                Ordre_service ordre = dbmetier.Ordre_service.Find(id_ordre);

                foreach (var item in listmission)
                {
                    Mission mission = new Mission();
                    mission = dbmetier.Missions.Find(item);
                    mission.id_ordreservice_fk = ordre.id_ordre_service;
                }
                dbmetier.SaveChanges();
            }
            return(RedirectToAction("Dashboardresp", new { id_marche = id_marche }));
        }
        public ActionResult fin_Mission(int id_marche, int id_mission)
        {
            Mission mission = dbmetier.Missions.Find(id_mission);

            mission.date_fin_mission = System.DateTime.Now;
            Ordre_service ordre       = dbmetier.Ordre_service.Find(mission.Ordre_service.id_ordre_service);
            bool          isrecptione = true;

            foreach (var item in ordre.Missions)
            {
                if (item.date_fin_mission == null)
                {
                    isrecptione = false;
                }
            }
            if (isrecptione == true)
            {
                ordre.etat_reception = true;
                ordre.date_fin_ordre = mission.date_fin_mission;
            }
            dbmetier.SaveChanges();
            return(RedirectToAction("Dashboardresp", new { id_marche = id_marche }));;
        }
        public ActionResult Dashboardresp(int id_marche)
        {
            int             totale_mission;
            IList <Mission> list_desmission_encour    = new List <Mission>();
            IList <Mission> list_desmission_nonlances = new List <Mission>();
            IList <Mission> list_desmission_complete  = new List <Mission>();
            IList <Mission> list_desmission_annule    = new List <Mission>();
            IList <Mission> list_desmission           = dbmetier.Missions.Where(a => a.id_marche_mission == id_marche).ToList();

            foreach (var item in list_desmission)
            {
                if (item.Ordre_service == null)
                {
                    list_desmission_nonlances.Add(item);
                }
                else
                {
                    if (item.Affectation_profils.Count == 0)
                    {
                        list_desmission_annule.Add(item);
                    }
                    if (etat_ordre_service(item.id_ordreservice_fk) == true && item.Affectation_profils.Count != 0)
                    {
                        list_desmission_complete.Add(item);
                    }
                    if (etat_ordre_service(item.id_ordreservice_fk) == false && item.Affectation_profils.Count != 0)
                    {
                        list_desmission_encour.Add(item);
                    }
                }
                ViewBag.list_desmission_nonlances = list_desmission_nonlances;
                ViewBag.list_desmission_complete  = list_desmission_complete;
                ViewBag.list_desmission_encour    = list_desmission_encour;
                ViewBag.list_desmission_annule    = list_desmission_annule;
            }
            totale_mission = list_desmission.Count;
            if (totale_mission != 0)
            {
                ViewBag.pourcentage_nonlances = ((double)list_desmission_nonlances.Count / totale_mission) * 100;
                ViewBag.pourcentage_complete  = ((double )list_desmission_complete.Count / totale_mission) * 100;
                ViewBag.pourcentage_encour    = ((double)list_desmission_encour.Count / totale_mission) * 100;
                ViewBag.pourcentage_annulle   = ((double)list_desmission_annule.Count / totale_mission) * 100;
            }
            int nombre_res = 0, nombre_non = 0;

            IList <Ordre_service> liste_ordre = dbmetier.Marché.Find(id_marche).Projet.Ordre_service.ToList();

            foreach (var item in liste_ordre)
            {
                if (item.etat_reception == true)
                {
                    nombre_res++;
                }
                else
                {
                    nombre_non++;
                }
            }
            ViewBag.pourcentage_ordre_recep     = nombre_res;
            ViewBag.pourcentage_cordre_nonrecep = nombre_non;
            // ordre de service
            IList <Ordre_service> list_ordre  = new List <Ordre_service>();
            //listmision view model
            List <MVM> listMissionVM          = new List <MVM>();
            MVM        element                = new MVM();

            foreach (var item in list_desmission)
            {
                Ordre_service ordre = dbmetier.Ordre_service.Where(a => a.id_ordre_service == item.id_ordreservice_fk).FirstOrDefault();
                if (!list_ordre.Contains(ordre) && ordre != null)
                {
                    list_ordre.Add(ordre);
                }
            }
            Marché marche           = dbmetier.Marché.Find(id_marche);
            int    id_participation = dbmetier.Participations.Where(a => a.id_prestataire_participation == marche.id_prestataire_final && a.id_marché_participation == marche.id_marché).Select(a => a.id_participation).FirstOrDefault();

            // on peut creer un liste de misiion non affecte a un ordre de service ici.
            foreach (var item in list_desmission)
            {
                int cout, cout_totale = 0;
                List <Affectation_profils> listaffectations = dbmetier.Affectation_profils.Where(a => a.id_mission_affectation == item.id_mission).ToList();

                foreach (var item2 in listaffectations)
                {
                    cout         = (int)dbmetier.Participation_profil.Where(a => a.id_profil_fk == item2.Profil.id_profil && a.id_participation_fk == id_participation).Select(a => a.cout_unit_ht).FirstOrDefault();
                    cout_totale += cout * (int)item2.charge_profil;
                }
                element = new MVM {
                    mission = item, cout = cout_totale
                };
                listMissionVM.Add(element);
            }
            ViewBag.listmission = listMissionVM;
            ViewBag.listeordre  = list_ordre;
            ViewBag.Marche      = marche;
            ViewBag.prestataire = dbmetier.prestataires.Find(marche.id_prestataire_final);
            var listedomaines = dbmetier.Domaines.ToList();

            ViewBag.listedomaines = new SelectList(listedomaines, "libelle_domaine", "libelle_domaine");
            var listProfils = dbmetier.Marché.Find(id_marche).Participations.Where(a => a.id_prestataire_participation == marche.id_prestataire_final).FirstOrDefault().Participation_profil.ToList().Select(a => a.Profil);

            ViewBag.listeProfils = new SelectList(listProfils, "libelle_profil", "libelle_profil");
            return(View());
        }
        // cette fonction doit etre la couche metier de mission
        public bool?etat_ordre_service(int id)
        {
            Ordre_service ordre = dbmetier.Ordre_service.Find(id);

            return(ordre.etat_reception);
        }