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; using Diplom_O.DataBase; namespace Diplom_O { public partial class StajForm : Form { private readonly ColumnConf[] tableStajColumns = { new ColumnConf(name: "№"), new ColumnConf(name: "Названиe", size: 140, warp: true), new ColumnConf(name: "Лет", size: 60), new ColumnConf(name: "Месяцев", size: 60), new ColumnConf(name: "Дней", size: 60) }; private Rabotnik rabotnik = null; private void linkRabLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { var form = new RabForm(true); form.ShowDialog(); if (form.isCanceled) rabotnik = null; else rabotnik = form.formResult; ResetLinkRabotnik(); resetStajTable(); } private void ResetLinkRabotnik() { if (rabotnik == null) { linkRabLabel.Text = "Выбрать сотрудника..."; return; } var chel = FuncDB.ChelGetById(rabotnik.ChelId); if (chel == null) { linkRabLabel.Text = "Выбрать сотрудника..."; return; } var res = chel.FName.ToString() + " " + chel.SName[0].ToString() + "." + ((!string.IsNullOrEmpty(chel.TName)) ? chel.TName[0].ToString() + "." : ""); linkRabLabel.Text = res; } private void resetStajTable() { (int year, int month, int day) Sum( (int year, int month, int day) t1, (int year, int month, int day) t2 ) { var year = t1.year + t2.year; var month = t1.month + t2.month; var day = t1.day + t2.day; month += day / 30; day %= 30; year += month / 12; month %= 12; return (year, month, day); } (int year, int month, int day) Sub( (int year, int month, int day) t1, (int year, int month, int day) t2 ) { var year = t1.year - t2.year; var month = t1.month - t2.month; var day = t1.day - t2.day; while (day < 0) { day += 30; month--; } while (month < 0) { month += 12; year--; } month += day / 30; day %= 30; year += month / 12; month %= 12; return (year, month, day); } try { var res = new List(); if (rabotnik == null) { this.ResetTable( stajGridView, tableStajColumns, res.ToArray() ); return; } var count = new Dictionary(); var listRab = FuncDB.RabotnikHistoryByChelId(rabotnik.ChelId); foreach (var rab in listRab) { var size = FuncDB.RabotnikGetTotalTime(rab, dateTimePicker1.Value); var staj = FuncDB.RabotnikTypeStajList(rab.Id); if (count.ContainsKey(-1)) count[-1] = Sum(count[-1], size); else count[-1] = size; foreach(var st in staj) if (count.ContainsKey(st.TypeStajId)) count[st.TypeStajId] = Sum(count[st.TypeStajId], size); else count[st.TypeStajId] = size; } var listCorrStaj = FuncDB.CorrStajList(rabotnik.ChelId); foreach (var corr in listCorrStaj) { var ts = FuncDB.TypeStajGetById(corr.TypeStajId); if (ts != null && ts.Name.CompareTo("Общий") == 0) corr.TypeStajId = -1; var size = (corr.Year, corr.Month, corr.Day); if (!count.ContainsKey(corr.TypeStajId)) count[corr.TypeStajId] = (0, 0, 0); if (corr.AddFlag) count[corr.TypeStajId] = Sum(count[corr.TypeStajId], size); else count[corr.TypeStajId] = Sub(count[corr.TypeStajId], size); } foreach (var r in count) { if (r.Value.year < 0 || r.Value.year + r.Value.month + r.Value.day == 0) continue; var sr = new List(); sr.Add(r.Key.ToString()); if (r.Key == -1) sr.Add("Общий"); else sr.Add(FuncDB.TypeStajGetById(r.Key).Name); sr.Add(r.Value.year.ToString()); sr.Add(r.Value.month.ToString()); sr.Add(r.Value.day.ToString()); res.Add(sr.ToArray()); } this.ResetTable( stajGridView, tableStajColumns, res.ToArray() ); } catch (Exception e) { this.ShowError(errorLabel, e.Message); } } public StajForm() { InitializeComponent(); this.correctUpperMenu(menuStrip, 3); dateTimePicker1.Value = DateTime.Now; ResetLinkRabotnik(); resetTypeStajComboBox(); linkRabLabel.Enabled = false; addStajButton.Enabled = false; var user = this.GetUser(); if (user == null) return; linkRabLabel.Enabled = FuncDB.AccessGetByUserIdFormIdAccessId(user.Id, 3, 0) != null; addStajButton.Enabled = FuncDB.AccessGetByUserIdFormIdAccessId(user.Id, 3, 2) != null || FuncDB.AccessGetByUserIdFormIdAccessId(user.Id, 3, 3) != null; } private void resetTypeStajComboBox() { try { var list = new List(); list.Add("Общий"); list.AddRange(FuncDB.TypeStajListString()); comboBox1.Items.Clear(); comboBox1.Items.AddRange(list.ToArray()); comboBox1.SelectedIndex = -1; } catch (Exception e) { this.ShowError(errorLabel, e.Message); } } private void upperMenuClicked(object sender, ToolStripItemClickedEventArgs e) { this.upperMenuClicked((MenuStrip)sender); if (this.GetNextForm() != -1) Close(); } private void typeStajChanged(object sender, EventArgs e) { try { addRadioButton.Checked = ! (delRadioButton.Checked = false); yearTB.Text = monthTB.Text = dayTB.Text = ""; if (rabotnik == null) return; var staj = FuncDB.TypeStajGetByName(comboBox1.Text); if (staj == null) return; var corrStaj = FuncDB.CorrStaj(rabotnik.ChelId, staj.Name); if (corrStaj == null) return; yearTB.Text = corrStaj.Year.ToString(); monthTB.Text = corrStaj.Month.ToString(); dayTB.Text = corrStaj.Day.ToString(); delRadioButton.Checked = !(addRadioButton.Checked = corrStaj.AddFlag); } catch (Exception ex) { this.ShowError(errorLabel, ex.Message); } } private void addStajButton_Click(object sender, EventArgs e) { try { if (rabotnik == null) throw new Exception("Не выбран сотрудник."); if (!int.TryParse(yearTB.Text, out int year) || year < 0) throw new Exception("Не верно указан год."); if (!int.TryParse(monthTB.Text, out int month) || month < 0) throw new Exception("Не верно указан месяц."); if (!int.TryParse(dayTB.Text, out int day) || day < 0) throw new Exception("Не верно указан день."); var typeStaj = FuncDB.TypeStajGetByName(comboBox1.Text); if(typeStaj == null) { FuncDB.TypeStajAdd(new TypeStaj() { Name = comboBox1.Text }); typeStaj = FuncDB.TypeStajGetByName(comboBox1.Text); } var corrStaj = FuncDB.CorrStaj(rabotnik.ChelId, typeStaj.Name); if (corrStaj == null) { FuncDB.CorrStajAdd(new CorrStaj() { Year = year, Month = month, Day = day, ChelId = rabotnik.ChelId, TypeStajId = typeStaj.Id, AddFlag = addRadioButton.Checked }); } else { corrStaj.ChelId = rabotnik.ChelId; corrStaj.TypeStajId = typeStaj.Id; corrStaj.AddFlag = addRadioButton.Checked; corrStaj.Year = year; corrStaj.Month = month; corrStaj.Day = day; FuncDB.CorrStajChange(corrStaj); } resetStajTable(); resetTypeStajComboBox(); } catch (Exception ex) { this.ShowError(errorLabel, ex.Message); } } private void button1_Click(object sender, EventArgs e) { resetStajTable(); } } }