/// <summary>
 /// 更新情報の設定
 /// </summary>
 /// <param name="target">設定対象</param>
 /// <param name="source">設定元</param>
 private void SetUpdateInfo(T_DailyClasses target, T_DailyClasses source)
 {
     // publicのメンバー変数を取得
     PropertyInfo[] propertyArray = source.GetType().GetProperties();
     foreach (PropertyInfo property in propertyArray)
     {
         // 日付はスキップ
         if ("Date".Equals(property.Name))
         {
             continue;
         }
         // 対象項目を設定
         property.SetValue(target, property.GetValue(source));
     }
 }
        /// <summary>
        /// 更新表示
        /// </summary>
        /// <param name="dailyParameterEdt">日別予測条件編集情報</param>
        /// <returns></returns>
        public ActionResult Edit([Bind(Include = "SearchDate")] V_DailyParameterEdt dailyParameterEdt)
        {
            Trace.WriteLine("GET /DailyParameter/Edit/" + dailyParameterEdt.SearchDate);

            // ステータスをクリア
            ModelState.Clear();

            // インスタンスを生成
            dailyParameterEdt.DailyClasses = new T_DailyClasses();
            dailyParameterEdt.TrainerList  = new List <T_DailyClassesByTrainer>();

            if (dailyParameterEdt.SearchDate != null)
            {
                // 日別予測条件を取得
                T_DailyClasses dailyClasses = db.DailyClasses.Find(dailyParameterEdt.SearchDate);
                // データが存在しない場合はインスタンスを生成
                if (dailyClasses == null)
                {
                    dailyClasses = new T_DailyClasses()
                    {
                        Date = dailyParameterEdt.SearchDate
                    };
                }
                dailyParameterEdt.DailyClasses = dailyClasses;
                // 更新日付Toを設定
                dailyParameterEdt.UpdateTo = dailyClasses.Date;

                // 指導員コマ数を取得
                dailyParameterEdt.TrainerList = db.DailyClassesByTrainer.Where(x => ((DateTime)x.Date).Equals((DateTime)dailyParameterEdt.SearchDate)).OrderBy(x => x.No).ToList();
            }
            else
            {
                ViewBag.SearchErrorMessage = "検索条件を指定してください。";
            }

            // 指導員コマ管理画面から遷移するための検索日付をTempDataに設定
            TempData[AppConstant.TEMP_KEY_SEARCH_DATE] = dailyParameterEdt.SearchDate;

            return(View(dailyParameterEdt));
        }
示例#3
0
        /// <summary>
        /// グラフデータ取得(予測値算出ロジック)
        /// </summary>
        /// <param name="db">DBコンテキスト</param>
        /// <param name="dateFrom">日付From</param>
        /// <param name="dateTo">日付To</param>
        /// <param name="targetTraineeLodging">合宿教習生情報(登録/更新時)</param>
        /// <param name="targetTraineeCommuting">通学教習生情報(登録/更新時)</param>
        /// <returns>グラフデータ</returns>
        public List <V_ChartData> GetChartData(MyDatabaseContext db, DateTime dateFrom, DateTime dateTo
                                               , List <T_TraineeLodging> targetTraineeLodging, T_TraineeCommuting targetTraineeCommuting)
        {
            List <V_ChartData> chartData = new List <V_ChartData>();

            /*
             * [処理説明]
             * 繰り返し処理の開始を日曜、終了を土曜にするため、
             * 「日付Fromの直近の日曜」と「日付Toの直後の土曜」を取得する。
             * DayOfWeek:日曜=0~土曜=6
             * [目的]
             * 週平均の在籍可能数を算出するため、検索範囲外の日曜~土曜の範囲で算出する必要がある。
             */
            // 日付Fromの直近の日曜を取得
            DateTime sunFrom = dateFrom.AddDays(-1 * (int)dateFrom.DayOfWeek);
            // 日付Toの直後の土曜を取得
            DateTime satTo = dateTo.AddDays((int)DayOfWeek.Saturday - (int)dateTo.DayOfWeek);

            // 合宿教習生の取得
            List <T_TraineeLodging> traineeLodging;

            // 引数の教習生がnullの場合(受入予測管理)
            if (targetTraineeLodging == null)
            {
                // 対象期間の教習生データを全て取得
                traineeLodging = db.TraineeLodging.Where(
                    x => x.CancelFlg == false &&
                    (sunFrom <= x.EntrancePlanDate && x.EntrancePlanDate <= satTo ||
                     sunFrom <= x.GraduatePlanDate && x.GraduatePlanDate <= satTo ||
                     x.EntrancePlanDate < sunFrom && satTo < x.GraduatePlanDate)).ToList();
            }
            // 引数の教習生がnullでない場合(教習生管理(登録/更新))
            else
            {
                // 0以外の教習生IDを取得
                List <int> traineeIdList = targetTraineeLodging.Where(x => !x.TraineeId.Equals(0)).Select(x => x.TraineeId).ToList();
                // 対象教習生ID以外を取得
                traineeLodging = db.TraineeLodging.Where(
                    x => !traineeIdList.Contains(x.TraineeId) &&
                    x.CancelFlg == false &&
                    (sunFrom <= x.EntrancePlanDate && x.EntrancePlanDate <= satTo ||
                     sunFrom <= x.GraduatePlanDate && x.GraduatePlanDate <= satTo ||
                     x.EntrancePlanDate < sunFrom && satTo < x.GraduatePlanDate)).ToList();
                // 対象教習生を追加
                traineeLodging.AddRange(targetTraineeLodging.Where(x => x.CancelFlg == false));
            }

            // 通学教習生の取得
            List <T_TraineeCommuting> traineeCommuting;

            // 引数の教習生がnullの場合(受入予測管理)
            if (targetTraineeCommuting == null)
            {
                // 対象期間の教習生データを全て取得
                traineeCommuting = db.TraineeCommuting.Where(
                    x => x.CancelFlg == false &&
                    sunFrom <= x.EntrancePlanDate && x.EntrancePlanDate <= satTo ||
                    sunFrom <= x.GraduatePlanDate && x.GraduatePlanDate <= satTo ||
                    x.EntrancePlanDate < sunFrom && satTo < x.GraduatePlanDate).ToList();
            }
            // 引数の教習生がnullでない場合(教習生管理(登録/更新))
            else
            {
                // 対象教習生IDを取得
                int traineeId = targetTraineeCommuting.TraineeId;
                // 対象教習生ID以外を取得
                traineeCommuting = db.TraineeCommuting.Where(
                    x => !x.TraineeId.Equals(traineeId) &&
                    x.CancelFlg == false &&
                    (sunFrom <= x.EntrancePlanDate && x.EntrancePlanDate <= satTo ||
                     sunFrom <= x.GraduatePlanDate && x.GraduatePlanDate <= satTo ||
                     x.EntrancePlanDate < sunFrom && satTo < x.GraduatePlanDate)).ToList();
                // 対象教習生を追加
                if (targetTraineeCommuting.CancelFlg == false)
                {
                    traineeCommuting.Add(targetTraineeCommuting);
                }
            }

            // 対象期間の日別コマ数データを取得
            List <T_DailyClasses> dailyClassesList = db.DailyClasses.Where(x => sunFrom <= x.Date && x.Date <= satTo).ToList();
            // 対象期間の指導員データを取得
            List <T_DailyClassesByTrainer> trainerList = db.DailyClassesByTrainer.Where(x => x.Date >= sunFrom && x.Date <= satTo).ToList();

            // 受入可能人数/期間
            double acceptLodgingMaxAmt   = 0;
            double acceptCommutingMaxAmt = 0;
            // 受入累積数
            Dictionary <DateTime, int> acceptLodgingTotalAmtDic   = new Dictionary <DateTime, int>();
            Dictionary <DateTime, int> acceptCommutingTotalAmtDic = new Dictionary <DateTime, int>();
            // 在籍可能数/週
            double weeklyLodgingSumAmt   = 0;
            double weeklyCommutingSumAmt = 0;
            // 在籍可能数/日(週平均)
            Dictionary <DateTime, double> dailyLodgingMaxAmtDic   = new Dictionary <DateTime, double>();
            Dictionary <DateTime, double> dailyCommutingMaxAmtDic = new Dictionary <DateTime, double>();
            // 残コマ数/日
            double dailyRemClasses = 0;
            // 残コマ数/週
            double weeklyRemClasses = 0;
            Dictionary <DateTime, double> weeklyRemClassesDic = new Dictionary <DateTime, double>();

            for (DateTime day = sunFrom; day <= satTo; day = day.AddDays(1))
            {
                // 日別予測条件
                T_DailyClasses dailyClasses = dailyClassesList.Where(x => ((DateTime)x.Date).Equals(day)).FirstOrDefault();
                if (dailyClasses == null)
                {
                    dailyClasses = new T_DailyClasses()
                    {
                        Date = day
                    };
                }
                // 総コマ数/日
                double dailySumClasses = trainerList.Where(x => x.Date.Equals(day)).Select(x => x.Classes).Sum();

                // [20210416リリース対応] Add Start 各業務の割合から実車教習コマ数を算出
                // 実車教習総コマ数/日の算出
                dailySumClasses = ((100 - (dailyClasses.DepartExamRatio + dailyClasses.OtherVehicleRatio + dailyClasses.SeminarRatio + dailyClasses.OtherRatio)) / 100) * dailySumClasses;
                // [20210416リリース対応] Add End

                // --------------------
                // 在籍可能数/日
                // --------------------
                // ①-1.【合宿】教習生一人が実車教習に必要なコマ数/日
                //     = 合宿生のAT一段階コマ数/日 × 合宿生のAT一段階比率[%] ÷ 100 + 合宿生のAT二段階コマ数/日 × 合宿生のAT二段階比率[%] ÷ 100
                //       + 合宿生のMT一段階コマ数/日 × 合宿生のMT一段階比率[%] ÷ 100 + 合宿生のMT二段階コマ数/日 × 合宿生のMT二段階比率[%] ÷ 100
                double ldgDailyReqClasses = dailyClasses.LdgAtFstClassDay * dailyClasses.LdgAtFstRatio / 100 + dailyClasses.LdgAtSndClassDay * dailyClasses.LdgAtSndRatio / 100
                                            + dailyClasses.LdgMtFstClassDay * dailyClasses.LdgMtFstRatio / 100 + dailyClasses.LdgMtSndClassDay * dailyClasses.LdgMtSndRatio / 100;
                // ①-2.【通学】教習生一人が実車教習に必要なコマ数/日
                //     = 通学生のAT一段階コマ数/日 × 通学生のAT一段階比率[%] ÷ 100 + 通学生のAT二段階コマ数/日 × 通学生のAT二段階比率[%] ÷ 100
                //       + 通学生のMT一段階コマ数/日 × 通学生のMT一段階比率[%] ÷ 100 + 通学生のMT二段階コマ数/日 × 通学生のMT二段階比率[%] ÷ 100
                double cmtDailyReqClasses = dailyClasses.CmtAtFstClassDay * dailyClasses.CmtAtFstRatio / 100 + dailyClasses.CmtAtSndClassDay * dailyClasses.CmtAtSndRatio / 100
                                            + dailyClasses.CmtMtFstClassDay * dailyClasses.CmtMtFstRatio / 100 + dailyClasses.CmtMtSndClassDay * dailyClasses.CmtMtSndRatio / 100;

                // ②-1.【合宿】在籍可能人数/日  ※①-1が0の場合は算出しない
                if (ldgDailyReqClasses != 0)
                {
                    // 週合計に加算
                    weeklyLodgingSumAmt += (dailySumClasses / ldgDailyReqClasses) * (dailyClasses.LodgingRatio / 100);
                }
                // ②-2.【通学】在籍可能人数/日  ※①-2が0の場合は算出しない
                if (cmtDailyReqClasses != 0)
                {
                    // 週合計に加算
                    weeklyCommutingSumAmt += (dailySumClasses / cmtDailyReqClasses) * (dailyClasses.CommutingRatio / 100);
                }

                // --------------------
                // 在籍数
                // --------------------
                // 合宿在籍数(MT-一段階)(教習がMTかつ、入校予定日が対象日以上かつ、仮免予定日が対象日未満)
                int lodgingMtFstRegAmt =
                    traineeLodging.Where(
                        x => x.TrainingCourseCd.Equals(AppConstant.TRAINING_COURSE_CD_MT) &&
                        x.EntrancePlanDate <= day && day < x.TmpLicencePlanDate).Count();
                // [20210205リリース対応] Mod Start 卒業日以下を卒業日未満に修正
                //// 合宿在籍数(MT-二段階)(教習がMTかつ、仮免予定日が対象日以上かつ、卒業予定日が対象日以下)
                //int lodgingMtSndRegAmt =
                //    traineeLodging.Where(
                //        x => x.TrainingCourseCd.Equals(AppConstant.TRAINING_COURSE_CD_MT)
                //        && x.TmpLicencePlanDate <= day && day <= x.GraduatePlanDate).Count();
                // 合宿在籍数(MT-二段階)(教習がMTかつ、仮免予定日が対象日以上かつ、卒業予定日が対象日未満)
                int lodgingMtSndRegAmt =
                    traineeLodging.Where(
                        x => x.TrainingCourseCd.Equals(AppConstant.TRAINING_COURSE_CD_MT) &&
                        x.TmpLicencePlanDate <= day && day < x.GraduatePlanDate).Count();
                // [20210205リリース対応] Mod End
                // [20210205リリース対応] Del Start
                //// 合宿在籍数(MT-二段階)(教習がMTかつ、仮免予定日が対象日以上かつ、卒業予定日が対象日未満)※卒業予定者を含まない
                //int lodgingMtRegAmtExceptGraduate =
                //    traineeLodging.Where(
                //        x => x.TrainingCourseCd.Equals(AppConstant.TRAINING_COURSE_CD_MT)
                //        && x.TmpLicencePlanDate <= day && day < x.GraduatePlanDate).Count();
                // [20210205リリース対応] Del End
                // 合宿在籍数(AT-一段階)(教習がATかつ、入校予定日が対象日以上かつ、仮免予定日が対象日未満)
                int lodgingAtFstRegAmt =
                    traineeLodging.Where(
                        x => x.TrainingCourseCd.Equals(AppConstant.TRAINING_COURSE_CD_AT) &&
                        x.EntrancePlanDate <= day && day < x.TmpLicencePlanDate).Count();
                // [20210205リリース対応] Mod Start 卒業日以下を卒業日未満に修正
                //// 合宿在籍数(AT-二段階)(教習がATかつ、仮免予定日が対象日以上かつ、卒業予定日が対象日以下)
                //int lodgingAtSndRegAmt =
                //    traineeLodging.Where(
                //        x => x.TrainingCourseCd.Equals(AppConstant.TRAINING_COURSE_CD_AT)
                //        && x.TmpLicencePlanDate <= day && day <= x.GraduatePlanDate).Count();
                // 合宿在籍数(AT-二段階)(教習がATかつ、仮免予定日が対象日以上かつ、卒業予定日が対象日未満)
                int lodgingAtSndRegAmt =
                    traineeLodging.Where(
                        x => x.TrainingCourseCd.Equals(AppConstant.TRAINING_COURSE_CD_AT) &&
                        x.TmpLicencePlanDate <= day && day < x.GraduatePlanDate).Count();
                // [20210205リリース対応] Mod End
                // [20210205リリース対応] Del Start
                //// 合宿在籍数(AT-二段階)(教習がATかつ、仮免予定日が対象日以上かつ、卒業予定日が対象日未満)※卒業予定者を含まない
                //int lodgingAtRegAmtExceptGraduate =
                //    traineeLodging.Where(
                //        x => x.TrainingCourseCd.Equals(AppConstant.TRAINING_COURSE_CD_AT)
                //        && x.TmpLicencePlanDate <= day && day < x.GraduatePlanDate).Count();
                // [20210205リリース対応] Del End
                // 通学在籍数(MT-一段階)(教習がMTかつ、入校予定日が対象日以上かつ、仮免予定日が対象日未満)
                int commutingMtFstRegAmt =
                    traineeCommuting.Where(
                        x => x.TrainingCourseCd.Equals(AppConstant.TRAINING_COURSE_CD_MT) &&
                        x.EntrancePlanDate <= day && day < x.TmpLicencePlanDate).Count();
                // [20210205リリース対応] Mod Start 卒業日以下を卒業日未満に修正
                //// 通学在籍数(MT-二段階)(教習がMTかつ、仮免予定日が対象日以上かつ、卒業予定日が対象日以下)
                //int commutingMtSndRegAmt =
                //    traineeCommuting.Where(
                //        x => x.TrainingCourseCd.Equals(AppConstant.TRAINING_COURSE_CD_MT)
                //        && x.TmpLicencePlanDate <= day && day <= x.GraduatePlanDate).Count();
                // 通学在籍数(MT-二段階)(教習がMTかつ、仮免予定日が対象日以上かつ、卒業予定日が対象日未満)
                int commutingMtSndRegAmt =
                    traineeCommuting.Where(
                        x => x.TrainingCourseCd.Equals(AppConstant.TRAINING_COURSE_CD_MT) &&
                        x.TmpLicencePlanDate <= day && day < x.GraduatePlanDate).Count();
                // [20210205リリース対応] Mod End
                // 通学在籍数(AT-一段階)(教習がATかつ、入校予定日が対象日以上かつ、仮免予定日が対象日未満)
                int commutingAtFstRegAmt =
                    traineeCommuting.Where(
                        x => x.TrainingCourseCd.Equals(AppConstant.TRAINING_COURSE_CD_AT) &&
                        x.EntrancePlanDate <= day && day < x.TmpLicencePlanDate).Count();
                // [20210205リリース対応] Mod Start 卒業日以下を卒業日未満に修正
                //// 通学在籍数(AT-二段階)(教習がATかつ、仮免予定日が対象日以上かつ、卒業予定日が対象日以下)
                //int commutingAtSndRegAmt =
                //    traineeCommuting.Where(
                //        x => x.TrainingCourseCd.Equals(AppConstant.TRAINING_COURSE_CD_AT)
                //        && x.TmpLicencePlanDate <= day && day <= x.GraduatePlanDate).Count();
                // 通学在籍数(AT-二段階)(教習がATかつ、仮免予定日が対象日以上かつ、卒業予定日が対象日未満)
                int commutingAtSndRegAmt =
                    traineeCommuting.Where(
                        x => x.TrainingCourseCd.Equals(AppConstant.TRAINING_COURSE_CD_AT) &&
                        x.TmpLicencePlanDate <= day && day < x.GraduatePlanDate).Count();
                // [20210205リリース対応] Mod End

                // --------------------
                // 当日の合宿生消化コマ数
                // --------------------
                // [20210205リリース対応] Mod Start 卒業日以下をlodgingMtSndRegAmt/lodgingAtSndRegAmtに統一
                //// 合宿生のMT一段階コマ数/日 × 合宿生のMT一段階在籍数
                //// + 合宿生のMT二段階コマ数/日 × 合宿生のMT二段階在籍数(卒業予定者を含まない)
                //// + 合宿生のAT一段階コマ数/日 × 合宿生のAT一段階在籍数
                //// + 合宿生のAT二段階コマ数/日 × 合宿生のAT二段階在籍数(卒業予定者を含まない)
                //double sumClasses =
                //    dailyClasses.LdgMtFstClassDay * lodgingMtFstRegAmt
                //    + dailyClasses.LdgMtSndClassDay * lodgingMtRegAmtExceptGraduate
                //    + dailyClasses.LdgAtFstClassDay * lodgingAtFstRegAmt
                //    + dailyClasses.LdgAtSndClassDay * lodgingAtRegAmtExceptGraduate;

                // 合宿生のMT一段階コマ数/日 × 合宿生のMT一段階在籍数
                // + 合宿生のMT二段階コマ数/日 × 合宿生のMT二段階在籍数
                // + 合宿生のAT一段階コマ数/日 × 合宿生のAT一段階在籍数
                // + 合宿生のAT二段階コマ数/日 × 合宿生のAT二段階在籍数
                double sumClasses =
                    dailyClasses.LdgMtFstClassDay * lodgingMtFstRegAmt
                    + dailyClasses.LdgMtSndClassDay * lodgingMtSndRegAmt
                    + dailyClasses.LdgAtFstClassDay * lodgingAtFstRegAmt
                    + dailyClasses.LdgAtSndClassDay * lodgingAtSndRegAmt;
                // [20210205リリース対応] Mod End
                // 残コマ数/日
                dailyRemClasses = dailySumClasses - sumClasses;
                // 残コマ数/週
                weeklyRemClasses += dailyRemClasses;

                // 土曜の場合
                if (day.DayOfWeek.Equals(DayOfWeek.Saturday))
                {
                    // 過去7日分を繰り返し
                    for (DateTime tmpDay = day.AddDays(-6); tmpDay <= day; tmpDay = tmpDay.AddDays(1))
                    {
                        // 週平均の在籍可能数を設定(在籍可能数/週 ÷ 7)
                        dailyLodgingMaxAmtDic.Add(tmpDay, weeklyLodgingSumAmt / 7);
                        dailyCommutingMaxAmtDic.Add(tmpDay, weeklyCommutingSumAmt / 7);
                        // 対象の日付に残コマ数/週を設定
                        weeklyRemClassesDic.Add(tmpDay, weeklyRemClasses);
                    }

                    // 各変数をリセット
                    weeklyRemClasses      = 0; // 残コマ数/週
                    weeklyLodgingSumAmt   = 0; // 合宿在籍可能数/週
                    weeklyCommutingSumAmt = 0; // 通学在籍可能数/週
                }

                // 日付が検索範囲内の場合、グラフデータを生成
                if (dateFrom <= day && day <= dateTo)
                {
                    // --------------------
                    // 受入可能数/期間
                    // --------------------
                    // ①-1.【合宿】教習生一人が卒業までに必要なコマ数/日
                    //     = (合宿生のAT一段階コマ数 + 合宿生のAT二段階コマ数) × (合宿生のAT一段階比率[%] + 合宿生のAT二段階比率[%]) ÷ 100
                    //       + (合宿生のMT一段階コマ数 + 合宿生のMT二段階コマ数) × (合宿生のMT一段階比率[%] + 合宿生のMT二段階比率[%]) ÷ 100
                    double ldgTraineeReqClasses = (dailyClasses.LdgAtFstClass + dailyClasses.LdgAtSndClass) * (dailyClasses.LdgAtFstRatio + dailyClasses.LdgAtSndRatio) / 100
                                                  + (dailyClasses.LdgMtFstClass + dailyClasses.LdgMtSndClass) * (dailyClasses.LdgMtFstRatio + dailyClasses.LdgMtSndRatio) / 100;
                    // ①-2.【通学】教習生一人が卒業までに必要なコマ数/日
                    //     = (通学生のAT一段階コマ数 + 通学生のAT二段階コマ数) × (通学生のAT一段階比率[%] + 通学生のAT二段階比率[%]) ÷ 100
                    //       + (通学生のMT一段階コマ数 + 通学生のMT二段階コマ数) × (通学生のMT一段階比率[%] + 通学生のMT二段階比率[%]) ÷ 100
                    double cmtTraineeReqClasses = (dailyClasses.CmtAtFstClass + dailyClasses.CmtAtSndClass) * (dailyClasses.CmtAtFstRatio + dailyClasses.CmtAtSndRatio) / 100
                                                  + (dailyClasses.CmtMtFstClass + dailyClasses.CmtMtSndClass) * (dailyClasses.CmtMtFstRatio + dailyClasses.CmtMtSndRatio) / 100;

                    // ②-1.【合宿】受入可能人数/日を加算  ※①-1が0の場合は加算しない
                    if (ldgTraineeReqClasses != 0)
                    {
                        acceptLodgingMaxAmt += (dailySumClasses / ldgTraineeReqClasses) * (dailyClasses.LodgingRatio / 100);
                    }
                    // ②-2.【通学】受入可能人数/日を加算  ※①-2が0の場合は加算しない
                    if (cmtTraineeReqClasses != 0)
                    {
                        acceptCommutingMaxAmt += (dailySumClasses / cmtTraineeReqClasses) * (dailyClasses.CommutingRatio / 100);
                    }

                    // --------------------
                    // 受入累積数
                    // --------------------
                    // 前日までの受入累計数
                    int beforeLodgingTotalAmt   = acceptLodgingTotalAmtDic.ContainsKey(day.AddDays(-1)) ? acceptLodgingTotalAmtDic[day.AddDays(-1)] : 0;
                    int beforeCommutingTotalAmt = acceptCommutingTotalAmtDic.ContainsKey(day.AddDays(-1)) ? acceptCommutingTotalAmtDic[day.AddDays(-1)] : 0;
                    // 受入累積数を加算
                    acceptLodgingTotalAmtDic.Add(day, beforeLodgingTotalAmt + traineeLodging.Where(x => x.EntrancePlanDate.Equals(day)).Count());
                    acceptCommutingTotalAmtDic.Add(day, beforeCommutingTotalAmt + traineeCommuting.Where(x => x.EntrancePlanDate.Equals(day)).Count());

                    // グラフデータのインスタンスを生成
                    V_ChartData data = new V_ChartData {
                        Date = day
                    };

                    // --------------------
                    // 在籍数
                    // --------------------
                    // 合宿在籍数(MT-一段階)
                    data.LodgingMtFstRegAmt = lodgingMtFstRegAmt;
                    // 合宿在籍数(MT-二段階)
                    data.LodgingMtSndRegAmt = lodgingMtSndRegAmt;
                    // 合宿在籍数(AT-一段階)
                    data.LodgingAtFstRegAmt = lodgingAtFstRegAmt;
                    // 合宿在籍数(AT-二段階)
                    data.LodgingAtSndRegAmt = lodgingAtSndRegAmt;
                    // 通学在籍数(MT-一段階)
                    data.CommutingMtFstRegAmt = commutingMtFstRegAmt;
                    // 通学在籍数(MT-二段階)
                    data.CommutingMtSndRegAmt = commutingMtSndRegAmt;
                    // 通学在籍数(AT-一段階)
                    data.CommutingAtFstRegAmt = commutingAtFstRegAmt;
                    // 通学在籍数(AT-二段階)
                    data.CommutingAtSndRegAmt = commutingAtSndRegAmt;

                    // [20210205リリース対応] Add Start 総コマ数/日を追加
                    // --------------------
                    // 総コマ数/日
                    // --------------------
                    // 教習総コマ数/日
                    data.DailySumClasses = Math.Round(dailySumClasses, 1);
                    // [20210205リリース対応] Add End
                    // --------------------
                    // 残コマ数/日
                    // --------------------
                    // 教習総コマ数/日 - 消化コマ数/日
                    data.DailyRemClasses = Math.Round(dailyRemClasses, 1);

                    chartData.Add(data);
                }
            }

            chartData.ForEach(x => {
                // 受入残数を全てのデータに設定
                x.AcceptLodgingRemAmt   = Math.Round(acceptLodgingMaxAmt - acceptLodgingTotalAmtDic[x.Date], 1);
                x.AcceptCommutingRemAmt = Math.Round(acceptCommutingMaxAmt - acceptCommutingTotalAmtDic[x.Date], 1);
                // 在籍可能数/日の週平均を全てのデータに設定
                x.DailyLodgingMaxAmt   = Math.Round(dailyLodgingMaxAmtDic[x.Date], 1);
                x.DailyCommutingMaxAmt = Math.Round(dailyCommutingMaxAmtDic[x.Date], 1);
                // 残コマ数/週を全てのデータに設定
                x.WeeklyRemClasses = Math.Round(weeklyRemClassesDic[x.Date], 1);
            });

            return(chartData);
        }
示例#4
0
        public ActionResult Import(string cmd, HttpPostedFileBase postedFile, [Bind(Include = "Date,No,TrainerName,Classes")] List <T_DailyClassesByTrainer> importList)
        {
            Trace.WriteLine("POST /InstractorImport/Import");

            // 読込ボタンが押下された場合
            if (AppConstant.CMD_READ.Equals(cmd))
            {
                // ステータスをクリア
                ModelState.Clear();
                // 指導員コマ数クラスを初期化
                importList = new List <T_DailyClassesByTrainer>();

                if (postedFile != null)
                {
                    // 拡張子チェック
                    string extension = Path.GetExtension(postedFile.FileName);
                    if (!".csv".Equals(extension) && !".CSV".Equals(extension))
                    {
                        // エラーメッセージ
                        ViewBag.ErrorMessage = "ファイルはcsv形式を指定してください。";
                        return(View(importList));
                    }

                    // アップロード先ディレクトリ
                    string uploadDir = AppDomain.CurrentDomain.BaseDirectory + @"Uploads\";
                    // ディレクトリが存在しない場合は作成
                    if (!Directory.Exists(uploadDir))
                    {
                        Directory.CreateDirectory(uploadDir);
                    }

                    // ファイルをサーバーに保存
                    string filepath = uploadDir + Path.GetFileName(postedFile.FileName);
                    postedFile.SaveAs(filepath);

                    // 項目数
                    int itemCnt = 0;
                    // テキストを全行読み込み
                    using (StreamReader sr = new StreamReader(filepath, Encoding.GetEncoding("shift_jis")))
                    {
                        int row = 0;
                        while (!sr.EndOfStream)
                        {
                            row++;
                            // CSVファイルの一行を読み込む
                            string line = sr.ReadLine();
                            // 読み込んだ一行をカンマ毎に分けて配列に格納
                            string[] values = line.Split(',');

                            // ヘッダ行
                            if (row == 1)
                            {
                                // 項目数を取得
                                itemCnt = values.Count();
                                // スキップ
                                continue;
                            }

                            // 空行チェック(全ての項目が空)
                            if (values.Where(x => string.IsNullOrEmpty(x)).Count() == values.Count())
                            {
                                break;
                            }
                            // CSV項目数チェック
                            if (values.Count() != itemCnt)
                            {
                                ViewBag.ErrorMessage = "csvの項目数に誤りがあるため、読み込みを途中で終了しました。 " + row + "行目";
                                break;
                            }

                            // 対象日
                            DateTime dailyClassesDate;
                            // No
                            // [20210205リリース対応] Mod Start int?→intに変更
                            //int? dailyClassesNo;
                            //int dailyClassesNoInt;
                            int dailyClassesNo;
                            // [20210205リリース対応] Mod End
                            // 指導員名
                            string dailyClassesTrainerName;
                            // コマ数
                            double dailyClassesNum;

                            // ----- 対象日 -----
                            // 必須チェック
                            if (string.IsNullOrEmpty(values[0]))
                            {
                                ViewBag.ErrorMessage = "対象日が未設定のため、読み込みを途中で終了しました。 " + row + "行目";
                                break;
                            }
                            // 日付整合性チェック
                            if (!DateTime.TryParse(values[0], out dailyClassesDate))
                            {
                                ViewBag.ErrorMessage = "対象日の設定が不正のため、読み込みを途中で終了しました。 " + row + "行目";
                                break;
                            }

                            // ----- No -----
                            // null許容
                            if (string.IsNullOrEmpty(values[1]))
                            {
                                // [20210205リリース対応] Mod Start nullを許容しない
                                //dailyClassesNo = null;
                                ViewBag.ErrorMessage = "Noが未設定のため、読み込みを途中で終了しました。 " + row + "行目";
                                break;
                                // [20210205リリース対応] Mod End
                            }
                            else
                            {
                                // 数値整合性チェック
                                // [20210205リリース対応] Mod Start 変数の変更
                                //if (!int.TryParse(values[1], out dailyClassesNoInt))
                                //{
                                //    ViewBag.ErrorMessage = "Noの設定が不正のため、読み込みを途中で終了しました。 " + row + "行目";
                                //    break;
                                //}
                                //if (dailyClassesNoInt <= 0)
                                //{
                                //    ViewBag.ErrorMessage = "Noの設定が不正のため、読み込みを途中で終了しました。 " + row + "行目";
                                //    break;
                                //}
                                if (!int.TryParse(values[1], out dailyClassesNo))
                                {
                                    ViewBag.ErrorMessage = "Noの設定が不正のため、読み込みを途中で終了しました。 " + row + "行目";
                                    break;
                                }
                                if (dailyClassesNo <= 0)
                                {
                                    ViewBag.ErrorMessage = "Noの設定が不正のため、読み込みを途中で終了しました。 " + row + "行目";
                                    break;
                                }
                                // [20210205リリース対応] Mod End
                                // [20210205リリース対応] Del Start
                                //if (db.DailyClassesByTrainer.Where(x => ((DateTime)x.Date).Equals(dailyClassesDate) && ((int)x.No).Equals(dailyClassesNoInt)).Count() == 0)
                                //{
                                //    ViewBag.ErrorMessage = "Noの設定が不正のため、読み込みを途中で終了しました。Noはすでに登録済の値のみ指定できます。 " + row + "行目";
                                //    break;
                                //}
                                //dailyClassesNo = dailyClassesNoInt;
                                // [20210205リリース対応] Del End
                            }

                            // ----- 指導員名 -----
                            // 必須チェック
                            if (string.IsNullOrEmpty(values[2]))
                            {
                                ViewBag.ErrorMessage = "指導員名が未設定のため、読み込みを途中で終了しました。 " + row + "行目";
                                break;
                            }
                            dailyClassesTrainerName = values[2];

                            // ----- コマ数 -----
                            // 必須チェック
                            if (string.IsNullOrEmpty(values[3]))
                            {
                                ViewBag.ErrorMessage = "コマ数が未設定のため、読み込みを途中で終了しました。 " + row + "行目";
                                break;
                            }
                            // 数値整合性チェック
                            if (!double.TryParse(values[3], out dailyClassesNum))
                            {
                                ViewBag.ErrorMessage = "コマ数の設定が不正のため、読み込みを途中で終了しました。 " + row + "行目";
                                break;
                            }

                            T_DailyClassesByTrainer t_DailyClassesByTrainer = new T_DailyClassesByTrainer()
                            {
                                Date        = dailyClassesDate,
                                No          = dailyClassesNo,
                                TrainerName = dailyClassesTrainerName,
                                Classes     = dailyClassesNum
                            };
                            // リストに追加
                            importList.Add(t_DailyClassesByTrainer);
                        }
                    }

                    // 重複チェック
                    // [20210205リリース対応] Mod Start Noをint?型からint型に変更したため、Nullは存在しない
                    //int repeatedNum = importList.Where(x => x.No != null).GroupBy(x => new { x.Date, x.No })
                    //    .Select(x => new { Count = x.Count() }).Where(x => x.Count != 1).Count();
                    int repeatedNum = importList.GroupBy(x => new { x.Date, x.No })
                                      .Select(x => new { Count = x.Count() }).Where(x => x.Count != 1).Count();
                    // [20210205リリース対応] Mod End
                    if (repeatedNum > 0)
                    {
                        ViewBag.ErrorMessage = "日付、No.の重複データがあります。(同じ日に同じNoのデータを複数登録することはできません。)ファイルを修正して再度読み込みを行ってください。";
                        return(View(new List <T_DailyClassesByTrainer>()));
                    }
                }
                else
                {
                    ViewBag.ErrorMessage = "ファイルを選択してください。";
                }
            }

            // 登録ボタンが押下された場合
            else if (AppConstant.CMD_REGIST.Equals(cmd))
            {
                // [20210205リリース対応] Del Start 採番処理の削除
                //// 未採番のデータがある場合(採番処理)
                //if (importList.Where(x => x.No == null).Count() > 0)
                //{
                //// ステータスをクリア
                //ModelState.Clear();
                //// ソート(日付、No(設定済)、No(未設定))
                //importList = importList.OrderBy(x => x.Date).ThenBy(x => x.No == null ? 1 : 0).ThenBy(x => x.No).ToList();
                //// 前レコードの日付
                //DateTime? beforeDate = null;
                //// 新規採番No
                //int nextNum = 0;
                //// 未設定のNoを採番
                //foreach (T_DailyClassesByTrainer dailyClassesByTrainer in importList.Where(x => x.No == null))
                //{
                //    // 前レコードの日付がnullもしくは対象レコードと異なる場合
                //    if (beforeDate == null || beforeDate != dailyClassesByTrainer.Date)
                //    {
                //        // 最大値を取得
                //        int? maxNum = db.DailyClassesByTrainer.Where(x => ((DateTime)x.Date).Equals((DateTime)dailyClassesByTrainer.Date)).Select(x => x.No).Max();
                //        // 最大値を加算(最大値がnullの場合は1)
                //        nextNum = maxNum == null ? 1 : (int)maxNum + 1;
                //    }
                //    else
                //    {
                //        // Noを加算
                //        nextNum++;
                //    }

                //    // 採番された番号を設定
                //    dailyClassesByTrainer.No = nextNum;
                //    // 日付を保持
                //    beforeDate = dailyClassesByTrainer.Date;
                //}

                //ViewBag.CompMessage = "Noの新規採番が完了しました。再度登録ボタンを押してください。";
                //}

                //// 未採番のデータがない場合(登録・更新処理)
                //else
                //{
                // [20210205リリース対応] Del End
                // 入力チェック
                bool validation = true;
                if (ModelState.IsValid)
                {
                    // コマ数チェック
                    // [20210205リリース対応] Mod Start コマ数の0許容
                    //if (importList.Where(x => x.Classes <= 0).Count() > 0)
                    //{
                    //    ViewBag.ErrorMessage = "コマ数に0以下は設定できません。";
                    //    validation = false;
                    //}
                    if (importList.Where(x => x.Classes < 0).Count() > 0)
                    {
                        ViewBag.ErrorMessage = "コマ数に0未満は設定できません。";
                        validation           = false;
                    }
                    // [20210205リリース対応] Mod End
                }
                else
                {
                    // エラーメッセージ生成
                    ViewBag.ErrorMessage = new Utility().GetErrorMessage(ModelState);
                    validation           = false;
                }

                if (validation == true)
                {
                    // [20210205リリース対応] Add Start 既存データ削除
                    // 削除対象の日付を取得
                    List <DateTime?> dateList = importList.Select(x => x.Date).Distinct().ToList();
                    // 対象データを全て削除
                    db.DailyClassesByTrainer.RemoveRange(
                        db.DailyClassesByTrainer.Where(x => dateList.Contains(x.Date)));
                    // [20210205リリース対応] Add End

                    // 登録済み日別予測条件(親データ)を取得
                    List <T_DailyClasses> addedDailyClasses = db.DailyClasses.Where(x => dateList.Contains(x.Date)).ToList();

                    foreach (T_DailyClassesByTrainer dailyClassesByTrainer in importList)
                    {
                        // 日別予測条件(親データ)の存在チェック
                        if (addedDailyClasses.Where(x => ((DateTime)x.Date).Equals((DateTime)dailyClassesByTrainer.Date)).Count() == 0)
                        {
                            // 日別予測条件を生成
                            T_DailyClasses addDailyClasses = new T_DailyClasses()
                            {
                                Date = dailyClassesByTrainer.Date
                            };
                            // 日付を指定してデータを登録
                            db.DailyClasses.Add(addDailyClasses);
                            // 追加済みとする
                            addedDailyClasses.Add(addDailyClasses);
                        }

                        // [20210205リリース対応] Mod Start 存在チェックを削除
                        //// 存在チェック
                        //if (db.DailyClassesByTrainer.Where(x => ((DateTime)x.Date).Equals((DateTime)dailyClassesByTrainer.Date)
                        //    && ((int)x.No).Equals((int)dailyClassesByTrainer.No)).Count() == 0)
                        //{
                        //    // 登録処理
                        //    db.DailyClassesByTrainer.Add(dailyClassesByTrainer);
                        //}
                        //else
                        //{
                        //    // 更新処理
                        //    db.Entry(dailyClassesByTrainer).State = EntityState.Modified;
                        //}
                        // 登録処理
                        db.DailyClassesByTrainer.Add(dailyClassesByTrainer);
                        // [20210205リリース対応] Mod End
                    }
                    db.SaveChanges();
                    // 完了メッセージ
                    ViewBag.CompMessage = "インポートが完了しました。";
                    // 表示データを初期化
                    importList = new List <T_DailyClassesByTrainer>();
                }
                // [20210205リリース対応] Del Start
                //}
                // [20210205リリース対応] Del End
            }

            // その他
            else
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }

            return(View(importList));
        }
        public ActionResult Edit(string cmd, [Bind(Include = "DailyClasses,UpdateTo")] V_DailyParameterEdt dailyParameterEdt)
        {
            Trace.WriteLine("POST /DailyParameter/Edit/" + dailyParameterEdt.DailyClasses.Date + "&" + dailyParameterEdt.UpdateTo);

            // 更新ボタンが押下された場合
            if (AppConstant.CMD_UPDATE.Equals(cmd))
            {
                // 日付を設定
                dailyParameterEdt.SearchDate = dailyParameterEdt.DailyClasses.Date;

                // 入力チェック
                bool validation = true;
                if (ModelState.IsValid)
                {
                    // 更新日付Toの必須チェック
                    if (dailyParameterEdt.UpdateTo == null)
                    {
                        ViewBag.ErrorMessage = "更新範囲の日付を設定してください。";
                        validation           = false;
                    }
                    // 日付の前後チェック
                    if (validation == true &&
                        dailyParameterEdt.UpdateTo < dailyParameterEdt.DailyClasses.Date)
                    {
                        ViewBag.ErrorMessage = "更新範囲の日付の前後関係が不正です。";
                        validation           = false;
                    }

                    // [20210416リリース対応] Add Start 教習外コマ数比率の追加
                    double checkValue;
                    // 教習外コマ数比率のチェック
                    checkValue = dailyParameterEdt.DailyClasses.DepartExamRatio + dailyParameterEdt.DailyClasses.OtherVehicleRatio
                                 + dailyParameterEdt.DailyClasses.SeminarRatio + dailyParameterEdt.DailyClasses.OtherRatio;
                    if (validation == true && checkValue > 100)
                    {
                        ViewBag.ErrorMessage = "教習外コマ数比率(学科・検定比率、他車種比率、講習比率、その他)は合わせて100以下になるように設定してください。";
                        validation           = false;
                    }
                    // [20210416リリース対応] Add End

                    // 合宿比率[%]と通学比率[%]のチェック
                    // [20210416リリース対応] Mod Start 0の許容
                    //if (validation == true &&
                    //    dailyParameterEdt.DailyClasses.LodgingRatio + dailyParameterEdt.DailyClasses.CommutingRatio != 100)
                    checkValue = dailyParameterEdt.DailyClasses.LodgingRatio + dailyParameterEdt.DailyClasses.CommutingRatio;
                    if (validation == true && checkValue != 0 && checkValue != 100)
                    // [20210416リリース対応] Mod End
                    {
                        ViewBag.ErrorMessage = "合宿・通学比率(合宿比率、通学比率)は合わせて100になるように設定してください。";
                        validation           = false;
                    }

                    // 合宿の在籍比率[%](AT一段階/二段階、MT一段階/二段階)のチェック
                    // [20210416リリース対応] Mod Start 0の許容
                    //if (validation == true &&
                    //    dailyParameterEdt.DailyClasses.LdgAtFstRatio + dailyParameterEdt.DailyClasses.LdgAtSndRatio + dailyParameterEdt.DailyClasses.LdgMtFstRatio + dailyParameterEdt.DailyClasses.LdgMtSndRatio != 100)
                    checkValue = dailyParameterEdt.DailyClasses.LdgAtFstRatio + dailyParameterEdt.DailyClasses.LdgAtSndRatio + dailyParameterEdt.DailyClasses.LdgMtFstRatio + dailyParameterEdt.DailyClasses.LdgMtSndRatio;
                    if (validation == true && checkValue != 0 && checkValue != 100)
                    // [20210416リリース対応] Mod End
                    {
                        ViewBag.ErrorMessage = "合宿の在籍比率[%](AT一段階/二段階、MT一段階/二段階)は合わせて100になるように設定してください。";
                        validation           = false;
                    }

                    // 通学の在籍比率[%](AT一段階/二段階、MT一段階/二段階)のチェック
                    // [20210416リリース対応] Mod Start 0の許容
                    //if (validation == true &&
                    //    dailyParameterEdt.DailyClasses.CmtAtFstRatio + dailyParameterEdt.DailyClasses.CmtAtSndRatio + dailyParameterEdt.DailyClasses.CmtMtFstRatio + dailyParameterEdt.DailyClasses.CmtMtSndRatio != 100)
                    checkValue = dailyParameterEdt.DailyClasses.CmtAtFstRatio + dailyParameterEdt.DailyClasses.CmtAtSndRatio + dailyParameterEdt.DailyClasses.CmtMtFstRatio + dailyParameterEdt.DailyClasses.CmtMtSndRatio;
                    if (validation == true && checkValue != 0 && checkValue != 100)
                    // [20210416リリース対応] Mod End
                    {
                        ViewBag.ErrorMessage = "通学の在籍比率[%](AT一段階/二段階、MT一段階/二段階)は合わせて100になるように設定してください。";
                        validation           = false;
                    }
                }
                else
                {
                    // エラーメッセージを生成
                    ViewBag.ErrorMessage = new Utility().GetErrorMessage(ModelState);
                    validation           = false;
                }

                if (validation == true)
                {
                    // 指定した範囲で登録/更新処理を行う
                    for (DateTime date = (DateTime)dailyParameterEdt.DailyClasses.Date;
                         date.CompareTo((DateTime)dailyParameterEdt.UpdateTo) <= 0; date = date.AddDays(1))
                    {
                        // 登録/更新対象を設定
                        T_DailyClasses dailyClasses = new T_DailyClasses()
                        {
                            Date = date
                        };
                        this.SetUpdateInfo(dailyClasses, dailyParameterEdt.DailyClasses);
                        // 存在チェック
                        if (db.DailyClasses.Where(x => ((DateTime)x.Date).Equals(date)).Count() == 0)
                        {
                            // 登録処理
                            db.DailyClasses.Add(dailyClasses);
                        }
                        else
                        {
                            // 更新処理
                            db.Entry(dailyClasses).State = EntityState.Modified;
                        }
                    }
                    db.SaveChanges();

                    // 完了メッセージ
                    ViewBag.CompMessage = "データを更新しました。";
                }

                // 指導員コマ数を取得
                dailyParameterEdt.TrainerList = db.DailyClassesByTrainer.Where(x => ((DateTime)x.Date).Equals((DateTime)dailyParameterEdt.SearchDate)).OrderBy(x => x.No).ToList();
            }

            // その他
            else
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }

            return(View(dailyParameterEdt));
        }
        public ActionResult Import(string cmd, HttpPostedFileBase postedFile, [Bind(Include = "")] List <T_DailyClasses> dailyClassesList)
        {
            Trace.WriteLine("POST /DailyParameter/Import");

            // 読込ボタンが押下された場合
            if (AppConstant.CMD_READ.Equals(cmd))
            {
                // ステータスをクリア
                ModelState.Clear();
                // 日別条件を初期化
                dailyClassesList = new List <T_DailyClasses>();

                if (postedFile != null)
                {
                    // 拡張子チェック
                    string extension = Path.GetExtension(postedFile.FileName);
                    if (!".csv".Equals(extension) && !".CSV".Equals(extension))
                    {
                        // エラーメッセージ
                        ViewBag.ErrorMessage = "ファイルはcsv形式を指定してください。";
                        return(View(dailyClassesList));
                    }

                    // アップロード先ディレクトリ
                    string uploadDir = AppDomain.CurrentDomain.BaseDirectory + @"Uploads\";
                    // ディレクトリが存在しない場合は作成
                    if (!Directory.Exists(uploadDir))
                    {
                        Directory.CreateDirectory(uploadDir);
                    }

                    // ファイルをサーバーに保存
                    string filepath = uploadDir + Path.GetFileName(postedFile.FileName);
                    postedFile.SaveAs(filepath);

                    // 項目数
                    int itemCnt = 0;
                    // テキストを全行読み込み
                    using (StreamReader sr = new StreamReader(filepath, Encoding.GetEncoding("shift_jis")))
                    {
                        int row = 0;
                        while (!sr.EndOfStream)
                        {
                            row++;
                            // CSVファイルの一行を読み込む
                            string line = sr.ReadLine();
                            // 読み込んだ一行をカンマ毎に分けて配列に格納
                            string[] values = line.Split(',');

                            // ヘッダ行
                            if (row == 1)
                            {
                                // 項目数を取得
                                itemCnt = values.Count();
                                // スキップ
                                continue;
                            }

                            // 空行チェック(全ての項目が空)
                            if (values.Where(x => string.IsNullOrEmpty(x)).Count() == values.Count())
                            {
                                break;
                            }
                            // CSV項目数チェック
                            if (values.Count() != itemCnt)
                            {
                                ViewBag.ErrorMessage = "csvの項目数に誤りがあるため、読み込みを途中で終了しました。 " + row + "行目";
                                break;
                            }

                            T_DailyClasses dailyClasses = new T_DailyClasses();
                            // 日付項目
                            DateTime dateItem;
                            // 数値項目
                            double doubleItem;

                            // ----- 対象日 -----
                            if (!this.ItemCheck(values[0], out dateItem, "対象日", row))
                            {
                                break;
                            }
                            dailyClasses.Date = dateItem;

                            // [20210416リリース対応] Add Start 教習外コマ数比率の追加
                            // ----- 学科・検定比率[%] -----
                            if (!this.ItemCheck(values[1], out doubleItem, "学科・検定比率[%]", row))
                            {
                                break;
                            }
                            dailyClasses.DepartExamRatio = doubleItem;

                            // ----- 他車種比率[%] -----
                            if (!this.ItemCheck(values[2], out doubleItem, "他車種比率[%]", row))
                            {
                                break;
                            }
                            dailyClasses.OtherVehicleRatio = doubleItem;

                            // ----- 講習比率[%] -----
                            if (!this.ItemCheck(values[3], out doubleItem, "講習比率[%]", row))
                            {
                                break;
                            }
                            dailyClasses.SeminarRatio = doubleItem;

                            // ----- その他[%] -----
                            if (!this.ItemCheck(values[4], out doubleItem, "その他[%]", row))
                            {
                                break;
                            }
                            dailyClasses.OtherRatio = doubleItem;
                            // [20210416リリース対応] Add End

                            // ----- 合宿比率[%] -----
                            if (!this.ItemCheck(values[5], out doubleItem, "合宿比率[%]", row))
                            {
                                break;
                            }
                            dailyClasses.LodgingRatio = doubleItem;

                            // ----- 通学比率[%] -----
                            if (!this.ItemCheck(values[6], out doubleItem, "通学比率[%]", row))
                            {
                                break;
                            }
                            dailyClasses.CommutingRatio = doubleItem;

                            // ----- 【合宿】MT一段階比率[%] -----
                            if (!this.ItemCheck(values[7], out doubleItem, "【合宿】MT一段階比率[%]", row))
                            {
                                break;
                            }
                            dailyClasses.LdgMtFstRatio = doubleItem;

                            // ----- 【合宿】MT二段階比率[%] -----
                            if (!this.ItemCheck(values[8], out doubleItem, "【合宿】MT二段階比率[%]", row))
                            {
                                break;
                            }
                            dailyClasses.LdgMtSndRatio = doubleItem;

                            // ----- 【合宿】AT一段階比率[%] -----
                            if (!this.ItemCheck(values[9], out doubleItem, "【合宿】AT一段階比率[%] ", row))
                            {
                                break;
                            }
                            dailyClasses.LdgAtFstRatio = doubleItem;

                            // ----- 【合宿】AT二段階比率[%] -----
                            if (!this.ItemCheck(values[10], out doubleItem, "【合宿】AT二段階比率[%]", row))
                            {
                                break;
                            }
                            dailyClasses.LdgAtSndRatio = doubleItem;

                            // ----- 【合宿】MT一段階コマ数 -----
                            if (!this.ItemCheck(values[11], out doubleItem, "【合宿】MT一段階コマ数", row))
                            {
                                break;
                            }
                            dailyClasses.LdgMtFstClass = doubleItem;

                            // ----- 【合宿】MT二段階コマ数 -----
                            if (!this.ItemCheck(values[12], out doubleItem, "【合宿】MT二段階コマ数", row))
                            {
                                break;
                            }
                            dailyClasses.LdgMtSndClass = doubleItem;

                            // ----- 【合宿】AT一段階コマ数 -----
                            if (!this.ItemCheck(values[13], out doubleItem, "【合宿】AT一段階コマ数", row))
                            {
                                break;
                            }
                            dailyClasses.LdgAtFstClass = doubleItem;

                            // ----- 【合宿】AT二段階コマ数 -----
                            if (!this.ItemCheck(values[14], out doubleItem, "【合宿】AT二段階コマ数", row))
                            {
                                break;
                            }
                            dailyClasses.LdgAtSndClass = doubleItem;

                            // ----- 【合宿】MT一段階コマ数/日 -----
                            if (!this.ItemCheck(values[15], out doubleItem, "【合宿】MT一段階コマ数/日", row))
                            {
                                break;
                            }
                            dailyClasses.LdgMtFstClassDay = doubleItem;

                            // ----- 【合宿】MT二段階コマ数/日 -----
                            if (!this.ItemCheck(values[16], out doubleItem, "【合宿】MT二段階コマ数/日", row))
                            {
                                break;
                            }
                            dailyClasses.LdgMtSndClassDay = doubleItem;

                            // ----- 【合宿】AT一段階コマ数/日 -----
                            if (!this.ItemCheck(values[17], out doubleItem, "【合宿】AT一段階コマ数/日", row))
                            {
                                break;
                            }
                            dailyClasses.LdgAtFstClassDay = doubleItem;

                            // ----- 【合宿】AT二段階コマ数/日 -----
                            if (!this.ItemCheck(values[18], out doubleItem, "【合宿】AT二段階コマ数/日", row))
                            {
                                break;
                            }
                            dailyClasses.LdgAtSndClassDay = doubleItem;

                            // ----- 【通学】MT一段階比率[%] -----
                            if (!this.ItemCheck(values[19], out doubleItem, "【通学】MT一段階比率[%]", row))
                            {
                                break;
                            }
                            dailyClasses.CmtMtFstRatio = doubleItem;

                            // ----- 【通学】MT二段階比率[%] -----
                            if (!this.ItemCheck(values[20], out doubleItem, "【通学】MT二段階比率[%]", row))
                            {
                                break;
                            }
                            dailyClasses.CmtMtSndRatio = doubleItem;

                            // ----- 【通学】AT一段階比率[%] -----
                            if (!this.ItemCheck(values[21], out doubleItem, "【通学】AT一段階比率[%]", row))
                            {
                                break;
                            }
                            dailyClasses.CmtAtFstRatio = doubleItem;

                            // ----- 【通学】AT二段階比率[%] -----
                            if (!this.ItemCheck(values[22], out doubleItem, "【通学】AT二段階比率[%]", row))
                            {
                                break;
                            }
                            dailyClasses.CmtAtSndRatio = doubleItem;

                            // ----- 【通学】MT一段階コマ数 -----
                            if (!this.ItemCheck(values[23], out doubleItem, "【通学】MT一段階コマ数", row))
                            {
                                break;
                            }
                            dailyClasses.CmtMtFstClass = doubleItem;

                            // ----- 【通学】MT二段階コマ数 -----
                            if (!this.ItemCheck(values[24], out doubleItem, "【通学】MT二段階コマ数", row))
                            {
                                break;
                            }
                            dailyClasses.CmtMtSndClass = doubleItem;

                            // ----- 【通学】AT一段階コマ数 -----
                            if (!this.ItemCheck(values[25], out doubleItem, "【通学】AT一段階コマ数", row))
                            {
                                break;
                            }
                            dailyClasses.CmtAtFstClass = doubleItem;

                            // ----- 【通学】AT二段階コマ数 -----
                            if (!this.ItemCheck(values[26], out doubleItem, "【通学】AT二段階コマ数", row))
                            {
                                break;
                            }
                            dailyClasses.CmtAtSndClass = doubleItem;

                            // ----- 【通学】MT一段階コマ数/日 -----
                            if (!this.ItemCheck(values[27], out doubleItem, "【通学】MT一段階コマ数/日", row))
                            {
                                break;
                            }
                            dailyClasses.CmtMtFstClassDay = doubleItem;

                            // ----- 【通学】MT二段階コマ数/日 -----
                            if (!this.ItemCheck(values[28], out doubleItem, "【通学】MT二段階コマ数/日", row))
                            {
                                break;
                            }
                            dailyClasses.CmtMtSndClassDay = doubleItem;

                            // ----- 【通学】AT一段階コマ数/日 -----
                            if (!this.ItemCheck(values[29], out doubleItem, "【通学】AT一段階コマ数/日", row))
                            {
                                break;
                            }
                            dailyClasses.CmtAtFstClassDay = doubleItem;

                            // ----- 【通学】AT二段階コマ数/日 -----
                            if (!this.ItemCheck(values[30], out doubleItem, "【通学】AT二段階コマ数/日", row))
                            {
                                break;
                            }
                            dailyClasses.CmtAtSndClassDay = doubleItem;

                            dailyClassesList.Add(dailyClasses);
                        }
                    }
                }
                else
                {
                    ViewBag.ErrorMessage = "ファイルを選択してください。";
                }
            }

            // 登録ボタンが押下された場合
            else if (AppConstant.CMD_REGIST.Equals(cmd))
            {
                // 入力チェック
                bool validation = true;
                if (ModelState.IsValid)
                {
                    // 重複チェック
                    int repeatedNum = dailyClassesList.GroupBy(x => x.Date)
                                      .Select(x => new { Count = x.Count() }).Where(x => x.Count != 1).Count();
                    if (repeatedNum > 0)
                    {
                        ViewBag.ErrorMessage = "対象日の重複データがあります。(同じ日のデータを複数登録することはできません。)";
                        validation           = false;
                    }
                    // 各行の不整合チェック
                    if (validation == true)
                    {
                        double checkValue;
                        foreach (T_DailyClasses dailyClasses in dailyClassesList)
                        {
                            // [20210416リリース対応] Add Start 教習外コマ数比率の追加
                            // 教習外コマ数比率のチェック
                            checkValue = dailyClasses.DepartExamRatio + dailyClasses.OtherVehicleRatio + dailyClasses.SeminarRatio + dailyClasses.OtherRatio;
                            if (checkValue > 100)
                            {
                                ViewBag.ErrorMessage = "教習外コマ数比率(学科・検定比率、他車種比率、講習比率、その他)は合わせて100以下になるように設定してください。";
                                validation           = false;
                                break;
                            }
                            // [20210416リリース対応] Add End

                            // 合宿比率と通学比率のチェック
                            // [20210416リリース対応] Mod Start 合計値0の許容
                            //if (dailyClasses.LodgingRatio + dailyClasses.CommutingRatio != 100)
                            checkValue = dailyClasses.LodgingRatio + dailyClasses.CommutingRatio;
                            if (checkValue < 0 && checkValue != 100)
                            // [20210416リリース対応] Mod End
                            {
                                ViewBag.ErrorMessage = "合宿・通学比率(合宿比率、通学比率)は合わせて100になるように設定してください。";
                                validation           = false;
                                break;
                            }
                            // 合宿の在籍比率[%](AT一段階/二段階、MT一段階/二段階)のチェック
                            // [20210416リリース対応] Mod Start 合計値0の許容
                            //if (dailyClasses.LdgAtFstRatio + dailyClasses.LdgAtSndRatio + dailyClasses.LdgMtFstRatio + dailyClasses.LdgMtSndRatio != 100)
                            checkValue = dailyClasses.LdgAtFstRatio + dailyClasses.LdgAtSndRatio + dailyClasses.LdgMtFstRatio + dailyClasses.LdgMtSndRatio;
                            if (checkValue < 0 && checkValue != 100)
                            // [20210416リリース対応] Mod End
                            {
                                ViewBag.ErrorMessage = "合宿の在籍比率[%](AT一段階/二段階、MT一段階/二段階)は合わせて100になるように設定してください。";
                                validation           = false;
                                break;
                            }
                            // 通学の在籍比率[%](AT一段階/二段階、MT一段階/二段階)のチェック
                            // [20210416リリース対応] Mod Start 合計値0の許容
                            //if (dailyClasses.CmtAtFstRatio + dailyClasses.CmtAtSndRatio + dailyClasses.CmtMtFstRatio + dailyClasses.CmtMtSndRatio != 100)
                            checkValue = dailyClasses.CmtAtFstRatio + dailyClasses.CmtAtSndRatio + dailyClasses.CmtMtFstRatio + dailyClasses.CmtMtSndRatio;
                            if (checkValue < 0 && checkValue != 100)
                            // [20210416リリース対応] Mod End
                            {
                                ViewBag.ErrorMessage = "通学の在籍比率[%](AT一段階/二段階、MT一段階/二段階)は合わせて100になるように設定してください。";
                                validation           = false;
                                break;
                            }
                        }
                    }
                }
                else
                {
                    // エラーメッセージを生成
                    ViewBag.ErrorMessage = new Utility().GetErrorMessage(ModelState);
                    validation           = false;
                }

                if (validation == true)
                {
                    // データの登録/更新
                    foreach (T_DailyClasses dailyClasses in dailyClassesList)
                    {
                        // 存在チェック
                        if (db.DailyClasses.Where(x => ((DateTime)x.Date).Equals((DateTime)dailyClasses.Date)).Count() == 0)
                        {
                            // 登録処理
                            db.DailyClasses.Add(dailyClasses);
                        }
                        else
                        {
                            // 更新処理
                            db.Entry(dailyClasses).State = EntityState.Modified;
                        }
                    }
                    db.SaveChanges();
                    // 完了メッセージ
                    ViewBag.CompMessage = "インポートが完了しました。";
                    // 表示データを初期化
                    dailyClassesList = new List <T_DailyClasses>();
                }
            }

            // その他
            else
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }

            return(View(dailyClassesList));
        }