- init: inti repo

This commit is contained in:
2026-04-05 16:14:54 +03:00
commit 590975b1f0
28 changed files with 1948 additions and 0 deletions

136
ticketswidget.cpp Normal file
View File

@@ -0,0 +1,136 @@
#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, "Ошибка", "Не удалось продать билет!");
}
}