Files
2026-07-12 14:34:52 +04:00

110 lines
3.3 KiB
C++

#include "ticket_sale_widget.h"
#include "create_ticket_request.h"
#include "error_dialog.h"
#include "model_manager.h"
#include "repository_manager.h"
#include "repository_result.h"
#include "schema_metadata.h"
#include "tickets_model.h"
#include "tickets_repository.h"
#include <QLineEdit>
#include <QMessageBox>
#include <QSqlError>
TicketSaleWidget::TicketSaleWidget(QWidget *parent)
: QWidget(parent), selectedSessionId_(-1) {
setupUi(this);
initializeRepositories(); // First or second
initializeModels(); // First ir second
setupTableView(); // After initialization of models
setupConnections();
setupSessionFinder();
}
void TicketSaleWidget::setupTableView() {
tableTickets->setModel(ticketsModel_);
}
void TicketSaleWidget::initializeRepositories() {
RepositoryManager &repositoryManager = RepositoryManager::instance();
SchemaMetadata metadata = SchemaMetadata::defaultSchema();
ticketsRepository_ = repositoryManager.getRepositoryAs<TicketsRepository>(
metadata.repositoryTableName("tickets"));
if (!ticketsRepository_) {
qFatal() << "TicketSaleWidget::initializeRepositories: Failed to "
"initialize repositories";
}
}
void TicketSaleWidget::initializeModels() {
ModelManager &modelManager = ModelManager::instance();
SchemaMetadata metadata = SchemaMetadata::defaultSchema();
ticketsModel_ =
modelManager.getModelAs<TicketsModel>(metadata.modelTableName("tickets"));
if (!bool(ticketsModel_)) {
qFatal() << "TicketSaleWidget::initializeModels: Failed to initialize "
"models";
}
}
void TicketSaleWidget::setupConnections() {
connect(btnSellTicket, &QPushButton::clicked, this,
&TicketSaleWidget::onPushButtonSellTicketClicked);
connect(sessionFinder, &EntityFinderWidget::fieldRetrieved, this,
&TicketSaleWidget::onFieldRetrieved);
}
void TicketSaleWidget::setupSessionFinder() {
sessionFinder->setDefaultRelation("sessions");
sessionFinder->setLabelText(EntityFinderWidget::tr("Select session"));
sessionFinder->setLineEditPlaceholder(EntityFinderWidget::tr(
"Here will be information about selected session"));
}
void TicketSaleWidget::onPushButtonSellTicketClicked() {
if (selectedSessionId_ == -1) {
QMessageBox::warning(this, QMessageBox::tr("Error"),
QMessageBox::tr("No session selected"));
return;
}
int seatNumber = spinBoxSeatNumber->value();
QDateTime soldAt = dateTimeEditSell->isEnabled()
? dateTimeEditSell->dateTime()
: QDateTime::currentDateTime();
CreateTicketRequest request;
request.setSeatNumber(seatNumber);
request.setSessionId(selectedSessionId_);
request.setSoldAt(soldAt);
RepositoryResult result = ticketsRepository_->createTicket(request);
if (!result.success) {
qInfo() << "Failed to create ticket:" << result.errorMessage;
ErrorDialog::displayError(this, result.errorMessage);
return;
}
}
void TicketSaleWidget::onFieldRetrieved(const QSqlField &field) {
selectedSessionId_ = field.value().toInt();
}
// Check if all values in initializer list are valid
void TicketSaleWidget::validateSessionValues(
const std::initializer_list<QVariant> &valuesList) {
for (const auto &value : valuesList) {
if (!value.isValid()) {
return;
}
}
}