import 'package:flutter/cupertino.dart'; import 'package:hl_lieferservice/dto/contact_person.dart'; import 'package:hl_lieferservice/dto/delivery.dart'; import 'package:hl_lieferservice/dto/image.dart'; import 'package:hl_lieferservice/dto/note.dart'; import 'package:hl_lieferservice/dto/note_template.dart'; import 'package:hl_lieferservice/model/tour.dart'; import 'package:hl_lieferservice/util.dart'; import '../dto/payment.dart'; import 'article.dart'; import 'customer.dart'; class PaymentOptions { PaymentOptions({this.value = 0.0, this.selectedPaymentMethod = "none"}); double value; String selectedPaymentMethod; } class Note { Note({required this.content, required this.id}); final int id; String content; factory Note.fromDto(NoteDTO dto) { return Note(content: dto.note, id: int.parse(dto.id)); } } class NoteTemplate { NoteTemplate({ required this.title, required this.content, required this.language, }); String title; String content; String language; factory NoteTemplate.fromDTO(NoteTemplateDTO dto) { return NoteTemplate( title: dto.title, content: dto.note, language: dto.language, ); } } class ContactPerson { const ContactPerson({required this.name, required this.phoneNumber}); final String name; final String? phoneNumber; factory ContactPerson.fromDTO(ContactPersonDTO dto) { String phone; String phoneRegex = r'([0-9]+|[0-9]+(-|\/))[0-9]+'; if (dto.phoneNo == "" && dto.mobileNo != "") { phone = dto.mobileNo; } else if (dto.phoneNo != "" && dto.mobileNo == "") { phone = dto.phoneNo; } else { phone = dto.mobileNo; } return ContactPerson( name: dto.name, phoneNumber: concatenateRegexMatches(phone, phoneRegex), ); } } enum DeliveryState { canceled, finished, ongoing, onhold } class Discount { Discount({this.note, this.noteId, required this.article}); String? note; String? noteId; /// The article refers to the special discount article such as "GUTSCHRIFT10" /// for example. Article article; } class ImageNote { const ImageNote({ required this.name, required this.url, required this.objectId, }); final String name; final String url; final String objectId; factory ImageNote.fromDTO(ImageDTO dto) { return ImageNote(name: dto.name, url: dto.url, objectId: dto.oid); } factory ImageNote.make(String objectId, String name) { String url = "/v1/preview/1920_1080_100_png/$objectId"; return ImageNote(name: name, url: url, objectId: objectId); } } class DeliveryOption { DeliveryOption({ required this.numerical, required this.value, required this.display, required this.key, }); bool numerical; String value; String display; String key; factory DeliveryOption.fromDTO(DeliveryOptionDTO dto) { return DeliveryOption( numerical: dto.numerical, value: dto.value, display: dto.display, key: dto.key, ); } dynamic getValue() { if (!numerical) { if (value.isEmpty) { return false; } else { return bool.parse(value); } } else { if (value.isEmpty) { return 0; } else { return int.parse(value); } } } DeliveryOption copyWith({ bool? numerical, String? value, String? display, String? key, }) { return DeliveryOption( numerical: numerical ?? this.numerical, value: value ?? this.value, display: display ?? this.display, key: key ?? this.key, ); } } class Delivery { Delivery({ required this.customer, required this.id, required this.articles, required this.paymentOptions, required this.notes, required this.price, required this.filePaths, required this.currency, required this.images, required this.prepayment, required this.paymentAtDelivery, required this.payment, required this.options, this.state = DeliveryState.ongoing, this.contactPerson, required this.totalGrossValue, required this.totalNetValue, this.desiredTime, this.discount, this.specialAgreements, this.carId, }); final Customer customer; final String id; List
articles; final ContactPerson? contactPerson; final double price; final String currency; double totalGrossValue; double totalNetValue; String? desiredTime; List filePaths; Discount? discount; DeliveryState state; String? specialAgreements; PaymentOptions paymentOptions; int? carId; List notes; List images; double prepayment; double paymentAtDelivery; Payment payment; List options; Delivery copyWith({ Customer? customer, String? id, List
? articles, ContactPerson? contactPerson, double? price, String? currency, double? totalGrossValue, double? totalNetValue, String? desiredTime, List? filePaths, Discount? discount, DeliveryState? state, String? specialAgreements, PaymentOptions? paymentOptions, int? carId, List? notes, List? images, double? prepayment, double? paymentAtDelivery, Payment? payment, List? options, }) { return Delivery( customer: customer ?? this.customer, id: id ?? this.id, articles: articles ?? this.articles, contactPerson: contactPerson ?? this.contactPerson, price: price ?? this.price, currency: currency ?? this.currency, totalGrossValue: totalGrossValue ?? this.totalGrossValue, totalNetValue: totalNetValue ?? this.totalNetValue, desiredTime: desiredTime ?? this.desiredTime, filePaths: filePaths ?? this.filePaths, discount: discount ?? this.discount, state: state ?? this.state, specialAgreements: specialAgreements ?? this.specialAgreements, paymentOptions: paymentOptions ?? this.paymentOptions, carId: carId ?? this.carId, notes: notes ?? this.notes, images: images ?? this.images, prepayment: prepayment ?? this.prepayment, paymentAtDelivery: paymentAtDelivery ?? this.paymentAtDelivery, payment: payment ?? this.payment, options: options ?? this.options, ); } Article? findArticleWithNoteId(String noteId) { Article? filteredArticle = articles.where((article) => article.removeNoteId == noteId).firstOrNull; if (filteredArticle == null && discount?.article != null) { filteredArticle = discount?.article; } return filteredArticle; } double getGrossPrice() { return articles.fold(0, (acc, article) { double price = article.getGrossPriceScanned(); if (!article.scannable) { price = article.getGrossPrice(); } return acc + price; }); } double getOpenPrice() { return getGrossPrice() - prepayment; } List
getDeliveredArticles() { return articles .where( (article) { debugPrint("Scannable: ${article.scannable}"); return article.scannedAmount > 0 || !article.scannable; }, ) .toList(); } bool containsArticle(String articleNr) { return articles.any((article) => article.articleNumber == articleNr); } Article getArticle(String nr) { return articles.firstWhere((article) => article.articleNumber == nr); } List
getScannableArticles() { return articles.where((article) => article.scannable).toList(); } bool allArticlesScanned() { return getScannableArticles().every( (article) => article.amount == article.scannedAmount + article.scannedRemovedAmount, ); } void scanArticle(String nr) { if (!containsArticle(nr)) { return; } Article article = getArticle(nr); if (article.scannedAmount < article.amount) { article.scannedAmount += 1; } } factory Delivery.fromDTO(DeliveryDTO dto) { double getPrice() { return double.parse(dto.totalPrice == "" ? "0" : dto.totalPrice); } return Delivery( customer: Customer.fromDTO(dto.customer), id: dto.internalReceiptNo, articles: dto.articles.map(Article.fromDTO).toList(), paymentOptions: PaymentOptions(value: getPrice()), notes: dto.notes.map(Note.fromDto).toList(), price: getPrice(), payment: Payment.fromDTO(dto.payment), specialAgreements: dto.specialAggreements, desiredTime: dto.desiredTime, prepayment: double.tryParse(dto.prepayment) ?? 0.0, discount: dto.discount == null ? null : Discount( article: Article.fromDTO(dto.discount!.article), note: dto.discount!.note, noteId: dto.discount!.noteId, ), paymentAtDelivery: double.tryParse(dto.paymentAtDelivery) ?? 0.0, images: dto.images.map(ImageNote.fromDTO).toList(), carId: int.tryParse(dto.carId), totalGrossValue: double.parse( dto.totalGrossValue == "" ? "0" : dto.totalGrossValue, ), totalNetValue: double.parse( dto.totalNetValue == "" ? "0" : dto.totalNetValue, ), filePaths: [], options: dto.options.map((option) => DeliveryOption.fromDTO(option)).toList(), state: dto.state != "" ? getDeliveryStateFromString(dto.state) : DeliveryState.ongoing, contactPerson: ContactPerson.fromDTO(dto.contactPerson), currency: dto.currency ?? "EUR", ); } }