Files
Holzleitner-Lieferservice-App/test/delivery_recipient_test.dart
Dennis Nemec 5a9e16dc10 feat: Anschrift unter „Alle Kontaktinfos" anzeigen
Jede Kontaktquelle zeigt ihre Anschrift (inkl. Zusatz, Land nur im
Ausland), sofern das ERP eine pflegt. Die Anschrift zählt beim
Zusammenführen gleicher Quellen mit — gleicher Name an anderer Adresse
bleibt eine eigene Karte. API-Client neu generiert.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-25 16:26:01 +02:00

224 lines
6.2 KiB
Dart

import 'package:flutter_test/flutter_test.dart';
import 'package:hl_lieferservice/domain/entity/address.dart';
import 'package:hl_lieferservice/domain/entity/contact_source.dart';
import 'package:hl_lieferservice/domain/entity/customer.dart';
import 'package:hl_lieferservice/domain/entity/delivery.dart';
import 'package:hl_lieferservice/domain/entity/tour.dart';
import 'package:hl_lieferservice/domain/entity/tour_details.dart';
const _ordererAddress = Address(
street: 'Neukirchener Str.',
houseNumber: '73',
postalCode: '41470',
city: 'Neuss',
country: 'DE',
);
const _otherAddress = Address(
street: 'Marienstr.',
houseNumber: '3',
postalCode: '41564',
city: 'Kaarst',
country: 'DE',
);
ContactSource _source(ContactRole role, String name1, {String? name2}) =>
ContactSource(
id: 'src-${role.name}',
deliveryId: 'd1',
role: role,
anrede: 'Frau',
name1: name1,
name2: name2,
);
TourDetails _details({
required Address deliveryAddress,
List<ContactSource> sources = const [],
}) => TourDetails(
tour: Tour(
id: 't1',
accountId: 414,
date: DateTime(2026, 9, 25),
syncedAt: DateTime(2026),
),
deliveries: [
Delivery(
id: 'd1',
tourId: 't1',
customerId: 'c1',
contactPersonIds: const [],
deliveryAddressSnapshot: deliveryAddress,
erpBelegartId: 24,
erpBelegnummer: 'V-1',
state: DeliveryState.active,
sortOrder: 1,
prepaidAmount: 0,
paymentMethodId: 'm-cash',
items: const [],
),
],
customers: const {
'c1': Customer(
id: 'c1',
name: 'Kraus Heike',
erpCustomerId: 4711,
address: _ordererAddress,
),
},
contacts: const {},
articles: const {},
warehouses: const {},
notesByDeliveryId: const {},
creditsByDeliveryId: const {},
paymentsByDeliveryId: const {},
services: const [],
serviceValuesByDeliveryId: const {},
contactSourcesByDeliveryId: {'d1': sources},
contactChannelsBySourceId: const {},
);
void main() {
test('ohne eigene Lieferadresse ist der Besteller der Empfänger', () {
final details = _details(
deliveryAddress: _ordererAddress,
sources: [_source(ContactRole.header, 'Kraus Heike')],
);
final r = details.recipientOf(details.deliveries.single);
expect(r.name, 'Kraus Heike');
expect(r.differsFromOrderer, isFalse);
});
test('andere Person an anderer Adresse weicht ab', () {
final details = _details(
deliveryAddress: _otherAddress,
sources: [
_source(ContactRole.header, 'Kraus Heike'),
_source(ContactRole.delivery, 'Stülp', name2: 'Hans-Dieter'),
],
);
final r = details.recipientOf(details.deliveries.single);
// Name ohne Anrede, wie der Kundenname in den Listen.
expect(r.name, 'Stülp Hans-Dieter');
expect(r.address, _otherAddress);
expect(r.contact?.role, ContactRole.delivery);
expect(r.differsFromOrderer, isTrue);
});
test('andere Person an derselben Adresse weicht ab', () {
final details = _details(
deliveryAddress: _ordererAddress,
sources: [
_source(ContactRole.header, 'Kraus Heike'),
_source(ContactRole.delivery, 'Kraus Peter'),
],
);
expect(
details.recipientOf(details.deliveries.single).differsFromOrderer,
isTrue,
);
});
test('gleiche Person, nur andere Schreibweise, weicht nicht ab', () {
final details = _details(
deliveryAddress: const Address(
street: 'neukirchener str.',
houseNumber: '73',
postalCode: '41470',
city: 'NEUSS',
country: 'DE',
),
sources: [
_source(ContactRole.header, 'Kraus Heike'),
_source(ContactRole.delivery, 'Kraus heike'),
],
);
expect(
details.recipientOf(details.deliveries.single).differsFromOrderer,
isFalse,
);
});
test('abweichende Adresse ohne eigenen Namen: Besteller-Name, Hinweis an',
() {
final details = _details(deliveryAddress: _otherAddress);
final r = details.recipientOf(details.deliveries.single);
expect(r.name, 'Kraus Heike');
expect(r.differsFromOrderer, isTrue);
});
group('Adressanzeige', () {
const base = Address(
street: 'Am Sandberg',
houseNumber: '15',
postalCode: '41472',
city: 'Neuss',
country: 'Deutschland',
addition: 'Holzheim',
);
test('Deutschland erscheint nicht, Zusatz nur in der Listenzeile', () {
expect(base.oneLine, 'Am Sandberg 15, 41472 Neuss');
expect(base.oneLineWithAddition, 'Am Sandberg 15, 41472 Neuss (Holzheim)');
});
test('Ausland wird angehängt', () {
final belgien = base.copyWith(country: 'Belgien');
expect(belgien.foreignCountry, 'Belgien');
expect(belgien.oneLine, 'Am Sandberg 15, 41472 Neuss, Belgien');
});
test('Zusatz zählt nicht als abweichende Adresse', () {
final details = _details(
deliveryAddress: _ordererAddress.copyWith(addition: '3 Etage'),
sources: [_source(ContactRole.header, 'Kraus Heike')],
);
expect(
details.recipientOf(details.deliveries.single).differsFromOrderer,
isFalse,
);
});
});
test('Kontaktinfos: gleicher Name an anderer Anschrift bleibt getrennt', () {
final details = _details(
deliveryAddress: _ordererAddress,
sources: [
ContactSource(
id: 'h',
deliveryId: 'd1',
role: ContactRole.header,
name1: 'Kraus Heike',
address: _ordererAddress,
),
ContactSource(
id: 'm',
deliveryId: 'd1',
role: ContactRole.customerMaster,
name1: 'Kraus Heike',
address: _ordererAddress,
),
ContactSource(
id: 'b',
deliveryId: 'd1',
role: ContactRole.billing,
name1: 'Kraus Heike',
address: _otherAddress,
),
],
);
final merged = details.mergedContactSourcesOf(details.deliveries.single);
expect(merged, hasLength(2));
expect(merged.first.roles, [ContactRole.header, ContactRole.customerMaster]);
expect(merged.first.address, _ordererAddress);
expect(merged.last.address, _otherAddress);
});
}