137 lines
5.7 KiB
C++
137 lines
5.7 KiB
C++
#include "ticketswidget.h"
|
||
#include "database.h"
|
||
#include "mainwindow.h"
|
||
#include <QTableWidget>
|
||
#include <QHeaderView>
|
||
#include <QMessageBox>
|
||
#include <QGroupBox>
|
||
|
||
TicketsWidget::TicketsWidget(QWidget* parent) : QWidget(parent) {
|
||
auto* mainLayout = new QVBoxLayout(this);
|
||
|
||
auto* title = new QLabel("Продажа билетов", this);
|
||
title->setStyleSheet("font-size: 20px; font-weight: bold;");
|
||
mainLayout->addWidget(title);
|
||
|
||
auto* sellGroup = new QGroupBox("Новый билет", this);
|
||
auto* sellForm = new QFormLayout(sellGroup);
|
||
|
||
m_routeCombo = new QComboBox(this);
|
||
m_routeInfo = new QLabel("Выберите рейс", this);
|
||
m_passengerName = new QLineEdit(this);
|
||
m_passengerName->setPlaceholderText("Иванов Иван Иванович");
|
||
m_documentNumber = new QLineEdit(this);
|
||
m_documentNumber->setPlaceholderText("Серия и номер паспорта");
|
||
m_seatCount = new QSpinBox(this);
|
||
m_seatCount->setMinimum(1);
|
||
m_seatCount->setMaximum(10);
|
||
m_totalPrice = new QLabel("0.00 руб.", this);
|
||
m_sellBtn = new QPushButton("Продать билет", this);
|
||
|
||
sellForm->addRow("Рейс:", m_routeCombo);
|
||
sellForm->addRow("", m_routeInfo);
|
||
sellForm->addRow("ФИО пассажира:", m_passengerName);
|
||
sellForm->addRow("Документ:", m_documentNumber);
|
||
sellForm->addRow("Количество билетов:", m_seatCount);
|
||
sellForm->addRow("Итого:", m_totalPrice);
|
||
sellForm->addRow("", m_sellBtn);
|
||
|
||
mainLayout->addWidget(sellGroup);
|
||
|
||
connect(m_routeCombo, QOverload<int>::of(&QComboBox::currentIndexChanged),
|
||
this, &TicketsWidget::onRouteChanged);
|
||
connect(m_seatCount, QOverload<int>::of(&QSpinBox::valueChanged),
|
||
this, &TicketsWidget::onRouteChanged);
|
||
connect(m_sellBtn, &QPushButton::clicked, this, &TicketsWidget::onSellClicked);
|
||
|
||
auto* ticketsLabel = new QLabel("Проданные билеты на выбранный рейс", this);
|
||
ticketsLabel->setStyleSheet("font-weight: bold;");
|
||
mainLayout->addWidget(ticketsLabel);
|
||
|
||
m_ticketsTable = new QTableWidget(this);
|
||
m_ticketsTable->setColumnCount(6);
|
||
m_ticketsTable->setHorizontalHeaderLabels({"ID", "Пассажир", "Документ", "Билетов", "Сумма", "Продано"});
|
||
m_ticketsTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
|
||
m_ticketsTable->setSelectionBehavior(QAbstractItemView::SelectRows);
|
||
m_ticketsTable->setEditTriggers(QAbstractItemView::NoEditTriggers);
|
||
mainLayout->addWidget(m_ticketsTable);
|
||
|
||
refreshRoutes();
|
||
}
|
||
|
||
void TicketsWidget::refreshRoutes() {
|
||
m_routeCombo->clear();
|
||
QVector<Route> routes = Database::instance().getAllRoutes();
|
||
for (const auto& route : routes) {
|
||
m_routeCombo->addItem(QString("%1 - %2").arg(route.routeName).arg(route.departureTime), route.id);
|
||
}
|
||
}
|
||
|
||
void TicketsWidget::onRouteChanged(int index) {
|
||
if (index < 0) return;
|
||
|
||
int routeId = m_routeCombo->currentData().toInt();
|
||
Route route = Database::instance().getRoute(routeId);
|
||
|
||
m_routeInfo->setText(QString("Цена: %1 руб. | Свободно: %2 мест")
|
||
.arg(route.price, 0, 'f', 2)
|
||
.arg(route.availableSeats));
|
||
|
||
m_seatCount->setMaximum(qMin(10, route.availableSeats));
|
||
|
||
double total = route.price * m_seatCount->value();
|
||
m_totalPrice->setText(QString("%1 руб.").arg(total, 0, 'f', 2));
|
||
|
||
QVector<Ticket> tickets = Database::instance().getTicketsByRoute(routeId);
|
||
m_ticketsTable->setRowCount(tickets.size());
|
||
|
||
for (int i = 0; i < tickets.size(); ++i) {
|
||
const Ticket& ticket = tickets[i];
|
||
m_ticketsTable->setItem(i, 0, new QTableWidgetItem(QString::number(ticket.id)));
|
||
m_ticketsTable->setItem(i, 1, new QTableWidgetItem(ticket.passengerName));
|
||
m_ticketsTable->setItem(i, 2, new QTableWidgetItem(ticket.documentNumber));
|
||
m_ticketsTable->setItem(i, 3, new QTableWidgetItem(QString::number(ticket.seatCount)));
|
||
m_ticketsTable->setItem(i, 4, new QTableWidgetItem(QString::number(ticket.totalPrice, 'f', 2)));
|
||
m_ticketsTable->setItem(i, 5, new QTableWidgetItem(ticket.saleDate));
|
||
}
|
||
}
|
||
|
||
void TicketsWidget::onSellClicked() {
|
||
int routeId = m_routeCombo->currentData().toInt();
|
||
Route route = Database::instance().getRoute(routeId);
|
||
|
||
QString passengerName = m_passengerName->text().trimmed();
|
||
QString documentNumber = m_documentNumber->text().trimmed();
|
||
int seatCount = m_seatCount->value();
|
||
|
||
if (passengerName.isEmpty() || documentNumber.isEmpty()) {
|
||
QMessageBox::warning(this, "Ошибка", "Заполните все поля!");
|
||
return;
|
||
}
|
||
|
||
if (seatCount > route.availableSeats) {
|
||
QMessageBox::warning(this, "Ошибка",
|
||
QString("Недостаточно мест! Доступно: %1").arg(route.availableSeats));
|
||
return;
|
||
}
|
||
|
||
MainWindow* mainWin = qobject_cast<MainWindow*>(window());
|
||
int sellerId = mainWin ? mainWin->currentUserId() : 1;
|
||
|
||
if (Database::instance().addTicket(routeId, passengerName, documentNumber, seatCount, sellerId)) {
|
||
QMessageBox::information(this, "Успех",
|
||
QString("Продано %1 билет(а) на сумму %2 руб.")
|
||
.arg(seatCount)
|
||
.arg(route.price * seatCount, 0, 'f', 2));
|
||
|
||
m_passengerName->clear();
|
||
m_documentNumber->clear();
|
||
m_seatCount->setValue(1);
|
||
|
||
refreshRoutes();
|
||
onRouteChanged(m_routeCombo->currentIndex());
|
||
} else {
|
||
QMessageBox::critical(this, "Ошибка", "Не удалось продать билет!");
|
||
}
|
||
}
|