Files
Groupware/SubProject/FPJ0000/JobReport_/fJobReport_Add.cs
2022-02-09 09:55:22 +09:00

718 lines
28 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace FPJ0000.JobReport_
{
public partial class fJobReport_Add : Form
{
dsPRJ.JobReportRow dr;
Boolean copyMOde = false;
Boolean bInit = false;
bool ReadMode = false;
public fJobReport_Add(dsPRJ.JobReportRow dr_, Boolean copy = false, Boolean read = false)
{
InitializeComponent();
dr = dr_;
ReadMode = read;
this.KeyPreview = true;
this.StartPosition = FormStartPosition.CenterScreen;
this.KeyDown += (s1, e1) =>
{
if (e1.KeyCode == Keys.Escape) this.Close();
};
foreach (Control ctl in this.panel1.Controls)
{
if (ctl.GetType() == typeof(TextBox) || ctl.GetType() == typeof(ComboBox))
{
ctl.KeyDown += ctl_KeyDown;
}
}
copyMOde = copy;
this.tbProject.SelectedIndexChanged += tbProject_SelectedIndexChanged;
this.grpkisul.Visible = getKisulInput;
}
void tbProject_SelectedIndexChanged(object sender, EventArgs e)
{
if (bInit == false || this.tbProject.SelectedIndex < 0) return;
var data = this.tbProject.SelectedValue;
if (data == null) return;
if (data.GetType() == typeof(DataRowView))
{
var drv = data as DataRowView;
var idx = int.Parse(drv["Code"].ToString());
tbProjectIndex.Text = idx.ToString();
tbProject.Tag = tbProject.Text;
Console.WriteLine(string.Format("Project Select #1 {0}:{1}", idx, tbProject.Text));
}
else
{
var idx = int.Parse(data.ToString());
tbProjectIndex.Text = idx.ToString();
tbProject.Tag = tbProject.Text;
Console.WriteLine(string.Format("Project Select #2 {0}:{1}", idx, tbProject.Text));
}
}
private bool getKisulInput
{
get
{
return FCOMMON.Util.getBit(
FCOMMON.info.Login.gpermission,
(int)FCOMMON.eGroupPermission.jobreport_kisul);
}
}
private void fJobReport_Add_Load(object sender, EventArgs e)
{
//사용자목록
this.bs.DataSource = dr;
this.dateTimePicker1.CustomFormat = "yyyy-MM-dd HH:mm.ss";
this.dateTimePicker2.CustomFormat = "yyyy-MM-dd HH:mm.ss";
//해당 사용자에 걸린 프로젝트 목록 가져오기
var userProject = FCOMMON.DBM.getUserProjectList(FCOMMON.info.Login.nameK);
this.tbProject.DataSource = userProject;
this.tbProject.ValueMember = "Code";
this.tbProject.DisplayMember = "NameOnly";
//상태
var stateList = FCOMMON.DBM.getCodeTable("12");
this.cmbState.DisplayMember = "Value";
this.cmbState.ValueMember = "Value";
this.cmbState.DataSource = stateList;
this.cmbState.Text = dr.status;
//요청부서
var dt_request = FCOMMON.DBM.getCodeTable("13");
this.cmbRequest.DisplayMember = "Value";
this.cmbRequest.ValueMember = "Value";
this.cmbRequest.DataSource = dt_request;
//패키지
var dt_package = FCOMMON.DBM.getCodeTable("14");
this.cmbPackage.DisplayMember = "Value";
this.cmbPackage.ValueMember = "Value";
this.cmbPackage.DataSource = dt_package;
//타입
var dt_type = FCOMMON.DBM.getCodeTable("15");
this.cmbType.DisplayMember = "Value";
this.cmbType.ValueMember = "Value";
this.cmbType.DataSource = dt_type;
//공정
var dt_process = FCOMMON.DBM.getCodeTable("16");
this.cmbProcess.DisplayMember = "Value";
this.cmbProcess.ValueMember = "Value";
this.cmbProcess.DataSource = dt_process;
if (getKisulInput)
{
//기술분류
var dt_kisuldiv = FCOMMON.DBM.getCodeTable("50");
this.cmb_kisuldiv.DisplayMember = "Value";
this.cmb_kisuldiv.ValueMember = "Value";
this.cmb_kisuldiv.DataSource = dt_kisuldiv;
//기술레벨
var dt_kisullv = FCOMMON.DBM.getCodeTable("51");
this.cmb_kisullv.DisplayMember = "Value";
this.cmb_kisullv.ValueMember = "Value";
this.cmb_kisullv.DataSource = dt_kisullv;
}
//담당자목록
var dt_users = FCOMMON.DBM.getUserTable();// getGroupList("name + '(' + id + ')'", "Users", "[level] > 0 and [level] < 10", false, false);
this.cmbUser.DisplayMember = "dispName";
this.cmbUser.ValueMember = "id";
this.cmbUser.DataSource = dt_users;
if (FCOMMON.info.Login.level < 5) cmbUser.Enabled = false;
// tbWW.Text = dr.ww;
dtPdate.Value = DateTime.Parse(dr.pdate); //일자선택
cmbUser.SelectedValue = dr.uid;
tbProject.Text = dr.projectName;
cmbRequest.SelectedValue = dr.requestpart;
cmbPackage.SelectedValue = dr.package;
cmbType.SelectedValue = dr.type;
cmbProcess.SelectedValue = dr.process;
tbTag.Text = dr.tag;
if (dr.ot > 0)
{
if (dr.ot2 == 0)
{
lbOt2.Text = "관리자 연장/휴일 근무 승인이 완료되지 않았습니다";
lbOt2.ForeColor = Color.Blue;
lbotReason.Visible = false;
}
else
{
lbOt2.Text = $"승인시간:{dr.ot2}";
lbotReason.Text = $"사유:{dr.otReason}";
}
}
else
{
lbOt2.Visible = false;
lbotReason.Visible = false;
}
if (getKisulInput)
{
cmb_kisuldiv.Text = dr.kisuldiv;
cmb_kisullv.Text = dr.kisullv;
textBox1.Text = dr.kisulamt.ToString();
}
if (dr.IsotStartNull()) dateTimePicker1.Value = DateTime.Now;
else dateTimePicker1.Value = dr.otStart;
if (dr.IsotEndNull()) dateTimePicker2.Value = DateTime.Now;
else dateTimePicker2.Value = dr.otEnd;
//if (cmbRequest.Text == "") cmbRequest.Text = "EE1";
if (cmbPackage.Text == "") cmbPackage.Text = "Common";
if (dr.ot != 0)
{
dateTimePicker1.Enabled = true;
dateTimePicker2.Enabled = true;
}
else
{
dateTimePicker1.Enabled = false;
dateTimePicker2.Enabled = false;
}
//프로젝트 번호 확인(프로젝트번호가 바뀌면 데이터를 업데이트 해준다)
if (dr.IspidxNull())
{
tbProjectIndex.Tag = -1;
tbProjectIndex.Text = "-1";
}
else
{
tbProjectIndex.Tag = dr.pidx;
tbProjectIndex.Text = dr.pidx.ToString();
}
//신규일때만 사용가능 함
if (dr.RowState == DataRowState.Detached || dr.RowState == DataRowState.Added) chkAutoAdd.Enabled = true;
else chkAutoAdd.Enabled = false;
if (string.IsNullOrEmpty(dr.description2))
{
this.richTextBoxEx1.Text = dr.description;
}
else
{
try
{
this.richTextBoxEx1.Rtf = dr.description2;
}
catch
{
this.richTextBoxEx1.Text = dr.description;
}
}
this.Show();
Application.DoEvents();
if (dr.ot > 0 && dr.ot2 > 0)
{
tbOt.Enabled = false;
FCOMMON.Util.MsgE("휴일/연장 근무시간이 관리자에의해 확정되었으므로 초과시간을 변경할 수 없습니다");
}
//if (this.richTextBoxEx1.Text.Trim() != "")
//{
// this.richTextBoxEx1.Focus();
//}
//else
//{
cmbRequest.Focus();
// tbProject.SelectAll();
//}
tbProject.Tag = tbProject.Text;
// if (string.IsNullOrEmpty(richTextBox1.Text)) richTextBox1.Text = dr.description;
//editor
// ed = new editform.editor();
//ed.AllowDiscAccess = true;
//ed.WindowTitle = "Quick Edit";
//ed.StartingFont = new Font("Courier New", 12.0f, FontStyle.Regular);
//ed.DisplayEditForm(this.panel1);
//ed.AllowRtf = true;
if (ReadMode)
{
panel1.Enabled = false;
this.Text += "(읽기전용)";
}
//신규데이터라면 양식을 처리한다.
if (copyMOde==false && dr.RowState == DataRowState.Detached || dr.RowState == DataRowState.Added)
{
//해당 데이터의 메일 양식을 검사해서 데이터를 적용해준다.
var db = new EEEntities();
var dr0 = db.EETGW_DocuForm.Where(t => t.gcode == FCOMMON.info.Login.gcode && t.cate == "J0").FirstOrDefault();
if (dr0 != null)
{
richTextBoxEx1.Rtf = dr0.body;
}
db.Dispose();
}
bInit = true;
}
// editform.editor ed;
void ctl_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
Control ctl = sender as Control;
string nm = ctl.Name.ToLower();
string search = ctl.Text.Trim();
Console.WriteLine("inner keydown " + nm + ":" + search);
switch (nm)
{
//case "cmbrequest":
// //요청자가 마지막으로 입력한 자료의 process 를 찾아서 기입해준다.
// var lastprocess = FCOMMON.DBM.getFirstValue("process", "purchase", "request like '%" + this.cmbUser.Text + "%'", "pdate desc");
// if (lastprocess != "") cbProcess.Text = lastprocess;
// tbSID.Focus();
// break;
case "tbdescription":
if (e.Control)
{
btSave.Focus();
}
break;
case "tbproject":
if (search != "")
{
var f = new fLovProject("%" + search + "%");
if (f.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
this.tbProject.Text = f.Title;
this.tbProject.Tag = f.Title;
this.tbProjectIndex.Text = f.Index.ToString();
tbHrs.Focus();
tbHrs.SelectAll();
if (tbProjectIndex.Tag.ToString() != f.Index.ToString() || f.Index == -1)
{
//마지막 데이터를 찾아서 공정등의 정보를 업데이트한다.
var uid = cmbUser.SelectedValue.ToString();
DataTable lastDt = null;
if (f.Index != -1) lastDt = FCOMMON.DBM.getLastJobReportData(uid, f.Index);
else lastDt = FCOMMON.DBM.getLastJobReportDatabyProjectName(uid, f.Title);
if (lastDt != null && lastDt.Rows.Count > 0)
{
var predr = lastDt.Rows[0];
if (predr["requestpart"] != DBNull.Value)
this.cmbRequest.Text = predr["requestpart"].ToString(); //190506
if (predr["package"] != DBNull.Value)
this.cmbPackage.Text = predr["package"].ToString(); //190506
if (predr["type"] != DBNull.Value)
this.cmbType.Text = predr["type"].ToString(); //190506
if (predr["process"] != DBNull.Value)
cmbProcess.Text = predr["process"].ToString(); //190506
}
}
}
else
{
//이름만 사용한다.
tbProjectIndex.Text = "-1";
cmbRequest.Focus();
}
}
else
{
FCOMMON.Util.MsgE("프로젝트 혹은 아이템이름은 반드시 입력되어야 합니다.");
var tb = sender as ComboBox;
tb.SelectAll();
tb.Focus();
}
break;
default:
SendKeys.Send("{TAB}");
break;
}
}
}
private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
FCM0000.fSelectDate f = new FCM0000.fSelectDate(this.dtPdate.Value.ToShortDateString());
if (f.ShowDialog() != System.Windows.Forms.DialogResult.OK) return;
dtPdate.Value = f.dtSelect;
}
private void button1_Click(object sender, EventArgs e)
{
this.Invalidate();
if (tbProject.Text.Trim() == "")
{
FCOMMON.Util.MsgE("프로젝트(아이템) 명칭이 없습니다.");
tbProject.Focus();
return;
}
if (cmbType.Text != "휴가" && string.IsNullOrEmpty(this.richTextBoxEx1.Text) == true)
{
FCOMMON.Util.MsgE("진행 내용이 없습니다.");
this.richTextBoxEx1.Focus();
return;
}
float hour = Single.Parse(tbHrs.Text) + Single.Parse(tbOt.Text);
if (hour == 0)
{
FCOMMON.Util.MsgE("근무시간/초과시간이 입력되지 않았습니다.");
if (tbHrs.Enabled) tbHrs.Focus();
else tbOt.Focus();
return;
}
if (cmbType.Text.Trim() == "")
{
FCOMMON.Util.MsgE("업무형태를 선택하세요");
cmbType.Focus();
return;
}
if (cmbProcess.Text.Trim() == "")
{
FCOMMON.Util.MsgE("공정을 선택하세요");
cmbProcess.Focus();
return;
}
if (cmbUser.SelectedIndex < 0)
{
FCOMMON.Util.MsgE("담당자가 선택되지 않았습니다.");
cmbUser.Focus();
return;
}
if (tbProject.Tag.ToString() != tbProject.Text && tbProjectIndex.Text != "" && tbProjectIndex.Text != "-1")
{
FCOMMON.Util.MsgE("프로젝트가 선택되었으나 이름이 임의 수정되어 프로젝트 연결을 해제 합니다\n\n" +
"잘못된 프로젝트명은 프로젝트 관리화면에서 변경하시기 바랍니다.\n\n" +
"원본 : " + tbProject.Tag.ToString() + "\n" +
"현재 : " + tbProject.Text);
tbProjectIndex.Text = "-1";
}
///휴일체크
var taQ = new dsQueryTableAdapters.QueriesTableAdapter();
var freeday = taQ.CheckHoliday(dtPdate.Value.ToShortDateString());
if (freeday != null && freeday == true)
{
var hrs = float.Parse(tbHrs.Text);
if (hrs > 0)
{
FCOMMON.Util.MsgI("입력일자는 휴일로 등록되어 있습니다.\n\n OT에 해당하면 수정하시기 바랍니다.");
//tbOt.Text = tbHrs.Text;
//dr.hrs = 0;
//tbHrs.Text = "0";
//tbHrs.Focus();
//return;
}
}
if (chkAutoAdd.Checked && (dr.RowState == DataRowState.Detached || dr.RowState == DataRowState.Added))
{
if (tbProjectIndex.Text == "" || tbProjectIndex.Text == "-1")
{
FCOMMON.Util.MsgE("프로젝트 주간내역을 등록하려면 프로젝트가 지정되어야 합니다");
tbProject.Focus();
tbProject.SelectAll();
return;
}
else
{
//190906
FCOMMON.DBM.addProjectHistory(int.Parse(tbProjectIndex.Text), dtPdate.Value.ToShortDateString(), this.richTextBoxEx1.Text, this.richTextBoxEx1.Rtf);
}
}
double hrs2 = 0.0;
if (double.TryParse(tbHrs.Text, out hrs2) == false)
{
FCOMMON.Util.MsgE("근무시간을 숫자로 입력하세요");
tbHrs.Focus();
tbHrs.SelectAll();
return;
}
if (double.TryParse(tbOt.Text, out double ot))
{
var timeterm = dateTimePicker2.Value - dateTimePicker1.Value;
if ((timeterm.TotalMinutes + 1) * 60 <= ot)
{
FCOMMON.Util.MsgE($"OT시간이 지정된 시간대보다 부족합니다.\nOT시간정보를 확인하세요\n" +
$"\n입력시간범위 : {dateTimePicker1.Value.ToString("HH:mm:ss")}~{dateTimePicker2.Value.ToString("HH:mm:ss")}" +
$"\n입력시간(시) : {timeterm.TotalMinutes * 60}");
dateTimePicker1.Focus();
return;
}
if (ot == 0)
{
dr.SetotNull();
dr.SetotStartNull();
dr.SetotEndNull();
}
else
{
dr.ot = ot;
dr.otStart = dateTimePicker1.Value;
dr.otEnd = dateTimePicker2.Value;
}
}
else
{
dr.SetotNull();
dr.SetotStartNull();
dr.SetotEndNull();
}
//if(hrs2 > 8)
//{
// FCOMMON.Util.MsgE("1일 최대근무시간은 8시간을 초과할 수 없습니다\n초과시간을 사용하세요");
// tbHrs.SelectAll();
// tbHrs.Focus();
// return;
//}
this.dr.uid = this.cmbUser.SelectedValue.ToString();
this.dr.pdate = dtPdate.Value.ToShortDateString();
this.dr.status = cmbState.Text;
this.dr.projectName = tbProject.Text;
if (tbProjectIndex.Text != "") dr.pidx = int.Parse(tbProjectIndex.Text);
else dr.SetpidxNull();
this.dr.requestpart = cmbRequest.Text;
this.dr.package = cmbPackage.Text;
this.dr.type = cmbType.Text;
this.dr.process = cmbProcess.Text;
this.dr.tag = tbTag.Text.Trim();
if (getKisulInput)
{
this.dr.kisuldiv = cmb_kisuldiv.Text;
this.dr.kisullv = cmb_kisullv.Text;
this.dr.kisulamt = Decimal.Parse(textBox1.Text);
}
if (tbHrs.Text != "") this.dr.hrs = double.Parse(tbHrs.Text);
else this.dr.hrs = 0;
//this.dr.description = richTextBox1.Text.Trim();
//MessageBox.Show(richTextBox1.Text);
this.dr.description = richTextBoxEx1.Text;
this.dr.description2 = richTextBoxEx1.Rtf; // ef.DocumentText;// richTextBox1.Rtf;
this.bs.EndEdit();
DialogResult = System.Windows.Forms.DialogResult.OK;
}
private void cmbType_SelectedIndexChanged(object sender, EventArgs e)
{
if (cmbType.Text.Trim() != "" &&
cmbType.SelectedIndex >= 0 &&
cmbProcess.SelectedIndex < 0 &&
cmbUser.SelectedValue != null)
{
//공정을 자동선택해준다.
//마지막 데이터를 찾아서 공정등의 정보를 업데이트한다.
var uid = cmbUser.SelectedValue.ToString();
var lastDt = FCOMMON.DBM.getLastJobReportData(uid, cmbType.Text.Trim());
if (lastDt != null && lastDt.Rows.Count > 0)
{
var predr = lastDt.Rows[0];// as dsPRJ.JobReportRow;
if (predr["process"] != DBNull.Value)
cmbProcess.Text = predr["process"].ToString(); //190506
}
}
chkform_indexchan(sender, e);
}
void chkform_indexchan(object sender, EventArgs e)
{
if (cmbType.Text.Trim() != "" &&
cmbType.SelectedIndex >= 0 && String.IsNullOrEmpty(cmbState.Text.Trim()) == false)
{
//해당 데이터의 메일 양식을 검사해서 데이터를 적용해준다.
var formname = cmbType.Text.Trim() + "|" + cmbState.Text.Trim();
var db = new EEEntities();
//프로젝트 제목 서포트
var dr0 = db.EETGW_DocuForm.Where(t => t.gcode == FCOMMON.info.Login.gcode && t.cate == "J2" && t.title == formname).FirstOrDefault();
if (dr0 != null)
{
var rtx = new RichTextBox();
rtx.Rtf = dr0.body;
lbTitleTip.Text = rtx.Text;
rtx.Dispose();
}
else
{
lbTitleTip.Text = "프로젝트가 있다면 해당 프로젝트 명을 입력한 후 Enter 키를 눌러서 연결 해주세요";
}
var dr = db.EETGW_DocuForm.Where(t => t.gcode == FCOMMON.info.Login.gcode && t.cate == "J1" && t.title == formname).FirstOrDefault();
if (dr != null)
{
if (String.IsNullOrEmpty(this.richTextBoxEx1.Text))
{
this.richTextBoxEx1.Rtf = dr.body;
}
else
{
//뭔가 자료가 있는가?
var header = string.Empty;
var rt = new RichTextBoxEx.RichTextBoxEx();
rt.Rtf = dr.body;
if (rt.Text.Length > 10) header = rt.Text.Substring(0, 10).Trim();
else header = rt.Text.Trim();
rt.Dispose();
if (this.richTextBoxEx1.Text.StartsWith(header) == false)
{
//if (FCOMMON.Util.MsgQ("등록된 작성 양식이 있습니다. 적용할까요?") == DialogResult.Yes)
{
var oldtext = this.richTextBoxEx1.Text;
this.richTextBoxEx1.Rtf = dr.body;
if (String.IsNullOrEmpty(this.richTextBoxEx1.Text) == false)
this.richTextBoxEx1.Text += "\r\n\r\n" + oldtext;
//this.richTextBoxEx1.Text += oldtext;
}
}
}
}
}
}
private void dtPdate_ValueChanged(object sender, EventArgs e)
{
var myCI = new System.Globalization.CultureInfo("ko-KR");
var myCal = myCI.Calendar;
var myCWR = myCI.DateTimeFormat.CalendarWeekRule;
DayOfWeek myFirstDOW = myCI.DateTimeFormat.FirstDayOfWeek;
var dat = myCal.GetWeekOfYear(dtPdate.Value, myCWR, myFirstDOW);
tbWW.Text = "ww" + dat.ToString();
UpdateWOrkTime();
//공휴일이면 시간을 초기화한다.
if (tbHrs.Text == "") tbHrs.Text = "0";
if (tbOt.Text == "") tbOt.Text = "0";
float hrs = float.Parse(tbHrs.Text);
//if (dtPdate.Value.DayOfWeek == DayOfWeek.Saturday || dtPdate.Value.DayOfWeek == DayOfWeek.Sunday)
//{
// tbHrs.Enabled = false;
// if (hrs != 0)
// {
// FCOMMON.Util.MsgI("공휴일에는 근무시간을 입력할 수 없습니다.\n초과시간에 입력하세요.\n\n해당 값은 삭제 됩니다.");
// dr.hrs = 0;
// tbHrs.Text = "0";
// if (hrs != 8) tbOt.Text = hrs.ToString();
// tbOt.Focus();
// }
//}
//else tbHrs.Enabled = true;
}
void UpdateWOrkTime()
{
//이번달 근무시간 및 초과시간 구하기
if (cmbUser.SelectedValue != null)
{
float work, ot;
int total;
FCOMMON.DBM.getWorkTime(cmbUser.SelectedValue.ToString(), dtPdate.Value.ToString("yyyy-MM"), out work, out total, out ot);
string msg = "금월 근무시간 : {0:N1}h / {1:N0}h, 금월 초과시간 : {2:N1}h";
lbSummary.Text = string.Format(msg, work, total, ot);
}
else
{
lbSummary.Text = "--";
}
}
private void cmbUser_SelectedIndexChanged(object sender, EventArgs e)
{
if (cmbUser.SelectedIndex >= 0)
UpdateWOrkTime(); ;
}
private void tbOt_Validated(object sender, EventArgs e)
{
if (double.TryParse(tbOt.Text, out double ot))
{
if (ot != 0)
{
dateTimePicker1.Enabled = true;
dateTimePicker2.Enabled = true;
//신규데이터라면 자동으로 시간을 설정해준다
if (dr.RowState == DataRowState.Added || dr.RowState == DataRowState.Detached)
{
if (dateTimePicker1.Value == dateTimePicker2.Value)
{
dateTimePicker1.Value = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd" + " 18:00:00"));
dateTimePicker2.Value = dateTimePicker1.Value.AddHours(ot);
}
}
}
else
{
dateTimePicker1.Enabled = false;
dateTimePicker2.Enabled = false;
}
}
else
{
dateTimePicker1.Enabled = false;
dateTimePicker2.Enabled = false;
}
}
}
}