diff --git a/Jugenddienst Stunden/Models/Auth.cs b/Jugenddienst Stunden/Models/Auth.cs index 4c7e410..aa47b8a 100644 --- a/Jugenddienst Stunden/Models/Auth.cs +++ b/Jugenddienst Stunden/Models/Auth.cs @@ -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 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) }) { - string data = await GetApiDataWithAuthAsync(apiUrl, bearerToken); + try { + HttpClient client = new HttpClient(); + client.DefaultRequestHeaders.Add("Accept", "application/json"); + client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token); - if (data != null) { - //Console.WriteLine("API-Daten:"); - //Console.WriteLine(data); - //JOperator operator = Newtonsoft.Json.JsonConvert.DeserializeObject(data); - //var zeug = Newtonsoft.Json.JsonConvert.DeserializeObject(data); - Hours hours = Newtonsoft.Json.JsonConvert.DeserializeObject(data); + string json = JsonSerializer.Serialize(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); } + //} } + + } } diff --git a/Jugenddienst Stunden/Models/Operator.cs b/Jugenddienst Stunden/Models/Operator.cs index 255bcba..9624cfe 100644 --- a/Jugenddienst Stunden/Models/Operator.cs +++ b/Jugenddienst Stunden/Models/Operator.cs @@ -16,25 +16,16 @@ namespace Jugenddienst_Stunden.Models { public string aktiv; public string department; public string department_name; - //public List? timetable_begin; - /// - /// TimeTable Num - /// public string num; - //public List? saved_overtime; - //public List? saved_holiday; - //public TimeOnly overtime; - //public TimeOnly holiday; public string year; - //public List? timetable; public event EventHandler AlertEvent; public static async Task 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(data); Preferences.Default.Set("name", OperatorVar.name); Preferences.Default.Set("surname", OperatorVar.surname); Preferences.Default.Set("apiUrl", tokendata.url); - } } diff --git a/Jugenddienst Stunden/Models/Stunde.cs b/Jugenddienst Stunden/Models/Stunde.cs index bf6e9de..2a26ea0 100644 --- a/Jugenddienst Stunden/Models/Stunde.cs +++ b/Jugenddienst Stunden/Models/Stunde.cs @@ -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 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 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; + } } } diff --git a/Jugenddienst Stunden/ViewModels/StundeViewModel.cs b/Jugenddienst Stunden/ViewModels/StundeViewModel.cs index 6189b62..3676e50 100644 --- a/Jugenddienst Stunden/ViewModels/StundeViewModel.cs +++ b/Jugenddienst Stunden/ViewModels/StundeViewModel.cs @@ -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 AlertEvent; + public ObservableCollection OptionsGemeinde { get; private set; } public ObservableCollection OptionsProjekt { get; private set; } public ObservableCollection 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 { - "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 AlertEvent; - public event EventHandler ErrorEvent; - - async void IQueryAttributable.ApplyQueryAttributes(IDictionary 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(_stunde.Projekte); - OptionsGemeinde = new ObservableCollection(_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 { + "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 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(_stunde.Projekte); + OptionsGemeinde = new ObservableCollection(_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)); + + } + } + + } } diff --git a/Jugenddienst Stunden/ViewModels/StundenViewModel.cs b/Jugenddienst Stunden/ViewModels/StundenViewModel.cs index 986e7ad..a8a02bb 100644 --- a/Jugenddienst Stunden/ViewModels/StundenViewModel.cs +++ b/Jugenddienst Stunden/ViewModels/StundenViewModel.cs @@ -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 DayTimes { get => _hour.daytime; + set { + if (_hour.daytime != value) { + _hour.daytime = value; + OnPropertyChanged(); + } + } } public DateTime MinimumDate { @@ -94,16 +104,14 @@ namespace Jugenddienst_Stunden.ViewModels { public string Title { get; set; } = Preferences.Default.Get("name", "") + " " + Preferences.Default.Get("surname", ""); - + public List TimeDay { get; set; } - + 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 AlertEvent; + + private async Task LoadData() { try { _hour = await Models.Stunde.LoadData(); @@ -144,14 +154,21 @@ 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 { 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(); AlertEvent?.Invoke(this, e.Message); + } - } private void RefreshProperties() { @@ -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)); diff --git a/Jugenddienst Stunden/Views/StundePage.xaml b/Jugenddienst Stunden/Views/StundePage.xaml index baf01eb..8934328 100644 --- a/Jugenddienst Stunden/Views/StundePage.xaml +++ b/Jugenddienst Stunden/Views/StundePage.xaml @@ -10,8 +10,24 @@ +