Vorbereitungen für 1.0.6
Beachte die Einstellung ob Projekte und Gemeinden aktiv sind. Verbiete Änderungen an der Freistellung, wenn sie genehmigt wurde. Vereinfache das Speichern der Einstellungen Bessere Fehlerbehandlung, einheitlichere API
This commit is contained in:
@@ -3,6 +3,7 @@ using CommunityToolkit.Mvvm.Input;
|
||||
using Jugenddienst_Stunden.Models;
|
||||
using Jugenddienst_Stunden.Types;
|
||||
using System.Windows.Input;
|
||||
using static System.Runtime.InteropServices.JavaScript.JSType;
|
||||
|
||||
namespace Jugenddienst_Stunden.ViewModels;
|
||||
/// <summary>
|
||||
@@ -14,7 +15,7 @@ public class StundeViewModel : ObservableObject, IQueryAttributable {
|
||||
public string Title { get; set; } = "Eintrag bearbeiten";
|
||||
public string SubTitle { get; set; } = DateTime.Today.ToString("dddd, d. MMMM yyyy");
|
||||
|
||||
private HoursBase HoursBase = new HoursBase();
|
||||
//private HoursBase HoursBase = new HoursBase();
|
||||
internal Settings Settings = new Settings();
|
||||
|
||||
public event EventHandler<string> AlertEvent;
|
||||
@@ -50,8 +51,9 @@ public class StundeViewModel : ObservableObject, IQueryAttributable {
|
||||
set {
|
||||
if (_dayTime != value) {
|
||||
_dayTime = value;
|
||||
|
||||
}OnPropertyChanged(nameof(DayTime));
|
||||
|
||||
}
|
||||
OnPropertyChanged(nameof(DayTime));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -77,13 +79,14 @@ public class StundeViewModel : ObservableObject, IQueryAttributable {
|
||||
//public ICommand LoadDataCommand { get; private set; }
|
||||
|
||||
|
||||
|
||||
public StundeViewModel() {
|
||||
DayTime = new DayTime();
|
||||
|
||||
SaveCommand = new AsyncRelayCommand(Save);
|
||||
//DeleteCommand = new AsyncRelayCommand(Delete);
|
||||
DeleteConfirmCommand = new Command(async () => await DeleteConfirm());
|
||||
LoadSettingsAsync();
|
||||
//LoadSettingsAsync();
|
||||
}
|
||||
|
||||
public StundeViewModel(DayTime stunde) {
|
||||
@@ -91,9 +94,11 @@ public class StundeViewModel : ObservableObject, IQueryAttributable {
|
||||
|
||||
SaveCommand = new AsyncRelayCommand(Save);
|
||||
DeleteConfirmCommand = new AsyncRelayCommand(DeleteConfirm);
|
||||
LoadSettingsAsync();
|
||||
//LoadSettingsAsync();
|
||||
}
|
||||
|
||||
|
||||
|
||||
private async void LoadSettingsAsync() {
|
||||
|
||||
try {
|
||||
@@ -105,7 +110,7 @@ public class StundeViewModel : ObservableObject, IQueryAttributable {
|
||||
|
||||
GemeindeAktivSet = Settings.GemeindeAktivSet;
|
||||
ProjektAktivSet = Settings.ProjektAktivSet;
|
||||
|
||||
GlobalVar.Settings = Settings;
|
||||
OnPropertyChanged(nameof(OptionsGemeinde));
|
||||
OnPropertyChanged(nameof(OptionsFreistellung));
|
||||
OnPropertyChanged(nameof(OptionsProjekt));
|
||||
@@ -116,24 +121,15 @@ public class StundeViewModel : ObservableObject, IQueryAttributable {
|
||||
AlertEvent?.Invoke(this, e.Message);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
private async Task LoadData() {
|
||||
try {
|
||||
Hours _hours = await Models.HoursBase.LoadBasicData();
|
||||
DayTime.EmployeeId = _hours.EmployeeId;
|
||||
} catch (Exception e) {
|
||||
AlertEvent?.Invoke(this, e.Message);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
async Task Save() {
|
||||
bool exceptionOccurred = false;
|
||||
try {
|
||||
await Models.HoursBase.SaveEntry(DayTime);
|
||||
await HoursBase.SaveEntry(DayTime);
|
||||
} catch (Exception e) {
|
||||
AlertEvent?.Invoke(this, e.Message);
|
||||
exceptionOccurred = true;
|
||||
@@ -148,7 +144,7 @@ public class StundeViewModel : ObservableObject, IQueryAttributable {
|
||||
}
|
||||
|
||||
private async Task Delete() {
|
||||
await Models.HoursBase.DeleteEntry(DayTime);
|
||||
await HoursBase.DeleteEntry(DayTime);
|
||||
await Shell.Current.GoToAsync($"..?date={DayTime.Day.ToString("yyyy-MM-dd")}");
|
||||
}
|
||||
|
||||
@@ -157,9 +153,10 @@ public class StundeViewModel : ObservableObject, IQueryAttributable {
|
||||
bool answer = await ConfirmEvent.Invoke("Achtung", "Löschen kann nicht ungeschehen gemacht werden. Fortfahren?");
|
||||
if (answer) {
|
||||
//Löschen
|
||||
await Models.HoursBase.DeleteEntry(DayTime);
|
||||
await HoursBase.DeleteEntry(DayTime);
|
||||
await Shell.Current.GoToAsync($"..?date={DayTime.Day.ToString("yyyy-MM-dd")}");
|
||||
} else { //nicht Löschen
|
||||
} else {
|
||||
//nicht Löschen
|
||||
}
|
||||
}
|
||||
|
||||
@@ -177,9 +174,28 @@ public class StundeViewModel : ObservableObject, IQueryAttributable {
|
||||
if (query.ContainsKey("load")) {
|
||||
|
||||
//DateTime heute = DateTime.Now;
|
||||
_dayTime = await Models.HoursBase.LoadEntry(Convert.ToInt32(query["load"]));
|
||||
try {
|
||||
//_dayTime = await HoursBase.LoadEntry(Convert.ToInt32(query["load"]));
|
||||
BaseResponse dat = await HoursBase.LoadBase("id=" + Convert.ToInt32(query["load"]));
|
||||
_dayTime = dat.daytime;
|
||||
_dayTime.TimeSpanVon = dat.daytime.Begin.ToTimeSpan();
|
||||
_dayTime.TimeSpanBis = dat.daytime.End.ToTimeSpan();
|
||||
OptionsGemeinde = dat.settings.Gemeinden;
|
||||
OptionsProjekt = dat.settings.Projekte;
|
||||
OptionsFreistellung = dat.settings.Freistellungen;
|
||||
|
||||
GemeindeAktivSet = dat.settings.GemeindeAktivSet;
|
||||
ProjektAktivSet = dat.settings.ProjektAktivSet;
|
||||
|
||||
GlobalVar.Settings = dat.settings;
|
||||
|
||||
|
||||
} catch (Exception e) {
|
||||
AlertEvent?.Invoke(this, e.Message);
|
||||
}
|
||||
|
||||
if (System.String.IsNullOrEmpty(DayTime.Description)) {
|
||||
AlertEvent?.Invoke(this, "Eintrag hat keine Daten zurückgegeben");
|
||||
AlertEvent?.Invoke(this, "Eintrag hat keinen Beschreibungstext");
|
||||
}
|
||||
SubTitle = DayTime.Day.ToString("dddd, d. MMMM yyyy");
|
||||
|
||||
@@ -192,33 +208,49 @@ public class StundeViewModel : ObservableObject, IQueryAttributable {
|
||||
|
||||
FreistellungEnabled = !_dayTime.Approved;
|
||||
|
||||
OnPropertyChanged(nameof(FreistellungEnabled));
|
||||
OnPropertyChanged(nameof(DayTime));
|
||||
|
||||
OnPropertyChanged(nameof(SubTitle));
|
||||
|
||||
}
|
||||
if (query.ContainsKey("date")) {
|
||||
Title = "Neuer Eintrag";
|
||||
|
||||
DateTime _date = DateTime.ParseExact((string)query["date"], "yyyy-MM-dd", System.Globalization.CultureInfo.InvariantCulture);
|
||||
|
||||
//Bei neuem Eintrag die vorhandenen des gleichen Tages anzeigen
|
||||
try {
|
||||
DayTimes = await HoursBase.LoadDay(_date);
|
||||
//DayTimes = await HoursBase.LoadDay(_date);
|
||||
BaseResponse dat = await HoursBase.LoadBase("date=" + _date.ToString("yyyy-MM-dd"));
|
||||
DayTimes = dat.daytimes;
|
||||
OptionsGemeinde = dat.settings.Gemeinden;
|
||||
OptionsProjekt = dat.settings.Projekte;
|
||||
OptionsFreistellung = dat.settings.Freistellungen;
|
||||
|
||||
GemeindeAktivSet = dat.settings.GemeindeAktivSet;
|
||||
ProjektAktivSet = dat.settings.ProjektAktivSet;
|
||||
|
||||
GlobalVar.Settings = dat.settings;
|
||||
} catch (Exception) {
|
||||
//Ein Tag ohne Einträge gibt eine Fehlermeldung,
|
||||
//die soll aber ignoriert werden, weil beim Neueintrag ist das ja Wurscht
|
||||
//In dem Fall müssen die Settings aber nochmal geholt werden, weil die dann nicht geladen wurden
|
||||
LoadSettingsAsync();
|
||||
} finally {
|
||||
DayTime.Day = _date;
|
||||
SubTitle = _date.ToString("dddd, d. MMMM yyyy");
|
||||
FreistellungEnabled = true;
|
||||
DayTime.EmployeeId = GlobalVar.EmployeeId;
|
||||
}
|
||||
|
||||
|
||||
DayTime.Day = _date;
|
||||
SubTitle = _date.ToString("dddd, d. MMMM yyyy");
|
||||
|
||||
_ = LoadData();
|
||||
OnPropertyChanged(nameof(Title));
|
||||
OnPropertyChanged(nameof(SubTitle));
|
||||
OnPropertyChanged(nameof(DayTimes));
|
||||
}
|
||||
OnPropertyChanged(nameof(FreistellungEnabled));
|
||||
OnPropertyChanged(nameof(DayTime));
|
||||
OnPropertyChanged(nameof(DayTimes));
|
||||
|
||||
OnPropertyChanged(nameof(SubTitle));
|
||||
OnPropertyChanged(nameof(Title));
|
||||
OnPropertyChanged(nameof(OptionsGemeinde));
|
||||
OnPropertyChanged(nameof(OptionsFreistellung));
|
||||
OnPropertyChanged(nameof(OptionsProjekt));
|
||||
|
||||
OnPropertyChanged(nameof(GemeindeAktivSet));
|
||||
OnPropertyChanged(nameof(ProjektAktivSet));
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -25,16 +25,13 @@ internal class StundenViewModel : ObservableObject, IQueryAttributable, INotifyP
|
||||
public event EventHandler<string> AlertEvent;
|
||||
public event EventHandler<string> InfoEvent;
|
||||
|
||||
private HoursBase HoursBase = new HoursBase();
|
||||
//private HoursBase HoursBase = new HoursBase();
|
||||
internal Settings Settings = new Settings();
|
||||
|
||||
public TimeOnly Sollstunden { get; set; }
|
||||
|
||||
private string _title = HoursBase.name + " " + HoursBase.surname;
|
||||
public string Title {
|
||||
get => _title;
|
||||
set => SetProperty(ref _title, value);
|
||||
}
|
||||
|
||||
public string Title { get; set; } = GlobalVar.Name + " " + GlobalVar.Surname;
|
||||
|
||||
private Hours _hour;
|
||||
public Hours Hours {
|
||||
@@ -150,13 +147,15 @@ internal class StundenViewModel : ObservableObject, IQueryAttributable, INotifyP
|
||||
|
||||
private bool doContinue = true;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// CTOR
|
||||
/// </summary>
|
||||
public StundenViewModel() {
|
||||
_hour = new Hours();
|
||||
|
||||
//LoadSettingsAsync();
|
||||
HoursBase.tokendata = new TokenData(HoursBase.apiKey);
|
||||
//HoursBase.tokendata = new TokenData(HoursBase.apiKey);
|
||||
LoadDataCommand = new AsyncRelayCommand(LoadData);
|
||||
NewEntryCommand = new AsyncRelayCommand(NewEntryAsync);
|
||||
SelectEntryCommand = new AsyncRelayCommand<DayTime>(SelectEntryAsync);
|
||||
@@ -167,6 +166,7 @@ internal class StundenViewModel : ObservableObject, IQueryAttributable, INotifyP
|
||||
|
||||
}
|
||||
|
||||
|
||||
private async Task LoadSettingsAsync() {
|
||||
try {
|
||||
Settings = await HoursBase.LoadSettings();
|
||||
@@ -226,37 +226,46 @@ internal class StundenViewModel : ObservableObject, IQueryAttributable, INotifyP
|
||||
/// </summary>
|
||||
public async Task LoadDay(DateTime date) {
|
||||
DayTotal = new TimeOnly(0);
|
||||
await LoadSettingsAsync();
|
||||
//await LoadSettingsAsync();
|
||||
//if (doContinue) {
|
||||
try {
|
||||
DayTimes = await HoursBase.LoadDay(date);
|
||||
try {
|
||||
//_dayTimes = await HoursBase.LoadDay(date);
|
||||
BaseResponse dat = await HoursBase.LoadBase("date=" + date.ToString("yyyy-MM-dd"));
|
||||
_dayTimes = dat.daytimes;
|
||||
Settings = dat.settings;
|
||||
GemeindeAktivSet = Settings.GemeindeAktivSet;
|
||||
ProjektAktivSet = Settings.ProjektAktivSet;
|
||||
|
||||
List<Sollstunden> _soll;
|
||||
TimeSpan span = TimeSpan.Zero;
|
||||
bool merker = false;
|
||||
foreach (DayTime dt in DayTimes) {
|
||||
span += dt.End - dt.Begin;
|
||||
//Nachtstunden dazurechnen
|
||||
if (dt.Night.Ticks > 0 && !merker) {
|
||||
span += dt.Night.ToTimeSpan() * .5;
|
||||
merker = true;
|
||||
}
|
||||
_soll = Settings.Nominal.Where(w => w.Timetable == dt.TimeTable && w.Wochentag == dt.Wday).ToList();
|
||||
if (_soll.Count > 0)
|
||||
Sollstunden = TimeOnly.FromTimeSpan(TimeSpan.FromHours(_soll[0].Zeit));
|
||||
OnPropertyChanged(nameof(GemeindeAktivSet));
|
||||
OnPropertyChanged(nameof(ProjektAktivSet));
|
||||
|
||||
|
||||
List<Sollstunden> _soll;
|
||||
TimeSpan span = TimeSpan.Zero;
|
||||
bool merker = false;
|
||||
foreach (DayTime dt in _dayTimes) {
|
||||
span += dt.End - dt.Begin;
|
||||
//Nachtstunden dazurechnen
|
||||
if (dt.Night.Ticks > 0 && !merker) {
|
||||
span += dt.Night.ToTimeSpan() * .5;
|
||||
merker = true;
|
||||
}
|
||||
DayTotal = TimeOnly.FromTimeSpan(span);
|
||||
|
||||
|
||||
} catch (Exception e) {
|
||||
DayTimes = new List<DayTime>();
|
||||
//TODO: hier könnte auch ein Fehler kommen, dann wäre InfoEvent falsch.
|
||||
InfoEvent?.Invoke(this, e.Message);
|
||||
} finally {
|
||||
OnPropertyChanged(nameof(DayTotal));
|
||||
OnPropertyChanged(nameof(Sollstunden));
|
||||
//OnPropertyChanged(nameof(DayTimes));
|
||||
_soll = Settings.Nominal.Where(w => w.Timetable == dt.TimeTable && w.Wochentag == dt.Wday).ToList();
|
||||
if (_soll.Count > 0)
|
||||
Sollstunden = TimeOnly.FromTimeSpan(TimeSpan.FromHours(_soll[0].Zeit));
|
||||
}
|
||||
DayTotal = TimeOnly.FromTimeSpan(span);
|
||||
|
||||
|
||||
} catch (Exception e) {
|
||||
_dayTimes = new List<DayTime>();
|
||||
//TODO: hier könnte auch ein Fehler kommen, dann wäre InfoEvent falsch.
|
||||
InfoEvent?.Invoke(this, e.Message);
|
||||
} finally {
|
||||
OnPropertyChanged(nameof(DayTotal));
|
||||
OnPropertyChanged(nameof(Sollstunden));
|
||||
OnPropertyChanged(nameof(DayTimes));
|
||||
}
|
||||
//}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user