File indexing completed on 2025-02-02 05:02:35

0001 /*
0002     SPDX-FileCopyrightText: 2018 Volker Krause <vkrause@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "tickettokenmodel.h"
0008 #include "reservationmanager.h"
0009 
0010 #include <KItinerary/Person>
0011 #include <KItinerary/Reservation>
0012 #include <KItinerary/Ticket>
0013 
0014 #include <KLocalizedString>
0015 
0016 #include <KUser>
0017 
0018 using namespace KItinerary;
0019 
0020 TicketTokenModel::TicketTokenModel(QObject* parent)
0021     : QAbstractListModel(parent)
0022 {
0023 }
0024 
0025 TicketTokenModel::~TicketTokenModel() = default;
0026 
0027 QObject * TicketTokenModel::reservationManager() const
0028 {
0029     return m_resMgr;
0030 }
0031 
0032 void TicketTokenModel::setReservationManager(QObject *mgr)
0033 {
0034     m_resMgr = qobject_cast<ReservationManager*>(mgr);
0035     setReservationIds(m_pendingResIds);
0036 }
0037 
0038 QStringList TicketTokenModel::reservationIds() const
0039 {
0040     return m_resIds;
0041 }
0042 
0043 void TicketTokenModel::setReservationIds(const QStringList& resIds)
0044 {
0045     if (!m_resMgr) {
0046         m_pendingResIds = resIds;
0047         return;
0048     } else {
0049         m_pendingResIds.clear();
0050     }
0051 
0052     beginResetModel();
0053     m_personNames.clear();
0054     m_personNames.reserve(m_resIds.size());
0055     QHash<QString, int> m_personIdx;
0056 
0057     for (const auto &resId : resIds) {
0058         const auto v = m_resMgr->reservation(resId);
0059         if (!JsonLd::canConvert<Reservation>(v))
0060             continue;
0061         const auto res = JsonLd::convert<Reservation>(v);
0062         const auto ticket = res.reservedTicket().value<Ticket>();
0063         if (ticket.ticketToken().isEmpty() && res.pkpassPassTypeIdentifier().isEmpty()) {
0064             continue;
0065         }
0066 
0067         m_resIds.push_back(resId);
0068         const auto person = JsonLd::convert<Reservation>(res).underName().value<Person>();
0069         if (!person.name().isEmpty()) {
0070             m_personNames.push_back(person.name());
0071         } else {
0072             const auto idx = ++m_personIdx[res.reservedTicket().value<Ticket>().name()];
0073             if (JsonLd::isA<EventReservation>(v)) {
0074                 m_personNames.push_back(i18n("Attendee %1", idx));
0075             } else {
0076                 m_personNames.push_back(i18n("Traveler %1", idx));
0077             }
0078         }
0079     }
0080     endResetModel();
0081     Q_EMIT initialIndexChanged();
0082 }
0083 
0084 QVariant TicketTokenModel::reservationAt(int row) const
0085 {
0086     if (!m_resMgr || row >= m_resIds.size() || row < 0)
0087         return {};
0088     return m_resMgr->reservation(m_resIds.at(row));
0089 }
0090 
0091 QString TicketTokenModel::reservationIdAt(int row) const
0092 {
0093     if (!m_resMgr || row >= m_resIds.size() || row < 0)
0094         return {};
0095     return m_resIds.at(row);
0096 }
0097 
0098 int TicketTokenModel::rowCount(const QModelIndex& parent) const
0099 {
0100     if (parent.isValid())
0101         return 0;
0102     return m_resIds.size();
0103 }
0104 
0105 QVariant TicketTokenModel::data(const QModelIndex& index, int role) const
0106 {
0107     if (!index.isValid() || !m_resMgr || index.row() >= m_resIds.size())
0108         return {};
0109 
0110     const auto res = m_resMgr->reservation(m_resIds.at(index.row()));
0111     switch (role) {
0112         case Qt::DisplayRole:
0113         {
0114             const auto ticket = JsonLd::convert<Reservation>(res).reservedTicket().value<Ticket>();
0115             if (!ticket.name().isEmpty()) {
0116                 return i18n("%1 (%2)", m_personNames.at(index.row()), ticket.name());
0117             }
0118             return m_personNames.at(index.row());
0119         }
0120         case ReservationRole:
0121             return res;
0122     }
0123 
0124     return {};
0125 }
0126 
0127 QHash<int, QByteArray> TicketTokenModel::roleNames() const
0128 {
0129     auto names = QAbstractListModel::roleNames();
0130     names.insert(ReservationRole, "reservation");
0131     return names;
0132 }
0133 
0134 int TicketTokenModel::initialIndex() const
0135 {
0136     auto fullName = KUser().property(KUser::FullName).toString();
0137     auto it = std::find_if(m_personNames.begin(), m_personNames.end(), [fullName](const auto &name) {
0138         return !name.compare(fullName, Qt::CaseInsensitive);
0139     });
0140     if (it == m_personNames.end()) {
0141         return 0;
0142     }
0143     return it - m_personNames.begin();
0144 }
0145 #include "moc_tickettokenmodel.cpp"