Files
VAR.Toolbox/VAR.Toolbox/UI/Tools/WorkLog/FrmWorkLogStats.cs

148 lines
4.7 KiB
C#

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using VAR.Toolbox.Code.WorkLog;
using VAR.Toolbox.Controls;
namespace VAR.Toolbox.UI.Tools.WorkLog
{
public partial class FrmWorkLogStats : Frame
{
public FrmWorkLogStats()
{
InitializeComponent();
}
public string Activity
{
get => txtActivity.Text;
set => txtActivity.Text = value;
}
private List<WorkLogItem> _workLog;
public List<WorkLogItem> WorkLog
{
get => _workLog;
set => _workLog = value;
}
public string WorkerName
{
get => lblName.Text;
set => lblName.Text = value;
}
private void FrmWorkLogStats_Load(object sender, EventArgs e)
{
dtpStart.Value = DateTime.Now.Date.AddMonths(-1);
dtpEnd.Value = DateTime.Now.Date.AddMonths(1).AddDays(1).AddSeconds(-1);
WorkLog_ProcessStats();
}
private void btnSearch_Click(object sender, EventArgs e)
{
WorkLog_ProcessStats();
}
private void btnClose_Click(object sender, EventArgs e)
{
Close();
}
private void WorkLog_ProcessStats()
{
if (string.IsNullOrWhiteSpace(txtActivity.Text))
{
CleanList();
return;
}
bool found = false;
DateTime dateStart = DateTime.MaxValue;
DateTime dateEnd = DateTime.MinValue;
Dictionary<DateTime, TimeSpan> dictDaysHours = new Dictionary<DateTime, TimeSpan>();
foreach (WorkLogItem item in _workLog)
{
if (item.Activity.Contains(txtActivity.Text) == false) { continue; }
if (item.DateEnd < dtpStart.Value || item.DateStart > dtpEnd.Value) { continue; }
found = true;
if (item.DateStart < dateStart) { dateStart = item.DateStart; }
if (item.DateEnd > dateEnd) { dateEnd = item.DateEnd; }
DateTime dateItemDay = item.DateStart.Date;
TimeSpan tsItem = item.DateEnd - item.DateStart;
if (dictDaysHours.ContainsKey(dateItemDay))
{
TimeSpan tsDay = tsItem + dictDaysHours[dateItemDay];
dictDaysHours[dateItemDay] = tsDay;
}
else
{
dictDaysHours.Add(dateItemDay, tsItem);
}
}
if (found == false)
{
CleanList();
return;
}
lblDateStart.Text = dateStart.ToString("yyyy-MM-dd HH:mm:ss");
lblDateEnd.Text = dateEnd.ToString("yyyy-MM-dd HH:mm:ss");
List<string> strDays = new List<string>();
DateTime dateDayStart = dateStart.Date;
DateTime dateDayEnd = dateEnd.Date;
DateTime dateDayCurrent = dateDayStart;
TimeSpan tsTotal = new TimeSpan(0);
int? week = null;
TimeSpan tsWeek = new TimeSpan(0);
CultureInfo currentCulture = CultureInfo.CurrentCulture;
do
{
if (dictDaysHours.ContainsKey(dateDayCurrent))
{
int weekCurrent = currentCulture.Calendar.GetWeekOfYear(dateDayCurrent,
currentCulture.DateTimeFormat.CalendarWeekRule, currentCulture.DateTimeFormat.FirstDayOfWeek);
if (week != null && week != weekCurrent)
{
strDays.Add($" [{week:00}] -- {tsWeek.TotalHours} h");
tsWeek = new TimeSpan(0);
}
TimeSpan tsDay = dictDaysHours[dateDayCurrent];
strDays.Add($"[{weekCurrent:00}] {dateDayCurrent:yyyy-MM-dd} -- {tsDay.TotalHours} h");
tsTotal += tsDay;
tsWeek += tsDay;
week = weekCurrent;
}
dateDayCurrent = dateDayCurrent.AddDays(1);
} while (dateDayCurrent <= dateDayEnd);
if (tsWeek.TotalHours > 0)
{
strDays.Add($" [{week:00}] -- {tsWeek.TotalHours} h");
}
lsbDays.Items.Clear();
lsbDays.Items.AddRange(strDays.ToArray<object>());
lblTotalTime.Text = $"{tsTotal.ToString()} - {tsTotal.TotalHours}";
}
private void CleanList()
{
lblDateStart.Text = string.Empty;
lblDateEnd.Text = string.Empty;
lsbDays.Items.Clear();
lblTotalTime.Text = string.Empty;
}
}
}