invoiceDeserialize function

InvoiceDataModel invoiceDeserialize(
  1. String tabString,
  2. int documentType
)

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,
  );
}