parseEMVQR function

EMVDeCode parseEMVQR(
  1. 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);
}