6#include "fcbextractor_p.h"
8#include "variantvisitor_p.h"
10#include <KItinerary/Organization>
11#include <KItinerary/Person>
12#include <KItinerary/ProgramMembership>
13#include <KItinerary/Ticket>
22 return VariantVisitor([](
auto &&doc) {
23 auto n = doc.tariffs.isEmpty() ?
QString() : doc.tariffs.at(0).tariffDesc;
28 if (!doc.passDescription.isEmpty()) {
29 return doc.passDescription;
34 }).visit<Fcb::v13::ReservationData, Fcb::v13::OpenTicketData, Fcb::v13::PassData, Fcb::v3::ReservationData, Fcb::v3::OpenTicketData, Fcb::v3::PassData>(doc);
37QString FcbExtractor::ticketName(
const Fcb::UicRailTicketData &fcb)
39 return std::visit([](
auto &&fcb) {
40 for (
const auto &doc : fcb.transportDocument) {
41 if (
auto n = ticketNameForDocument(doc.ticket); !n.isEmpty()) {
50[[nodiscard]]
static QString fcbReference(
const T &data)
52 if (!data.referenceIA5.isEmpty()) {
55 if (data.referenceNumIsSet()) {
61QString FcbExtractor::pnr(
const Fcb::UicRailTicketData &fcb)
63 return std::visit([](
auto &&fcb) {
64 if (!fcb.issuingDetail.issuerPNR.isEmpty()) {
68 for (
const auto &doc : fcb.transportDocument) {
69 auto pnr = VariantVisitor([](
auto &&doc) {
70 return fcbReference(doc);
71 }).
template visit<Fcb::v13::ReservationData, Fcb::v13::OpenTicketData, Fcb::v13::PassData, Fcb::v3::ReservationData, Fcb::v3::OpenTicketData, Fcb::v3::PassData>(doc.ticket);
81QString FcbExtractor::seatingType(
const Fcb::UicRailTicketData &fcb)
83 return std::visit([](
auto &&fcb) {
84 for (
const auto &doc : fcb.transportDocument) {
85 auto s = VariantVisitor([](
auto &&doc) {
87 }).
template visit<Fcb::v13::ReservationData, Fcb::v13::OpenTicketData, Fcb::v13::PassData, Fcb::v3::ReservationData, Fcb::v3::OpenTicketData, Fcb::v3::PassData>(doc.ticket);
96[[nodiscard]]
static QString formatIssuerId(
int num)
100 id.insert(0,
QString(4 -
id.size(),
'0'_L1));
105QString FcbExtractor::issuerId(
const Fcb::UicRailTicketData &fcb)
107 return std::visit([](
auto &&fcb) {
108 if (fcb.issuingDetail.issuerNumIsSet()) {
109 return formatIssuerId(fcb.issuingDetail.issuerNum);
111 if (fcb.issuingDetail.issuerIA5IsSet()) {
114 if (fcb.issuingDetail.securityProviderNumIsSet()) {
115 return formatIssuerId(fcb.issuingDetail.securityProviderNum);
117 if (fcb.issuingDetail.securityProviderIA5IsSet()) {
124Organization FcbExtractor::issuer(
const Fcb::UicRailTicketData &fcb)
127 if (
auto id = issuerId(fcb); !
id.isEmpty()) {
128 issuer.setIdentifier(
"uic:"_L1 +
id);
130 std::visit([&issuer](
auto &&fcb) {
131 if (fcb.issuingDetail.issuerNameIsSet()) {
132 issuer.setName(fcb.issuingDetail.issuerName);
138Person FcbExtractor::person(
const Fcb::UicRailTicketData &fcb)
140 return std::visit([](
auto &&fcb) {
142 if (!fcb.travelerDetailIsSet() || fcb.travelerDetail.traveler.size() != 1) {
145 const auto traveler = fcb.travelerDetail.traveler.at(0);
146 if (traveler.firstNameIsSet() || traveler.secondNameIsSet()) {
147 p.setGivenName(
QString(traveler.firstName +
' '_L1 + traveler.secondName).
trimmed());
149 p.setFamilyName(traveler.lastName);
154QDateTime FcbExtractor::validFrom(
const Fcb::UicRailTicketData &fcb)
156 return std::visit([](
auto &&fcb) {
157 for (
const auto &doc : fcb.transportDocument) {
158 auto dt = VariantVisitor([&fcb](
auto &&doc) {
159 return doc.departureDateTime(fcb.issuingDetail.issueingDateTime());
160 }).
template visit<Fcb::v13::ReservationData, Fcb::v3::ReservationData>(doc.ticket);
164 dt = VariantVisitor([&fcb](
auto &&doc) {
165 return doc.validFrom(fcb.issuingDetail.issueingDateTime());
166 }).
template visit<Fcb::v13::OpenTicketData, Fcb::v13::PassData, Fcb::v3::OpenTicketData, Fcb::v3::PassData>(doc.ticket);
175QDateTime FcbExtractor::validUntil(
const Fcb::UicRailTicketData &fcb)
177 return std::visit([](
auto &&fcb) {
178 for (
const auto &doc : fcb.transportDocument) {
179 auto dt = VariantVisitor([&fcb](
auto &&doc) {
180 return doc.arrivalDateTime(fcb.issuingDetail.issueingDateTime());
181 }).
template visit<Fcb::v13::ReservationData, Fcb::v3::ReservationData>(doc.ticket);
185 dt = VariantVisitor([&fcb](
auto &&doc) {
186 return doc.validUntil(fcb.issuingDetail.issueingDateTime());
187 }).
template visit<Fcb::v13::OpenTicketData, Fcb::v13::PassData, Fcb::v3::OpenTicketData, Fcb::v3::PassData>(doc.ticket);
196FcbExtractor::PriceData FcbExtractor::price(
const Fcb::UicRailTicketData &fcb)
198 return std::visit([](
auto &&fcb) {
201 const auto fract = std::pow(10, fcb.issuingDetail.currencyFract);
202 for (
const auto &doc : fcb.transportDocument) {
203 p.price = VariantVisitor([fract](
auto &&doc) {
204 return doc.priceIsSet() ? doc.price / fract : NAN;
205 }).
template visit<Fcb::v13::ReservationData, Fcb::v3::ReservationData, Fcb::v13::OpenTicketData, Fcb::v13::PassData, Fcb::v3::OpenTicketData, Fcb::v13::PassData, Fcb::v3::PassData>(doc.ticket);
206 if (!std::isnan(p.price)) {
216 VariantVisitor([&fcb, &result, ticket](
auto &&ccd) {
218 if (ccd.cardIdNumIsSet()) {
223 pm.setProgramName(ccd.cardTypeDescr);
224 pm.setMember(FcbExtractor::person(fcb));
225 pm.setValidFrom(ccd.validFrom().startOfDay());
226 pm.setValidUntil(ccd.validUntil().startOfDay());
229 }).visit<Fcb::v13::CustomerCardData, Fcb::v3::CustomerCardData>(ccd);
234 VariantVisitor([&station](
auto &&data) {
235 FcbExtractor::readDepartureStation(data, station);
236 }).visit<Fcb::v13::ReservationData, Fcb::v13::OpenTicketData, Fcb::v3::ReservationData, Fcb::v3::OpenTicketData>(doc);
241 VariantVisitor([&station](
auto &&data) {
242 FcbExtractor::readArrivalStation(data, station);
243 }).visit<Fcb::v13::ReservationData, Fcb::v13::OpenTicketData, Fcb::v3::ReservationData, Fcb::v3::OpenTicketData>(doc);
253 addr.setAddressCountry(u
"DE"_s);
254 station.setAddress(addr);
255 station.setIdentifier(
QString());
static QString classCodeToString(Fcb::v13::TravelClassType classCode)
Convert a class code enum value to a string for human representation.
Rail pass document (RPT).
Rail pass document (RPT).
QString identifier
Identifier.
A frequent traveler, bonus points or discount scheme program membership.
QString ticketToken
The raw ticket token string.
Classes for reservation/travel data models, data extraction and data augmentation.
void push_back(parameter_type value)
QString fromLatin1(QByteArrayView str)
QString fromUtf8(QByteArrayView str)
QString number(double n, char format, int precision)
bool startsWith(QChar c, Qt::CaseSensitivity cs) const const
QString trimmed() const const