using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace FPJ0000.OtConfirm { public partial class fHolyRequestAdd : Form { DSKuntae.EETGW_HolydayRequestRow dr; Boolean binit = false; public fHolyRequestAdd(DSKuntae.EETGW_HolydayRequestRow dr_) { InitializeComponent(); dr = dr_; var 구분목록 = FCOMMON.DBM.getCodeList("50"); var 사유목록 = FCOMMON.DBM.getCodeList("51"); var 위치목록 = FCOMMON.DBM.getCodeList("52"); var 백업목록 = FCOMMON.DBM.getCodeList("53"); tbCate.Items.Clear(); tbReason.Items.Clear(); tbLocation.Items.Clear(); tbBackup.Items.Clear(); foreach (var item in 구분목록) tbCate.Items.Add(item.Value); foreach (var item in 사유목록) tbReason.Items.Add(item.Value); foreach (var item in 위치목록) tbLocation.Items.Add(item.Value); foreach (var item in 백업목록) tbBackup.Items.Add(item.Value); var userlist = FCOMMON.DBM.getUserTable(); this.cmbUser.DataSource = userlist; this.cmbUser.ValueMember = "id"; this.cmbUser.DisplayMember = "dispname"; if (dr.IsstimeNull() == false) this.textBox1.Text = dr.stime; else this.textBox1.Text = "00:00"; if (dr.IsetimeNull() == false) this.textBox2.Text = dr.etime; else this.textBox2.Text = "00:00"; if (dr.RowState == DataRowState.Detached) { this.Text = "(휴가/외출)신청 추가"; cmbUser.Text = $"{FCOMMON.info.Login.nameK}({FCOMMON.info.Login.no})"; //tbProcess.Text = FCOMMON.info.Login.process; //tbTel.Text = FCOMMON.info.Login.tel; } else { this.Text = "(휴가/외출) 편집"; cmbUser.Text = $"{dr.name}({dr.uid})"; //dr.name; ////.Text = dr.processs; // tbTel.Text = dr.tel; } if (dr.conf == 1) rad1.Checked = true; else if (dr.conf == 2) rad2.Checked = true; else rad0.Checked = true; tbCate.Text = dr.cate; tbRemark.Text = dr.Remark; tbResponse.Text = dr.Response; tbSD.Value = DateTime.Parse(dr.sdate); tbED.Value = DateTime.Parse(dr.edate); tbReason.Text = dr.HolyReason; tbLocation.Text = dr.HolyLocation; tbBackup.Text = dr.HolyBackup; tbDays.Text = dr.HolyDays.ToString(); //211224 tbTimes.Text = dr.HolyTimes.ToString(); if (dr.cate == "대체") { tbTimes.Enabled = true; tbDays.Enabled = false; tbCate.Enabled = false; radTime.Checked = true; } else if (dr.cate == "외출") { radOut.Checked = true; } else { tbCate.Enabled = true; tbTimes.Enabled = false; tbDays.Enabled = true; radDay.Checked = true; } this.KeyDown += (s1, e1) => { if (e1.KeyCode == Keys.Escape) this.Close(); }; } int curLevel = 0; public bool IsAdmin { get { return curLevel >= 5; } } private void fHolyRequestAdd_Load(object sender, EventArgs e) { curLevel = Math.Max(FCOMMON.info.Login.level, FCOMMON.DBM.getAuth(FCOMMON.DBM.eAuthType.holyreq)); //관리자라면 관리자패널을 활성해준다. if (dr.RowState == DataRowState.Detached) { cmbUser.Enabled = IsAdmin;// curLevel >= 5; grpAdmin.Enabled = false; grpAdmin.Text = "관리자(추가작업시에는 사용할 수 없습니다)"; UpdateStatus(); } else { cmbUser.Enabled = false; grpAdmin.Enabled = IsAdmin;// curLevel >= 5; if (IsAdmin) { grpUser.Text = "신청자(편집상태에서는 사용자를 변경할 수 없습니다)"; } var 관리자사전멘트 = FCOMMON.DBM.getCodeList("54"); cmbPreset.Items.Clear(); cmbPreset.Items.Add(" -- 저장된 문구를 선택하세요(공용:54) --"); cmbPreset.Items.AddRange(관리자사전멘트.Select(t => t.Value).ToArray()); cmbPreset.SelectedIndex = 0; } if (IsAdmin) { tbCate.DropDownStyle = ComboBoxStyle.DropDown; } else { tbCate.DropDownStyle = ComboBoxStyle.DropDownList; } binit = true; cmbUser_SelectedIndexChanged(null, null); radioButton1_CheckedChanged(null, null); } private void button1_Click(object sender, EventArgs e) { var cate = tbCate.Text.Trim(); if (radTime.Checked) cate = "대체"; else if (radOut.Checked) cate = "외출"; var remark = tbRemark.Text.Trim(); var response = tbResponse.Text.Trim(); if (string.IsNullOrEmpty(cate)) { FCOMMON.Util.MsgE("구분을 입력하세요"); tbCate.Focus(); return; } //일반사용인데 내용이 대체 라는 문자라면 오류로 한다 220627 if (radTime.Checked == false && cate.Equals("대체")) { FCOMMON.Util.MsgE("일반 휴가 사용에 '대체' 문자는 입력할 수 없습니다\n대체 시간을 사용하는 경우 라면 '대체시간사용'을 입력하세요"); tbCate.Focus(); return; } if (tbED.Value.ToShortDateString().CompareTo(tbSD.Value.ToShortDateString()) < 0) { FCOMMON.Util.MsgE("시작일~종료일 범위를 확인하세요"); return; } var vDay = 0; var vTime = 0f; if (tbDays.Enabled == false) tbDays.Text = string.Empty; if (tbTimes.Enabled == false) tbTimes.Text = string.Empty; if (double.TryParse(tbDays.Text, out double val_days)) vDay = int.Parse(tbDays.Text.Trim()); if (double.TryParse(tbTimes.Text, out double val_times)) vTime = float.Parse(tbTimes.Text.Trim()); //라디오버튼에 따른 시간 값 할당 if (radTime.Checked) vDay = 0; else vTime = 0; if (radOut.Checked == false) { if (vDay > 0 && vTime > 0) { FCOMMON.Util.MsgE("사용일/시간을 동시에 입력할 수는 없습니다.\r\n" + "대체휴가의 경우에만 시간을 입력하시기 바랍니다"); return; } if (vDay < 1 && vTime < 0.1 && curLevel < 5) { var dlg = FCOMMON.Util.MsgQ("사용 일/시간 값을 입력해주세요\n대체휴가에는 시간을 입력하세요\n값을 입력하지 않고 계속할까요?"); if (dlg != DialogResult.Yes) return; } } else { if (textBox1.Text.IndexOf(":") == -1 || textBox1.Text.Equals("00:00")) { FCOMMON.Util.MsgE("외출 시작시간은 00:00 24시 표기법으로 입력하세요\n" + "예) 오후2시 = 14:00"); textBox1.Focus(); textBox1.SelectAll(); return; } //추가시에는 종료시간을 입력하지 않게한다. if (dr.RowState == DataRowState.Detached) { if (textBox2.Text.IndexOf(":") == -1 || textBox2.Text.Equals("00:00")) { } else { textBox2.Text = "00:00"; FCOMMON.Util.MsgI("신청데이터에는 외출종료시간을 입력하지 않습니다\n외출종료 화면에서 시간을 입력하세요"); } } //if (textBox2.Text.IndexOf(":") == -1 || textBox2.Text.Equals("00:00")) //{ // FCOMMON.Util.MsgE("외출 종료시간은 00:00 24시 표기법으로 입력하세요\n" + // "예) 오후2시 = 14:00"); // textBox2.Focus(); // textBox2.SelectAll(); // return; //} // if (tbSD.Value.ToShortDateString().Equals(tbED.Value.ToShortDateString()) == false) { FCOMMON.Util.MsgE("외출은 시작일 종료일이 같아야 합니다, 종료일자를 시작일자로 자동 변경 합니다"); tbED.Value = tbSD.Value; return; } if (textBox2.Text.Equals("00:00") == false) { var st = DateTime.Parse(tbSD.Value.ToShortDateString() + " " + textBox1.Text + ":00"); var et = DateTime.Parse(tbED.Value.ToShortDateString() + " " + textBox2.Text + ":00"); if (et <= st) { FCOMMON.Util.MsgE("외출 시간을 확인하세요.\n종료시간은 시작시간보다 커야 합니다"); return; } } } var uid = this.cmbUser.SelectedValue; if (uid == null) { FCOMMON.Util.MsgE("사용자가 선택되지 않았습니다"); return; } //사용시간여부 확인 if (radOut.Checked == false) { var minmsg = "해당 항목 [{0}]의 신청 가능 일(시간)이 없습니다\n\n남은 일(시간) : {1} \n\n관리자 문의 하세요"; if (IsAdmin) minmsg = "해당 항목 [{0}]의 신청 가능 일(시간)이 없습니다\n\n남은 일(시간) : {1} \n\n관리자 권한으로 기록은 진행 됩니다"; bool oktime = false; if (radTime.Checked) //대체사용 { minmsg = minmsg.Replace("{0}", "대체"); if (holydata.ContainsKey("대체")) { var data = holydata["대체"].Split('|'); var 발생 = float.Parse(data[3]); var 사용 = float.Parse(data[4]); var 잔량 = float.Parse(data[5]); if (vTime <= 잔량) oktime = true; else minmsg = minmsg.Replace("{1}", 잔량.ToString()); } else minmsg = minmsg.Replace("{1}", "(자료없음)"); } else { var 항목 = tbCate.Text; minmsg = minmsg.Replace("{0}", 항목); if (holydata.ContainsKey(항목)) { var data = holydata[항목].Split('|'); var 발생 = float.Parse(data[0]); var 사용 = float.Parse(data[1]); var 잔량 = float.Parse(data[2]); if (vDay <= 잔량) oktime = true; else minmsg = minmsg.Replace("{1}", 잔량.ToString()); } else minmsg = minmsg.Replace("{1}", "(자료없음)"); } if (oktime == false) { //FCOMMON.Util.MsgE(minmsg); //if (IsAdmin == false) return; } } // return; //하나도 입력안했다면 경고한다 if (String.IsNullOrEmpty(tbReason.Text) && String.IsNullOrEmpty(tbLocation.Text) && String.IsNullOrEmpty(tbBackup.Text) && String.IsNullOrEmpty(tbRemark.Text)) { FCOMMON.Util.MsgE("비고를 입력해주세요"); tbRemark.Focus(); return; } if (tbRemark.Text.StartsWith("테스트") && chkSendMail.Checked) { FCOMMON.Util.MsgI("테스트라 메일 체크를 끕니다"); chkSendMail.Checked = false; } //동일날짜에 등록된 자료가있다면 오류로 처리한다. if (dr.RowState == DataRowState.Detached) { var db = new EEEntities(); string chkdt = tbSD.Value.ToShortDateString(); var existdb = db.EETGW_HolydayRequest.Where(t => t.gcode == FCOMMON.info.Login.gcode && t.cate == cate && t.uid == uid.ToString() && t.sdate == chkdt).Any(); if (existdb) { FCOMMON.Util.MsgE("동일 날짜에 등록된 자료가 있습니다"); return; } } //마감확인 220501 if (FCOMMON.DBM.GetMagamStatus(tbSD.Value)) { FCOMMON.Util.MsgE("마감된 월 입니다. 입력할 수 없습니다"); return; } if (FCOMMON.DBM.GetMagamStatus(tbED.Value)) { FCOMMON.Util.MsgE("마감된 월 입니다. 입력할 수 없습니다"); return; } if (dr.RowState == DataRowState.Detached) { var dlg = FCOMMON.Util.MsgQ("입력을 완료하시겠습니까?\r\n관리자에게 메일로 알림이 발생 합니다"); if (dlg != DialogResult.Yes) return; } if (curLevel >= 5 && rad2.Checked) { if (string.IsNullOrEmpty(response)) { FCOMMON.Util.MsgE("거절 사유를 입력 해주세요"); tbResponse.Focus(); return; } } dr.uid = uid.ToString(); dr.HolyReason = tbReason.Text.Trim(); dr.HolyLocation = tbLocation.Text.Trim(); dr.HolyBackup = tbBackup.Text.Trim(); dr.cate = cate;// tbCate.Text.Trim(); if (dr.RowState == DataRowState.Detached && dr.Remark.Contains(richTextBox1.Text) == false) dr.Remark = tbRemark.Text.Trim() + "\r\n" + this.richTextBox1.Text; else dr.Remark = tbRemark.Text.Trim(); dr.Response = tbResponse.Text.Trim(); dr.sdate = tbSD.Value.ToShortDateString(); dr.edate = tbED.Value.ToShortDateString(); dr.sendmail = chkSendMail.Checked; //220104 if (textBox1.Text.isEmpty() == false && textBox1.Text.Equals("00:00") == false) dr.stime = textBox1.Text.Trim(); if (textBox2.Text.isEmpty() == false && textBox2.Text.Equals("00:00") == false) dr.etime = textBox2.Text.Trim(); dr.HolyDays = vDay; dr.HolyTimes = vTime;// if (rad0.Checked) dr.conf = 0; else if (rad1.Checked) dr.conf = 1; else if (rad2.Checked) dr.conf = 2; else dr.conf = 0; dr.EndEdit(); DialogResult = DialogResult.OK; } private void cmbPreset_SelectedIndexChanged(object sender, EventArgs e) { if (cmbPreset.SelectedIndex > 0) tbResponse.Text = cmbPreset.Text; } private void tbED_ValueChanged(object sender, EventArgs e) { UpdateStatus(); } void UpdateStatus() { //해당 값이 오늘보다 이전이라면 메일전송을 자동 해제하낟. var v = tbED.Value.ToShortDateString(); var s = tbSD.Value.ToShortDateString(); var c = DateTime.Now.ToShortDateString(); if (v.CompareTo(c) < 0) chkSendMail.Checked = false; else chkSendMail.Checked = true; //일수계산 //var term = tbED.Value - tbSD.Value; //var days = term.Days + 1; //if (radTime.Checked == false) //{ // //if(tbDays.Text.isEmpty() || tbDays.Text=="0") // { // tbDays.Text = (days).ToString(); // } //} //else //{ // //여기는 시간 // //if (tbTimes.Text.isEmpty() || tbTimes.Text == "0") // { // tbTimes.Text = (days * 8).ToString(); // } //} } private void radioButton1_CheckedChanged(object sender, EventArgs e) { if (radTime.Checked) { tbCate.Enabled = false; tbDays.Enabled = false; tbTimes.Enabled = true; tbDays.BackColor = Color.DimGray; tbTimes.BackColor = Color.Gold; groupBox1.Text = "사용시간"; radTime.BackColor = Color.Lime; radDay.BackColor = SystemColors.Control; radOut.BackColor = SystemColors.Control; groupBox1.Enabled = true; textBox1.Enabled = false; } else if (radDay.Checked) { tbCate.Enabled = true; tbDays.Enabled = true; tbTimes.Enabled = false; tbTimes.BackColor = Color.DimGray; tbDays.BackColor = Color.Gold; groupBox1.Text = "사용일"; radDay.BackColor = Color.Lime; radTime.BackColor = SystemColors.Control; radOut.BackColor = SystemColors.Control; groupBox1.Enabled = true; textBox1.Enabled = false; } else if (radOut.Checked) { radOut.BackColor = Color.Lime; radTime.BackColor = SystemColors.Control; radDay.BackColor = SystemColors.Control; textBox1.Enabled = radOut.Checked; if (dr.RowState == DataRowState.Detached) textBox2.Enabled = false; else textBox2.Enabled = true; groupBox1.Enabled = !textBox1.Enabled; } textBox2.Enabled = textBox1.Enabled; if (binit) UpdateStatus(); } Dictionary holydata = new Dictionary(); string updateuserinfo = string.Empty; private void cmbUser_SelectedIndexChanged(object sender, EventArgs e) { var uiddt = this.cmbUser.SelectedValue; if (uiddt == null) return; var uid = uiddt.ToString(); if (uid.isEmpty()) return; var basedate = DateTime.Now.AddDays(-1).ToShortDateString(); holydata = FCOMMON.DBM.GetUserHolidayJan(FCOMMON.info.Login.gcode, uid, basedate); this.richTextBox1.Clear(); if (holydata.Any()) richTextBox1.AppendText($"[기준:{basedate}] => "); foreach (var item in holydata) { var val = item.Value.Split('|'); if (val[2] != "0") { var perc = 0f; if (val[0] != "0") perc = float.Parse(val[1]) / float.Parse(val[0]); if (richTextBox1.TextLength > 0) richTextBox1.AppendText(","); richTextBox1.AppendText($"[{item.Key}] {val[2]}일 남음({perc * 100:N1}%사용)"); } else if (val[5] != "0") { var perc = 0f; if (val[3] != "0") perc = float.Parse(val[4]) / float.Parse(val[3]); if (richTextBox1.TextLength > 0) richTextBox1.AppendText(","); richTextBox1.AppendText($"[{item.Key}] {val[5]}시간 남음({perc * 100:N1}%사용)"); } } if (holydata.Any()) updateuserinfo = uid; //업데이트한 사용자 id 기록 } private void radioButton1_CheckedChanged_1(object sender, EventArgs e) { } } }