import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:get_storage/get_storage.dart'; import 'package:intl/intl.dart'; class HomeController extends GetxController { final isloadingData = false.obs; final box = GetStorage(); final listKantine = [].obs; final newBelegName = '?'.obs; final newBelegDate = '?'.obs; final newBelegBetrag = '?'.obs; @override void onInit() async { super.onInit(); await _loadFromNotionKantine(); // Initialize any necessary data or services here } @override void onClose() {} Future _loadFromNotionKantine() async { isloadingData(true); var postUrl = box.read('BASEURL'); var baeraToken = box.read('TOKEN'); // baeraToken aus GetStorage lesen var headers = Map.from(box.read('HEADERS') ?? {}); headers['Authorization'] = 'Bearer $baeraToken'; var httpClient = GetHttpClient(timeout: const Duration(seconds: 20)); var response = await httpClient.post(postUrl, headers: headers); if (response.isOk) { // Parse the response data and update your UI accordingly var data = response.body; var allJsonDataDynamicList = (data['results']); for (var item in allJsonDataDynamicList) { Map properties = item['properties'] as Map; properties['id'] = item['id']; listKantine.add(properties); } listKantine.removeWhere((element) => element['Gelöscht']['number'] == 1); listKantine.sort((a, b) { var dateA = DateTime.parse(a['Verkaufsdatum']['date']['start']); var dateB = DateTime.parse(b['Verkaufsdatum']['date']['start']); return dateB.compareTo(dateA); // Sort in descending order }); } else { // Handle error print('Error: ${response.statusCode}'); } isloadingData(false); httpClient.close(); update(); } Future addBeleg() async { var dateFormat = DateFormat('yyyy-MM-dd'); DateTime selectedDate = DateTime.now(); // Standardwert für das Datum await Get.defaultDialog( title: 'Beleg hinzufügen', content: Column( children: [ TextField( decoration: InputDecoration( labelText: 'Beleg Name', border: OutlineInputBorder(), ), onChanged: (value) { newBelegName(value); // Beleg Name speichern }, ), const SizedBox(height: 10), TextButton( onPressed: () async { DateTime? pickedDate = await showDatePicker( context: Get.context!, initialDate: selectedDate, firstDate: DateTime(2025), lastDate: DateTime(2100), ); if (pickedDate != null) { selectedDate = pickedDate; newBelegDate.value = dateFormat.format( selectedDate, ); // Datum speichern } }, child: Obx( () => Text( 'Datum auswählen: ${newBelegDate.value == '?' ? 'Kein Datum' : dateFormat.format(selectedDate)}', style: TextStyle( color: newBelegDate.value == '?' ? Colors.red : Colors.black, fontSize: 20, ), textAlign: TextAlign.center, ), ), ), TextField( decoration: InputDecoration( labelText: 'Beleg Betrag', border: OutlineInputBorder(), ), onChanged: (value) { newBelegBetrag(value); // Beleg Betrag speichern }, ), ], ), textConfirm: 'Hinzufügen', textCancel: 'Abbrechen', confirmTextColor: Colors.white, cancelTextColor: Colors.red, buttonColor: Colors.blue, onCancel: () { // Handle cancel action Get.back(); }, onConfirm: () { // Handle adding the receipt print('Beleg Name: ${newBelegName.value}'); print('Beleg Datum: ${newBelegDate.value}'); print('Beleg Betrag: ${newBelegBetrag.value}'); Get.back(); }, ); update(); _saveData(); } Map currentBodyItem( String currentDate, String preis, String belegName, String dbId, ) { return { 'parent': {'database_id': dbId}, 'properties': { 'Verkaufsdatum': { 'date': {'start': currentDate}, }, 'Gelöscht': {'number': 0}, 'Betrag': {'number': double.parse(preis)}, 'BelegName': { 'id': 'title', 'type': 'title', 'title': [ { 'type': 'text', 'text': {'content': belegName}, }, ], }, }, }; } Future _saveData() async { isloadingData(true); var dbId = 'd036c0bc06304126aedaa8c5ad92b406'; var baeraToken = box.read('TOKEN'); var saveUrl = 'https://api.notion.com/v1/pages/'; var headers = Map.from(box.read('HEADERS') ?? {}); headers['Authorization'] = 'Bearer $baeraToken'; var kantinData = currentBodyItem( newBelegDate.value, newBelegBetrag.value, newBelegName.value, dbId, ); var httpClient = GetHttpClient(timeout: const Duration(seconds: 20)); await httpClient .post(saveUrl, headers: headers, body: kantinData) .then((response) { if (response.isOk) { print('Beleg erfolgreich hinzugefügt'); _loadFromNotionKantine(); } else { print('Fehler beim Hinzufügen des Belegs: ${response.statusCode}'); } }) .catchError((error) { print('Fehler: $error'); }) .whenComplete(() { httpClient.close(); }); newBelegName.value = '?'; newBelegDate.value = '?'; newBelegBetrag.value = '?'; isloadingData(false); update(); } void deleteBeleg(stringItem, index) { isloadingData(true); print(stringItem); var baeraToken = box.read('TOKEN'); var delUrl = 'https://api.notion.com/v1/pages/$stringItem/'; var headers = Map.from(box.read('HEADERS') ?? {}); headers['Authorization'] = 'Bearer $baeraToken'; var httpClient = GetHttpClient(timeout: const Duration(seconds: 20)); var updateMap = { 'properties': { 'Gelöscht': {'number': 1}, }, }; httpClient .patch(delUrl, headers: headers, body: updateMap) .then((response) { if (response.isOk) { print('Beleg erfolgreich gelöscht'); } else { print('Fehler beim Löschen des Belegs: ${response.statusCode}'); } }) .catchError((error) { print('Fehler: $error'); }) .whenComplete(() { httpClient.close(); }); listKantine.removeAt(index); isloadingData(false); update(); } }