/// <summary>
        /// 新生異動
        /// </summary>
        public UpdateRecordInfo03(SHUpdateRecordRecord UpdateRec, PermRecLogProcess prlp, List<XElement> UpdateCodeElms)
        {
            InitializeComponent();
            cbxGender.Items.Add("男");
            cbxGender.Items.Add("女");

            _UpdateRec = UpdateRec;
            _prlp = prlp;
            _UpdateCodeElms = UpdateCodeElms;
            _UpdateCoodeList = (from x in _UpdateCodeElms select x.Element("代號").Value + " " + x.Element("原因及事項").Value).ToList();
            _DeptList = SHDepartment.SelectAll();
            _epUpdateCode = new ErrorProvider();

            _UCodeDict = Utility.UITool.ConvertUpdateCodeDescDict(_UpdateCodeElms);

            _faldn = new UpdateRecordModule_SH_D.Utility.FormAndLogDataManager(_prlp);

            // 載入資料
            // 載入預設前級畢業資訊
            Dictionary<string, DAL.SchoolData> schoolDataDict = new Dictionary<string, DAL.SchoolData>();

            foreach (XElement elm in BL.Get.JHSchoolList().Elements("學校"))
            {
                DAL.SchoolData sd = new DAL.SchoolData();
                sd.SchoolCode = elm.Attribute("代碼").Value;
                sd.SchoolLocation = elm.Attribute("所在地").Value;
                sd.SchoolName = elm.Attribute("名稱").Value;
                sd.SchoolLocationCode = elm.Attribute("所在地代碼").Value;
                if (sd.SchoolCode.Length > 3)
                    sd.SchoolType = sd.SchoolCode.Substring(2, 1);

                string s1 = elm.Attribute("所在地").Value + elm.Attribute("名稱").Value;

                if (!schoolDataDict.ContainsKey(s1))
                    schoolDataDict.Add(s1, sd);

                if (!schoolDataDict.ContainsKey(sd.SchoolName))
                    schoolDataDict.Add(sd.SchoolName, sd);

            }

            SHBeforeEnrollmentRecord brfRec = SHBeforeEnrollment.SelectByStudentID(_UpdateRec.StudentID);

            if (string.IsNullOrEmpty(_UpdateRec.GraduateSchool))
                _UpdateRec.GraduateSchool = brfRec.School;
            if (string.IsNullOrEmpty(_UpdateRec.GraduateSchoolYear))
                _UpdateRec.GraduateSchoolYear = brfRec.GraduateSchoolYear;

            // 用學校名稱解析
            if (!string.IsNullOrEmpty(brfRec.School))
            {
                string key = brfRec.SchoolLocation.Replace("台", "臺") + brfRec.School.Trim();
                if (schoolDataDict.ContainsKey(key))
                {
                    if (string.IsNullOrEmpty(_UpdateRec.GraduateSchoolCode))
                    {
                        _UpdateRec.GraduateSchoolCode = schoolDataDict[key].SchoolCode;
                        _UpdateRec.GraduateSchoolLocationCode = schoolDataDict[key].SchoolLocationCode;
                    }
                }
            }

            cbxUpdateCode = _faldn.SetFormData(_UpdateRec.UpdateCode, cbxUpdateCode, "資格代碼");
            txtDesc = _faldn.SetFormData(_UpdateRec.UpdateDescription, txtDesc, "原因及事項");
            dtUpdateDate = _faldn.SetFormData(_UpdateRec.UpdateDate, dtUpdateDate, "異動日期");
            txtMemo = _faldn.SetFormData(_UpdateRec.Comment, txtMemo, "備註");
            cbxDept = _faldn.SetFormData(_UpdateRec.Department, cbxDept, "科別");
            cbxClass = _faldn.SetFormData(_UpdateRec.ClassType, cbxClass, "班別");
            txtSpecial = _faldn.SetFormData(_UpdateRec.SpecialStatus, txtSpecial, "特殊身分代碼");
            txtName = _faldn.SetFormData(_UpdateRec.StudentName, txtName, "姓名");
            txtStudentNumber = _faldn.SetFormData(_UpdateRec.StudentNumber, txtStudentNumber, "學號");
            txtIDNumber = _faldn.SetFormData(_UpdateRec.IDNumber, txtIDNumber, "身分證字號");
            dtBirthday = _faldn.SetFormData(_UpdateRec.Birthdate, dtBirthday, "生日");
            txtIDNumber1 = _faldn.SetFormData(_UpdateRec.IDNumberComment, txtIDNumber1, "註1");
            cbxGender = _faldn.SetFormData(_UpdateRec.Gender, cbxGender, "性別");
            txtISchool = _faldn.SetFormData(_UpdateRec.GraduateSchool, txtISchool, "入學資格(畢業國中)");
            txtISpaceCode = _faldn.SetFormData(_UpdateRec.GraduateSchoolLocationCode,txtISpaceCode,"所在地代碼");
            txtISchoolCode = _faldn.SetFormData(_UpdateRec.GraduateSchoolCode, txtISchoolCode, "畢業國中學校代號");
            txtIJHGradeYear = _faldn.SetFormData(_UpdateRec.GraduateSchoolYear, txtIJHGradeYear, "國中畢業年度");
            dtADDate = _faldn.SetFormData(_UpdateRec.ADDate, dtADDate, "核准日期");
            txtADDocNo = _faldn.SetFormData(_UpdateRec.ADNumber, txtADDocNo, "核准文號");
            txtGradeDoc = _faldn.SetFormData(_UpdateRec.GraduateDocument, txtGradeDoc, "入學資格證明文件");
        }
        /// <summary>
        /// 新生異動
        /// </summary>
        public UpdateRecordInfo03(SHUpdateRecordRecord UpdateRec, PermRecLogProcess prlp, List <XElement> UpdateCodeElms, bool isInsert)
        {
            InitializeComponent();
            cbxGender.Items.Add("男");
            cbxGender.Items.Add("女");

            cbxClass.DropDownWidth = 300;

            _UpdateRec       = UpdateRec;
            _prlp            = prlp;
            _UpdateCodeElms  = UpdateCodeElms;
            _UpdateCoodeList = (from x in _UpdateCodeElms select x.Element("代號").Value + " " + x.Element("原因及事項").Value).ToList();
            _DeptList        = SHDepartment.SelectAll();
            _epUpdateCode    = new ErrorProvider();

            _UCodeDict = Utility.UITool.ConvertUpdateCodeDescDict(_UpdateCodeElms);

            _faldn = new UpdateRecordModule_SH_D.Utility.FormAndLogDataManager(_prlp);

            // 新增帶入預設
            if (isInsert)
            {
                // 載入資料
                // 載入預設前級畢業資訊
                Dictionary <string, DAL.SchoolData> schoolDataDict = new Dictionary <string, DAL.SchoolData>();

                foreach (XElement elm in BL.Get.JHSchoolList().Elements("學校"))
                {
                    DAL.SchoolData sd = new DAL.SchoolData();
                    sd.SchoolCode         = elm.Attribute("代碼").Value;
                    sd.SchoolLocation     = elm.Attribute("所在地").Value;
                    sd.SchoolName         = elm.Attribute("名稱").Value;
                    sd.SchoolLocationCode = elm.Attribute("所在地代碼").Value;
                    if (sd.SchoolCode.Length > 3)
                    {
                        sd.SchoolType = sd.SchoolCode.Substring(2, 1);
                    }

                    string s1 = elm.Attribute("所在地").Value + elm.Attribute("名稱").Value;

                    if (!schoolDataDict.ContainsKey(s1))
                    {
                        schoolDataDict.Add(s1, sd);
                    }

                    if (!schoolDataDict.ContainsKey(sd.SchoolName))
                    {
                        schoolDataDict.Add(sd.SchoolName, sd);
                    }
                }

                SHBeforeEnrollmentRecord brfRec = SHBeforeEnrollment.SelectByStudentID(_UpdateRec.StudentID);

                if (string.IsNullOrEmpty(_UpdateRec.GraduateSchool))
                {
                    _UpdateRec.GraduateSchool = brfRec.School;
                }
                if (string.IsNullOrEmpty(_UpdateRec.GraduateSchoolYear))
                {
                    _UpdateRec.GraduateSchoolYear = brfRec.GraduateSchoolYear;
                }

                // 用學校名稱解析
                if (!string.IsNullOrEmpty(brfRec.School))
                {
                    string key = brfRec.SchoolLocation.Replace("台", "臺") + brfRec.School.Trim();
                    if (schoolDataDict.ContainsKey(key))
                    {
                        if (string.IsNullOrEmpty(_UpdateRec.GraduateSchoolCode))
                        {
                            _UpdateRec.GraduateSchoolCode         = schoolDataDict[key].SchoolCode;
                            _UpdateRec.GraduateSchoolLocationCode = schoolDataDict[key].SchoolLocationCode;
                        }
                    }
                }
            }

            cbxUpdateCode    = _faldn.SetFormData(_UpdateRec.UpdateCode, cbxUpdateCode, "資格代碼");
            txtDesc          = _faldn.SetFormData(_UpdateRec.UpdateDescription, txtDesc, "原因及事項");
            dtUpdateDate     = _faldn.SetFormData(_UpdateRec.UpdateDate, dtUpdateDate, "異動日期");
            txtMemo          = _faldn.SetFormData(_UpdateRec.Comment, txtMemo, "備註");
            cbxDept          = _faldn.SetFormData(_UpdateRec.Department, cbxDept, "科別");
            cbxClass         = _faldn.SetFormData(_UpdateRec.ClassType, cbxClass, "班別");
            txtSpecial       = _faldn.SetFormData(_UpdateRec.SpecialStatus, txtSpecial, "特殊身分代碼");
            txtName          = _faldn.SetFormData(_UpdateRec.StudentName, txtName, "姓名");
            txtStudentNumber = _faldn.SetFormData(_UpdateRec.StudentNumber, txtStudentNumber, "學號");
            txtIDNumber      = _faldn.SetFormData(_UpdateRec.IDNumber, txtIDNumber, "身分證字號");
            dtBirthday       = _faldn.SetFormData(_UpdateRec.Birthdate, dtBirthday, "生日");
            txtIDNumber1     = _faldn.SetFormData(_UpdateRec.IDNumberComment, txtIDNumber1, "註1");
            cbxGender        = _faldn.SetFormData(_UpdateRec.Gender, cbxGender, "性別");
            txtISchool       = _faldn.SetFormData(_UpdateRec.GraduateSchool, txtISchool, "入學資格(畢業國中)");
            txtISpaceCode    = _faldn.SetFormData(_UpdateRec.GraduateSchoolLocationCode, txtISpaceCode, "所在地代碼");
            txtISchoolCode   = _faldn.SetFormData(_UpdateRec.GraduateSchoolCode, txtISchoolCode, "畢業國中學校代號");
            txtIJHGradeYear  = _faldn.SetFormData(_UpdateRec.GraduateSchoolYear, txtIJHGradeYear, "國中畢業年度");
            dtADDate         = _faldn.SetFormData(_UpdateRec.ADDate, dtADDate, "核准日期");
            txtADDocNo       = _faldn.SetFormData(_UpdateRec.ADNumber, txtADDocNo, "核准文號");
            txtGradeDoc      = _faldn.SetFormData(_UpdateRec.GraduateDocument, txtGradeDoc, "入學資格證明文件");
        }
        /// <summary>
        /// 產生新生異動(傳入學生編號、異動日期、異動代碼、班別)
        /// </summary>
        /// <param name="StudentIDList"></param>
        /// <param name="UpdateDate"></param>
        /// <param name="UpdateCode"></param>
        /// <param name="ClassType"></param>
        /// <returns></returns>
        public bool Run(List <string> StudentIDList, string UpdateDate, string UpdateCode, string UpdateDesc, string ClassType)
        {
            bool pass = true;
            List <SHBeforeEnrollmentRecord> befRecList = SHBeforeEnrollment.SelectByStudentIDs(StudentIDList);

            Dictionary <string, DAL.SchoolData> schoolDataDict = new Dictionary <string, DAL.SchoolData> ();

            foreach (XElement elm in BL.Get.JHSchoolList().Elements("學校"))
            {
                DAL.SchoolData sd = new DAL.SchoolData();
                sd.SchoolCode         = elm.Attribute("代碼").Value;
                sd.SchoolLocation     = elm.Attribute("所在地").Value;
                sd.SchoolName         = elm.Attribute("名稱").Value;
                sd.SchoolLocationCode = elm.Attribute("所在地代碼").Value;
                if (sd.SchoolCode.Length > 3)
                {
                    sd.SchoolType = sd.SchoolCode.Substring(2, 1);
                }

                string s1 = elm.Attribute("所在地").Value + elm.Attribute("名稱").Value;

                if (!schoolDataDict.ContainsKey(s1))
                {
                    schoolDataDict.Add(s1, sd);
                }

                if (!schoolDataDict.ContainsKey(sd.SchoolName))
                {
                    schoolDataDict.Add(sd.SchoolName, sd);
                }
            }

            int SchoolYear = 0, Semester = 0;

            int.TryParse(K12.Data.School.DefaultSchoolYear, out SchoolYear);
            int.TryParse(K12.Data.School.DefaultSemester, out Semester);

            List <string> _CheckCodeList               = (from data in _UpdateCodeList select data.Substring(0, 3)).ToList();

            List <SHUpdateRecordRecord> insertData     = new List <SHUpdateRecordRecord>();
            List <SHUpdateRecordRecord> WaitDeleteData = new List <SHUpdateRecordRecord>();

            // 取得學生資料
            List <SHStudentRecord> studRecList         = SHStudent.SelectByIDs(StudentIDList);

            List <string> SIDList                      = new List <string>();

            // 取得已有新生異動
            foreach (SHUpdateRecordRecord rec in SHUpdateRecord.SelectByStudentIDs(StudentIDList))
            {
                if (_CheckCodeList.Contains(rec.UpdateCode))
                {
                    WaitDeleteData.Add(rec);
                    if (!SIDList.Contains(rec.StudentID))
                    {
                        SIDList.Add(rec.StudentID);
                    }
                }
            }


            bool checkdelData = true;

            // 已有資料是否覆蓋
            if (SIDList.Count > 0)
            {
                WarningForm wf = new WarningForm();
                wf.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
                wf.SetStudentCount(SIDList.Count);
                wf.SetStudRec(studRecList);
                wf.SetUpdateRecList(WaitDeleteData);
                if (wf.ShowDialog() == System.Windows.Forms.DialogResult.Cancel)
                {
                    checkdelData = false;
                    pass         = false;
                }
            }


            // 清掉舊資料
            if (checkdelData)
            {
                SHUpdateRecord.Delete(WaitDeleteData);
            }

            // 取得新生異動
            foreach (SHStudentRecord studRec in studRecList)
            {
                // 不刪除代表不需要新增,所以略過
                if (checkdelData == false)
                {
                    if (SIDList.Contains(studRec.ID))
                    {
                        continue;
                    }
                }

                SHUpdateRecordRecord NewUpdateRec = new SHUpdateRecordRecord();

                if (SchoolYear > 0)
                {
                    NewUpdateRec.SchoolYear = SchoolYear;
                }

                if (Semester > 0)
                {
                    NewUpdateRec.Semester = Semester;
                }

                if (studRec.Class != null)
                {
                    if (studRec.Class.GradeYear.HasValue)
                    {
                        NewUpdateRec.GradeYear = studRec.Class.GradeYear.Value.ToString();
                    }
                }

                NewUpdateRec.GraduateComment   = "";
                NewUpdateRec.UpdateCode        = UpdateCode;
                NewUpdateRec.UpdateDescription = UpdateDesc;
                NewUpdateRec.UpdateDate        = UpdateDate;
                NewUpdateRec.ClassType         = ClassType;

                NewUpdateRec.SpecialStatus = DAL.DALTransfer.GetSpecialCode(studRec.ID);

                if (studRec.Department != null)
                {
                    NewUpdateRec.Department = studRec.Department.FullName;
                }
                NewUpdateRec.StudentID     = studRec.ID;
                NewUpdateRec.StudentName   = studRec.Name;
                NewUpdateRec.StudentNumber = studRec.StudentNumber;
                NewUpdateRec.IDNumber      = studRec.IDNumber;
                if (studRec.Birthday.HasValue)
                {
                    NewUpdateRec.Birthdate = studRec.Birthday.Value.ToShortDateString();
                }
                NewUpdateRec.Gender = studRec.Gender;

                if (int.Parse(UpdateCode) > 5)
                {
                    NewUpdateRec.GraduateComment = "1";
                }


                foreach (SHBeforeEnrollmentRecord brfRec in befRecList)
                {
                    if (brfRec.RefStudentID == NewUpdateRec.StudentID)
                    {
                        NewUpdateRec.GraduateSchool     = brfRec.School;
                        NewUpdateRec.GraduateSchoolYear = brfRec.GraduateSchoolYear;

                        // 用學校名稱解析
                        if (!string.IsNullOrEmpty(brfRec.School))
                        {
                            string key = brfRec.SchoolLocation.Replace("台", "臺") + brfRec.School.Trim();
                            if (schoolDataDict.ContainsKey(key))
                            {
                                NewUpdateRec.GraduateSchoolCode         = schoolDataDict[key].SchoolCode;
                                NewUpdateRec.GraduateSchoolLocationCode = schoolDataDict[key].SchoolLocationCode;
                            }
                        }
                    }
                }
                insertData.Add(NewUpdateRec);
            }

            // 新增異動
            SHUpdateRecord.Insert(insertData);

            return(pass);
        }
        /// <summary>
        /// 產生新生異動(傳入學生編號、異動日期、異動代碼、班別)
        /// </summary>
        /// <param name="StudentIDList"></param>
        /// <param name="UpdateDate"></param>
        /// <param name="UpdateCode"></param>
        /// <param name="ClassType"></param>
        /// <returns></returns>
        public bool Run(List<string> StudentIDList, string UpdateDate, string UpdateCode,string UpdateDesc, string ClassType)
        {
            bool pass = true;
            List<SHBeforeEnrollmentRecord> befRecList = SHBeforeEnrollment.SelectByStudentIDs(StudentIDList);

            Dictionary<string,DAL.SchoolData> schoolDataDict =new Dictionary<string,DAL.SchoolData> ();

            foreach (XElement elm in BL.Get.JHSchoolList().Elements("學校"))
            {
                DAL.SchoolData sd = new DAL.SchoolData();
                sd.SchoolCode=elm.Attribute("代碼").Value ;
                sd.SchoolLocation=elm.Attribute("所在地").Value ;
                sd.SchoolName=elm.Attribute("名稱").Value ;
                sd.SchoolLocationCode=elm.Attribute("所在地代碼").Value;
                 if (sd.SchoolCode.Length > 3)
                    sd.SchoolType=sd.SchoolCode.Substring(2,1);

                string s1=elm.Attribute("所在地").Value +elm.Attribute("名稱").Value;

                if (!schoolDataDict.ContainsKey(s1))
                    schoolDataDict.Add(s1, sd);

                if (!schoolDataDict.ContainsKey(sd.SchoolName))
                    schoolDataDict.Add(sd.SchoolName, sd);

            }

            int SchoolYear=0, Semester=0;
            int.TryParse(K12.Data.School.DefaultSchoolYear, out SchoolYear);
            int.TryParse(K12.Data.School.DefaultSemester, out Semester);

            List<string> _CheckCodeList = (from data in _UpdateCodeList select data.Substring(0, 3)).ToList();

            List<SHUpdateRecordRecord> insertData = new List<SHUpdateRecordRecord>();
            List<SHUpdateRecordRecord> WaitDeleteData = new List<SHUpdateRecordRecord>();

            // 取得學生資料
            List<SHStudentRecord> studRecList = SHStudent.SelectByIDs(StudentIDList);

            List<string> SIDList = new List<string>();

            // 取得已有新生異動
            foreach (SHUpdateRecordRecord rec in SHUpdateRecord.SelectByStudentIDs(StudentIDList))
            {
                if (_CheckCodeList.Contains(rec.UpdateCode))
                {
                    WaitDeleteData.Add(rec);
                    if (!SIDList.Contains(rec.StudentID))
                        SIDList.Add(rec.StudentID);
                }
            }

            bool checkdelData=true;

            // 已有資料是否覆蓋
            if (SIDList.Count > 0)
            {

                WarningForm wf = new WarningForm();
                wf.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
                wf.SetStudentCount(SIDList.Count);
                wf.SetStudRec(studRecList);
                wf.SetUpdateRecList(WaitDeleteData);
                if (wf.ShowDialog() == System.Windows.Forms.DialogResult.Cancel)
                {
                    checkdelData = false;
                    pass = false;
                }
            }

            // 清掉舊資料
            if (checkdelData)
            {
                SHUpdateRecord.Delete(WaitDeleteData);
            }

            // 取得新生異動
            foreach (SHStudentRecord studRec in studRecList)
            {
                // 不刪除代表不需要新增,所以略過
                if(checkdelData== false)
                    if (SIDList.Contains(studRec.ID))
                        continue;

                SHUpdateRecordRecord NewUpdateRec = new SHUpdateRecordRecord();

                if (SchoolYear > 0)
                    NewUpdateRec.SchoolYear = SchoolYear;

                if (Semester > 0)
                    NewUpdateRec.Semester = Semester;

                if (studRec.Class != null)
                    if (studRec.Class.GradeYear.HasValue)
                        NewUpdateRec.GradeYear = studRec.Class.GradeYear.Value.ToString();

                NewUpdateRec.GraduateComment = "";
                NewUpdateRec.UpdateCode = UpdateCode;
                NewUpdateRec.UpdateDescription = UpdateDesc;
                NewUpdateRec.UpdateDate = UpdateDate;
                NewUpdateRec.ClassType = ClassType;

                NewUpdateRec.SpecialStatus = DAL.DALTransfer.GetSpecialCode(studRec.ID);

                if (studRec.Department != null)
                {
                    NewUpdateRec.Department = studRec.Department.FullName;
                }
                NewUpdateRec.StudentID = studRec.ID;
                NewUpdateRec.StudentName = studRec.Name;
                NewUpdateRec.StudentNumber = studRec.StudentNumber;
                NewUpdateRec.IDNumber = studRec.IDNumber;
                if (studRec.Birthday.HasValue)
                    NewUpdateRec.Birthdate = studRec.Birthday.Value.ToShortDateString();
                NewUpdateRec.Gender = studRec.Gender;

                if (int.Parse(UpdateCode) > 5)
                    NewUpdateRec.GraduateComment = "1";

                foreach (SHBeforeEnrollmentRecord brfRec in befRecList)
                {
                    if (brfRec.RefStudentID == NewUpdateRec.StudentID)
                    {
                        NewUpdateRec.GraduateSchool = brfRec.School;
                        NewUpdateRec.GraduateSchoolYear = brfRec.GraduateSchoolYear;

                        // 用學校名稱解析
                        if (!string.IsNullOrEmpty(brfRec.School))
                        {
                            string key = brfRec.SchoolLocation.Replace("台", "臺") + brfRec.School.Trim();
                            if (schoolDataDict.ContainsKey(key))
                            {
                                NewUpdateRec.GraduateSchoolCode = schoolDataDict[key].SchoolCode;
                                NewUpdateRec.GraduateSchoolLocationCode = schoolDataDict[key].SchoolLocationCode;
                            }
                        }
                    }

                }
                insertData.Add(NewUpdateRec);
            }

            // 新增異動
            SHUpdateRecord.Insert(insertData);

            return pass;
        }