Files
ertl_filament_verwaltung/lib/controller/home_controller.dart
T

166 lines
3.9 KiB
Dart

import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:uuid/uuid.dart';
import '../models/kauf_filament_model.dart';
import '../services/get_storage_services.dart';
class HomeController extends GetxController {
static const storageKey = 'kauf_filamente';
final storage = Get.find<GetStorageService>();
final uuid = const Uuid();
final filamente = <KaufFilamentModel>[].obs;
final formKey = GlobalKey<FormState>();
final haendlerController = TextEditingController();
final farbeController = TextEditingController();
final preisController = TextEditingController();
final markeController = TextEditingController();
final gewichtController = TextEditingController();
final kaufdatum = DateTime.now().obs;
final material = 'PLA'.obs;
final editingId = RxnString();
final materialien = [
'PLA',
'PLA+',
'PLA light',
'PLA-CF',
'PLA+',
'PETG',
'PETG-CF',
'ABS',
'ASA',
'TPU',
'Sonstiges',
];
@override
void onInit() {
super.onInit();
loadFilamente();
}
void loadFilamente() {
final data = storage.getModelList(storageKey);
filamente.assignAll(
data.map(KaufFilamentModel.fromJson),
);
sortFilamente();
}
void sortFilamente() {
filamente.sort(
(a, b) => b.kaufdatum.compareTo(a.kaufdatum),
);
}
Future<void> persist() async {
await storage.saveModelList(
storageKey,
filamente.map((f) => f.toJson()).toList(),
);
}
Future<void> saveFilament() async {
if (!formKey.currentState!.validate()) return;
final preis = double.tryParse(
preisController.text.trim().replaceAll(',', '.'),
);
if (preis == null || !preis.isFinite || preis < 0) {
Get.snackbar('Ungültiger Preis', 'Bitte Preis überprüfen.');
return;
}
final filament = KaufFilamentModel(
filamentId: editingId.value ?? uuid.v4(),
marke: markeController.text.trim(),
kaufdatum: kaufdatum.value,
haendler: haendlerController.text.trim(),
material: material.value,
preis: preis,
farbe: farbeController.text.trim(),
gewicht: gewichtController.text.trim().isEmpty
? '1kg'
: gewichtController.text.trim(),
);
if (editingId.value == null) {
filamente.add(filament);
} else {
final index = filamente.indexWhere(
(f) => f.filamentId == editingId.value,
);
if (index < 0) {
Get.snackbar('Fehler', 'Datensatz nicht gefunden.');
return;
}
filamente[index] = filament;
}
sortFilamente();
await persist();
resetForm();
}
void editFilament(KaufFilamentModel filament) {
editingId.value = filament.filamentId;
kaufdatum.value = filament.kaufdatum;
markeController.text = filament.marke;
haendlerController.text = filament.haendler;
material.value = filament.material;
preisController.text = filament.preis.toStringAsFixed(2);
farbeController.text = filament.farbe;
gewichtController.text = filament.gewicht;
}
Future<void> duplicateFilament(
KaufFilamentModel filament,
) async {
filamente.add(
filament.copyWith(filamentId: uuid.v4()),
);
sortFilamente();
await persist();
}
Future<void> deleteFilament(String filamentId) async {
filamente.removeWhere((f) => f.filamentId == filamentId);
if (editingId.value == filamentId) resetForm();
await persist();
}
void resetForm() {
editingId.value = null;
haendlerController.clear();
markeController.clear();
farbeController.clear();
preisController.clear();
kaufdatum.value = DateTime.now();
material.value = 'PLA';
gewichtController.clear();
formKey.currentState?.reset();
}
@override
void onClose() {
haendlerController.dispose();
markeController.dispose();
farbeController.dispose();
preisController.dispose();
gewichtController.dispose();
super.onClose();
}
}