paySerialize function

String paySerialize(
  1. PayDataModel data
)

Transforms a PayDataModel into the tab-separated intermediate format.

Implementation

String paySerialize(PayDataModel data) {
  final s = <String?>[];

  s.add(_sanitize(data.invoiceId?.toString()));
  s.add(data.payments.length.toString());

  for (final p in data.payments) {
    s.add(p.type.toString());
    s.add(_formatNumber(p.amount));
    s.add(_sanitize(p.currencyCode));
    s.add(_sanitize(p.paymentDueDate));
    s.add(_sanitize(p.variableSymbol));
    s.add(_sanitize(p.constantSymbol));
    s.add(_sanitize(p.specificSymbol));
    s.add(_sanitize(p.originatorsReferenceInformation));
    s.add(_sanitize(p.paymentNote));

    // Bank accounts
    s.add(p.bankAccounts.length.toString());
    for (final ba in p.bankAccounts) {
      s.add(_sanitize(ba.iban));
      s.add(_sanitize(ba.bic));
    }

    // Standing order extension
    if (p is StandingOrder) {
      s.add('1');
      s.add(p.day?.toString());
      s.add(p.month?.toString());
      s.add(_sanitize(p.periodicity));
      s.add(_sanitize(p.lastDate));
    } else {
      s.add('0');
    }

    // Direct debit extension
    if (p is DirectDebit) {
      s.add('1');
      s.add(p.directDebitScheme?.toString());
      s.add(p.directDebitType?.toString());
      s.add(_sanitize(p.ddVariableSymbol));
      s.add(_sanitize(p.ddSpecificSymbol));
      s.add(_sanitize(p.ddOriginatorsReferenceInformation));
      s.add(_sanitize(p.mandateId));
      s.add(_sanitize(p.creditorId));
      s.add(_sanitize(p.contractId));
      s.add(_formatNumber(p.maxAmount));
      s.add(_sanitize(p.validTillDate));
    } else {
      s.add('0');
    }
  }

  // Beneficiary block - one entry per payment, appended after all payments
  for (final p in data.payments) {
    s.add(_sanitize(p.beneficiary.name));
    s.add(_sanitize(p.beneficiary.street));
    s.add(_sanitize(p.beneficiary.city));
  }

  return s.map((e) => e ?? '').join('\t');
}