Skip to content
This repository was archived by the owner on Oct 3, 2022. It is now read-only.

Commit 767ba05

Browse files
committed
Zwischernstand
1 parent 05b48b5 commit 767ba05

File tree

9 files changed

+167
-36
lines changed

9 files changed

+167
-36
lines changed
0 Bytes
Binary file not shown.

.vs/TakeMyTime.NETCore/v16/.suo

9 KB
Binary file not shown.

TakeMyTime.DAL/Repositories/StatisticsRepository.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ public IEnumerable<ProductivityViewModel> GetProjectProductiveDays(int project_i
9292
var entries = this.context.Entries
9393
.Where(e => e.Project_Id == project_id);
9494

95-
foreach (var entry in entries)
95+
foreach (var entry in entries.Where(e => e.DurationAsTicks.HasValue))
9696
{
9797
results.Add(new ProductivityViewModel { X = entry.Date, Y = new TimeSpan(entry.DurationAsTicks.Value) });
9898
}
@@ -106,7 +106,7 @@ public IEnumerable<MostProductiveWeekDaysViewModel> GetMostProductiveDays()
106106
.Include(e => e.Project)
107107
.Where(e => e.Project.ProjectStatus == EnumDefinition.ProjectStatus.Active)
108108
.ToList();
109-
var weekdayManager = new WeekdayProductivityManager(entries.Count());
109+
var weekdayManager = new WeekdayProductivityManager();
110110

111111
foreach (var entry in entries)
112112
{

TakeMyTime.DAL/WeekdayProductivityManager.cs

Lines changed: 61 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -8,45 +8,53 @@ namespace TakeMyTime.DAL
88
{
99
public class WeekdayProductivityManager
1010
{
11-
public WeekdayProductivityManager(int totalEntryCount)
11+
public WeekdayProductivityManager()
1212
{
13-
this.TotalEntryCount = totalEntryCount;
1413
}
1514

1615
public void ProcessEntry(Entry entry)
1716
{
18-
if(CanProcessEntries)
17+
var durationAsHours = entry.DurationAsTicks.HasValue ? TimeSpan.FromTicks(entry.DurationAsTicks.Value).TotalHours : 0;
18+
if(durationAsHours > 0)
1919
{
20+
TotalWorkingHours += durationAsHours;
2021
var date = entry.Started.HasValue ? entry.Started.Value.DayOfWeek : entry.Date.DayOfWeek;
2122
switch (date)
2223
{
2324
case DayOfWeek.Monday:
24-
MondayEntryCount++;
25-
this.MondayValueShare = Math.Round((double)MondayEntryCount / (double)TotalEntryCount, 2);
25+
MondayTotalWorkingHours += durationAsHours;
26+
this.MondayAverageWorkingHours = Math.Round(durationAsHours / MondayTotalWorkingHours, 2);
27+
this.MondayValueShare = Math.Round(MondayAverageWorkingHours / TotalWorkingHours, 2);
2628
break;
2729
case DayOfWeek.Tuesday:
28-
TuesdayEntryCount++;
29-
this.TuesdayValueShare = Math.Round((double)TuesdayEntryCount / (double)TotalEntryCount, 2);
30+
TuesdayTotalWorkingHours += durationAsHours;
31+
this.TuesdayAverageWorkingHours = Math.Round(durationAsHours / TuesdayTotalWorkingHours, 2);
32+
this.TuesdayValueShare = Math.Round(TuesdayAverageWorkingHours / TotalWorkingHours, 2);
3033
break;
3134
case DayOfWeek.Wednesday:
32-
WednesdayEntryCount++;
33-
this.WednesdayValueShare = Math.Round((double)WednesdayEntryCount / (double)TotalEntryCount, 2);
35+
WednesdayTotalWorkingHours += durationAsHours;
36+
this.WednesdayAverageWorkingHours = Math.Round(durationAsHours / WednesdayTotalWorkingHours, 2);
37+
this.WednesdayValueShare = Math.Round(WednesdayTotalWorkingHours / TotalWorkingHours, 2);
3438
break;
3539
case DayOfWeek.Thursday:
36-
ThursdayEntryCount++;
37-
this.ThursdayValueShare = Math.Round((double)ThursdayEntryCount / (double)TotalEntryCount, 2);
40+
ThursdayTotalWorkingHours += durationAsHours;
41+
this.ThursdayAverageWorkingHours = Math.Round(durationAsHours / ThursdayTotalWorkingHours, 2);
42+
this.ThursdayValueShare = Math.Round(ThursdayTotalWorkingHours / TotalWorkingHours, 2);
3843
break;
3944
case DayOfWeek.Friday:
40-
FridayEntryCount++;
41-
this.FridayValueShare = Math.Round((double)FridayEntryCount / (double)TotalEntryCount, 2);
45+
FridayTotalWorkingHours += durationAsHours;
46+
this.FridayAverageWorkingHours = Math.Round(durationAsHours / FridayTotalWorkingHours, 2);
47+
this.FridayValueShare = Math.Round(FridayAverageWorkingHours / TotalWorkingHours, 2);
4248
break;
4349
case DayOfWeek.Saturday:
44-
SaturdayEntryCount++;
45-
this.SaturdayValueShare = Math.Round((double)SaturdayEntryCount / (double)TotalEntryCount, 2);
50+
SaturdayTotalWorkingHours += durationAsHours;
51+
this.SaturdayAverageWorkingHours = Math.Round(durationAsHours / SaturdayTotalWorkingHours, 2);
52+
this.SaturdayValueShare = Math.Round(SaturdayAverageWorkingHours / TotalWorkingHours, 2);
4653
break;
4754
case DayOfWeek.Sunday:
48-
SundayEntryCount++;
49-
this.SundayValueShare = Math.Round((double)SundayEntryCount / (double)TotalEntryCount, 2);
55+
SundayTotalWorkingHours += durationAsHours;
56+
this.SundayAverageWorkingHours = Math.Round(durationAsHours / SundayTotalWorkingHours, 2);
57+
this.SundayValueShare = Math.Round(SundayAverageWorkingHours / TotalWorkingHours, 2);
5058
break;
5159
};
5260
}
@@ -59,56 +67,76 @@ public IEnumerable<MostProductiveWeekDaysViewModel> GetResults()
5967
new MostProductiveWeekDaysViewModel
6068
{
6169
Day = DayOfWeek.Monday,
62-
Value = MondayValueShare
70+
Value = MondayValueShare,
71+
AverageHours = MondayAverageWorkingHours,
72+
TotalHours = MondayTotalWorkingHours
6373
},
6474
new MostProductiveWeekDaysViewModel
6575
{
6676
Day = DayOfWeek.Tuesday,
67-
Value = TuesdayValueShare
77+
Value = TuesdayValueShare,
78+
AverageHours = TuesdayAverageWorkingHours,
79+
TotalHours = TuesdayTotalWorkingHours
6880
},
6981
new MostProductiveWeekDaysViewModel
7082
{
7183
Day = DayOfWeek.Wednesday,
72-
Value = WednesdayValueShare
84+
Value = WednesdayValueShare,
85+
AverageHours = WednesdayAverageWorkingHours,
86+
TotalHours = WednesdayTotalWorkingHours
7387
},
7488
new MostProductiveWeekDaysViewModel
7589
{
7690
Day = DayOfWeek.Thursday,
77-
Value = ThursdayValueShare
91+
Value = ThursdayValueShare,
92+
AverageHours = ThursdayAverageWorkingHours,
93+
TotalHours = ThursdayTotalWorkingHours
7894
},
7995
new MostProductiveWeekDaysViewModel
8096
{
8197
Day = DayOfWeek.Friday,
82-
Value = FridayValueShare
98+
Value = FridayValueShare,
99+
AverageHours = FridayAverageWorkingHours,
100+
TotalHours = FridayTotalWorkingHours
83101
},
84102
new MostProductiveWeekDaysViewModel
85103
{
86104
Day = DayOfWeek.Saturday,
87-
Value = SaturdayValueShare
105+
Value = SaturdayValueShare,
106+
AverageHours = SaturdayAverageWorkingHours,
107+
TotalHours = SaturdayTotalWorkingHours
88108
},
89109
new MostProductiveWeekDaysViewModel
90110
{
91111
Day = DayOfWeek.Sunday,
92-
Value = SundayValueShare
112+
Value = SundayValueShare,
113+
AverageHours = SundayAverageWorkingHours,
114+
TotalHours = SundayTotalWorkingHours
93115
},
94116
};
95117
}
96118

97-
public int TotalEntryCount { get; private set; }
98-
public int MondayEntryCount { get; private set; }
119+
public double TotalWorkingHours { get; private set; }
120+
public double MondayTotalWorkingHours { get; private set; }
99121
public double MondayValueShare { get; private set; }
100-
public int TuesdayEntryCount { get; private set; }
122+
public double MondayAverageWorkingHours { get; private set; }
123+
public double TuesdayTotalWorkingHours { get; private set; }
101124
public double TuesdayValueShare { get; private set; }
102-
public int WednesdayEntryCount { get; private set; }
125+
public double TuesdayAverageWorkingHours { get; private set; }
126+
public double WednesdayTotalWorkingHours { get; private set; }
103127
public double WednesdayValueShare { get; private set; }
104-
public int ThursdayEntryCount { get; private set; }
128+
public double WednesdayAverageWorkingHours { get; private set; }
129+
public double ThursdayTotalWorkingHours { get; private set; }
105130
public double ThursdayValueShare { get; private set; }
106-
public int FridayEntryCount { get; private set; }
131+
public double ThursdayAverageWorkingHours { get; private set; }
132+
public double FridayTotalWorkingHours { get; private set; }
107133
public double FridayValueShare { get; private set; }
108-
public int SaturdayEntryCount { get; private set; }
134+
public double FridayAverageWorkingHours { get; private set; }
135+
public double SaturdayTotalWorkingHours { get; private set; }
109136
public double SaturdayValueShare { get; private set; }
110-
public int SundayEntryCount { get; private set; }
137+
public double SaturdayAverageWorkingHours { get; private set; }
138+
public double SundayTotalWorkingHours { get; private set; }
111139
public double SundayValueShare { get; private set; }
112-
public bool CanProcessEntries { get => this.TotalEntryCount > 0; }
140+
public double SundayAverageWorkingHours { get; private set; }
113141
}
114142
}

TakeMyTime.Models/Models/MostProductiveWeekDaysViewModel.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,7 @@ public class MostProductiveWeekDaysViewModel
88
{
99
public DayOfWeek Day { get; set; }
1010
public double Value { get; set; }
11+
public double AverageHours { get; set; }
12+
public double TotalHours { get; set; }
1113
}
1214
}

TakeMyTime.WPF/Statistics/Dashboard.xaml.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,9 @@ private string[] ResolveWeekdayNames(IEnumerable<MostProductiveWeekDaysViewModel
140140
var labels = new List<string>();
141141
foreach (var vm in viewModels)
142142
{
143-
labels.Add(ResourceStringManager.GetResourceByKey(vm.Day.ToString()));
143+
string formattedAvgHours = string.Format("{0}(Ø {1:0.00}h){2}(Total: {3:0.00}h)", System.Environment.NewLine,
144+
vm.AverageHours, System.Environment.NewLine, vm.TotalHours);
145+
labels.Add(ResourceStringManager.GetResourceByKey(vm.Day.ToString()) + formattedAvgHours);
144146
}
145147

146148
return labels.ToArray();
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<UserControl x:Class="TakeMyTime.WPF.Statistics.ProductiveWorkingWeekdaysTooltip"
2+
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3+
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4+
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
5+
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
6+
xmlns:wpf="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Wpf"
7+
xmlns:local="clr-namespace:TakeMyTime.WPF.Statistics"
8+
xmlns:viewModel="clr-namespace:TakeMyTime.Models.Models;assembly=TakeMyTime.Models"
9+
mc:Ignorable="d"
10+
d:DesignHeight="300" d:DesignWidth="300"
11+
d:DataContext="{d:DesignInstance local:ProductiveWorkingWeekdaysTooltip}"
12+
Background="#E4555555" Padding="20 10" BorderThickness="2" BorderBrush="#555555">
13+
<ItemsControl ItemsSource="{Binding Data.Points}" Grid.IsSharedSizeScope="True">
14+
<ItemsControl.ItemTemplate>
15+
<DataTemplate DataType="{x:Type wpf:DataPointViewModel}">
16+
<Grid Margin="2">
17+
<Grid.ColumnDefinitions>
18+
<ColumnDefinition Width="Auto"/>
19+
<ColumnDefinition Width="Auto" SharedSizeGroup="Percentage"/>
20+
<ColumnDefinition Width="Auto" SharedSizeGroup="AverageHours"/>
21+
<ColumnDefinition Width="Auto" SharedSizeGroup="TotalHours"/>
22+
</Grid.ColumnDefinitions>
23+
<Rectangle Grid.Column="0" Stroke="{Binding Series.Stroke}" Fill="{Binding Series.Fill}"
24+
Height="15" Width="15"></Rectangle>
25+
<TextBlock Grid.Column="1" Text="{Binding ChartPoint.Instance.(viewModel:MostProductiveWeekDaysViewModel.Value),
26+
StringFormat=:% {0:0.00}}"
27+
Margin="5 0 0 0" VerticalAlignment="Center" Foreground="White"/>
28+
<TextBlock Grid.Column="2" Text="{Binding ChartPoint.Instance.(viewModel:MostProductiveWeekDaysViewModel.AverageHours),
29+
StringFormat=:Ø {0:0.00}}"
30+
Margin="5 0 0 0" VerticalAlignment="Center" Foreground="White"/>
31+
<TextBlock Grid.Column="3" Text="{Binding ChartPoint.Instance.(viewModel:MostProductiveWeekDaysViewModel.TotalHours),
32+
StringFormat=Total: {0:.00}}"
33+
Margin="5 0 0 0" VerticalAlignment="Center" Foreground="White"/>
34+
</Grid>
35+
</DataTemplate>
36+
</ItemsControl.ItemTemplate>
37+
</ItemsControl>
38+
</UserControl>
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
using LiveCharts;
2+
using LiveCharts.Wpf;
3+
using System;
4+
using System.Collections.Generic;
5+
using System.ComponentModel;
6+
using System.Text;
7+
using System.Windows;
8+
using System.Windows.Controls;
9+
using System.Windows.Data;
10+
using System.Windows.Documents;
11+
using System.Windows.Input;
12+
using System.Windows.Media;
13+
using System.Windows.Media.Imaging;
14+
using System.Windows.Navigation;
15+
using System.Windows.Shapes;
16+
17+
namespace TakeMyTime.WPF.Statistics
18+
{
19+
/// <summary>
20+
/// Interaktionslogik für ProductiveWorkingWeekdaysTooltip.xaml
21+
/// </summary>
22+
public partial class ProductiveWorkingWeekdaysTooltip : UserControl, IChartTooltip
23+
{
24+
private TooltipData _data;
25+
public ProductiveWorkingWeekdaysTooltip()
26+
{
27+
InitializeComponent();
28+
29+
//LiveCharts will inject the tooltip data in the Data property
30+
//your job is only to display this data as required
31+
32+
DataContext = this;
33+
}
34+
35+
public event PropertyChangedEventHandler PropertyChanged;
36+
37+
public TooltipData Data
38+
{
39+
get { return _data; }
40+
set
41+
{
42+
_data = value;
43+
OnPropertyChanged("Data");
44+
}
45+
}
46+
47+
public TooltipSelectionMode? SelectionMode { get; set; }
48+
49+
protected virtual void OnPropertyChanged(string propertyName = null)
50+
{
51+
if (PropertyChanged != null)
52+
PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));
53+
}
54+
}
55+
}

TakeMyTime.WPF/TakeMyTime.WPF.csproj.user

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@
4040
<Compile Update="Statistics\Dashboard.xaml.cs">
4141
<SubType>Code</SubType>
4242
</Compile>
43+
<Compile Update="Statistics\ProductiveWorkingWeekdaysTooltip.xaml.cs">
44+
<SubType>Code</SubType>
45+
</Compile>
4346
<Compile Update="Subtasks\AddSubtask.xaml.cs">
4447
<SubType>Code</SubType>
4548
</Compile>
@@ -86,6 +89,9 @@
8689
<Page Update="Statistics\Dashboard.xaml">
8790
<SubType>Designer</SubType>
8891
</Page>
92+
<Page Update="Statistics\ProductiveWorkingWeekdaysTooltip.xaml">
93+
<SubType>Designer</SubType>
94+
</Page>
8995
<Page Update="Subtasks\AddSubtask.xaml">
9096
<SubType>Designer</SubType>
9197
</Page>

0 commit comments

Comments
 (0)