#include "sessions_statistics_repository.h" #include "repository_result.h" #include "session_statistics_dto.h" #include #include #include #include SessionsStatisticsRepository::SessionsStatisticsRepository( QSqlDatabase &database, QObject *parent) : BaseSqlTableRepository(database, parent) {} SessionStatisticsDTO SessionsStatisticsRepository::mapQueryToDTO(const QSqlQuery &query) const { SessionStatisticsDTO sessionStatisticsDTO; // clang-format off sessionStatisticsDTO.setSessionId(query.value("session_id").toInt()); sessionStatisticsDTO.setBeginAt(query.value("begin_at").toDateTime()); sessionStatisticsDTO.setTicketPrice(query.value("ticket_price").toDouble()); sessionStatisticsDTO.setHallId(query.value("hall_id").toInt()); sessionStatisticsDTO.setHallName(query.value("hall_name").toString()); sessionStatisticsDTO.setTotalSeats(query.value("total_seats").toInt()); sessionStatisticsDTO.setMovieId(query.value("movie_id").toInt()); sessionStatisticsDTO.setMovieTitle(query.value("movie_title").toString()); sessionStatisticsDTO.setDuration(query.value("duration").toInt()); sessionStatisticsDTO.setGenreId(query.value("genre_id").toInt()); sessionStatisticsDTO.setGenreName(query.value("genre_name").toString()); sessionStatisticsDTO.setSoldTickets(query.value("sold_tickets").toInt()); sessionStatisticsDTO.setRefundedTickets( query.value("refunded_tickets").toInt()); sessionStatisticsDTO.setSalesRevenue(query.value("sales_revenue").toDouble()); sessionStatisticsDTO.setRefundExpenses( query.value("refund_expenses").toDouble()); // clang-format on return sessionStatisticsDTO; } RepositoryResult SessionsStatisticsRepository::executeAndMapQuery( QSqlQuery &query, QVector &sessions) const { qInfo() << "Executing query:" << query.executedQuery() << " with values:" << query.boundValues(); if (!query.exec()) { return RepositoryResult::failureResult(query.lastError().text()); } while (query.next()) { sessions.append(mapQueryToDTO(query)); } emit dataRetrieved(); return RepositoryResult::successResult(); } RepositoryResult SessionsStatisticsRepository::getSessionById( qint32 id, SessionStatisticsDTO &sessionStatisticsDTO) const { QSqlQuery query = foreignKeysOnQuery(); query.prepare(QString("%1 WHERE session_id = :id").arg(SELECT_QUERY)); query.bindValue(":id", id); if (!query.exec()) { return RepositoryResult::failureResult(query.lastError().text()); } if (!query.next()) { return RepositoryResult::failureResult("Session not found"); } sessionStatisticsDTO = mapQueryToDTO(query); emit dataRetrieved(); return RepositoryResult::successResult(); } RepositoryResult SessionsStatisticsRepository::getAllSessions( QVector &sessions) const { QSqlQuery query = foreignKeysOnQuery(); query.prepare(SELECT_QUERY); if (!query.exec()) { return RepositoryResult::failureResult(query.lastError().text()); } while (query.next()) { sessions.append(mapQueryToDTO(query)); } emit dataRetrieved(); return RepositoryResult::successResult(); } RepositoryResult SessionsStatisticsRepository::getSessionsForHall( qint32 hallId, std::optional startDate, std::optional endDate, QVector &sessions) const { QSqlQuery query = foreignKeysOnQuery(); QString queryString = QString("%1 WHERE hall_id = :hall_id").arg(SELECT_QUERY); bindDateFilters(queryString, startDate, endDate); query.prepare(queryString); query.bindValue(":hall_id", hallId); bindDateValues(query, startDate, endDate); return executeAndMapQuery(query, sessions); } RepositoryResult SessionsStatisticsRepository::getSessionsForMovie( qint32 movieId, std::optional startDate, std::optional endDate, QVector &sessions) const { QSqlQuery query = foreignKeysOnQuery(); QString queryString = QString("%1 WHERE movie_id = :movie_id").arg(SELECT_QUERY); bindDateFilters(queryString, startDate, endDate); query.prepare(queryString); query.bindValue(":movie_id", movieId); bindDateValues(query, startDate, endDate); return executeAndMapQuery(query, sessions); } RepositoryResult SessionsStatisticsRepository::getSessionsForGenre( qint32 genreId, std::optional startDate, std::optional endDate, QVector &sessions) const { QSqlQuery query = foreignKeysOnQuery(); QString queryString = QString("%1 WHERE genre_id = :genre_id").arg(SELECT_QUERY); bindDateFilters(queryString, startDate, endDate); query.prepare(queryString); query.bindValue(":genre_id", genreId); bindDateValues(query, startDate, endDate); return executeAndMapQuery(query, sessions); } void SessionsStatisticsRepository::bindDateFilters( QString &queryString, const std::optional &startDate, const std::optional &endDate) const { if (startDate && endDate) { queryString += " AND begin_at BETWEEN :start_date AND :end_date"; } else if (startDate) { queryString += " AND begin_at >= :start_date"; } else if (endDate) { queryString += " AND begin_at <= :end_date"; } } void SessionsStatisticsRepository::bindDateValues( QSqlQuery &query, const std::optional &startDate, const std::optional &endDate) const { if (startDate) { query.bindValue(":start_date", *startDate); } if (endDate) { query.bindValue(":end_date", *endDate); } }