invoiceDeserialize function
Deserializes the tab-separated tabString back into an InvoiceDataModel.
Implementation
InvoiceDataModel invoiceDeserialize(String tabString, int documentType) {
final data = tabString.split('\t');
int i = 0;
String? next() => i < data.length ? data[i++] : null;
// Core fields
final invoiceId = next() ?? '';
final issueDate = next() ?? '';
final taxPointDate = _parseString(next());
final orderId = _parseString(next());
final deliveryNoteId = _parseString(next());
final localCurrency = next() ?? '';
final foreignCurrency = _parseString(next());
final currRate = _parseNumber(next());
final refCurrRate = _parseNumber(next());
// Supplier party
final spName = next() ?? '';
final spTaxId = _parseString(next());
final spVatId = _parseString(next());
final spRegisterId = _parseString(next());
final postalAddress = PostalAddress(
streetName: _parseString(next()),
buildingNumber: _parseString(next()),
cityName: _parseString(next()),
postalZone: _parseString(next()),
state: _parseString(next()),
country: _parseString(next()),
);
final contactName = _parseString(next());
final contactPhone = _parseString(next());
final contactEmail = _parseString(next());
final contact = (contactName != null ||
contactPhone != null ||
contactEmail != null)
? Contact(name: contactName, telephone: contactPhone, email: contactEmail)
: null;
final supplierParty = SupplierParty(
partyName: spName,
companyTaxId: spTaxId,
companyVatId: spVatId,
companyRegisterId: spRegisterId,
postalAddress: postalAddress,
contact: contact,
);
// Customer party
final customerParty = CustomerParty(
partyName: next() ?? '',
companyTaxId: _parseString(next()),
companyVatId: _parseString(next()),
companyRegisterId: _parseString(next()),
partyIdentification: _parseString(next()),
);
final numberOfLines = _parseNumber(next())?.toInt();
final invoiceDesc = _parseString(next());
// Single invoice line
final lineOrderId = _parseString(next());
final lineDeliveryId = _parseString(next());
final lineItemName = _parseString(next());
final lineItemEan = _parseString(next());
final linePeriodFrom = _parseString(next());
final linePeriodTo = _parseString(next());
final lineQuantity = _parseNumber(next());
final hasSingleLine = lineOrderId != null ||
lineDeliveryId != null ||
lineItemName != null ||
lineItemEan != null ||
linePeriodFrom != null ||
linePeriodTo != null ||
lineQuantity != null;
final singleLine = hasSingleLine
? SingleInvoiceLine(
orderLineId: lineOrderId,
deliveryNoteLineId: lineDeliveryId,
itemName: lineItemName,
itemEanCode: lineItemEan,
periodFromDate: linePeriodFrom,
periodToDate: linePeriodTo,
invoicedQuantity: lineQuantity,
)
: null;
// Tax category summaries
final taxCount = int.parse(next() ?? '0');
final taxSummaries = <TaxCategorySummary>[];
for (int t = 0; t < taxCount; t++) {
taxSummaries.add(TaxCategorySummary(
classifiedTaxCategory: double.parse(next() ?? '0'),
taxExclusiveAmount: double.parse(next() ?? '0'),
taxAmount: double.parse(next() ?? '0'),
alreadyClaimedTaxExclusiveAmount: _parseNumber(next()),
alreadyClaimedTaxAmount: _parseNumber(next()),
));
}
// Monetary summary
final monetarySummary = MonetarySummary(
payableRoundingAmount: _parseNumber(next()),
paidDepositsAmount: _parseNumber(next()),
);
final paymentMeans = _parseNumber(next())?.toInt();
return InvoiceDataModel(
documentType: documentType,
invoiceId: invoiceId,
issueDate: issueDate,
taxPointDate: taxPointDate,
orderId: orderId,
deliveryNoteId: deliveryNoteId,
localCurrencyCode: localCurrency,
foreignCurrencyCode: foreignCurrency,
currRate: currRate,
referenceCurrRate: refCurrRate,
supplierParty: supplierParty,
customerParty: customerParty,
numberOfInvoiceLines: numberOfLines,
invoiceDescription: invoiceDesc,
singleInvoiceLine: singleLine,
taxCategorySummaries: taxSummaries,
monetarySummary: monetarySummary,
paymentMeans: paymentMeans,
);
}