Add Save function, Visuals, Stuff

This commit is contained in:
2024-09-25 15:32:58 +02:00
parent a066b9caba
commit 3f2191673e
7 changed files with 250 additions and 235 deletions

View File

@@ -4,6 +4,7 @@ using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Jugenddienst_Stunden.Types;
using System.Text.Json;
using ZXing.QrCode.Internal;
namespace Jugenddienst_Stunden.Models {
@@ -12,6 +13,7 @@ namespace Jugenddienst_Stunden.Models {
public Hours hours;
public static async Task<string> GetApiDataWithAuthAsync(string url, string token) {
// Erstellen eines HttpClient-Objekts
using (HttpClient client = new HttpClient() { Timeout = TimeSpan.FromSeconds(15) }) {
@@ -26,44 +28,48 @@ namespace Jugenddienst_Stunden.Models {
//system.net.webexception nachricht = socket closed
//Grund: Falscher DNS-Server liefert falsche Server-IP
// Senden der Anfrage und Abrufen der Antwort
using (HttpResponseMessage HttpResponseMessage = await client.GetAsync(url).ConfigureAwait(false)) {
// Überprüfen, ob die Anfrage erfolgreich war
if (HttpResponseMessage.StatusCode == System.Net.HttpStatusCode.OK) {
using (HttpContent HttpContent = HttpResponseMessage.Content) {
// Lesen und Rückgabe der Antwort als String
string responseData = await HttpContent.ReadAsStringAsync();
return responseData;
}
}
}
// Senden der Anfrage und Abrufen der Antwort
//HttpResponseMessage response = await client.GetAsync(url);
// Überprüfen, ob die Anfrage erfolgreich war
//response.EnsureSuccessStatusCode();
// Lesen und Rückgabe der Antwort als String
//string responseData = await response.Content.ReadAsStringAsync();
//return responseData;
}
return null;
}
public static async Task Main(string[] args) {
string apiUrl = args[0]; // Ersetzen Sie dies durch die tatsächliche URL der API
string bearerToken = args[1]; // Ersetzen Sie hier durch Ihr tatsächliches Token
Preferences.Default.Set("apiUrl", apiUrl);
public static async Task SaveItemAsync(string url, string token, DayTime item, bool isNewItem = false) {
//using (HttpClient client = new HttpClient() { Timeout = TimeSpan.FromSeconds(15) }) {
try {
HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Add("Accept", "application/json");
client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token);
string json = JsonSerializer.Serialize<DayTime>(item);
StringContent content = new StringContent(json, Encoding.UTF8, "application/json");
HttpResponseMessage response = null;
if (isNewItem)
response = await client.PostAsync(url, content);
else
response = await client.PutAsync(url, content);
if (response.IsSuccessStatusCode)
Debug.WriteLine(@"\tTodoItem successfully saved.");
} catch (Exception ex) {
Debug.WriteLine(@"\tERROR {0}", ex.Message);
}
//}
}
string data = await GetApiDataWithAuthAsync(apiUrl, bearerToken);
if (data != null) {
//Console.WriteLine("API-Daten:");
//Console.WriteLine(data);
//JOperator operator = Newtonsoft.Json.JsonConvert.DeserializeObject<JOperator>(data);
//var zeug = Newtonsoft.Json.JsonConvert.DeserializeObject(data);
Hours hours = Newtonsoft.Json.JsonConvert.DeserializeObject<Hours>(data);
}
}
}
}

View File

@@ -16,25 +16,16 @@ namespace Jugenddienst_Stunden.Models {
public string aktiv;
public string department;
public string department_name;
//public List<DateOnly>? timetable_begin;
/// <summary>
/// TimeTable Num
/// </summary>
public string num;
//public List<TimeOnly>? saved_overtime;
//public List<TimeOnly>? saved_holiday;
//public TimeOnly overtime;
//public TimeOnly holiday;
public string year;
//public List<int>? timetable;
public event EventHandler<string> AlertEvent;
public static async Task<Operator> LoadData(string apiKey) {
//var apiKey = Preferences.Default.Get("apiKey", "");
Operator OperatorVar = new Operator();
//Operator operator = new Operator();
if (Connectivity.Current.NetworkAccess == NetworkAccess.None) {
await App.Current.MainPage.DisplayAlert("Keine Internetverbindung",
"Bitte überprüfen Sie Ihre Internetverbindung und versuchen Sie es erneut.",
@@ -48,12 +39,11 @@ namespace Jugenddienst_Stunden.Models {
if (data == "\"Lalala\"") {
throw new Exception("Problem mit Token");
}
if (data != null) {
if (data != "null") {
OperatorVar = JsonConvert.DeserializeObject<Operator>(data);
Preferences.Default.Set("name", OperatorVar.name);
Preferences.Default.Set("surname", OperatorVar.surname);
Preferences.Default.Set("apiUrl", tokendata.url);
}
}

View File

@@ -33,7 +33,8 @@ namespace Jugenddienst_Stunden.Models {
//private static readonly string requestUrl = $"{BaseAddress}/appapi?hours";
//public static string apiKey = "Mnx6amdpUkFCdWMvc0lmZ3dWeXRVSWx3VGRDRDh8aHR0cDovL2hvdXJzLmRhdW5pLm1pbmUubnU6ODEvYXBwYXBp"; //Daniel Pichler
//public static string apiKey = "M3xraUdoSktrdGowaUZoaStJbDJLWmIyTFhYeDh8aHR0cDovL2hvdXJzLmRhdW5pLm1pbmUubnU6ODEvYXBwYXBp"; //Daniel Pichler
public static async Task<Hours> LoadData() {
@@ -41,6 +42,8 @@ namespace Jugenddienst_Stunden.Models {
//Temporär fix für virtuelle App
//apiKey = "NXw5eFF0RVQ5TFBMTXFVeFIzQURtd01idHFUb2d8aHR0cDovL2hvdXJzLmRhdW5pLm1pbmUubnU6ODEvYXBwYXBp"; //Johannes Fink
//apiKey = "M3xraUdoSktrdGowaUZoaStJbDJLWmIyTFhYeDh8aHR0cDovL2hvdXJzLmRhdW5pLm1pbmUubnU6ODEvYXBwYXBp"; //Lea Mair
//apiKey = "Mnx6amdpUkFCdWMvc0lmZ3dWeXRVSWx3VGRDRDh8aHR0cDovL2hvdXJzLmRhdW5pLm1pbmUubnU6ODEvYXBwYXBp"; //Daniel Pichler
Hours hours = new Hours();
@@ -55,7 +58,7 @@ namespace Jugenddienst_Stunden.Models {
//string data = await Auth.GetApiDataWithAuthAsync(requestUrl, apiKey);
string data = await Auth.GetApiDataWithAuthAsync(tokendata.url + "?hours", tokendata.apiKey);
if (data == null) {
if (data == "null") {
throw new Exception("Keine Daten erhalten");
}
if (data == "\"Lalala\"") {
@@ -83,8 +86,8 @@ namespace Jugenddienst_Stunden.Models {
//string data = await Auth.GetApiDataWithAuthAsync(requestUrl, apiKey);
string data = await Auth.GetApiDataWithAuthAsync(tokendata.url + "?date=" + date.ToString("yyyy-MM-dd"), tokendata.apiKey);
if (data == null) {
throw new Exception("Keine Daten erhalten");
if (data == "null") {
throw new Exception("Keine Daten für " + date.ToString("ddd. dd. MMM") + " erhalten");
}
if (data == "\"Lalala\"") {
throw new Exception("Problem mit Token");
@@ -128,5 +131,12 @@ namespace Jugenddienst_Stunden.Models {
};
}
public static async Task<DayTime> SaveEntry(DayTime stunde) { //, string begin, string end, string freistellung, string bemerkung) {
var tokendata = new TokenData(apiKey);
await Auth.SaveItemAsync(tokendata.url, tokendata.apiKey, stunde,false);
return null;
}
}
}

View File

@@ -15,105 +15,20 @@ namespace Jugenddienst_Stunden.ViewModels {
public int id { get; set; }
public string SubTitle { get; set; } = DateTime.Today.ToString("dddd, d. MMM. yyyy");
private DayTime _stunde;
public DayTime Stunde { get => _stunde; }
public int Identifier => (int)_stunde.id;
public event EventHandler<string> AlertEvent;
public ObservableCollection<Gemeinde> OptionsGemeinde { get; private set; }
public ObservableCollection<Projekt> OptionsProjekt { get; private set; }
public ObservableCollection<string> OptionsFreistellung { get; }
//public TimeSpan Von {
// get => _stunde.begin.ToTimeSpan();
// set {
// if (_stunde.begin.ToTimeSpan() != value) {
// _stunde.begin = TimeOnly.FromTimeSpan(value);
// OnPropertyChanged(nameof(Von));
// }
// }
//}
//public TimeSpan Bis {
// get => _stunde.end.ToTimeSpan();
// set {
// if (_stunde.end.ToTimeSpan() != value) {
// _stunde.end = TimeOnly.FromTimeSpan(value);
// OnPropertyChanged(nameof(Bis));
// }
// }
//}
public string SubTitle { get; set; } = DateTime.Today.ToString("dddd, d. MMM. yyyy");
public int Identifier => (int)_stunde.id;
public ICommand SaveCommand { get; private set; }
public ICommand DeleteCommand { get; private set; }
public StundeViewModel() {
_stunde = new DayTime();
//SaveCommand = new AsyncRelayCommand(Save);
//DeleteCommand = new AsyncRelayCommand(Delete);
OptionsFreistellung = new ObservableCollection<string> {
"Urlaub",
"Krankheit",
"Elternzeit"
};
}
public StundeViewModel(DayTime stunde) {
_stunde = stunde;
//SaveCommand = new AsyncRelayCommand(Save);
//DeleteCommand = new AsyncRelayCommand(Delete);
}
//private async Task Save() {
// _stunde.Date = DateTime.Now;
// _stunde.Save();
// await Shell.Current.GoToAsync($"..?saved={_stunde.Filename}");
//}
//private async Task Delete() {
// _stunde.Delete();
// await Shell.Current.GoToAsync($"..?deleted={_stunde.Filename}");
//}
public event EventHandler<string> AlertEvent;
public event EventHandler<string> ErrorEvent;
async void IQueryAttributable.ApplyQueryAttributes(IDictionary<string, object> query) {
if (query.ContainsKey("load")) {
//DateTime heute = DateTime.Now;
_stunde = await Models.Stunde.LoadEntry(Convert.ToInt32(query["load"]));
if (String.IsNullOrEmpty(_stunde.description)) {
AlertEvent?.Invoke(this, "Eintrag hat keine Daten zurückgegeben");
}
SubTitle = _stunde.day.ToString("dddd, d. MMM. yyyy");
OptionsProjekt = new ObservableCollection<Projekt>(_stunde.Projekte);
OptionsGemeinde = new ObservableCollection<Gemeinde>(_stunde.Gemeinden);
OnPropertyChanged(nameof(OptionsGemeinde));
OnPropertyChanged(nameof(OptionsProjekt));
//OptionsProjekt.FirstOrDefault(x => x.Id == _stunde.projekt);
SelectedOptionGemeinde = OptionsGemeinde.FirstOrDefault(item => item.Id == _stunde.gemeinde) ?? new Gemeinde();
OnPropertyChanged(nameof(SelectedOptionGemeinde));
SelectedOptionProjekt = OptionsProjekt.FirstOrDefault(Projekt => Projekt.Id == _stunde.projekt) ?? new Projekt();
OnPropertyChanged(nameof(SelectedOptionProjekt));
OnPropertyChanged(nameof(Stunde));
OnPropertyChanged(nameof(SubTitle));
}
}
private Gemeinde _selectedGemeinde;
public Gemeinde SelectedOptionGemeinde {
get => _selectedGemeinde;
@@ -148,5 +63,99 @@ namespace Jugenddienst_Stunden.ViewModels {
}
}
}
//public TimeSpan Von {
// get => _stunde.begin.ToTimeSpan();
// set {
// if (_stunde.begin.ToTimeSpan() != value) {
// _stunde.begin = TimeOnly.FromTimeSpan(value);
// OnPropertyChanged(nameof(Von));
// }
// }
//}
//public TimeSpan Bis {
// get => _stunde.end.ToTimeSpan();
// set {
// if (_stunde.end.ToTimeSpan() != value) {
// _stunde.end = TimeOnly.FromTimeSpan(value);
// OnPropertyChanged(nameof(Bis));
// }
// }
//}
public ICommand SaveCommand { get; private set; }
public ICommand DeleteCommand { get; private set; }
public StundeViewModel() {
_stunde = new DayTime();
SaveCommand = new AsyncRelayCommand(Save);
//DeleteCommand = new AsyncRelayCommand(Delete);
OptionsFreistellung = new ObservableCollection<string> {
"Keine",
"Urlaub",
"Krankheit",
"Elternzeit"
};
}
public StundeViewModel(DayTime stunde) {
_stunde = stunde;
SaveCommand = new AsyncRelayCommand(Save);
//DeleteCommand = new AsyncRelayCommand(Delete);
}
async Task Save() {
//_stunde.day = DateTime.Now;
//_stunde.Save();
await Models.Stunde.SaveEntry(_stunde);
await Shell.Current.GoToAsync($"..?saved={_stunde.id}");
}
//private async Task Delete() {
// _stunde.Delete();
// await Shell.Current.GoToAsync($"..?deleted={_stunde.Filename}");
//}
async void IQueryAttributable.ApplyQueryAttributes(IDictionary<string, object> query) {
if (query.ContainsKey("load")) {
//DateTime heute = DateTime.Now;
_stunde = await Models.Stunde.LoadEntry(Convert.ToInt32(query["load"]));
if (String.IsNullOrEmpty(_stunde.description)) {
AlertEvent?.Invoke(this, "Eintrag hat keine Daten zurückgegeben");
}
SubTitle = _stunde.day.ToString("dddd, d. MMM. yyyy");
OptionsProjekt = new ObservableCollection<Projekt>(_stunde.Projekte);
OptionsGemeinde = new ObservableCollection<Gemeinde>(_stunde.Gemeinden);
OnPropertyChanged(nameof(OptionsGemeinde));
OnPropertyChanged(nameof(OptionsProjekt));
//OptionsProjekt.FirstOrDefault(x => x.Id == _stunde.projekt);
SelectedOptionGemeinde = OptionsGemeinde.FirstOrDefault(item => item.Id == _stunde.gemeinde) ?? new Gemeinde();
OnPropertyChanged(nameof(SelectedOptionGemeinde));
SelectedOptionProjekt = OptionsProjekt.FirstOrDefault(Projekt => Projekt.Id == _stunde.projekt) ?? new Projekt();
OnPropertyChanged(nameof(SelectedOptionProjekt));
OnPropertyChanged(nameof(Stunde));
OnPropertyChanged(nameof(SubTitle));
}
}
}
}

View File

@@ -15,7 +15,7 @@ namespace Jugenddienst_Stunden.ViewModels {
public string Surname => AppInfo.VersionString;
public string MoreInfoUrl => "https://aka.ms/maui";
public string Message => "Hier werden deine geleisteten Arbeitsstunden aufgelistet";
public string LoadOverview => "Lade Summen für " + DateTime.Today.ToString("MMMM");
public string LoadOverview => "Zeige Summen für " + DateTime.Today.ToString("MMMM");
public static DateTime GetDay = DateTime.Today;
public string ShowDay => "Zeit an Tag " + GetDay.ToString("ddd d. MMM") + ": ";
@@ -50,9 +50,19 @@ namespace Jugenddienst_Stunden.ViewModels {
public string OvertimeMonth {
get => _hour.overtime_month;
}
public string Holiday {
get => _hour.holiday;
}
public TimeOnly DayTotal { get; set; }
public List<DayTime> DayTimes {
get => _hour.daytime;
set {
if (_hour.daytime != value) {
_hour.daytime = value;
OnPropertyChanged();
}
}
}
public DateTime MinimumDate {
@@ -102,8 +112,6 @@ namespace Jugenddienst_Stunden.ViewModels {
public StundenViewModel() {
_hour = new Types.Hours();
LoadDataCommand = new AsyncRelayCommand(LoadData);
@@ -115,6 +123,7 @@ namespace Jugenddienst_Stunden.ViewModels {
}
private async Task NewEntryAsync() {
//Hier muss das Datum übergeben werden
await Shell.Current.GoToAsync(nameof(Views.StundePage));
}
@@ -126,9 +135,10 @@ namespace Jugenddienst_Stunden.ViewModels {
public event EventHandler<string> AlertEvent;
private async Task LoadData() {
try {
_hour = await Models.Stunde.LoadData();
@@ -144,15 +154,22 @@ namespace Jugenddienst_Stunden.ViewModels {
////if (_hour.zeit_total_daily_api != null) {
////TimeDay = _hour.zeit_total_daily_api.Where(static p => p.Day == GetDay.Day).ToList() ?? new List<TimeDay> { new TimeDay { Day = GetDay.Day, Hours = 0 } };
//RefreshProperties();
TimeSpan span = TimeSpan.Zero;
foreach (DayTime dt in _hour.daytime) {
span += dt.end - dt.begin;
}
DayTotal = TimeOnly.FromTimeSpan(span);
OnPropertyChanged(nameof(ShowDay));
OnPropertyChanged(nameof(TimeDay));
OnPropertyChanged(nameof(DayTotal));
OnPropertyChanged(nameof(DayTimes));
////}
} catch (Exception e) {
DayTimes = new List<DayTime>();
AlertEvent?.Invoke(this, e.Message);
}
}
}
private void RefreshProperties() {
OnPropertyChanged(nameof(Nominal));
@@ -160,6 +177,7 @@ namespace Jugenddienst_Stunden.ViewModels {
OnPropertyChanged(nameof(OvertimeMonth));
OnPropertyChanged(nameof(ZeitCalculated));
OnPropertyChanged(nameof(ZeitDone));
OnPropertyChanged(nameof(Holiday));
OnPropertyChanged(nameof(Hours));
OnPropertyChanged(nameof(Title));
OnPropertyChanged(nameof(ZeitTotalDaily));

View File

@@ -10,8 +10,24 @@
</ContentPage.BindingContext>
<VerticalStackLayout Spacing="10" Margin="10">
<Label Text="{Binding SubTitle}" />
<FlexLayout Direction="Row" AlignItems="Start" Wrap="Wrap" JustifyContent="SpaceBetween">
<Border Background="LightGreen" >
<HorizontalStackLayout>
<Label Text="Beginn" TextColor="Gray" VerticalTextAlignment="Center" HorizontalTextAlignment="End" Padding="0,0,10,0" Margin="5,0,0,0" MinimumWidthRequest="60"></Label>
<TimePicker x:Name="TimeBegin" HorizontalOptions="Center" TextColor="Gray" Format="HH:mm" MinimumWidthRequest="80" Time="{Binding Stunde.TimeSpanVon}" Margin="0,0,0,-5" />
</HorizontalStackLayout>
</Border>
<Border Background="OrangeRed" >
<HorizontalStackLayout>
<Label Text="Ende" TextColor="White" VerticalTextAlignment="Center" HorizontalTextAlignment="End" Padding="0,0,10,0" Margin="5,0,0,0" MinimumWidthRequest="60"></Label>
<TimePicker x:Name="TimeEnd" TextColor="White" Format="HH:mm" MinimumWidthRequest="80" Time="{Binding Stunde.TimeSpanBis}" Margin="0,0,0,-5" />
</HorizontalStackLayout>
</Border>
</FlexLayout>
<Grid ColumnDefinitions="*,*,*">
<Picker x:Name="pick_gemeinde" Title="Gemeinde" ItemsSource="{Binding OptionsGemeinde}" SelectedItem="{Binding SelectedOptionGemeinde, Mode=TwoWay}" ItemDisplayBinding="{Binding Name}" Grid.Column="0" >
</Picker>
@@ -21,46 +37,13 @@
</Picker>
</Grid>
<FlexLayout Direction="Row" AlignItems="Start" Wrap="Wrap">
<Border Background="LightGreen">
<HorizontalStackLayout>
<Label Text="Beginn" TextColor="Gray" VerticalTextAlignment="Center" HorizontalTextAlignment="End" Padding="0,0,10,0" Margin="5,0,0,13"></Label>
<TimePicker x:Name="TimeBegin" HorizontalOptions="Center" TextColor="Gray" Format="HH:mm" MinimumWidthRequest="80" Time="{Binding Stunde.TimeSpanVon}" />
</HorizontalStackLayout>
</Border>
<Border Background="OrangeRed">
<HorizontalStackLayout>
<Label Text="Ende" TextColor="White" VerticalTextAlignment="Center" HorizontalTextAlignment="End" Padding="0,0,10,0" Margin="5,0,0,13"></Label>
<TimePicker x:Name="TimeEnd" TextColor="White" Format="HH:mm" MinimumWidthRequest="80" Time="{Binding Stunde.TimeSpanBis}" />
</HorizontalStackLayout>
</Border>
</FlexLayout>
<Grid Padding="5,10,5,10">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Editor Placeholder="Beschreibung" Text="{Binding Stunde.description}" MinimumHeightRequest="40" AutoSize="TextChanges" FontSize="18" />
<HorizontalStackLayout Grid.Row="0" Grid.Column="0">
<Label Grid.Row="0" Grid.Column="0" Text="{Binding Stunde.begin}"/>
<Label Text="bis" Padding="10,0,10,0"/>
<Label Grid.Row="0" Grid.Column="1" Text="{Binding Stunde.end}"/>
</HorizontalStackLayout>
<!--<Label Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" Text="{Binding Stunde.description}" Padding="0,0,0,5"/>-->
<Editor Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" Placeholder="Beschreibung" Text="{Binding Stunde.description}" MinimumHeightRequest="40" AutoSize="TextChanges" />
</Grid>
<Grid ColumnDefinitions="*,*" ColumnSpacing="4">
<Button Text="Save" />
<Button Grid.Column="1" Text="Delete" />
<Button Text="Speichern" Command="{Binding SaveCommand}" />
<Button Grid.Column="1" Text="Löschen" />
</Grid>
</VerticalStackLayout>
</ContentPage>

View File

@@ -21,7 +21,7 @@
MaximumDate="{Binding MaximumDate}"
Date="{Binding DateToday}" Format="dddd, d. MMM yyyy" />
<Border Grid.Column="1" Margin="15,0,0,0" Padding="15,0,0,0">
<Label Text="{Binding TimeDay[0].Hours}" VerticalOptions="Center"></Label>
<Label Text="{Binding DayTotal}" VerticalOptions="Center"></Label>
</Border>
</Grid>
@@ -90,24 +90,23 @@
<BoxView HeightRequest="1" Color="Red"/>
<Label Text="{Binding Message}" />
<Button Text="{Binding LoadOverview}" Command="{Binding LoadDataCommand}" />
<Grid RowDefinitions="Auto,Auto,Auto,Auto,Auto,*" ColumnDefinitions="Auto,*" Margin="10">
<Label Text="Soll:" Grid.Row="0" Background="DarkSalmon" />
<Label Text="Gearbeitet:" Grid.Row="1" />
<Label Text="Berechnet:" Grid.Row="2" />
<Label Text="Überstunden Monat:" Grid.Row="3" Margin="0,0,15,0" />
<Label Text="Überstunden Jahr:" Grid.Row="4" />
<Label Grid.Row="0" Text="Soll:" Background="DarkSalmon" />
<Label Grid.Row="1" Text="Summe:" />
<Label Grid.Row="2" Text="Differenz:" Margin="0,0,15,0" />
<Label Grid.Row="3" Text="Restüberstunden:" />
<Label Grid.Row="4" Text="Resturlaub:" />
<Label Grid.Row="0" Grid.Column="1" HorizontalTextAlignment="End" Padding="0,0,5,0" Text="{Binding Nominal}" Background="DarkSalmon" />
<Label Grid.Row="1" Grid.Column="1" HorizontalTextAlignment="End" Padding="0,0,5,0" Text="{Binding ZeitDone}" />
<Label Grid.Row="2" Grid.Column="1" HorizontalTextAlignment="End" Padding="0,0,5,0" Text="{Binding ZeitCalculated}" />
<Label Grid.Row="3" Grid.Column="1" HorizontalTextAlignment="End" Padding="0,0,5,0" Text="{Binding OvertimeMonth}" />
<Label Grid.Row="4" Grid.Column="1" HorizontalTextAlignment="End" Padding="0,0,5,0" Text="{Binding Overtime}" />
<Label Grid.Row="5" Grid.Column="1" HorizontalTextAlignment="End" Padding="0,0,5,0" Text="{Binding Hours.overtime}" />
<!--<Label Grid.Row="1" Grid.Column="1" HorizontalTextAlignment="End" Padding="0,0,5,0" Text="{Binding ZeitDone}" />-->
<Label Grid.Row="1" Grid.Column="1" HorizontalTextAlignment="End" Padding="0,0,5,0" Text="{Binding ZeitCalculated}" />
<Label Grid.Row="2" Grid.Column="1" HorizontalTextAlignment="End" Padding="0,0,5,0" Text="{Binding OvertimeMonth}" />
<Label Grid.Row="3" Grid.Column="1" HorizontalTextAlignment="End" Padding="0,0,5,0" Text="{Binding Overtime}" />
<Label Grid.Row="4" Grid.Column="1" HorizontalTextAlignment="End" Padding="0,0,5,0" Text="{Binding Holiday}" />
</Grid>