Initial commit

This commit is contained in:
user
2026-07-12 14:34:52 +04:00
commit 3abf6bd9c2
557 changed files with 68706 additions and 0 deletions
+8
View File
@@ -0,0 +1,8 @@
# Find Google Test
find_package(GTest REQUIRED)
# Find SQLite3
find_package(SQLite3 REQUIRED)
# Minimum required Qt version
find_package(Qt6 6.3 REQUIRED COMPONENTS Core Gui Sql Widgets Charts Test)
+10
View File
@@ -0,0 +1,10 @@
# Copy compile_commands.json to source directory
if (CMAKE_EXPORT_COMPILE_COMMANDS)
add_custom_target(
CopyCompileCommands ALL
COMMAND ${CMAKE_COMMAND} -E copy_if_different
${CMAKE_BINARY_DIR}/compile_commands.json
${CMAKE_SOURCE_DIR}/compile_commands.json
COMMENT "Copying compile_commands.json to source directory"
)
endif()
+11
View File
@@ -0,0 +1,11 @@
# Generate the config.h file
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/config/config.h.in
${CMAKE_CURRENT_BINARY_DIR}/config.h
)
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/config/resources.qrc.in
${CMAKE_CURRENT_SOURCE_DIR}/resources.qrc
)
+41
View File
@@ -0,0 +1,41 @@
set(ROOT_DIR ${CMAKE_SOURCE_DIR})
file(GLOB_RECURSE HEADER_FILES "${ROOT_DIR}/*.h")
file(GLOB_RECURSE SOURCE_FILES "${ROOT_DIR}/*.cpp")
file(GLOB_RECURSE CMAKE_FILES "${ROOT_DIR}/*.cmake")
file(GLOB_RECURSE CMAKE_LISTS_FILES "${ROOT_DIR}/CMakeLists.txt")
set(MOC_FILTER ".*/moc_.*")
set(BUILD_DIR_FILTER ".*/build/.*")
list(FILTER HEADER_FILES EXCLUDE REGEX "${MOC_FILTER}")
list(FILTER HEADER_FILES EXCLUDE REGEX "${BUILD_DIR_FILTER}")
list(FILTER SOURCE_FILES EXCLUDE REGEX "${MOC_FILTER}")
list(FILTER SOURCE_FILES EXCLUDE REGEX "${BUILD_DIR_FILTER}")
list(FILTER CMAKE_FILES EXCLUDE REGEX "${BUILD_DIR_FILTER}")
list(FILTER CMAKE_LISTS_FILES EXCLUDE REGEX "${BUILD_DIR_FILTER}")
execute_process(COMMAND wc -l ${HEADER_FILES} OUTPUT_VARIABLE HEADER_COUNT ERROR_QUIET)
execute_process(COMMAND wc -l ${SOURCE_FILES} OUTPUT_VARIABLE SOURCE_COUNT ERROR_QUIET)
execute_process(COMMAND wc -l ${CMAKE_FILES} OUTPUT_VARIABLE CMAKE_COUNT ERROR_QUIET)
execute_process(COMMAND wc -l ${CMAKE_LISTS_FILES} OUTPUT_VARIABLE CMAKE_LISTS_COUNT ERROR_QUIET)
file(MAKE_DIRECTORY "${CMAKE_SOURCE_DIR}/artifacts")
set(HEADER_FILE "${CMAKE_SOURCE_DIR}/artifacts/header_lines_count.txt")
set(SOURCE_FILE "${CMAKE_SOURCE_DIR}/artifacts/source_lines_count.txt")
set(CMAKE_FILE "${CMAKE_SOURCE_DIR}/artifacts/cmake_lines_count.txt")
set(CMAKE_LISTS_FILE "${CMAKE_SOURCE_DIR}/artifacts/cmake_lists_lines_count.txt")
file(WRITE ${HEADER_FILE} "${HEADER_COUNT}")
file(WRITE ${SOURCE_FILE} "${SOURCE_COUNT}")
file(WRITE ${CMAKE_FILE} "${CMAKE_COUNT}")
file(WRITE ${CMAKE_LISTS_FILE} "${CMAKE_LISTS_COUNT}")
message(STATUS "Header line count written to: ${HEADER_FILE}")
message(STATUS "Source line count written to: ${SOURCE_FILE}")
message(STATUS "CMake line count written to: ${CMAKE_FILE}")
message(STATUS "CMakeLists.txt line count written to: ${CMAKE_LISTS_FILE}")
+21
View File
@@ -0,0 +1,21 @@
# Ensure artifacts directory exists
file(MAKE_DIRECTORY "${ARTIFACTS_DIR}")
# Collecting all files in the project, excluding artifacts and build directories
file(GLOB_RECURSE PROJECT_FILES
RELATIVE "${CMAKE_SOURCE_DIR}"
"*"
)
list(FILTER PROJECT_FILES EXCLUDE REGEX "^(artifacts/|build/|external/)")
# Generate directory tree
add_custom_command(
OUTPUT "${ARTIFACTS_DIR}/tree.txt"
COMMAND tree -I 'artifacts|build|external' "${CMAKE_SOURCE_DIR}" > "${ARTIFACTS_DIR}/tree.txt"
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
DEPENDS ${PROJECT_FILES}
COMMENT "Generating directory tree in ${ARTIFACTS_DIR}/tree.txt"
)
# Create GenerateTree target
add_custom_target(GenerateTree ALL DEPENDS "${ARTIFACTS_DIR}/tree.txt")
+2
View File
@@ -0,0 +1,2 @@
# Generate UI files
qt_wrap_ui(UI_HEADERS ${UI_FILES})
+10
View File
@@ -0,0 +1,10 @@
# NOTE: PRINT MESSAGES
# Print important message
function(print_important_message MESSAGE_TEXT)
message(STATUS "")
message(STATUS "========================================")
message(STATUS "${MESSAGE_TEXT}")
message(STATUS "========================================")
message(STATUS "")
endfunction()
+59
View File
@@ -0,0 +1,59 @@
if(NOT FILES_GROUPED)
message(FATAL_ERROR "GroupFilesByLocation.cmake must be included before CombineFileGroups.cmake")
endif()
# Path to source files
set(SOURCES
${CONTROLLERS_SOURCES}
${DB_SOURCES}
${DELEGATE_SOURCES}
${DIALOG_SOURCES}
${MAIN_WINDOW_SOURCES}
${MODELS_SOURCES}
${REPOSITORIES_SOURCES}
${SERVICES_SOURCES}
${SQL_SOURCES}
${SRC_SOURCES}
${UTILS_SOURCES}
${WIDGETS_SOURCES}
)
print_important_message("Files grouped by location")
message("CONTROLLERS_SOURCES: ${CONTROLLERS_SOURCES}")
message("DB_SOURCES: ${DB_SOURCES}")
message("DELEGATE_SOURCES: ${DELEGATE_SOURCES}")
message("DIALOG_SOURCES: ${DIALOG_SOURCES}")
message("MAIN_WINDOW_SOURCES: ${MAIN_WINDOW_SOURCES}")
message("MODELS_SOURCES: ${MODELS_SOURCES}")
message("REPOSITORIES_SOURCES: ${REPOSITORIES_SOURCES}")
message("SERVICES_SOURCES: ${SERVICES_SOURCES}")
message("SQL_SOURCES: ${SQL_SOURCES}")
message("SRC_SOURCES: ${SRC_SOURCES}")
message("UTILS_SOURCES: ${UTILS_SOURCES}")
message("WIDGETS_SOURCES: ${WIDGETS_SOURCES}")
# WARNING: Not all header files may be included
# Path to header files
set(HEADERS
${DB_HEADERS}
${DELEGATE_HEADERS}
${DIALOG_HEADERS}
${MAIN_WINDOW_HEADERS}
${MODELS_HEADERS}
${REPOSITORIES_HEADERS}
${SERVICES_HEADERS}
${SQL_HEADERS}
${WIDGETS_HEADERS}
)
# Path to UI files
set(UI_FILES
${DIALOG_UI_FILES}
${MAIN_WINDOW_UI_FILES}
${WIDGETS_UI_FILES}
)
# Path to resource files
set(RESOURCES ${RESOURCES_FILES})
+272
View File
@@ -0,0 +1,272 @@
if(NOT PATHS_INCLUDED)
message(FATAL_ERROR "PathsAndIncludes.cmake must be included before GroupFilesByLocation.cmake")
endif()
set(FILES_GROUPED TRUE)
# NOTE: TRANSLATIONS
set(TRANSLATIONS
${TRANSLATIONS_DIR}/app_ru.ts
)
# NOTE: UI/DELEGATES
# Delegate source files
set(DELEGATE_SOURCES
${UI_DELEGATES_DIR}/date_time_delegate.cpp
)
# Delegate header files
set(DELEGATE_HEADERS
${UI_DELEGATES_DIR}/date_time_delegate.h
)
# NOTE: UI/DIALOGS
# Dialog source files
set(DIALOG_SOURCES
${UI_DIALOGS_DIR}/auth_dialog.cpp
${UI_DIALOGS_DIR}/error_dialog.cpp
${UI_DIALOGS_DIR}/search_dialog.cpp
)
# Dialog header files
set(DIALOG_HEADERS
${UI_DIALOGS_DIR}/auth_dialog.h
${UI_DIALOGS_DIR}/error_dialog.h
${UI_DIALOGS_DIR}/search_dialog.h
)
# Dialog UI files
set(DIALOG_UI_FILES
${UI_DIALOGS_DIR}/auth_dialog.ui
${UI_DIALOGS_DIR}/search_dialog.ui
)
# NOTE: UI/MAIN_WINDOW
# Main window source files
set(MAIN_WINDOW_SOURCES
${UI_MAIN_WINDOW_DIR}/main_window.cpp
)
# Main window header files
set(MAIN_WINDOW_HEADERS
${UI_MAIN_WINDOW_DIR}/main_window.h
)
# Main window UI files
set(MAIN_WINDOW_UI_FILES
${UI_MAIN_WINDOW_DIR}/main_window.ui
)
# NOTE: UI/MODELS
# Models source files
set(MODELS_SOURCES
${UI_MODELS_DIR}/base_sql_table_model.cpp
${UI_MODELS_DIR}/genres_model.cpp
${UI_MODELS_DIR}/halls_model.cpp
${UI_MODELS_DIR}/movies_model.cpp
${UI_MODELS_DIR}/multi_column_filter_proxy_model.cpp
${UI_MODELS_DIR}/refunds_model.cpp
${UI_MODELS_DIR}/sessions_model.cpp
${UI_MODELS_DIR}/tickets_model.cpp
)
# Models header files
set(MODELS_HEADERS
${UI_MODELS_DIR}/base_sql_table_model.h
${UI_MODELS_DIR}/genres_model.h
${UI_MODELS_DIR}/halls_model.h
${UI_MODELS_DIR}/movies_model.h
${UI_MODELS_DIR}/multi_column_filter_proxy_model.h
${UI_MODELS_DIR}/refunds_model.h
${UI_MODELS_DIR}/sessions_model.h
${UI_MODELS_DIR}/tickets_model.h
)
# NOTE: UI/WIDGETS
# Widgets source files
set(WIDGETS_SOURCES
${UI_WIDGETS_DIR}/directories_management_widget.cpp
${UI_WIDGETS_DIR}/entity_deleter_widget.cpp
${UI_WIDGETS_DIR}/entity_finder_widget.cpp
${UI_WIDGETS_DIR}/entity_updater_widget.cpp
${UI_WIDGETS_DIR}/reports_widget.cpp
${UI_WIDGETS_DIR}/session_management_widget.cpp
${UI_WIDGETS_DIR}/single_record_time_range_widget.cpp
${UI_WIDGETS_DIR}/ticket_return_widget.cpp
${UI_WIDGETS_DIR}/ticket_sale_widget.cpp
${UI_WIDGETS_DIR}/ticket_sales_report_widget.cpp
)
# Widgets header files
set(WIDGETS_HEADERS
${UI_WIDGETS_DIR}/directories_management_widget.h
${UI_WIDGETS_DIR}/entity_deleter_widget.h
${UI_WIDGETS_DIR}/entity_finder_widget.h
${UI_WIDGETS_DIR}/entity_updater_widget.h
${UI_WIDGETS_DIR}/reports_widget.h
${UI_WIDGETS_DIR}/session_management_widget.h
${UI_WIDGETS_DIR}/single_record_time_range_widget.h
${UI_WIDGETS_DIR}/ticket_return_widget.h
${UI_WIDGETS_DIR}/ticket_sale_widget.h
${UI_WIDGETS_DIR}/ticket_sales_report_widget.h
)
# Widgets UI files
set(WIDGETS_UI_FILES
${UI_MODELS_DIR}/entity_finder_widget.ui
${UI_WIDGETS_DIR}/directories_management_widget.ui
${UI_WIDGETS_DIR}/entity_deleter_widget.ui
${UI_WIDGETS_DIR}/entity_updater_widget.ui
${UI_WIDGETS_DIR}/reports_widget.ui
${UI_WIDGETS_DIR}/session_management_widget.ui
${UI_WIDGETS_DIR}/single_record_time_range_widget.ui
${UI_WIDGETS_DIR}/ticket_return_widget.ui
${UI_WIDGETS_DIR}/ticket_sale_widget.ui
${UI_WIDGETS_DIR}/ticket_sales_report_widget.ui
)
# NOTE: CORE/DB
# DB source files
set(DB_SOURCES
${CORE_DB_DIR}/database_manager.cpp
${CORE_DB_DIR}/execute_sql_file.cpp
)
# DB header files
set(DB_HEADERS
${CORE_DB_DIR}/database_manager.h
${CORE_DB_DIR}/execute_sql_file.h
)
# NOTE: CORE/REPOSITORIES
set(REPOSITORIES_SOURCES
${CORE_REPOSITORIES_DIR}/repository_result.cpp
)
set(REPOSITORIES_HEADERS
${CORE_REPOSITORIES_DIR}/repository_result.h
)
# NOTE: CORE/SERVICES
# Services source files
set(SERVICES_SOURCES
${CORE_SERVICES_DIR}/base_generator.cpp
${CORE_SERVICES_DIR}/date_time_generator.cpp
${CORE_SERVICES_DIR}/model_manager.cpp
${CORE_SERVICES_DIR}/refund_generator.cpp
${CORE_SERVICES_DIR}/relation_id_config.cpp
${CORE_SERVICES_DIR}/repository_manager.cpp
${CORE_SERVICES_DIR}/schema_metadata.cpp
${CORE_SERVICES_DIR}/session_generator.cpp
${CORE_SERVICES_DIR}/ticket_generator.cpp
)
# Services header files
set(SERVICES_HEADERS
${CORE_SERVICES_DIR}/base_generator.h
${CORE_SERVICES_DIR}/date_time_generator.h
${CORE_SERVICES_DIR}/model_manager.h
${CORE_SERVICES_DIR}/refund_generator.h
${CORE_SERVICES_DIR}/relation_id_config.h
${CORE_SERVICES_DIR}/repository_manager.h
${CORE_SERVICES_DIR}/schema_metadata.h
${CORE_SERVICES_DIR}/session_generator.h
${CORE_SERVICES_DIR}/ticket_generator.h
)
# NOTE: CORE/SQL
# SQL script files
set(SQL_FILES
${CORE_SQL_DIR}/cinema_db_create_table.sql
${CORE_SQL_DIR}/cinema_db_create_trigger.sql
${CORE_SQL_DIR}/cinema_db_drop_table.sql
${CORE_SQL_DIR}/cinema_db_drop_trigger.sql
${CORE_SQL_DIR}/cinema_db_foreign_key_off.sql
${CORE_SQL_DIR}/cinema_db_foreign_key_on.sql
${CORE_SQL_DIR}/cinema_db_insert.sql
)
# NOTE: CORE/UTILS
# Utils source files
set(UTILS_SOURCES
${CORE_UTILS_DIR}/day_manager.cpp
${CORE_UTILS_DIR}/reservation_manager.cpp
)
set(UTILS_HEADERS
${CORE_UTILS_DIR}/day_manager.h
${CORE_UTILS_DIR}/reservation_manager.h
)
# NOTE: CORE/CONTROLLERS
# Controllers source files
set(CONTROLLERS_SOURCES
${CORE_CONTROLLERS_DIR}/application_controller.cpp
${CORE_CONTROLLERS_DIR}/application_connector.cpp
)
# Controllers header files
set(CONTROLLERS_HEADERS
${CORE_CONTROLLERS_DIR}/application_controller.h
${CORE_CONTROLLERS_DIR}/application_connector.h
)
# NOTE: DATA/SQL
# Implementation repository source files
set(SQL_SOURCES
${DATA_SQL_DIR}/base_sql_table_repository.cpp
${DATA_SQL_DIR}/genres_repository.cpp
${DATA_SQL_DIR}/halls_repository.cpp
${DATA_SQL_DIR}/movies_repository.cpp
${DATA_SQL_DIR}/refunds_repository.cpp
${DATA_SQL_DIR}/roles_repository.cpp
${DATA_SQL_DIR}/sessions_statistics_repository.cpp
${DATA_SQL_DIR}/sessions_repository.cpp
${DATA_SQL_DIR}/table_info_sqlite.cpp
${DATA_SQL_DIR}/tickets_repository.cpp
${DATA_SQL_DIR}/users_repository.cpp
)
# Implementation repository header files
set(SQL_HEADERS
${DATA_SQL_DIR}/base_sql_table_repository.cpp
${DATA_SQL_DIR}/data_repository_signals.h
${DATA_SQL_DIR}/genres_repository.h
${DATA_SQL_DIR}/halls_repository.h
${DATA_SQL_DIR}/movies_repository.h
${DATA_SQL_DIR}/refunds_repository.h
${DATA_SQL_DIR}/roles_repository.h
${DATA_SQL_DIR}/sessions_statistics_repository.h
${DATA_SQL_DIR}/sessions_repository.h
${DATA_SQL_DIR}/table_info_sqlite.cpp
${DATA_SQL_DIR}/tickets_repository.h
${DATA_SQL_DIR}/users_repository.h
)
# NOTE: SRC
# Source files
set(SRC_SOURCES
${SRC_DIR}/main.cpp
)
# NOTE: RESOURCES
# Resource file
set(RESOURCES_FILES
${CMAKE_SOURCE_DIR}/resources.qrc
)
+74
View File
@@ -0,0 +1,74 @@
set(PATHS_INCLUDED TRUE)
# NOTE: PATHS
# Path to translations directory
set(TRANSLATIONS_DIR "${CMAKE_SOURCE_DIR}/translations")
# Path to artifacts directory
set(ARTIFACTS_DIR "${CMAKE_SOURCE_DIR}/artifacts")
# Core paths
set(CORE_DIR "${CMAKE_SOURCE_DIR}/core")
set(CORE_CONTROLLERS_DIR "${CORE_DIR}/controllers")
set(CORE_DB_DIR "${CORE_DIR}/db")
set(CORE_DTO_DIR "${CORE_DIR}/dto")
set(CORE_REPOSITORIES_DIR "${CORE_DIR}/repositories")
set(CORE_REQUESTS_DIR "${CORE_DIR}/requests")
set(CORE_SERVICES_DIR "${CORE_DIR}/services")
set(CORE_SQL_DIR "${CORE_DIR}/sql")
set(CORE_UTILS_DIR "${CORE_DIR}/utils")
# Grouped paths
set(CORE_PATHS
${CORE_CONTROLLERS_DIR}
${CORE_DB_DIR}
${CORE_DTO_DIR}
${CORE_REPOSITORIES_DIR}
${CORE_REQUESTS_DIR}
${CORE_SERVICES_DIR}
${CORE_SQL_DIR}
${CORE_UTILS_DIR}
)
# UI paths
set(UI_DIR "${CMAKE_SOURCE_DIR}/ui")
set(UI_DELEGATES_DIR "${UI_DIR}/delegates")
set(UI_DIALOGS_DIR "${UI_DIR}/dialogs")
set(UI_MAIN_WINDOW_DIR "${UI_DIR}/main_window")
set(UI_MODELS_DIR "${UI_DIR}/models")
set(UI_WIDGETS_DIR "${UI_DIR}/widgets")
# Grouped paths
set(UI_PATHS
${UI_DELEGATES_DIR}
${UI_DIALOGS_DIR}
${UI_MAIN_WINDOW_DIR}
${UI_MODELS_DIR}
${UI_WIDGETS_DIR}
)
# Path to source directory
set(SRC_DIR "${CMAKE_SOURCE_DIR}/src")
# Path to tests schema directory
set(TESTS_CLASS_DIR "${CMAKE_SOURCE_DIR}/tests_class")
set(TESTS_SCHEMA_DIR "${CMAKE_SOURCE_DIR}/tests_schema")
# Path to data directory
set(DATA_DIR "${CMAKE_SOURCE_DIR}/data")
set(DATA_SQL_DIR "${DATA_DIR}/sql")
# NOTE: INCLUDES
include_directories(
${CMAKE_BINARY_DIR}
${CMAKE_SOURCE_DIR}
${CORE_PATHS}
${DATA_SQL_DIR}
${SRC_DIR}
${UI_PATHS}
)
+18
View File
@@ -0,0 +1,18 @@
# Enable additional Qt features
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
# Specify the C++ standard
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
# add_compile_options(-std=c++20)
# Get the Qt environment variables
set(QT_UIC_EXECUTABLE "$ENV{QT_UIC_EXECUTABLE}")
set(QT_MOC_EXECUTABLE "$ENV{QT_MOC_EXECUTABLE}")
# Enable CMake to generate compile_commands.json
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
+6
View File
@@ -0,0 +1,6 @@
# Set the database name
set(DATABASE_NAME "database.db")
# Set the database driver
set(DATABASE_DRIVER "QSQLITE")
+19
View File
@@ -0,0 +1,19 @@
print_important_message("Additional information")
message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}")
# Add the main executable
add_executable(${PROJECT_NAME}
${HEADERS}
${RESOURCES}
${SOURCES}
${UI_HEADERS}
)
# Link with Qt libraries
target_link_libraries(${PROJECT_NAME}
Qt6::Charts
Qt6::Core
Qt6::Gui
Qt6::Sql
Qt6::Widgets
)
+33
View File
@@ -0,0 +1,33 @@
# Update translations
find_program(LUPDATE_EXECUTABLE lupdate REQUIRED)
if(NOT LUPDATE_EXECUTABLE)
message(WARNING "The 'lupdate' program was not found. Translation update will be skipped.")
return()
endif()
add_custom_target(update_translations ALL
COMMAND ${LUPDATE_EXECUTABLE} ${CMAKE_SOURCE_DIR} -ts ${TRANSLATIONS}
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
COMMENT "Updating translation files"
)
# Compile translations
find_program(LRELEASE_EXECUTABLE lrelease REQUIRED)
if(NOT LRELEASE_EXECUTABLE)
message(WARNING "The 'lrelease' program was not found. Translation compilation will be skipped.")
return()
endif()
foreach(TRANSLATION ${TRANSLATIONS})
get_filename_component(QM_FILE ${TRANSLATION} NAME_WE)
set(QM_FILE ${CMAKE_BINARY_DIR}/translations/${QM_FILE}.qm)
add_custom_command(OUTPUT ${QM_FILE}
COMMAND ${LRELEASE_EXECUTABLE} ${TRANSLATION} -qm ${QM_FILE}
DEPENDS ${TRANSLATION}
COMMENT "Compiling ${QM_FILE}"
)
list(APPEND QM_FILES ${QM_FILE})
endforeach()
# Create translations target
add_custom_target(translations ALL DEPENDS ${QM_FILES})