2025-05-05 08:56:31 +02:00

230 lines
7.0 KiB
Dart

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 = <dynamic>[].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<void> _loadFromNotionKantine() async {
isloadingData(true);
var postUrl = box.read('BASEURL');
var baeraToken = box.read('TOKEN'); // baeraToken aus GetStorage lesen
var headers = Map<String, String>.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<String, dynamic> properties =
item['properties'] as Map<String, dynamic>;
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<void> 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: () {
Get.back();
},
onConfirm: () async {
// Handle adding the receipt
// Handle cancel action
await _loadFromNotionKantine();
print('Beleg Name: ${newBelegName.value}');
print('Beleg Datum: ${newBelegDate.value}');
print('Beleg Betrag: ${newBelegBetrag.value}');
Get.back();
_saveData();
},
);
update();
}
Map<String, dynamic> 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<void> _saveData() async {
isloadingData(true);
var dbId = 'd036c0bc06304126aedaa8c5ad92b406';
var baeraToken = box.read('TOKEN');
var saveUrl = 'https://api.notion.com/v1/pages/';
var headers = Map<String, String>.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<String, String>.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();
}
}