bcbpEncode function

String bcbpEncode(
  1. BarCodedBoardingPass bcbp
)

Encodes a BarCodedBoardingPass object into a BCBP string.

This function converts a structured boarding pass object into a string format according to IATA BCBP specifications.

bcbp The BarCodedBoardingPass object to encode.

Returns a string containing the encoded boarding pass data.

Implementation

String bcbpEncode(BarCodedBoardingPass bcbp) {
  if (bcbp.meta != null) {
    bcbp.meta!.formatCode ??= "M";
    bcbp.meta!.numberOfLegs ??= bcbp.data?.legs?.length ?? 0;
    // bcbp.meta!.electronicTicketIndicator ??= "E";
    bcbp.meta!.versionNumberIndicator ??= ">";
    bcbp.meta!.versionNumber ??= 6;
    // bcbp.meta!.securityDataIndicator ??= "^";
  } else {
    bcbp.meta = BoardingPassMetaData(
      formatCode: "M",
      numberOfLegs: bcbp.data?.legs?.length ?? 0,
      electronicTicketIndicator: "E",
      versionNumberIndicator: ">",
      versionNumber: 6,
    );
  }

  final barcodeData = SectionBuilder();
  if (bcbp.data?.legs == null || bcbp.data!.legs!.isEmpty) {
    return "";
  }

  barcodeData.addField(bcbp.meta?.formatCode, FieldLengths.FORMAT_CODE);
  barcodeData.addField(bcbp.meta?.numberOfLegs, FieldLengths.NUMBER_OF_LEGS);
  barcodeData.addField(bcbp.data?.passengerName, FieldLengths.PASSENGER_NAME);
  barcodeData.addField(
    bcbp.meta?.electronicTicketIndicator,
    FieldLengths.ELECTRONIC_TICKET_INDICATOR,
  );

  bool addedUniqueFields = false;

  for (var leg in bcbp.data!.legs!) {
    barcodeData.addField(
      leg.operatingCarrierPNR,
      FieldLengths.OPERATING_CARRIER_PNR,
    );
    barcodeData.addField(leg.departureAirport, FieldLengths.DEPARTURE_AIRPORT);
    barcodeData.addField(leg.arrivalAirport, FieldLengths.ARRIVAL_AIRPORT);
    barcodeData.addField(
      leg.operatingCarrierDesignator,
      FieldLengths.OPERATING_CARRIER_DESIGNATOR,
    );
    barcodeData.addField(leg.flightNumber, FieldLengths.FLIGHT_NUMBER);
    barcodeData.addField(leg.flightDate, FieldLengths.FLIGHT_DATE);
    barcodeData.addField(leg.compartmentCode, FieldLengths.COMPARTMENT_CODE);
    barcodeData.addField(leg.seatNumber, FieldLengths.SEAT_NUMBER);
    barcodeData.addField(
      leg.checkInSequenceNumber,
      FieldLengths.CHECK_IN_SEQUENCE_NUMBER,
    );
    barcodeData.addField(leg.passengerStatus, FieldLengths.PASSENGER_STATUS);

    final conditionalSection = SectionBuilder();

    if (!addedUniqueFields) {
      conditionalSection.addField(
        bcbp.meta?.versionNumberIndicator,
        FieldLengths.VERSION_NUMBER_INDICATOR,
      );
      conditionalSection.addField(
        bcbp.meta?.versionNumber,
        FieldLengths.VERSION_NUMBER,
      );

      final sectionA = SectionBuilder();
      sectionA.addField(
        bcbp.data?.passengerDescription,
        FieldLengths.PASSENGER_DESCRIPTION,
      );
      sectionA.addField(
        bcbp.data?.checkInSource,
        FieldLengths.CHECK_IN_SOURCE,
      );
      sectionA.addField(
        bcbp.data?.boardingPassIssuanceSource,
        FieldLengths.BOARDING_PASS_ISSUANCE_SOURCE,
      );
      sectionA.addField(
        bcbp.data?.issuanceDate,
        FieldLengths.ISSUANCE_DATE,
        true,
      );
      sectionA.addField(
        bcbp.data?.documentType,
        FieldLengths.DOCUMENT_TYPE,
      );
      sectionA.addField(
        bcbp.data?.boardingPassIssuerDesignator,
        FieldLengths.BOARDING_PASS_ISSUER_DESIGNATOR,
      );
      sectionA.addField(
        bcbp.data?.baggageTagNumber,
        FieldLengths.BAGGAGE_TAG_NUMBER,
      );
      sectionA.addField(
        bcbp.data?.firstBaggageTagNumber,
        FieldLengths.FIRST_BAGGAGE_TAG_NUMBER,
      );
      sectionA.addField(
        bcbp.data?.secondBaggageTagNumber,
        FieldLengths.SECOND_BAGGAGE_TAG_NUMBER,
      );

      conditionalSection.addSection(sectionA);
      addedUniqueFields = true;
    }

    final sectionB = SectionBuilder();
    sectionB.addField(
      leg.airlineNumericCode,
      FieldLengths.AIRLINE_NUMERIC_CODE,
    );
    sectionB.addField(leg.serialNumber, FieldLengths.SERIAL_NUMBER);
    sectionB.addField(leg.selecteeIndicator, FieldLengths.SELECTEE_INDICATOR);
    sectionB.addField(
      leg.internationalDocumentationVerification,
      FieldLengths.INTERNATIONAL_DOCUMENTATION_VERIFICATION,
    );
    sectionB.addField(
      leg.marketingCarrierDesignator,
      FieldLengths.MARKETING_CARRIER_DESIGNATOR,
    );
    sectionB.addField(
      leg.frequentFlyerAirlineDesignator,
      FieldLengths.FREQUENT_FLYER_AIRLINE_DESIGNATOR,
    );
    sectionB.addField(
      leg.frequentFlyerNumber,
      FieldLengths.FREQUENT_FLYER_NUMBER,
    );
    sectionB.addField(leg.idIndicator, FieldLengths.ID_INDICATOR);
    sectionB.addField(
      leg.freeBaggageAllowance,
      FieldLengths.FREE_BAGGAGE_ALLOWANCE,
    );
    sectionB.addField(leg.fastTrack, FieldLengths.FAST_TRACK);
    conditionalSection.addSection(sectionB);
    conditionalSection.addField(leg.airlineInfo);
    barcodeData.addSection(conditionalSection);
  }

  if (bcbp.data?.securityData != null) {
    barcodeData.addField(
      bcbp.meta?.securityDataIndicator,
      FieldLengths.SECURITY_DATA_INDICATOR,
    );
    barcodeData.addField(
      bcbp.data?.securityDataType ?? "1",
      FieldLengths.SECURITY_DATA_TYPE,
    );
    final securitySection = SectionBuilder();
    securitySection.addField(
      bcbp.data?.securityData,
      FieldLengths.SECURITY_DATA,
    );
    barcodeData.addSection(securitySection);
  }

  return barcodeData.toString();
}