Files
cinema-ticket-management-sy…/data/sql/sessions_statistics_repository.cpp
T

170 lines
5.5 KiB
C++
Raw Normal View History

2026-07-12 14:34:52 +04:00
#include "sessions_statistics_repository.h"
#include "repository_result.h"
#include "session_statistics_dto.h"
#include <QSqlError>
#include <QSqlQuery>
#include <QVariant>
#include <QVector>
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<SessionStatisticsDTO> &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<SessionStatisticsDTO> &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<QDateTime> startDate,
std::optional<QDateTime> endDate,
QVector<SessionStatisticsDTO> &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<QDateTime> startDate,
std::optional<QDateTime> endDate,
QVector<SessionStatisticsDTO> &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<QDateTime> startDate,
std::optional<QDateTime> endDate,
QVector<SessionStatisticsDTO> &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<QDateTime> &startDate,
const std::optional<QDateTime> &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<QDateTime> &startDate,
const std::optional<QDateTime> &endDate) const {
if (startDate) {
query.bindValue(":start_date", *startDate);
}
if (endDate) {
query.bindValue(":end_date", *endDate);
}
}