price per item is printed

This commit is contained in:
atseirjo
2026-10-28 12:32:49 +01:00
parent c32adbad50
commit 77fbe16867
31 changed files with 656 additions and 55 deletions
+49
View File
@@ -7,6 +7,7 @@ import 'package:get/get.dart';
import 'package:ertl_filament_verwaltung/controller/bauteil_controller.dart';
import 'package:ertl_filament_verwaltung/controller/home_controller.dart';
import 'package:ertl_filament_verwaltung/helper/display_formats.dart';
import 'package:ertl_filament_verwaltung/models/bauteil_model.dart';
import 'package:ertl_filament_verwaltung/models/kauf_filament_model.dart';
import 'package:ertl_filament_verwaltung/pages/bauteil_view.dart';
@@ -143,6 +144,7 @@ void main() {
});
expect(legacy.filamente.single.verbrauchGramm, 0);
expect(legacy.fotoBytes, isNull);
expect(legacy.gesamtpreis, isNull);
},
);
@@ -151,6 +153,7 @@ void main() {
(tester) async {
await show(tester);
fill();
controller.gesamtpreisController.text = '12,50';
photos.result = png;
await controller.pickPhoto();
await controller.saveBauteil();
@@ -158,9 +161,19 @@ void main() {
expect(remaining('b'), 960);
final originalId = controller.bauteile.single.bauteilId;
final originalDate = controller.bauteile.single.erstelltAm;
expect(controller.bauteile.single.gesamtpreis, 12.5);
expect(
storage
.getModelList(BauteilController.storageKey)
.single['gesamtpreis'],
12.5,
);
expect(controller.gesamtpreisController.text, isEmpty);
await edit(tester, controller.bauteile.single);
expect(controller.foto.value, png);
expect(controller.gesamtpreisController.text, '12,5');
controller.gesamtpreisController.text = '18,90';
expect(controller.verfuegbarGramm('a'), 1000);
controller.verbrauchController('a').text = '20';
controller.verbrauchController('b').text = '80';
@@ -180,6 +193,10 @@ void main() {
controller.bauteile.every((item) => item.fotoBase64 != null),
isTrue,
);
expect(
controller.bauteile.every((item) => item.gesamtpreis == 18.9),
isTrue,
);
expect(remaining('a'), 960);
expect(remaining('b'), 840);
await controller.deleteBauteil(originalId);
@@ -190,6 +207,7 @@ void main() {
expect(remaining('a'), 980);
final reloaded = Get.put(BauteilController(), tag: 'reload');
expect(reloaded.bauteile.single.fotoBytes, png);
expect(reloaded.bauteile.single.gesamtpreis, 18.9);
expect(reloaded.bauteile.single.filamente.last.verbrauchGramm, 80);
// Purchases retain the original weight; the persisted ledger is deducted.
expect(
@@ -218,6 +236,32 @@ void main() {
},
);
testWidgets(
'Total price rejects invalid amounts, accepts zero and can be cleared',
(tester) async {
await show(tester);
fill();
for (final value in ['-1', 'NaN', 'Infinity', 'abc']) {
controller.gesamtpreisController.text = value;
await controller.saveBauteil();
expect(storage.getModelList(BauteilController.storageKey), isEmpty);
}
controller.gesamtpreisController.text = '0';
await controller.saveBauteil();
expect(controller.bauteile.single.gesamtpreis, 0);
await edit(tester, controller.bauteile.single);
controller.gesamtpreisController.clear();
await controller.saveBauteil();
expect(controller.bauteile.single.gesamtpreis, isNull);
expect(
storage
.getModelList(BauteilController.storageKey)
.single['gesamtpreis'],
isNull,
);
},
);
testWidgets(
'Editing credits only the edited booking; duplicates need new stock',
(tester) async {
@@ -310,6 +354,7 @@ void main() {
(tester) async {
await show(tester, narrow: true);
fill();
controller.gesamtpreisController.text = '12,50';
photos.result = png;
await controller.pickPhoto();
await controller.saveBauteil();
@@ -320,6 +365,10 @@ void main() {
scrollable: find.byType(Scrollable).first,
);
await tester.pumpAndSettle();
expect(
find.text('Gesamtpreis ${DisplayFormats.currency(12.5)}'),
findsOneWidget,
);
expect(
find.descendant(
of: find.byType(BauteilCard),