capabilities static method
Reads a capabilities map.
Absent or unreadable gives an empty, unavailable terminal rather than a throw: a till that cannot read the profile must offer nothing, not everything.
Implementation
static EcrTerminalCapabilities capabilities(Object? payload) {
final Map<Object?, Object?>? map = _asMap(payload);
if (map == null) return const EcrTerminalCapabilities();
final Object? mode = map[EcrCapabilityKeys.ecrMode];
final int? ecrMode = mode is int ? mode : int.tryParse('${mode ?? ''}');
final Object? entries = map[EcrCapabilityKeys.permittedTransactions];
final List<EcrPermittedTransaction> permitted = <EcrPermittedTransaction>[];
if (entries is List) {
for (final Object? entry in entries) {
final Map<Object?, Object?>? one = _asMap(entry);
if (one == null) continue;
final EcrTransactionType? type = _typeOf(
_string(one, EcrCapabilityKeys.messageType),
);
// An operation this version has never heard of is dropped, not
// guessed at. A till cannot offer a button it has no code for, and
// inventing one would be worse than leaving it out.
if (type == null) continue;
permitted.add(
EcrPermittedTransaction(
type: type,
minAmount: _string(one, EcrCapabilityKeys.minAmount),
maxAmount: _string(one, EcrCapabilityKeys.maxAmount),
),
);
}
}
return EcrTerminalCapabilities(
available: _bool(map, EcrCapabilityKeys.available),
reason: _string(map, EcrCapabilityKeys.reason),
transport: _transportOf(ecrMode),
ecrMode: ecrMode,
terminalName: _string(map, EcrCapabilityKeys.terminalName),
currencyCode: _string(map, EcrCapabilityKeys.currencyCode),
minorUnitDigits: _int(map, EcrCapabilityKeys.minorUnitDigits),
eReceipt: _bool(map, EcrCapabilityKeys.eReceipt),
physicalReceipt: _bool(map, EcrCapabilityKeys.physicalReceipt),
permitted: permitted,
);
}