/// <summary>
        /// 対象日が土日祝、土日祝前の平日かチェック(夜勤用)
        /// </summary>
        /// <returns></returns>
        public bool CheckHolidayAndBeforeAfterDayForNight(string strTargetDate, string[] astrHoliday)
        {
            string strTargetMonth = strTargetDate.Substring(0, 6);      // 対象月
            string strTargetDay;                                        // 対象日用変数
            string strDayOfWeek;                                        // 曜日名称

            // 対象日の曜日を取得
            strDayOfWeek = clsCommonControl.GetWeekName(strTargetDate, astrHoliday);

            // 対象日の曜日が土・日・祝ならfalse
            switch (strDayOfWeek)
            {
            case "土":
            case "日":
            case "祝":
                return(true);
            }

            // 対象日の翌日を変数に代入
            strTargetDay = DateTime.ParseExact(strTargetDate, "yyyyMMdd", null).AddDays(1).ToString("yyyyMMdd");

            // 対象月であるかチェック
            if (strTargetDay.Substring(0, 6) == strTargetMonth)
            {
                // 曜日を取得
                strDayOfWeek = clsCommonControl.GetWeekName(strTargetDay, astrHoliday);

                // 曜日が平日ならfalse
                switch (strDayOfWeek)
                {
                case "土":
                case "日":
                case "祝":
                    return(true);
                }
            }
            return(false);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 祝日数を考慮した公休数を共通変数にセット
        /// </summary>
        public void SetHolidayCount()
        {
            string strDayOfWeek;
            // Add Start WataruT 2020.07.14 土日祝の公休数設定変更
            int      iSaturdayCount;
            int      iSundayCount;
            bool     bSaturdayHolidayFlag;
            string   strFormat = "yyyyMMdd";
            DateTime dtTargetDate;

            // Add End   WataruT 2020.07.14 土日祝の公休数設定変更

            // 既定の公休数を初期化
            // Mod Start WataruT 2020.07.14 土日祝の公休数設定変更
            //frmMainSchedule.pdHolidayCount = 0;
            frmMainSchedule.pdHolidayCount = 8;
            iSaturdayCount       = 0;
            iSundayCount         = 0;
            bSaturdayHolidayFlag = true;
            // Mod End   WataruT 2020.07.14 土日祝の公休数設定変更

            // Mod Start WataruT 2020.07.14 土日祝の公休数設定変更
            //// 日曜日の数をカウント
            //for (int iDay = 0; iDay < frmMainSchedule.piDayCount; iDay++)
            //{
            //    strDayOfWeek = clsCommonControl.GetWeekName(frmMainSchedule.pstrTargetMonth + String.Format("{0:D2}", iDay + 1), frmMainSchedule.astrHoliday);

            //    switch(strDayOfWeek)
            //    {
            //        case "土":
            //        case "日":
            //        case "祝":
            //            frmMainSchedule.pdHolidayCount++;
            //            break;
            //    }
            //}
            // 祝日マスタ関係なく土日の数をカウント
            for (int iDay = 0; iDay < frmMainSchedule.piDayCount; iDay++)
            {
                dtTargetDate = DateTime.ParseExact(frmMainSchedule.pstrTargetMonth + String.Format("{0:D2}", iDay + 1), strFormat, null);

                switch (dtTargetDate.ToString("ddd"))
                {
                case "土":
                    iSaturdayCount++;
                    // Mod Start 2021.02.15 土曜日の祝日判定処理不具合対応
                    //if (iSaturdayCount > 4) frmMainSchedule.pdHolidayCount = frmMainSchedule.pdHolidayCount + 0.5;
                    //{
                    //    bSaturdayHolidayFlag = false;
                    //    break;
                    //}
                    if (iSaturdayCount > 4)
                    {
                        frmMainSchedule.pdHolidayCount = frmMainSchedule.pdHolidayCount + 0.5;
                        bSaturdayHolidayFlag           = false;
                    }
                    break;

                // Mod Start 2021.02.15 土曜日の祝日判定処理不具合対応
                case "日":
                    iSundayCount++;
                    if (iSundayCount > 4)
                    {
                        frmMainSchedule.pdHolidayCount++;
                    }
                    break;
                }
            }
            // 祝日判定
            for (int iDay = 0; iDay < frmMainSchedule.piDayCount; iDay++)
            {
                strDayOfWeek = clsCommonControl.GetWeekName(frmMainSchedule.pstrTargetMonth + String.Format("{0:D2}", iDay + 1), frmMainSchedule.astrHoliday);

                // Add Start WataruT 2020.11.19 年末の特定日を半日とする
                dtTargetDate = DateTime.ParseExact(frmMainSchedule.pstrTargetMonth + String.Format("{0:D2}", iDay + 1), strFormat, null);
                if (frmMainSchedule.pstrTargetMonth.Substring(4, 2) + String.Format("{0:D2}", iDay + 1) == "1229")
                {
                    switch (dtTargetDate.ToString("ddd"))
                    {
                    case "土":
                        break;

                    case "日":
                        iSundayCount++;
                        if (iSundayCount > 4)
                        {
                            frmMainSchedule.pdHolidayCount++;
                        }
                        break;

                    default:
                        frmMainSchedule.pdHolidayCount += 0.5;
                        break;
                    }
                    continue;
                }
                // Add End   WataruT 2020.11.19 年末の特定日を半日とする

                switch (strDayOfWeek)
                {
                case "祝":
                    if (DateTime.ParseExact(frmMainSchedule.pstrTargetMonth + String.Format("{0:D2}", iDay + 1), strFormat, null).ToString("ddd") == "日")
                    {
                        break;
                    }
                    if (DateTime.ParseExact(frmMainSchedule.pstrTargetMonth + String.Format("{0:D2}", iDay + 1), strFormat, null).ToString("ddd") == "土")
                    {
                        if (bSaturdayHolidayFlag == false)
                        {
                            frmMainSchedule.pdHolidayCount = frmMainSchedule.pdHolidayCount + 0.5;
                            bSaturdayHolidayFlag           = true;
                        }
                        break;
                    }
                    else
                    {
                        frmMainSchedule.pdHolidayCount++;
                        break;
                    }
                }
            }
            // Mod End   WataruT 2020.07.14 土日祝の公休数設定変更
        }
        /// <summary>
        /// データグリッドに希望シフトをセット
        /// </summary>
        public void SetMainData_Request()
        {
            int       iScheduleStaffCount, iDayCount, iWorkKindCount; // データ数(職員、日付、勤務種類)
            string    strTargetMonth;                                 // 対象年月
            DataTable dt;
            DataRow   dr;

            // データ数を変数にセット
            iScheduleStaffCount = frmMainSchedule.dtScheduleStaff.Rows.Count;
            iDayCount           = clsCommonControl.GetTargetMonthDays(frmMainSchedule.lblTargetMonth.Text);
            iWorkKindCount      = frmMainSchedule.dtWorkKind.Rows.Count;

            // 対象年月をセット
            strTargetMonth = frmMainSchedule.lblTargetMonth.Text.Substring(0, 4) + frmMainSchedule.lblTargetMonth.Text.Substring(5, 2);

            //グリッドの描画処理停止
            frmMainSchedule.grdMain.SuspendLayout();
            frmMainSchedule.grdMain.DataSource = null;

            // 初期データをセット
            for (int iScheduleStaff = 0; iScheduleStaff < iScheduleStaffCount; iScheduleStaff++)
            {
                for (int iDay = 0; iDay < iDayCount; iDay++)
                {
                    for (int iWorkKind = 0; iWorkKind < iWorkKindCount; iWorkKind++)
                    {
                        frmMainSchedule.aiData[iScheduleStaff, iDay, iWorkKind] = 0;
                    }
                }
                for (int iWorkKind = 0; iWorkKind < 3; iWorkKind++)
                {
                    frmMainSchedule.adRowTotalData[iScheduleStaff, iWorkKind] = 0;
                }
            }

            for (int iDay = 0; iDay < iDayCount; iDay++)
            {
                for (int iWorkKind = 0; iWorkKind < 3; iWorkKind++)
                {
                    frmMainSchedule.adColumnTotalData[iDay, iWorkKind] = 0;
                }
            }

            // 希望シフトデータをセット
            SetRequestData();

            //
            // --- メイングリッドヘッダ ---
            //

            // DataTableを初期化
            dt = new DataTable();

            // DataTableにカラムヘッダを作成
            dt.Columns.Add("NAME", Type.GetType("System.String"));
            for (int iDay = 1; iDay <= frmMainSchedule.piDayCount; iDay++)
            {
                dt.Columns.Add(iDay.ToString(), Type.GetType("System.String"));
            }

            // DataTableにデータをセット
            for (int iRow = 0; iRow < 2; iRow++)
            {
                dr = dt.NewRow();

                // 1行目:日にちをセット
                if (iRow == 0)
                {
                    for (int iDay = 1; iDay <= frmMainSchedule.piDayCount; iDay++)
                    {
                        dr[iDay.ToString()] = iDay.ToString();
                    }
                }
                // 2行目:"氏名"と曜日をセット
                else
                {
                    dr["NAME"] = "氏名";
                    for (int iDay = 1; iDay <= frmMainSchedule.piDayCount; iDay++)
                    {
                        dr[iDay.ToString()] = clsCommonControl.GetWeekName(frmMainSchedule.pstrTargetMonth + String.Format("{0:D2}", iDay), frmMainSchedule.astrHoliday);
                    }
                }
                dt.Rows.Add(dr);
            }

            // グリッドにデータをセット
            frmMainSchedule.grdMainHeader.DataSource = dt;

            // デザイン設定
            for (int iRow = 0; iRow < 2; iRow++)
            {
                // 列幅・色(職員)
                frmMainSchedule.grdMainHeader[0, iRow].Style.ForeColor = Color.Black;
                frmMainSchedule.grdMainHeader[0, iRow].Style.BackColor = SystemColors.Control;
                frmMainSchedule.grdMainHeader.Columns[0].Width         = GRID_WIDTH_COLUMN_STAFF;

                for (int iColumn = 1; iColumn <= frmMainSchedule.piDayCount; iColumn++)
                {
                    // 列幅
                    frmMainSchedule.grdMainHeader.Columns[iColumn].Width = GRID_WIDTH_COLUMN_DATA;

                    // 色(日付、曜日)
                    frmMainSchedule.grdMainHeader[iColumn, iRow].Style.ForeColor = clsCommonControl.GetWeekNameForeColor(frmMainSchedule.grdMainHeader[iColumn, iRow].Value.ToString());
                    frmMainSchedule.grdMainHeader[iColumn, iRow].Style.BackColor = clsCommonControl.GetWeekNameBackgroundColor(
                        clsCommonControl.GetWeekName(frmMainSchedule.pstrTargetMonth + String.Format("{0:D2}", iColumn), frmMainSchedule.astrHoliday));
                }
            }

            //
            // --- メイングリッドデータ ---
            //

            // データテーブル作成
            dt = new DataTable();

            dt.Columns.Add("NAME", Type.GetType("System.String"));

            for (int iDay = 1; iDay <= iDayCount; iDay++)
            {
                dt.Columns.Add(iDay.ToString(), Type.GetType("System.String"));
            }

            for (int iScheduleStaff = 0; iScheduleStaff < iScheduleStaffCount; iScheduleStaff++)
            {
                DataRow nr = dt.NewRow();

                nr["NAME"] = frmMainSchedule.astrScheduleStaff[iScheduleStaff, 1];
                for (int iDay = 1; iDay <= iDayCount; iDay++)
                {
                    for (int iWorkKind = 0; iWorkKind < iWorkKindCount; iWorkKind++)
                    {
                        if (frmMainSchedule.aiData[iScheduleStaff, iDay - 1, iWorkKind] == 1)
                        {
                            nr[iDay.ToString()] = frmMainSchedule.astrWorkKind[iWorkKind, 1];
                            break;
                        }
                    }
                }
                dt.Rows.Add(nr);
            }

            // メイングリッドにデータをセット
            frmMainSchedule.grdMain.DataSource = dt;

            // 職員氏名欄のデザイン設定
            for (int iScheduleStaff = 0; iScheduleStaff < frmMainSchedule.piScheduleStaffCount; iScheduleStaff++)
            {
                frmMainSchedule.grdMain[0, iScheduleStaff].Style.ForeColor = Color.Black;
                frmMainSchedule.grdMain[0, iScheduleStaff].Style.BackColor = SystemColors.Control;
            }

            // 列幅(職員)
            frmMainSchedule.grdMain.Columns[0].Width = GRID_WIDTH_COLUMN_STAFF;

            // 勤務種類データのデザイン設定
            for (int iDay = 1; iDay <= frmMainSchedule.piDayCount; iDay++)
            {
                //列幅
                frmMainSchedule.grdMain.Columns[iDay].Width = GRID_WIDTH_COLUMN_DATA;

                // 文字の色
                for (int iScheduleStaff = 0; iScheduleStaff < frmMainSchedule.piScheduleStaffCount; iScheduleStaff++)
                {
                    frmMainSchedule.grdMain[iDay, iScheduleStaff].Style.ForeColor = clsCommonControl.GetWorkKindForeColor(
                        frmMainSchedule.grdMain[iDay, iScheduleStaff].Value.ToString());
                    frmMainSchedule.grdMain[iDay, iScheduleStaff].Style.BackColor = clsCommonControl.GetWeekNameBackgroundColor(
                        clsCommonControl.GetWeekName(frmMainSchedule.pstrTargetMonth + String.Format("{0:D2}", iDay), frmMainSchedule.astrHoliday));
                }
            }

            // 先頭列のみ固定とする
            frmMainSchedule.grdMain.Columns[0].Frozen = true;

            // 行の合計グリッドをセット
            SetRowTotal();

            // 列の合計グリッドをセット
            SetColumnTotal();

            // グリッドの選択状態を解除
            frmMainSchedule.grdMain.CurrentCell       = null;
            frmMainSchedule.grdMainHeader.CurrentCell = null;

            //グリッドの描画再開
            frmMainSchedule.grdMain.ResumeLayout();
            frmMainSchedule.grdMainHeader.ResumeLayout();
        }
        /// <summary>
        /// 帳票ファイル作成処理
        /// </summary>
        /// <param name="targetReport"></param>
        /// <param name="staffNo"></param>
        /// <param name="orderNo"></param>
        public void SaveFile()
        {
            DateTime       dtTargetMonth = DateTime.ParseExact(pstrTargetYear + pstrTargetMonth + "01", "yyyyMMdd", null);
            DataTable      dtScheduleDetail;
            SaveFileDialog sfd = new SaveFileDialog();

            // 保存ダイアログのプロパティ設定
            SetSaveFileDialogProperties(ref sfd);

            //ダイアログを表示する
            if (sfd.ShowDialog() != DialogResult.OK)
            {
                return;
            }

            // オブジェクト初期化
            InitializeObject();

            // Excelファイルの読み込み
            var xlReadFile = new FileInfo(strFilePath);

            // オブジェクトにセット
            using (var xlFile = new ExcelPackage(xlReadFile))
            {
                // シートを選択
                var xlSheet = xlFile.Workbook.Worksheets["シート"];

                //// === Excelデータ入力 ===

                // 作成年月
                xlSheet.Cells[ROW_CREATE_YEAR1, COLUMN_CREATE_YEAR1].Value = pstrTargetYear;
                xlSheet.Cells[ROW_CREATE_YEAR2, COLUMN_CREATE_YEAR2].Value = pstrTargetYear;

                xlSheet.Cells[ROW_CREATE_MONTH1, COLUMN_CREATE_MONTH1].Value = pstrTargetMonth;
                xlSheet.Cells[ROW_CREATE_MONTH2, COLUMN_CREATE_MONTH2].Value = pstrTargetMonth;

                // == 日付・曜日 ==
                for (int i = 0; i < DateTime.DaysInMonth(int.Parse(pstrTargetYear), int.Parse(pstrTargetMonth)); i++)
                {
                    // 日にち
                    xlSheet.Cells[ROW_DAY_START1, COLUMN_DAY_START1 + i].Value = i + 1;
                    xlSheet.Cells[ROW_DAY_START2, COLUMN_DAY_START2 + i].Value = i + 1;

                    // 曜日
                    xlSheet.Cells[ROW_DAY_OF_WEEK1, COLUMN_DAY_OF_WEEK1 + i].Value = dtTargetMonth.AddDays(double.Parse(i.ToString())).ToString("ddd") + "曜";
                    xlSheet.Cells[ROW_DAY_OF_WEEK2, COLUMN_DAY_OF_WEEK2 + i].Value = dtTargetMonth.AddDays(double.Parse(i.ToString())).ToString("ddd") + "曜";

                    if (clsCommonControl.GetWeekName(dtTargetMonth.AddDays(i).ToString("yyyyMMdd"), astrHoliday) == "祝" ||
                        clsCommonControl.GetWeekName(dtTargetMonth.AddDays(i).ToString("yyyyMMdd"), astrHoliday) == "日")
                    {
                        for (int iStaffCount = 0; iStaffCount <= ROW_TOTAL_ROW + 1; iStaffCount++)
                        {
                            xlSheet.Cells[ROW_DAY_START1 + iStaffCount, COLUMN_DAY_START1 + i].Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Gray125;
                            xlSheet.Cells[ROW_DAY_START2 + iStaffCount, COLUMN_DAY_START2 + i].Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Gray125;
                        }
                    }
                }
                // == 男性職員 ==

                // 複数ページ対応とするか判定
                if (astrScheduleStaff.GetLength(0) > ROW_TOTAL_ROW)
                {
                    // 1ページ目

                    // 職種、病棟名、職員氏名
                    for (int iStaff = 0; iStaff < ROW_TOTAL_ROW; iStaff++)
                    {
                        // 種別
                        xlSheet.Cells[ROW_STAFF_START1 + iStaff, COLUMN_STAFF_START1].Value = astrScheduleStaff[iStaff, 2];
                        // 病棟名
                        xlSheet.Cells[ROW_STAFF_START1 + iStaff, COLUMN_STAFF_START1 + 2].Value = astrScheduleStaff[iStaff, 3];
                        // 氏名
                        xlSheet.Cells[ROW_STAFF_START1 + iStaff, COLUMN_STAFF_START1 + 3].Value = astrScheduleStaff[iStaff, 1];
                    }

                    // 予定データ
                    for (int iStaff = 0; iStaff < ROW_TOTAL_ROW; iStaff++)
                    {
                        // 対象職員の計画データ取得
                        dtScheduleDetail = clsDatabaseControl.GetScheduleDetail_Ward_Staff_TargetMonth(astrScheduleStaff[iStaff, 4],
                                                                                                       astrScheduleStaff[iStaff, 0], dtTargetMonth.ToString("yyyyMM"));
                        // 1日から順に処理
                        for (int iDay = 0; iDay < DateTime.DaysInMonth(dtTargetMonth.Year, dtTargetMonth.Month); iDay++)
                        {
                            // 予定データがあるか確認
                            if (dtScheduleDetail.Rows.Count != 0)
                            {
                                // 予定データを順に確認
                                foreach (DataRow row in dtScheduleDetail.Rows)
                                {
                                    // 対象日と一致する
                                    if (DateTime.Parse(row["target_date"].ToString()).Day == iDay + 1)
                                    {
                                        // 予定データ
                                        xlSheet.Cells[ROW_STAFF_START1 + iStaff, COLUMN_DAY_START1 + iDay].Value = row["name_short"].ToString();
                                    }
                                }
                            }
                            else
                            {
                                // 空欄データとする
                                xlSheet.Cells[ROW_STAFF_START1 + iStaff, COLUMN_DAY_START1 + iDay].Value = "";
                            }
                        }
                    }

                    // 2ページ目
                    // 職種、病棟名、職員氏名
                    for (int iStaff = ROW_TOTAL_ROW; iStaff < astrScheduleStaff.GetLength(0); iStaff++)
                    {
                        // 種別
                        xlSheet.Cells[ROW_STAFF_START2 + (iStaff - ROW_TOTAL_ROW), COLUMN_STAFF_START2].Value = astrScheduleStaff[iStaff, 2];
                        // 病棟名
                        xlSheet.Cells[ROW_STAFF_START2 + (iStaff - ROW_TOTAL_ROW), COLUMN_STAFF_START2 + 2].Value = astrScheduleStaff[iStaff, 3];
                        // 氏名
                        xlSheet.Cells[ROW_STAFF_START2 + (iStaff - ROW_TOTAL_ROW), COLUMN_STAFF_START2 + 3].Value = astrScheduleStaff[iStaff, 1];
                    }

                    // 予定データ
                    for (int iStaff = ROW_TOTAL_ROW; iStaff < astrScheduleStaff.GetLength(0); iStaff++)
                    {
                        // 対象職員の計画データ取得
                        dtScheduleDetail = clsDatabaseControl.GetScheduleDetail_Ward_Staff_TargetMonth(astrScheduleStaff[iStaff, 4],
                                                                                                       astrScheduleStaff[iStaff, 0], dtTargetMonth.ToString("yyyyMM"));
                        // 1日から順に処理
                        for (int iDay = 0; iDay < DateTime.DaysInMonth(dtTargetMonth.Year, dtTargetMonth.Month); iDay++)
                        {
                            // 予定データがあるか確認
                            if (dtScheduleDetail.Rows.Count != 0)
                            {
                                // 予定データを順に確認
                                foreach (DataRow row in dtScheduleDetail.Rows)
                                {
                                    // 対象日と一致する
                                    if (DateTime.Parse(row["target_date"].ToString()).Day == iDay + 1)
                                    {
                                        // 予定データ
                                        xlSheet.Cells[ROW_STAFF_START2 + (iStaff - ROW_TOTAL_ROW), COLUMN_DAY_START2 + iDay].Value = row["name_short"].ToString();
                                    }
                                }
                            }
                            else
                            {
                                // 空欄データとする
                                xlSheet.Cells[ROW_STAFF_START1 + (iStaff - ROW_TOTAL_ROW), COLUMN_DAY_START2 + iDay].Value = "";
                            }
                        }
                    }
                }
                else
                {
                    // 1ページ目のみ

                    // 職種、病棟名、職員氏名
                    for (int iStaff = 0; iStaff < astrScheduleStaff.GetLength(0); iStaff++)
                    {
                        // 種別
                        xlSheet.Cells[ROW_STAFF_START1 + (iStaff - 1), COLUMN_STAFF_START1].Value = astrScheduleStaff[iStaff, 2];
                        // 病棟名
                        xlSheet.Cells[ROW_STAFF_START1 + (iStaff - 1), COLUMN_STAFF_START1 + 2].Value = astrScheduleStaff[iStaff, 3];
                        // 氏名
                        xlSheet.Cells[ROW_STAFF_START1 + (iStaff - 1), COLUMN_STAFF_START1 + 3].Value = astrScheduleStaff[iStaff, 1];
                    }

                    // 予定データ
                    for (int iStaff = 0; iStaff < astrScheduleStaff.GetLength(0); iStaff++)
                    {
                        // 対象職員の計画データ取得
                        dtScheduleDetail = clsDatabaseControl.GetScheduleDetail_Ward_Staff_TargetMonth(astrScheduleStaff[iStaff, 4],
                                                                                                       astrScheduleStaff[iStaff, 0], dtTargetMonth.ToString("yyyyMM"));
                        // 1日から順に処理
                        for (int iDay = 0; iDay < DateTime.DaysInMonth(dtTargetMonth.Year, dtTargetMonth.Month); iDay++)
                        {
                            // 予定データがあるか確認
                            if (dtScheduleDetail.Rows.Count != 0)
                            {
                                // 予定データを順に確認
                                foreach (DataRow row in dtScheduleDetail.Rows)
                                {
                                    // 対象日と一致する
                                    if (DateTime.Parse(row["target_date"].ToString()).Day == iDay + 1)
                                    {
                                        // 予定データ
                                        xlSheet.Cells[ROW_STAFF_START1 + (iStaff - 1), COLUMN_DAY_START1 + iDay].Value = row["name_short"].ToString();
                                    }
                                }
                            }
                            else
                            {
                                // 空欄データとする
                                xlSheet.Cells[ROW_STAFF_START1 + (iStaff - 1), COLUMN_DAY_START1 + iDay].Value = "";
                            }
                        }
                    }
                }

                // 印刷範囲の指定
                xlSheet.PrinterSettings.PrintArea = xlSheet.Cells[1, 1, 91, 36];

                // ファイルを保存
                xlFile.SaveAs(new FileInfo(sfd.FileName));
            }

            // 終了メッセージ
            MessageBox.Show("保存完了");
        }