parseEMVQR function
EMVDeCode
parseEMVQR(
- String payload
)
Implementation
EMVDeCode parseEMVQR(String payload) {
TLVModel? payloadFormatIndicator;
TLVModel? pointOfInitiationMethod;
Map<String, MerchantAccountInformationModel>? merchantAccountInformation = {};
TLVModel? merchantCategoryCode;
TLVModel? transactionCurrency;
TLVModel? transactionAmount;
TLVModel? tipOrConvenienceIndicator;
TLVModel? valueOfConvenienceFeeFixed;
TLVModel? valueOfConvenienceFeePercentage;
TLVModel? countryCode;
TLVModel? merchantName;
TLVModel? merchantCity;
TLVModel? postalCode;
AdditionalDataFieldTemplateModel? additionalDataFieldTemplate;
TLVModel? crc;
MerchantInformationLanguageTemplateModel? merchantInformationLanguageTemplate;
List<TLVModel> rfuForEMVCo = [];
Map<String, UnreservedTemplateModel>? unreservedTemplates = {};
ParserModel p = newParser(payload);
EmvqrModel emvqr = EmvqrModel();
while (next(p)) {
String? id = pid(p);
String? value = pValue(p);
switch (id) {
case ID.payloadFormatIndicator:
payloadFormatIndicator = setTLV(value, id);
break;
case ID.pointOfInitiationMethod:
pointOfInitiationMethod = setTLV(value, id);
break;
case ID.merchantCategoryCode:
merchantCategoryCode = setTLV(value, id);
break;
case ID.transactionCurrency:
transactionCurrency = setTLV(value, id);
break;
case ID.transactionAmount:
transactionAmount = setTLV(value, id);
break;
case ID.tipOrConvenienceIndicator:
tipOrConvenienceIndicator = setTLV(value, id);
break;
case ID.valueOfConvenienceFeeFixed:
valueOfConvenienceFeeFixed = setTLV(value, id);
break;
case ID.valueOfConvenienceFeePercentage:
valueOfConvenienceFeePercentage = setTLV(value, id);
break;
case ID.countryCode:
countryCode = setTLV(value, id);
break;
case ID.merchantName:
merchantName = setTLV(value, id);
break;
case ID.merchantCity:
merchantCity = setTLV(value, id);
break;
case ID.postalCode:
postalCode = setTLV(value, id);
break;
case ID.additionalDataFieldTemplate:
final additionalValue = _parseAdditionalDataFieldTemplate(value);
additionalDataFieldTemplate =
_setAdditionalDataFieldTemplate(additionalValue);
break;
case ID.crc:
crc = setTLV(value, id);
break;
case ID.merchantInformationLanguageTemplate:
final merchantInfoLanguageTemplateValue =
_parseMerchantInformationLanguageTemplate(value);
merchantInformationLanguageTemplate =
_setMerchantInformationLanguageTemplate(
merchantInfoLanguageTemplateValue);
break;
default:
Map<String, dynamic> betweenRes;
betweenRes = between(id, ID.merchantAccountInformationRangeStart,
ID.merchantAccountInformationRangeEnd);
if (betweenRes["within"]) {
MerchantAccountInformationValue merchantValue =
_parseMerchantAccountInformation(value);
MerchantAccountInformationModel mTLV =
_addMerchantAccountInformation(id, merchantValue);
merchantAccountInformation[id] = mTLV;
break;
}
betweenRes =
between(id, ID.rfuForEMVCoRangeStart, ID.rfuForEMVCoRangeEnd);
if (betweenRes["err"] != null) {
return EMVDeCode(
emvqr: null,
error: EmvError(
type: EmvErrorType.notEmvType, message: betweenRes["err"]));
}
if (betweenRes["within"]) {
TLVModel tlv = setTLV(value, id);
rfuForEMVCo.add(tlv);
break;
}
betweenRes = between(id, ID.unreservedTemplatesRangeStart,
ID.unreservedTemplatesRangeEnd);
if (betweenRes["err"] != null) {
return EMVDeCode(
emvqr: null,
error: EmvError(
type: EmvErrorType.notEmvType, message: betweenRes["err"]));
}
if (betweenRes["within"]) {
UnreservedTemplateValue unreservedTemplate =
_parseUnreservedTemplate(value);
UnreservedTemplateModel uTLV =
_addUnreservedTemplates(id, unreservedTemplate);
unreservedTemplates[id] = uTLV;
break;
}
}
}
emvqr = EmvqrModel(
payloadFormatIndicator: payloadFormatIndicator,
pointOfInitiationMethod: pointOfInitiationMethod,
merchantAccountInformation: merchantAccountInformation,
merchantCategoryCode: merchantCategoryCode,
transactionCurrency: transactionCurrency,
transactionAmount: transactionAmount,
tipOrConvenienceIndicator: tipOrConvenienceIndicator,
valueOfConvenienceFeeFixed: valueOfConvenienceFeeFixed,
valueOfConvenienceFeePercentage: valueOfConvenienceFeePercentage,
countryCode: countryCode,
merchantName: merchantName,
merchantCity: merchantCity,
postalCode: postalCode,
additionalDataFieldTemplate: additionalDataFieldTemplate,
crc: crc,
merchantInformationLanguageTemplate: merchantInformationLanguageTemplate,
rfuForEmvCo: rfuForEMVCo,
unreservedTemplates: unreservedTemplates);
return EMVDeCode(emvqr: emvqr, error: null);
}