commit 3abf6bd9c2fc36171ceaa6881fe7dae10e3a888d Author: user Date: Sun Jul 12 14:34:52 2026 +0400 Initial commit diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..a1b3570 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,51 @@ +cmake_minimum_required(VERSION 3.16) + +# Specify the project name and C++ language +project(Cinema VERSION 0.1 LANGUAGES CXX) + +# Extend module path to allow includes without the "cmake/" prefix +list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") + +# Include project variables +include(setup/ProjectVariables) + +# Include helper functions +include(helpers/PrintMessages) + +# Include dependency management and configuration +include(dependencies/FindPackages) +include(setup/Config) + +# Include path and file management +include(paths/PathsAndIncludes) +include(paths/GroupFilesByLocation) +include(paths/CombineFileGroups) + +# Include file generation +include(generation/ClangdSetup) +include(generation/ConfigureFiles) +include(generation/ProjectTree) +include(generation/CountLines) + +# Include UI generation +include(generation/UiFiles) + +# Include project setup files +include(setup/Translations) +include(setup/TargetSetup) + +# Print an important message about the tests schema directory + +# Enable testing +enable_testing() + +print_important_message("ENABLE TESTS CLASS DIRECTORY") + +# Add the tests class directory +add_subdirectory(tests_class) + +print_important_message("ENABLE TESTS SCHEMA DIRECTORY") + +# Add the tests schema directory +add_subdirectory(tests_schema) + diff --git a/artifacts/cccc/ApplicationConnector.html b/artifacts/cccc/ApplicationConnector.html new file mode 100644 index 0000000..9dd6e45 --- /dev/null +++ b/artifacts/cccc/ApplicationConnector.html @@ -0,0 +1,206 @@ + +Detailed report on module ApplicationConnector + + + +

Detailed report on module ApplicationConnector

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 224 12
McCabe's Cyclomatic NumberMVG 56 3
Lines of CommentCOM 1 0.053
LOC/COML_C224.000 
MVG/COMM_C56.000 
Weighted Methods per Class (  weighting = unity )WMC1 19 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 5 
Information Flow measure (  inclusive )IF4 0 0.000
Information Flow measure (  visible )IF4v 0 0.000
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
ApplicationConnector(  QObject * )
+definition   +./core/controllers/application_connector.cpp:8
+
+
4 0 0------------
connect(   )
+definition   +./core/controllers/application_connector.cpp:13
+
+
15 9 0------******
connectDeleteRFLinks(   )
+definition   +./core/controllers/application_connector.cpp:145
+
+
14 3 0------------
connectSelfReferenceTableLinks(   )
+definition   +./core/controllers/application_connector.cpp:111
+
+
10 3 0------------
connectTablePairLinks(   )
+definition   +./core/controllers/application_connector.cpp:123
+
+
9 3 0------------
connectUpdateDeleteRFLinks(   )
+definition   +./core/controllers/application_connector.cpp:134
+
+
9 3 0------------
flattenLinkList(  const QVector & )
+definition   +./core/controllers/application_connector.cpp:60
+
+
8 2 0------------
getAddress(  const QObject * )
+definition   +./core/controllers/application_connector.cpp:268
+
+
3 2 0------------
getMetaClassName(  const QMetaObject * )
+definition   +./core/controllers/application_connector.cpp:273
+
+
2 2 0------------
getMethodSignature(  const QMetaObject *,  const char *,  bool )
+definition   +./core/controllers/application_connector.cpp:277
+
+
14 6 0------******
initializeDeleteCandidates(   )
+definition   +./core/controllers/application_connector.cpp:97
+
+
10 1 1------------
initializeSelfReferenceTableLinks(   )
+definition   +./core/controllers/application_connector.cpp:34
+
+
8 1 0------------
initializeTablePairLinks(   )
+definition   +./core/controllers/application_connector.cpp:44
+
+
14 1 0------------
initializeUpdateDeleteCandidates(   )
+definition   +./core/controllers/application_connector.cpp:70
+
+
24 1 0******------
linkRepositoryToFinder(  const QString &,  const QString & )
+definition   +./core/controllers/application_connector.cpp:221
+
+
24 7 0************
linkRepositoryToModel(  const QString &,  const QString & )
+definition   +./core/controllers/application_connector.cpp:197
+
+
19 6 0------******
pairTableConnections(   )
+definition   +./core/controllers/application_connector.cpp:163
+
+
12 2 0------------
repositoryToFinderConnections(   )
+definition   +./core/controllers/application_connector.cpp:252
+
+
12 2 0------------
singleTableConnections(   )
+definition   +./core/controllers/application_connector.cpp:180
+
+
13 2 0------------
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +QMetaObject [V]
+pass by reference   +./core/controllers/application_connector.cpp:273
+pass by reference   +./core/controllers/application_connector.cpp:277
+
+
+QObject [V]
+pass by reference   +./core/controllers/application_connector.cpp:8
+pass by reference   +./core/controllers/application_connector.cpp:268
+
+
+QString [V]
+pass by reference   +./core/controllers/application_connector.cpp:198
+pass by reference   +./core/controllers/application_connector.cpp:199
+pass by reference   +./core/controllers/application_connector.cpp:222
+pass by reference   +./core/controllers/application_connector.cpp:223
+
+
+QVector [V]
+pass by reference   +./core/controllers/application_connector.cpp:60
+
+
+bool [CV]
+pass by value   +./core/controllers/application_connector.cpp:279
+
+
+  +
+ diff --git a/artifacts/cccc/ApplicationConnector.xml b/artifacts/cccc/ApplicationConnector.xml new file mode 100644 index 0000000..b5cec8a --- /dev/null +++ b/artifacts/cccc/ApplicationConnector.xml @@ -0,0 +1,321 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +ApplicationConnector(QObject *) + +definition + + + + + + + + + +connect() + +definition + + + + + + + + + +connectDeleteRFLinks() + +definition + + + + + + + + + +connectSelfReferenceTableLinks() + +definition + + + + + + + + + +connectTablePairLinks() + +definition + + + + + + + + + +connectUpdateDeleteRFLinks() + +definition + + + + + + + + + +flattenLinkList(const QVector &) + +definition + + + + + + + + + +getAddress(const QObject *) + +definition + + + + + + + + + +getMetaClassName(const QMetaObject *) + +definition + + + + + + + + + +getMethodSignature(const QMetaObject *,const char *,bool) + +definition + + + + + + + + + +initializeDeleteCandidates() + +definition + + + + + + + + + +initializeSelfReferenceTableLinks() + +definition + + + + + + + + + +initializeTablePairLinks() + +definition + + + + + + + + + +initializeUpdateDeleteCandidates() + +definition + + + + + + + + + +linkRepositoryToFinder(const QString &,const QString &) + +definition + + + + + + + + + +linkRepositoryToModel(const QString &,const QString &) + +definition + + + + + + + + + +pairTableConnections() + +definition + + + + + + + + + +repositoryToFinderConnections() + +definition + + + + + + + + + +singleTableConnections() + +definition + + + + + + + + + + + +ApplicationConnector + + + +QMetaObject +true +false + +pass by reference + + + +pass by reference + + +QObject +true +false + +pass by reference + + + +pass by reference + + +QString +true +false + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + +QVector +true +false + +pass by reference + + +bool +true +true + +pass by value + + + + + + diff --git a/artifacts/cccc/ApplicationController.html b/artifacts/cccc/ApplicationController.html new file mode 100644 index 0000000..6f5b93e --- /dev/null +++ b/artifacts/cccc/ApplicationController.html @@ -0,0 +1,115 @@ + +Detailed report on module ApplicationController + + + +

Detailed report on module ApplicationController

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 96 16
McCabe's Cyclomatic NumberMVG 20 3
Lines of CommentCOM 15 2.500
LOC/COML_C 6.400 
MVG/COMM_C 1.333 
Weighted Methods per Class (  weighting = unity )WMC1 6 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 2 
Information Flow measure (  inclusive )IF4 0 0.000
Information Flow measure (  visible )IF4v 0 0.000
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + + + + + + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
connectToDatabase(  const QString & )
+definition   +./core/controllers/application_controller.cpp:119
+
+
8 3 0------------
ensureDatabaseExists(  const QString & )
+definition   +./core/controllers/application_controller.cpp:50
+
+
43 5 12 3.583 0.417
loadTranslations(  const QString &,  const QString &,  const QString &,  const QString & )
+definition   +./core/controllers/application_controller.cpp:129
+
+
19 5 0------******
onLoginFailed(   )
+definition   +./core/controllers/application_controller.cpp:108
+
+
4 0 0------------
onLoginSuccessful(  qint32,  qint32 )
+definition   +./core/controllers/application_controller.cpp:113
+
+
5 0 0------------
setupApplication(   )
+definition   +./core/controllers/application_controller.cpp:21
+
+
17 7 3------ 2.333
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +QString [V]
+pass by reference   +./core/controllers/application_controller.cpp:51
+pass by reference   +./core/controllers/application_controller.cpp:119
+pass by reference   +./core/controllers/application_controller.cpp:129
+pass by reference   +./core/controllers/application_controller.cpp:130
+pass by reference   +./core/controllers/application_controller.cpp:131
+pass by reference   +./core/controllers/application_controller.cpp:132
+
+
+qint32 [CV]
+pass by value   +./core/controllers/application_controller.cpp:113
+pass by value   +./core/controllers/application_controller.cpp:114
+
+
+  +
+ diff --git a/artifacts/cccc/ApplicationController.xml b/artifacts/cccc/ApplicationController.xml new file mode 100644 index 0000000..f06c3d0 --- /dev/null +++ b/artifacts/cccc/ApplicationController.xml @@ -0,0 +1,148 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +connectToDatabase(const QString &) + +definition + + + + + + + + + +ensureDatabaseExists(const QString &) + +definition + + + + + + + + + +loadTranslations(const QString &,const QString &,const QString &,const QString &) + +definition + + + + + + + + + +onLoginFailed() + +definition + + + + + + + + + +onLoginSuccessful(qint32,qint32) + +definition + + + + + + + + + +setupApplication() + +definition + + + + + + + + + + + +ApplicationController + + + +QString +true +false + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + +qint32 +true +true + +pass by value + + + +pass by value + + + + + + diff --git a/artifacts/cccc/AuthDialog.html b/artifacts/cccc/AuthDialog.html new file mode 100644 index 0000000..d1ef972 --- /dev/null +++ b/artifacts/cccc/AuthDialog.html @@ -0,0 +1,118 @@ + +Detailed report on module AuthDialog + + + +

Detailed report on module AuthDialog

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 60 9
McCabe's Cyclomatic NumberMVG 11 2
Lines of CommentCOM 1 0.143
LOC/COML_C60.000 
MVG/COMM_C11.000 
Weighted Methods per Class (  weighting = unity )WMC1 7 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 3 
Information Flow measure (  inclusive )IF4 0 0.000
Information Flow measure (  visible )IF4v 0 0.000
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + + + + + + + + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
AuthDialog(  QWidget * )
+definition   +./ui/dialogs/auth_dialog.cpp:14
+
+
8 1 1------------
hashPassword(  const QString &,  const QString & )
+definition   +./ui/dialogs/auth_dialog.cpp:82
+
+
5 1 0------------
initializeRepositories(   )
+definition   +./ui/dialogs/auth_dialog.cpp:25
+
+
9 2 0------------
onCancelClicked(   )
+definition   +./ui/dialogs/auth_dialog.cpp:43
+
+
4 0 0------------
onLoginClicked(   )
+definition   +./ui/dialogs/auth_dialog.cpp:48
+
+
25 6 0************
setupConnections(   )
+definition   +./ui/dialogs/auth_dialog.cpp:38
+
+
4 0 0------------
verifyPassword(  const QString &,  const UserDTO & )
+definition   +./ui/dialogs/auth_dialog.cpp:90
+
+
5 1 0------------
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +QString [V]
+pass by reference   +./ui/dialogs/auth_dialog.cpp:82
+pass by reference   +./ui/dialogs/auth_dialog.cpp:82
+pass by reference   +./ui/dialogs/auth_dialog.cpp:90
+
+
+QWidget [V]
+pass by reference   +./ui/dialogs/auth_dialog.cpp:14
+
+
+UserDTO [V]
+pass by reference   +./ui/dialogs/auth_dialog.cpp:91
+
+
+  +
+ diff --git a/artifacts/cccc/AuthDialog.xml b/artifacts/cccc/AuthDialog.xml new file mode 100644 index 0000000..793143b --- /dev/null +++ b/artifacts/cccc/AuthDialog.xml @@ -0,0 +1,151 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +AuthDialog(QWidget *) + +definition + + + + + + + + + +hashPassword(const QString &,const QString &) + +definition + + + + + + + + + +initializeRepositories() + +definition + + + + + + + + + +onCancelClicked() + +definition + + + + + + + + + +onLoginClicked() + +definition + + + + + + + + + +setupConnections() + +definition + + + + + + + + + +verifyPassword(const QString &,const UserDTO &) + +definition + + + + + + + + + + + +AuthDialog + + + +QString +true +false + +pass by reference + + + +pass by reference + + + +pass by reference + + +QWidget +true +false + +pass by reference + + +UserDTO +true +false + +pass by reference + + + + + + diff --git a/artifacts/cccc/BaseGenerator.html b/artifacts/cccc/BaseGenerator.html new file mode 100644 index 0000000..cc2967a --- /dev/null +++ b/artifacts/cccc/BaseGenerator.html @@ -0,0 +1,63 @@ + +Detailed report on module BaseGenerator + + + +

Detailed report on module BaseGenerator

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0 0
McCabe's Cyclomatic NumberMVG 0 0
Lines of CommentCOM 0 0.000
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 1 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 0 
Information Flow measure (  inclusive )IF4 0 0.000
Information Flow measure (  visible )IF4v 0 0.000
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + + +
Function prototypeLOCMVGCOML_CM_C
shouldLogAllSuccesses(   )
+declaration   +./core/services/base_generator.cpp:7
+
+
0 0 0------------
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +  +
+ diff --git a/artifacts/cccc/BaseGenerator.xml b/artifacts/cccc/BaseGenerator.xml new file mode 100644 index 0000000..7744a00 --- /dev/null +++ b/artifacts/cccc/BaseGenerator.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +shouldLogAllSuccesses() + +declaration + + + + + + + + + + + +BaseGenerator + + + + + + + diff --git a/artifacts/cccc/BaseSqlTableModel.html b/artifacts/cccc/BaseSqlTableModel.html new file mode 100644 index 0000000..5765c37 --- /dev/null +++ b/artifacts/cccc/BaseSqlTableModel.html @@ -0,0 +1,131 @@ + +Detailed report on module BaseSqlTableModel + + + +

Detailed report on module BaseSqlTableModel

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 53 7
McCabe's Cyclomatic NumberMVG 9 1
Lines of CommentCOM 17 2.125
LOC/COML_C 3.118 
MVG/COMM_C 0.529 
Weighted Methods per Class (  weighting = unity )WMC1 8 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 4 
Information Flow measure (  inclusive )IF4 0 0.000
Information Flow measure (  visible )IF4v 0 0.000
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + + + + + + + + + + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
BaseSqlTableModel(  QObject *,  QSqlDatabase )
+definition   +./ui/models/base_sql_table_model.cpp:8
+
+
2 0 0------------
createMultiColumnFilter(  const QString & )
+definition   +./ui/models/base_sql_table_model.cpp:68
+
+
7 2 0------------
createUpdateFilterMessage(  const QString & )
+definition   +./ui/models/base_sql_table_model.cpp:79
+
+
14 2 0------------
data(  const QModelIndex &,  int )
+definition   +./ui/models/base_sql_table_model.cpp:23
+
+
3 1 17------------
refreshAll(   )
+definition   +./ui/models/base_sql_table_model.cpp:11
+
+
10 2 0------------
resetFilter(   )
+definition   +./ui/models/base_sql_table_model.cpp:49
+
+
4 0 0------------
setMultiColumnFilter(  const QString & )
+definition   +./ui/models/base_sql_table_model.cpp:54
+
+
9 2 0------------
setTable(  const QString & )
+definition   +./ui/models/base_sql_table_model.cpp:44
+
+
4 0 0------------
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +QModelIndex [V]
+pass by reference   +./ui/models/base_sql_table_model.cpp:23
+
+
+QObject [V]
+pass by reference   +./ui/models/base_sql_table_model.cpp:8
+
+
+QSqlDatabase [CV]
+pass by value   +./ui/models/base_sql_table_model.cpp:8
+
+
+QString [V]
+pass by reference   +./ui/models/base_sql_table_model.cpp:44
+pass by reference   +./ui/models/base_sql_table_model.cpp:54
+pass by reference   +./ui/models/base_sql_table_model.cpp:68
+pass by reference   +./ui/models/base_sql_table_model.cpp:79
+
+
+  +
+ diff --git a/artifacts/cccc/BaseSqlTableModel.xml b/artifacts/cccc/BaseSqlTableModel.xml new file mode 100644 index 0000000..fccbe50 --- /dev/null +++ b/artifacts/cccc/BaseSqlTableModel.xml @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +BaseSqlTableModel(QObject *,QSqlDatabase) + +definition + + + + + + + + + +createMultiColumnFilter(const QString &) + +definition + + + + + + + + + +createUpdateFilterMessage(const QString &) + +definition + + + + + + + + + +data(const QModelIndex &,int) + +definition + + + + + + + + + +refreshAll() + +definition + + + + + + + + + +resetFilter() + +definition + + + + + + + + + +setMultiColumnFilter(const QString &) + +definition + + + + + + + + + +setTable(const QString &) + +definition + + + + + + + + + + + +BaseSqlTableModel + + + +QModelIndex +true +false + +pass by reference + + +QObject +true +false + +pass by reference + + +QSqlDatabase +true +true + +pass by value + + +QString +true +false + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + + + + diff --git a/artifacts/cccc/BaseSqlTableRepository.html b/artifacts/cccc/BaseSqlTableRepository.html new file mode 100644 index 0000000..ccba8c4 --- /dev/null +++ b/artifacts/cccc/BaseSqlTableRepository.html @@ -0,0 +1,79 @@ + +Detailed report on module BaseSqlTableRepository + + + +

Detailed report on module BaseSqlTableRepository

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 16 8
McCabe's Cyclomatic NumberMVG 3 1
Lines of CommentCOM 0 0.000
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 2 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 2 
Information Flow measure (  inclusive )IF4 0 0.000
Information Flow measure (  visible )IF4v 0 0.000
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + + + + +
Function prototypeLOCMVGCOML_CM_C
BaseSqlTableRepository(  QSqlDatabase &,  QObject * )
+definition   +./data/sql/base_sql_table_repository.cpp:6
+
+
9 1 0------------
foreignKeysOnQuery(   )
+definition   +./data/sql/base_sql_table_repository.cpp:16
+
+
7 2 0------------
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +QObject [V]
+pass by reference   +./data/sql/base_sql_table_repository.cpp:7
+
+
+QSqlDatabase [V]
+pass by reference   +./data/sql/base_sql_table_repository.cpp:6
+
+
+  +
+ diff --git a/artifacts/cccc/BaseSqlTableRepository.xml b/artifacts/cccc/BaseSqlTableRepository.xml new file mode 100644 index 0000000..c537a4c --- /dev/null +++ b/artifacts/cccc/BaseSqlTableRepository.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +BaseSqlTableRepository(QSqlDatabase &,QObject *) + +definition + + + + + + + + + +foreignKeysOnQuery() + +definition + + + + + + + + + + + +BaseSqlTableRepository + + + +QObject +true +false + +pass by reference + + +QSqlDatabase +true +false + +pass by reference + + + + + + diff --git a/artifacts/cccc/ConnectionList.html b/artifacts/cccc/ConnectionList.html new file mode 100644 index 0000000..169d087 --- /dev/null +++ b/artifacts/cccc/ConnectionList.html @@ -0,0 +1,65 @@ + +Detailed report on module ConnectionList + + + +

Detailed report on module ConnectionList

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+ApplicationConnector [V]
+pass by reference   +./core/controllers/application_connector.h:129
+pass by reference   +./core/controllers/application_connector.h:155
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/ConnectionList.xml b/artifacts/cccc/ConnectionList.xml new file mode 100644 index 0000000..a13a0f3 --- /dev/null +++ b/artifacts/cccc/ConnectionList.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +ConnectionList + +ApplicationConnector +true +false + +pass by reference + + + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/CreateGenreRequest.html b/artifacts/cccc/CreateGenreRequest.html new file mode 100644 index 0000000..0c186ab --- /dev/null +++ b/artifacts/cccc/CreateGenreRequest.html @@ -0,0 +1,63 @@ + +Detailed report on module CreateGenreRequest + + + +

Detailed report on module CreateGenreRequest

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+GenresRepository [V]
+pass by reference   +./data/sql/genres_repository.cpp:14
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/CreateGenreRequest.xml b/artifacts/cccc/CreateGenreRequest.xml new file mode 100644 index 0000000..d58340f --- /dev/null +++ b/artifacts/cccc/CreateGenreRequest.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +CreateGenreRequest + +GenresRepository +true +false + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/CreateHallRequest.html b/artifacts/cccc/CreateHallRequest.html new file mode 100644 index 0000000..0d5a8d6 --- /dev/null +++ b/artifacts/cccc/CreateHallRequest.html @@ -0,0 +1,63 @@ + +Detailed report on module CreateHallRequest + + + +

Detailed report on module CreateHallRequest

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+HallsRepository [V]
+pass by reference   +./data/sql/halls_repository.cpp:13
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/CreateHallRequest.xml b/artifacts/cccc/CreateHallRequest.xml new file mode 100644 index 0000000..1e87461 --- /dev/null +++ b/artifacts/cccc/CreateHallRequest.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +CreateHallRequest + +HallsRepository +true +false + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/CreateMovieRequest.html b/artifacts/cccc/CreateMovieRequest.html new file mode 100644 index 0000000..21b6e5f --- /dev/null +++ b/artifacts/cccc/CreateMovieRequest.html @@ -0,0 +1,63 @@ + +Detailed report on module CreateMovieRequest + + + +

Detailed report on module CreateMovieRequest

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+MoviesRepository [V]
+pass by reference   +./data/sql/movies_repository.cpp:14
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/CreateMovieRequest.xml b/artifacts/cccc/CreateMovieRequest.xml new file mode 100644 index 0000000..12c6c48 --- /dev/null +++ b/artifacts/cccc/CreateMovieRequest.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +CreateMovieRequest + +MoviesRepository +true +false + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/CreateRefundRequest.html b/artifacts/cccc/CreateRefundRequest.html new file mode 100644 index 0000000..78de493 --- /dev/null +++ b/artifacts/cccc/CreateRefundRequest.html @@ -0,0 +1,63 @@ + +Detailed report on module CreateRefundRequest + + + +

Detailed report on module CreateRefundRequest

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+RefundsRepository [V]
+pass by reference   +./data/sql/refunds_repository.cpp:14
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/CreateRefundRequest.xml b/artifacts/cccc/CreateRefundRequest.xml new file mode 100644 index 0000000..5d4fe73 --- /dev/null +++ b/artifacts/cccc/CreateRefundRequest.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +CreateRefundRequest + +RefundsRepository +true +false + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/CreateRoleRequest.html b/artifacts/cccc/CreateRoleRequest.html new file mode 100644 index 0000000..9ded2fb --- /dev/null +++ b/artifacts/cccc/CreateRoleRequest.html @@ -0,0 +1,63 @@ + +Detailed report on module CreateRoleRequest + + + +

Detailed report on module CreateRoleRequest

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+RolesRepository [V]
+pass by reference   +./data/sql/roles_repository.cpp:13
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/CreateRoleRequest.xml b/artifacts/cccc/CreateRoleRequest.xml new file mode 100644 index 0000000..47cc318 --- /dev/null +++ b/artifacts/cccc/CreateRoleRequest.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +CreateRoleRequest + +RolesRepository +true +false + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/CreateSessionRequest.html b/artifacts/cccc/CreateSessionRequest.html new file mode 100644 index 0000000..9da48e4 --- /dev/null +++ b/artifacts/cccc/CreateSessionRequest.html @@ -0,0 +1,63 @@ + +Detailed report on module CreateSessionRequest + + + +

Detailed report on module CreateSessionRequest

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+SessionsRepository [V]
+pass by reference   +./data/sql/sessions_repository.cpp:14
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/CreateSessionRequest.xml b/artifacts/cccc/CreateSessionRequest.xml new file mode 100644 index 0000000..9f48e5d --- /dev/null +++ b/artifacts/cccc/CreateSessionRequest.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +CreateSessionRequest + +SessionsRepository +true +false + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/CreateTicketRequest.html b/artifacts/cccc/CreateTicketRequest.html new file mode 100644 index 0000000..0e08921 --- /dev/null +++ b/artifacts/cccc/CreateTicketRequest.html @@ -0,0 +1,63 @@ + +Detailed report on module CreateTicketRequest + + + +

Detailed report on module CreateTicketRequest

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+TicketsRepository [V]
+pass by reference   +./data/sql/tickets_repository.cpp:14
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/CreateTicketRequest.xml b/artifacts/cccc/CreateTicketRequest.xml new file mode 100644 index 0000000..095bbc5 --- /dev/null +++ b/artifacts/cccc/CreateTicketRequest.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +CreateTicketRequest + +TicketsRepository +true +false + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/CreateUserRequest.html b/artifacts/cccc/CreateUserRequest.html new file mode 100644 index 0000000..a1bd60a --- /dev/null +++ b/artifacts/cccc/CreateUserRequest.html @@ -0,0 +1,63 @@ + +Detailed report on module CreateUserRequest + + + +

Detailed report on module CreateUserRequest

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+UsersRepository [V]
+pass by reference   +./data/sql/users_repository.cpp:13
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/CreateUserRequest.xml b/artifacts/cccc/CreateUserRequest.xml new file mode 100644 index 0000000..e12a948 --- /dev/null +++ b/artifacts/cccc/CreateUserRequest.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +CreateUserRequest + +UsersRepository +true +false + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/DataRepositorySignals.html b/artifacts/cccc/DataRepositorySignals.html new file mode 100644 index 0000000..16a634d --- /dev/null +++ b/artifacts/cccc/DataRepositorySignals.html @@ -0,0 +1,72 @@ + +Detailed report on module DataRepositorySignals + + + +

Detailed report on module DataRepositorySignals

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 5******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 2********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 1 
Number of ChildrenNOC 1 
Coupling between objectsCBO 2 
Information Flow measure (  inclusive )IF4 1********
Information Flow measure (  visible )IF4v 1********
Information Flow measure (  concrete )IF4c 1********
+

Definitions and Declarations

+ + + + + +
DescriptionLOCMVGCOML_CM_C
definition   +./data/sql/data_repository_signals.h:7
+
5 0 2------------
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+BaseSqlTableRepository [CV]
+inheritance   +./data/sql/base_sql_table_repository.h:7
+
+
+  +
+QObject [CV]
+inheritance   +./data/sql/data_repository_signals.h:7
+
+
+  +
+ diff --git a/artifacts/cccc/DataRepositorySignals.xml b/artifacts/cccc/DataRepositorySignals.xml new file mode 100644 index 0000000..1a0f6ca --- /dev/null +++ b/artifacts/cccc/DataRepositorySignals.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +definition + + + + + + + + + + + +DataRepositorySignals + +BaseSqlTableRepository +true +true + +inheritance + + + + +QObject +true +true + +inheritance + + + + + + diff --git a/artifacts/cccc/DatabaseInterface.html b/artifacts/cccc/DatabaseInterface.html new file mode 100644 index 0000000..03f39b6 --- /dev/null +++ b/artifacts/cccc/DatabaseInterface.html @@ -0,0 +1,258 @@ + +Detailed report on module DatabaseInterface + + + +

Detailed report on module DatabaseInterface

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 35 1
McCabe's Cyclomatic NumberMVG 0 0
Lines of CommentCOM 8 0.250
LOC/COML_C 4.375 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 32 
Weighted Methods per Class (  weighting = visible )WMCv 6 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 1 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0 0.000
Information Flow measure (  visible )IF4v 0 0.000
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + + + +
DescriptionLOCMVGCOML_CM_C
definition   +./tests_schema/tests_sources/database_interface.h:138
+
3 0 1------------
+

Functions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
addGenre(  const NewGenre & )
+declaration   +./tests_schema/tests_sources/database_interface.h:146
+
+
1 0 1------------
addHall(  const NewHall & )
+declaration   +./tests_schema/tests_sources/database_interface.h:160
+
+
1 0 1------------
addMovie(  const NewMovie & )
+declaration   +./tests_schema/tests_sources/database_interface.h:153
+
+
1 0 1------------
addRefund(  const NewRefund & )
+declaration   +./tests_schema/tests_sources/database_interface.h:181
+
+
1 0 1------------
addSession(  const NewSession & )
+declaration   +./tests_schema/tests_sources/database_interface.h:167
+
+
1 0 1------------
addTicket(  const NewTicket & )
+declaration   +./tests_schema/tests_sources/database_interface.h:174
+
+
1 0 1------------
getAllGenres(   )
+declaration   +./tests_schema/tests_sources/database_interface.h:150
+
+
1 0 0------------
getAllHalls(   )
+declaration   +./tests_schema/tests_sources/database_interface.h:164
+
+
1 0 0------------
getAllMovies(   )
+declaration   +./tests_schema/tests_sources/database_interface.h:157
+
+
1 0 0------------
getAllRefunds(   )
+declaration   +./tests_schema/tests_sources/database_interface.h:185
+
+
1 0 0------------
getAllSessions(   )
+declaration   +./tests_schema/tests_sources/database_interface.h:171
+
+
1 0 0------------
getAllTickets(   )
+declaration   +./tests_schema/tests_sources/database_interface.h:178
+
+
1 0 0------------
getGenre(  int )
+declaration   +./tests_schema/tests_sources/database_interface.h:149
+
+
1 0 0------------
getHall(  int )
+declaration   +./tests_schema/tests_sources/database_interface.h:163
+
+
1 0 0------------
getMovie(  int )
+declaration   +./tests_schema/tests_sources/database_interface.h:156
+
+
1 0 0------------
getRefund(  int )
+declaration   +./tests_schema/tests_sources/database_interface.h:184
+
+
1 0 0------------
getSession(  int )
+declaration   +./tests_schema/tests_sources/database_interface.h:170
+
+
1 0 0------------
getTicket(  int )
+declaration   +./tests_schema/tests_sources/database_interface.h:177
+
+
1 0 0------------
isDatabaseAvailable(   )
+declaration   +./tests_schema/tests_sources/database_interface.h:143
+
+
1 0 1------------
removeGenre(  int )
+declaration   +./tests_schema/tests_sources/database_interface.h:147
+
+
1 0 0------------
removeHall(  int )
+declaration   +./tests_schema/tests_sources/database_interface.h:161
+
+
1 0 0------------
removeMovie(  int )
+declaration   +./tests_schema/tests_sources/database_interface.h:154
+
+
1 0 0------------
removeRefund(  int )
+declaration   +./tests_schema/tests_sources/database_interface.h:182
+
+
1 0 0------------
removeSession(  int )
+declaration   +./tests_schema/tests_sources/database_interface.h:168
+
+
1 0 0------------
removeTicket(  int )
+declaration   +./tests_schema/tests_sources/database_interface.h:175
+
+
1 0 0------------
updateGenre(  const Genre & )
+declaration   +./tests_schema/tests_sources/database_interface.h:148
+
+
1 0 0------------
updateHall(  const Hall & )
+declaration   +./tests_schema/tests_sources/database_interface.h:162
+
+
1 0 0------------
updateMovie(  const Movie & )
+declaration   +./tests_schema/tests_sources/database_interface.h:155
+
+
1 0 0------------
updateRefund(  const Refund & )
+declaration   +./tests_schema/tests_sources/database_interface.h:183
+
+
1 0 0------------
updateSession(  const Session & )
+declaration   +./tests_schema/tests_sources/database_interface.h:169
+
+
1 0 0------------
updateTicket(  const Ticket & )
+declaration   +./tests_schema/tests_sources/database_interface.h:176
+
+
1 0 0------------
~DatabaseInterface(   )
+definition   +./tests_schema/tests_sources/database_interface.h:140
+
+
1 0 0------------
+

Relationships

+ + + + + +
ClientsSuppliers
+SQLiteDatabase [CV]
+inheritance   +./tests_schema/tests_sources/sqlite_database.h:12
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/DatabaseInterface.xml b/artifacts/cccc/DatabaseInterface.xml new file mode 100644 index 0000000..0d8df05 --- /dev/null +++ b/artifacts/cccc/DatabaseInterface.xml @@ -0,0 +1,436 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +definition + + + + + + + + + +addGenre(const NewGenre &) + +declaration + + + + + + + + + +addHall(const NewHall &) + +declaration + + + + + + + + + +addMovie(const NewMovie &) + +declaration + + + + + + + + + +addRefund(const NewRefund &) + +declaration + + + + + + + + + +addSession(const NewSession &) + +declaration + + + + + + + + + +addTicket(const NewTicket &) + +declaration + + + + + + + + + +getAllGenres() + +declaration + + + + + + + + + +getAllHalls() + +declaration + + + + + + + + + +getAllMovies() + +declaration + + + + + + + + + +getAllRefunds() + +declaration + + + + + + + + + +getAllSessions() + +declaration + + + + + + + + + +getAllTickets() + +declaration + + + + + + + + + +getGenre(int) + +declaration + + + + + + + + + +getHall(int) + +declaration + + + + + + + + + +getMovie(int) + +declaration + + + + + + + + + +getRefund(int) + +declaration + + + + + + + + + +getSession(int) + +declaration + + + + + + + + + +getTicket(int) + +declaration + + + + + + + + + +isDatabaseAvailable() + +declaration + + + + + + + + + +removeGenre(int) + +declaration + + + + + + + + + +removeHall(int) + +declaration + + + + + + + + + +removeMovie(int) + +declaration + + + + + + + + + +removeRefund(int) + +declaration + + + + + + + + + +removeSession(int) + +declaration + + + + + + + + + +removeTicket(int) + +declaration + + + + + + + + + +updateGenre(const Genre &) + +declaration + + + + + + + + + +updateHall(const Hall &) + +declaration + + + + + + + + + +updateMovie(const Movie &) + +declaration + + + + + + + + + +updateRefund(const Refund &) + +declaration + + + + + + + + + +updateSession(const Session &) + +declaration + + + + + + + + + +updateTicket(const Ticket &) + +declaration + + + + + + + + + +~DatabaseInterface() + +definition + + + + + + + + + + + +DatabaseInterface + +SQLiteDatabase +true +true + +inheritance + + + + + + + + diff --git a/artifacts/cccc/DatabaseManager.html b/artifacts/cccc/DatabaseManager.html new file mode 100644 index 0000000..b58ec84 --- /dev/null +++ b/artifacts/cccc/DatabaseManager.html @@ -0,0 +1,104 @@ + +Detailed report on module DatabaseManager + + + +

Detailed report on module DatabaseManager

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 79 16
McCabe's Cyclomatic NumberMVG 19 4
Lines of CommentCOM 2 0.400
LOC/COML_C39.500 
MVG/COMM_C 9.500 
Weighted Methods per Class (  weighting = unity )WMC1 5 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 3 
Information Flow measure (  inclusive )IF4 0 0.000
Information Flow measure (  visible )IF4v 0 0.000
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + + + + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
connectToDefaultDatabase(  const QString & )
+definition   +./core/db/database_manager.cpp:67
+
+
18 6 1------ 6.000
createDefaultDatabaseIfMissing(  const QString & )
+definition   +./core/db/database_manager.cpp:20
+
+
35 8 135.000 8.000
disconnectDefaultDatabase(   )
+definition   +./core/db/database_manager.cpp:92
+
+
7 1 0------------
executeSqlFiles(  const QStringList &,  QSqlDatabase & )
+definition   +./core/db/database_manager.cpp:100
+
+
12 4 0------------
~DatabaseManager(   )
+definition   +./core/db/database_manager.cpp:9
+
+
7 0 0------------
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +QSqlDatabase [V]
+pass by reference   +./core/db/database_manager.cpp:101
+
+
+QString [V]
+pass by reference   +./core/db/database_manager.cpp:21
+pass by reference   +./core/db/database_manager.cpp:68
+
+
+QStringList [V]
+pass by reference   +./core/db/database_manager.cpp:100
+
+
+  +
+ diff --git a/artifacts/cccc/DatabaseManager.xml b/artifacts/cccc/DatabaseManager.xml new file mode 100644 index 0000000..8a26b05 --- /dev/null +++ b/artifacts/cccc/DatabaseManager.xml @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +connectToDefaultDatabase(const QString &) + +definition + + + + + + + + + +createDefaultDatabaseIfMissing(const QString &) + +definition + + + + + + + + + +disconnectDefaultDatabase() + +definition + + + + + + + + + +executeSqlFiles(const QStringList &,QSqlDatabase &) + +definition + + + + + + + + + +~DatabaseManager() + +definition + + + + + + + + + + + +DatabaseManager + + + +QSqlDatabase +true +false + +pass by reference + + +QString +true +false + +pass by reference + + + +pass by reference + + +QStringList +true +false + +pass by reference + + + + + + diff --git a/artifacts/cccc/DateTimeDelegate.html b/artifacts/cccc/DateTimeDelegate.html new file mode 100644 index 0000000..5634682 --- /dev/null +++ b/artifacts/cccc/DateTimeDelegate.html @@ -0,0 +1,84 @@ + +Detailed report on module DateTimeDelegate + + + +

Detailed report on module DateTimeDelegate

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 14 7
McCabe's Cyclomatic NumberMVG 4 2
Lines of CommentCOM 2 1.000
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 2 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 3 
Information Flow measure (  inclusive )IF4 0 0.000
Information Flow measure (  visible )IF4v 0 0.000
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + + + + +
Function prototypeLOCMVGCOML_CM_C
DateTimeDelegate(  QObject * )
+definition   +./ui/delegates/date_time_delegate.cpp:3
+
+
2 0 0------------
displayText(  const QVariant &,  const QLocale & )
+definition   +./ui/delegates/date_time_delegate.cpp:6
+
+
12 4 2------------
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +QLocale [V]
+pass by reference   +./ui/delegates/date_time_delegate.cpp:7
+
+
+QObject [V]
+pass by reference   +./ui/delegates/date_time_delegate.cpp:3
+
+
+QVariant [V]
+pass by reference   +./ui/delegates/date_time_delegate.cpp:6
+
+
+  +
+ diff --git a/artifacts/cccc/DateTimeDelegate.xml b/artifacts/cccc/DateTimeDelegate.xml new file mode 100644 index 0000000..6a17d66 --- /dev/null +++ b/artifacts/cccc/DateTimeDelegate.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +DateTimeDelegate(QObject *) + +definition + + + + + + + + + +displayText(const QVariant &,const QLocale &) + +definition + + + + + + + + + + + +DateTimeDelegate + + + +QLocale +true +false + +pass by reference + + +QObject +true +false + +pass by reference + + +QVariant +true +false + +pass by reference + + + + + + diff --git a/artifacts/cccc/DateTimeGenerator.html b/artifacts/cccc/DateTimeGenerator.html new file mode 100644 index 0000000..b6ec50c --- /dev/null +++ b/artifacts/cccc/DateTimeGenerator.html @@ -0,0 +1,91 @@ + +Detailed report on module DateTimeGenerator + + + +

Detailed report on module DateTimeGenerator

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 58 19
McCabe's Cyclomatic NumberMVG 12 4
Lines of CommentCOM 0 0.000
LOC/COML_C****** 
MVG/COMM_C****** 
Weighted Methods per Class (  weighting = unity )WMC1 3 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 2 
Information Flow measure (  inclusive )IF4 0 0.000
Information Flow measure (  visible )IF4v 0 0.000
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
DateTimeGenerator(  const QPair &,  const QPair & )
+definition   +./core/services/date_time_generator.cpp:3
+
+
22 6 0************
generate(  const QDateTime & )
+definition   +./core/services/date_time_generator.cpp:29
+
+
20 2 0******------
generate(  const QDateTime &,  const QDateTime & )
+definition   +./core/services/date_time_generator.cpp:56
+
+
16 4 0------------
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +QDateTime [V]
+pass by reference   +./core/services/date_time_generator.cpp:29
+pass by reference   +./core/services/date_time_generator.cpp:56
+pass by reference   +./core/services/date_time_generator.cpp:57
+
+
+QPair [V]
+pass by reference   +./core/services/date_time_generator.cpp:3
+pass by reference   +./core/services/date_time_generator.cpp:4
+
+
+  +
+ diff --git a/artifacts/cccc/DateTimeGenerator.xml b/artifacts/cccc/DateTimeGenerator.xml new file mode 100644 index 0000000..45271ed --- /dev/null +++ b/artifacts/cccc/DateTimeGenerator.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +DateTimeGenerator(const QPair &,const QPair &) + +definition + + + + + + + + + +generate(const QDateTime &) + +definition + + + + + + + + + +generate(const QDateTime &,const QDateTime &) + +definition + + + + + + + + + + + +DateTimeGenerator + + + +QDateTime +true +false + +pass by reference + + + +pass by reference + + + +pass by reference + + +QPair +true +false + +pass by reference + + + +pass by reference + + + + + + diff --git a/artifacts/cccc/DayManager.html b/artifacts/cccc/DayManager.html new file mode 100644 index 0000000..0078f2e --- /dev/null +++ b/artifacts/cccc/DayManager.html @@ -0,0 +1,214 @@ + +Detailed report on module DayManager + + + +

Detailed report on module DayManager

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 188 11
McCabe's Cyclomatic NumberMVG 64 4
Lines of CommentCOM 2 0.118
LOC/COML_C94.000 
MVG/COMM_C32.000 
Weighted Methods per Class (  weighting = unity )WMC1 17 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 3 
Information Flow measure (  inclusive )IF4 4 0.235
Information Flow measure (  visible )IF4v 4 0.235
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
DayManager(  const QTime &,  const QTime & )
+definition   +./core/utils/day_manager.cpp:6
+
+
3 0 0------------
addAvailableSlot(  const QTime &,  const QTime & )
+definition   +./core/utils/day_manager.cpp:10
+
+
9 5 0------******
calculatePossibleReservations(  qint64 )
+definition   +./core/utils/day_manager.cpp:207
+
+
9 2 0------------
duration(   )
+definition   +./core/utils/day_manager.cpp:217
+
+
12 4 1------------
duration(  const QTime & )
+definition   +./core/utils/day_manager.cpp:233
+
+
12 5 0------******
isAvailable(  ... )
+definition   +./core/utils/day_manager.cpp:42
+
+
6 3 0------------
reserve(  const QTime & )
+definition   +./core/utils/day_manager.cpp:20
+
+
17 7 0------******
reserveAvailableSlot(  QTime,  qint64 )
+definition   +./core/utils/day_manager.cpp:119
+
+
14 5 0------******
reserveAvailableSlotLeft(  QTime,  qint64 )
+definition   +./core/utils/day_manager.cpp:60
+
+
10 2 0------------
reserveAvailableSlotRandom(  QTime,  qint64 )
+definition   +./core/utils/day_manager.cpp:86
+
+
24 6 124.000 6.000
reserveAvailableSlotRight(  QTime,  qint64 )
+definition   +./core/utils/day_manager.cpp:73
+
+
10 2 0------------
reserveImpl(  qint64 )
+definition   +./core/utils/day_manager.cpp:182
+
+
15 6 0------******
reserveImplMaximal(  qint64 )
+definition   +./core/utils/day_manager.cpp:134
+
+
11 4 0------------
reserveImplMinimal(  qint64 )
+definition   +./core/utils/day_manager.cpp:147
+
+
12 4 0------------
reserveImplQuick(  qint64 )
+definition   +./core/utils/day_manager.cpp:161
+
+
8 4 0------------
reserveImplRandom(  qint64 )
+definition   +./core/utils/day_manager.cpp:171
+
+
9 3 0------------
setMinDuration(  const QTime & )
+definition   +./core/utils/day_manager.cpp:198
+
+
7 2 0------------
+

Relationships

+ + + + + +
ClientsSuppliers
+ReservationManager [V]
+pass by reference   +./core/utils/reservation_manager.cpp:6
+pass by reference   +./core/utils/reservation_manager.cpp:12
+
+
+  +
+QTime [CV]
+pass by reference   +./core/utils/day_manager.cpp:6
+pass by reference   +./core/utils/day_manager.cpp:6
+pass by reference   +./core/utils/day_manager.cpp:10
+pass by reference   +./core/utils/day_manager.cpp:10
+pass by reference   +./core/utils/day_manager.cpp:20
+pass by value   +./core/utils/day_manager.cpp:60
+pass by value   +./core/utils/day_manager.cpp:73
+pass by value   +./core/utils/day_manager.cpp:86
+pass by value   +./core/utils/day_manager.cpp:119
+pass by reference   +./core/utils/day_manager.cpp:198
+pass by reference   +./core/utils/day_manager.cpp:233
+
+
+qint64 [CV]
+pass by value   +./core/utils/day_manager.cpp:61
+pass by value   +./core/utils/day_manager.cpp:74
+pass by value   +./core/utils/day_manager.cpp:87
+pass by value   +./core/utils/day_manager.cpp:120
+pass by value   +./core/utils/day_manager.cpp:134
+pass by value   +./core/utils/day_manager.cpp:147
+pass by value   +./core/utils/day_manager.cpp:161
+pass by value   +./core/utils/day_manager.cpp:171
+pass by value   +./core/utils/day_manager.cpp:182
+pass by value   +./core/utils/day_manager.cpp:207
+
+
+  +
+ diff --git a/artifacts/cccc/DayManager.xml b/artifacts/cccc/DayManager.xml new file mode 100644 index 0000000..28d5f9b --- /dev/null +++ b/artifacts/cccc/DayManager.xml @@ -0,0 +1,343 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +DayManager(const QTime &,const QTime &) + +definition + + + + + + + + + +addAvailableSlot(const QTime &,const QTime &) + +definition + + + + + + + + + +calculatePossibleReservations(qint64) + +definition + + + + + + + + + +duration() + +definition + + + + + + + + + +duration(const QTime &) + +definition + + + + + + + + + +isAvailable(...) + +definition + + + + + + + + + +reserve(const QTime &) + +definition + + + + + + + + + +reserveAvailableSlot(QTime,qint64) + +definition + + + + + + + + + +reserveAvailableSlotLeft(QTime,qint64) + +definition + + + + + + + + + +reserveAvailableSlotRandom(QTime,qint64) + +definition + + + + + + + + + +reserveAvailableSlotRight(QTime,qint64) + +definition + + + + + + + + + +reserveImpl(qint64) + +definition + + + + + + + + + +reserveImplMaximal(qint64) + +definition + + + + + + + + + +reserveImplMinimal(qint64) + +definition + + + + + + + + + +reserveImplQuick(qint64) + +definition + + + + + + + + + +reserveImplRandom(qint64) + +definition + + + + + + + + + +setMinDuration(const QTime &) + +definition + + + + + + + + + + + +DayManager + +ReservationManager +true +false + +pass by reference + + + +pass by reference + + + + +QTime +true +true + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by value + + + +pass by value + + + +pass by value + + + +pass by value + + + +pass by reference + + + +pass by reference + + +qint64 +true +true + +pass by value + + + +pass by value + + + +pass by value + + + +pass by value + + + +pass by value + + + +pass by value + + + +pass by value + + + +pass by value + + + +pass by value + + + +pass by value + + + + + + diff --git a/artifacts/cccc/DayManagerTest.html b/artifacts/cccc/DayManagerTest.html new file mode 100644 index 0000000..075246d --- /dev/null +++ b/artifacts/cccc/DayManagerTest.html @@ -0,0 +1,114 @@ + +Detailed report on module DayManagerTest + + + +

Detailed report on module DayManagerTest

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 133 17
McCabe's Cyclomatic NumberMVG 2 0
Lines of CommentCOM 7 0.875
LOC/COML_C19.000 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 8 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 1 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0 0.000
Information Flow measure (  visible )IF4v 0 0.000
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + + + +
DescriptionLOCMVGCOML_CM_C
definition   +./tests_class/day_manager_test.cpp:4
+
12 0 0------------
+

Functions

+ + + + + + + + + + + + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
testAddAvailableSlot(   )
+definition   +./tests_class/day_manager_test.cpp:18
+
+
7 0 0------------
testDuration(   )
+definition   +./tests_class/day_manager_test.cpp:27
+
+
8 0 1------------
testReserveFailure(   )
+definition   +./tests_class/day_manager_test.cpp:145
+
+
22 0 0******------
testReserveImplMaximal(   )
+definition   +./tests_class/day_manager_test.cpp:56
+
+
22 0 3 7.333------
testReserveImplMinimal(   )
+definition   +./tests_class/day_manager_test.cpp:84
+
+
22 0 3 7.333------
testReserveImplQuick(   )
+definition   +./tests_class/day_manager_test.cpp:39
+
+
13 1 0------------
testReserveImplRandom(   )
+definition   +./tests_class/day_manager_test.cpp:112
+
+
11 1 0------------
testReserveSuccess(   )
+definition   +./tests_class/day_manager_test.cpp:126
+
+
16 0 0------------
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +QObject [CV]
+inheritance   +./tests_class/day_manager_test.cpp:4
+
+
+  +
+ diff --git a/artifacts/cccc/DayManagerTest.xml b/artifacts/cccc/DayManagerTest.xml new file mode 100644 index 0000000..f07dd55 --- /dev/null +++ b/artifacts/cccc/DayManagerTest.xml @@ -0,0 +1,148 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +definition + + + + + + + + + +testAddAvailableSlot() + +definition + + + + + + + + + +testDuration() + +definition + + + + + + + + + +testReserveFailure() + +definition + + + + + + + + + +testReserveImplMaximal() + +definition + + + + + + + + + +testReserveImplMinimal() + +definition + + + + + + + + + +testReserveImplQuick() + +definition + + + + + + + + + +testReserveImplRandom() + +definition + + + + + + + + + +testReserveSuccess() + +definition + + + + + + + + + + + +DayManagerTest + + + +QObject +true +true + +inheritance + + + + + + diff --git a/artifacts/cccc/DirectoriesManagementWidget.html b/artifacts/cccc/DirectoriesManagementWidget.html new file mode 100644 index 0000000..de4b295 --- /dev/null +++ b/artifacts/cccc/DirectoriesManagementWidget.html @@ -0,0 +1,127 @@ + +Detailed report on module DirectoriesManagementWidget + + + +

Detailed report on module DirectoriesManagementWidget

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 104 10
McCabe's Cyclomatic NumberMVG 10 1
Lines of CommentCOM 7 0.700
LOC/COML_C14.857 
MVG/COMM_C 1.429 
Weighted Methods per Class (  weighting = unity )WMC1 10 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 2 
Information Flow measure (  inclusive )IF4 0 0.000
Information Flow measure (  visible )IF4v 0 0.000
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + + + + + + + + + + + + + + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
DirectoriesManagementWidget(  QWidget * )
+definition   +./ui/widgets/directories_management_widget.cpp:26
+
+
10 0 7------------
initializeModels(   )
+definition   +./ui/widgets/directories_management_widget.cpp:58
+
+
14 3 0------------
initializeRepositories(   )
+definition   +./ui/widgets/directories_management_widget.cpp:38
+
+
15 3 0------------
onGenreFieldRetrieved(  const QSqlField & )
+definition   +./ui/widgets/directories_management_widget.cpp:144
+
+
4 0 0------------
onPushButtonAddGenreClicked(   )
+definition   +./ui/widgets/directories_management_widget.cpp:149
+
+
10 1 0------------
onPushButtonAddHallClicked(   )
+definition   +./ui/widgets/directories_management_widget.cpp:129
+
+
12 1 0------------
onPushButtonAddMovieClicked(   )
+definition   +./ui/widgets/directories_management_widget.cpp:108
+
+
17 2 0------------
setupConnections(   )
+definition   +./ui/widgets/directories_management_widget.cpp:94
+
+
10 0 0------------
setupGenreFinder(   )
+definition   +./ui/widgets/directories_management_widget.cpp:77
+
+
7 0 0------------
setupTableViews(   )
+definition   +./ui/widgets/directories_management_widget.cpp:86
+
+
5 0 0------------
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +QSqlField [V]
+pass by reference   +./ui/widgets/directories_management_widget.cpp:145
+
+
+QWidget [V]
+pass by reference   +./ui/widgets/directories_management_widget.cpp:26
+
+
+  +
+ diff --git a/artifacts/cccc/DirectoriesManagementWidget.xml b/artifacts/cccc/DirectoriesManagementWidget.xml new file mode 100644 index 0000000..59cd0a5 --- /dev/null +++ b/artifacts/cccc/DirectoriesManagementWidget.xml @@ -0,0 +1,172 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +DirectoriesManagementWidget(QWidget *) + +definition + + + + + + + + + +initializeModels() + +definition + + + + + + + + + +initializeRepositories() + +definition + + + + + + + + + +onGenreFieldRetrieved(const QSqlField &) + +definition + + + + + + + + + +onPushButtonAddGenreClicked() + +definition + + + + + + + + + +onPushButtonAddHallClicked() + +definition + + + + + + + + + +onPushButtonAddMovieClicked() + +definition + + + + + + + + + +setupConnections() + +definition + + + + + + + + + +setupGenreFinder() + +definition + + + + + + + + + +setupTableViews() + +definition + + + + + + + + + + + +DirectoriesManagementWidget + + + +QSqlField +true +false + +pass by reference + + +QWidget +true +false + +pass by reference + + + + + + diff --git a/artifacts/cccc/EntityDeleterWidget.html b/artifacts/cccc/EntityDeleterWidget.html new file mode 100644 index 0000000..c5e3834 --- /dev/null +++ b/artifacts/cccc/EntityDeleterWidget.html @@ -0,0 +1,158 @@ + +Detailed report on module EntityDeleterWidget + + + +

Detailed report on module EntityDeleterWidget

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 107 10
McCabe's Cyclomatic NumberMVG 14 1
Lines of CommentCOM 6 0.545
LOC/COML_C17.833 
MVG/COMM_C 2.333 
Weighted Methods per Class (  weighting = unity )WMC1 11 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 5 
Information Flow measure (  inclusive )IF4 0 0.000
Information Flow measure (  visible )IF4v 0 0.000
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + + + + + + + + + + + + + + + + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
EntityDeleterWidget(  QWidget * )
+definition   +./ui/widgets/entity_deleter_widget.cpp:15
+
+
6 0 0------------
deleteEntityById(   )
+definition   +./ui/widgets/entity_deleter_widget.cpp:83
+definition   +./ui/widgets/entity_deleter_widget.cpp:90
+definition   +./ui/widgets/entity_deleter_widget.cpp:97
+definition   +./ui/widgets/entity_deleter_widget.cpp:104
+definition   +./ui/widgets/entity_deleter_widget.cpp:111
+definition   +./ui/widgets/entity_deleter_widget.cpp:118
+
+
24 6 0************
onComboBoxCurrentTableCurrentIndexChanged(  int )
+definition   +./ui/widgets/entity_deleter_widget.cpp:61
+
+
7 0 0------------
onFieldRetrieved(  const QSqlField & )
+definition   +./ui/widgets/entity_deleter_widget.cpp:71
+
+
3 0 0------------
onPushButtonDeleteEntityClicked(   )
+definition   +./ui/widgets/entity_deleter_widget.cpp:123
+
+
28 6 4 7.000 1.500
onRecordRetrieved(  const QSqlRecord & )
+definition   +./ui/widgets/entity_deleter_widget.cpp:75
+
+
3 0 2------------
refreshEntityFinder(   )
+definition   +./ui/widgets/entity_deleter_widget.cpp:54
+
+
5 0 0------------
setupComboBoxCurrentTable(   )
+definition   +./ui/widgets/entity_deleter_widget.cpp:23
+
+
9 1 0------------
setupConnections(   )
+definition   +./ui/widgets/entity_deleter_widget.cpp:35
+
+
10 0 0------------
setupEntityFinder(   )
+definition   +./ui/widgets/entity_deleter_widget.cpp:49
+
+
4 0 0------------
showMessageDialog(  const RepositoryResult &,  const QString & )
+definition   +./ui/widgets/entity_deleter_widget.cpp:172
+
+
8 1 0------------
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +QSqlField [V]
+pass by reference   +./ui/widgets/entity_deleter_widget.cpp:71
+
+
+QSqlRecord [V]
+pass by reference   +./ui/widgets/entity_deleter_widget.cpp:75
+
+
+QString [V]
+pass by reference   +./ui/widgets/entity_deleter_widget.cpp:173
+
+
+QWidget [V]
+pass by reference   +./ui/widgets/entity_deleter_widget.cpp:15
+
+
+RepositoryResult [V]
+pass by reference   +./ui/widgets/entity_deleter_widget.cpp:172
+
+
+  +
+ diff --git a/artifacts/cccc/EntityDeleterWidget.xml b/artifacts/cccc/EntityDeleterWidget.xml new file mode 100644 index 0000000..a735a1c --- /dev/null +++ b/artifacts/cccc/EntityDeleterWidget.xml @@ -0,0 +1,225 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +EntityDeleterWidget(QWidget *) + +definition + + + + + + + + + +deleteEntityById() + +definition + + + +definition + + + +definition + + + +definition + + + +definition + + + +definition + + + + + + + + + +onComboBoxCurrentTableCurrentIndexChanged(int) + +definition + + + + + + + + + +onFieldRetrieved(const QSqlField &) + +definition + + + + + + + + + +onPushButtonDeleteEntityClicked() + +definition + + + + + + + + + +onRecordRetrieved(const QSqlRecord &) + +definition + + + + + + + + + +refreshEntityFinder() + +definition + + + + + + + + + +setupComboBoxCurrentTable() + +definition + + + + + + + + + +setupConnections() + +definition + + + + + + + + + +setupEntityFinder() + +definition + + + + + + + + + +showMessageDialog(const RepositoryResult &,const QString &) + +definition + + + + + + + + + + + +EntityDeleterWidget + + + +QSqlField +true +false + +pass by reference + + +QSqlRecord +true +false + +pass by reference + + +QString +true +false + +pass by reference + + +QWidget +true +false + +pass by reference + + +RepositoryResult +true +false + +pass by reference + + + + + + diff --git a/artifacts/cccc/EntityFinderWidget.html b/artifacts/cccc/EntityFinderWidget.html new file mode 100644 index 0000000..a6acdee --- /dev/null +++ b/artifacts/cccc/EntityFinderWidget.html @@ -0,0 +1,162 @@ + +Detailed report on module EntityFinderWidget + + + +

Detailed report on module EntityFinderWidget

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 79 7
McCabe's Cyclomatic NumberMVG 4 0
Lines of CommentCOM 1 0.083
LOC/COML_C79.000 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 12 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 5 
Information Flow measure (  inclusive )IF4 0 0.000
Information Flow measure (  visible )IF4v 0 0.000
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
EntityFinderWidget(  QWidget * )
+definition   +./ui/widgets/entity_finder_widget.cpp:8
+
+
5 0 0------------
EntityFinderWidget(  const QString &,  const QString &,  QWidget * )
+definition   +./ui/widgets/entity_finder_widget.cpp:15
+
+
7 0 0------------
onFieldRetrieved(  const QSqlField & )
+definition   +./ui/widgets/entity_finder_widget.cpp:111
+
+
3 0 0------------
onPushButtonFindEntityClicked(   )
+definition   +./ui/widgets/entity_finder_widget.cpp:85
+
+
10 0 1------------
onRecordRetrieved(  const QSqlRecord & )
+definition   +./ui/widgets/entity_finder_widget.cpp:106
+
+
4 0 0------------
onRowSelected(  int )
+definition   +./ui/widgets/entity_finder_widget.cpp:102
+
+
3 0 0------------
refreshLineEditText(  const QSqlRecord & )
+definition   +./ui/widgets/entity_finder_widget.cpp:42
+
+
12 1 0------------
resetToDefault(   )
+definition   +./ui/widgets/entity_finder_widget.cpp:77
+
+
6 0 0------------
setDefaultRelation(  const QString & )
+definition   +./ui/widgets/entity_finder_widget.cpp:59
+
+
7 0 0------------
setHiddenFrame(  bool )
+definition   +./ui/widgets/entity_finder_widget.cpp:23
+
+
15 3 0------------
setupConnections(   )
+definition   +./ui/widgets/entity_finder_widget.cpp:68
+
+
4 0 0------------
setupFrameStyle(   )
+definition   +./ui/widgets/entity_finder_widget.cpp:73
+
+
3 0 0------------
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +QSqlField [V]
+pass by reference   +./ui/widgets/entity_finder_widget.cpp:111
+
+
+QSqlRecord [V]
+pass by reference   +./ui/widgets/entity_finder_widget.cpp:42
+pass by reference   +./ui/widgets/entity_finder_widget.cpp:106
+
+
+QString [V]
+pass by reference   +./ui/widgets/entity_finder_widget.cpp:15
+pass by reference   +./ui/widgets/entity_finder_widget.cpp:16
+pass by reference   +./ui/widgets/entity_finder_widget.cpp:60
+
+
+QWidget [V]
+pass by reference   +./ui/widgets/entity_finder_widget.cpp:8
+pass by reference   +./ui/widgets/entity_finder_widget.cpp:17
+
+
+bool [CV]
+pass by value   +./ui/widgets/entity_finder_widget.cpp:23
+
+
+  +
+ diff --git a/artifacts/cccc/EntityFinderWidget.xml b/artifacts/cccc/EntityFinderWidget.xml new file mode 100644 index 0000000..09e464f --- /dev/null +++ b/artifacts/cccc/EntityFinderWidget.xml @@ -0,0 +1,233 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +EntityFinderWidget(QWidget *) + +definition + + + + + + + + + +EntityFinderWidget(const QString &,const QString &,QWidget *) + +definition + + + + + + + + + +onFieldRetrieved(const QSqlField &) + +definition + + + + + + + + + +onPushButtonFindEntityClicked() + +definition + + + + + + + + + +onRecordRetrieved(const QSqlRecord &) + +definition + + + + + + + + + +onRowSelected(int) + +definition + + + + + + + + + +refreshLineEditText(const QSqlRecord &) + +definition + + + + + + + + + +resetToDefault() + +definition + + + + + + + + + +setDefaultRelation(const QString &) + +definition + + + + + + + + + +setHiddenFrame(bool) + +definition + + + + + + + + + +setupConnections() + +definition + + + + + + + + + +setupFrameStyle() + +definition + + + + + + + + + + + +EntityFinderWidget + + + +QSqlField +true +false + +pass by reference + + +QSqlRecord +true +false + +pass by reference + + + +pass by reference + + +QString +true +false + +pass by reference + + + +pass by reference + + + +pass by reference + + +QWidget +true +false + +pass by reference + + + +pass by reference + + +bool +true +true + +pass by value + + + + + + diff --git a/artifacts/cccc/EntityUpdaterWidget.html b/artifacts/cccc/EntityUpdaterWidget.html new file mode 100644 index 0000000..6e2e961 --- /dev/null +++ b/artifacts/cccc/EntityUpdaterWidget.html @@ -0,0 +1,286 @@ + +Detailed report on module EntityUpdaterWidget + + + +

Detailed report on module EntityUpdaterWidget

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 348 16
McCabe's Cyclomatic NumberMVG 62 3
Lines of CommentCOM 4 0.182
LOC/COML_C87.000 
MVG/COMM_C15.500 
Weighted Methods per Class (  weighting = unity )WMC1 22 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 7 
Information Flow measure (  inclusive )IF4 0 0.000
Information Flow measure (  visible )IF4v 0 0.000
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
EntityUpdaterWidget(  QWidget * )
+definition   +./ui/widgets/entity_updater_widget.cpp:33
+
+
8 0 1------------
actualColumnValue(  const QString & )
+definition   +./ui/widgets/entity_updater_widget.cpp:145
+definition   +./ui/widgets/entity_updater_widget.cpp:155
+definition   +./ui/widgets/entity_updater_widget.cpp:165
+definition   +./ui/widgets/entity_updater_widget.cpp:175
+
+
28 8 0************
actualForeignKey(  const QString & )
+definition   +./ui/widgets/entity_updater_widget.cpp:184
+
+
7 2 0------------
configureForeignKeyFinder(  const QString & )
+definition   +./ui/widgets/entity_updater_widget.cpp:115
+
+
5 0 0------------
configureForeignKeyFinder(  const QString &,  const QString & )
+definition   +./ui/widgets/entity_updater_widget.cpp:92
+
+
16 4 2------------
configurePrimaryKeyFinder(  const QString & )
+definition   +./ui/widgets/entity_updater_widget.cpp:121
+
+
5 0 0------------
findIndexByColumn(  QAbstractItemModel *,  int,  const QVariant & )
+definition   +./ui/widgets/entity_updater_widget.cpp:430
+
+
13 8 0------******
isColumnsEqual(  const QString & )
+definition   +./ui/widgets/entity_updater_widget.cpp:446
+
+
8 2 0------------
onColumnSelected(  int )
+definition   +./ui/widgets/entity_updater_widget.cpp:394
+
+
31 8 0************
onForeignFieldRetrieved(  const QSqlField & )
+definition   +./ui/widgets/entity_updater_widget.cpp:133
+
+
5 0 0------------
onPrimaryEntityRetrieved(  const QSqlRecord & )
+definition   +./ui/widgets/entity_updater_widget.cpp:139
+
+
4 0 0------------
onPrimaryFieldRetrieved(  const QSqlField & )
+definition   +./ui/widgets/entity_updater_widget.cpp:127
+
+
5 0 0------------
onPushButtonUpdateClicked(   )
+definition   +./ui/widgets/entity_updater_widget.cpp:335
+
+
23 6 0************
onTableSelected(  int )
+definition   +./ui/widgets/entity_updater_widget.cpp:368
+
+
19 2 1------------
processEntityUpdate(  RepositoryResult & )
+definition   +./ui/widgets/entity_updater_widget.cpp:264
+definition   +./ui/widgets/entity_updater_widget.cpp:276
+definition   +./ui/widgets/entity_updater_widget.cpp:288
+definition   +./ui/widgets/entity_updater_widget.cpp:300
+definition   +./ui/widgets/entity_updater_widget.cpp:312
+definition   +./ui/widgets/entity_updater_widget.cpp:324
+
+
60 12 0************
processUpdateResult(  const RepositoryResult & )
+definition   +./ui/widgets/entity_updater_widget.cpp:459
+
+
18 2 0------------
setupChildEntityFinderWidget(   )
+definition   +./ui/widgets/entity_updater_widget.cpp:77
+
+
7 0 0------------
setupComboBoxCurrentTable(   )
+definition   +./ui/widgets/entity_updater_widget.cpp:43
+
+
11 1 0------------
setupConnections(   )
+definition   +./ui/widgets/entity_updater_widget.cpp:57
+
+
14 0 0------------
setupParentEntityFinderWidget(   )
+definition   +./ui/widgets/entity_updater_widget.cpp:85
+
+
6 0 0------------
showMessageDialog(  const RepositoryResult &,  const QString & )
+definition   +./ui/widgets/entity_updater_widget.cpp:484
+
+
8 1 0------------
updateEntity(   )
+definition   +./ui/widgets/entity_updater_widget.cpp:195
+definition   +./ui/widgets/entity_updater_widget.cpp:204
+definition   +./ui/widgets/entity_updater_widget.cpp:215
+definition   +./ui/widgets/entity_updater_widget.cpp:227
+definition   +./ui/widgets/entity_updater_widget.cpp:239
+definition   +./ui/widgets/entity_updater_widget.cpp:253
+
+
47 6 0************
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +QAbstractItemModel [V]
+pass by reference   +./ui/widgets/entity_updater_widget.cpp:430
+
+
+QSqlField [V]
+pass by reference   +./ui/widgets/entity_updater_widget.cpp:127
+pass by reference   +./ui/widgets/entity_updater_widget.cpp:133
+
+
+QSqlRecord [V]
+pass by reference   +./ui/widgets/entity_updater_widget.cpp:139
+
+
+QString [V]
+pass by reference   +./ui/widgets/entity_updater_widget.cpp:93
+pass by reference   +./ui/widgets/entity_updater_widget.cpp:93
+pass by reference   +./ui/widgets/entity_updater_widget.cpp:116
+pass by reference   +./ui/widgets/entity_updater_widget.cpp:122
+pass by reference   +./ui/widgets/entity_updater_widget.cpp:145
+pass by reference   +./ui/widgets/entity_updater_widget.cpp:155
+pass by reference   +./ui/widgets/entity_updater_widget.cpp:165
+pass by reference   +./ui/widgets/entity_updater_widget.cpp:175
+pass by reference   +./ui/widgets/entity_updater_widget.cpp:184
+pass by reference   +./ui/widgets/entity_updater_widget.cpp:446
+pass by reference   +./ui/widgets/entity_updater_widget.cpp:485
+
+
+QVariant [V]
+pass by reference   +./ui/widgets/entity_updater_widget.cpp:432
+
+
+QWidget [V]
+pass by reference   +./ui/widgets/entity_updater_widget.cpp:33
+
+
+RepositoryResult [V]
+pass by reference   +./ui/widgets/entity_updater_widget.cpp:265
+pass by reference   +./ui/widgets/entity_updater_widget.cpp:277
+pass by reference   +./ui/widgets/entity_updater_widget.cpp:289
+pass by reference   +./ui/widgets/entity_updater_widget.cpp:301
+pass by reference   +./ui/widgets/entity_updater_widget.cpp:313
+pass by reference   +./ui/widgets/entity_updater_widget.cpp:325
+pass by reference   +./ui/widgets/entity_updater_widget.cpp:459
+pass by reference   +./ui/widgets/entity_updater_widget.cpp:484
+
+
+  +
+ diff --git a/artifacts/cccc/EntityUpdaterWidget.xml b/artifacts/cccc/EntityUpdaterWidget.xml new file mode 100644 index 0000000..764d53d --- /dev/null +++ b/artifacts/cccc/EntityUpdaterWidget.xml @@ -0,0 +1,475 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +EntityUpdaterWidget(QWidget *) + +definition + + + + + + + + + +actualColumnValue(const QString &) + +definition + + + +definition + + + +definition + + + +definition + + + + + + + + + +actualForeignKey(const QString &) + +definition + + + + + + + + + +configureForeignKeyFinder(const QString &) + +definition + + + + + + + + + +configureForeignKeyFinder(const QString &,const QString &) + +definition + + + + + + + + + +configurePrimaryKeyFinder(const QString &) + +definition + + + + + + + + + +findIndexByColumn(QAbstractItemModel *,int,const QVariant &) + +definition + + + + + + + + + +isColumnsEqual(const QString &) + +definition + + + + + + + + + +onColumnSelected(int) + +definition + + + + + + + + + +onForeignFieldRetrieved(const QSqlField &) + +definition + + + + + + + + + +onPrimaryEntityRetrieved(const QSqlRecord &) + +definition + + + + + + + + + +onPrimaryFieldRetrieved(const QSqlField &) + +definition + + + + + + + + + +onPushButtonUpdateClicked() + +definition + + + + + + + + + +onTableSelected(int) + +definition + + + + + + + + + +processEntityUpdate(RepositoryResult &) + +definition + + + +definition + + + +definition + + + +definition + + + +definition + + + +definition + + + + + + + + + +processUpdateResult(const RepositoryResult &) + +definition + + + + + + + + + +setupChildEntityFinderWidget() + +definition + + + + + + + + + +setupComboBoxCurrentTable() + +definition + + + + + + + + + +setupConnections() + +definition + + + + + + + + + +setupParentEntityFinderWidget() + +definition + + + + + + + + + +showMessageDialog(const RepositoryResult &,const QString &) + +definition + + + + + + + + + +updateEntity() + +definition + + + +definition + + + +definition + + + +definition + + + +definition + + + +definition + + + + + + + + + + + +EntityUpdaterWidget + + + +QAbstractItemModel +true +false + +pass by reference + + +QSqlField +true +false + +pass by reference + + + +pass by reference + + +QSqlRecord +true +false + +pass by reference + + +QString +true +false + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + +QVariant +true +false + +pass by reference + + +QWidget +true +false + +pass by reference + + +RepositoryResult +true +false + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + + + + diff --git a/artifacts/cccc/ErrorDialog.html b/artifacts/cccc/ErrorDialog.html new file mode 100644 index 0000000..d82f66c --- /dev/null +++ b/artifacts/cccc/ErrorDialog.html @@ -0,0 +1,135 @@ + +Detailed report on module ErrorDialog + + + +

Detailed report on module ErrorDialog

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 174 19
McCabe's Cyclomatic NumberMVG 82 9
Lines of CommentCOM 8 0.889
LOC/COML_C21.750 
MVG/COMM_C10.250 
Weighted Methods per Class (  weighting = unity )WMC1 9 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 2 
Information Flow measure (  inclusive )IF4 0 0.000
Information Flow measure (  visible )IF4v 0 0.000
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + + + + + + + + + + + + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
displayError(  QWidget *,  const QString & )
+definition   +./ui/dialogs/error_dialog.cpp:39
+
+
28 6 0************
getDetailedMessage(  int )
+definition   +./ui/dialogs/error_dialog.cpp:199
+
+
19 8 0------******
getDialog(  QWidget *,  const QString & )
+definition   +./ui/dialogs/error_dialog.cpp:9
+
+
15 2 7------------
handleCheckConstraint(  const QString & )
+definition   +./ui/dialogs/error_dialog.cpp:169
+
+
28 17 0************
handleForeignKeyConstraint(  const QString & )
+definition   +./ui/dialogs/error_dialog.cpp:144
+
+
19 11 0------******
handleNotFoundErrors(  const QString & )
+definition   +./ui/dialogs/error_dialog.cpp:75
+
+
21 13 121.00013.000
handlePrimaryKeyConstraint(   )
+definition   +./ui/dialogs/error_dialog.cpp:165
+
+
3 1 0------------
handleSqlConstraints(  const QString & )
+definition   +./ui/dialogs/error_dialog.cpp:99
+
+
19 11 0------******
handleUniqueConstraint(  const QString & )
+definition   +./ui/dialogs/error_dialog.cpp:120
+
+
22 13 0************
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +QString [V]
+pass by reference   +./ui/dialogs/error_dialog.cpp:10
+pass by reference   +./ui/dialogs/error_dialog.cpp:39
+pass by reference   +./ui/dialogs/error_dialog.cpp:75
+pass by reference   +./ui/dialogs/error_dialog.cpp:99
+pass by reference   +./ui/dialogs/error_dialog.cpp:120
+pass by reference   +./ui/dialogs/error_dialog.cpp:144
+pass by reference   +./ui/dialogs/error_dialog.cpp:169
+
+
+QWidget [V]
+pass by reference   +./ui/dialogs/error_dialog.cpp:9
+pass by reference   +./ui/dialogs/error_dialog.cpp:39
+
+
+  +
+ diff --git a/artifacts/cccc/ErrorDialog.xml b/artifacts/cccc/ErrorDialog.xml new file mode 100644 index 0000000..3ba6445 --- /dev/null +++ b/artifacts/cccc/ErrorDialog.xml @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +displayError(QWidget *,const QString &) + +definition + + + + + + + + + +getDetailedMessage(int) + +definition + + + + + + + + + +getDialog(QWidget *,const QString &) + +definition + + + + + + + + + +handleCheckConstraint(const QString &) + +definition + + + + + + + + + +handleForeignKeyConstraint(const QString &) + +definition + + + + + + + + + +handleNotFoundErrors(const QString &) + +definition + + + + + + + + + +handlePrimaryKeyConstraint() + +definition + + + + + + + + + +handleSqlConstraints(const QString &) + +definition + + + + + + + + + +handleUniqueConstraint(const QString &) + +definition + + + + + + + + + + + +ErrorDialog + + + +QString +true +false + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + +QWidget +true +false + +pass by reference + + + +pass by reference + + + + + + diff --git a/artifacts/cccc/ExecuteSqlFile.html b/artifacts/cccc/ExecuteSqlFile.html new file mode 100644 index 0000000..bbcd14f --- /dev/null +++ b/artifacts/cccc/ExecuteSqlFile.html @@ -0,0 +1,124 @@ + +Detailed report on module ExecuteSqlFile + + + +

Detailed report on module ExecuteSqlFile

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 80 11
McCabe's Cyclomatic NumberMVG 28 4
Lines of CommentCOM 10 1.429
LOC/COML_C 8.000 
MVG/COMM_C 2.800 
Weighted Methods per Class (  weighting = unity )WMC1 7 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 3 
Information Flow measure (  inclusive )IF4 0 0.000
Information Flow measure (  visible )IF4v 0 0.000
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + + + + + + + + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
ExecuteSqlFile(  QSqlDatabase & )
+definition   +./core/db/execute_sql_file.cpp:5
+
+
3 0 2------------
executeStatement(  const QString & )
+definition   +./core/db/execute_sql_file.cpp:101
+
+
8 3 0------------
filterLine(  QString & )
+definition   +./core/db/execute_sql_file.cpp:96
+
+
4 1 2------------
operator (   )(  const QString & )
+definition   +./core/db/execute_sql_file.cpp:10
+
+
17 5 1------ 5.000
processDelimiterChange(  QString & )
+definition   +./core/db/execute_sql_file.cpp:86
+
+
9 3 1------------
processLine(  QString &,  QString & )
+definition   +./core/db/execute_sql_file.cpp:52
+
+
26 9 3 8.667 3.000
processStatements(  QStringList & )
+definition   +./core/db/execute_sql_file.cpp:34
+
+
13 7 1------ 7.000
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +QSqlDatabase [V]
+pass by reference   +./core/db/execute_sql_file.cpp:5
+
+
+QString [V]
+pass by reference   +./core/db/execute_sql_file.cpp:10
+pass by reference   +./core/db/execute_sql_file.cpp:52
+pass by reference   +./core/db/execute_sql_file.cpp:52
+pass by reference   +./core/db/execute_sql_file.cpp:86
+pass by reference   +./core/db/execute_sql_file.cpp:96
+pass by reference   +./core/db/execute_sql_file.cpp:101
+
+
+QStringList [V]
+pass by reference   +./core/db/execute_sql_file.cpp:34
+
+
+  +
+ diff --git a/artifacts/cccc/ExecuteSqlFile.xml b/artifacts/cccc/ExecuteSqlFile.xml new file mode 100644 index 0000000..aa96ce3 --- /dev/null +++ b/artifacts/cccc/ExecuteSqlFile.xml @@ -0,0 +1,163 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +ExecuteSqlFile(QSqlDatabase &) + +definition + + + + + + + + + +executeStatement(const QString &) + +definition + + + + + + + + + +filterLine(QString &) + +definition + + + + + + + + + +operator ()(const QString &) + +definition + + + + + + + + + +processDelimiterChange(QString &) + +definition + + + + + + + + + +processLine(QString &,QString &) + +definition + + + + + + + + + +processStatements(QStringList &) + +definition + + + + + + + + + + + +ExecuteSqlFile + + + +QSqlDatabase +true +false + +pass by reference + + +QString +true +false + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + +QStringList +true +false + +pass by reference + + + + + + diff --git a/artifacts/cccc/FileReader.html b/artifacts/cccc/FileReader.html new file mode 100644 index 0000000..a2d92ec --- /dev/null +++ b/artifacts/cccc/FileReader.html @@ -0,0 +1,70 @@ + +Detailed report on module FileReader + + + +

Detailed report on module FileReader

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 12 12
McCabe's Cyclomatic NumberMVG 3 3
Lines of CommentCOM 2 2.000
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 1 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0 0.000
Information Flow measure (  visible )IF4v 0 0.000
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + + +
Function prototypeLOCMVGCOML_CM_C
read(  const string &,  string & )
+definition   +./tests_schema/tests_sources/file_reader.cpp:8
+
+
12 3 2------------
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +string [V]
+pass by reference   +./tests_schema/tests_sources/file_reader.cpp:8
+pass by reference   +./tests_schema/tests_sources/file_reader.cpp:8
+
+
+  +
+ diff --git a/artifacts/cccc/FileReader.xml b/artifacts/cccc/FileReader.xml new file mode 100644 index 0000000..5245ba3 --- /dev/null +++ b/artifacts/cccc/FileReader.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +read(const string &,string &) + +definition + + + + + + + + + + + +FileReader + + + +string +true +false + +pass by reference + + + +pass by reference + + + + + + diff --git a/artifacts/cccc/FileReaderInterface.html b/artifacts/cccc/FileReaderInterface.html new file mode 100644 index 0000000..0cb61ce --- /dev/null +++ b/artifacts/cccc/FileReaderInterface.html @@ -0,0 +1,72 @@ + +Detailed report on module FileReaderInterface + + + +

Detailed report on module FileReaderInterface

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 5******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 2 
Coupling between objectsCBO 2 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + + + +
DescriptionLOCMVGCOML_CM_C
definition   +./tests_schema/tests_sources/file_reader_interface.h:6
+
5 0 0------------
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+FileReader [CV]
+inheritance   +./tests_schema/tests_sources/file_reader.h:7
+
+
+SQLFileExecutorInterface [CV]
+inheritance   +./tests_schema/tests_sources/sql_file_executor_interfase.h:7
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/FileReaderInterface.xml b/artifacts/cccc/FileReaderInterface.xml new file mode 100644 index 0000000..bd121af --- /dev/null +++ b/artifacts/cccc/FileReaderInterface.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +definition + + + + + + + + + + + +FileReaderInterface + +FileReader +true +true + +inheritance + + +SQLFileExecutorInterface +true +true + +inheritance + + + + + + + + diff --git a/artifacts/cccc/GeneratorInterface.html b/artifacts/cccc/GeneratorInterface.html new file mode 100644 index 0000000..db78a22 --- /dev/null +++ b/artifacts/cccc/GeneratorInterface.html @@ -0,0 +1,67 @@ + +Detailed report on module GeneratorInterface + + + +

Detailed report on module GeneratorInterface

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 18******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 1********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 1 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + + + +
DescriptionLOCMVGCOML_CM_C
definition   +./core/services/generator_interface.h:7
+
18 0 1------------
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+BaseGenerator [CV]
+inheritance   +./core/services/base_generator.h:9
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/GeneratorInterface.xml b/artifacts/cccc/GeneratorInterface.xml new file mode 100644 index 0000000..02c1e31 --- /dev/null +++ b/artifacts/cccc/GeneratorInterface.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +definition + + + + + + + + + + + +GeneratorInterface + +BaseGenerator +true +true + +inheritance + + + + + + + + diff --git a/artifacts/cccc/Genre.html b/artifacts/cccc/Genre.html new file mode 100644 index 0000000..e281563 --- /dev/null +++ b/artifacts/cccc/Genre.html @@ -0,0 +1,63 @@ + +Detailed report on module Genre + + + +

Detailed report on module Genre

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+SQLiteDatabase [V]
+pass by reference   +./tests_schema/tests_sources/sqlite_database.cpp:105
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/Genre.xml b/artifacts/cccc/Genre.xml new file mode 100644 index 0000000..6ddb42d --- /dev/null +++ b/artifacts/cccc/Genre.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Genre + +SQLiteDatabase +true +false + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/GenreDTO.html b/artifacts/cccc/GenreDTO.html new file mode 100644 index 0000000..afee2c7 --- /dev/null +++ b/artifacts/cccc/GenreDTO.html @@ -0,0 +1,63 @@ + +Detailed report on module GenreDTO + + + +

Detailed report on module GenreDTO

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+GenresRepository [V]
+pass by reference   +./data/sql/genres_repository.cpp:28
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/GenreDTO.xml b/artifacts/cccc/GenreDTO.xml new file mode 100644 index 0000000..a29a105 --- /dev/null +++ b/artifacts/cccc/GenreDTO.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +GenreDTO + +GenresRepository +true +false + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/GenresModel.html b/artifacts/cccc/GenresModel.html new file mode 100644 index 0000000..6b90f45 --- /dev/null +++ b/artifacts/cccc/GenresModel.html @@ -0,0 +1,90 @@ + +Detailed report on module GenresModel + + + +

Detailed report on module GenresModel

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 24 8
McCabe's Cyclomatic NumberMVG 8 3
Lines of CommentCOM 0 0.000
LOC/COML_C****** 
MVG/COMM_C****** 
Weighted Methods per Class (  weighting = unity )WMC1 3 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 3 
Information Flow measure (  inclusive )IF4 0 0.000
Information Flow measure (  visible )IF4v 0 0.000
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
GenresModel(  QObject *,  const QSqlDatabase & )
+definition   +./ui/models/genres_model.cpp:5
+
+
2 0 0------------
headerData(  int,  Orientation,  int )
+definition   +./ui/models/genres_model.cpp:19
+
+
14 7 0------******
initialize(   )
+definition   +./ui/models/genres_model.cpp:8
+
+
8 1 0------------
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +Orientation [CV]
+pass by value   +./ui/models/genres_model.cpp:19
+
+
+QObject [V]
+pass by reference   +./ui/models/genres_model.cpp:5
+
+
+QSqlDatabase [V]
+pass by reference   +./ui/models/genres_model.cpp:5
+
+
+  +
+ diff --git a/artifacts/cccc/GenresModel.xml b/artifacts/cccc/GenresModel.xml new file mode 100644 index 0000000..f01e8ba --- /dev/null +++ b/artifacts/cccc/GenresModel.xml @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +GenresModel(QObject *,const QSqlDatabase &) + +definition + + + + + + + + + +headerData(int,Orientation,int) + +definition + + + + + + + + + +initialize() + +definition + + + + + + + + + + + +GenresModel + + + +Orientation +true +true + +pass by value + + +QObject +true +false + +pass by reference + + +QSqlDatabase +true +false + +pass by reference + + + + + + diff --git a/artifacts/cccc/GenresRepository.html b/artifacts/cccc/GenresRepository.html new file mode 100644 index 0000000..fa7c57b --- /dev/null +++ b/artifacts/cccc/GenresRepository.html @@ -0,0 +1,141 @@ + +Detailed report on module GenresRepository + + + +

Detailed report on module GenresRepository

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 68 10
McCabe's Cyclomatic NumberMVG 19 3
Lines of CommentCOM 0 0.000
LOC/COML_C****** 
MVG/COMM_C****** 
Weighted Methods per Class (  weighting = unity )WMC1 7 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 8 
Information Flow measure (  inclusive )IF4 0 0.000
Information Flow measure (  visible )IF4v 0 0.000
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + + + + + + + + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
GenresRepository(  QSqlDatabase &,  QObject * )
+definition   +./data/sql/genres_repository.cpp:10
+
+
2 0 0------------
createGenre(  const CreateGenreRequest & )
+definition   +./data/sql/genres_repository.cpp:14
+
+
10 3 0------------
deleteGenreById(  qint32 )
+definition   +./data/sql/genres_repository.cpp:80
+
+
10 3 0------------
getAllGenres(  QVector & )
+definition   +./data/sql/genres_repository.cpp:48
+
+
12 4 0------------
getGenreById(  qint32,  GenreDTO & )
+definition   +./data/sql/genres_repository.cpp:27
+
+
16 5 0------******
mapQueryToDTO(  const QSqlQuery & )
+definition   +./data/sql/genres_repository.cpp:93
+
+
6 1 0------------
updateGenre(  const UpdateGenreRequest & )
+definition   +./data/sql/genres_repository.cpp:65
+
+
12 3 0------------
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +CreateGenreRequest [V]
+pass by reference   +./data/sql/genres_repository.cpp:14
+
+
+GenreDTO [V]
+pass by reference   +./data/sql/genres_repository.cpp:28
+
+
+QObject [V]
+pass by reference   +./data/sql/genres_repository.cpp:10
+
+
+QSqlDatabase [V]
+pass by reference   +./data/sql/genres_repository.cpp:10
+
+
+QSqlQuery [V]
+pass by reference   +./data/sql/genres_repository.cpp:93
+
+
+QVector [V]
+pass by reference   +./data/sql/genres_repository.cpp:48
+
+
+UpdateGenreRequest [V]
+pass by reference   +./data/sql/genres_repository.cpp:65
+
+
+qint32 [CV]
+pass by value   +./data/sql/genres_repository.cpp:27
+pass by value   +./data/sql/genres_repository.cpp:80
+
+
+  +
+ diff --git a/artifacts/cccc/GenresRepository.xml b/artifacts/cccc/GenresRepository.xml new file mode 100644 index 0000000..846b2d3 --- /dev/null +++ b/artifacts/cccc/GenresRepository.xml @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +GenresRepository(QSqlDatabase &,QObject *) + +definition + + + + + + + + + +createGenre(const CreateGenreRequest &) + +definition + + + + + + + + + +deleteGenreById(qint32) + +definition + + + + + + + + + +getAllGenres(QVector &) + +definition + + + + + + + + + +getGenreById(qint32,GenreDTO &) + +definition + + + + + + + + + +mapQueryToDTO(const QSqlQuery &) + +definition + + + + + + + + + +updateGenre(const UpdateGenreRequest &) + +definition + + + + + + + + + + + +GenresRepository + + + +CreateGenreRequest +true +false + +pass by reference + + +GenreDTO +true +false + +pass by reference + + +QObject +true +false + +pass by reference + + +QSqlDatabase +true +false + +pass by reference + + +QSqlQuery +true +false + +pass by reference + + +QVector +true +false + +pass by reference + + +UpdateGenreRequest +true +false + +pass by reference + + +qint32 +true +true + +pass by value + + + +pass by value + + + + + + diff --git a/artifacts/cccc/GenresRepositoryInterface.html b/artifacts/cccc/GenresRepositoryInterface.html new file mode 100644 index 0000000..50ebf43 --- /dev/null +++ b/artifacts/cccc/GenresRepositoryInterface.html @@ -0,0 +1,138 @@ + +Detailed report on module GenresRepositoryInterface + + + +

Detailed report on module GenresRepositoryInterface

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 11 2
McCabe's Cyclomatic NumberMVG 0 0
Lines of CommentCOM 6 1.200
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 5 
Weighted Methods per Class (  weighting = visible )WMCv 5 
Depth of Inheritance TreeDIT 1 
Number of ChildrenNOC 1 
Coupling between objectsCBO 7 
Information Flow measure (  inclusive )IF4 36 7.200
Information Flow measure (  visible )IF4v 36 7.200
Information Flow measure (  concrete )IF4c 4 0.800
+

Definitions and Declarations

+ + + + + + + + + + + +
DescriptionLOCMVGCOML_CM_C
definition   +./core/repositories/genres_repository_interface.h:15
+
3 0 1------------
declaration   +./ui/widgets/reports_widget.h:10
+
1 0 0------------
declaration   +./ui/widgets/directories_management_widget.h:13
+
1 0 0------------
+

Functions

+ + + + + + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
createGenre(  const CreateGenreRequest & )
+declaration   +./core/repositories/genres_repository_interface.h:18
+
+
1 0 1------------
deleteGenreById(  qint32 )
+declaration   +./core/repositories/genres_repository_interface.h:31
+
+
1 0 1------------
getAllGenres(  QVector & )
+declaration   +./core/repositories/genres_repository_interface.h:25
+
+
1 0 1------------
getGenreById(  qint32,  GenreDTO & )
+declaration   +./core/repositories/genres_repository_interface.h:21
+
+
2 0 1------------
updateGenre(  const UpdateGenreRequest & )
+declaration   +./core/repositories/genres_repository_interface.h:28
+
+
1 0 1------------
+

Relationships

+ + + + + +
ClientsSuppliers
+GenresRepository [CV]
+inheritance   +./data/sql/genres_repository.h:9
+
+
+  +
+CreateGenreRequest [V]
+pass by reference   +./core/repositories/genres_repository_interface.h:18
+
+
+GenreDTO [V]
+pass by reference   +./core/repositories/genres_repository_interface.h:22
+
+
+QVector [V]
+pass by reference   +./core/repositories/genres_repository_interface.h:25
+
+
+RepositoryInterface [CV]
+inheritance   +./core/repositories/genres_repository_interface.h:15
+
+
+UpdateGenreRequest [V]
+pass by reference   +./core/repositories/genres_repository_interface.h:28
+
+
+qint32 [CV]
+pass by value   +./core/repositories/genres_repository_interface.h:21
+pass by value   +./core/repositories/genres_repository_interface.h:31
+
+
+  +
+ diff --git a/artifacts/cccc/GenresRepositoryInterface.xml b/artifacts/cccc/GenresRepositoryInterface.xml new file mode 100644 index 0000000..5bff32e --- /dev/null +++ b/artifacts/cccc/GenresRepositoryInterface.xml @@ -0,0 +1,172 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +definition + + + + + + +declaration + + + + + + +declaration + + + + + + + + + +createGenre(const CreateGenreRequest &) + +declaration + + + + + + + + + +deleteGenreById(qint32) + +declaration + + + + + + + + + +getAllGenres(QVector &) + +declaration + + + + + + + + + +getGenreById(qint32,GenreDTO &) + +declaration + + + + + + + + + +updateGenre(const UpdateGenreRequest &) + +declaration + + + + + + + + + + + +GenresRepositoryInterface + +GenresRepository +true +true + +inheritance + + + + +CreateGenreRequest +true +false + +pass by reference + + +GenreDTO +true +false + +pass by reference + + +QVector +true +false + +pass by reference + + +RepositoryInterface +true +true + +inheritance + + +UpdateGenreRequest +true +false + +pass by reference + + +qint32 +true +true + +pass by value + + + +pass by value + + + + + + diff --git a/artifacts/cccc/Hall.html b/artifacts/cccc/Hall.html new file mode 100644 index 0000000..ea8bb22 --- /dev/null +++ b/artifacts/cccc/Hall.html @@ -0,0 +1,63 @@ + +Detailed report on module Hall + + + +

Detailed report on module Hall

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+SQLiteDatabase [V]
+pass by reference   +./tests_schema/tests_sources/sqlite_database.cpp:237
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/Hall.xml b/artifacts/cccc/Hall.xml new file mode 100644 index 0000000..6c883e2 --- /dev/null +++ b/artifacts/cccc/Hall.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Hall + +SQLiteDatabase +true +false + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/HallDTO.html b/artifacts/cccc/HallDTO.html new file mode 100644 index 0000000..72eae72 --- /dev/null +++ b/artifacts/cccc/HallDTO.html @@ -0,0 +1,63 @@ + +Detailed report on module HallDTO + + + +

Detailed report on module HallDTO

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+HallsRepository [V]
+pass by reference   +./data/sql/halls_repository.cpp:28
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/HallDTO.xml b/artifacts/cccc/HallDTO.xml new file mode 100644 index 0000000..fb4e008 --- /dev/null +++ b/artifacts/cccc/HallDTO.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +HallDTO + +HallsRepository +true +false + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/HallsModel.html b/artifacts/cccc/HallsModel.html new file mode 100644 index 0000000..33a98e6 --- /dev/null +++ b/artifacts/cccc/HallsModel.html @@ -0,0 +1,90 @@ + +Detailed report on module HallsModel + + + +

Detailed report on module HallsModel

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 26 9
McCabe's Cyclomatic NumberMVG 9 3
Lines of CommentCOM 0 0.000
LOC/COML_C****** 
MVG/COMM_C****** 
Weighted Methods per Class (  weighting = unity )WMC1 3 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 3 
Information Flow measure (  inclusive )IF4 0 0.000
Information Flow measure (  visible )IF4v 0 0.000
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
HallsModel(  QObject *,  const QSqlDatabase & )
+definition   +./ui/models/halls_model.cpp:5
+
+
2 0 0------------
headerData(  int,  Orientation,  int )
+definition   +./ui/models/halls_model.cpp:20
+
+
16 8 0------******
initialize(   )
+definition   +./ui/models/halls_model.cpp:8
+
+
8 1 0------------
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +Orientation [CV]
+pass by value   +./ui/models/halls_model.cpp:20
+
+
+QObject [V]
+pass by reference   +./ui/models/halls_model.cpp:5
+
+
+QSqlDatabase [V]
+pass by reference   +./ui/models/halls_model.cpp:5
+
+
+  +
+ diff --git a/artifacts/cccc/HallsModel.xml b/artifacts/cccc/HallsModel.xml new file mode 100644 index 0000000..5e9b18a --- /dev/null +++ b/artifacts/cccc/HallsModel.xml @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +HallsModel(QObject *,const QSqlDatabase &) + +definition + + + + + + + + + +headerData(int,Orientation,int) + +definition + + + + + + + + + +initialize() + +definition + + + + + + + + + + + +HallsModel + + + +Orientation +true +true + +pass by value + + +QObject +true +false + +pass by reference + + +QSqlDatabase +true +false + +pass by reference + + + + + + diff --git a/artifacts/cccc/HallsRepository.html b/artifacts/cccc/HallsRepository.html new file mode 100644 index 0000000..84c6124 --- /dev/null +++ b/artifacts/cccc/HallsRepository.html @@ -0,0 +1,141 @@ + +Detailed report on module HallsRepository + + + +

Detailed report on module HallsRepository

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 71 10
McCabe's Cyclomatic NumberMVG 19 3
Lines of CommentCOM 0 0.000
LOC/COML_C****** 
MVG/COMM_C****** 
Weighted Methods per Class (  weighting = unity )WMC1 7 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 8 
Information Flow measure (  inclusive )IF4 0 0.000
Information Flow measure (  visible )IF4v 0 0.000
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + + + + + + + + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
HallsRepository(  QSqlDatabase &,  QObject * )
+definition   +./data/sql/halls_repository.cpp:10
+
+
2 0 0------------
createHall(  const CreateHallRequest & )
+definition   +./data/sql/halls_repository.cpp:13
+
+
12 3 0------------
deleteHallById(  qint32 )
+definition   +./data/sql/halls_repository.cpp:79
+
+
10 3 0------------
getAllHalls(  QVector & )
+definition   +./data/sql/halls_repository.cpp:47
+
+
12 4 0------------
getHallById(  qint32,  HallDTO & )
+definition   +./data/sql/halls_repository.cpp:28
+
+
15 5 0------******
mapQueryToDTO(  const QSqlQuery & )
+definition   +./data/sql/halls_repository.cpp:92
+
+
7 1 0------------
updateHall(  const UpdateHallRequest & )
+definition   +./data/sql/halls_repository.cpp:63
+
+
13 3 0------------
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +CreateHallRequest [V]
+pass by reference   +./data/sql/halls_repository.cpp:13
+
+
+HallDTO [V]
+pass by reference   +./data/sql/halls_repository.cpp:28
+
+
+QObject [V]
+pass by reference   +./data/sql/halls_repository.cpp:10
+
+
+QSqlDatabase [V]
+pass by reference   +./data/sql/halls_repository.cpp:10
+
+
+QSqlQuery [V]
+pass by reference   +./data/sql/halls_repository.cpp:92
+
+
+QVector [V]
+pass by reference   +./data/sql/halls_repository.cpp:47
+
+
+UpdateHallRequest [V]
+pass by reference   +./data/sql/halls_repository.cpp:63
+
+
+qint32 [CV]
+pass by value   +./data/sql/halls_repository.cpp:28
+pass by value   +./data/sql/halls_repository.cpp:79
+
+
+  +
+ diff --git a/artifacts/cccc/HallsRepository.xml b/artifacts/cccc/HallsRepository.xml new file mode 100644 index 0000000..049a20f --- /dev/null +++ b/artifacts/cccc/HallsRepository.xml @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +HallsRepository(QSqlDatabase &,QObject *) + +definition + + + + + + + + + +createHall(const CreateHallRequest &) + +definition + + + + + + + + + +deleteHallById(qint32) + +definition + + + + + + + + + +getAllHalls(QVector &) + +definition + + + + + + + + + +getHallById(qint32,HallDTO &) + +definition + + + + + + + + + +mapQueryToDTO(const QSqlQuery &) + +definition + + + + + + + + + +updateHall(const UpdateHallRequest &) + +definition + + + + + + + + + + + +HallsRepository + + + +CreateHallRequest +true +false + +pass by reference + + +HallDTO +true +false + +pass by reference + + +QObject +true +false + +pass by reference + + +QSqlDatabase +true +false + +pass by reference + + +QSqlQuery +true +false + +pass by reference + + +QVector +true +false + +pass by reference + + +UpdateHallRequest +true +false + +pass by reference + + +qint32 +true +true + +pass by value + + + +pass by value + + + + + + diff --git a/artifacts/cccc/HallsRepositoryInterface.html b/artifacts/cccc/HallsRepositoryInterface.html new file mode 100644 index 0000000..68e3d80 --- /dev/null +++ b/artifacts/cccc/HallsRepositoryInterface.html @@ -0,0 +1,158 @@ + +Detailed report on module HallsRepositoryInterface + + + +

Detailed report on module HallsRepositoryInterface

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 12 2
McCabe's Cyclomatic NumberMVG 0 0
Lines of CommentCOM 7 1.400
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 5 
Weighted Methods per Class (  weighting = visible )WMCv 5 
Depth of Inheritance TreeDIT 1 
Number of ChildrenNOC 1 
Coupling between objectsCBO 9 
Information Flow measure (  inclusive )IF4 324 64.800
Information Flow measure (  visible )IF4v 36 7.200
Information Flow measure (  concrete )IF4c 4 0.800
+

Definitions and Declarations

+ + + + + + + + + + + + + + + + + +
DescriptionLOCMVGCOML_CM_C
declaration   +./core/services/ticket_generator.h:13
+
1 0 1------------
declaration   +./core/services/session_generator.h:14
+
1 0 0------------
definition   +./core/repositories/halls_repository_interface.h:15
+
3 0 1------------
declaration   +./ui/widgets/reports_widget.h:12
+
1 0 0------------
declaration   +./ui/widgets/directories_management_widget.h:11
+
1 0 0------------
+

Functions

+ + + + + + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
createHall(  const CreateHallRequest & )
+declaration   +./core/repositories/halls_repository_interface.h:18
+
+
1 0 1------------
deleteHallById(  qint32 )
+declaration   +./core/repositories/halls_repository_interface.h:30
+
+
1 0 1------------
getAllHalls(  QVector & )
+declaration   +./core/repositories/halls_repository_interface.h:24
+
+
1 0 1------------
getHallById(  qint32,  HallDTO & )
+declaration   +./core/repositories/halls_repository_interface.h:21
+
+
1 0 1------------
updateHall(  const UpdateHallRequest & )
+declaration   +./core/repositories/halls_repository_interface.h:27
+
+
1 0 1------------
+

Relationships

+ + + + + +
ClientsSuppliers
+HallsRepository [CV]
+inheritance   +./data/sql/halls_repository.h:10
+
+
+SessionGenerator
+has by reference   +./core/services/session_generator.h:36
+
+
+TicketGenerator
+has by reference   +./core/services/ticket_generator.h:38
+
+
+  +
+CreateHallRequest [V]
+pass by reference   +./core/repositories/halls_repository_interface.h:18
+
+
+HallDTO [V]
+pass by reference   +./core/repositories/halls_repository_interface.h:21
+
+
+QVector [V]
+pass by reference   +./core/repositories/halls_repository_interface.h:24
+
+
+RepositoryInterface [CV]
+inheritance   +./core/repositories/halls_repository_interface.h:15
+
+
+UpdateHallRequest [V]
+pass by reference   +./core/repositories/halls_repository_interface.h:27
+
+
+qint32 [CV]
+pass by value   +./core/repositories/halls_repository_interface.h:21
+pass by value   +./core/repositories/halls_repository_interface.h:30
+
+
+  +
+ diff --git a/artifacts/cccc/HallsRepositoryInterface.xml b/artifacts/cccc/HallsRepositoryInterface.xml new file mode 100644 index 0000000..d95f514 --- /dev/null +++ b/artifacts/cccc/HallsRepositoryInterface.xml @@ -0,0 +1,200 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +declaration + + + + + + +declaration + + + + + + +definition + + + + + + +declaration + + + + + + +declaration + + + + + + + + + +createHall(const CreateHallRequest &) + +declaration + + + + + + + + + +deleteHallById(qint32) + +declaration + + + + + + + + + +getAllHalls(QVector &) + +declaration + + + + + + + + + +getHallById(qint32,HallDTO &) + +declaration + + + + + + + + + +updateHall(const UpdateHallRequest &) + +declaration + + + + + + + + + + + +HallsRepositoryInterface + +HallsRepository +true +true + +inheritance + + +SessionGenerator +false +false + +has by reference + + +TicketGenerator +false +false + +has by reference + + + + +CreateHallRequest +true +false + +pass by reference + + +HallDTO +true +false + +pass by reference + + +QVector +true +false + +pass by reference + + +RepositoryInterface +true +true + +inheritance + + +UpdateHallRequest +true +false + +pass by reference + + +qint32 +true +true + +pass by value + + + +pass by value + + + + + + diff --git a/artifacts/cccc/Link.html b/artifacts/cccc/Link.html new file mode 100644 index 0000000..d195e30 --- /dev/null +++ b/artifacts/cccc/Link.html @@ -0,0 +1,63 @@ + +Detailed report on module Link + + + +

Detailed report on module Link

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+ApplicationConnector [V]
+pass by reference   +./core/controllers/application_connector.h:121
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/Link.xml b/artifacts/cccc/Link.xml new file mode 100644 index 0000000..cb1948b --- /dev/null +++ b/artifacts/cccc/Link.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Link + +ApplicationConnector +true +false + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/LinkList.html b/artifacts/cccc/LinkList.html new file mode 100644 index 0000000..701cb8a --- /dev/null +++ b/artifacts/cccc/LinkList.html @@ -0,0 +1,63 @@ + +Detailed report on module LinkList + + + +

Detailed report on module LinkList

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+ApplicationConnector [V]
+pass by reference   +./core/controllers/application_connector.h:128
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/LinkList.xml b/artifacts/cccc/LinkList.xml new file mode 100644 index 0000000..fe6a7af --- /dev/null +++ b/artifacts/cccc/LinkList.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +LinkList + +ApplicationConnector +true +false + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/MainWindow.html b/artifacts/cccc/MainWindow.html new file mode 100644 index 0000000..15be612 --- /dev/null +++ b/artifacts/cccc/MainWindow.html @@ -0,0 +1,106 @@ + +Detailed report on module MainWindow + + + +

Detailed report on module MainWindow

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 67 13
McCabe's Cyclomatic NumberMVG 9 2
Lines of CommentCOM 37 7.400
LOC/COML_C 1.811 
MVG/COMM_C 0.243 
Weighted Methods per Class (  weighting = unity )WMC1 5 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 3 
Information Flow measure (  inclusive )IF4 0 0.000
Information Flow measure (  visible )IF4v 0 0.000
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + + + + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
MainWindow(  qint32,  qint32,  QWidget * )
+definition   +./ui/main_window/main_window.cpp:9
+
+
7 0 2------------
configureAccessLevel(   )
+definition   +./ui/main_window/main_window.cpp:20
+
+
26 7 24 1.083 0.292
configureAllTableViews(   )
+definition   +./ui/main_window/main_window.cpp:69
+
+
10 2 2------------
disableSelection(  QTableView * )
+definition   +./ui/main_window/main_window.cpp:86
+
+
7 0 3------------
loadDefaultConfiguration(  QTableView * )
+definition   +./ui/main_window/main_window.cpp:111
+
+
17 0 6------------
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +QTableView [V]
+pass by reference   +./ui/main_window/main_window.cpp:86
+pass by reference   +./ui/main_window/main_window.cpp:111
+
+
+QWidget [V]
+pass by reference   +./ui/main_window/main_window.cpp:9
+
+
+qint32 [CV]
+pass by value   +./ui/main_window/main_window.cpp:9
+pass by value   +./ui/main_window/main_window.cpp:9
+
+
+  +
+ diff --git a/artifacts/cccc/MainWindow.xml b/artifacts/cccc/MainWindow.xml new file mode 100644 index 0000000..97279c9 --- /dev/null +++ b/artifacts/cccc/MainWindow.xml @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +MainWindow(qint32,qint32,QWidget *) + +definition + + + + + + + + + +configureAccessLevel() + +definition + + + + + + + + + +configureAllTableViews() + +definition + + + + + + + + + +disableSelection(QTableView *) + +definition + + + + + + + + + +loadDefaultConfiguration(QTableView *) + +definition + + + + + + + + + + + +MainWindow + + + +QTableView +true +false + +pass by reference + + + +pass by reference + + +QWidget +true +false + +pass by reference + + +qint32 +true +true + +pass by value + + + +pass by value + + + + + + diff --git a/artifacts/cccc/ModelManager.html b/artifacts/cccc/ModelManager.html new file mode 100644 index 0000000..b70c308 --- /dev/null +++ b/artifacts/cccc/ModelManager.html @@ -0,0 +1,124 @@ + +Detailed report on module ModelManager + + + +

Detailed report on module ModelManager

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 62 7
McCabe's Cyclomatic NumberMVG 10 1
Lines of CommentCOM 3 0.333
LOC/COML_C20.667 
MVG/COMM_C 3.333 
Weighted Methods per Class (  weighting = unity )WMC1 9 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0 0.000
Information Flow measure (  visible )IF4v 0 0.000
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + + + + + + + + + + + + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
ModelManager(   )
+definition   +./core/services/model_manager.cpp:11
+
+
8 2 1------------
getModel(  const QString & )
+definition   +./core/services/model_manager.cpp:75
+
+
9 3 0------------
initialize(   )
+definition   +./core/services/model_manager.cpp:49
+
+
15 0 2------------
instance(   )
+definition   +./core/services/model_manager.cpp:27
+
+
4 1 0------------
registeredModelTableNames(   )
+definition   +./core/services/model_manager.cpp:32
+
+
3 1 0------------
registeredModelTableNames(  QString )
+definition   +./core/services/model_manager.cpp:37
+
+
11 3 0------------
resetFilter(  const QString & )
+definition   +./core/services/model_manager.cpp:86
+
+
4 0 0------------
setMultiColumnFilter(  const QString &,  const QString & )
+definition   +./core/services/model_manager.cpp:91
+
+
5 0 0------------
~ModelManager(   )
+definition   +./core/services/model_manager.cpp:23
+
+
3 0 0------------
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +QString [CV]
+pass by value   +./core/services/model_manager.cpp:37
+pass by reference   +./core/services/model_manager.cpp:75
+pass by reference   +./core/services/model_manager.cpp:86
+pass by reference   +./core/services/model_manager.cpp:91
+pass by reference   +./core/services/model_manager.cpp:92
+
+
+  +
+ diff --git a/artifacts/cccc/ModelManager.xml b/artifacts/cccc/ModelManager.xml new file mode 100644 index 0000000..eaccb55 --- /dev/null +++ b/artifacts/cccc/ModelManager.xml @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +ModelManager() + +definition + + + + + + + + + +getModel(const QString &) + +definition + + + + + + + + + +initialize() + +definition + + + + + + + + + +instance() + +definition + + + + + + + + + +registeredModelTableNames() + +definition + + + + + + + + + +registeredModelTableNames(QString) + +definition + + + + + + + + + +resetFilter(const QString &) + +definition + + + + + + + + + +setMultiColumnFilter(const QString &,const QString &) + +definition + + + + + + + + + +~ModelManager() + +definition + + + + + + + + + + + +ModelManager + + + +QString +true +true + +pass by value + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + + + + diff --git a/artifacts/cccc/Movie.html b/artifacts/cccc/Movie.html new file mode 100644 index 0000000..b92b2c9 --- /dev/null +++ b/artifacts/cccc/Movie.html @@ -0,0 +1,63 @@ + +Detailed report on module Movie + + + +

Detailed report on module Movie

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+SQLiteDatabase [V]
+pass by reference   +./tests_schema/tests_sources/sqlite_database.cpp:169
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/Movie.xml b/artifacts/cccc/Movie.xml new file mode 100644 index 0000000..962454a --- /dev/null +++ b/artifacts/cccc/Movie.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Movie + +SQLiteDatabase +true +false + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/MovieDTO.html b/artifacts/cccc/MovieDTO.html new file mode 100644 index 0000000..760acd7 --- /dev/null +++ b/artifacts/cccc/MovieDTO.html @@ -0,0 +1,63 @@ + +Detailed report on module MovieDTO + + + +

Detailed report on module MovieDTO

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+MoviesRepository [V]
+pass by reference   +./data/sql/movies_repository.cpp:48
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/MovieDTO.xml b/artifacts/cccc/MovieDTO.xml new file mode 100644 index 0000000..73569fc --- /dev/null +++ b/artifacts/cccc/MovieDTO.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +MovieDTO + +MoviesRepository +true +false + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/MoviesModel.html b/artifacts/cccc/MoviesModel.html new file mode 100644 index 0000000..80f4c8b --- /dev/null +++ b/artifacts/cccc/MoviesModel.html @@ -0,0 +1,111 @@ + +Detailed report on module MoviesModel + + + +

Detailed report on module MoviesModel

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 57 11
McCabe's Cyclomatic NumberMVG 15 3
Lines of CommentCOM 2 0.400
LOC/COML_C28.500 
MVG/COMM_C 7.500 
Weighted Methods per Class (  weighting = unity )WMC1 5 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 4 
Information Flow measure (  inclusive )IF4 0 0.000
Information Flow measure (  visible )IF4v 0 0.000
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + + + + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
MoviesModel(  QObject *,  const QSqlDatabase & )
+definition   +./ui/models/movies_model.cpp:6
+
+
2 0 0------------
buildGenreIdFilterCondition(  const QString &,  QString & )
+definition   +./ui/models/movies_model.cpp:43
+
+
13 2 0------------
createMultiColumnFilter(  const QString & )
+definition   +./ui/models/movies_model.cpp:60
+
+
14 3 1------------
headerData(  int,  Orientation,  int )
+definition   +./ui/models/movies_model.cpp:24
+
+
18 9 0------******
initialize(   )
+definition   +./ui/models/movies_model.cpp:9
+
+
10 1 1------------
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +Orientation [CV]
+pass by value   +./ui/models/movies_model.cpp:24
+
+
+QObject [V]
+pass by reference   +./ui/models/movies_model.cpp:6
+
+
+QSqlDatabase [V]
+pass by reference   +./ui/models/movies_model.cpp:6
+
+
+QString [V]
+pass by reference   +./ui/models/movies_model.cpp:43
+pass by reference   +./ui/models/movies_model.cpp:44
+pass by reference   +./ui/models/movies_model.cpp:60
+
+
+  +
+ diff --git a/artifacts/cccc/MoviesModel.xml b/artifacts/cccc/MoviesModel.xml new file mode 100644 index 0000000..9d78cc4 --- /dev/null +++ b/artifacts/cccc/MoviesModel.xml @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +MoviesModel(QObject *,const QSqlDatabase &) + +definition + + + + + + + + + +buildGenreIdFilterCondition(const QString &,QString &) + +definition + + + + + + + + + +createMultiColumnFilter(const QString &) + +definition + + + + + + + + + +headerData(int,Orientation,int) + +definition + + + + + + + + + +initialize() + +definition + + + + + + + + + + + +MoviesModel + + + +Orientation +true +true + +pass by value + + +QObject +true +false + +pass by reference + + +QSqlDatabase +true +false + +pass by reference + + +QString +true +false + +pass by reference + + + +pass by reference + + + +pass by reference + + + + + + diff --git a/artifacts/cccc/MoviesRepository.html b/artifacts/cccc/MoviesRepository.html new file mode 100644 index 0000000..f273bfb --- /dev/null +++ b/artifacts/cccc/MoviesRepository.html @@ -0,0 +1,141 @@ + +Detailed report on module MoviesRepository + + + +

Detailed report on module MoviesRepository

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 75 11
McCabe's Cyclomatic NumberMVG 19 3
Lines of CommentCOM 0 0.000
LOC/COML_C****** 
MVG/COMM_C****** 
Weighted Methods per Class (  weighting = unity )WMC1 7 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 8 
Information Flow measure (  inclusive )IF4 0 0.000
Information Flow measure (  visible )IF4v 0 0.000
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + + + + + + + + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
MoviesRepository(  QSqlDatabase &,  QObject * )
+definition   +./data/sql/movies_repository.cpp:10
+
+
2 0 0------------
createMovie(  const CreateMovieRequest & )
+definition   +./data/sql/movies_repository.cpp:14
+
+
13 3 0------------
deleteMovieById(  qint32 )
+definition   +./data/sql/movies_repository.cpp:85
+
+
10 3 0------------
getAllMovies(  QVector & )
+definition   +./data/sql/movies_repository.cpp:31
+
+
12 4 0------------
getMovieById(  qint32,  MovieDTO & )
+definition   +./data/sql/movies_repository.cpp:47
+
+
16 5 0------******
mapQueryToDTO(  const QSqlQuery & )
+definition   +./data/sql/movies_repository.cpp:98
+
+
8 1 0------------
updateMovie(  const UpdateMovieRequest & )
+definition   +./data/sql/movies_repository.cpp:68
+
+
14 3 0------------
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +CreateMovieRequest [V]
+pass by reference   +./data/sql/movies_repository.cpp:14
+
+
+MovieDTO [V]
+pass by reference   +./data/sql/movies_repository.cpp:48
+
+
+QObject [V]
+pass by reference   +./data/sql/movies_repository.cpp:10
+
+
+QSqlDatabase [V]
+pass by reference   +./data/sql/movies_repository.cpp:10
+
+
+QSqlQuery [V]
+pass by reference   +./data/sql/movies_repository.cpp:98
+
+
+QVector [V]
+pass by reference   +./data/sql/movies_repository.cpp:31
+
+
+UpdateMovieRequest [V]
+pass by reference   +./data/sql/movies_repository.cpp:68
+
+
+qint32 [CV]
+pass by value   +./data/sql/movies_repository.cpp:47
+pass by value   +./data/sql/movies_repository.cpp:85
+
+
+  +
+ diff --git a/artifacts/cccc/MoviesRepository.xml b/artifacts/cccc/MoviesRepository.xml new file mode 100644 index 0000000..a2c43f6 --- /dev/null +++ b/artifacts/cccc/MoviesRepository.xml @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +MoviesRepository(QSqlDatabase &,QObject *) + +definition + + + + + + + + + +createMovie(const CreateMovieRequest &) + +definition + + + + + + + + + +deleteMovieById(qint32) + +definition + + + + + + + + + +getAllMovies(QVector &) + +definition + + + + + + + + + +getMovieById(qint32,MovieDTO &) + +definition + + + + + + + + + +mapQueryToDTO(const QSqlQuery &) + +definition + + + + + + + + + +updateMovie(const UpdateMovieRequest &) + +definition + + + + + + + + + + + +MoviesRepository + + + +CreateMovieRequest +true +false + +pass by reference + + +MovieDTO +true +false + +pass by reference + + +QObject +true +false + +pass by reference + + +QSqlDatabase +true +false + +pass by reference + + +QSqlQuery +true +false + +pass by reference + + +QVector +true +false + +pass by reference + + +UpdateMovieRequest +true +false + +pass by reference + + +qint32 +true +true + +pass by value + + + +pass by value + + + + + + diff --git a/artifacts/cccc/MoviesRepositoryInterface.html b/artifacts/cccc/MoviesRepositoryInterface.html new file mode 100644 index 0000000..4adfca6 --- /dev/null +++ b/artifacts/cccc/MoviesRepositoryInterface.html @@ -0,0 +1,148 @@ + +Detailed report on module MoviesRepositoryInterface + + + +

Detailed report on module MoviesRepositoryInterface

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 12 2
McCabe's Cyclomatic NumberMVG 0 0
Lines of CommentCOM 6 1.200
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 5 
Weighted Methods per Class (  weighting = visible )WMCv 5 
Depth of Inheritance TreeDIT 1 
Number of ChildrenNOC 1 
Coupling between objectsCBO 8 
Information Flow measure (  inclusive )IF4 144 28.800
Information Flow measure (  visible )IF4v 36 7.200
Information Flow measure (  concrete )IF4c 4 0.800
+

Definitions and Declarations

+ + + + + + + + + + + + + + +
DescriptionLOCMVGCOML_CM_C
declaration   +./core/services/session_generator.h:15
+
1 0 0------------
definition   +./core/repositories/movies_repository_interface.h:15
+
3 0 1------------
declaration   +./ui/widgets/reports_widget.h:14
+
1 0 0------------
declaration   +./ui/widgets/directories_management_widget.h:12
+
1 0 0------------
+

Functions

+ + + + + + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
createMovie(  const CreateMovieRequest & )
+declaration   +./core/repositories/movies_repository_interface.h:18
+
+
1 0 1------------
deleteMovieById(  qint32 )
+declaration   +./core/repositories/movies_repository_interface.h:31
+
+
1 0 1------------
getAllMovies(  QVector & )
+declaration   +./core/repositories/movies_repository_interface.h:25
+
+
1 0 1------------
getMovieById(  qint32,  MovieDTO & )
+declaration   +./core/repositories/movies_repository_interface.h:21
+
+
2 0 1------------
updateMovie(  const UpdateMovieRequest & )
+declaration   +./core/repositories/movies_repository_interface.h:28
+
+
1 0 1------------
+

Relationships

+ + + + + +
ClientsSuppliers
+MoviesRepository [CV]
+inheritance   +./data/sql/movies_repository.h:9
+
+
+SessionGenerator
+has by reference   +./core/services/session_generator.h:37
+
+
+  +
+CreateMovieRequest [V]
+pass by reference   +./core/repositories/movies_repository_interface.h:18
+
+
+MovieDTO [V]
+pass by reference   +./core/repositories/movies_repository_interface.h:22
+
+
+QVector [V]
+pass by reference   +./core/repositories/movies_repository_interface.h:25
+
+
+RepositoryInterface [CV]
+inheritance   +./core/repositories/movies_repository_interface.h:15
+
+
+UpdateMovieRequest [V]
+pass by reference   +./core/repositories/movies_repository_interface.h:28
+
+
+qint32 [CV]
+pass by value   +./core/repositories/movies_repository_interface.h:21
+pass by value   +./core/repositories/movies_repository_interface.h:31
+
+
+  +
+ diff --git a/artifacts/cccc/MoviesRepositoryInterface.xml b/artifacts/cccc/MoviesRepositoryInterface.xml new file mode 100644 index 0000000..39c03c4 --- /dev/null +++ b/artifacts/cccc/MoviesRepositoryInterface.xml @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +declaration + + + + + + +definition + + + + + + +declaration + + + + + + +declaration + + + + + + + + + +createMovie(const CreateMovieRequest &) + +declaration + + + + + + + + + +deleteMovieById(qint32) + +declaration + + + + + + + + + +getAllMovies(QVector &) + +declaration + + + + + + + + + +getMovieById(qint32,MovieDTO &) + +declaration + + + + + + + + + +updateMovie(const UpdateMovieRequest &) + +declaration + + + + + + + + + + + +MoviesRepositoryInterface + +MoviesRepository +true +true + +inheritance + + +SessionGenerator +false +false + +has by reference + + + + +CreateMovieRequest +true +false + +pass by reference + + +MovieDTO +true +false + +pass by reference + + +QVector +true +false + +pass by reference + + +RepositoryInterface +true +true + +inheritance + + +UpdateMovieRequest +true +false + +pass by reference + + +qint32 +true +true + +pass by value + + + +pass by value + + + + + + diff --git a/artifacts/cccc/MultiColumnSortFilterProxyModel.html b/artifacts/cccc/MultiColumnSortFilterProxyModel.html new file mode 100644 index 0000000..658b710 --- /dev/null +++ b/artifacts/cccc/MultiColumnSortFilterProxyModel.html @@ -0,0 +1,79 @@ + +Detailed report on module MultiColumnSortFilterProxyModel + + + +

Detailed report on module MultiColumnSortFilterProxyModel

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 22 11
McCabe's Cyclomatic NumberMVG 7 3
Lines of CommentCOM 0 0.000
LOC/COML_C****** 
MVG/COMM_C****** 
Weighted Methods per Class (  weighting = unity )WMC1 2 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 2 
Information Flow measure (  inclusive )IF4 0 0.000
Information Flow measure (  visible )IF4v 0 0.000
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + + + + +
Function prototypeLOCMVGCOML_CM_C
MultiColumnSortFilterProxyModel(  QObject * )
+definition   +./ui/models/multi_column_filter_proxy_model.cpp:5
+
+
3 0 0------------
filterAcceptsRow(  int,  const QModelIndex & )
+definition   +./ui/models/multi_column_filter_proxy_model.cpp:9
+
+
19 7 0------******
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +QModelIndex [V]
+pass by reference   +./ui/models/multi_column_filter_proxy_model.cpp:10
+
+
+QObject [V]
+pass by reference   +./ui/models/multi_column_filter_proxy_model.cpp:6
+
+
+  +
+ diff --git a/artifacts/cccc/MultiColumnSortFilterProxyModel.xml b/artifacts/cccc/MultiColumnSortFilterProxyModel.xml new file mode 100644 index 0000000..86df528 --- /dev/null +++ b/artifacts/cccc/MultiColumnSortFilterProxyModel.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +MultiColumnSortFilterProxyModel(QObject *) + +definition + + + + + + + + + +filterAcceptsRow(int,const QModelIndex &) + +definition + + + + + + + + + + + +MultiColumnSortFilterProxyModel + + + +QModelIndex +true +false + +pass by reference + + +QObject +true +false + +pass by reference + + + + + + diff --git a/artifacts/cccc/NewGenre.html b/artifacts/cccc/NewGenre.html new file mode 100644 index 0000000..19a6de5 --- /dev/null +++ b/artifacts/cccc/NewGenre.html @@ -0,0 +1,63 @@ + +Detailed report on module NewGenre + + + +

Detailed report on module NewGenre

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+SQLiteDatabase [V]
+pass by reference   +./tests_schema/tests_sources/sqlite_database.cpp:86
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/NewGenre.xml b/artifacts/cccc/NewGenre.xml new file mode 100644 index 0000000..f1078a9 --- /dev/null +++ b/artifacts/cccc/NewGenre.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +NewGenre + +SQLiteDatabase +true +false + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/NewHall.html b/artifacts/cccc/NewHall.html new file mode 100644 index 0000000..dc8fafb --- /dev/null +++ b/artifacts/cccc/NewHall.html @@ -0,0 +1,63 @@ + +Detailed report on module NewHall + + + +

Detailed report on module NewHall

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+SQLiteDatabase [V]
+pass by reference   +./tests_schema/tests_sources/sqlite_database.cpp:216
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/NewHall.xml b/artifacts/cccc/NewHall.xml new file mode 100644 index 0000000..b9af67d --- /dev/null +++ b/artifacts/cccc/NewHall.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +NewHall + +SQLiteDatabase +true +false + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/NewMovie.html b/artifacts/cccc/NewMovie.html new file mode 100644 index 0000000..b6ba476 --- /dev/null +++ b/artifacts/cccc/NewMovie.html @@ -0,0 +1,63 @@ + +Detailed report on module NewMovie + + + +

Detailed report on module NewMovie

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+SQLiteDatabase [V]
+pass by reference   +./tests_schema/tests_sources/sqlite_database.cpp:147
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/NewMovie.xml b/artifacts/cccc/NewMovie.xml new file mode 100644 index 0000000..7b3f680 --- /dev/null +++ b/artifacts/cccc/NewMovie.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +NewMovie + +SQLiteDatabase +true +false + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/NewRefund.html b/artifacts/cccc/NewRefund.html new file mode 100644 index 0000000..0838557 --- /dev/null +++ b/artifacts/cccc/NewRefund.html @@ -0,0 +1,63 @@ + +Detailed report on module NewRefund + + + +

Detailed report on module NewRefund

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+SQLiteDatabase [V]
+pass by reference   +./tests_schema/tests_sources/sqlite_database.cpp:422
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/NewRefund.xml b/artifacts/cccc/NewRefund.xml new file mode 100644 index 0000000..0291fb1 --- /dev/null +++ b/artifacts/cccc/NewRefund.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +NewRefund + +SQLiteDatabase +true +false + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/NewSession.html b/artifacts/cccc/NewSession.html new file mode 100644 index 0000000..e072f37 --- /dev/null +++ b/artifacts/cccc/NewSession.html @@ -0,0 +1,63 @@ + +Detailed report on module NewSession + + + +

Detailed report on module NewSession

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+SQLiteDatabase [V]
+pass by reference   +./tests_schema/tests_sources/sqlite_database.cpp:280
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/NewSession.xml b/artifacts/cccc/NewSession.xml new file mode 100644 index 0000000..052b13d --- /dev/null +++ b/artifacts/cccc/NewSession.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +NewSession + +SQLiteDatabase +true +false + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/NewTicket.html b/artifacts/cccc/NewTicket.html new file mode 100644 index 0000000..868a5c6 --- /dev/null +++ b/artifacts/cccc/NewTicket.html @@ -0,0 +1,63 @@ + +Detailed report on module NewTicket + + + +

Detailed report on module NewTicket

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+SQLiteDatabase [V]
+pass by reference   +./tests_schema/tests_sources/sqlite_database.cpp:354
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/NewTicket.xml b/artifacts/cccc/NewTicket.xml new file mode 100644 index 0000000..0ce9cef --- /dev/null +++ b/artifacts/cccc/NewTicket.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +NewTicket + +SQLiteDatabase +true +false + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/Orientation.html b/artifacts/cccc/Orientation.html new file mode 100644 index 0000000..3bd833a --- /dev/null +++ b/artifacts/cccc/Orientation.html @@ -0,0 +1,88 @@ + +Detailed report on module Orientation + + + +

Detailed report on module Orientation

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 6 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+GenresModel [CV]
+pass by value   +./ui/models/genres_model.cpp:19
+
+
+HallsModel [CV]
+pass by value   +./ui/models/halls_model.cpp:20
+
+
+MoviesModel [CV]
+pass by value   +./ui/models/movies_model.cpp:24
+
+
+RefundsModel [CV]
+pass by value   +./ui/models/refunds_model.cpp:19
+
+
+SessionsModel [CV]
+pass by value   +./ui/models/sessions_model.cpp:68
+
+
+TicketsModel [CV]
+pass by value   +./ui/models/tickets_model.cpp:20
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/Orientation.xml b/artifacts/cccc/Orientation.xml new file mode 100644 index 0000000..6109241 --- /dev/null +++ b/artifacts/cccc/Orientation.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Orientation + +GenresModel +true +true + +pass by value + + +HallsModel +true +true + +pass by value + + +MoviesModel +true +true + +pass by value + + +RefundsModel +true +true + +pass by value + + +SessionsModel +true +true + +pass by value + + +TicketsModel +true +true + +pass by value + + + + + + + + diff --git a/artifacts/cccc/QAbstractAxis.html b/artifacts/cccc/QAbstractAxis.html new file mode 100644 index 0000000..b2d16cf --- /dev/null +++ b/artifacts/cccc/QAbstractAxis.html @@ -0,0 +1,65 @@ + +Detailed report on module QAbstractAxis + + + +

Detailed report on module QAbstractAxis

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+TicketSalesReportWidget [V]
+pass by reference   +./ui/widgets/ticket_sales_report_widget.cpp:347
+pass by reference   +./ui/widgets/ticket_sales_report_widget.cpp:348
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/QAbstractAxis.xml b/artifacts/cccc/QAbstractAxis.xml new file mode 100644 index 0000000..64eeb41 --- /dev/null +++ b/artifacts/cccc/QAbstractAxis.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +QAbstractAxis + +TicketSalesReportWidget +true +false + +pass by reference + + + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/QAbstractItemModel.html b/artifacts/cccc/QAbstractItemModel.html new file mode 100644 index 0000000..34e403b --- /dev/null +++ b/artifacts/cccc/QAbstractItemModel.html @@ -0,0 +1,63 @@ + +Detailed report on module QAbstractItemModel + + + +

Detailed report on module QAbstractItemModel

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+EntityUpdaterWidget [V]
+pass by reference   +./ui/widgets/entity_updater_widget.cpp:430
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/QAbstractItemModel.xml b/artifacts/cccc/QAbstractItemModel.xml new file mode 100644 index 0000000..c07829a --- /dev/null +++ b/artifacts/cccc/QAbstractItemModel.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +QAbstractItemModel + +EntityUpdaterWidget +true +false + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/QAbstractSeries.html b/artifacts/cccc/QAbstractSeries.html new file mode 100644 index 0000000..e598eba --- /dev/null +++ b/artifacts/cccc/QAbstractSeries.html @@ -0,0 +1,63 @@ + +Detailed report on module QAbstractSeries + + + +

Detailed report on module QAbstractSeries

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+TicketSalesReportWidget [V]
+pass by reference   +./ui/widgets/ticket_sales_report_widget.cpp:346
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/QAbstractSeries.xml b/artifacts/cccc/QAbstractSeries.xml new file mode 100644 index 0000000..fa1ac9a --- /dev/null +++ b/artifacts/cccc/QAbstractSeries.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +QAbstractSeries + +TicketSalesReportWidget +true +false + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/QChart.html b/artifacts/cccc/QChart.html new file mode 100644 index 0000000..43997d0 --- /dev/null +++ b/artifacts/cccc/QChart.html @@ -0,0 +1,65 @@ + +Detailed report on module QChart + + + +

Detailed report on module QChart

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+TicketSalesReportWidget [V]
+pass by reference   +./ui/widgets/ticket_sales_report_widget.cpp:346
+pass by reference   +./ui/widgets/ticket_sales_report_widget.cpp:356
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/QChart.xml b/artifacts/cccc/QChart.xml new file mode 100644 index 0000000..3849ea0 --- /dev/null +++ b/artifacts/cccc/QChart.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +QChart + +TicketSalesReportWidget +true +false + +pass by reference + + + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/QDateTime.html b/artifacts/cccc/QDateTime.html new file mode 100644 index 0000000..96197d0 --- /dev/null +++ b/artifacts/cccc/QDateTime.html @@ -0,0 +1,78 @@ + +Detailed report on module QDateTime + + + +

Detailed report on module QDateTime

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 2 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+DateTimeGenerator [V]
+pass by reference   +./core/services/date_time_generator.cpp:29
+pass by reference   +./core/services/date_time_generator.cpp:56
+pass by reference   +./core/services/date_time_generator.cpp:57
+
+
+TicketSalesReportWidget [V]
+pass by reference   +./ui/widgets/ticket_sales_report_widget.cpp:232
+pass by reference   +./ui/widgets/ticket_sales_report_widget.cpp:233
+pass by reference   +./ui/widgets/ticket_sales_report_widget.cpp:274
+pass by reference   +./ui/widgets/ticket_sales_report_widget.cpp:275
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/QDateTime.xml b/artifacts/cccc/QDateTime.xml new file mode 100644 index 0000000..aff6518 --- /dev/null +++ b/artifacts/cccc/QDateTime.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +QDateTime + +DateTimeGenerator +true +false + +pass by reference + + + +pass by reference + + + +pass by reference + + +TicketSalesReportWidget +true +false + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/QDialog.html b/artifacts/cccc/QDialog.html new file mode 100644 index 0000000..b056b44 --- /dev/null +++ b/artifacts/cccc/QDialog.html @@ -0,0 +1,68 @@ + +Detailed report on module QDialog + + + +

Detailed report on module QDialog

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 2 
Coupling between objectsCBO 2 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+AuthDialog [CV]
+inheritance   +./ui/dialogs/auth_dialog.h:13
+
+
+SearchDialog [CV]
+inheritance   +./ui/dialogs/search_dialog.h:15
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/QDialog.xml b/artifacts/cccc/QDialog.xml new file mode 100644 index 0000000..bac2bcc --- /dev/null +++ b/artifacts/cccc/QDialog.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +QDialog + +AuthDialog +true +true + +inheritance + + +SearchDialog +true +true + +inheritance + + + + + + + + diff --git a/artifacts/cccc/QList.html b/artifacts/cccc/QList.html new file mode 100644 index 0000000..f0fecf2 --- /dev/null +++ b/artifacts/cccc/QList.html @@ -0,0 +1,63 @@ + +Detailed report on module QList + + + +

Detailed report on module QList

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+SessionGenerator [V]
+pass by reference   +./core/services/session_generator.cpp:182
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/QList.xml b/artifacts/cccc/QList.xml new file mode 100644 index 0000000..9e3c6c2 --- /dev/null +++ b/artifacts/cccc/QList.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +QList + +SessionGenerator +true +false + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/QLocale.html b/artifacts/cccc/QLocale.html new file mode 100644 index 0000000..1747319 --- /dev/null +++ b/artifacts/cccc/QLocale.html @@ -0,0 +1,63 @@ + +Detailed report on module QLocale + + + +

Detailed report on module QLocale

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+DateTimeDelegate [V]
+pass by reference   +./ui/delegates/date_time_delegate.cpp:7
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/QLocale.xml b/artifacts/cccc/QLocale.xml new file mode 100644 index 0000000..d2ea843 --- /dev/null +++ b/artifacts/cccc/QLocale.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +QLocale + +DateTimeDelegate +true +false + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/QMainWindow.html b/artifacts/cccc/QMainWindow.html new file mode 100644 index 0000000..1c71e15 --- /dev/null +++ b/artifacts/cccc/QMainWindow.html @@ -0,0 +1,63 @@ + +Detailed report on module QMainWindow + + + +

Detailed report on module QMainWindow

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 1 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+MainWindow [CV]
+inheritance   +./ui/main_window/main_window.h:7
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/QMainWindow.xml b/artifacts/cccc/QMainWindow.xml new file mode 100644 index 0000000..a2b60c4 --- /dev/null +++ b/artifacts/cccc/QMainWindow.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +QMainWindow + +MainWindow +true +true + +inheritance + + + + + + + + diff --git a/artifacts/cccc/QMap.html b/artifacts/cccc/QMap.html new file mode 100644 index 0000000..6b13531 --- /dev/null +++ b/artifacts/cccc/QMap.html @@ -0,0 +1,65 @@ + +Detailed report on module QMap + + + +

Detailed report on module QMap

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+TicketSalesReportWidget [V]
+pass by reference   +./ui/widgets/ticket_sales_report_widget.cpp:253
+pass by reference   +./ui/widgets/ticket_sales_report_widget.cpp:282
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/QMap.xml b/artifacts/cccc/QMap.xml new file mode 100644 index 0000000..0d589ff --- /dev/null +++ b/artifacts/cccc/QMap.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +QMap + +TicketSalesReportWidget +true +false + +pass by reference + + + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/QMetaObject.html b/artifacts/cccc/QMetaObject.html new file mode 100644 index 0000000..7ab6061 --- /dev/null +++ b/artifacts/cccc/QMetaObject.html @@ -0,0 +1,65 @@ + +Detailed report on module QMetaObject + + + +

Detailed report on module QMetaObject

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+ApplicationConnector [V]
+pass by reference   +./core/controllers/application_connector.cpp:273
+pass by reference   +./core/controllers/application_connector.cpp:277
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/QMetaObject.xml b/artifacts/cccc/QMetaObject.xml new file mode 100644 index 0000000..0ac59ac --- /dev/null +++ b/artifacts/cccc/QMetaObject.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +QMetaObject + +ApplicationConnector +true +false + +pass by reference + + + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/QModelIndex.html b/artifacts/cccc/QModelIndex.html new file mode 100644 index 0000000..c7664a3 --- /dev/null +++ b/artifacts/cccc/QModelIndex.html @@ -0,0 +1,68 @@ + +Detailed report on module QModelIndex + + + +

Detailed report on module QModelIndex

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 2 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+BaseSqlTableModel [V]
+pass by reference   +./ui/models/base_sql_table_model.cpp:23
+
+
+MultiColumnSortFilterProxyModel [V]
+pass by reference   +./ui/models/multi_column_filter_proxy_model.cpp:10
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/QModelIndex.xml b/artifacts/cccc/QModelIndex.xml new file mode 100644 index 0000000..98de09a --- /dev/null +++ b/artifacts/cccc/QModelIndex.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +QModelIndex + +BaseSqlTableModel +true +false + +pass by reference + + +MultiColumnSortFilterProxyModel +true +false + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/QObject.html b/artifacts/cccc/QObject.html new file mode 100644 index 0000000..22ab9ec --- /dev/null +++ b/artifacts/cccc/QObject.html @@ -0,0 +1,170 @@ + +Detailed report on module QObject + + + +

Detailed report on module QObject

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 2 
Coupling between objectsCBO 22 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+ApplicationConnector [V]
+pass by reference   +./core/controllers/application_connector.cpp:8
+pass by reference   +./core/controllers/application_connector.cpp:268
+
+
+BaseSqlTableModel [V]
+pass by reference   +./ui/models/base_sql_table_model.cpp:8
+
+
+BaseSqlTableRepository [V]
+pass by reference   +./data/sql/base_sql_table_repository.cpp:7
+
+
+DateTimeDelegate [V]
+pass by reference   +./ui/delegates/date_time_delegate.cpp:3
+
+
+DayManagerTest [CV]
+inheritance   +./tests_class/day_manager_test.cpp:4
+
+
+GenresModel [V]
+pass by reference   +./ui/models/genres_model.cpp:5
+
+
+GenresRepository [V]
+pass by reference   +./data/sql/genres_repository.cpp:10
+
+
+HallsModel [V]
+pass by reference   +./ui/models/halls_model.cpp:5
+
+
+HallsRepository [V]
+pass by reference   +./data/sql/halls_repository.cpp:10
+
+
+MoviesModel [V]
+pass by reference   +./ui/models/movies_model.cpp:6
+
+
+MoviesRepository [V]
+pass by reference   +./data/sql/movies_repository.cpp:10
+
+
+MultiColumnSortFilterProxyModel [V]
+pass by reference   +./ui/models/multi_column_filter_proxy_model.cpp:6
+
+
+RefundsModel [V]
+pass by reference   +./ui/models/refunds_model.cpp:5
+
+
+RefundsRepository [V]
+pass by reference   +./data/sql/refunds_repository.cpp:10
+
+
+ReservationManagerTest [CV]
+inheritance   +./tests_class/reservation_manager_test.cpp:4
+
+
+RolesRepository [V]
+pass by reference   +./data/sql/roles_repository.cpp:10
+
+
+SessionsModel [V]
+pass by reference   +./ui/models/sessions_model.cpp:6
+
+
+SessionsRepository [V]
+pass by reference   +./data/sql/sessions_repository.cpp:10
+
+
+SessionsStatisticsRepository [V]
+pass by reference   +./data/sql/sessions_statistics_repository.cpp:12
+
+
+TicketsModel [V]
+pass by reference   +./ui/models/tickets_model.cpp:6
+
+
+TicketsRepository [V]
+pass by reference   +./data/sql/tickets_repository.cpp:10
+
+
+UsersRepository [V]
+pass by reference   +./data/sql/users_repository.cpp:10
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/QObject.xml b/artifacts/cccc/QObject.xml new file mode 100644 index 0000000..9da8f0b --- /dev/null +++ b/artifacts/cccc/QObject.xml @@ -0,0 +1,196 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +QObject + +ApplicationConnector +true +false + +pass by reference + + + +pass by reference + + +BaseSqlTableModel +true +false + +pass by reference + + +BaseSqlTableRepository +true +false + +pass by reference + + +DateTimeDelegate +true +false + +pass by reference + + +DayManagerTest +true +true + +inheritance + + +GenresModel +true +false + +pass by reference + + +GenresRepository +true +false + +pass by reference + + +HallsModel +true +false + +pass by reference + + +HallsRepository +true +false + +pass by reference + + +MoviesModel +true +false + +pass by reference + + +MoviesRepository +true +false + +pass by reference + + +MultiColumnSortFilterProxyModel +true +false + +pass by reference + + +RefundsModel +true +false + +pass by reference + + +RefundsRepository +true +false + +pass by reference + + +ReservationManagerTest +true +true + +inheritance + + +RolesRepository +true +false + +pass by reference + + +SessionsModel +true +false + +pass by reference + + +SessionsRepository +true +false + +pass by reference + + +SessionsStatisticsRepository +true +false + +pass by reference + + +TicketsModel +true +false + +pass by reference + + +TicketsRepository +true +false + +pass by reference + + +UsersRepository +true +false + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/QPair.html b/artifacts/cccc/QPair.html new file mode 100644 index 0000000..36e7591 --- /dev/null +++ b/artifacts/cccc/QPair.html @@ -0,0 +1,85 @@ + +Detailed report on module QPair + + + +

Detailed report on module QPair

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 3 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+DateTimeGenerator [V]
+pass by reference   +./core/services/date_time_generator.cpp:3
+pass by reference   +./core/services/date_time_generator.cpp:4
+
+
+RefundGenerator [V]
+pass by reference   +./core/services/refund_generator.cpp:14
+pass by reference   +./core/services/refund_generator.cpp:15
+pass by reference   +./core/services/refund_generator.cpp:16
+
+
+TicketGenerator [V]
+pass by reference   +./core/services/ticket_generator.cpp:22
+pass by reference   +./core/services/ticket_generator.cpp:22
+pass by reference   +./core/services/ticket_generator.cpp:23
+pass by reference   +./core/services/ticket_generator.cpp:106
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/QPair.xml b/artifacts/cccc/QPair.xml new file mode 100644 index 0000000..7d86507 --- /dev/null +++ b/artifacts/cccc/QPair.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +QPair + +DateTimeGenerator +true +false + +pass by reference + + + +pass by reference + + +RefundGenerator +true +false + +pass by reference + + + +pass by reference + + + +pass by reference + + +TicketGenerator +true +false + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/QSortFilterProxyModel.html b/artifacts/cccc/QSortFilterProxyModel.html new file mode 100644 index 0000000..367a161 --- /dev/null +++ b/artifacts/cccc/QSortFilterProxyModel.html @@ -0,0 +1,63 @@ + +Detailed report on module QSortFilterProxyModel + + + +

Detailed report on module QSortFilterProxyModel

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 1 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+MultiColumnSortFilterProxyModel [CV]
+inheritance   +./ui/models/multi_column_filter_proxy_model.h:6
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/QSortFilterProxyModel.xml b/artifacts/cccc/QSortFilterProxyModel.xml new file mode 100644 index 0000000..10ec4b4 --- /dev/null +++ b/artifacts/cccc/QSortFilterProxyModel.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +QSortFilterProxyModel + +MultiColumnSortFilterProxyModel +true +true + +inheritance + + + + + + + + diff --git a/artifacts/cccc/QSqlDatabase.html b/artifacts/cccc/QSqlDatabase.html new file mode 100644 index 0000000..6b3424c --- /dev/null +++ b/artifacts/cccc/QSqlDatabase.html @@ -0,0 +1,153 @@ + +Detailed report on module QSqlDatabase + + + +

Detailed report on module QSqlDatabase

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 19 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+BaseSqlTableModel [CV]
+pass by value   +./ui/models/base_sql_table_model.cpp:8
+
+
+BaseSqlTableRepository [V]
+pass by reference   +./data/sql/base_sql_table_repository.cpp:6
+
+
+DatabaseManager [V]
+pass by reference   +./core/db/database_manager.cpp:101
+
+
+ExecuteSqlFile [V]
+pass by reference   +./core/db/execute_sql_file.cpp:5
+
+
+GenresModel [V]
+pass by reference   +./ui/models/genres_model.cpp:5
+
+
+GenresRepository [V]
+pass by reference   +./data/sql/genres_repository.cpp:10
+
+
+HallsModel [V]
+pass by reference   +./ui/models/halls_model.cpp:5
+
+
+HallsRepository [V]
+pass by reference   +./data/sql/halls_repository.cpp:10
+
+
+MoviesModel [V]
+pass by reference   +./ui/models/movies_model.cpp:6
+
+
+MoviesRepository [V]
+pass by reference   +./data/sql/movies_repository.cpp:10
+
+
+RefundsModel [V]
+pass by reference   +./ui/models/refunds_model.cpp:5
+
+
+RefundsRepository [V]
+pass by reference   +./data/sql/refunds_repository.cpp:10
+
+
+RolesRepository [V]
+pass by reference   +./data/sql/roles_repository.cpp:10
+
+
+SessionsModel [V]
+pass by reference   +./ui/models/sessions_model.cpp:6
+
+
+SessionsRepository [V]
+pass by reference   +./data/sql/sessions_repository.cpp:10
+
+
+SessionsStatisticsRepository [V]
+pass by reference   +./data/sql/sessions_statistics_repository.cpp:12
+
+
+TicketsModel [V]
+pass by reference   +./ui/models/tickets_model.cpp:6
+
+
+TicketsRepository [V]
+pass by reference   +./data/sql/tickets_repository.cpp:10
+
+
+UsersRepository [V]
+pass by reference   +./data/sql/users_repository.cpp:10
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/QSqlDatabase.xml b/artifacts/cccc/QSqlDatabase.xml new file mode 100644 index 0000000..382ece0 --- /dev/null +++ b/artifacts/cccc/QSqlDatabase.xml @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +QSqlDatabase + +BaseSqlTableModel +true +true + +pass by value + + +BaseSqlTableRepository +true +false + +pass by reference + + +DatabaseManager +true +false + +pass by reference + + +ExecuteSqlFile +true +false + +pass by reference + + +GenresModel +true +false + +pass by reference + + +GenresRepository +true +false + +pass by reference + + +HallsModel +true +false + +pass by reference + + +HallsRepository +true +false + +pass by reference + + +MoviesModel +true +false + +pass by reference + + +MoviesRepository +true +false + +pass by reference + + +RefundsModel +true +false + +pass by reference + + +RefundsRepository +true +false + +pass by reference + + +RolesRepository +true +false + +pass by reference + + +SessionsModel +true +false + +pass by reference + + +SessionsRepository +true +false + +pass by reference + + +SessionsStatisticsRepository +true +false + +pass by reference + + +TicketsModel +true +false + +pass by reference + + +TicketsRepository +true +false + +pass by reference + + +UsersRepository +true +false + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/QSqlField.html b/artifacts/cccc/QSqlField.html new file mode 100644 index 0000000..62c1111 --- /dev/null +++ b/artifacts/cccc/QSqlField.html @@ -0,0 +1,102 @@ + +Detailed report on module QSqlField + + + +

Detailed report on module QSqlField

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 8 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+DirectoriesManagementWidget [V]
+pass by reference   +./ui/widgets/directories_management_widget.cpp:145
+
+
+EntityDeleterWidget [V]
+pass by reference   +./ui/widgets/entity_deleter_widget.cpp:71
+
+
+EntityFinderWidget [V]
+pass by reference   +./ui/widgets/entity_finder_widget.cpp:111
+
+
+EntityUpdaterWidget [V]
+pass by reference   +./ui/widgets/entity_updater_widget.cpp:127
+pass by reference   +./ui/widgets/entity_updater_widget.cpp:133
+
+
+SessionManagementWidget [V]
+pass by reference   +./ui/widgets/session_management_widget.cpp:97
+pass by reference   +./ui/widgets/session_management_widget.cpp:101
+
+
+TicketReturnWidget [V]
+pass by reference   +./ui/widgets/ticket_return_widget.cpp:107
+
+
+TicketSaleWidget [V]
+pass by reference   +./ui/widgets/ticket_sale_widget.cpp:97
+
+
+TicketSalesReportWidget [V]
+pass by reference   +./ui/widgets/ticket_sales_report_widget.cpp:196
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/QSqlField.xml b/artifacts/cccc/QSqlField.xml new file mode 100644 index 0000000..3e0c7c1 --- /dev/null +++ b/artifacts/cccc/QSqlField.xml @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +QSqlField + +DirectoriesManagementWidget +true +false + +pass by reference + + +EntityDeleterWidget +true +false + +pass by reference + + +EntityFinderWidget +true +false + +pass by reference + + +EntityUpdaterWidget +true +false + +pass by reference + + + +pass by reference + + +SessionManagementWidget +true +false + +pass by reference + + + +pass by reference + + +TicketReturnWidget +true +false + +pass by reference + + +TicketSaleWidget +true +false + +pass by reference + + +TicketSalesReportWidget +true +false + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/QSqlQuery.html b/artifacts/cccc/QSqlQuery.html new file mode 100644 index 0000000..29578b0 --- /dev/null +++ b/artifacts/cccc/QSqlQuery.html @@ -0,0 +1,107 @@ + +Detailed report on module QSqlQuery + + + +

Detailed report on module QSqlQuery

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 9 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+GenresRepository [V]
+pass by reference   +./data/sql/genres_repository.cpp:93
+
+
+HallsRepository [V]
+pass by reference   +./data/sql/halls_repository.cpp:92
+
+
+MoviesRepository [V]
+pass by reference   +./data/sql/movies_repository.cpp:98
+
+
+RefundsRepository [V]
+pass by reference   +./data/sql/refunds_repository.cpp:106
+
+
+RolesRepository [V]
+pass by reference   +./data/sql/roles_repository.cpp:91
+
+
+SessionsRepository [V]
+pass by reference   +./data/sql/sessions_repository.cpp:103
+
+
+SessionsStatisticsRepository [V]
+pass by reference   +./data/sql/sessions_statistics_repository.cpp:16
+pass by reference   +./data/sql/sessions_statistics_repository.cpp:41
+pass by reference   +./data/sql/sessions_statistics_repository.cpp:161
+
+
+TicketsRepository [V]
+pass by reference   +./data/sql/tickets_repository.cpp:100
+
+
+UsersRepository [V]
+pass by reference   +./data/sql/users_repository.cpp:121
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/QSqlQuery.xml b/artifacts/cccc/QSqlQuery.xml new file mode 100644 index 0000000..832ee44 --- /dev/null +++ b/artifacts/cccc/QSqlQuery.xml @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +QSqlQuery + +GenresRepository +true +false + +pass by reference + + +HallsRepository +true +false + +pass by reference + + +MoviesRepository +true +false + +pass by reference + + +RefundsRepository +true +false + +pass by reference + + +RolesRepository +true +false + +pass by reference + + +SessionsRepository +true +false + +pass by reference + + +SessionsStatisticsRepository +true +false + +pass by reference + + + +pass by reference + + + +pass by reference + + +TicketsRepository +true +false + +pass by reference + + +UsersRepository +true +false + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/QSqlRecord.html b/artifacts/cccc/QSqlRecord.html new file mode 100644 index 0000000..9c93a2b --- /dev/null +++ b/artifacts/cccc/QSqlRecord.html @@ -0,0 +1,80 @@ + +Detailed report on module QSqlRecord + + + +

Detailed report on module QSqlRecord

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 4 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+EntityDeleterWidget [V]
+pass by reference   +./ui/widgets/entity_deleter_widget.cpp:75
+
+
+EntityFinderWidget [V]
+pass by reference   +./ui/widgets/entity_finder_widget.cpp:42
+pass by reference   +./ui/widgets/entity_finder_widget.cpp:106
+
+
+EntityUpdaterWidget [V]
+pass by reference   +./ui/widgets/entity_updater_widget.cpp:139
+
+
+TicketSalesReportWidget [V]
+pass by reference   +./ui/widgets/ticket_sales_report_widget.cpp:201
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/QSqlRecord.xml b/artifacts/cccc/QSqlRecord.xml new file mode 100644 index 0000000..727c476 --- /dev/null +++ b/artifacts/cccc/QSqlRecord.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +QSqlRecord + +EntityDeleterWidget +true +false + +pass by reference + + +EntityFinderWidget +true +false + +pass by reference + + + +pass by reference + + +EntityUpdaterWidget +true +false + +pass by reference + + +TicketSalesReportWidget +true +false + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/QSqlRelationalTableModel.html b/artifacts/cccc/QSqlRelationalTableModel.html new file mode 100644 index 0000000..9c513d6 --- /dev/null +++ b/artifacts/cccc/QSqlRelationalTableModel.html @@ -0,0 +1,63 @@ + +Detailed report on module QSqlRelationalTableModel + + + +

Detailed report on module QSqlRelationalTableModel

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 1 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+BaseSqlTableModel [CV]
+inheritance   +./ui/models/base_sql_table_model.h:7
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/QSqlRelationalTableModel.xml b/artifacts/cccc/QSqlRelationalTableModel.xml new file mode 100644 index 0000000..00cf0b9 --- /dev/null +++ b/artifacts/cccc/QSqlRelationalTableModel.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +QSqlRelationalTableModel + +BaseSqlTableModel +true +true + +inheritance + + + + + + + + diff --git a/artifacts/cccc/QString.html b/artifacts/cccc/QString.html new file mode 100644 index 0000000..12b5aac --- /dev/null +++ b/artifacts/cccc/QString.html @@ -0,0 +1,323 @@ + +Detailed report on module QString + + + +

Detailed report on module QString

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 27 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+ApplicationConnector [V]
+pass by reference   +./core/controllers/application_connector.cpp:198
+pass by reference   +./core/controllers/application_connector.cpp:199
+pass by reference   +./core/controllers/application_connector.cpp:222
+pass by reference   +./core/controllers/application_connector.cpp:223
+
+
+ApplicationController [V]
+pass by reference   +./core/controllers/application_controller.cpp:51
+pass by reference   +./core/controllers/application_controller.cpp:119
+pass by reference   +./core/controllers/application_controller.cpp:129
+pass by reference   +./core/controllers/application_controller.cpp:130
+pass by reference   +./core/controllers/application_controller.cpp:131
+pass by reference   +./core/controllers/application_controller.cpp:132
+
+
+AuthDialog [V]
+pass by reference   +./ui/dialogs/auth_dialog.cpp:82
+pass by reference   +./ui/dialogs/auth_dialog.cpp:82
+pass by reference   +./ui/dialogs/auth_dialog.cpp:90
+
+
+BaseSqlTableModel [V]
+pass by reference   +./ui/models/base_sql_table_model.cpp:44
+pass by reference   +./ui/models/base_sql_table_model.cpp:54
+pass by reference   +./ui/models/base_sql_table_model.cpp:68
+pass by reference   +./ui/models/base_sql_table_model.cpp:79
+
+
+DatabaseManager [V]
+pass by reference   +./core/db/database_manager.cpp:21
+pass by reference   +./core/db/database_manager.cpp:68
+
+
+EntityDeleterWidget [V]
+pass by reference   +./ui/widgets/entity_deleter_widget.cpp:173
+
+
+EntityFinderWidget [V]
+pass by reference   +./ui/widgets/entity_finder_widget.cpp:15
+pass by reference   +./ui/widgets/entity_finder_widget.cpp:16
+pass by reference   +./ui/widgets/entity_finder_widget.cpp:60
+
+
+EntityUpdaterWidget [V]
+pass by reference   +./ui/widgets/entity_updater_widget.cpp:93
+pass by reference   +./ui/widgets/entity_updater_widget.cpp:93
+pass by reference   +./ui/widgets/entity_updater_widget.cpp:116
+pass by reference   +./ui/widgets/entity_updater_widget.cpp:122
+pass by reference   +./ui/widgets/entity_updater_widget.cpp:145
+pass by reference   +./ui/widgets/entity_updater_widget.cpp:155
+pass by reference   +./ui/widgets/entity_updater_widget.cpp:165
+pass by reference   +./ui/widgets/entity_updater_widget.cpp:175
+pass by reference   +./ui/widgets/entity_updater_widget.cpp:184
+pass by reference   +./ui/widgets/entity_updater_widget.cpp:446
+pass by reference   +./ui/widgets/entity_updater_widget.cpp:485
+
+
+ErrorDialog [V]
+pass by reference   +./ui/dialogs/error_dialog.cpp:10
+pass by reference   +./ui/dialogs/error_dialog.cpp:39
+pass by reference   +./ui/dialogs/error_dialog.cpp:75
+pass by reference   +./ui/dialogs/error_dialog.cpp:99
+pass by reference   +./ui/dialogs/error_dialog.cpp:120
+pass by reference   +./ui/dialogs/error_dialog.cpp:144
+pass by reference   +./ui/dialogs/error_dialog.cpp:169
+
+
+ExecuteSqlFile [V]
+pass by reference   +./core/db/execute_sql_file.cpp:10
+pass by reference   +./core/db/execute_sql_file.cpp:52
+pass by reference   +./core/db/execute_sql_file.cpp:52
+pass by reference   +./core/db/execute_sql_file.cpp:86
+pass by reference   +./core/db/execute_sql_file.cpp:96
+pass by reference   +./core/db/execute_sql_file.cpp:101
+
+
+ModelManager [CV]
+pass by value   +./core/services/model_manager.cpp:37
+pass by reference   +./core/services/model_manager.cpp:75
+pass by reference   +./core/services/model_manager.cpp:86
+pass by reference   +./core/services/model_manager.cpp:91
+pass by reference   +./core/services/model_manager.cpp:92
+
+
+MoviesModel [V]
+pass by reference   +./ui/models/movies_model.cpp:43
+pass by reference   +./ui/models/movies_model.cpp:44
+pass by reference   +./ui/models/movies_model.cpp:60
+
+
+RefundGenerator [V]
+pass by reference   +./core/services/refund_generator.cpp:87
+
+
+RefundsModel [V]
+pass by reference   +./ui/models/refunds_model.cpp:38
+
+
+RelationIdConfig [V]
+pass by reference   +./core/services/relation_id_config.cpp:3
+pass by reference   +./core/services/relation_id_config.cpp:4
+pass by reference   +./core/services/relation_id_config.cpp:5
+pass by reference   +./core/services/relation_id_config.cpp:6
+
+
+RepositoryManager [V]
+pass by reference   +./core/services/repository_manager.cpp:71
+
+
+RepositoryResult [V]
+pass by reference   +./core/repositories/repository_result.cpp:5
+
+
+SchemaMetadata [V]
+pass by reference   +./core/services/schema_metadata.cpp:85
+pass by reference   +./core/services/schema_metadata.cpp:96
+pass by reference   +./core/services/schema_metadata.cpp:108
+pass by reference   +./core/services/schema_metadata.cpp:120
+pass by reference   +./core/services/schema_metadata.cpp:133
+
+
+SearchDialog [V]
+pass by reference   +./ui/dialogs/search_dialog.cpp:17
+pass by reference   +./ui/dialogs/search_dialog.cpp:18
+pass by reference   +./ui/dialogs/search_dialog.cpp:34
+pass by reference   +./ui/dialogs/search_dialog.cpp:43
+pass by reference   +./ui/dialogs/search_dialog.cpp:111
+
+
+SessionGenerator [V]
+pass by reference   +./core/services/session_generator.cpp:120
+
+
+SessionsModel [V]
+pass by reference   +./ui/models/sessions_model.cpp:26
+pass by reference   +./ui/models/sessions_model.cpp:27
+pass by reference   +./ui/models/sessions_model.cpp:47
+pass by reference   +./ui/models/sessions_model.cpp:48
+pass by reference   +./ui/models/sessions_model.cpp:89
+
+
+SessionsStatisticsRepository [V]
+pass by reference   +./data/sql/sessions_statistics_repository.cpp:149
+
+
+TableInfoSQLite [V]
+pass by reference   +./data/sql/table_info_sqlite.cpp:9
+pass by reference   +./data/sql/table_info_sqlite.cpp:54
+pass by reference   +./data/sql/table_info_sqlite.cpp:90
+pass by reference   +./data/sql/table_info_sqlite.cpp:98
+
+
+TicketGenerator [V]
+pass by reference   +./core/services/ticket_generator.cpp:136
+
+
+TicketSalesReportWidget [V]
+pass by reference   +./ui/widgets/ticket_sales_report_widget.cpp:159
+pass by reference   +./ui/widgets/ticket_sales_report_widget.cpp:159
+pass by reference   +./ui/widgets/ticket_sales_report_widget.cpp:160
+pass by reference   +./ui/widgets/ticket_sales_report_widget.cpp:232
+pass by reference   +./ui/widgets/ticket_sales_report_widget.cpp:244
+
+
+TicketsModel [V]
+pass by reference   +./ui/models/tickets_model.cpp:39
+
+
+UsersRepository [V]
+pass by reference   +./data/sql/users_repository.cpp:50
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/QString.xml b/artifacts/cccc/QString.xml new file mode 100644 index 0000000..2dc5a19 --- /dev/null +++ b/artifacts/cccc/QString.xml @@ -0,0 +1,487 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +QString + +ApplicationConnector +true +false + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + +ApplicationController +true +false + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + +AuthDialog +true +false + +pass by reference + + + +pass by reference + + + +pass by reference + + +BaseSqlTableModel +true +false + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + +DatabaseManager +true +false + +pass by reference + + + +pass by reference + + +EntityDeleterWidget +true +false + +pass by reference + + +EntityFinderWidget +true +false + +pass by reference + + + +pass by reference + + + +pass by reference + + +EntityUpdaterWidget +true +false + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + +ErrorDialog +true +false + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + +ExecuteSqlFile +true +false + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + +ModelManager +true +true + +pass by value + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + +MoviesModel +true +false + +pass by reference + + + +pass by reference + + + +pass by reference + + +RefundGenerator +true +false + +pass by reference + + +RefundsModel +true +false + +pass by reference + + +RelationIdConfig +true +false + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + +RepositoryManager +true +false + +pass by reference + + +RepositoryResult +true +false + +pass by reference + + +SchemaMetadata +true +false + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + +SearchDialog +true +false + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + +SessionGenerator +true +false + +pass by reference + + +SessionsModel +true +false + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + +SessionsStatisticsRepository +true +false + +pass by reference + + +TableInfoSQLite +true +false + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + +TicketGenerator +true +false + +pass by reference + + +TicketSalesReportWidget +true +false + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + +TicketsModel +true +false + +pass by reference + + +UsersRepository +true +false + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/QStringList.html b/artifacts/cccc/QStringList.html new file mode 100644 index 0000000..71a7be5 --- /dev/null +++ b/artifacts/cccc/QStringList.html @@ -0,0 +1,68 @@ + +Detailed report on module QStringList + + + +

Detailed report on module QStringList

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 2 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+DatabaseManager [V]
+pass by reference   +./core/db/database_manager.cpp:100
+
+
+ExecuteSqlFile [V]
+pass by reference   +./core/db/execute_sql_file.cpp:34
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/QStringList.xml b/artifacts/cccc/QStringList.xml new file mode 100644 index 0000000..a14a55b --- /dev/null +++ b/artifacts/cccc/QStringList.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +QStringList + +DatabaseManager +true +false + +pass by reference + + +ExecuteSqlFile +true +false + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/QStyledItemDelegate.html b/artifacts/cccc/QStyledItemDelegate.html new file mode 100644 index 0000000..7eb43af --- /dev/null +++ b/artifacts/cccc/QStyledItemDelegate.html @@ -0,0 +1,63 @@ + +Detailed report on module QStyledItemDelegate + + + +

Detailed report on module QStyledItemDelegate

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 1 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+DateTimeDelegate [CV]
+inheritance   +./ui/delegates/date_time_delegate.h:7
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/QStyledItemDelegate.xml b/artifacts/cccc/QStyledItemDelegate.xml new file mode 100644 index 0000000..eb525e0 --- /dev/null +++ b/artifacts/cccc/QStyledItemDelegate.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +QStyledItemDelegate + +DateTimeDelegate +true +true + +inheritance + + + + + + + + diff --git a/artifacts/cccc/QTableView.html b/artifacts/cccc/QTableView.html new file mode 100644 index 0000000..4b4f228 --- /dev/null +++ b/artifacts/cccc/QTableView.html @@ -0,0 +1,65 @@ + +Detailed report on module QTableView + + + +

Detailed report on module QTableView

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+MainWindow [V]
+pass by reference   +./ui/main_window/main_window.cpp:86
+pass by reference   +./ui/main_window/main_window.cpp:111
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/QTableView.xml b/artifacts/cccc/QTableView.xml new file mode 100644 index 0000000..6358824 --- /dev/null +++ b/artifacts/cccc/QTableView.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +QTableView + +MainWindow +true +false + +pass by reference + + + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/QTime.html b/artifacts/cccc/QTime.html new file mode 100644 index 0000000..e667696 --- /dev/null +++ b/artifacts/cccc/QTime.html @@ -0,0 +1,90 @@ + +Detailed report on module QTime + + + +

Detailed report on module QTime

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 2 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+DayManager [CV]
+pass by reference   +./core/utils/day_manager.cpp:6
+pass by reference   +./core/utils/day_manager.cpp:6
+pass by reference   +./core/utils/day_manager.cpp:10
+pass by reference   +./core/utils/day_manager.cpp:10
+pass by reference   +./core/utils/day_manager.cpp:20
+pass by value   +./core/utils/day_manager.cpp:60
+pass by value   +./core/utils/day_manager.cpp:73
+pass by value   +./core/utils/day_manager.cpp:86
+pass by value   +./core/utils/day_manager.cpp:119
+pass by reference   +./core/utils/day_manager.cpp:198
+pass by reference   +./core/utils/day_manager.cpp:233
+
+
+ReservationManager [V]
+pass by reference   +./core/utils/reservation_manager.cpp:49
+pass by reference   +./core/utils/reservation_manager.cpp:94
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/QTime.xml b/artifacts/cccc/QTime.xml new file mode 100644 index 0000000..ebc4f8f --- /dev/null +++ b/artifacts/cccc/QTime.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +QTime + +DayManager +true +true + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by value + + + +pass by value + + + +pass by value + + + +pass by value + + + +pass by reference + + + +pass by reference + + +ReservationManager +true +false + +pass by reference + + + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/QVariant.html b/artifacts/cccc/QVariant.html new file mode 100644 index 0000000..aebd173 --- /dev/null +++ b/artifacts/cccc/QVariant.html @@ -0,0 +1,68 @@ + +Detailed report on module QVariant + + + +

Detailed report on module QVariant

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 2 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+DateTimeDelegate [V]
+pass by reference   +./ui/delegates/date_time_delegate.cpp:6
+
+
+EntityUpdaterWidget [V]
+pass by reference   +./ui/widgets/entity_updater_widget.cpp:432
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/QVariant.xml b/artifacts/cccc/QVariant.xml new file mode 100644 index 0000000..74bf66a --- /dev/null +++ b/artifacts/cccc/QVariant.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +QVariant + +DateTimeDelegate +true +false + +pass by reference + + +EntityUpdaterWidget +true +false + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/QVector.html b/artifacts/cccc/QVector.html new file mode 100644 index 0000000..d5b4968 --- /dev/null +++ b/artifacts/cccc/QVector.html @@ -0,0 +1,123 @@ + +Detailed report on module QVector + + + +

Detailed report on module QVector

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 11 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+ApplicationConnector [V]
+pass by reference   +./core/controllers/application_connector.cpp:60
+
+
+GenresRepository [V]
+pass by reference   +./data/sql/genres_repository.cpp:48
+
+
+HallsRepository [V]
+pass by reference   +./data/sql/halls_repository.cpp:47
+
+
+MoviesRepository [V]
+pass by reference   +./data/sql/movies_repository.cpp:31
+
+
+RefundsRepository [V]
+pass by reference   +./data/sql/refunds_repository.cpp:57
+
+
+RolesRepository [V]
+pass by reference   +./data/sql/roles_repository.cpp:47
+
+
+SessionsRepository [V]
+pass by reference   +./data/sql/sessions_repository.cpp:53
+
+
+SessionsStatisticsRepository [V]
+pass by reference   +./data/sql/sessions_statistics_repository.cpp:41
+pass by reference   +./data/sql/sessions_statistics_repository.cpp:78
+pass by reference   +./data/sql/sessions_statistics_repository.cpp:97
+pass by reference   +./data/sql/sessions_statistics_repository.cpp:115
+pass by reference   +./data/sql/sessions_statistics_repository.cpp:133
+
+
+TicketSalesReportWidget [V]
+pass by reference   +./ui/widgets/ticket_sales_report_widget.cpp:208
+pass by reference   +./ui/widgets/ticket_sales_report_widget.cpp:267
+
+
+TicketsRepository [V]
+pass by reference   +./data/sql/tickets_repository.cpp:51
+
+
+UsersRepository [V]
+pass by reference   +./data/sql/users_repository.cpp:71
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/QVector.xml b/artifacts/cccc/QVector.xml new file mode 100644 index 0000000..be0eb95 --- /dev/null +++ b/artifacts/cccc/QVector.xml @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +QVector + +ApplicationConnector +true +false + +pass by reference + + +GenresRepository +true +false + +pass by reference + + +HallsRepository +true +false + +pass by reference + + +MoviesRepository +true +false + +pass by reference + + +RefundsRepository +true +false + +pass by reference + + +RolesRepository +true +false + +pass by reference + + +SessionsRepository +true +false + +pass by reference + + +SessionsStatisticsRepository +true +false + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + +TicketSalesReportWidget +true +false + +pass by reference + + + +pass by reference + + +TicketsRepository +true +false + +pass by reference + + +UsersRepository +true +false + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/QWidget.html b/artifacts/cccc/QWidget.html new file mode 100644 index 0000000..9efe3dc --- /dev/null +++ b/artifacts/cccc/QWidget.html @@ -0,0 +1,134 @@ + +Detailed report on module QWidget + + + +

Detailed report on module QWidget

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 14 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+AuthDialog [V]
+pass by reference   +./ui/dialogs/auth_dialog.cpp:14
+
+
+DirectoriesManagementWidget [V]
+pass by reference   +./ui/widgets/directories_management_widget.cpp:26
+
+
+EntityDeleterWidget [V]
+pass by reference   +./ui/widgets/entity_deleter_widget.cpp:15
+
+
+EntityFinderWidget [V]
+pass by reference   +./ui/widgets/entity_finder_widget.cpp:8
+pass by reference   +./ui/widgets/entity_finder_widget.cpp:17
+
+
+EntityUpdaterWidget [V]
+pass by reference   +./ui/widgets/entity_updater_widget.cpp:33
+
+
+ErrorDialog [V]
+pass by reference   +./ui/dialogs/error_dialog.cpp:9
+pass by reference   +./ui/dialogs/error_dialog.cpp:39
+
+
+MainWindow [V]
+pass by reference   +./ui/main_window/main_window.cpp:9
+
+
+ReportsWidget [V]
+pass by reference   +./ui/widgets/reports_widget.cpp:9
+
+
+SearchDialog [V]
+pass by reference   +./ui/dialogs/search_dialog.cpp:8
+pass by reference   +./ui/dialogs/search_dialog.cpp:18
+
+
+SessionManagementWidget [V]
+pass by reference   +./ui/widgets/session_management_widget.cpp:13
+
+
+SingleRecordTimeRangeWidget [V]
+pass by reference   +./ui/widgets/single_record_time_range_widget.cpp:3
+
+
+TicketReturnWidget [V]
+pass by reference   +./ui/widgets/ticket_return_widget.cpp:13
+
+
+TicketSaleWidget [V]
+pass by reference   +./ui/widgets/ticket_sale_widget.cpp:15
+
+
+TicketSalesReportWidget [V]
+pass by reference   +./ui/widgets/ticket_sales_report_widget.cpp:45
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/QWidget.xml b/artifacts/cccc/QWidget.xml new file mode 100644 index 0000000..05ec3e1 --- /dev/null +++ b/artifacts/cccc/QWidget.xml @@ -0,0 +1,148 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +QWidget + +AuthDialog +true +false + +pass by reference + + +DirectoriesManagementWidget +true +false + +pass by reference + + +EntityDeleterWidget +true +false + +pass by reference + + +EntityFinderWidget +true +false + +pass by reference + + + +pass by reference + + +EntityUpdaterWidget +true +false + +pass by reference + + +ErrorDialog +true +false + +pass by reference + + + +pass by reference + + +MainWindow +true +false + +pass by reference + + +ReportsWidget +true +false + +pass by reference + + +SearchDialog +true +false + +pass by reference + + + +pass by reference + + +SessionManagementWidget +true +false + +pass by reference + + +SingleRecordTimeRangeWidget +true +false + +pass by reference + + +TicketReturnWidget +true +false + +pass by reference + + +TicketSaleWidget +true +false + +pass by reference + + +TicketSalesReportWidget +true +false + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/RangeLimiter.html b/artifacts/cccc/RangeLimiter.html new file mode 100644 index 0000000..dc7e557 --- /dev/null +++ b/artifacts/cccc/RangeLimiter.html @@ -0,0 +1,88 @@ + +Detailed report on module RangeLimiter + + + +

Detailed report on module RangeLimiter

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 9 4
McCabe's Cyclomatic NumberMVG 0 0
Lines of CommentCOM 0 0.000
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 2 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 2 
Coupling between objectsCBO 3 
Information Flow measure (  inclusive )IF4 4 2.000
Information Flow measure (  visible )IF4v 4 2.000
Information Flow measure (  concrete )IF4c 4 2.000
+

Definitions and Declarations

+ + + + + +
DescriptionLOCMVGCOML_CM_C
definition   +./core/services/range_limiter.h:7
+
8 0 0------------
+

Functions

+ + + + + + +
Function prototypeLOCMVGCOML_CM_C
RangeLimiter(   )
+definition   +./core/services/range_limiter.h:18
+
+
1 0 0------------
bounded(  T )
+declaration   +./core/services/range_limiter.h:20
+
+
0 0 0------------
+

Relationships

+ + + + + +
ClientsSuppliers
+BaseGenerator [CV]
+inheritance   +./core/services/base_generator.h:9
+
+
+DateTimeGenerator [CV]
+inheritance   +./core/services/date_time_generator.h:7
+
+
+  +
+T [CV]
+pass by value   +./core/services/range_limiter.h:20
+
+
+  +
+ diff --git a/artifacts/cccc/RangeLimiter.xml b/artifacts/cccc/RangeLimiter.xml new file mode 100644 index 0000000..d9108a9 --- /dev/null +++ b/artifacts/cccc/RangeLimiter.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +definition + + + + + + + + + +RangeLimiter() + +definition + + + + + + + + + +bounded(T) + +declaration + + + + + + + + + + + +RangeLimiter + +BaseGenerator +true +true + +inheritance + + +DateTimeGenerator +true +true + +inheritance + + + + +T +true +true + +pass by value + + + + + + diff --git a/artifacts/cccc/ReceiverType.html b/artifacts/cccc/ReceiverType.html new file mode 100644 index 0000000..39b0b6e --- /dev/null +++ b/artifacts/cccc/ReceiverType.html @@ -0,0 +1,63 @@ + +Detailed report on module ReceiverType + + + +

Detailed report on module ReceiverType

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+ApplicationConnector [V]
+pass by reference   +./core/controllers/application_connector.h:154
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/ReceiverType.xml b/artifacts/cccc/ReceiverType.xml new file mode 100644 index 0000000..181208b --- /dev/null +++ b/artifacts/cccc/ReceiverType.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +ReceiverType + +ApplicationConnector +true +false + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/Refund.html b/artifacts/cccc/Refund.html new file mode 100644 index 0000000..834caa2 --- /dev/null +++ b/artifacts/cccc/Refund.html @@ -0,0 +1,63 @@ + +Detailed report on module Refund + + + +

Detailed report on module Refund

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+SQLiteDatabase [V]
+pass by reference   +./tests_schema/tests_sources/sqlite_database.cpp:445
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/Refund.xml b/artifacts/cccc/Refund.xml new file mode 100644 index 0000000..1b5cc36 --- /dev/null +++ b/artifacts/cccc/Refund.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Refund + +SQLiteDatabase +true +false + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/RefundDTO.html b/artifacts/cccc/RefundDTO.html new file mode 100644 index 0000000..51b553b --- /dev/null +++ b/artifacts/cccc/RefundDTO.html @@ -0,0 +1,63 @@ + +Detailed report on module RefundDTO + + + +

Detailed report on module RefundDTO

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+RefundsRepository [V]
+pass by reference   +./data/sql/refunds_repository.cpp:31
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/RefundDTO.xml b/artifacts/cccc/RefundDTO.xml new file mode 100644 index 0000000..5ee829d --- /dev/null +++ b/artifacts/cccc/RefundDTO.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +RefundDTO + +RefundsRepository +true +false + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/RefundGenerator.html b/artifacts/cccc/RefundGenerator.html new file mode 100644 index 0000000..fd8c49f --- /dev/null +++ b/artifacts/cccc/RefundGenerator.html @@ -0,0 +1,125 @@ + +Detailed report on module RefundGenerator + + + +

Detailed report on module RefundGenerator

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 123 14
McCabe's Cyclomatic NumberMVG 18 2
Lines of CommentCOM 9 1.000
LOC/COML_C13.667 
MVG/COMM_C 2.000 
Weighted Methods per Class (  weighting = unity )WMC1 9 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 2 
Information Flow measure (  inclusive )IF4 0 0.000
Information Flow measure (  visible )IF4v 0 0.000
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + + + + + + + + + + + + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
RefundGenerator(  const QPair &,  const QPair &,  const QPair & )
+definition   +./core/services/refund_generator.cpp:14
+
+
15 1 4------------
calculateRemainingCapacity(   )
+definition   +./core/services/refund_generator.cpp:108
+
+
3 1 0------------
clearStaleData(   )
+definition   +./core/services/refund_generator.cpp:165
+
+
4 0 0------------
createFailureMessage(  const QString & )
+definition   +./core/services/refund_generator.cpp:87
+
+
13 1 0------------
createRecord(   )
+definition   +./core/services/refund_generator.cpp:112
+
+
11 2 0------------
createSuccessMessage(   )
+definition   +./core/services/refund_generator.cpp:101
+
+
6 1 0------------
initializeRepositories(   )
+definition   +./core/services/refund_generator.cpp:32
+
+
13 3 0------------
initializeTicketIdToCacheValueMap(   )
+definition   +./core/services/refund_generator.cpp:48
+
+
30 5 310.000 1.667
prepareData(   )
+definition   +./core/services/refund_generator.cpp:127
+
+
28 4 214.000------
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +QPair [V]
+pass by reference   +./core/services/refund_generator.cpp:14
+pass by reference   +./core/services/refund_generator.cpp:15
+pass by reference   +./core/services/refund_generator.cpp:16
+
+
+QString [V]
+pass by reference   +./core/services/refund_generator.cpp:87
+
+
+  +
+ diff --git a/artifacts/cccc/RefundGenerator.xml b/artifacts/cccc/RefundGenerator.xml new file mode 100644 index 0000000..114b24d --- /dev/null +++ b/artifacts/cccc/RefundGenerator.xml @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +RefundGenerator(const QPair &,const QPair &,const QPair &) + +definition + + + + + + + + + +calculateRemainingCapacity() + +definition + + + + + + + + + +clearStaleData() + +definition + + + + + + + + + +createFailureMessage(const QString &) + +definition + + + + + + + + + +createRecord() + +definition + + + + + + + + + +createSuccessMessage() + +definition + + + + + + + + + +initializeRepositories() + +definition + + + + + + + + + +initializeTicketIdToCacheValueMap() + +definition + + + + + + + + + +prepareData() + +definition + + + + + + + + + + + +RefundGenerator + + + +QPair +true +false + +pass by reference + + + +pass by reference + + + +pass by reference + + +QString +true +false + +pass by reference + + + + + + diff --git a/artifacts/cccc/RefundsModel.html b/artifacts/cccc/RefundsModel.html new file mode 100644 index 0000000..deb72a2 --- /dev/null +++ b/artifacts/cccc/RefundsModel.html @@ -0,0 +1,101 @@ + +Detailed report on module RefundsModel + + + +

Detailed report on module RefundsModel

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 39 10
McCabe's Cyclomatic NumberMVG 12 3
Lines of CommentCOM 2 0.500
LOC/COML_C19.500 
MVG/COMM_C 6.000 
Weighted Methods per Class (  weighting = unity )WMC1 4 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 4 
Information Flow measure (  inclusive )IF4 0 0.000
Information Flow measure (  visible )IF4v 0 0.000
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
RefundsModel(  QObject *,  const QSqlDatabase & )
+definition   +./ui/models/refunds_model.cpp:5
+
+
2 0 0------------
createMultiColumnFilter(  const QString & )
+definition   +./ui/models/refunds_model.cpp:38
+
+
11 2 2------------
headerData(  int,  Orientation,  int )
+definition   +./ui/models/refunds_model.cpp:19
+
+
18 9 0------******
initialize(   )
+definition   +./ui/models/refunds_model.cpp:8
+
+
8 1 0------------
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +Orientation [CV]
+pass by value   +./ui/models/refunds_model.cpp:19
+
+
+QObject [V]
+pass by reference   +./ui/models/refunds_model.cpp:5
+
+
+QSqlDatabase [V]
+pass by reference   +./ui/models/refunds_model.cpp:5
+
+
+QString [V]
+pass by reference   +./ui/models/refunds_model.cpp:38
+
+
+  +
+ diff --git a/artifacts/cccc/RefundsModel.xml b/artifacts/cccc/RefundsModel.xml new file mode 100644 index 0000000..c3e03fa --- /dev/null +++ b/artifacts/cccc/RefundsModel.xml @@ -0,0 +1,114 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +RefundsModel(QObject *,const QSqlDatabase &) + +definition + + + + + + + + + +createMultiColumnFilter(const QString &) + +definition + + + + + + + + + +headerData(int,Orientation,int) + +definition + + + + + + + + + +initialize() + +definition + + + + + + + + + + + +RefundsModel + + + +Orientation +true +true + +pass by value + + +QObject +true +false + +pass by reference + + +QSqlDatabase +true +false + +pass by reference + + +QString +true +false + +pass by reference + + + + + + diff --git a/artifacts/cccc/RefundsRepository.html b/artifacts/cccc/RefundsRepository.html new file mode 100644 index 0000000..b4b9197 --- /dev/null +++ b/artifacts/cccc/RefundsRepository.html @@ -0,0 +1,141 @@ + +Detailed report on module RefundsRepository + + + +

Detailed report on module RefundsRepository

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 82 12
McCabe's Cyclomatic NumberMVG 19 3
Lines of CommentCOM 0 0.000
LOC/COML_C****** 
MVG/COMM_C****** 
Weighted Methods per Class (  weighting = unity )WMC1 7 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 8 
Information Flow measure (  inclusive )IF4 0 0.000
Information Flow measure (  visible )IF4v 0 0.000
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + + + + + + + + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
RefundsRepository(  QSqlDatabase &,  QObject * )
+definition   +./data/sql/refunds_repository.cpp:10
+
+
2 0 0------------
createRefund(  const CreateRefundRequest & )
+definition   +./data/sql/refunds_repository.cpp:14
+
+
13 3 0------------
deleteRefundById(  qint32 )
+definition   +./data/sql/refunds_repository.cpp:93
+
+
10 3 0------------
getAllRefunds(  QVector & )
+definition   +./data/sql/refunds_repository.cpp:57
+
+
13 4 0------------
getRefundById(  qint32,  RefundDTO & )
+definition   +./data/sql/refunds_repository.cpp:30
+
+
21 5 0************
mapQueryToDTO(  const QSqlQuery & )
+definition   +./data/sql/refunds_repository.cpp:106
+
+
8 1 0------------
updateRefund(  const UpdateRefundRequest & )
+definition   +./data/sql/refunds_repository.cpp:75
+
+
15 3 0------------
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +CreateRefundRequest [V]
+pass by reference   +./data/sql/refunds_repository.cpp:14
+
+
+QObject [V]
+pass by reference   +./data/sql/refunds_repository.cpp:10
+
+
+QSqlDatabase [V]
+pass by reference   +./data/sql/refunds_repository.cpp:10
+
+
+QSqlQuery [V]
+pass by reference   +./data/sql/refunds_repository.cpp:106
+
+
+QVector [V]
+pass by reference   +./data/sql/refunds_repository.cpp:57
+
+
+RefundDTO [V]
+pass by reference   +./data/sql/refunds_repository.cpp:31
+
+
+UpdateRefundRequest [V]
+pass by reference   +./data/sql/refunds_repository.cpp:75
+
+
+qint32 [CV]
+pass by value   +./data/sql/refunds_repository.cpp:30
+pass by value   +./data/sql/refunds_repository.cpp:93
+
+
+  +
+ diff --git a/artifacts/cccc/RefundsRepository.xml b/artifacts/cccc/RefundsRepository.xml new file mode 100644 index 0000000..ed083a3 --- /dev/null +++ b/artifacts/cccc/RefundsRepository.xml @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +RefundsRepository(QSqlDatabase &,QObject *) + +definition + + + + + + + + + +createRefund(const CreateRefundRequest &) + +definition + + + + + + + + + +deleteRefundById(qint32) + +definition + + + + + + + + + +getAllRefunds(QVector &) + +definition + + + + + + + + + +getRefundById(qint32,RefundDTO &) + +definition + + + + + + + + + +mapQueryToDTO(const QSqlQuery &) + +definition + + + + + + + + + +updateRefund(const UpdateRefundRequest &) + +definition + + + + + + + + + + + +RefundsRepository + + + +CreateRefundRequest +true +false + +pass by reference + + +QObject +true +false + +pass by reference + + +QSqlDatabase +true +false + +pass by reference + + +QSqlQuery +true +false + +pass by reference + + +QVector +true +false + +pass by reference + + +RefundDTO +true +false + +pass by reference + + +UpdateRefundRequest +true +false + +pass by reference + + +qint32 +true +true + +pass by value + + + +pass by value + + + + + + diff --git a/artifacts/cccc/RefundsRepositoryInterface.html b/artifacts/cccc/RefundsRepositoryInterface.html new file mode 100644 index 0000000..b5ec773 --- /dev/null +++ b/artifacts/cccc/RefundsRepositoryInterface.html @@ -0,0 +1,133 @@ + +Detailed report on module RefundsRepositoryInterface + + + +

Detailed report on module RefundsRepositoryInterface

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 10 2
McCabe's Cyclomatic NumberMVG 0 0
Lines of CommentCOM 6 1.200
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 5 
Weighted Methods per Class (  weighting = visible )WMCv 5 
Depth of Inheritance TreeDIT 1 
Number of ChildrenNOC 1 
Coupling between objectsCBO 7 
Information Flow measure (  inclusive )IF4 36 7.200
Information Flow measure (  visible )IF4v 36 7.200
Information Flow measure (  concrete )IF4c 4 0.800
+

Definitions and Declarations

+ + + + + + + + +
DescriptionLOCMVGCOML_CM_C
definition   +./core/repositories/refunds_repository_interface.h:15
+
3 0 1------------
declaration   +./ui/widgets/ticket_return_widget.h:9
+
1 0 0------------
+

Functions

+ + + + + + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
createRefund(  const CreateRefundRequest & )
+declaration   +./core/repositories/refunds_repository_interface.h:18
+
+
1 0 1------------
deleteRefundById(  qint32 )
+declaration   +./core/repositories/refunds_repository_interface.h:31
+
+
1 0 1------------
getAllRefunds(  QVector & )
+declaration   +./core/repositories/refunds_repository_interface.h:25
+
+
1 0 1------------
getRefundById(  qint32,  RefundDTO & )
+declaration   +./core/repositories/refunds_repository_interface.h:21
+
+
2 0 1------------
updateRefund(  const UpdateRefundRequest & )
+declaration   +./core/repositories/refunds_repository_interface.h:28
+
+
1 0 1------------
+

Relationships

+ + + + + +
ClientsSuppliers
+RefundsRepository [CV]
+inheritance   +./data/sql/refunds_repository.h:9
+
+
+  +
+CreateRefundRequest [V]
+pass by reference   +./core/repositories/refunds_repository_interface.h:18
+
+
+QVector [V]
+pass by reference   +./core/repositories/refunds_repository_interface.h:25
+
+
+RefundDTO [V]
+pass by reference   +./core/repositories/refunds_repository_interface.h:22
+
+
+RepositoryInterface [CV]
+inheritance   +./core/repositories/refunds_repository_interface.h:15
+
+
+UpdateRefundRequest [V]
+pass by reference   +./core/repositories/refunds_repository_interface.h:28
+
+
+qint32 [CV]
+pass by value   +./core/repositories/refunds_repository_interface.h:21
+pass by value   +./core/repositories/refunds_repository_interface.h:31
+
+
+  +
+ diff --git a/artifacts/cccc/RefundsRepositoryInterface.xml b/artifacts/cccc/RefundsRepositoryInterface.xml new file mode 100644 index 0000000..4ce7937 --- /dev/null +++ b/artifacts/cccc/RefundsRepositoryInterface.xml @@ -0,0 +1,165 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +definition + + + + + + +declaration + + + + + + + + + +createRefund(const CreateRefundRequest &) + +declaration + + + + + + + + + +deleteRefundById(qint32) + +declaration + + + + + + + + + +getAllRefunds(QVector &) + +declaration + + + + + + + + + +getRefundById(qint32,RefundDTO &) + +declaration + + + + + + + + + +updateRefund(const UpdateRefundRequest &) + +declaration + + + + + + + + + + + +RefundsRepositoryInterface + +RefundsRepository +true +true + +inheritance + + + + +CreateRefundRequest +true +false + +pass by reference + + +QVector +true +false + +pass by reference + + +RefundDTO +true +false + +pass by reference + + +RepositoryInterface +true +true + +inheritance + + +UpdateRefundRequest +true +false + +pass by reference + + +qint32 +true +true + +pass by value + + + +pass by value + + + + + + diff --git a/artifacts/cccc/RelationIdConfig.html b/artifacts/cccc/RelationIdConfig.html new file mode 100644 index 0000000..7c767ba --- /dev/null +++ b/artifacts/cccc/RelationIdConfig.html @@ -0,0 +1,74 @@ + +Detailed report on module RelationIdConfig + + + +

Detailed report on module RelationIdConfig

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 7 7
McCabe's Cyclomatic NumberMVG 0 0
Lines of CommentCOM 0 0.000
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 1 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0 0.000
Information Flow measure (  visible )IF4v 0 0.000
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + + +
Function prototypeLOCMVGCOML_CM_C
RelationIdConfig(  const QString &,  const QString &,  const QString &,  const QString & )
+definition   +./core/services/relation_id_config.cpp:3
+
+
7 0 0------------
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +QString [V]
+pass by reference   +./core/services/relation_id_config.cpp:3
+pass by reference   +./core/services/relation_id_config.cpp:4
+pass by reference   +./core/services/relation_id_config.cpp:5
+pass by reference   +./core/services/relation_id_config.cpp:6
+
+
+  +
+ diff --git a/artifacts/cccc/RelationIdConfig.xml b/artifacts/cccc/RelationIdConfig.xml new file mode 100644 index 0000000..e99d010 --- /dev/null +++ b/artifacts/cccc/RelationIdConfig.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +RelationIdConfig(const QString &,const QString &,const QString &,const QString &) + +definition + + + + + + + + + + + +RelationIdConfig + + + +QString +true +false + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + + + + diff --git a/artifacts/cccc/ReportsWidget.html b/artifacts/cccc/ReportsWidget.html new file mode 100644 index 0000000..3f038d6 --- /dev/null +++ b/artifacts/cccc/ReportsWidget.html @@ -0,0 +1,74 @@ + +Detailed report on module ReportsWidget + + + +

Detailed report on module ReportsWidget

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 9 4
McCabe's Cyclomatic NumberMVG 0 0
Lines of CommentCOM 0 0.000
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 2 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0 0.000
Information Flow measure (  visible )IF4v 0 0.000
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + + + + +
Function prototypeLOCMVGCOML_CM_C
ReportsWidget(  QWidget * )
+definition   +./ui/widgets/reports_widget.cpp:9
+
+
4 0 0------------
setupTicketSalesReportWidgets(   )
+definition   +./ui/widgets/reports_widget.cpp:15
+
+
5 0 0------------
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +QWidget [V]
+pass by reference   +./ui/widgets/reports_widget.cpp:9
+
+
+  +
+ diff --git a/artifacts/cccc/ReportsWidget.xml b/artifacts/cccc/ReportsWidget.xml new file mode 100644 index 0000000..e3659eb --- /dev/null +++ b/artifacts/cccc/ReportsWidget.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +ReportsWidget(QWidget *) + +definition + + + + + + + + + +setupTicketSalesReportWidgets() + +definition + + + + + + + + + + + +ReportsWidget + + + +QWidget +true +false + +pass by reference + + + + + + diff --git a/artifacts/cccc/RepositoriesInterface.html b/artifacts/cccc/RepositoriesInterface.html new file mode 100644 index 0000000..351a31b --- /dev/null +++ b/artifacts/cccc/RepositoriesInterface.html @@ -0,0 +1,62 @@ + +Detailed report on module RepositoriesInterface + + + +

Detailed report on module RepositoriesInterface

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 1******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 0 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + + + +
DescriptionLOCMVGCOML_CM_C
declaration   +./ui/widgets/ticket_sales_report_widget.h:14
+
1 0 0------------
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +  +
+ diff --git a/artifacts/cccc/RepositoriesInterface.xml b/artifacts/cccc/RepositoriesInterface.xml new file mode 100644 index 0000000..0647bf0 --- /dev/null +++ b/artifacts/cccc/RepositoriesInterface.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +declaration + + + + + + + + + + + +RepositoriesInterface + + + + + + + diff --git a/artifacts/cccc/RepositoryInterface.html b/artifacts/cccc/RepositoryInterface.html new file mode 100644 index 0000000..80757a3 --- /dev/null +++ b/artifacts/cccc/RepositoryInterface.html @@ -0,0 +1,107 @@ + +Detailed report on module RepositoryInterface + + + +

Detailed report on module RepositoryInterface

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 4******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 9 
Coupling between objectsCBO 9 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + + + +
DescriptionLOCMVGCOML_CM_C
definition   +./core/repositories/repository_interface.h:6
+
4 0 0------------
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+GenresRepositoryInterface [CV]
+inheritance   +./core/repositories/genres_repository_interface.h:15
+
+
+HallsRepositoryInterface [CV]
+inheritance   +./core/repositories/halls_repository_interface.h:15
+
+
+MoviesRepositoryInterface [CV]
+inheritance   +./core/repositories/movies_repository_interface.h:15
+
+
+RefundsRepositoryInterface [CV]
+inheritance   +./core/repositories/refunds_repository_interface.h:15
+
+
+RolesRepositoryInterface [CV]
+inheritance   +./core/repositories/roles_repository_interface.h:15
+
+
+SessionsRepositoryInterface [CV]
+inheritance   +./core/repositories/sessions_repository_interface.h:15
+
+
+SessionsStatisticsRepositoryInterface [CV]
+inheritance   +./core/repositories/sessions_statistics_repository_interface.h:12
+
+
+TicketsRepositoryInterface [CV]
+inheritance   +./core/repositories/tickets_repository_interface.h:15
+
+
+UsersRepositoryInterface [CV]
+inheritance   +./core/repositories/users_repository_interface.h:15
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/RepositoryInterface.xml b/artifacts/cccc/RepositoryInterface.xml new file mode 100644 index 0000000..08790ac --- /dev/null +++ b/artifacts/cccc/RepositoryInterface.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +definition + + + + + + + + + + + +RepositoryInterface + +GenresRepositoryInterface +true +true + +inheritance + + +HallsRepositoryInterface +true +true + +inheritance + + +MoviesRepositoryInterface +true +true + +inheritance + + +RefundsRepositoryInterface +true +true + +inheritance + + +RolesRepositoryInterface +true +true + +inheritance + + +SessionsRepositoryInterface +true +true + +inheritance + + +SessionsStatisticsRepositoryInterface +true +true + +inheritance + + +TicketsRepositoryInterface +true +true + +inheritance + + +UsersRepositoryInterface +true +true + +inheritance + + + + + + + + diff --git a/artifacts/cccc/RepositoryManager.html b/artifacts/cccc/RepositoryManager.html new file mode 100644 index 0000000..50845fd --- /dev/null +++ b/artifacts/cccc/RepositoryManager.html @@ -0,0 +1,92 @@ + +Detailed report on module RepositoryManager + + + +

Detailed report on module RepositoryManager

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 47 9
McCabe's Cyclomatic NumberMVG 6 1
Lines of CommentCOM 4 0.800
LOC/COML_C11.750 
MVG/COMM_C 1.500 
Weighted Methods per Class (  weighting = unity )WMC1 5 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0 0.000
Information Flow measure (  visible )IF4v 0 0.000
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + + + + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
RepositoryManager(   )
+definition   +./core/services/repository_manager.cpp:14
+
+
8 2 0------------
getRepository(  const QString & )
+definition   +./core/services/repository_manager.cpp:71
+
+
11 3 0------------
initialize(   )
+definition   +./core/services/repository_manager.cpp:33
+
+
21 0 4 5.250------
instance(   )
+definition   +./core/services/repository_manager.cpp:28
+
+
4 1 0------------
~RepositoryManager(   )
+definition   +./core/services/repository_manager.cpp:24
+
+
3 0 0------------
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +QString [V]
+pass by reference   +./core/services/repository_manager.cpp:71
+
+
+  +
+ diff --git a/artifacts/cccc/RepositoryManager.xml b/artifacts/cccc/RepositoryManager.xml new file mode 100644 index 0000000..462377d --- /dev/null +++ b/artifacts/cccc/RepositoryManager.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +RepositoryManager() + +definition + + + + + + + + + +getRepository(const QString &) + +definition + + + + + + + + + +initialize() + +definition + + + + + + + + + +instance() + +definition + + + + + + + + + +~RepositoryManager() + +definition + + + + + + + + + + + +RepositoryManager + + + +QString +true +false + +pass by reference + + + + + + diff --git a/artifacts/cccc/RepositoryResult.html b/artifacts/cccc/RepositoryResult.html new file mode 100644 index 0000000..373f937 --- /dev/null +++ b/artifacts/cccc/RepositoryResult.html @@ -0,0 +1,98 @@ + +Detailed report on module RepositoryResult + + + +

Detailed report on module RepositoryResult

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 4 2
McCabe's Cyclomatic NumberMVG 2 1
Lines of CommentCOM 0 0.000
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 2 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 3 
Information Flow measure (  inclusive )IF4 4 2.000
Information Flow measure (  visible )IF4v 4 2.000
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + + + + +
Function prototypeLOCMVGCOML_CM_C
failureResult(  const QString & )
+definition   +./core/repositories/repository_result.cpp:5
+
+
3 1 0------------
successResult(   )
+definition   +./core/repositories/repository_result.cpp:3
+
+
1 1 0------------
+

Relationships

+ + + + + +
ClientsSuppliers
+EntityDeleterWidget [V]
+pass by reference   +./ui/widgets/entity_deleter_widget.cpp:172
+
+
+EntityUpdaterWidget [V]
+pass by reference   +./ui/widgets/entity_updater_widget.cpp:265
+pass by reference   +./ui/widgets/entity_updater_widget.cpp:277
+pass by reference   +./ui/widgets/entity_updater_widget.cpp:289
+pass by reference   +./ui/widgets/entity_updater_widget.cpp:301
+pass by reference   +./ui/widgets/entity_updater_widget.cpp:313
+pass by reference   +./ui/widgets/entity_updater_widget.cpp:325
+pass by reference   +./ui/widgets/entity_updater_widget.cpp:459
+pass by reference   +./ui/widgets/entity_updater_widget.cpp:484
+
+
+  +
+QString [V]
+pass by reference   +./core/repositories/repository_result.cpp:5
+
+
+  +
+ diff --git a/artifacts/cccc/RepositoryResult.xml b/artifacts/cccc/RepositoryResult.xml new file mode 100644 index 0000000..bf644fb --- /dev/null +++ b/artifacts/cccc/RepositoryResult.xml @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +failureResult(const QString &) + +definition + + + + + + + + + +successResult() + +definition + + + + + + + + + + + +RepositoryResult + +EntityDeleterWidget +true +false + +pass by reference + + +EntityUpdaterWidget +true +false + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + + +QString +true +false + +pass by reference + + + + + + diff --git a/artifacts/cccc/ReservationManager.html b/artifacts/cccc/ReservationManager.html new file mode 100644 index 0000000..0d2a662 --- /dev/null +++ b/artifacts/cccc/ReservationManager.html @@ -0,0 +1,146 @@ + +Detailed report on module ReservationManager + + + +

Detailed report on module ReservationManager

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 103 11
McCabe's Cyclomatic NumberMVG 28 3
Lines of CommentCOM 2 0.222
LOC/COML_C51.500 
MVG/COMM_C14.000 
Weighted Methods per Class (  weighting = unity )WMC1 9 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 5 
Information Flow measure (  inclusive )IF4 16 1.778
Information Flow measure (  visible )IF4v 16 1.778
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + + + + + + + + + + + + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
ReservationManager(  qsizetype,  qsizetype,  const DayManager & )
+definition   +./core/utils/reservation_manager.cpp:5
+
+
6 0 0------------
calculateAvailableDaysCount(   )
+definition   +./core/utils/reservation_manager.cpp:19
+
+
5 2 0------------
calculateAvailableSlotsCount(   )
+definition   +./core/utils/reservation_manager.cpp:42
+
+
6 2 0------------
calculatePossibleReservations(  qint64 )
+definition   +./core/utils/reservation_manager.cpp:26
+
+
13 2 0------------
dayManager(  qsizetype )
+definition   +./core/utils/reservation_manager.cpp:84
+
+
8 2 0------------
prepareDaysRange(   )
+definition   +./core/utils/reservation_manager.cpp:113
+
+
17 7 0------******
reserve(  const QTime & )
+definition   +./core/utils/reservation_manager.cpp:49
+
+
28 11 128.00011.000
reserve(  qsizetype,  const QTime & )
+definition   +./core/utils/reservation_manager.cpp:93
+
+
14 2 1------------
setReference(  const DayManager & )
+definition   +./core/utils/reservation_manager.cpp:12
+
+
6 0 0------------
+

Relationships

+ + + + + +
ClientsSuppliers
+SessionGenerator [V]
+pass by reference   +./core/services/session_generator.cpp:14
+
+
+  +
+DayManager [V]
+pass by reference   +./core/utils/reservation_manager.cpp:6
+pass by reference   +./core/utils/reservation_manager.cpp:12
+
+
+QTime [V]
+pass by reference   +./core/utils/reservation_manager.cpp:49
+pass by reference   +./core/utils/reservation_manager.cpp:94
+
+
+qint64 [CV]
+pass by value   +./core/utils/reservation_manager.cpp:26
+
+
+qsizetype [CV]
+pass by value   +./core/utils/reservation_manager.cpp:5
+pass by value   +./core/utils/reservation_manager.cpp:5
+pass by value   +./core/utils/reservation_manager.cpp:84
+pass by value   +./core/utils/reservation_manager.cpp:93
+
+
+  +
+ diff --git a/artifacts/cccc/ReservationManager.xml b/artifacts/cccc/ReservationManager.xml new file mode 100644 index 0000000..3ba773b --- /dev/null +++ b/artifacts/cccc/ReservationManager.xml @@ -0,0 +1,201 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +ReservationManager(qsizetype,qsizetype,const DayManager &) + +definition + + + + + + + + + +calculateAvailableDaysCount() + +definition + + + + + + + + + +calculateAvailableSlotsCount() + +definition + + + + + + + + + +calculatePossibleReservations(qint64) + +definition + + + + + + + + + +dayManager(qsizetype) + +definition + + + + + + + + + +prepareDaysRange() + +definition + + + + + + + + + +reserve(const QTime &) + +definition + + + + + + + + + +reserve(qsizetype,const QTime &) + +definition + + + + + + + + + +setReference(const DayManager &) + +definition + + + + + + + + + + + +ReservationManager + +SessionGenerator +true +false + +pass by reference + + + + +DayManager +true +false + +pass by reference + + + +pass by reference + + +QTime +true +false + +pass by reference + + + +pass by reference + + +qint64 +true +true + +pass by value + + +qsizetype +true +true + +pass by value + + + +pass by value + + + +pass by value + + + +pass by value + + + + + + diff --git a/artifacts/cccc/ReservationManagerTest.html b/artifacts/cccc/ReservationManagerTest.html new file mode 100644 index 0000000..6a1c189 --- /dev/null +++ b/artifacts/cccc/ReservationManagerTest.html @@ -0,0 +1,84 @@ + +Detailed report on module ReservationManagerTest + + + +

Detailed report on module ReservationManagerTest

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 50 17
McCabe's Cyclomatic NumberMVG 6 2
Lines of CommentCOM 0 0.000
LOC/COML_C****** 
MVG/COMM_C****** 
Weighted Methods per Class (  weighting = unity )WMC1 3 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 1 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0 0.000
Information Flow measure (  visible )IF4v 0 0.000
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + + + +
DescriptionLOCMVGCOML_CM_C
definition   +./tests_class/reservation_manager_test.cpp:4
+
7 0 0------------
+

Functions

+ + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
testReserveBound(   )
+definition   +./tests_class/reservation_manager_test.cpp:52
+
+
12 1 0------------
testReserveFailure(   )
+definition   +./tests_class/reservation_manager_test.cpp:13
+
+
9 0 0------------
testReserveSuccess(   )
+definition   +./tests_class/reservation_manager_test.cpp:25
+
+
22 5 0************
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +QObject [CV]
+inheritance   +./tests_class/reservation_manager_test.cpp:4
+
+
+  +
+ diff --git a/artifacts/cccc/ReservationManagerTest.xml b/artifacts/cccc/ReservationManagerTest.xml new file mode 100644 index 0000000..c88a47b --- /dev/null +++ b/artifacts/cccc/ReservationManagerTest.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +definition + + + + + + + + + +testReserveBound() + +definition + + + + + + + + + +testReserveFailure() + +definition + + + + + + + + + +testReserveSuccess() + +definition + + + + + + + + + + + +ReservationManagerTest + + + +QObject +true +true + +inheritance + + + + + + diff --git a/artifacts/cccc/RoleDTO.html b/artifacts/cccc/RoleDTO.html new file mode 100644 index 0000000..bb797fd --- /dev/null +++ b/artifacts/cccc/RoleDTO.html @@ -0,0 +1,63 @@ + +Detailed report on module RoleDTO + + + +

Detailed report on module RoleDTO

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+RolesRepository [V]
+pass by reference   +./data/sql/roles_repository.cpp:28
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/RoleDTO.xml b/artifacts/cccc/RoleDTO.xml new file mode 100644 index 0000000..831c95d --- /dev/null +++ b/artifacts/cccc/RoleDTO.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +RoleDTO + +RolesRepository +true +false + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/RolesRepository.html b/artifacts/cccc/RolesRepository.html new file mode 100644 index 0000000..5e90a78 --- /dev/null +++ b/artifacts/cccc/RolesRepository.html @@ -0,0 +1,141 @@ + +Detailed report on module RolesRepository + + + +

Detailed report on module RolesRepository

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 70 10
McCabe's Cyclomatic NumberMVG 19 3
Lines of CommentCOM 0 0.000
LOC/COML_C****** 
MVG/COMM_C****** 
Weighted Methods per Class (  weighting = unity )WMC1 7 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 8 
Information Flow measure (  inclusive )IF4 0 0.000
Information Flow measure (  visible )IF4v 0 0.000
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + + + + + + + + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
RolesRepository(  QSqlDatabase &,  QObject * )
+definition   +./data/sql/roles_repository.cpp:10
+
+
2 0 0------------
createRole(  const CreateRoleRequest & )
+definition   +./data/sql/roles_repository.cpp:13
+
+
12 3 0------------
deleteRoleById(  qint32 )
+definition   +./data/sql/roles_repository.cpp:78
+
+
10 3 0------------
getAllRoles(  QVector & )
+definition   +./data/sql/roles_repository.cpp:47
+
+
12 4 0------------
getRoleById(  qint32,  RoleDTO & )
+definition   +./data/sql/roles_repository.cpp:28
+
+
15 5 0------******
mapQueryToDTO(  const QSqlQuery & )
+definition   +./data/sql/roles_repository.cpp:91
+
+
7 1 0------------
updateRole(  const UpdateRoleRequest & )
+definition   +./data/sql/roles_repository.cpp:63
+
+
12 3 0------------
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +CreateRoleRequest [V]
+pass by reference   +./data/sql/roles_repository.cpp:13
+
+
+QObject [V]
+pass by reference   +./data/sql/roles_repository.cpp:10
+
+
+QSqlDatabase [V]
+pass by reference   +./data/sql/roles_repository.cpp:10
+
+
+QSqlQuery [V]
+pass by reference   +./data/sql/roles_repository.cpp:91
+
+
+QVector [V]
+pass by reference   +./data/sql/roles_repository.cpp:47
+
+
+RoleDTO [V]
+pass by reference   +./data/sql/roles_repository.cpp:28
+
+
+UpdateRoleRequest [V]
+pass by reference   +./data/sql/roles_repository.cpp:63
+
+
+qint32 [CV]
+pass by value   +./data/sql/roles_repository.cpp:28
+pass by value   +./data/sql/roles_repository.cpp:78
+
+
+  +
+ diff --git a/artifacts/cccc/RolesRepository.xml b/artifacts/cccc/RolesRepository.xml new file mode 100644 index 0000000..a3f73d6 --- /dev/null +++ b/artifacts/cccc/RolesRepository.xml @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +RolesRepository(QSqlDatabase &,QObject *) + +definition + + + + + + + + + +createRole(const CreateRoleRequest &) + +definition + + + + + + + + + +deleteRoleById(qint32) + +definition + + + + + + + + + +getAllRoles(QVector &) + +definition + + + + + + + + + +getRoleById(qint32,RoleDTO &) + +definition + + + + + + + + + +mapQueryToDTO(const QSqlQuery &) + +definition + + + + + + + + + +updateRole(const UpdateRoleRequest &) + +definition + + + + + + + + + + + +RolesRepository + + + +CreateRoleRequest +true +false + +pass by reference + + +QObject +true +false + +pass by reference + + +QSqlDatabase +true +false + +pass by reference + + +QSqlQuery +true +false + +pass by reference + + +QVector +true +false + +pass by reference + + +RoleDTO +true +false + +pass by reference + + +UpdateRoleRequest +true +false + +pass by reference + + +qint32 +true +true + +pass by value + + + +pass by value + + + + + + diff --git a/artifacts/cccc/RolesRepositoryInterface.html b/artifacts/cccc/RolesRepositoryInterface.html new file mode 100644 index 0000000..4c632d5 --- /dev/null +++ b/artifacts/cccc/RolesRepositoryInterface.html @@ -0,0 +1,133 @@ + +Detailed report on module RolesRepositoryInterface + + + +

Detailed report on module RolesRepositoryInterface

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 9 2
McCabe's Cyclomatic NumberMVG 0 0
Lines of CommentCOM 7 1.400
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 5 
Weighted Methods per Class (  weighting = visible )WMCv 5 
Depth of Inheritance TreeDIT 1 
Number of ChildrenNOC 1 
Coupling between objectsCBO 7 
Information Flow measure (  inclusive )IF4 36 7.200
Information Flow measure (  visible )IF4v 36 7.200
Information Flow measure (  concrete )IF4c 4 0.800
+

Definitions and Declarations

+ + + + + + + + +
DescriptionLOCMVGCOML_CM_C
definition   +./core/repositories/roles_repository_interface.h:15
+
3 0 1------------
declaration   +./ui/dialogs/auth_dialog.h:9
+
1 0 1------------
+

Functions

+ + + + + + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
createRole(  const CreateRoleRequest & )
+declaration   +./core/repositories/roles_repository_interface.h:18
+
+
1 0 1------------
deleteRoleById(  qint32 )
+declaration   +./core/repositories/roles_repository_interface.h:30
+
+
1 0 1------------
getAllRoles(  QVector & )
+declaration   +./core/repositories/roles_repository_interface.h:24
+
+
1 0 1------------
getRoleById(  qint32,  RoleDTO & )
+declaration   +./core/repositories/roles_repository_interface.h:21
+
+
1 0 1------------
updateRole(  const UpdateRoleRequest & )
+declaration   +./core/repositories/roles_repository_interface.h:27
+
+
1 0 1------------
+

Relationships

+ + + + + +
ClientsSuppliers
+RolesRepository [CV]
+inheritance   +./data/sql/roles_repository.h:9
+
+
+  +
+CreateRoleRequest [V]
+pass by reference   +./core/repositories/roles_repository_interface.h:18
+
+
+QVector [V]
+pass by reference   +./core/repositories/roles_repository_interface.h:24
+
+
+RepositoryInterface [CV]
+inheritance   +./core/repositories/roles_repository_interface.h:15
+
+
+RoleDTO [V]
+pass by reference   +./core/repositories/roles_repository_interface.h:21
+
+
+UpdateRoleRequest [V]
+pass by reference   +./core/repositories/roles_repository_interface.h:27
+
+
+qint32 [CV]
+pass by value   +./core/repositories/roles_repository_interface.h:21
+pass by value   +./core/repositories/roles_repository_interface.h:30
+
+
+  +
+ diff --git a/artifacts/cccc/RolesRepositoryInterface.xml b/artifacts/cccc/RolesRepositoryInterface.xml new file mode 100644 index 0000000..73f5711 --- /dev/null +++ b/artifacts/cccc/RolesRepositoryInterface.xml @@ -0,0 +1,165 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +definition + + + + + + +declaration + + + + + + + + + +createRole(const CreateRoleRequest &) + +declaration + + + + + + + + + +deleteRoleById(qint32) + +declaration + + + + + + + + + +getAllRoles(QVector &) + +declaration + + + + + + + + + +getRoleById(qint32,RoleDTO &) + +declaration + + + + + + + + + +updateRole(const UpdateRoleRequest &) + +declaration + + + + + + + + + + + +RolesRepositoryInterface + +RolesRepository +true +true + +inheritance + + + + +CreateRoleRequest +true +false + +pass by reference + + +QVector +true +false + +pass by reference + + +RepositoryInterface +true +true + +inheritance + + +RoleDTO +true +false + +pass by reference + + +UpdateRoleRequest +true +false + +pass by reference + + +qint32 +true +true + +pass by value + + + +pass by value + + + + + + diff --git a/artifacts/cccc/SQLFileExecutorInterface.html b/artifacts/cccc/SQLFileExecutorInterface.html new file mode 100644 index 0000000..e3fd16a --- /dev/null +++ b/artifacts/cccc/SQLFileExecutorInterface.html @@ -0,0 +1,88 @@ + +Detailed report on module SQLFileExecutorInterface + + + +

Detailed report on module SQLFileExecutorInterface

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 5 2
McCabe's Cyclomatic NumberMVG 0 0
Lines of CommentCOM 0 0.000
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 2 
Weighted Methods per Class (  weighting = visible )WMCv 1 
Depth of Inheritance TreeDIT 1 
Number of ChildrenNOC 1 
Coupling between objectsCBO 3 
Information Flow measure (  inclusive )IF4 4 2.000
Information Flow measure (  visible )IF4v 4 2.000
Information Flow measure (  concrete )IF4c 1 0.500
+

Definitions and Declarations

+ + + + + +
DescriptionLOCMVGCOML_CM_C
definition   +./tests_schema/tests_sources/sql_file_executor_interfase.h:7
+
3 0 0------------
+

Functions

+ + + + + + +
Function prototypeLOCMVGCOML_CM_C
executeSQLFile(  const string & )
+declaration   +./tests_schema/tests_sources/sql_file_executor_interfase.h:10
+
+
1 0 0------------
~SQLFileExecutorInterface(   )
+definition   +./tests_schema/tests_sources/sql_file_executor_interfase.h:9
+
+
1 0 0------------
+

Relationships

+ + + + + +
ClientsSuppliers
+SQLiteFileExecutor [CV]
+inheritance   +./tests_schema/tests_sources/sqlite_file_executor.h:10
+
+
+  +
+FileReaderInterface [CV]
+inheritance   +./tests_schema/tests_sources/sql_file_executor_interfase.h:7
+
+
+string [V]
+pass by reference   +./tests_schema/tests_sources/sql_file_executor_interfase.h:10
+
+
+  +
+ diff --git a/artifacts/cccc/SQLFileExecutorInterface.xml b/artifacts/cccc/SQLFileExecutorInterface.xml new file mode 100644 index 0000000..45c32b2 --- /dev/null +++ b/artifacts/cccc/SQLFileExecutorInterface.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +definition + + + + + + + + + +executeSQLFile(const string &) + +declaration + + + + + + + + + +~SQLFileExecutorInterface() + +definition + + + + + + + + + + + +SQLFileExecutorInterface + +SQLiteFileExecutor +true +true + +inheritance + + + + +FileReaderInterface +true +true + +inheritance + + +string +true +false + +pass by reference + + + + + + diff --git a/artifacts/cccc/SQLiteDatabase.html b/artifacts/cccc/SQLiteDatabase.html new file mode 100644 index 0000000..eba2743 --- /dev/null +++ b/artifacts/cccc/SQLiteDatabase.html @@ -0,0 +1,354 @@ + +Detailed report on module SQLiteDatabase + + + +

Detailed report on module SQLiteDatabase

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 340 10
McCabe's Cyclomatic NumberMVG 59 2
Lines of CommentCOM 40 1.143
LOC/COML_C 8.500 
MVG/COMM_C 1.475 
Weighted Methods per Class (  weighting = unity )WMC1 35 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 17 
Information Flow measure (  inclusive )IF4 1764 50.400
Information Flow measure (  visible )IF4v 1764 50.400
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
SQLiteDatabase(  ... )
+definition   +./tests_schema/tests_sources/sqlite_database.cpp:23
+
+
2 1 0------------
SQLiteDatabase(  const string & )
+definition   +./tests_schema/tests_sources/sqlite_database.cpp:8
+
+
6 1 2------------
addGenre(  const NewGenre & )
+definition   +./tests_schema/tests_sources/sqlite_database.cpp:86
+
+
7 1 2------------
addHall(  const NewHall & )
+definition   +./tests_schema/tests_sources/sqlite_database.cpp:216
+
+
9 1 2------------
addMovie(  const NewMovie & )
+definition   +./tests_schema/tests_sources/sqlite_database.cpp:147
+
+
10 1 2------------
addRefund(  const NewRefund & )
+definition   +./tests_schema/tests_sources/sqlite_database.cpp:422
+
+
11 1 2------------
addSession(  const NewSession & )
+definition   +./tests_schema/tests_sources/sqlite_database.cpp:280
+
+
11 1 2------------
addTicket(  const NewTicket & )
+definition   +./tests_schema/tests_sources/sqlite_database.cpp:354
+
+
10 1 2------------
executeNonQuery(  const string &,  const function & )
+definition   +./tests_schema/tests_sources/sqlite_database.cpp:37
+
+
15 4 1------------
getAllGenres(   )
+definition   +./tests_schema/tests_sources/sqlite_database.cpp:132
+
+
9 2 1------------
getAllHalls(   )
+definition   +./tests_schema/tests_sources/sqlite_database.cpp:266
+
+
9 2 1------------
getAllMovies(   )
+definition   +./tests_schema/tests_sources/sqlite_database.cpp:201
+
+
10 2 1------------
getAllRefunds(   )
+definition   +./tests_schema/tests_sources/sqlite_database.cpp:477
+
+
10 2 1------------
getAllSessions(   )
+definition   +./tests_schema/tests_sources/sqlite_database.cpp:339
+
+
10 2 1------------
getAllTickets(   )
+definition   +./tests_schema/tests_sources/sqlite_database.cpp:407
+
+
10 2 1------------
getGenre(  int )
+definition   +./tests_schema/tests_sources/sqlite_database.cpp:117
+
+
12 3 1------------
getHall(  int )
+definition   +./tests_schema/tests_sources/sqlite_database.cpp:250
+
+
13 3 1------------
getMovie(  int )
+definition   +./tests_schema/tests_sources/sqlite_database.cpp:184
+
+
14 3 1------------
getRefund(  int )
+definition   +./tests_schema/tests_sources/sqlite_database.cpp:460
+
+
14 3 1------------
getSession(  int )
+definition   +./tests_schema/tests_sources/sqlite_database.cpp:320
+
+
16 3 1------------
getTicket(  int )
+definition   +./tests_schema/tests_sources/sqlite_database.cpp:390
+
+
14 3 1------------
operator =(  ... )
+definition   +./tests_schema/tests_sources/sqlite_database.cpp:26
+
+
9 4 0------------
removeGenre(  int )
+definition   +./tests_schema/tests_sources/sqlite_database.cpp:96
+
+
6 1 1------------
removeHall(  int )
+definition   +./tests_schema/tests_sources/sqlite_database.cpp:228
+
+
6 1 1------------
removeMovie(  int )
+definition   +./tests_schema/tests_sources/sqlite_database.cpp:160
+
+
6 1 1------------
removeRefund(  int )
+definition   +./tests_schema/tests_sources/sqlite_database.cpp:436
+
+
6 1 1------------
removeSession(  int )
+definition   +./tests_schema/tests_sources/sqlite_database.cpp:294
+
+
7 1 1------------
removeTicket(  int )
+definition   +./tests_schema/tests_sources/sqlite_database.cpp:367
+
+
6 1 1------------
updateGenre(  const Genre & )
+definition   +./tests_schema/tests_sources/sqlite_database.cpp:105
+
+
9 1 1------------
updateHall(  const Hall & )
+definition   +./tests_schema/tests_sources/sqlite_database.cpp:237
+
+
10 1 1------------
updateMovie(  const Movie & )
+definition   +./tests_schema/tests_sources/sqlite_database.cpp:169
+
+
12 1 1------------
updateRefund(  const Refund & )
+definition   +./tests_schema/tests_sources/sqlite_database.cpp:445
+
+
12 1 1------------
updateSession(  const Session & )
+definition   +./tests_schema/tests_sources/sqlite_database.cpp:304
+
+
13 1 1------------
updateTicket(  const Ticket & )
+definition   +./tests_schema/tests_sources/sqlite_database.cpp:376
+
+
11 1 1------------
~SQLiteDatabase(   )
+definition   +./tests_schema/tests_sources/sqlite_database.cpp:17
+
+
5 1 1------------
+

Relationships

+ + + + + +
ClientsSuppliers
+SQLiteDatabaseCRUDTest [V]
+has by reference   +./tests_schema/tests/sqlite_database_crud_test.cpp:13
+
+
+SQLiteDatabaseForeignKeyTest [V]
+has by reference   +./tests_schema/tests/sqlite_database_foreign_key_test.cpp:13
+
+
+SQLiteDatabaseTriggerTest [V]
+has by reference   +./tests_schema/tests/sqlite_database_trigger_test.cpp:12
+
+
+  +
+Genre [V]
+pass by reference   +./tests_schema/tests_sources/sqlite_database.cpp:105
+
+
+Hall [V]
+pass by reference   +./tests_schema/tests_sources/sqlite_database.cpp:237
+
+
+Movie [V]
+pass by reference   +./tests_schema/tests_sources/sqlite_database.cpp:169
+
+
+NewGenre [V]
+pass by reference   +./tests_schema/tests_sources/sqlite_database.cpp:86
+
+
+NewHall [V]
+pass by reference   +./tests_schema/tests_sources/sqlite_database.cpp:216
+
+
+NewMovie [V]
+pass by reference   +./tests_schema/tests_sources/sqlite_database.cpp:147
+
+
+NewRefund [V]
+pass by reference   +./tests_schema/tests_sources/sqlite_database.cpp:422
+
+
+NewSession [V]
+pass by reference   +./tests_schema/tests_sources/sqlite_database.cpp:280
+
+
+NewTicket [V]
+pass by reference   +./tests_schema/tests_sources/sqlite_database.cpp:354
+
+
+Refund [V]
+pass by reference   +./tests_schema/tests_sources/sqlite_database.cpp:445
+
+
+Session [V]
+pass by reference   +./tests_schema/tests_sources/sqlite_database.cpp:304
+
+
+Ticket [V]
+pass by reference   +./tests_schema/tests_sources/sqlite_database.cpp:376
+
+
+function [V]
+pass by reference   +./tests_schema/tests_sources/sqlite_database.cpp:39
+
+
+string [V]
+pass by reference   +./tests_schema/tests_sources/sqlite_database.cpp:8
+pass by reference   +./tests_schema/tests_sources/sqlite_database.cpp:38
+
+
+  +
+ diff --git a/artifacts/cccc/SQLiteDatabase.xml b/artifacts/cccc/SQLiteDatabase.xml new file mode 100644 index 0000000..e9ae03a --- /dev/null +++ b/artifacts/cccc/SQLiteDatabase.xml @@ -0,0 +1,581 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +SQLiteDatabase(...) + +definition + + + + + + + + + +SQLiteDatabase(const string &) + +definition + + + + + + + + + +addGenre(const NewGenre &) + +definition + + + + + + + + + +addHall(const NewHall &) + +definition + + + + + + + + + +addMovie(const NewMovie &) + +definition + + + + + + + + + +addRefund(const NewRefund &) + +definition + + + + + + + + + +addSession(const NewSession &) + +definition + + + + + + + + + +addTicket(const NewTicket &) + +definition + + + + + + + + + +executeNonQuery(const string &,const function &) + +definition + + + + + + + + + +getAllGenres() + +definition + + + + + + + + + +getAllHalls() + +definition + + + + + + + + + +getAllMovies() + +definition + + + + + + + + + +getAllRefunds() + +definition + + + + + + + + + +getAllSessions() + +definition + + + + + + + + + +getAllTickets() + +definition + + + + + + + + + +getGenre(int) + +definition + + + + + + + + + +getHall(int) + +definition + + + + + + + + + +getMovie(int) + +definition + + + + + + + + + +getRefund(int) + +definition + + + + + + + + + +getSession(int) + +definition + + + + + + + + + +getTicket(int) + +definition + + + + + + + + + +operator =(...) + +definition + + + + + + + + + +removeGenre(int) + +definition + + + + + + + + + +removeHall(int) + +definition + + + + + + + + + +removeMovie(int) + +definition + + + + + + + + + +removeRefund(int) + +definition + + + + + + + + + +removeSession(int) + +definition + + + + + + + + + +removeTicket(int) + +definition + + + + + + + + + +updateGenre(const Genre &) + +definition + + + + + + + + + +updateHall(const Hall &) + +definition + + + + + + + + + +updateMovie(const Movie &) + +definition + + + + + + + + + +updateRefund(const Refund &) + +definition + + + + + + + + + +updateSession(const Session &) + +definition + + + + + + + + + +updateTicket(const Ticket &) + +definition + + + + + + + + + +~SQLiteDatabase() + +definition + + + + + + + + + + + +SQLiteDatabase + +SQLiteDatabaseCRUDTest +true +false + +has by reference + + +SQLiteDatabaseForeignKeyTest +true +false + +has by reference + + +SQLiteDatabaseTriggerTest +true +false + +has by reference + + + + +Genre +true +false + +pass by reference + + +Hall +true +false + +pass by reference + + +Movie +true +false + +pass by reference + + +NewGenre +true +false + +pass by reference + + +NewHall +true +false + +pass by reference + + +NewMovie +true +false + +pass by reference + + +NewRefund +true +false + +pass by reference + + +NewSession +true +false + +pass by reference + + +NewTicket +true +false + +pass by reference + + +Refund +true +false + +pass by reference + + +Session +true +false + +pass by reference + + +Ticket +true +false + +pass by reference + + +function +true +false + +pass by reference + + +string +true +false + +pass by reference + + + +pass by reference + + + + + + diff --git a/artifacts/cccc/SQLiteDatabaseCRUDTest.html b/artifacts/cccc/SQLiteDatabaseCRUDTest.html new file mode 100644 index 0000000..1ac11ba --- /dev/null +++ b/artifacts/cccc/SQLiteDatabaseCRUDTest.html @@ -0,0 +1,72 @@ + +Detailed report on module SQLiteDatabaseCRUDTest + + + +

Detailed report on module SQLiteDatabaseCRUDTest

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 15******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 2********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 1 
Number of ChildrenNOC 0 
Coupling between objectsCBO 2 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + + + +
DescriptionLOCMVGCOML_CM_C
definition   +./tests_schema/tests/sqlite_database_crud_test.cpp:11
+
15 0 2------------
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +SQLiteDatabase [V]
+has by reference   +./tests_schema/tests/sqlite_database_crud_test.cpp:13
+
+
+Test [CV]
+inheritance   +./tests_schema/tests/sqlite_database_crud_test.cpp:11
+
+
+  +
+ diff --git a/artifacts/cccc/SQLiteDatabaseCRUDTest.xml b/artifacts/cccc/SQLiteDatabaseCRUDTest.xml new file mode 100644 index 0000000..702a7f1 --- /dev/null +++ b/artifacts/cccc/SQLiteDatabaseCRUDTest.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +definition + + + + + + + + + + + +SQLiteDatabaseCRUDTest + + + +SQLiteDatabase +true +false + +has by reference + + +Test +true +true + +inheritance + + + + + + diff --git a/artifacts/cccc/SQLiteDatabaseForeignKeyTest.html b/artifacts/cccc/SQLiteDatabaseForeignKeyTest.html new file mode 100644 index 0000000..462f625 --- /dev/null +++ b/artifacts/cccc/SQLiteDatabaseForeignKeyTest.html @@ -0,0 +1,72 @@ + +Detailed report on module SQLiteDatabaseForeignKeyTest + + + +

Detailed report on module SQLiteDatabaseForeignKeyTest

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 12******
McCabe's Cyclomatic NumberMVG 1******
Lines of CommentCOM 5********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 1 
Number of ChildrenNOC 0 
Coupling between objectsCBO 2 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + + + +
DescriptionLOCMVGCOML_CM_C
definition   +./tests_schema/tests/sqlite_database_foreign_key_test.cpp:10
+
12 1 5------------
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +SQLiteDatabase [V]
+has by reference   +./tests_schema/tests/sqlite_database_foreign_key_test.cpp:13
+
+
+Test [CV]
+inheritance   +./tests_schema/tests/sqlite_database_foreign_key_test.cpp:10
+
+
+  +
+ diff --git a/artifacts/cccc/SQLiteDatabaseForeignKeyTest.xml b/artifacts/cccc/SQLiteDatabaseForeignKeyTest.xml new file mode 100644 index 0000000..ea868a2 --- /dev/null +++ b/artifacts/cccc/SQLiteDatabaseForeignKeyTest.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +definition + + + + + + + + + + + +SQLiteDatabaseForeignKeyTest + + + +SQLiteDatabase +true +false + +has by reference + + +Test +true +true + +inheritance + + + + + + diff --git a/artifacts/cccc/SQLiteDatabaseTriggerTest.html b/artifacts/cccc/SQLiteDatabaseTriggerTest.html new file mode 100644 index 0000000..b630c95 --- /dev/null +++ b/artifacts/cccc/SQLiteDatabaseTriggerTest.html @@ -0,0 +1,72 @@ + +Detailed report on module SQLiteDatabaseTriggerTest + + + +

Detailed report on module SQLiteDatabaseTriggerTest

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 17******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 2********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 1 
Number of ChildrenNOC 0 
Coupling between objectsCBO 2 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + + + +
DescriptionLOCMVGCOML_CM_C
definition   +./tests_schema/tests/sqlite_database_trigger_test.cpp:10
+
17 0 2------------
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +SQLiteDatabase [V]
+has by reference   +./tests_schema/tests/sqlite_database_trigger_test.cpp:12
+
+
+Test [CV]
+inheritance   +./tests_schema/tests/sqlite_database_trigger_test.cpp:10
+
+
+  +
+ diff --git a/artifacts/cccc/SQLiteDatabaseTriggerTest.xml b/artifacts/cccc/SQLiteDatabaseTriggerTest.xml new file mode 100644 index 0000000..65b4761 --- /dev/null +++ b/artifacts/cccc/SQLiteDatabaseTriggerTest.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +definition + + + + + + + + + + + +SQLiteDatabaseTriggerTest + + + +SQLiteDatabase +true +false + +has by reference + + +Test +true +true + +inheritance + + + + + + diff --git a/artifacts/cccc/SQLiteFileExecutor.html b/artifacts/cccc/SQLiteFileExecutor.html new file mode 100644 index 0000000..d5a1c48 --- /dev/null +++ b/artifacts/cccc/SQLiteFileExecutor.html @@ -0,0 +1,82 @@ + +Detailed report on module SQLiteFileExecutor + + + +

Detailed report on module SQLiteFileExecutor

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 26 9
McCabe's Cyclomatic NumberMVG 5 2
Lines of CommentCOM 2 0.667
LOC/COML_C13.000 
MVG/COMM_C 2.500 
Weighted Methods per Class (  weighting = unity )WMC1 3 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0 0.000
Information Flow measure (  visible )IF4v 0 0.000
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
SQLiteFileExecutor(  const string & )
+definition   +./tests_schema/tests_sources/sqlite_file_executor.cpp:6
+
+
6 1 1------------
executeSQLFile(  const string & )
+definition   +./tests_schema/tests_sources/sqlite_file_executor.cpp:21
+
+
15 3 1------------
~SQLiteFileExecutor(   )
+definition   +./tests_schema/tests_sources/sqlite_file_executor.cpp:14
+
+
5 1 0------------
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +string [V]
+pass by reference   +./tests_schema/tests_sources/sqlite_file_executor.cpp:6
+pass by reference   +./tests_schema/tests_sources/sqlite_file_executor.cpp:21
+
+
+  +
+ diff --git a/artifacts/cccc/SQLiteFileExecutor.xml b/artifacts/cccc/SQLiteFileExecutor.xml new file mode 100644 index 0000000..fc881fb --- /dev/null +++ b/artifacts/cccc/SQLiteFileExecutor.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +SQLiteFileExecutor(const string &) + +definition + + + + + + + + + +executeSQLFile(const string &) + +definition + + + + + + + + + +~SQLiteFileExecutor() + +definition + + + + + + + + + + + +SQLiteFileExecutor + + + +string +true +false + +pass by reference + + + +pass by reference + + + + + + diff --git a/artifacts/cccc/SQLiteStatement.html b/artifacts/cccc/SQLiteStatement.html new file mode 100644 index 0000000..0527efe --- /dev/null +++ b/artifacts/cccc/SQLiteStatement.html @@ -0,0 +1,147 @@ + +Detailed report on module SQLiteStatement + + + +

Detailed report on module SQLiteStatement

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 56 4
McCabe's Cyclomatic NumberMVG 18 1
Lines of CommentCOM 14 1.077
LOC/COML_C 4.000 
MVG/COMM_C 1.286 
Weighted Methods per Class (  weighting = unity )WMC1 13 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 2 
Information Flow measure (  inclusive )IF4 0 0.000
Information Flow measure (  visible )IF4v 0 0.000
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
SQLiteStatement(  sqlite3 *,  const string & )
+definition   +./tests_schema/tests_sources/sqlite_statement.cpp:5
+
+
15 3 1------------
bind(  int,  const string & )
+definition   +./tests_schema/tests_sources/sqlite_statement.cpp:38
+
+
4 1 1------------
bind(  int,  double )
+definition   +./tests_schema/tests_sources/sqlite_statement.cpp:33
+
+
3 1 1------------
bind(  int,  int )
+definition   +./tests_schema/tests_sources/sqlite_statement.cpp:28
+
+
3 1 1------------
bindNull(  int )
+definition   +./tests_schema/tests_sources/sqlite_statement.cpp:44
+
+
3 1 1------------
changes(   )
+definition   +./tests_schema/tests_sources/sqlite_statement.cpp:68
+
+
1 1 1------------
execute(   )
+definition   +./tests_schema/tests_sources/sqlite_statement.cpp:50
+
+
1 1 2------------
finalize(   )
+definition   +./tests_schema/tests_sources/sqlite_statement.cpp:74
+
+
6 1 1------------
getColumnCount(   )
+definition   +./tests_schema/tests_sources/sqlite_statement.cpp:82
+
+
3 1 1------------
getColumnText(  int )
+definition   +./tests_schema/tests_sources/sqlite_statement.cpp:87
+
+
4 2 1------------
reset(   )
+definition   +./tests_schema/tests_sources/sqlite_statement.cpp:71
+
+
1 0 1------------
step(   )
+definition   +./tests_schema/tests_sources/sqlite_statement.cpp:53
+
+
11 5 1------ 5.000
~SQLiteStatement(   )
+definition   +./tests_schema/tests_sources/sqlite_statement.cpp:25
+
+
1 0 1------------
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +sqlite3 [V]
+pass by reference   +./tests_schema/tests_sources/sqlite_statement.cpp:5
+
+
+string [V]
+pass by reference   +./tests_schema/tests_sources/sqlite_statement.cpp:5
+pass by reference   +./tests_schema/tests_sources/sqlite_statement.cpp:38
+
+
+  +
+ diff --git a/artifacts/cccc/SQLiteStatement.xml b/artifacts/cccc/SQLiteStatement.xml new file mode 100644 index 0000000..ba32b11 --- /dev/null +++ b/artifacts/cccc/SQLiteStatement.xml @@ -0,0 +1,212 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +SQLiteStatement(sqlite3 *,const string &) + +definition + + + + + + + + + +bind(int,const string &) + +definition + + + + + + + + + +bind(int,double) + +definition + + + + + + + + + +bind(int,int) + +definition + + + + + + + + + +bindNull(int) + +definition + + + + + + + + + +changes() + +definition + + + + + + + + + +execute() + +definition + + + + + + + + + +finalize() + +definition + + + + + + + + + +getColumnCount() + +definition + + + + + + + + + +getColumnText(int) + +definition + + + + + + + + + +reset() + +definition + + + + + + + + + +step() + +definition + + + + + + + + + +~SQLiteStatement() + +definition + + + + + + + + + + + +SQLiteStatement + + + +sqlite3 +true +false + +pass by reference + + +string +true +false + +pass by reference + + + +pass by reference + + + + + + diff --git a/artifacts/cccc/SalesData.html b/artifacts/cccc/SalesData.html new file mode 100644 index 0000000..24fda18 --- /dev/null +++ b/artifacts/cccc/SalesData.html @@ -0,0 +1,90 @@ + +Detailed report on module SalesData + + + +

Detailed report on module SalesData

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 24 6
McCabe's Cyclomatic NumberMVG 2 0
Lines of CommentCOM 0 0.000
LOC/COML_C****** 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 4 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0 0.000
Information Flow measure (  visible )IF4v 0 0.000
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
SalesData(   )
+definition   +./ui/widgets/ticket_sales_report_widget.cpp:15
+
+
3 0 0------------
SalesData(  double,  double,  qint32,  qint32,  qint32 )
+definition   +./ui/widgets/ticket_sales_report_widget.cpp:19
+
+
8 0 0------------
operator +(  const SalesData & )
+definition   +./ui/widgets/ticket_sales_report_widget.cpp:29
+
+
9 1 0------------
operator +=(  const SalesData & )
+definition   +./ui/widgets/ticket_sales_report_widget.cpp:40
+
+
4 1 0------------
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +qint32 [CV]
+pass by value   +./ui/widgets/ticket_sales_report_widget.cpp:21
+pass by value   +./ui/widgets/ticket_sales_report_widget.cpp:22
+pass by value   +./ui/widgets/ticket_sales_report_widget.cpp:23
+
+
+  +
+ diff --git a/artifacts/cccc/SalesData.xml b/artifacts/cccc/SalesData.xml new file mode 100644 index 0000000..f927f04 --- /dev/null +++ b/artifacts/cccc/SalesData.xml @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +SalesData() + +definition + + + + + + + + + +SalesData(double,double,qint32,qint32,qint32) + +definition + + + + + + + + + +operator +(const SalesData &) + +definition + + + + + + + + + +operator +=(const SalesData &) + +definition + + + + + + + + + + + +SalesData + + + +qint32 +true +true + +pass by value + + + +pass by value + + + +pass by value + + + + + + diff --git a/artifacts/cccc/SchemaMetadata.html b/artifacts/cccc/SchemaMetadata.html new file mode 100644 index 0000000..8512585 --- /dev/null +++ b/artifacts/cccc/SchemaMetadata.html @@ -0,0 +1,130 @@ + +Detailed report on module SchemaMetadata + + + +

Detailed report on module SchemaMetadata

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 102 10
McCabe's Cyclomatic NumberMVG 11 1
Lines of CommentCOM 0 0.000
LOC/COML_C****** 
MVG/COMM_C****** 
Weighted Methods per Class (  weighting = unity )WMC1 10 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0 0.000
Information Flow measure (  visible )IF4v 0 0.000
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + + + + + + + + + + + + + + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
SchemaMetadata(   )
+definition   +./core/services/schema_metadata.cpp:73
+
+
3 0 0------------
SchemaMetadata(  const SchemaMetadata & )
+definition   +./core/services/schema_metadata.cpp:77
+
+
1 0 0------------
defaultSchema(   )
+definition   +./core/services/schema_metadata.cpp:83
+
+
1 1 0------------
initialize(   )
+definition   +./core/services/schema_metadata.cpp:8
+
+
54 0 0******------
modelTableName(  const QString & )
+definition   +./core/services/schema_metadata.cpp:85
+
+
8 2 0------------
operator =(  const SchemaMetadata & )
+definition   +./core/services/schema_metadata.cpp:79
+
+
3 1 0------------
primaryIdColumnName(  const QString & )
+definition   +./core/services/schema_metadata.cpp:96
+
+
9 2 0------------
relationIdConfig(  const QString & )
+definition   +./core/services/schema_metadata.cpp:133
+
+
5 1 0------------
repositoryTableName(  const QString & )
+definition   +./core/services/schema_metadata.cpp:108
+
+
9 2 0------------
translatedTableName(  const QString & )
+definition   +./core/services/schema_metadata.cpp:120
+
+
9 2 0------------
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +QString [V]
+pass by reference   +./core/services/schema_metadata.cpp:85
+pass by reference   +./core/services/schema_metadata.cpp:96
+pass by reference   +./core/services/schema_metadata.cpp:108
+pass by reference   +./core/services/schema_metadata.cpp:120
+pass by reference   +./core/services/schema_metadata.cpp:133
+
+
+  +
+ diff --git a/artifacts/cccc/SchemaMetadata.xml b/artifacts/cccc/SchemaMetadata.xml new file mode 100644 index 0000000..a3d1f4f --- /dev/null +++ b/artifacts/cccc/SchemaMetadata.xml @@ -0,0 +1,181 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +SchemaMetadata() + +definition + + + + + + + + + +SchemaMetadata(const SchemaMetadata &) + +definition + + + + + + + + + +defaultSchema() + +definition + + + + + + + + + +initialize() + +definition + + + + + + + + + +modelTableName(const QString &) + +definition + + + + + + + + + +operator =(const SchemaMetadata &) + +definition + + + + + + + + + +primaryIdColumnName(const QString &) + +definition + + + + + + + + + +relationIdConfig(const QString &) + +definition + + + + + + + + + +repositoryTableName(const QString &) + +definition + + + + + + + + + +translatedTableName(const QString &) + +definition + + + + + + + + + + + +SchemaMetadata + + + +QString +true +false + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + + + + diff --git a/artifacts/cccc/SearchDialog.html b/artifacts/cccc/SearchDialog.html new file mode 100644 index 0000000..7508cf1 --- /dev/null +++ b/artifacts/cccc/SearchDialog.html @@ -0,0 +1,137 @@ + +Detailed report on module SearchDialog + + + +

Detailed report on module SearchDialog

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 103 10
McCabe's Cyclomatic NumberMVG 17 2
Lines of CommentCOM 3 0.300
LOC/COML_C34.333 
MVG/COMM_C 5.667 
Weighted Methods per Class (  weighting = unity )WMC1 10 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 2 
Information Flow measure (  inclusive )IF4 0 0.000
Information Flow measure (  visible )IF4v 0 0.000
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + + + + + + + + + + + + + + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
SearchDialog(  QWidget * )
+definition   +./ui/dialogs/search_dialog.cpp:8
+
+
7 0 1------------
SearchDialog(  const QString &,  const QString &,  QWidget * )
+definition   +./ui/dialogs/search_dialog.cpp:17
+
+
10 2 0------------
initializeProxyModel(   )
+definition   +./ui/dialogs/search_dialog.cpp:73
+
+
3 0 0------------
onLineEditSearchTextChanged(  const QString & )
+definition   +./ui/dialogs/search_dialog.cpp:111
+
+
10 2 2------------
onPushButtonSelectClicked(   )
+definition   +./ui/dialogs/search_dialog.cpp:129
+
+
21 4 0******------
setFieldName(  const QString & )
+definition   +./ui/dialogs/search_dialog.cpp:34
+
+
8 3 0------------
setTableName(  const QString & )
+definition   +./ui/dialogs/search_dialog.cpp:43
+
+
18 5 0------******
setupConnections(   )
+definition   +./ui/dialogs/search_dialog.cpp:77
+
+
6 0 0------------
setupTableView(   )
+definition   +./ui/dialogs/search_dialog.cpp:85
+
+
15 0 0------------
~SearchDialog(   )
+definition   +./ui/dialogs/search_dialog.cpp:28
+
+
5 1 0------------
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +QString [V]
+pass by reference   +./ui/dialogs/search_dialog.cpp:17
+pass by reference   +./ui/dialogs/search_dialog.cpp:18
+pass by reference   +./ui/dialogs/search_dialog.cpp:34
+pass by reference   +./ui/dialogs/search_dialog.cpp:43
+pass by reference   +./ui/dialogs/search_dialog.cpp:111
+
+
+QWidget [V]
+pass by reference   +./ui/dialogs/search_dialog.cpp:8
+pass by reference   +./ui/dialogs/search_dialog.cpp:18
+
+
+  +
+ diff --git a/artifacts/cccc/SearchDialog.xml b/artifacts/cccc/SearchDialog.xml new file mode 100644 index 0000000..18398cc --- /dev/null +++ b/artifacts/cccc/SearchDialog.xml @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +SearchDialog(QWidget *) + +definition + + + + + + + + + +SearchDialog(const QString &,const QString &,QWidget *) + +definition + + + + + + + + + +initializeProxyModel() + +definition + + + + + + + + + +onLineEditSearchTextChanged(const QString &) + +definition + + + + + + + + + +onPushButtonSelectClicked() + +definition + + + + + + + + + +setFieldName(const QString &) + +definition + + + + + + + + + +setTableName(const QString &) + +definition + + + + + + + + + +setupConnections() + +definition + + + + + + + + + +setupTableView() + +definition + + + + + + + + + +~SearchDialog() + +definition + + + + + + + + + + + +SearchDialog + + + +QString +true +false + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + +QWidget +true +false + +pass by reference + + + +pass by reference + + + + + + diff --git a/artifacts/cccc/SenderType.html b/artifacts/cccc/SenderType.html new file mode 100644 index 0000000..63c938c --- /dev/null +++ b/artifacts/cccc/SenderType.html @@ -0,0 +1,63 @@ + +Detailed report on module SenderType + + + +

Detailed report on module SenderType

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+ApplicationConnector [V]
+pass by reference   +./core/controllers/application_connector.h:154
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/SenderType.xml b/artifacts/cccc/SenderType.xml new file mode 100644 index 0000000..389775d --- /dev/null +++ b/artifacts/cccc/SenderType.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +SenderType + +ApplicationConnector +true +false + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/Session.html b/artifacts/cccc/Session.html new file mode 100644 index 0000000..d7c75cb --- /dev/null +++ b/artifacts/cccc/Session.html @@ -0,0 +1,63 @@ + +Detailed report on module Session + + + +

Detailed report on module Session

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+SQLiteDatabase [V]
+pass by reference   +./tests_schema/tests_sources/sqlite_database.cpp:304
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/Session.xml b/artifacts/cccc/Session.xml new file mode 100644 index 0000000..b981f47 --- /dev/null +++ b/artifacts/cccc/Session.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Session + +SQLiteDatabase +true +false + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/SessionDTO.html b/artifacts/cccc/SessionDTO.html new file mode 100644 index 0000000..c0dc8a4 --- /dev/null +++ b/artifacts/cccc/SessionDTO.html @@ -0,0 +1,63 @@ + +Detailed report on module SessionDTO + + + +

Detailed report on module SessionDTO

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+SessionsRepository [V]
+pass by reference   +./data/sql/sessions_repository.cpp:33
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/SessionDTO.xml b/artifacts/cccc/SessionDTO.xml new file mode 100644 index 0000000..8da75a5 --- /dev/null +++ b/artifacts/cccc/SessionDTO.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +SessionDTO + +SessionsRepository +true +false + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/SessionGenerator.html b/artifacts/cccc/SessionGenerator.html new file mode 100644 index 0000000..9c34a51 --- /dev/null +++ b/artifacts/cccc/SessionGenerator.html @@ -0,0 +1,159 @@ + +Detailed report on module SessionGenerator + + + +

Detailed report on module SessionGenerator

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 152 12
McCabe's Cyclomatic NumberMVG 24 2
Lines of CommentCOM 23 1.769
LOC/COML_C 6.609 
MVG/COMM_C 1.043 
Weighted Methods per Class (  weighting = unity )WMC1 13 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 4 
Information Flow measure (  inclusive )IF4 0 0.000
Information Flow measure (  visible )IF4v 0 0.000
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
SessionGenerator(  const ReservationManager & )
+definition   +./core/services/session_generator.cpp:13
+
+
10 0 6------------
calculateRemainingCapacity(   )
+definition   +./core/services/session_generator.cpp:152
+
+
7 2 1------------
createFailureMessage(  const QString & )
+definition   +./core/services/session_generator.cpp:120
+
+
8 1 0------------
createRecord(   )
+definition   +./core/services/session_generator.cpp:107
+
+
9 1 0------------
createSuccessMessage(   )
+definition   +./core/services/session_generator.cpp:129
+
+
12 1 15------------
duration(  qint32 )
+definition   +./core/services/session_generator.cpp:214
+
+
2 0 0------------
initializeBounds(   )
+definition   +./core/services/session_generator.cpp:63
+
+
7 0 1------------
initializeDayManager(   )
+definition   +./core/services/session_generator.cpp:72
+
+
13 1 0------------
initializeHallIdToReservationManagerMap(   )
+definition   +./core/services/session_generator.cpp:88
+
+
14 3 0------------
initializeMovieIdToDurationMap(  qint32 )
+definition   +./core/services/session_generator.cpp:42
+
+
16 3 0------------
initializeRepositories(   )
+definition   +./core/services/session_generator.cpp:26
+
+
13 3 0------------
prepareData(   )
+definition   +./core/services/session_generator.cpp:162
+
+
15 4 0------------
prepareData(  qint32,  const QList & )
+definition   +./core/services/session_generator.cpp:181
+
+
26 5 0************
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +QList [V]
+pass by reference   +./core/services/session_generator.cpp:182
+
+
+QString [V]
+pass by reference   +./core/services/session_generator.cpp:120
+
+
+ReservationManager [V]
+pass by reference   +./core/services/session_generator.cpp:14
+
+
+qint32 [CV]
+pass by value   +./core/services/session_generator.cpp:43
+pass by value   +./core/services/session_generator.cpp:181
+pass by value   +./core/services/session_generator.cpp:214
+
+
+  +
+ diff --git a/artifacts/cccc/SessionGenerator.xml b/artifacts/cccc/SessionGenerator.xml new file mode 100644 index 0000000..8a69ab6 --- /dev/null +++ b/artifacts/cccc/SessionGenerator.xml @@ -0,0 +1,230 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +SessionGenerator(const ReservationManager &) + +definition + + + + + + + + + +calculateRemainingCapacity() + +definition + + + + + + + + + +createFailureMessage(const QString &) + +definition + + + + + + + + + +createRecord() + +definition + + + + + + + + + +createSuccessMessage() + +definition + + + + + + + + + +duration(qint32) + +definition + + + + + + + + + +initializeBounds() + +definition + + + + + + + + + +initializeDayManager() + +definition + + + + + + + + + +initializeHallIdToReservationManagerMap() + +definition + + + + + + + + + +initializeMovieIdToDurationMap(qint32) + +definition + + + + + + + + + +initializeRepositories() + +definition + + + + + + + + + +prepareData() + +definition + + + + + + + + + +prepareData(qint32,const QList &) + +definition + + + + + + + + + + + +SessionGenerator + + + +QList +true +false + +pass by reference + + +QString +true +false + +pass by reference + + +ReservationManager +true +false + +pass by reference + + +qint32 +true +true + +pass by value + + + +pass by value + + + +pass by value + + + + + + diff --git a/artifacts/cccc/SessionInfoDTO.html b/artifacts/cccc/SessionInfoDTO.html new file mode 100644 index 0000000..ab6b422 --- /dev/null +++ b/artifacts/cccc/SessionInfoDTO.html @@ -0,0 +1,62 @@ + +Detailed report on module SessionInfoDTO + + + +

Detailed report on module SessionInfoDTO

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 1******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 0 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + + + +
DescriptionLOCMVGCOML_CM_C
declaration   +./ui/widgets/reports_widget.h:15
+
1 0 0------------
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +  +
+ diff --git a/artifacts/cccc/SessionInfoDTO.xml b/artifacts/cccc/SessionInfoDTO.xml new file mode 100644 index 0000000..849b1ef --- /dev/null +++ b/artifacts/cccc/SessionInfoDTO.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +declaration + + + + + + + + + + + +SessionInfoDTO + + + + + + + diff --git a/artifacts/cccc/SessionManagementWidget.html b/artifacts/cccc/SessionManagementWidget.html new file mode 100644 index 0000000..c211424 --- /dev/null +++ b/artifacts/cccc/SessionManagementWidget.html @@ -0,0 +1,129 @@ + +Detailed report on module SessionManagementWidget + + + +

Detailed report on module SessionManagementWidget

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 72 7
McCabe's Cyclomatic NumberMVG 3 0
Lines of CommentCOM 3 0.300
LOC/COML_C24.000 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 10 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 2 
Information Flow measure (  inclusive )IF4 0 0.000
Information Flow measure (  visible )IF4v 0 0.000
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + + + + + + + + + + + + + + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
SessionManagementWidget(  QWidget * )
+definition   +./ui/widgets/session_management_widget.cpp:13
+
+
10 0 3------------
initializeModels(   )
+definition   +./ui/widgets/session_management_widget.cpp:38
+
+
10 1 0------------
initializeRepositories(   )
+definition   +./ui/widgets/session_management_widget.cpp:25
+
+
10 1 0------------
onHallFieldRetrieved(  const QSqlField & )
+definition   +./ui/widgets/session_management_widget.cpp:97
+
+
3 0 0------------
onMovieFieldRetrieved(  const QSqlField & )
+definition   +./ui/widgets/session_management_widget.cpp:101
+
+
3 0 0------------
onPushButtonAddSessionClicked(   )
+definition   +./ui/widgets/session_management_widget.cpp:80
+
+
13 1 0------------
setupConnections(   )
+definition   +./ui/widgets/session_management_widget.cpp:55
+
+
8 0 0------------
setupHallFinder(   )
+definition   +./ui/widgets/session_management_widget.cpp:66
+
+
6 0 0------------
setupMovieFinder(   )
+definition   +./ui/widgets/session_management_widget.cpp:73
+
+
6 0 0------------
setupTableView(   )
+definition   +./ui/widgets/session_management_widget.cpp:51
+
+
3 0 0------------
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +QSqlField [V]
+pass by reference   +./ui/widgets/session_management_widget.cpp:97
+pass by reference   +./ui/widgets/session_management_widget.cpp:101
+
+
+QWidget [V]
+pass by reference   +./ui/widgets/session_management_widget.cpp:13
+
+
+  +
+ diff --git a/artifacts/cccc/SessionManagementWidget.xml b/artifacts/cccc/SessionManagementWidget.xml new file mode 100644 index 0000000..8fa1ede --- /dev/null +++ b/artifacts/cccc/SessionManagementWidget.xml @@ -0,0 +1,176 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +SessionManagementWidget(QWidget *) + +definition + + + + + + + + + +initializeModels() + +definition + + + + + + + + + +initializeRepositories() + +definition + + + + + + + + + +onHallFieldRetrieved(const QSqlField &) + +definition + + + + + + + + + +onMovieFieldRetrieved(const QSqlField &) + +definition + + + + + + + + + +onPushButtonAddSessionClicked() + +definition + + + + + + + + + +setupConnections() + +definition + + + + + + + + + +setupHallFinder() + +definition + + + + + + + + + +setupMovieFinder() + +definition + + + + + + + + + +setupTableView() + +definition + + + + + + + + + + + +SessionManagementWidget + + + +QSqlField +true +false + +pass by reference + + + +pass by reference + + +QWidget +true +false + +pass by reference + + + + + + diff --git a/artifacts/cccc/SessionStatisticsDTO.html b/artifacts/cccc/SessionStatisticsDTO.html new file mode 100644 index 0000000..81217a5 --- /dev/null +++ b/artifacts/cccc/SessionStatisticsDTO.html @@ -0,0 +1,63 @@ + +Detailed report on module SessionStatisticsDTO + + + +

Detailed report on module SessionStatisticsDTO

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+SessionsStatisticsRepository [V]
+pass by reference   +./data/sql/sessions_statistics_repository.cpp:59
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/SessionStatisticsDTO.xml b/artifacts/cccc/SessionStatisticsDTO.xml new file mode 100644 index 0000000..b02e95d --- /dev/null +++ b/artifacts/cccc/SessionStatisticsDTO.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +SessionStatisticsDTO + +SessionsStatisticsRepository +true +false + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/SessionsInfoRepositoryInterface.html b/artifacts/cccc/SessionsInfoRepositoryInterface.html new file mode 100644 index 0000000..a9080e5 --- /dev/null +++ b/artifacts/cccc/SessionsInfoRepositoryInterface.html @@ -0,0 +1,62 @@ + +Detailed report on module SessionsInfoRepositoryInterface + + + +

Detailed report on module SessionsInfoRepositoryInterface

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 1******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 0 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + + + +
DescriptionLOCMVGCOML_CM_C
declaration   +./ui/widgets/reports_widget.h:16
+
1 0 0------------
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +  +
+ diff --git a/artifacts/cccc/SessionsInfoRepositoryInterface.xml b/artifacts/cccc/SessionsInfoRepositoryInterface.xml new file mode 100644 index 0000000..a07444b --- /dev/null +++ b/artifacts/cccc/SessionsInfoRepositoryInterface.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +declaration + + + + + + + + + + + +SessionsInfoRepositoryInterface + + + + + + + diff --git a/artifacts/cccc/SessionsModel.html b/artifacts/cccc/SessionsModel.html new file mode 100644 index 0000000..00aa0f8 --- /dev/null +++ b/artifacts/cccc/SessionsModel.html @@ -0,0 +1,121 @@ + +Detailed report on module SessionsModel + + + +

Detailed report on module SessionsModel

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 84 14
McCabe's Cyclomatic NumberMVG 23 4
Lines of CommentCOM 4 0.667
LOC/COML_C21.000 
MVG/COMM_C 5.750 
Weighted Methods per Class (  weighting = unity )WMC1 6 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 4 
Information Flow measure (  inclusive )IF4 0 0.000
Information Flow measure (  visible )IF4v 0 0.000
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + + + + + + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
SessionsModel(  QObject *,  const QSqlDatabase & )
+definition   +./ui/models/sessions_model.cpp:6
+
+
2 0 0------------
buildHallIdFilterCondition(  const QString &,  QString & )
+definition   +./ui/models/sessions_model.cpp:26
+
+
16 4 0------------
buildMovieIdFilterCondition(  const QString &,  QString & )
+definition   +./ui/models/sessions_model.cpp:47
+
+
16 4 0------------
createMultiColumnFilter(  const QString & )
+definition   +./ui/models/sessions_model.cpp:89
+
+
18 4 3------------
headerData(  int,  Orientation,  int )
+definition   +./ui/models/sessions_model.cpp:68
+
+
20 10 0************
initialize(   )
+definition   +./ui/models/sessions_model.cpp:9
+
+
12 1 1------------
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +Orientation [CV]
+pass by value   +./ui/models/sessions_model.cpp:68
+
+
+QObject [V]
+pass by reference   +./ui/models/sessions_model.cpp:6
+
+
+QSqlDatabase [V]
+pass by reference   +./ui/models/sessions_model.cpp:6
+
+
+QString [V]
+pass by reference   +./ui/models/sessions_model.cpp:26
+pass by reference   +./ui/models/sessions_model.cpp:27
+pass by reference   +./ui/models/sessions_model.cpp:47
+pass by reference   +./ui/models/sessions_model.cpp:48
+pass by reference   +./ui/models/sessions_model.cpp:89
+
+
+  +
+ diff --git a/artifacts/cccc/SessionsModel.xml b/artifacts/cccc/SessionsModel.xml new file mode 100644 index 0000000..3f0f388 --- /dev/null +++ b/artifacts/cccc/SessionsModel.xml @@ -0,0 +1,154 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +SessionsModel(QObject *,const QSqlDatabase &) + +definition + + + + + + + + + +buildHallIdFilterCondition(const QString &,QString &) + +definition + + + + + + + + + +buildMovieIdFilterCondition(const QString &,QString &) + +definition + + + + + + + + + +createMultiColumnFilter(const QString &) + +definition + + + + + + + + + +headerData(int,Orientation,int) + +definition + + + + + + + + + +initialize() + +definition + + + + + + + + + + + +SessionsModel + + + +Orientation +true +true + +pass by value + + +QObject +true +false + +pass by reference + + +QSqlDatabase +true +false + +pass by reference + + +QString +true +false + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + + + + diff --git a/artifacts/cccc/SessionsRepository.html b/artifacts/cccc/SessionsRepository.html new file mode 100644 index 0000000..2305e2d --- /dev/null +++ b/artifacts/cccc/SessionsRepository.html @@ -0,0 +1,141 @@ + +Detailed report on module SessionsRepository + + + +

Detailed report on module SessionsRepository

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 81 12
McCabe's Cyclomatic NumberMVG 19 3
Lines of CommentCOM 0 0.000
LOC/COML_C****** 
MVG/COMM_C****** 
Weighted Methods per Class (  weighting = unity )WMC1 7 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 8 
Information Flow measure (  inclusive )IF4 0 0.000
Information Flow measure (  visible )IF4v 0 0.000
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + + + + + + + + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
SessionsRepository(  QSqlDatabase &,  QObject * )
+definition   +./data/sql/sessions_repository.cpp:10
+
+
2 0 0------------
createSession(  const CreateSessionRequest & )
+definition   +./data/sql/sessions_repository.cpp:14
+
+
15 3 0------------
deleteSessionById(  qint32 )
+definition   +./data/sql/sessions_repository.cpp:90
+
+
10 3 0------------
getAllSessions(  QVector & )
+definition   +./data/sql/sessions_repository.cpp:53
+
+
13 4 0------------
getSessionById(  qint32,  SessionDTO & )
+definition   +./data/sql/sessions_repository.cpp:32
+
+
16 5 0------******
mapQueryToDTO(  const QSqlQuery & )
+definition   +./data/sql/sessions_repository.cpp:103
+
+
9 1 0------------
updateSession(  const UpdateSessionRequest & )
+definition   +./data/sql/sessions_repository.cpp:71
+
+
16 3 0------------
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +CreateSessionRequest [V]
+pass by reference   +./data/sql/sessions_repository.cpp:14
+
+
+QObject [V]
+pass by reference   +./data/sql/sessions_repository.cpp:10
+
+
+QSqlDatabase [V]
+pass by reference   +./data/sql/sessions_repository.cpp:10
+
+
+QSqlQuery [V]
+pass by reference   +./data/sql/sessions_repository.cpp:103
+
+
+QVector [V]
+pass by reference   +./data/sql/sessions_repository.cpp:53
+
+
+SessionDTO [V]
+pass by reference   +./data/sql/sessions_repository.cpp:33
+
+
+UpdateSessionRequest [V]
+pass by reference   +./data/sql/sessions_repository.cpp:71
+
+
+qint32 [CV]
+pass by value   +./data/sql/sessions_repository.cpp:32
+pass by value   +./data/sql/sessions_repository.cpp:90
+
+
+  +
+ diff --git a/artifacts/cccc/SessionsRepository.xml b/artifacts/cccc/SessionsRepository.xml new file mode 100644 index 0000000..8df1ec9 --- /dev/null +++ b/artifacts/cccc/SessionsRepository.xml @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +SessionsRepository(QSqlDatabase &,QObject *) + +definition + + + + + + + + + +createSession(const CreateSessionRequest &) + +definition + + + + + + + + + +deleteSessionById(qint32) + +definition + + + + + + + + + +getAllSessions(QVector &) + +definition + + + + + + + + + +getSessionById(qint32,SessionDTO &) + +definition + + + + + + + + + +mapQueryToDTO(const QSqlQuery &) + +definition + + + + + + + + + +updateSession(const UpdateSessionRequest &) + +definition + + + + + + + + + + + +SessionsRepository + + + +CreateSessionRequest +true +false + +pass by reference + + +QObject +true +false + +pass by reference + + +QSqlDatabase +true +false + +pass by reference + + +QSqlQuery +true +false + +pass by reference + + +QVector +true +false + +pass by reference + + +SessionDTO +true +false + +pass by reference + + +UpdateSessionRequest +true +false + +pass by reference + + +qint32 +true +true + +pass by value + + + +pass by value + + + + + + diff --git a/artifacts/cccc/SessionsRepositoryInterface.html b/artifacts/cccc/SessionsRepositoryInterface.html new file mode 100644 index 0000000..f89d87a --- /dev/null +++ b/artifacts/cccc/SessionsRepositoryInterface.html @@ -0,0 +1,153 @@ + +Detailed report on module SessionsRepositoryInterface + + + +

Detailed report on module SessionsRepositoryInterface

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 15 3
McCabe's Cyclomatic NumberMVG 0 0
Lines of CommentCOM 7 1.400
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 5 
Weighted Methods per Class (  weighting = visible )WMCv 5 
Depth of Inheritance TreeDIT 1 
Number of ChildrenNOC 1 
Coupling between objectsCBO 9 
Information Flow measure (  inclusive )IF4 324 64.800
Information Flow measure (  visible )IF4v 36 7.200
Information Flow measure (  concrete )IF4c 4 0.800
+

Definitions and Declarations

+ + + + + + + + + + + + + + +
DescriptionLOCMVGCOML_CM_C
declaration   +./core/services/ticket_generator.h:14
+
1 0 0------------
declaration   +./core/services/session_generator.h:13
+
1 0 1------------
definition   +./core/repositories/sessions_repository_interface.h:15
+
6 0 4------------
declaration   +./ui/widgets/session_management_widget.h:9
+
1 0 0------------
+

Functions

+ + + + + + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
createSession(  const CreateSessionRequest & )
+declaration   +./core/repositories/sessions_repository_interface.h:19
+
+
1 0 0------------
deleteSessionById(  qint32 )
+declaration   +./core/repositories/sessions_repository_interface.h:34
+
+
1 0 1------------
getAllSessions(  QVector & )
+declaration   +./core/repositories/sessions_repository_interface.h:27
+
+
1 0 0------------
getSessionById(  qint32,  SessionDTO & )
+declaration   +./core/repositories/sessions_repository_interface.h:22
+
+
2 0 1------------
updateSession(  const UpdateSessionRequest & )
+declaration   +./core/repositories/sessions_repository_interface.h:31
+
+
1 0 0------------
+

Relationships

+ + + + + +
ClientsSuppliers
+SessionGenerator
+has by reference   +./core/services/session_generator.h:38
+
+
+SessionsRepository [CV]
+inheritance   +./data/sql/sessions_repository.h:9
+
+
+TicketGenerator
+has by reference   +./core/services/ticket_generator.h:39
+
+
+  +
+CreateSessionRequest [V]
+pass by reference   +./core/repositories/sessions_repository_interface.h:19
+
+
+QVector [V]
+pass by reference   +./core/repositories/sessions_repository_interface.h:27
+
+
+RepositoryInterface [CV]
+inheritance   +./core/repositories/sessions_repository_interface.h:15
+
+
+SessionDTO [V]
+pass by reference   +./core/repositories/sessions_repository_interface.h:23
+
+
+UpdateSessionRequest [V]
+pass by reference   +./core/repositories/sessions_repository_interface.h:31
+
+
+qint32 [CV]
+pass by value   +./core/repositories/sessions_repository_interface.h:22
+pass by value   +./core/repositories/sessions_repository_interface.h:34
+
+
+  +
+ diff --git a/artifacts/cccc/SessionsRepositoryInterface.xml b/artifacts/cccc/SessionsRepositoryInterface.xml new file mode 100644 index 0000000..5b5daa4 --- /dev/null +++ b/artifacts/cccc/SessionsRepositoryInterface.xml @@ -0,0 +1,193 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +declaration + + + + + + +declaration + + + + + + +definition + + + + + + +declaration + + + + + + + + + +createSession(const CreateSessionRequest &) + +declaration + + + + + + + + + +deleteSessionById(qint32) + +declaration + + + + + + + + + +getAllSessions(QVector &) + +declaration + + + + + + + + + +getSessionById(qint32,SessionDTO &) + +declaration + + + + + + + + + +updateSession(const UpdateSessionRequest &) + +declaration + + + + + + + + + + + +SessionsRepositoryInterface + +SessionGenerator +false +false + +has by reference + + +SessionsRepository +true +true + +inheritance + + +TicketGenerator +false +false + +has by reference + + + + +CreateSessionRequest +true +false + +pass by reference + + +QVector +true +false + +pass by reference + + +RepositoryInterface +true +true + +inheritance + + +SessionDTO +true +false + +pass by reference + + +UpdateSessionRequest +true +false + +pass by reference + + +qint32 +true +true + +pass by value + + + +pass by value + + + + + + diff --git a/artifacts/cccc/SessionsStatisticsRepository.html b/artifacts/cccc/SessionsStatisticsRepository.html new file mode 100644 index 0000000..56bae1f --- /dev/null +++ b/artifacts/cccc/SessionsStatisticsRepository.html @@ -0,0 +1,193 @@ + +Detailed report on module SessionsStatisticsRepository + + + +

Detailed report on module SessionsStatisticsRepository

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 123 12
McCabe's Cyclomatic NumberMVG 23 2
Lines of CommentCOM 2 0.200
LOC/COML_C61.500 
MVG/COMM_C11.500 
Weighted Methods per Class (  weighting = unity )WMC1 10 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 8 
Information Flow measure (  inclusive )IF4 0 0.000
Information Flow measure (  visible )IF4v 0 0.000
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + + + + + + + + + + + + + + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
SessionsStatisticsRepository(  QSqlDatabase &,  QObject * )
+definition   +./data/sql/sessions_statistics_repository.cpp:11
+
+
3 0 0------------
bindDateFilters(  QString &,  const optional &,  const optional & )
+definition   +./data/sql/sessions_statistics_repository.cpp:148
+
+
11 4 0------------
bindDateValues(  QSqlQuery &,  const optional &,  const optional & )
+definition   +./data/sql/sessions_statistics_repository.cpp:160
+
+
10 2 0------------
executeAndMapQuery(  QSqlQuery &,  QVector & )
+definition   +./data/sql/sessions_statistics_repository.cpp:40
+
+
13 4 0------------
getAllSessions(  QVector & )
+definition   +./data/sql/sessions_statistics_repository.cpp:77
+
+
13 4 0------------
getSessionById(  qint32,  SessionStatisticsDTO & )
+definition   +./data/sql/sessions_statistics_repository.cpp:58
+
+
15 5 0------******
getSessionsForGenre(  qint32,  optional,  optional,  QVector & )
+definition   +./data/sql/sessions_statistics_repository.cpp:130
+
+
13 1 0------------
getSessionsForHall(  qint32,  optional,  optional,  QVector & )
+definition   +./data/sql/sessions_statistics_repository.cpp:94
+
+
13 1 0------------
getSessionsForMovie(  qint32,  optional,  optional,  QVector & )
+definition   +./data/sql/sessions_statistics_repository.cpp:112
+
+
13 1 0------------
mapQueryToDTO(  const QSqlQuery & )
+definition   +./data/sql/sessions_statistics_repository.cpp:16
+
+
19 1 2------------
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +QObject [V]
+pass by reference   +./data/sql/sessions_statistics_repository.cpp:12
+
+
+QSqlDatabase [V]
+pass by reference   +./data/sql/sessions_statistics_repository.cpp:12
+
+
+QSqlQuery [V]
+pass by reference   +./data/sql/sessions_statistics_repository.cpp:16
+pass by reference   +./data/sql/sessions_statistics_repository.cpp:41
+pass by reference   +./data/sql/sessions_statistics_repository.cpp:161
+
+
+QString [V]
+pass by reference   +./data/sql/sessions_statistics_repository.cpp:149
+
+
+QVector [V]
+pass by reference   +./data/sql/sessions_statistics_repository.cpp:41
+pass by reference   +./data/sql/sessions_statistics_repository.cpp:78
+pass by reference   +./data/sql/sessions_statistics_repository.cpp:97
+pass by reference   +./data/sql/sessions_statistics_repository.cpp:115
+pass by reference   +./data/sql/sessions_statistics_repository.cpp:133
+
+
+SessionStatisticsDTO [V]
+pass by reference   +./data/sql/sessions_statistics_repository.cpp:59
+
+
+optional [CV]
+pass by value   +./data/sql/sessions_statistics_repository.cpp:95
+pass by value   +./data/sql/sessions_statistics_repository.cpp:96
+pass by value   +./data/sql/sessions_statistics_repository.cpp:113
+pass by value   +./data/sql/sessions_statistics_repository.cpp:114
+pass by value   +./data/sql/sessions_statistics_repository.cpp:131
+pass by value   +./data/sql/sessions_statistics_repository.cpp:132
+pass by reference   +./data/sql/sessions_statistics_repository.cpp:149
+pass by reference   +./data/sql/sessions_statistics_repository.cpp:150
+pass by reference   +./data/sql/sessions_statistics_repository.cpp:161
+pass by reference   +./data/sql/sessions_statistics_repository.cpp:162
+
+
+qint32 [CV]
+pass by value   +./data/sql/sessions_statistics_repository.cpp:59
+pass by value   +./data/sql/sessions_statistics_repository.cpp:95
+pass by value   +./data/sql/sessions_statistics_repository.cpp:113
+pass by value   +./data/sql/sessions_statistics_repository.cpp:131
+
+
+  +
+ diff --git a/artifacts/cccc/SessionsStatisticsRepository.xml b/artifacts/cccc/SessionsStatisticsRepository.xml new file mode 100644 index 0000000..65749fe --- /dev/null +++ b/artifacts/cccc/SessionsStatisticsRepository.xml @@ -0,0 +1,286 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +SessionsStatisticsRepository(QSqlDatabase &,QObject *) + +definition + + + + + + + + + +bindDateFilters(QString &,const optional &,const optional &) + +definition + + + + + + + + + +bindDateValues(QSqlQuery &,const optional &,const optional &) + +definition + + + + + + + + + +executeAndMapQuery(QSqlQuery &,QVector &) + +definition + + + + + + + + + +getAllSessions(QVector &) + +definition + + + + + + + + + +getSessionById(qint32,SessionStatisticsDTO &) + +definition + + + + + + + + + +getSessionsForGenre(qint32,optional,optional,QVector &) + +definition + + + + + + + + + +getSessionsForHall(qint32,optional,optional,QVector &) + +definition + + + + + + + + + +getSessionsForMovie(qint32,optional,optional,QVector &) + +definition + + + + + + + + + +mapQueryToDTO(const QSqlQuery &) + +definition + + + + + + + + + + + +SessionsStatisticsRepository + + + +QObject +true +false + +pass by reference + + +QSqlDatabase +true +false + +pass by reference + + +QSqlQuery +true +false + +pass by reference + + + +pass by reference + + + +pass by reference + + +QString +true +false + +pass by reference + + +QVector +true +false + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + +SessionStatisticsDTO +true +false + +pass by reference + + +optional +true +true + +pass by value + + + +pass by value + + + +pass by value + + + +pass by value + + + +pass by value + + + +pass by value + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + +qint32 +true +true + +pass by value + + + +pass by value + + + +pass by value + + + +pass by value + + + + + + diff --git a/artifacts/cccc/SessionsStatisticsRepositoryInterface.html b/artifacts/cccc/SessionsStatisticsRepositoryInterface.html new file mode 100644 index 0000000..6df79dd --- /dev/null +++ b/artifacts/cccc/SessionsStatisticsRepositoryInterface.html @@ -0,0 +1,72 @@ + +Detailed report on module SessionsStatisticsRepositoryInterface + + + +

Detailed report on module SessionsStatisticsRepositoryInterface

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 20******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C****** 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 1 
Number of ChildrenNOC 1 
Coupling between objectsCBO 2 
Information Flow measure (  inclusive )IF4 1********
Information Flow measure (  visible )IF4v 1********
Information Flow measure (  concrete )IF4c 1********
+

Definitions and Declarations

+ + + + + +
DescriptionLOCMVGCOML_CM_C
definition   +./core/repositories/sessions_statistics_repository_interface.h:12
+
20 0 0******------
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+SessionsStatisticsRepository [CV]
+inheritance   +./data/sql/sessions_statistics_repository.h:11
+
+
+  +
+RepositoryInterface [CV]
+inheritance   +./core/repositories/sessions_statistics_repository_interface.h:12
+
+
+  +
+ diff --git a/artifacts/cccc/SessionsStatisticsRepositoryInterface.xml b/artifacts/cccc/SessionsStatisticsRepositoryInterface.xml new file mode 100644 index 0000000..08a2cc5 --- /dev/null +++ b/artifacts/cccc/SessionsStatisticsRepositoryInterface.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +definition + + + + + + + + + + + +SessionsStatisticsRepositoryInterface + +SessionsStatisticsRepository +true +true + +inheritance + + + + +RepositoryInterface +true +true + +inheritance + + + + + + diff --git a/artifacts/cccc/SignalType.html b/artifacts/cccc/SignalType.html new file mode 100644 index 0000000..d099055 --- /dev/null +++ b/artifacts/cccc/SignalType.html @@ -0,0 +1,63 @@ + +Detailed report on module SignalType + + + +

Detailed report on module SignalType

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+ApplicationConnector [CV]
+pass by value   +./core/controllers/application_connector.h:185
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/SignalType.xml b/artifacts/cccc/SignalType.xml new file mode 100644 index 0000000..863dab5 --- /dev/null +++ b/artifacts/cccc/SignalType.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +SignalType + +ApplicationConnector +true +true + +pass by value + + + + + + + + diff --git a/artifacts/cccc/SingleRecordTimeRangeWidget.html b/artifacts/cccc/SingleRecordTimeRangeWidget.html new file mode 100644 index 0000000..0530ace --- /dev/null +++ b/artifacts/cccc/SingleRecordTimeRangeWidget.html @@ -0,0 +1,68 @@ + +Detailed report on module SingleRecordTimeRangeWidget + + + +

Detailed report on module SingleRecordTimeRangeWidget

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 4 4
McCabe's Cyclomatic NumberMVG 0 0
Lines of CommentCOM 0 0.000
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 1 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0 0.000
Information Flow measure (  visible )IF4v 0 0.000
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + + +
Function prototypeLOCMVGCOML_CM_C
SingleRecordTimeRangeWidget(  QWidget * )
+definition   +./ui/widgets/single_record_time_range_widget.cpp:3
+
+
4 0 0------------
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +QWidget [V]
+pass by reference   +./ui/widgets/single_record_time_range_widget.cpp:3
+
+
+  +
+ diff --git a/artifacts/cccc/SingleRecordTimeRangeWidget.xml b/artifacts/cccc/SingleRecordTimeRangeWidget.xml new file mode 100644 index 0000000..49ffd2d --- /dev/null +++ b/artifacts/cccc/SingleRecordTimeRangeWidget.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +SingleRecordTimeRangeWidget(QWidget *) + +definition + + + + + + + + + + + +SingleRecordTimeRangeWidget + + + +QWidget +true +false + +pass by reference + + + + + + diff --git a/artifacts/cccc/SlotType.html b/artifacts/cccc/SlotType.html new file mode 100644 index 0000000..b1546c6 --- /dev/null +++ b/artifacts/cccc/SlotType.html @@ -0,0 +1,63 @@ + +Detailed report on module SlotType + + + +

Detailed report on module SlotType

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+ApplicationConnector [CV]
+pass by value   +./core/controllers/application_connector.h:185
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/SlotType.xml b/artifacts/cccc/SlotType.xml new file mode 100644 index 0000000..5ae49f0 --- /dev/null +++ b/artifacts/cccc/SlotType.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +SlotType + +ApplicationConnector +true +true + +pass by value + + + + + + + + diff --git a/artifacts/cccc/StartTimeMode.html b/artifacts/cccc/StartTimeMode.html new file mode 100644 index 0000000..8fa2558 --- /dev/null +++ b/artifacts/cccc/StartTimeMode.html @@ -0,0 +1,62 @@ + +Detailed report on module StartTimeMode + + + +

Detailed report on module StartTimeMode

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 1******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 0 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + + + +
DescriptionLOCMVGCOML_CM_C
definition   +./core/utils/day_manager.h:9
+
1 0 0------------
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +  +
+ diff --git a/artifacts/cccc/StartTimeMode.xml b/artifacts/cccc/StartTimeMode.xml new file mode 100644 index 0000000..8533191 --- /dev/null +++ b/artifacts/cccc/StartTimeMode.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +definition + + + + + + + + + + + +StartTimeMode + + + + + + + diff --git a/artifacts/cccc/T.html b/artifacts/cccc/T.html new file mode 100644 index 0000000..77889d5 --- /dev/null +++ b/artifacts/cccc/T.html @@ -0,0 +1,68 @@ + +Detailed report on module T + + + +

Detailed report on module T

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 2 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+ModelManager [V]
+pass by reference   +./core/services/model_manager.h:61
+
+
+RangeLimiter [CV]
+pass by value   +./core/services/range_limiter.h:20
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/T.xml b/artifacts/cccc/T.xml new file mode 100644 index 0000000..f90d8fa --- /dev/null +++ b/artifacts/cccc/T.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +T + +ModelManager +true +false + +pass by reference + + +RangeLimiter +true +true + +pass by value + + + + + + + + diff --git a/artifacts/cccc/TableInfo.html b/artifacts/cccc/TableInfo.html new file mode 100644 index 0000000..d714995 --- /dev/null +++ b/artifacts/cccc/TableInfo.html @@ -0,0 +1,62 @@ + +Detailed report on module TableInfo + + + +

Detailed report on module TableInfo

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 1******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 0 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + + + +
DescriptionLOCMVGCOML_CM_C
declaration   +./ui/widgets/entity_updater_widget.h:12
+
1 0 0------------
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +  +
+ diff --git a/artifacts/cccc/TableInfo.xml b/artifacts/cccc/TableInfo.xml new file mode 100644 index 0000000..94b4948 --- /dev/null +++ b/artifacts/cccc/TableInfo.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +declaration + + + + + + + + + + + +TableInfo + + + + + + + diff --git a/artifacts/cccc/TableInfoInterface.html b/artifacts/cccc/TableInfoInterface.html new file mode 100644 index 0000000..553618c --- /dev/null +++ b/artifacts/cccc/TableInfoInterface.html @@ -0,0 +1,72 @@ + +Detailed report on module TableInfoInterface + + + +

Detailed report on module TableInfoInterface

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 12 12
McCabe's Cyclomatic NumberMVG 0 0
Lines of CommentCOM 0 0.000
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 1 
Weighted Methods per Class (  weighting = visible )WMCv 1 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 1 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0 0.000
Information Flow measure (  visible )IF4v 0 0.000
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + + + +
DescriptionLOCMVGCOML_CM_C
definition   +./core/db/table_info_interface.h:7
+
11 0 0------------
+

Functions

+ + + + +
Function prototypeLOCMVGCOML_CM_C
~TableInfoInterface(   )
+definition   +./core/db/table_info_interface.h:9
+
+
1 0 0------------
+

Relationships

+ + + + + +
ClientsSuppliers
+TableInfoSQLite [CV]
+inheritance   +./data/sql/table_info_sqlite.h:12
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/TableInfoInterface.xml b/artifacts/cccc/TableInfoInterface.xml new file mode 100644 index 0000000..7b50751 --- /dev/null +++ b/artifacts/cccc/TableInfoInterface.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +definition + + + + + + + + + +~TableInfoInterface() + +definition + + + + + + + + + + + +TableInfoInterface + +TableInfoSQLite +true +true + +inheritance + + + + + + + + diff --git a/artifacts/cccc/TableInfoSQLite.html b/artifacts/cccc/TableInfoSQLite.html new file mode 100644 index 0000000..8b091ad --- /dev/null +++ b/artifacts/cccc/TableInfoSQLite.html @@ -0,0 +1,127 @@ + +Detailed report on module TableInfoSQLite + + + +

Detailed report on module TableInfoSQLite

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 31 3
McCabe's Cyclomatic NumberMVG 6 1
Lines of CommentCOM 0 0.000
LOC/COML_C****** 
MVG/COMM_C****** 
Weighted Methods per Class (  weighting = unity )WMC1 9 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 2 
Information Flow measure (  inclusive )IF4 0 0.000
Information Flow measure (  visible )IF4v 0 0.000
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + + + + + + + + + + + + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
TableInfoSQLite(   )
+definition   +./data/sql/table_info_sqlite.cpp:7
+
+
1 0 0------------
TableInfoSQLite(  const QString & )
+definition   +./data/sql/table_info_sqlite.cpp:9
+
+
4 0 0------------
columnIndex(  const QString & )
+definition   +./data/sql/table_info_sqlite.cpp:98
+
+
0 0 0------------
columnName(  qint32 )
+definition   +./data/sql/table_info_sqlite.cpp:102
+
+
0 0 0------------
columnNames(   )
+definition   +./data/sql/table_info_sqlite.cpp:86
+
+
0 0 0------------
databaseTableName(   )
+declaration   +./data/sql/table_info_sqlite.cpp:49
+
+
0 0 0------------
foreignKeyTable(  const QString & )
+definition   +./data/sql/table_info_sqlite.cpp:54
+
+
0 0 0------------
isPrimaryKey(  const QString & )
+definition   +./data/sql/table_info_sqlite.cpp:90
+
+
0 0 0------------
loadColumnInfo(   )
+definition   +./data/sql/table_info_sqlite.cpp:14
+
+
26 6 0************
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +QString [V]
+pass by reference   +./data/sql/table_info_sqlite.cpp:9
+pass by reference   +./data/sql/table_info_sqlite.cpp:54
+pass by reference   +./data/sql/table_info_sqlite.cpp:90
+pass by reference   +./data/sql/table_info_sqlite.cpp:98
+
+
+qint32 [CV]
+pass by value   +./data/sql/table_info_sqlite.cpp:102
+
+
+  +
+ diff --git a/artifacts/cccc/TableInfoSQLite.xml b/artifacts/cccc/TableInfoSQLite.xml new file mode 100644 index 0000000..0a577b3 --- /dev/null +++ b/artifacts/cccc/TableInfoSQLite.xml @@ -0,0 +1,172 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TableInfoSQLite() + +definition + + + + + + + + + +TableInfoSQLite(const QString &) + +definition + + + + + + + + + +columnIndex(const QString &) + +definition + + + + + + + + + +columnName(qint32) + +definition + + + + + + + + + +columnNames() + +definition + + + + + + + + + +databaseTableName() + +declaration + + + + + + + + + +foreignKeyTable(const QString &) + +definition + + + + + + + + + +isPrimaryKey(const QString &) + +definition + + + + + + + + + +loadColumnInfo() + +definition + + + + + + + + + + + +TableInfoSQLite + + + +QString +true +false + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + +qint32 +true +true + +pass by value + + + + + + diff --git a/artifacts/cccc/Test.html b/artifacts/cccc/Test.html new file mode 100644 index 0000000..641849b --- /dev/null +++ b/artifacts/cccc/Test.html @@ -0,0 +1,73 @@ + +Detailed report on module Test + + + +

Detailed report on module Test

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 3 
Coupling between objectsCBO 3 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+SQLiteDatabaseCRUDTest [CV]
+inheritance   +./tests_schema/tests/sqlite_database_crud_test.cpp:11
+
+
+SQLiteDatabaseForeignKeyTest [CV]
+inheritance   +./tests_schema/tests/sqlite_database_foreign_key_test.cpp:10
+
+
+SQLiteDatabaseTriggerTest [CV]
+inheritance   +./tests_schema/tests/sqlite_database_trigger_test.cpp:10
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/Test.xml b/artifacts/cccc/Test.xml new file mode 100644 index 0000000..53a18ed --- /dev/null +++ b/artifacts/cccc/Test.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Test + +SQLiteDatabaseCRUDTest +true +true + +inheritance + + +SQLiteDatabaseForeignKeyTest +true +true + +inheritance + + +SQLiteDatabaseTriggerTest +true +true + +inheritance + + + + + + + + diff --git a/artifacts/cccc/Ticket.html b/artifacts/cccc/Ticket.html new file mode 100644 index 0000000..428f9a0 --- /dev/null +++ b/artifacts/cccc/Ticket.html @@ -0,0 +1,63 @@ + +Detailed report on module Ticket + + + +

Detailed report on module Ticket

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+SQLiteDatabase [V]
+pass by reference   +./tests_schema/tests_sources/sqlite_database.cpp:376
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/Ticket.xml b/artifacts/cccc/Ticket.xml new file mode 100644 index 0000000..dcfe1c8 --- /dev/null +++ b/artifacts/cccc/Ticket.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Ticket + +SQLiteDatabase +true +false + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/TicketDTO.html b/artifacts/cccc/TicketDTO.html new file mode 100644 index 0000000..cd8d6a2 --- /dev/null +++ b/artifacts/cccc/TicketDTO.html @@ -0,0 +1,63 @@ + +Detailed report on module TicketDTO + + + +

Detailed report on module TicketDTO

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+TicketsRepository [V]
+pass by reference   +./data/sql/tickets_repository.cpp:31
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/TicketDTO.xml b/artifacts/cccc/TicketDTO.xml new file mode 100644 index 0000000..9be4eaa --- /dev/null +++ b/artifacts/cccc/TicketDTO.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TicketDTO + +TicketsRepository +true +false + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/TicketGenerator.html b/artifacts/cccc/TicketGenerator.html new file mode 100644 index 0000000..1cdb84c --- /dev/null +++ b/artifacts/cccc/TicketGenerator.html @@ -0,0 +1,157 @@ + +Detailed report on module TicketGenerator + + + +

Detailed report on module TicketGenerator

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 160 11
McCabe's Cyclomatic NumberMVG 24 2
Lines of CommentCOM 7 0.500
LOC/COML_C22.857 
MVG/COMM_C 3.429 
Weighted Methods per Class (  weighting = unity )WMC1 14 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 2 
Information Flow measure (  inclusive )IF4 0 0.000
Information Flow measure (  visible )IF4v 0 0.000
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
TicketGenerator(  const QPair &,  const QPair &,  const QPair & )
+definition   +./core/services/ticket_generator.cpp:21
+
+
13 1 3------------
calculateRemainingCapacity(   )
+definition   +./core/services/ticket_generator.cpp:154
+
+
3 1 0------------
clearStaleData(   )
+definition   +./core/services/ticket_generator.cpp:205
+
+
13 1 0------------
createFailureMessage(  const QString & )
+definition   +./core/services/ticket_generator.cpp:136
+
+
11 1 0------------
createRecord(   )
+definition   +./core/services/ticket_generator.cpp:158
+
+
11 2 0------------
createSuccessMessage(   )
+definition   +./core/services/ticket_generator.cpp:148
+
+
5 1 0------------
generateFillRatioPerSession(   )
+definition   +./core/services/ticket_generator.cpp:120
+
+
5 1 0------------
generator_(  ... )
+declaration   +./core/services/ticket_generator.cpp:19
+
+
1 0 0------------
initializeRemainingCapacity(   )
+definition   +./core/services/ticket_generator.cpp:126
+
+
8 1 0------------
initializeRepositories(   )
+definition   +./core/services/ticket_generator.cpp:37
+
+
13 2 0------------
initializeSessionIdToAvailableSeatMap(   )
+definition   +./core/services/ticket_generator.cpp:53
+
+
31 5 215.500 2.500
initializeSessionIdToBeginAtMap(   )
+definition   +./core/services/ticket_generator.cpp:92
+
+
11 2 0------------
prepareData(   )
+definition   +./core/services/ticket_generator.cpp:173
+
+
23 3 211.500------
setFillRatioPerSessionRange(  const QPair & )
+definition   +./core/services/ticket_generator.cpp:105
+
+
12 3 0------------
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +QPair [V]
+pass by reference   +./core/services/ticket_generator.cpp:22
+pass by reference   +./core/services/ticket_generator.cpp:22
+pass by reference   +./core/services/ticket_generator.cpp:23
+pass by reference   +./core/services/ticket_generator.cpp:106
+
+
+QString [V]
+pass by reference   +./core/services/ticket_generator.cpp:136
+
+
+  +
+ diff --git a/artifacts/cccc/TicketGenerator.xml b/artifacts/cccc/TicketGenerator.xml new file mode 100644 index 0000000..18d59b1 --- /dev/null +++ b/artifacts/cccc/TicketGenerator.xml @@ -0,0 +1,232 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TicketGenerator(const QPair &,const QPair &,const QPair &) + +definition + + + + + + + + + +calculateRemainingCapacity() + +definition + + + + + + + + + +clearStaleData() + +definition + + + + + + + + + +createFailureMessage(const QString &) + +definition + + + + + + + + + +createRecord() + +definition + + + + + + + + + +createSuccessMessage() + +definition + + + + + + + + + +generateFillRatioPerSession() + +definition + + + + + + + + + +generator_(...) + +declaration + + + + + + + + + +initializeRemainingCapacity() + +definition + + + + + + + + + +initializeRepositories() + +definition + + + + + + + + + +initializeSessionIdToAvailableSeatMap() + +definition + + + + + + + + + +initializeSessionIdToBeginAtMap() + +definition + + + + + + + + + +prepareData() + +definition + + + + + + + + + +setFillRatioPerSessionRange(const QPair &) + +definition + + + + + + + + + + + +TicketGenerator + + + +QPair +true +false + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + +QString +true +false + +pass by reference + + + + + + diff --git a/artifacts/cccc/TicketReturnWidget.html b/artifacts/cccc/TicketReturnWidget.html new file mode 100644 index 0000000..236d829 --- /dev/null +++ b/artifacts/cccc/TicketReturnWidget.html @@ -0,0 +1,115 @@ + +Detailed report on module TicketReturnWidget + + + +

Detailed report on module TicketReturnWidget

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 76 9
McCabe's Cyclomatic NumberMVG 7 1
Lines of CommentCOM 2 0.250
LOC/COML_C38.000 
MVG/COMM_C 3.500 
Weighted Methods per Class (  weighting = unity )WMC1 8 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 2 
Information Flow measure (  inclusive )IF4 0 0.000
Information Flow measure (  visible )IF4v 0 0.000
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + + + + + + + + + + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
TicketReturnWidget(  QWidget * )
+definition   +./ui/widgets/ticket_return_widget.cpp:13
+
+
9 0 1------------
initializeModels(   )
+definition   +./ui/widgets/ticket_return_widget.cpp:49
+
+
10 1 0------------
initializeRepositories(   )
+definition   +./ui/widgets/ticket_return_widget.cpp:36
+
+
10 1 0------------
onPushButtonRefundTicketClicked(   )
+definition   +./ui/widgets/ticket_return_widget.cpp:70
+
+
29 5 0************
onTicketFieldRetrieved(  const QSqlField & )
+definition   +./ui/widgets/ticket_return_widget.cpp:107
+
+
3 0 0------------
setupConnections(   )
+definition   +./ui/widgets/ticket_return_widget.cpp:62
+
+
6 0 0------------
setupTableView(   )
+definition   +./ui/widgets/ticket_return_widget.cpp:25
+
+
3 0 1------------
setupTicketFinder(   )
+definition   +./ui/widgets/ticket_return_widget.cpp:29
+
+
6 0 0------------
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +QSqlField [V]
+pass by reference   +./ui/widgets/ticket_return_widget.cpp:107
+
+
+QWidget [V]
+pass by reference   +./ui/widgets/ticket_return_widget.cpp:13
+
+
+  +
+ diff --git a/artifacts/cccc/TicketReturnWidget.xml b/artifacts/cccc/TicketReturnWidget.xml new file mode 100644 index 0000000..b780c5a --- /dev/null +++ b/artifacts/cccc/TicketReturnWidget.xml @@ -0,0 +1,148 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TicketReturnWidget(QWidget *) + +definition + + + + + + + + + +initializeModels() + +definition + + + + + + + + + +initializeRepositories() + +definition + + + + + + + + + +onPushButtonRefundTicketClicked() + +definition + + + + + + + + + +onTicketFieldRetrieved(const QSqlField &) + +definition + + + + + + + + + +setupConnections() + +definition + + + + + + + + + +setupTableView() + +definition + + + + + + + + + +setupTicketFinder() + +definition + + + + + + + + + + + +TicketReturnWidget + + + +QSqlField +true +false + +pass by reference + + +QWidget +true +false + +pass by reference + + + + + + diff --git a/artifacts/cccc/TicketSaleWidget.html b/artifacts/cccc/TicketSaleWidget.html new file mode 100644 index 0000000..185e47e --- /dev/null +++ b/artifacts/cccc/TicketSaleWidget.html @@ -0,0 +1,126 @@ + +Detailed report on module TicketSaleWidget + + + +

Detailed report on module TicketSaleWidget

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 76 8
McCabe's Cyclomatic NumberMVG 10 1
Lines of CommentCOM 4 0.444
LOC/COML_C19.000 
MVG/COMM_C 2.500 
Weighted Methods per Class (  weighting = unity )WMC1 9 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 3 
Information Flow measure (  inclusive )IF4 0 0.000
Information Flow measure (  visible )IF4v 0 0.000
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + + + + + + + + + + + + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
TicketSaleWidget(  QWidget * )
+definition   +./ui/widgets/ticket_sale_widget.cpp:15
+
+
9 0 3------------
initializeModels(   )
+definition   +./ui/widgets/ticket_sale_widget.cpp:43
+
+
10 1 0------------
initializeRepositories(   )
+definition   +./ui/widgets/ticket_sale_widget.cpp:30
+
+
10 1 0------------
onFieldRetrieved(  const QSqlField & )
+definition   +./ui/widgets/ticket_sale_widget.cpp:97
+
+
3 0 0------------
onPushButtonSellTicketClicked(   )
+definition   +./ui/widgets/ticket_sale_widget.cpp:71
+
+
21 5 0************
setupConnections(   )
+definition   +./ui/widgets/ticket_sale_widget.cpp:56
+
+
6 0 0------------
setupSessionFinder(   )
+definition   +./ui/widgets/ticket_sale_widget.cpp:64
+
+
6 0 0------------
setupTableView(   )
+definition   +./ui/widgets/ticket_sale_widget.cpp:26
+
+
3 0 0------------
validateSessionValues(  const initializer_list & )
+definition   +./ui/widgets/ticket_sale_widget.cpp:102
+
+
8 3 1------------
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +QSqlField [V]
+pass by reference   +./ui/widgets/ticket_sale_widget.cpp:97
+
+
+QWidget [V]
+pass by reference   +./ui/widgets/ticket_sale_widget.cpp:15
+
+
+initializer_list [V]
+pass by reference   +./ui/widgets/ticket_sale_widget.cpp:103
+
+
+  +
+ diff --git a/artifacts/cccc/TicketSaleWidget.xml b/artifacts/cccc/TicketSaleWidget.xml new file mode 100644 index 0000000..3359059 --- /dev/null +++ b/artifacts/cccc/TicketSaleWidget.xml @@ -0,0 +1,167 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TicketSaleWidget(QWidget *) + +definition + + + + + + + + + +initializeModels() + +definition + + + + + + + + + +initializeRepositories() + +definition + + + + + + + + + +onFieldRetrieved(const QSqlField &) + +definition + + + + + + + + + +onPushButtonSellTicketClicked() + +definition + + + + + + + + + +setupConnections() + +definition + + + + + + + + + +setupSessionFinder() + +definition + + + + + + + + + +setupTableView() + +definition + + + + + + + + + +validateSessionValues(const initializer_list &) + +definition + + + + + + + + + + + +TicketSaleWidget + + + +QSqlField +true +false + +pass by reference + + +QWidget +true +false + +pass by reference + + +initializer_list +true +false + +pass by reference + + + + + + diff --git a/artifacts/cccc/TicketSalesReportWidget.html b/artifacts/cccc/TicketSalesReportWidget.html new file mode 100644 index 0000000..1a38335 --- /dev/null +++ b/artifacts/cccc/TicketSalesReportWidget.html @@ -0,0 +1,266 @@ + +Detailed report on module TicketSalesReportWidget + + + +

Detailed report on module TicketSalesReportWidget

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 250 11
McCabe's Cyclomatic NumberMVG 21 1
Lines of CommentCOM 15 0.682
LOC/COML_C16.667 
MVG/COMM_C 1.400 
Weighted Methods per Class (  weighting = unity )WMC1 22 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 11 
Information Flow measure (  inclusive )IF4 0 0.000
Information Flow measure (  visible )IF4v 0 0.000
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
TicketSalesReportWidget(  QWidget * )
+definition   +./ui/widgets/ticket_sales_report_widget.cpp:45
+
+
8 0 1------------
aggregateByDateTime(  const QVector &,  function )
+definition   +./ui/widgets/ticket_sales_report_widget.cpp:207
+
+
17 4 0------------
configureEntityFinder(  const QString &,  const QString &,  const QString & )
+definition   +./ui/widgets/ticket_sales_report_widget.cpp:158
+
+
7 0 0------------
configureReportForGenre(   )
+definition   +./ui/widgets/ticket_sales_report_widget.cpp:55
+
+
18 0 4------------
configureReportForHall(   )
+definition   +./ui/widgets/ticket_sales_report_widget.cpp:77
+
+
18 0 4------------
configureReportForMovie(   )
+definition   +./ui/widgets/ticket_sales_report_widget.cpp:99
+
+
18 0 4------------
createChart(  const QMap & )
+definition   +./ui/widgets/ticket_sales_report_widget.cpp:281
+
+
51 3 0******------
createDateTimeAxis(  int,  const QString &,  const QDateTime &,  const QDateTime & )
+definition   +./ui/widgets/ticket_sales_report_widget.cpp:231
+
+
10 1 0------------
createValueAxis(  int,  const QString & )
+definition   +./ui/widgets/ticket_sales_report_widget.cpp:243
+
+
8 1 0------------
dateRange(  QDateTime &,  QDateTime & )
+definition   +./ui/widgets/ticket_sales_report_widget.cpp:274
+
+
6 1 0------------
initializeChart(   )
+definition   +./ui/widgets/ticket_sales_report_widget.cpp:135
+
+
4 0 0------------
initializeRepositories(   )
+definition   +./ui/widgets/ticket_sales_report_widget.cpp:121
+
+
11 1 0------------
onEntityFinderReseted(   )
+definition   +./ui/widgets/ticket_sales_report_widget.cpp:166
+
+
4 0 0------------
onFieldRetrieved(  const QSqlField & )
+definition   +./ui/widgets/ticket_sales_report_widget.cpp:196
+
+
4 0 0------------
onPushButtonGenerateClicked(   )
+definition   +./ui/widgets/ticket_sales_report_widget.cpp:171
+
+
21 6 0************
onRecordRetrieved(  const QSqlRecord & )
+definition   +./ui/widgets/ticket_sales_report_widget.cpp:201
+
+
4 0 0------------
retrieveSessions(  QVector & )
+definition   +./ui/widgets/ticket_sales_report_widget.cpp:266
+
+
7 1 0------------
setupChart(   )
+definition   +./ui/widgets/ticket_sales_report_widget.cpp:140
+
+
3 0 0------------
setupChart(  QChart *,  QAbstractSeries *,  QAbstractAxis *,  QAbstractAxis * )
+definition   +./ui/widgets/ticket_sales_report_widget.cpp:346
+
+
9 0 0------------
setupConnections(   )
+definition   +./ui/widgets/ticket_sales_report_widget.cpp:144
+
+
10 0 0------------
updateChartView(  QChart * )
+definition   +./ui/widgets/ticket_sales_report_widget.cpp:356
+
+
4 0 0------------
validateData(  const QMap & )
+definition   +./ui/widgets/ticket_sales_report_widget.cpp:252
+
+
8 3 2------------
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +QAbstractAxis [V]
+pass by reference   +./ui/widgets/ticket_sales_report_widget.cpp:347
+pass by reference   +./ui/widgets/ticket_sales_report_widget.cpp:348
+
+
+QAbstractSeries [V]
+pass by reference   +./ui/widgets/ticket_sales_report_widget.cpp:346
+
+
+QChart [V]
+pass by reference   +./ui/widgets/ticket_sales_report_widget.cpp:346
+pass by reference   +./ui/widgets/ticket_sales_report_widget.cpp:356
+
+
+QDateTime [V]
+pass by reference   +./ui/widgets/ticket_sales_report_widget.cpp:232
+pass by reference   +./ui/widgets/ticket_sales_report_widget.cpp:233
+pass by reference   +./ui/widgets/ticket_sales_report_widget.cpp:274
+pass by reference   +./ui/widgets/ticket_sales_report_widget.cpp:275
+
+
+QMap [V]
+pass by reference   +./ui/widgets/ticket_sales_report_widget.cpp:253
+pass by reference   +./ui/widgets/ticket_sales_report_widget.cpp:282
+
+
+QSqlField [V]
+pass by reference   +./ui/widgets/ticket_sales_report_widget.cpp:196
+
+
+QSqlRecord [V]
+pass by reference   +./ui/widgets/ticket_sales_report_widget.cpp:201
+
+
+QString [V]
+pass by reference   +./ui/widgets/ticket_sales_report_widget.cpp:159
+pass by reference   +./ui/widgets/ticket_sales_report_widget.cpp:159
+pass by reference   +./ui/widgets/ticket_sales_report_widget.cpp:160
+pass by reference   +./ui/widgets/ticket_sales_report_widget.cpp:232
+pass by reference   +./ui/widgets/ticket_sales_report_widget.cpp:244
+
+
+QVector [V]
+pass by reference   +./ui/widgets/ticket_sales_report_widget.cpp:208
+pass by reference   +./ui/widgets/ticket_sales_report_widget.cpp:267
+
+
+QWidget [V]
+pass by reference   +./ui/widgets/ticket_sales_report_widget.cpp:45
+
+
+function [CV]
+pass by value   +./ui/widgets/ticket_sales_report_widget.cpp:209
+
+
+  +
+ diff --git a/artifacts/cccc/TicketSalesReportWidget.xml b/artifacts/cccc/TicketSalesReportWidget.xml new file mode 100644 index 0000000..c08e5d5 --- /dev/null +++ b/artifacts/cccc/TicketSalesReportWidget.xml @@ -0,0 +1,423 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TicketSalesReportWidget(QWidget *) + +definition + + + + + + + + + +aggregateByDateTime(const QVector &,function) + +definition + + + + + + + + + +configureEntityFinder(const QString &,const QString &,const QString &) + +definition + + + + + + + + + +configureReportForGenre() + +definition + + + + + + + + + +configureReportForHall() + +definition + + + + + + + + + +configureReportForMovie() + +definition + + + + + + + + + +createChart(const QMap &) + +definition + + + + + + + + + +createDateTimeAxis(int,const QString &,const QDateTime &,const QDateTime &) + +definition + + + + + + + + + +createValueAxis(int,const QString &) + +definition + + + + + + + + + +dateRange(QDateTime &,QDateTime &) + +definition + + + + + + + + + +initializeChart() + +definition + + + + + + + + + +initializeRepositories() + +definition + + + + + + + + + +onEntityFinderReseted() + +definition + + + + + + + + + +onFieldRetrieved(const QSqlField &) + +definition + + + + + + + + + +onPushButtonGenerateClicked() + +definition + + + + + + + + + +onRecordRetrieved(const QSqlRecord &) + +definition + + + + + + + + + +retrieveSessions(QVector &) + +definition + + + + + + + + + +setupChart() + +definition + + + + + + + + + +setupChart(QChart *,QAbstractSeries *,QAbstractAxis *,QAbstractAxis *) + +definition + + + + + + + + + +setupConnections() + +definition + + + + + + + + + +updateChartView(QChart *) + +definition + + + + + + + + + +validateData(const QMap &) + +definition + + + + + + + + + + + +TicketSalesReportWidget + + + +QAbstractAxis +true +false + +pass by reference + + + +pass by reference + + +QAbstractSeries +true +false + +pass by reference + + +QChart +true +false + +pass by reference + + + +pass by reference + + +QDateTime +true +false + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + +QMap +true +false + +pass by reference + + + +pass by reference + + +QSqlField +true +false + +pass by reference + + +QSqlRecord +true +false + +pass by reference + + +QString +true +false + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + +QVector +true +false + +pass by reference + + + +pass by reference + + +QWidget +true +false + +pass by reference + + +function +true +true + +pass by value + + + + + + diff --git a/artifacts/cccc/TicketsModel.html b/artifacts/cccc/TicketsModel.html new file mode 100644 index 0000000..5d90e96 --- /dev/null +++ b/artifacts/cccc/TicketsModel.html @@ -0,0 +1,101 @@ + +Detailed report on module TicketsModel + + + +

Detailed report on module TicketsModel

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 40 10
McCabe's Cyclomatic NumberMVG 12 3
Lines of CommentCOM 2 0.500
LOC/COML_C20.000 
MVG/COMM_C 6.000 
Weighted Methods per Class (  weighting = unity )WMC1 4 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 4 
Information Flow measure (  inclusive )IF4 0 0.000
Information Flow measure (  visible )IF4v 0 0.000
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
TicketsModel(  QObject *,  const QSqlDatabase & )
+definition   +./ui/models/tickets_model.cpp:6
+
+
2 0 0------------
createMultiColumnFilter(  const QString & )
+definition   +./ui/models/tickets_model.cpp:39
+
+
12 2 2------------
headerData(  int,  Orientation,  int )
+definition   +./ui/models/tickets_model.cpp:20
+
+
18 9 0------******
initialize(   )
+definition   +./ui/models/tickets_model.cpp:9
+
+
8 1 0------------
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +Orientation [CV]
+pass by value   +./ui/models/tickets_model.cpp:20
+
+
+QObject [V]
+pass by reference   +./ui/models/tickets_model.cpp:6
+
+
+QSqlDatabase [V]
+pass by reference   +./ui/models/tickets_model.cpp:6
+
+
+QString [V]
+pass by reference   +./ui/models/tickets_model.cpp:39
+
+
+  +
+ diff --git a/artifacts/cccc/TicketsModel.xml b/artifacts/cccc/TicketsModel.xml new file mode 100644 index 0000000..bd71ce5 --- /dev/null +++ b/artifacts/cccc/TicketsModel.xml @@ -0,0 +1,114 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TicketsModel(QObject *,const QSqlDatabase &) + +definition + + + + + + + + + +createMultiColumnFilter(const QString &) + +definition + + + + + + + + + +headerData(int,Orientation,int) + +definition + + + + + + + + + +initialize() + +definition + + + + + + + + + + + +TicketsModel + + + +Orientation +true +true + +pass by value + + +QObject +true +false + +pass by reference + + +QSqlDatabase +true +false + +pass by reference + + +QString +true +false + +pass by reference + + + + + + diff --git a/artifacts/cccc/TicketsRepository.html b/artifacts/cccc/TicketsRepository.html new file mode 100644 index 0000000..0471d5a --- /dev/null +++ b/artifacts/cccc/TicketsRepository.html @@ -0,0 +1,141 @@ + +Detailed report on module TicketsRepository + + + +

Detailed report on module TicketsRepository

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 77 11
McCabe's Cyclomatic NumberMVG 19 3
Lines of CommentCOM 0 0.000
LOC/COML_C****** 
MVG/COMM_C****** 
Weighted Methods per Class (  weighting = unity )WMC1 7 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 8 
Information Flow measure (  inclusive )IF4 0 0.000
Information Flow measure (  visible )IF4v 0 0.000
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + + + + + + + + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
TicketsRepository(  QSqlDatabase &,  QObject * )
+definition   +./data/sql/tickets_repository.cpp:10
+
+
2 0 0------------
createTicket(  const CreateTicketRequest & )
+definition   +./data/sql/tickets_repository.cpp:14
+
+
13 3 0------------
deleteTicketById(  qint32 )
+definition   +./data/sql/tickets_repository.cpp:87
+
+
10 3 0------------
getAllTickets(  QVector & )
+definition   +./data/sql/tickets_repository.cpp:51
+
+
13 4 0------------
getTicketById(  qint32,  TicketDTO & )
+definition   +./data/sql/tickets_repository.cpp:30
+
+
16 5 0------******
mapQueryToDTO(  const QSqlQuery & )
+definition   +./data/sql/tickets_repository.cpp:100
+
+
8 1 0------------
updateTicket(  const UpdateTicketRequest & )
+definition   +./data/sql/tickets_repository.cpp:69
+
+
15 3 0------------
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +CreateTicketRequest [V]
+pass by reference   +./data/sql/tickets_repository.cpp:14
+
+
+QObject [V]
+pass by reference   +./data/sql/tickets_repository.cpp:10
+
+
+QSqlDatabase [V]
+pass by reference   +./data/sql/tickets_repository.cpp:10
+
+
+QSqlQuery [V]
+pass by reference   +./data/sql/tickets_repository.cpp:100
+
+
+QVector [V]
+pass by reference   +./data/sql/tickets_repository.cpp:51
+
+
+TicketDTO [V]
+pass by reference   +./data/sql/tickets_repository.cpp:31
+
+
+UpdateTicketRequest [V]
+pass by reference   +./data/sql/tickets_repository.cpp:69
+
+
+qint32 [CV]
+pass by value   +./data/sql/tickets_repository.cpp:30
+pass by value   +./data/sql/tickets_repository.cpp:87
+
+
+  +
+ diff --git a/artifacts/cccc/TicketsRepository.xml b/artifacts/cccc/TicketsRepository.xml new file mode 100644 index 0000000..a88810a --- /dev/null +++ b/artifacts/cccc/TicketsRepository.xml @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TicketsRepository(QSqlDatabase &,QObject *) + +definition + + + + + + + + + +createTicket(const CreateTicketRequest &) + +definition + + + + + + + + + +deleteTicketById(qint32) + +definition + + + + + + + + + +getAllTickets(QVector &) + +definition + + + + + + + + + +getTicketById(qint32,TicketDTO &) + +definition + + + + + + + + + +mapQueryToDTO(const QSqlQuery &) + +definition + + + + + + + + + +updateTicket(const UpdateTicketRequest &) + +definition + + + + + + + + + + + +TicketsRepository + + + +CreateTicketRequest +true +false + +pass by reference + + +QObject +true +false + +pass by reference + + +QSqlDatabase +true +false + +pass by reference + + +QSqlQuery +true +false + +pass by reference + + +QVector +true +false + +pass by reference + + +TicketDTO +true +false + +pass by reference + + +UpdateTicketRequest +true +false + +pass by reference + + +qint32 +true +true + +pass by value + + + +pass by value + + + + + + diff --git a/artifacts/cccc/TicketsRepositoryInterface.html b/artifacts/cccc/TicketsRepositoryInterface.html new file mode 100644 index 0000000..0219dbe --- /dev/null +++ b/artifacts/cccc/TicketsRepositoryInterface.html @@ -0,0 +1,143 @@ + +Detailed report on module TicketsRepositoryInterface + + + +

Detailed report on module TicketsRepositoryInterface

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 11 2
McCabe's Cyclomatic NumberMVG 0 0
Lines of CommentCOM 6 1.200
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 5 
Weighted Methods per Class (  weighting = visible )WMCv 5 
Depth of Inheritance TreeDIT 1 
Number of ChildrenNOC 1 
Coupling between objectsCBO 8 
Information Flow measure (  inclusive )IF4 144 28.800
Information Flow measure (  visible )IF4v 36 7.200
Information Flow measure (  concrete )IF4c 4 0.800
+

Definitions and Declarations

+ + + + + + + + + + + +
DescriptionLOCMVGCOML_CM_C
declaration   +./core/services/ticket_generator.h:15
+
1 0 0------------
definition   +./core/repositories/tickets_repository_interface.h:15
+
3 0 1------------
declaration   +./ui/widgets/ticket_sale_widget.h:10
+
1 0 0------------
+

Functions

+ + + + + + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
createTicket(  const CreateTicketRequest & )
+declaration   +./core/repositories/tickets_repository_interface.h:18
+
+
1 0 1------------
deleteTicketById(  qint32 )
+declaration   +./core/repositories/tickets_repository_interface.h:31
+
+
1 0 1------------
getAllTickets(  QVector & )
+declaration   +./core/repositories/tickets_repository_interface.h:25
+
+
1 0 1------------
getTicketById(  qint32,  TicketDTO & )
+declaration   +./core/repositories/tickets_repository_interface.h:21
+
+
2 0 1------------
updateTicket(  const UpdateTicketRequest & )
+declaration   +./core/repositories/tickets_repository_interface.h:28
+
+
1 0 1------------
+

Relationships

+ + + + + +
ClientsSuppliers
+TicketGenerator
+has by reference   +./core/services/ticket_generator.h:40
+
+
+TicketsRepository [CV]
+inheritance   +./data/sql/tickets_repository.h:9
+
+
+  +
+CreateTicketRequest [V]
+pass by reference   +./core/repositories/tickets_repository_interface.h:18
+
+
+QVector [V]
+pass by reference   +./core/repositories/tickets_repository_interface.h:25
+
+
+RepositoryInterface [CV]
+inheritance   +./core/repositories/tickets_repository_interface.h:15
+
+
+TicketDTO [V]
+pass by reference   +./core/repositories/tickets_repository_interface.h:22
+
+
+UpdateTicketRequest [V]
+pass by reference   +./core/repositories/tickets_repository_interface.h:28
+
+
+qint32 [CV]
+pass by value   +./core/repositories/tickets_repository_interface.h:21
+pass by value   +./core/repositories/tickets_repository_interface.h:31
+
+
+  +
+ diff --git a/artifacts/cccc/TicketsRepositoryInterface.xml b/artifacts/cccc/TicketsRepositoryInterface.xml new file mode 100644 index 0000000..8323a50 --- /dev/null +++ b/artifacts/cccc/TicketsRepositoryInterface.xml @@ -0,0 +1,179 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +declaration + + + + + + +definition + + + + + + +declaration + + + + + + + + + +createTicket(const CreateTicketRequest &) + +declaration + + + + + + + + + +deleteTicketById(qint32) + +declaration + + + + + + + + + +getAllTickets(QVector &) + +declaration + + + + + + + + + +getTicketById(qint32,TicketDTO &) + +declaration + + + + + + + + + +updateTicket(const UpdateTicketRequest &) + +declaration + + + + + + + + + + + +TicketsRepositoryInterface + +TicketGenerator +false +false + +has by reference + + +TicketsRepository +true +true + +inheritance + + + + +CreateTicketRequest +true +false + +pass by reference + + +QVector +true +false + +pass by reference + + +RepositoryInterface +true +true + +inheritance + + +TicketDTO +true +false + +pass by reference + + +UpdateTicketRequest +true +false + +pass by reference + + +qint32 +true +true + +pass by value + + + +pass by value + + + + + + diff --git a/artifacts/cccc/UpdateGenreRequest.html b/artifacts/cccc/UpdateGenreRequest.html new file mode 100644 index 0000000..7dc793a --- /dev/null +++ b/artifacts/cccc/UpdateGenreRequest.html @@ -0,0 +1,63 @@ + +Detailed report on module UpdateGenreRequest + + + +

Detailed report on module UpdateGenreRequest

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+GenresRepository [V]
+pass by reference   +./data/sql/genres_repository.cpp:65
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/UpdateGenreRequest.xml b/artifacts/cccc/UpdateGenreRequest.xml new file mode 100644 index 0000000..56565d2 --- /dev/null +++ b/artifacts/cccc/UpdateGenreRequest.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +UpdateGenreRequest + +GenresRepository +true +false + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/UpdateHallRequest.html b/artifacts/cccc/UpdateHallRequest.html new file mode 100644 index 0000000..87dde1a --- /dev/null +++ b/artifacts/cccc/UpdateHallRequest.html @@ -0,0 +1,63 @@ + +Detailed report on module UpdateHallRequest + + + +

Detailed report on module UpdateHallRequest

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+HallsRepository [V]
+pass by reference   +./data/sql/halls_repository.cpp:63
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/UpdateHallRequest.xml b/artifacts/cccc/UpdateHallRequest.xml new file mode 100644 index 0000000..9fe98e8 --- /dev/null +++ b/artifacts/cccc/UpdateHallRequest.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +UpdateHallRequest + +HallsRepository +true +false + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/UpdateMovieRequest.html b/artifacts/cccc/UpdateMovieRequest.html new file mode 100644 index 0000000..850ae6c --- /dev/null +++ b/artifacts/cccc/UpdateMovieRequest.html @@ -0,0 +1,63 @@ + +Detailed report on module UpdateMovieRequest + + + +

Detailed report on module UpdateMovieRequest

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+MoviesRepository [V]
+pass by reference   +./data/sql/movies_repository.cpp:68
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/UpdateMovieRequest.xml b/artifacts/cccc/UpdateMovieRequest.xml new file mode 100644 index 0000000..928952d --- /dev/null +++ b/artifacts/cccc/UpdateMovieRequest.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +UpdateMovieRequest + +MoviesRepository +true +false + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/UpdateRefundRequest.html b/artifacts/cccc/UpdateRefundRequest.html new file mode 100644 index 0000000..c4f6929 --- /dev/null +++ b/artifacts/cccc/UpdateRefundRequest.html @@ -0,0 +1,63 @@ + +Detailed report on module UpdateRefundRequest + + + +

Detailed report on module UpdateRefundRequest

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+RefundsRepository [V]
+pass by reference   +./data/sql/refunds_repository.cpp:75
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/UpdateRefundRequest.xml b/artifacts/cccc/UpdateRefundRequest.xml new file mode 100644 index 0000000..d9b076f --- /dev/null +++ b/artifacts/cccc/UpdateRefundRequest.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +UpdateRefundRequest + +RefundsRepository +true +false + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/UpdateRoleRequest.html b/artifacts/cccc/UpdateRoleRequest.html new file mode 100644 index 0000000..967f37b --- /dev/null +++ b/artifacts/cccc/UpdateRoleRequest.html @@ -0,0 +1,63 @@ + +Detailed report on module UpdateRoleRequest + + + +

Detailed report on module UpdateRoleRequest

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+RolesRepository [V]
+pass by reference   +./data/sql/roles_repository.cpp:63
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/UpdateRoleRequest.xml b/artifacts/cccc/UpdateRoleRequest.xml new file mode 100644 index 0000000..c2aab95 --- /dev/null +++ b/artifacts/cccc/UpdateRoleRequest.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +UpdateRoleRequest + +RolesRepository +true +false + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/UpdateSessionRequest.html b/artifacts/cccc/UpdateSessionRequest.html new file mode 100644 index 0000000..8050afd --- /dev/null +++ b/artifacts/cccc/UpdateSessionRequest.html @@ -0,0 +1,63 @@ + +Detailed report on module UpdateSessionRequest + + + +

Detailed report on module UpdateSessionRequest

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+SessionsRepository [V]
+pass by reference   +./data/sql/sessions_repository.cpp:71
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/UpdateSessionRequest.xml b/artifacts/cccc/UpdateSessionRequest.xml new file mode 100644 index 0000000..7a17729 --- /dev/null +++ b/artifacts/cccc/UpdateSessionRequest.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +UpdateSessionRequest + +SessionsRepository +true +false + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/UpdateTicketRequest.html b/artifacts/cccc/UpdateTicketRequest.html new file mode 100644 index 0000000..fbcf211 --- /dev/null +++ b/artifacts/cccc/UpdateTicketRequest.html @@ -0,0 +1,63 @@ + +Detailed report on module UpdateTicketRequest + + + +

Detailed report on module UpdateTicketRequest

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+TicketsRepository [V]
+pass by reference   +./data/sql/tickets_repository.cpp:69
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/UpdateTicketRequest.xml b/artifacts/cccc/UpdateTicketRequest.xml new file mode 100644 index 0000000..262160a --- /dev/null +++ b/artifacts/cccc/UpdateTicketRequest.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +UpdateTicketRequest + +TicketsRepository +true +false + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/UpdateUserRequest.html b/artifacts/cccc/UpdateUserRequest.html new file mode 100644 index 0000000..17779d1 --- /dev/null +++ b/artifacts/cccc/UpdateUserRequest.html @@ -0,0 +1,63 @@ + +Detailed report on module UpdateUserRequest + + + +

Detailed report on module UpdateUserRequest

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+UsersRepository [V]
+pass by reference   +./data/sql/users_repository.cpp:88
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/UpdateUserRequest.xml b/artifacts/cccc/UpdateUserRequest.xml new file mode 100644 index 0000000..d894743 --- /dev/null +++ b/artifacts/cccc/UpdateUserRequest.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +UpdateUserRequest + +UsersRepository +true +false + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/UserDTO.html b/artifacts/cccc/UserDTO.html new file mode 100644 index 0000000..dfd8a21 --- /dev/null +++ b/artifacts/cccc/UserDTO.html @@ -0,0 +1,70 @@ + +Detailed report on module UserDTO + + + +

Detailed report on module UserDTO

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 2 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+AuthDialog [V]
+pass by reference   +./ui/dialogs/auth_dialog.cpp:91
+
+
+UsersRepository [V]
+pass by reference   +./data/sql/users_repository.cpp:30
+pass by reference   +./data/sql/users_repository.cpp:51
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/UserDTO.xml b/artifacts/cccc/UserDTO.xml new file mode 100644 index 0000000..83134f7 --- /dev/null +++ b/artifacts/cccc/UserDTO.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +UserDTO + +AuthDialog +true +false + +pass by reference + + +UsersRepository +true +false + +pass by reference + + + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/UsersRepository.html b/artifacts/cccc/UsersRepository.html new file mode 100644 index 0000000..cd72332 --- /dev/null +++ b/artifacts/cccc/UsersRepository.html @@ -0,0 +1,154 @@ + +Detailed report on module UsersRepository + + + +

Detailed report on module UsersRepository

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 97 12
McCabe's Cyclomatic NumberMVG 24 3
Lines of CommentCOM 0 0.000
LOC/COML_C****** 
MVG/COMM_C****** 
Weighted Methods per Class (  weighting = unity )WMC1 8 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 9 
Information Flow measure (  inclusive )IF4 0 0.000
Information Flow measure (  visible )IF4v 0 0.000
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + + + + + + + + + + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
UsersRepository(  QSqlDatabase &,  QObject * )
+definition   +./data/sql/users_repository.cpp:10
+
+
2 0 0------------
createUser(  const CreateUserRequest & )
+definition   +./data/sql/users_repository.cpp:13
+
+
14 3 0------------
deleteUserById(  qint32 )
+definition   +./data/sql/users_repository.cpp:108
+
+
10 3 0------------
getAllUsers(  QVector & )
+definition   +./data/sql/users_repository.cpp:71
+
+
13 4 0------------
getUserById(  qint32,  UserDTO & )
+definition   +./data/sql/users_repository.cpp:30
+
+
16 5 0------******
getUserByUsername(  const QString &,  UserDTO & )
+definition   +./data/sql/users_repository.cpp:50
+
+
17 5 0------******
mapQueryToDTO(  const QSqlQuery & )
+definition   +./data/sql/users_repository.cpp:121
+
+
9 1 0------------
updateUser(  const UpdateUserRequest & )
+definition   +./data/sql/users_repository.cpp:88
+
+
16 3 0------------
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +CreateUserRequest [V]
+pass by reference   +./data/sql/users_repository.cpp:13
+
+
+QObject [V]
+pass by reference   +./data/sql/users_repository.cpp:10
+
+
+QSqlDatabase [V]
+pass by reference   +./data/sql/users_repository.cpp:10
+
+
+QSqlQuery [V]
+pass by reference   +./data/sql/users_repository.cpp:121
+
+
+QString [V]
+pass by reference   +./data/sql/users_repository.cpp:50
+
+
+QVector [V]
+pass by reference   +./data/sql/users_repository.cpp:71
+
+
+UpdateUserRequest [V]
+pass by reference   +./data/sql/users_repository.cpp:88
+
+
+UserDTO [V]
+pass by reference   +./data/sql/users_repository.cpp:30
+pass by reference   +./data/sql/users_repository.cpp:51
+
+
+qint32 [CV]
+pass by value   +./data/sql/users_repository.cpp:30
+pass by value   +./data/sql/users_repository.cpp:108
+
+
+  +
+ diff --git a/artifacts/cccc/UsersRepository.xml b/artifacts/cccc/UsersRepository.xml new file mode 100644 index 0000000..5c976a0 --- /dev/null +++ b/artifacts/cccc/UsersRepository.xml @@ -0,0 +1,205 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +UsersRepository(QSqlDatabase &,QObject *) + +definition + + + + + + + + + +createUser(const CreateUserRequest &) + +definition + + + + + + + + + +deleteUserById(qint32) + +definition + + + + + + + + + +getAllUsers(QVector &) + +definition + + + + + + + + + +getUserById(qint32,UserDTO &) + +definition + + + + + + + + + +getUserByUsername(const QString &,UserDTO &) + +definition + + + + + + + + + +mapQueryToDTO(const QSqlQuery &) + +definition + + + + + + + + + +updateUser(const UpdateUserRequest &) + +definition + + + + + + + + + + + +UsersRepository + + + +CreateUserRequest +true +false + +pass by reference + + +QObject +true +false + +pass by reference + + +QSqlDatabase +true +false + +pass by reference + + +QSqlQuery +true +false + +pass by reference + + +QString +true +false + +pass by reference + + +QVector +true +false + +pass by reference + + +UpdateUserRequest +true +false + +pass by reference + + +UserDTO +true +false + +pass by reference + + + +pass by reference + + +qint32 +true +true + +pass by value + + + +pass by value + + + + + + diff --git a/artifacts/cccc/UsersRepositoryInterface.html b/artifacts/cccc/UsersRepositoryInterface.html new file mode 100644 index 0000000..0900fe9 --- /dev/null +++ b/artifacts/cccc/UsersRepositoryInterface.html @@ -0,0 +1,146 @@ + +Detailed report on module UsersRepositoryInterface + + + +

Detailed report on module UsersRepositoryInterface

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 11 2
McCabe's Cyclomatic NumberMVG 0 0
Lines of CommentCOM 7 1.167
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 6 
Weighted Methods per Class (  weighting = visible )WMCv 6 
Depth of Inheritance TreeDIT 1 
Number of ChildrenNOC 1 
Coupling between objectsCBO 8 
Information Flow measure (  inclusive )IF4 49 8.167
Information Flow measure (  visible )IF4v 49 8.167
Information Flow measure (  concrete )IF4c 4 0.667
+

Definitions and Declarations

+ + + + + + + + +
DescriptionLOCMVGCOML_CM_C
definition   +./core/repositories/users_repository_interface.h:15
+
3 0 1------------
declaration   +./ui/dialogs/auth_dialog.h:11
+
1 0 0------------
+

Functions

+ + + + + + + + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
createUser(  const CreateUserRequest & )
+declaration   +./core/repositories/users_repository_interface.h:18
+
+
1 0 1------------
deleteUserById(  qint32 )
+declaration   +./core/repositories/users_repository_interface.h:34
+
+
1 0 1------------
getAllUsers(  QVector & )
+declaration   +./core/repositories/users_repository_interface.h:28
+
+
1 0 1------------
getUserById(  qint32,  UserDTO & )
+declaration   +./core/repositories/users_repository_interface.h:21
+
+
1 0 1------------
getUserByUsername(  const QString &,  UserDTO & )
+declaration   +./core/repositories/users_repository_interface.h:24
+
+
2 0 1------------
updateUser(  const UpdateUserRequest & )
+declaration   +./core/repositories/users_repository_interface.h:31
+
+
1 0 1------------
+

Relationships

+ + + + + +
ClientsSuppliers
+UsersRepository [CV]
+inheritance   +./data/sql/users_repository.h:9
+
+
+  +
+CreateUserRequest [V]
+pass by reference   +./core/repositories/users_repository_interface.h:18
+
+
+QString [V]
+pass by reference   +./core/repositories/users_repository_interface.h:24
+
+
+QVector [V]
+pass by reference   +./core/repositories/users_repository_interface.h:28
+
+
+RepositoryInterface [CV]
+inheritance   +./core/repositories/users_repository_interface.h:15
+
+
+UpdateUserRequest [V]
+pass by reference   +./core/repositories/users_repository_interface.h:31
+
+
+UserDTO [V]
+pass by reference   +./core/repositories/users_repository_interface.h:21
+pass by reference   +./core/repositories/users_repository_interface.h:25
+
+
+qint32 [CV]
+pass by value   +./core/repositories/users_repository_interface.h:21
+pass by value   +./core/repositories/users_repository_interface.h:34
+
+
+  +
+ diff --git a/artifacts/cccc/UsersRepositoryInterface.xml b/artifacts/cccc/UsersRepositoryInterface.xml new file mode 100644 index 0000000..1833cab --- /dev/null +++ b/artifacts/cccc/UsersRepositoryInterface.xml @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +definition + + + + + + +declaration + + + + + + + + + +createUser(const CreateUserRequest &) + +declaration + + + + + + + + + +deleteUserById(qint32) + +declaration + + + + + + + + + +getAllUsers(QVector &) + +declaration + + + + + + + + + +getUserById(qint32,UserDTO &) + +declaration + + + + + + + + + +getUserByUsername(const QString &,UserDTO &) + +declaration + + + + + + + + + +updateUser(const UpdateUserRequest &) + +declaration + + + + + + + + + + + +UsersRepositoryInterface + +UsersRepository +true +true + +inheritance + + + + +CreateUserRequest +true +false + +pass by reference + + +QString +true +false + +pass by reference + + +QVector +true +false + +pass by reference + + +RepositoryInterface +true +true + +inheritance + + +UpdateUserRequest +true +false + +pass by reference + + +UserDTO +true +false + +pass by reference + + + +pass by reference + + +qint32 +true +true + +pass by value + + + +pass by value + + + + + + diff --git a/artifacts/cccc/anonymous.html b/artifacts/cccc/anonymous.html new file mode 100644 index 0000000..2e6530d --- /dev/null +++ b/artifacts/cccc/anonymous.html @@ -0,0 +1,101 @@ + +Detailed report on module anonymous + + + +

Detailed report on module anonymous

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 29 4
McCabe's Cyclomatic NumberMVG 6 1
Lines of CommentCOM 3 0.429
LOC/COML_C 9.667 
MVG/COMM_C 2.000 
Weighted Methods per Class (  weighting = unity )WMC1 7 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 0 
Information Flow measure (  inclusive )IF4 0 0.000
Information Flow measure (  visible )IF4v 0 0.000
Information Flow measure (  concrete )IF4c 0 0.000
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + + + + + + + + + + + + + + +
Function prototypeLOCMVGCOML_CM_C
QTEST_MAIN(  DayManagerTest )
+definition   +./tests_class/day_manager_test.cpp:174
+
+
1 0 0------------
QTEST_MAIN(  ReservationManagerTest )
+definition   +./tests_class/reservation_manager_test.cpp:67
+
+
1 0 0------------
enableSelection(  QTableView * )
+definition   +./ui/main_window/main_window.cpp:100
+
+
6 0 2------------
executor(  TEST_DB )
+declaration   +./tests_schema/tests/sqlite_database_foreign_key_test.cpp:30
+
+
1 0 0------------
main(  ... )
+definition   +./src/main.cpp:6
+
+
14 5 1------ 5.000
main(  int,  char ** )
+definition   +./tests_schema/tests/main_test.cpp:3
+
+
4 1 0------------
remove(  ... )
+declaration   +./tests_schema/tests/sqlite_database_crud_test.cpp:30
+declaration   +./tests_schema/tests/sqlite_database_trigger_test.cpp:31
+
+
2 0 0------------
+

Relationships

+ + + + + +
ClientsSuppliers
+  + +  +
+ diff --git a/artifacts/cccc/anonymous.xml b/artifacts/cccc/anonymous.xml new file mode 100644 index 0000000..1546625 --- /dev/null +++ b/artifacts/cccc/anonymous.xml @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +QTEST_MAIN(DayManagerTest) + +definition + + + + + + + + + +QTEST_MAIN(ReservationManagerTest) + +definition + + + + + + + + + +enableSelection(QTableView *) + +definition + + + + + + + + + +executor(TEST_DB) + +declaration + + + + + + + + + +main(...) + +definition + + + + + + + + + +main(int,char **) + +definition + + + + + + + + + +remove(...) + +declaration + + + +declaration + + + + + + + + + + + +anonymous + + + + + + + diff --git a/artifacts/cccc/bool.html b/artifacts/cccc/bool.html new file mode 100644 index 0000000..3915c3d --- /dev/null +++ b/artifacts/cccc/bool.html @@ -0,0 +1,68 @@ + +Detailed report on module bool + + + +

Detailed report on module bool

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 2 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+ApplicationConnector [CV]
+pass by value   +./core/controllers/application_connector.cpp:279
+
+
+EntityFinderWidget [CV]
+pass by value   +./ui/widgets/entity_finder_widget.cpp:23
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/bool.xml b/artifacts/cccc/bool.xml new file mode 100644 index 0000000..1e8cd3f --- /dev/null +++ b/artifacts/cccc/bool.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +bool + +ApplicationConnector +true +true + +pass by value + + +EntityFinderWidget +true +true + +pass by value + + + + + + + + diff --git a/artifacts/cccc/cccc.db b/artifacts/cccc/cccc.db new file mode 100644 index 0000000..38b1fa2 --- /dev/null +++ b/artifacts/cccc/cccc.db @@ -0,0 +1,1748 @@ +CCCC_Module@ApplicationConnector@@ +CCCC_Module@ApplicationController@@ +CCCC_Module@AuthDialog@@ +CCCC_Module@BaseGenerator@@ +CCCC_Module@BaseSqlTableModel@@ +CCCC_Module@BaseSqlTableRepository@@ +CCCC_Module@CreateGenreRequest@@ +CCCC_Module@CreateHallRequest@@ +CCCC_Module@CreateMovieRequest@@ +CCCC_Module@CreateRefundRequest@@ +CCCC_Module@CreateRoleRequest@@ +CCCC_Module@CreateSessionRequest@@ +CCCC_Module@CreateTicketRequest@@ +CCCC_Module@CreateUserRequest@@ +CCCC_Module@DatabaseManager@@ +CCCC_Module@DateTimeDelegate@@ +CCCC_Module@DateTimeGenerator@@ +CCCC_Module@DayManager@@ +CCCC_Module@DayManagerTest@class@ +CCCC_ModExt@DayManagerTest@class@./tests_class/day_manager_test.cpp@4@definition@????0@LOC:12 COM:0 MVG:0@0@d@ +CCCC_Module@DirectoriesManagementWidget@@ +CCCC_Module@EntityDeleterWidget@@ +CCCC_Module@EntityFinderWidget@@ +CCCC_Module@EntityUpdaterWidget@@ +CCCC_Module@ErrorDialog@@ +CCCC_Module@ExecuteSqlFile@@ +CCCC_Module@FileReader@@ +CCCC_Module@Genre@@ +CCCC_Module@GenreDTO@@ +CCCC_Module@GenresModel@@ +CCCC_Module@GenresRepository@@ +CCCC_Module@Hall@@ +CCCC_Module@HallDTO@@ +CCCC_Module@HallsModel@@ +CCCC_Module@HallsRepository@@ +CCCC_Module@MainWindow@@ +CCCC_Module@ModelManager@@ +CCCC_Module@Movie@@ +CCCC_Module@MovieDTO@@ +CCCC_Module@MoviesModel@@ +CCCC_Module@MoviesRepository@@ +CCCC_Module@MultiColumnSortFilterProxyModel@@ +CCCC_Module@NewGenre@@ +CCCC_Module@NewHall@@ +CCCC_Module@NewMovie@@ +CCCC_Module@NewRefund@@ +CCCC_Module@NewSession@@ +CCCC_Module@NewTicket@@ +CCCC_Module@Orientation@@ +CCCC_Module@QAbstractAxis@@ +CCCC_Module@QAbstractItemModel@@ +CCCC_Module@QAbstractSeries@@ +CCCC_Module@QChart@@ +CCCC_Module@QDateTime@@ +CCCC_Module@QList@@ +CCCC_Module@QLocale@@ +CCCC_Module@QMap@@ +CCCC_Module@QMetaObject@@ +CCCC_Module@QModelIndex@@ +CCCC_Module@QObject@@ +CCCC_Module@QPair@@ +CCCC_Module@QSqlDatabase@@ +CCCC_Module@QSqlField@@ +CCCC_Module@QSqlQuery@@ +CCCC_Module@QSqlRecord@@ +CCCC_Module@QString@@ +CCCC_Module@QStringList@@ +CCCC_Module@QTableView@@ +CCCC_Module@QTime@@ +CCCC_Module@QVariant@@ +CCCC_Module@QVector@@ +CCCC_Module@QWidget@@ +CCCC_Module@Refund@@ +CCCC_Module@RefundDTO@@ +CCCC_Module@RefundGenerator@@ +CCCC_Module@RefundsModel@@ +CCCC_Module@RefundsRepository@@ +CCCC_Module@RelationIdConfig@@ +CCCC_Module@ReportsWidget@@ +CCCC_Module@RepositoryManager@@ +CCCC_Module@RepositoryResult@@ +CCCC_Module@ReservationManager@@ +CCCC_Module@ReservationManagerTest@class@ +CCCC_ModExt@ReservationManagerTest@class@./tests_class/reservation_manager_test.cpp@4@definition@????0@LOC:7 COM:0 MVG:0@0@d@ +CCCC_Module@RoleDTO@@ +CCCC_Module@RolesRepository@@ +CCCC_Module@SQLiteDatabase@@ +CCCC_Module@SQLiteDatabaseCRUDTest@class@ +CCCC_ModExt@SQLiteDatabaseCRUDTest@class@./tests_schema/tests/sqlite_database_crud_test.cpp@11@definition@F????@LOC:15 COM:2 MVG:0@?@d@ +CCCC_Module@SQLiteDatabaseForeignKeyTest@class@ +CCCC_ModExt@SQLiteDatabaseForeignKeyTest@class@./tests_schema/tests/sqlite_database_foreign_key_test.cpp@10@definition@?????@LOC:12 COM:5 MVG:1@?@d@ +CCCC_Module@SQLiteDatabaseTriggerTest@class@ +CCCC_ModExt@SQLiteDatabaseTriggerTest@class@./tests_schema/tests/sqlite_database_trigger_test.cpp@10@definition@F????@LOC:17 COM:2 MVG:0@?@d@ +CCCC_Module@SQLiteFileExecutor@@ +CCCC_Module@SQLiteStatement@@ +CCCC_Module@SalesData@@ +CCCC_Module@SchemaMetadata@@ +CCCC_Module@SearchDialog@@ +CCCC_Module@Session@@ +CCCC_Module@SessionDTO@@ +CCCC_Module@SessionGenerator@@ +CCCC_Module@SessionManagementWidget@@ +CCCC_Module@SessionStatisticsDTO@@ +CCCC_Module@SessionsModel@@ +CCCC_Module@SessionsRepository@@ +CCCC_Module@SessionsStatisticsRepository@@ +CCCC_Module@SingleRecordTimeRangeWidget@@ +CCCC_Module@TableInfoSQLite@@ +CCCC_Module@Test@@ +CCCC_Module@Ticket@@ +CCCC_Module@TicketDTO@@ +CCCC_Module@TicketGenerator@@ +CCCC_Module@TicketReturnWidget@@ +CCCC_Module@TicketSaleWidget@@ +CCCC_Module@TicketSalesReportWidget@@ +CCCC_Module@TicketsModel@@ +CCCC_Module@TicketsRepository@@ +CCCC_Module@UpdateGenreRequest@@ +CCCC_Module@UpdateHallRequest@@ +CCCC_Module@UpdateMovieRequest@@ +CCCC_Module@UpdateRefundRequest@@ +CCCC_Module@UpdateRoleRequest@@ +CCCC_Module@UpdateSessionRequest@@ +CCCC_Module@UpdateTicketRequest@@ +CCCC_Module@UpdateUserRequest@@ +CCCC_Module@UserDTO@@ +CCCC_Module@UsersRepository@@ +CCCC_Module@anonymous@@ +CCCC_Module@bool@@ +CCCC_Module@char@builtin@ +CCCC_ModExt@char@builtin@@0@builtin definition@d?????@@0@d@ +CCCC_Module@double@builtin@ +CCCC_ModExt@double@builtin@@0@builtin definition@d?????@@0@d@ +CCCC_Module@float@builtin@ +CCCC_ModExt@float@builtin@@0@builtin definition@d?????@@0@d@ +CCCC_Module@function@@ +CCCC_Module@initializer_list@@ +CCCC_Module@int@builtin@ +CCCC_ModExt@int@builtin@@0@builtin definition@d?????@@0@d@ +CCCC_Module@long@builtin@ +CCCC_ModExt@long@builtin@@0@builtin definition@d?????@@0@d@ +CCCC_Module@optional@@ +CCCC_Module@qint32@@ +CCCC_Module@qint64@@ +CCCC_Module@qsizetype@@ +CCCC_Module@sqlite3@@ +CCCC_Module@string@@ +CCCC_Module@void@builtin@ +CCCC_ModExt@void@builtin@@0@builtin definition@d?????@@0@d@ +CCCC_Member@ApplicationConnector@ApplicationConnector@@(QObject *)@ +CCCC_MemExt@ApplicationConnector@ApplicationConnector@@(QObject *)@./core/controllers/application_connector.cpp@8@definition@F????@LOC:4 COM:0 MVG:0@?@d@ +CCCC_Member@ApplicationConnector@connect@@()@ +CCCC_MemExt@ApplicationConnector@connect@@()@./core/controllers/application_connector.cpp@13@definition@F????@LOC:15 COM:0 MVG:9@?@d@ +CCCC_Member@ApplicationConnector@connectDeleteRFLinks@@()@ +CCCC_MemExt@ApplicationConnector@connectDeleteRFLinks@@()@./core/controllers/application_connector.cpp@145@definition@F????@LOC:14 COM:0 MVG:3@?@d@ +CCCC_Member@ApplicationConnector@connectSelfReferenceTableLinks@@()@ +CCCC_MemExt@ApplicationConnector@connectSelfReferenceTableLinks@@()@./core/controllers/application_connector.cpp@111@definition@F????@LOC:10 COM:0 MVG:3@?@d@ +CCCC_Member@ApplicationConnector@connectTablePairLinks@@()@ +CCCC_MemExt@ApplicationConnector@connectTablePairLinks@@()@./core/controllers/application_connector.cpp@123@definition@F????@LOC:9 COM:0 MVG:3@?@d@ +CCCC_Member@ApplicationConnector@connectUpdateDeleteRFLinks@@()@ +CCCC_MemExt@ApplicationConnector@connectUpdateDeleteRFLinks@@()@./core/controllers/application_connector.cpp@134@definition@F????@LOC:9 COM:0 MVG:3@?@d@ +CCCC_Member@ApplicationConnector@flattenLinkList@@(const QVector &)@ +CCCC_MemExt@ApplicationConnector@flattenLinkList@@(const QVector &)@./core/controllers/application_connector.cpp@60@definition@F????@LOC:8 COM:0 MVG:2@?@d@ +CCCC_Member@ApplicationConnector@getAddress@@(const QObject *)@ +CCCC_MemExt@ApplicationConnector@getAddress@@(const QObject *)@./core/controllers/application_connector.cpp@268@definition@F????@LOC:3 COM:0 MVG:2@?@d@ +CCCC_Member@ApplicationConnector@getMetaClassName@@(const QMetaObject *)@ +CCCC_MemExt@ApplicationConnector@getMetaClassName@@(const QMetaObject *)@./core/controllers/application_connector.cpp@273@definition@F????@LOC:2 COM:0 MVG:2@?@d@ +CCCC_Member@ApplicationConnector@getMethodSignature@@(const QMetaObject *,const char *,bool)@ +CCCC_MemExt@ApplicationConnector@getMethodSignature@@(const QMetaObject *,const char *,bool)@./core/controllers/application_connector.cpp@277@definition@F????@LOC:14 COM:0 MVG:6@?@d@ +CCCC_Member@ApplicationConnector@initializeDeleteCandidates@@()@ +CCCC_MemExt@ApplicationConnector@initializeDeleteCandidates@@()@./core/controllers/application_connector.cpp@97@definition@F????@LOC:10 COM:1 MVG:1@?@d@ +CCCC_Member@ApplicationConnector@initializeSelfReferenceTableLinks@@()@ +CCCC_MemExt@ApplicationConnector@initializeSelfReferenceTableLinks@@()@./core/controllers/application_connector.cpp@34@definition@F????@LOC:8 COM:0 MVG:1@?@d@ +CCCC_Member@ApplicationConnector@initializeTablePairLinks@@()@ +CCCC_MemExt@ApplicationConnector@initializeTablePairLinks@@()@./core/controllers/application_connector.cpp@44@definition@F????@LOC:14 COM:0 MVG:1@?@d@ +CCCC_Member@ApplicationConnector@initializeUpdateDeleteCandidates@@()@ +CCCC_MemExt@ApplicationConnector@initializeUpdateDeleteCandidates@@()@./core/controllers/application_connector.cpp@70@definition@F????@LOC:24 COM:0 MVG:1@?@d@ +CCCC_Member@ApplicationConnector@linkRepositoryToFinder@@(const QString &,const QString &)@ +CCCC_MemExt@ApplicationConnector@linkRepositoryToFinder@@(const QString &,const QString &)@./core/controllers/application_connector.cpp@221@definition@F????@LOC:24 COM:0 MVG:7@?@d@ +CCCC_Member@ApplicationConnector@linkRepositoryToModel@@(const QString &,const QString &)@ +CCCC_MemExt@ApplicationConnector@linkRepositoryToModel@@(const QString &,const QString &)@./core/controllers/application_connector.cpp@197@definition@F????@LOC:19 COM:0 MVG:6@?@d@ +CCCC_Member@ApplicationConnector@pairTableConnections@@()@ +CCCC_MemExt@ApplicationConnector@pairTableConnections@@()@./core/controllers/application_connector.cpp@163@definition@F????@LOC:12 COM:0 MVG:2@?@d@ +CCCC_Member@ApplicationConnector@repositoryToFinderConnections@@()@ +CCCC_MemExt@ApplicationConnector@repositoryToFinderConnections@@()@./core/controllers/application_connector.cpp@252@definition@F????@LOC:12 COM:0 MVG:2@?@d@ +CCCC_Member@ApplicationConnector@singleTableConnections@@()@ +CCCC_MemExt@ApplicationConnector@singleTableConnections@@()@./core/controllers/application_connector.cpp@180@definition@F????@LOC:13 COM:0 MVG:2@?@d@ +CCCC_Member@ApplicationController@connectToDatabase@@(const QString &)@ +CCCC_MemExt@ApplicationController@connectToDatabase@@(const QString &)@./core/controllers/application_controller.cpp@119@definition@F????@LOC:8 COM:0 MVG:3@?@d@ +CCCC_Member@ApplicationController@ensureDatabaseExists@@(const QString &)@ +CCCC_MemExt@ApplicationController@ensureDatabaseExists@@(const QString &)@./core/controllers/application_controller.cpp@50@definition@F????@LOC:43 COM:12 MVG:5@?@d@ +CCCC_Member@ApplicationController@loadTranslations@@(const QString &,const QString &,const QString &,const QString &)@ +CCCC_MemExt@ApplicationController@loadTranslations@@(const QString &,const QString &,const QString &,const QString &)@./core/controllers/application_controller.cpp@129@definition@F????@LOC:19 COM:0 MVG:5@?@d@ +CCCC_Member@ApplicationController@onLoginFailed@@()@ +CCCC_MemExt@ApplicationController@onLoginFailed@@()@./core/controllers/application_controller.cpp@108@definition@F????@LOC:4 COM:0 MVG:0@?@d@ +CCCC_Member@ApplicationController@onLoginSuccessful@@(qint32,qint32)@ +CCCC_MemExt@ApplicationController@onLoginSuccessful@@(qint32,qint32)@./core/controllers/application_controller.cpp@113@definition@F????@LOC:5 COM:0 MVG:0@?@d@ +CCCC_Member@ApplicationController@setupApplication@@()@ +CCCC_MemExt@ApplicationController@setupApplication@@()@./core/controllers/application_controller.cpp@21@definition@F????@LOC:17 COM:3 MVG:7@?@d@ +CCCC_Member@AuthDialog@AuthDialog@@(QWidget *)@ +CCCC_MemExt@AuthDialog@AuthDialog@@(QWidget *)@./ui/dialogs/auth_dialog.cpp@14@definition@F????@LOC:8 COM:1 MVG:1@?@d@ +CCCC_Member@AuthDialog@hashPassword@@(const QString &,const QString &)@ +CCCC_MemExt@AuthDialog@hashPassword@@(const QString &,const QString &)@./ui/dialogs/auth_dialog.cpp@82@definition@F????@LOC:5 COM:0 MVG:1@?@d@ +CCCC_Member@AuthDialog@initializeRepositories@@()@ +CCCC_MemExt@AuthDialog@initializeRepositories@@()@./ui/dialogs/auth_dialog.cpp@25@definition@F????@LOC:9 COM:0 MVG:2@?@d@ +CCCC_Member@AuthDialog@onCancelClicked@@()@ +CCCC_MemExt@AuthDialog@onCancelClicked@@()@./ui/dialogs/auth_dialog.cpp@43@definition@F????@LOC:4 COM:0 MVG:0@?@d@ +CCCC_Member@AuthDialog@onLoginClicked@@()@ +CCCC_MemExt@AuthDialog@onLoginClicked@@()@./ui/dialogs/auth_dialog.cpp@48@definition@F????@LOC:25 COM:0 MVG:6@?@d@ +CCCC_Member@AuthDialog@setupConnections@@()@ +CCCC_MemExt@AuthDialog@setupConnections@@()@./ui/dialogs/auth_dialog.cpp@38@definition@F????@LOC:4 COM:0 MVG:0@?@d@ +CCCC_Member@AuthDialog@verifyPassword@@(const QString &,const UserDTO &)@ +CCCC_MemExt@AuthDialog@verifyPassword@@(const QString &,const UserDTO &)@./ui/dialogs/auth_dialog.cpp@90@definition@F????@LOC:5 COM:0 MVG:1@?@d@ +CCCC_Member@BaseGenerator@shouldLogAllSuccesses@@()@ +CCCC_MemExt@BaseGenerator@shouldLogAllSuccesses@@()@./core/services/base_generator.cpp@7@declaration@T????@LOC:0 COM:0 MVG:0@?@D@ +CCCC_Member@BaseSqlTableModel@BaseSqlTableModel@@(QObject *,QSqlDatabase)@ +CCCC_MemExt@BaseSqlTableModel@BaseSqlTableModel@@(QObject *,QSqlDatabase)@./ui/models/base_sql_table_model.cpp@8@definition@F????@LOC:2 COM:0 MVG:0@?@d@ +CCCC_Member@BaseSqlTableModel@createMultiColumnFilter@@(const QString &)@ +CCCC_MemExt@BaseSqlTableModel@createMultiColumnFilter@@(const QString &)@./ui/models/base_sql_table_model.cpp@68@definition@T????@LOC:7 COM:0 MVG:2@?@d@ +CCCC_Member@BaseSqlTableModel@createUpdateFilterMessage@@(const QString &)@ +CCCC_MemExt@BaseSqlTableModel@createUpdateFilterMessage@@(const QString &)@./ui/models/base_sql_table_model.cpp@79@definition@T????@LOC:14 COM:0 MVG:2@?@d@ +CCCC_Member@BaseSqlTableModel@data@@(const QModelIndex &,int)@ +CCCC_MemExt@BaseSqlTableModel@data@@(const QModelIndex &,int)@./ui/models/base_sql_table_model.cpp@23@definition@T????@LOC:3 COM:17 MVG:1@?@d@ +CCCC_Member@BaseSqlTableModel@refreshAll@@()@ +CCCC_MemExt@BaseSqlTableModel@refreshAll@@()@./ui/models/base_sql_table_model.cpp@11@definition@F????@LOC:10 COM:0 MVG:2@?@d@ +CCCC_Member@BaseSqlTableModel@resetFilter@@()@ +CCCC_MemExt@BaseSqlTableModel@resetFilter@@()@./ui/models/base_sql_table_model.cpp@49@definition@F????@LOC:4 COM:0 MVG:0@?@d@ +CCCC_Member@BaseSqlTableModel@setMultiColumnFilter@@(const QString &)@ +CCCC_MemExt@BaseSqlTableModel@setMultiColumnFilter@@(const QString &)@./ui/models/base_sql_table_model.cpp@54@definition@F????@LOC:9 COM:0 MVG:2@?@d@ +CCCC_Member@BaseSqlTableModel@setTable@@(const QString &)@ +CCCC_MemExt@BaseSqlTableModel@setTable@@(const QString &)@./ui/models/base_sql_table_model.cpp@44@definition@F????@LOC:4 COM:0 MVG:0@?@d@ +CCCC_Member@BaseSqlTableRepository@BaseSqlTableRepository@@(QSqlDatabase &,QObject *)@ +CCCC_MemExt@BaseSqlTableRepository@BaseSqlTableRepository@@(QSqlDatabase &,QObject *)@./data/sql/base_sql_table_repository.cpp@6@definition@F????@LOC:9 COM:0 MVG:1@?@d@ +CCCC_Member@BaseSqlTableRepository@foreignKeysOnQuery@@()@ +CCCC_MemExt@BaseSqlTableRepository@foreignKeysOnQuery@@()@./data/sql/base_sql_table_repository.cpp@16@definition@T????@LOC:7 COM:0 MVG:2@?@d@ +CCCC_Member@DatabaseManager@connectToDefaultDatabase@@(const QString &)@ +CCCC_MemExt@DatabaseManager@connectToDefaultDatabase@@(const QString &)@./core/db/database_manager.cpp@67@definition@F????@LOC:18 COM:1 MVG:6@?@d@ +CCCC_Member@DatabaseManager@createDefaultDatabaseIfMissing@@(const QString &)@ +CCCC_MemExt@DatabaseManager@createDefaultDatabaseIfMissing@@(const QString &)@./core/db/database_manager.cpp@20@definition@F????@LOC:35 COM:1 MVG:8@?@d@ +CCCC_Member@DatabaseManager@disconnectDefaultDatabase@@()@ +CCCC_MemExt@DatabaseManager@disconnectDefaultDatabase@@()@./core/db/database_manager.cpp@92@definition@F????@LOC:7 COM:0 MVG:1@?@d@ +CCCC_Member@DatabaseManager@executeSqlFiles@@(const QStringList &,QSqlDatabase &)@ +CCCC_MemExt@DatabaseManager@executeSqlFiles@@(const QStringList &,QSqlDatabase &)@./core/db/database_manager.cpp@100@definition@F????@LOC:12 COM:0 MVG:4@?@d@ +CCCC_Member@DatabaseManager@~DatabaseManager@@()@ +CCCC_MemExt@DatabaseManager@~DatabaseManager@@()@./core/db/database_manager.cpp@9@definition@F????@LOC:7 COM:0 MVG:0@?@d@ +CCCC_Member@DateTimeDelegate@DateTimeDelegate@@(QObject *)@ +CCCC_MemExt@DateTimeDelegate@DateTimeDelegate@@(QObject *)@./ui/delegates/date_time_delegate.cpp@3@definition@F????@LOC:2 COM:0 MVG:0@?@d@ +CCCC_Member@DateTimeDelegate@displayText@@(const QVariant &,const QLocale &)@ +CCCC_MemExt@DateTimeDelegate@displayText@@(const QVariant &,const QLocale &)@./ui/delegates/date_time_delegate.cpp@6@definition@T????@LOC:12 COM:2 MVG:4@?@d@ +CCCC_Member@DateTimeGenerator@DateTimeGenerator@@(const QPair &,const QPair &)@ +CCCC_MemExt@DateTimeGenerator@DateTimeGenerator@@(const QPair &,const QPair &)@./core/services/date_time_generator.cpp@3@definition@F????@LOC:22 COM:0 MVG:6@?@d@ +CCCC_Member@DateTimeGenerator@generate@@(const QDateTime &)@ +CCCC_MemExt@DateTimeGenerator@generate@@(const QDateTime &)@./core/services/date_time_generator.cpp@29@definition@F????@LOC:20 COM:0 MVG:2@?@d@ +CCCC_Member@DateTimeGenerator@generate@@(const QDateTime &,const QDateTime &)@ +CCCC_MemExt@DateTimeGenerator@generate@@(const QDateTime &,const QDateTime &)@./core/services/date_time_generator.cpp@56@definition@F????@LOC:16 COM:0 MVG:4@?@d@ +CCCC_Member@DayManager@DayManager@@(const QTime &,const QTime &)@ +CCCC_MemExt@DayManager@DayManager@@(const QTime &,const QTime &)@./core/utils/day_manager.cpp@6@definition@F????@LOC:3 COM:0 MVG:0@?@d@ +CCCC_Member@DayManager@addAvailableSlot@@(const QTime &,const QTime &)@ +CCCC_MemExt@DayManager@addAvailableSlot@@(const QTime &,const QTime &)@./core/utils/day_manager.cpp@10@definition@F????@LOC:9 COM:0 MVG:5@?@d@ +CCCC_Member@DayManager@calculatePossibleReservations@@(qint64)@ +CCCC_MemExt@DayManager@calculatePossibleReservations@@(qint64)@./core/utils/day_manager.cpp@207@definition@T????@LOC:9 COM:0 MVG:2@?@d@ +CCCC_Member@DayManager@duration@@()@ +CCCC_MemExt@DayManager@duration@@()@./core/utils/day_manager.cpp@217@definition@T????@LOC:12 COM:1 MVG:4@?@d@ +CCCC_Member@DayManager@duration@@(const QTime &)@ +CCCC_MemExt@DayManager@duration@@(const QTime &)@./core/utils/day_manager.cpp@233@definition@T????@LOC:12 COM:0 MVG:5@?@d@ +CCCC_Member@DayManager@isAvailable@@(...)@ +CCCC_MemExt@DayManager@isAvailable@@(...)@./core/utils/day_manager.cpp@42@definition@T????@LOC:6 COM:0 MVG:3@?@d@ +CCCC_Member@DayManager@reserve@@(const QTime &)@ +CCCC_MemExt@DayManager@reserve@@(const QTime &)@./core/utils/day_manager.cpp@20@definition@F????@LOC:17 COM:0 MVG:7@?@d@ +CCCC_Member@DayManager@reserveAvailableSlot@@(QTime,qint64)@ +CCCC_MemExt@DayManager@reserveAvailableSlot@@(QTime,qint64)@./core/utils/day_manager.cpp@119@definition@F????@LOC:14 COM:0 MVG:5@?@d@ +CCCC_Member@DayManager@reserveAvailableSlotLeft@@(QTime,qint64)@ +CCCC_MemExt@DayManager@reserveAvailableSlotLeft@@(QTime,qint64)@./core/utils/day_manager.cpp@60@definition@F????@LOC:10 COM:0 MVG:2@?@d@ +CCCC_Member@DayManager@reserveAvailableSlotRandom@@(QTime,qint64)@ +CCCC_MemExt@DayManager@reserveAvailableSlotRandom@@(QTime,qint64)@./core/utils/day_manager.cpp@86@definition@F????@LOC:24 COM:1 MVG:6@?@d@ +CCCC_Member@DayManager@reserveAvailableSlotRight@@(QTime,qint64)@ +CCCC_MemExt@DayManager@reserveAvailableSlotRight@@(QTime,qint64)@./core/utils/day_manager.cpp@73@definition@F????@LOC:10 COM:0 MVG:2@?@d@ +CCCC_Member@DayManager@reserveImpl@@(qint64)@ +CCCC_MemExt@DayManager@reserveImpl@@(qint64)@./core/utils/day_manager.cpp@182@definition@F????@LOC:15 COM:0 MVG:6@?@d@ +CCCC_Member@DayManager@reserveImplMaximal@@(qint64)@ +CCCC_MemExt@DayManager@reserveImplMaximal@@(qint64)@./core/utils/day_manager.cpp@134@definition@F????@LOC:11 COM:0 MVG:4@?@d@ +CCCC_Member@DayManager@reserveImplMinimal@@(qint64)@ +CCCC_MemExt@DayManager@reserveImplMinimal@@(qint64)@./core/utils/day_manager.cpp@147@definition@F????@LOC:12 COM:0 MVG:4@?@d@ +CCCC_Member@DayManager@reserveImplQuick@@(qint64)@ +CCCC_MemExt@DayManager@reserveImplQuick@@(qint64)@./core/utils/day_manager.cpp@161@definition@F????@LOC:8 COM:0 MVG:4@?@d@ +CCCC_Member@DayManager@reserveImplRandom@@(qint64)@ +CCCC_MemExt@DayManager@reserveImplRandom@@(qint64)@./core/utils/day_manager.cpp@171@definition@F????@LOC:9 COM:0 MVG:3@?@d@ +CCCC_Member@DayManager@setMinDuration@@(const QTime &)@ +CCCC_MemExt@DayManager@setMinDuration@@(const QTime &)@./core/utils/day_manager.cpp@198@definition@F????@LOC:7 COM:0 MVG:2@?@d@ +CCCC_Member@DayManagerTest@testAddAvailableSlot@@()@ +CCCC_MemExt@DayManagerTest@testAddAvailableSlot@@()@./tests_class/day_manager_test.cpp@18@definition@F????@LOC:7 COM:0 MVG:0@?@d@ +CCCC_Member@DayManagerTest@testDuration@@()@ +CCCC_MemExt@DayManagerTest@testDuration@@()@./tests_class/day_manager_test.cpp@27@definition@F????@LOC:8 COM:1 MVG:0@?@d@ +CCCC_Member@DayManagerTest@testReserveFailure@@()@ +CCCC_MemExt@DayManagerTest@testReserveFailure@@()@./tests_class/day_manager_test.cpp@145@definition@F????@LOC:22 COM:0 MVG:0@?@d@ +CCCC_Member@DayManagerTest@testReserveImplMaximal@@()@ +CCCC_MemExt@DayManagerTest@testReserveImplMaximal@@()@./tests_class/day_manager_test.cpp@56@definition@F????@LOC:22 COM:3 MVG:0@?@d@ +CCCC_Member@DayManagerTest@testReserveImplMinimal@@()@ +CCCC_MemExt@DayManagerTest@testReserveImplMinimal@@()@./tests_class/day_manager_test.cpp@84@definition@F????@LOC:22 COM:3 MVG:0@?@d@ +CCCC_Member@DayManagerTest@testReserveImplQuick@@()@ +CCCC_MemExt@DayManagerTest@testReserveImplQuick@@()@./tests_class/day_manager_test.cpp@39@definition@F????@LOC:13 COM:0 MVG:1@?@d@ +CCCC_Member@DayManagerTest@testReserveImplRandom@@()@ +CCCC_MemExt@DayManagerTest@testReserveImplRandom@@()@./tests_class/day_manager_test.cpp@112@definition@F????@LOC:11 COM:0 MVG:1@?@d@ +CCCC_Member@DayManagerTest@testReserveSuccess@@()@ +CCCC_MemExt@DayManagerTest@testReserveSuccess@@()@./tests_class/day_manager_test.cpp@126@definition@F????@LOC:16 COM:0 MVG:0@?@d@ +CCCC_Member@DirectoriesManagementWidget@DirectoriesManagementWidget@@(QWidget *)@ +CCCC_MemExt@DirectoriesManagementWidget@DirectoriesManagementWidget@@(QWidget *)@./ui/widgets/directories_management_widget.cpp@26@definition@F????@LOC:10 COM:7 MVG:0@?@d@ +CCCC_Member@DirectoriesManagementWidget@initializeModels@@()@ +CCCC_MemExt@DirectoriesManagementWidget@initializeModels@@()@./ui/widgets/directories_management_widget.cpp@58@definition@F????@LOC:14 COM:0 MVG:3@?@d@ +CCCC_Member@DirectoriesManagementWidget@initializeRepositories@@()@ +CCCC_MemExt@DirectoriesManagementWidget@initializeRepositories@@()@./ui/widgets/directories_management_widget.cpp@38@definition@F????@LOC:15 COM:0 MVG:3@?@d@ +CCCC_Member@DirectoriesManagementWidget@onGenreFieldRetrieved@@(const QSqlField &)@ +CCCC_MemExt@DirectoriesManagementWidget@onGenreFieldRetrieved@@(const QSqlField &)@./ui/widgets/directories_management_widget.cpp@144@definition@F????@LOC:4 COM:0 MVG:0@?@d@ +CCCC_Member@DirectoriesManagementWidget@onPushButtonAddGenreClicked@@()@ +CCCC_MemExt@DirectoriesManagementWidget@onPushButtonAddGenreClicked@@()@./ui/widgets/directories_management_widget.cpp@149@definition@F????@LOC:10 COM:0 MVG:1@?@d@ +CCCC_Member@DirectoriesManagementWidget@onPushButtonAddHallClicked@@()@ +CCCC_MemExt@DirectoriesManagementWidget@onPushButtonAddHallClicked@@()@./ui/widgets/directories_management_widget.cpp@129@definition@F????@LOC:12 COM:0 MVG:1@?@d@ +CCCC_Member@DirectoriesManagementWidget@onPushButtonAddMovieClicked@@()@ +CCCC_MemExt@DirectoriesManagementWidget@onPushButtonAddMovieClicked@@()@./ui/widgets/directories_management_widget.cpp@108@definition@F????@LOC:17 COM:0 MVG:2@?@d@ +CCCC_Member@DirectoriesManagementWidget@setupConnections@@()@ +CCCC_MemExt@DirectoriesManagementWidget@setupConnections@@()@./ui/widgets/directories_management_widget.cpp@94@definition@F????@LOC:10 COM:0 MVG:0@?@d@ +CCCC_Member@DirectoriesManagementWidget@setupGenreFinder@@()@ +CCCC_MemExt@DirectoriesManagementWidget@setupGenreFinder@@()@./ui/widgets/directories_management_widget.cpp@77@definition@F????@LOC:7 COM:0 MVG:0@?@d@ +CCCC_Member@DirectoriesManagementWidget@setupTableViews@@()@ +CCCC_MemExt@DirectoriesManagementWidget@setupTableViews@@()@./ui/widgets/directories_management_widget.cpp@86@definition@F????@LOC:5 COM:0 MVG:0@?@d@ +CCCC_Member@EntityDeleterWidget@EntityDeleterWidget@@(QWidget *)@ +CCCC_MemExt@EntityDeleterWidget@EntityDeleterWidget@@(QWidget *)@./ui/widgets/entity_deleter_widget.cpp@15@definition@F????@LOC:6 COM:0 MVG:0@?@d@ +CCCC_Member@EntityDeleterWidget@deleteEntityById@@()@ +CCCC_MemExt@EntityDeleterWidget@deleteEntityById@@()@./ui/widgets/entity_deleter_widget.cpp@83@definition@F????@LOC:4 COM:0 MVG:1@?@d@ +CCCC_MemExt@EntityDeleterWidget@deleteEntityById@@()@./ui/widgets/entity_deleter_widget.cpp@90@definition@F????@LOC:4 COM:0 MVG:1@?@d@ +CCCC_MemExt@EntityDeleterWidget@deleteEntityById@@()@./ui/widgets/entity_deleter_widget.cpp@97@definition@F????@LOC:4 COM:0 MVG:1@?@d@ +CCCC_MemExt@EntityDeleterWidget@deleteEntityById@@()@./ui/widgets/entity_deleter_widget.cpp@104@definition@F????@LOC:4 COM:0 MVG:1@?@d@ +CCCC_MemExt@EntityDeleterWidget@deleteEntityById@@()@./ui/widgets/entity_deleter_widget.cpp@111@definition@F????@LOC:4 COM:0 MVG:1@?@d@ +CCCC_MemExt@EntityDeleterWidget@deleteEntityById@@()@./ui/widgets/entity_deleter_widget.cpp@118@definition@F????@LOC:4 COM:0 MVG:1@?@d@ +CCCC_Member@EntityDeleterWidget@onComboBoxCurrentTableCurrentIndexChanged@@(int)@ +CCCC_MemExt@EntityDeleterWidget@onComboBoxCurrentTableCurrentIndexChanged@@(int)@./ui/widgets/entity_deleter_widget.cpp@61@definition@F????@LOC:7 COM:0 MVG:0@?@d@ +CCCC_Member@EntityDeleterWidget@onFieldRetrieved@@(const QSqlField &)@ +CCCC_MemExt@EntityDeleterWidget@onFieldRetrieved@@(const QSqlField &)@./ui/widgets/entity_deleter_widget.cpp@71@definition@F????@LOC:3 COM:0 MVG:0@?@d@ +CCCC_Member@EntityDeleterWidget@onPushButtonDeleteEntityClicked@@()@ +CCCC_MemExt@EntityDeleterWidget@onPushButtonDeleteEntityClicked@@()@./ui/widgets/entity_deleter_widget.cpp@123@definition@F????@LOC:28 COM:4 MVG:6@?@d@ +CCCC_Member@EntityDeleterWidget@onRecordRetrieved@@(const QSqlRecord &)@ +CCCC_MemExt@EntityDeleterWidget@onRecordRetrieved@@(const QSqlRecord &)@./ui/widgets/entity_deleter_widget.cpp@75@definition@F????@LOC:3 COM:2 MVG:0@?@d@ +CCCC_Member@EntityDeleterWidget@refreshEntityFinder@@()@ +CCCC_MemExt@EntityDeleterWidget@refreshEntityFinder@@()@./ui/widgets/entity_deleter_widget.cpp@54@definition@F????@LOC:5 COM:0 MVG:0@?@d@ +CCCC_Member@EntityDeleterWidget@setupComboBoxCurrentTable@@()@ +CCCC_MemExt@EntityDeleterWidget@setupComboBoxCurrentTable@@()@./ui/widgets/entity_deleter_widget.cpp@23@definition@F????@LOC:9 COM:0 MVG:1@?@d@ +CCCC_Member@EntityDeleterWidget@setupConnections@@()@ +CCCC_MemExt@EntityDeleterWidget@setupConnections@@()@./ui/widgets/entity_deleter_widget.cpp@35@definition@F????@LOC:10 COM:0 MVG:0@?@d@ +CCCC_Member@EntityDeleterWidget@setupEntityFinder@@()@ +CCCC_MemExt@EntityDeleterWidget@setupEntityFinder@@()@./ui/widgets/entity_deleter_widget.cpp@49@definition@F????@LOC:4 COM:0 MVG:0@?@d@ +CCCC_Member@EntityDeleterWidget@showMessageDialog@@(const RepositoryResult &,const QString &)@ +CCCC_MemExt@EntityDeleterWidget@showMessageDialog@@(const RepositoryResult &,const QString &)@./ui/widgets/entity_deleter_widget.cpp@172@definition@F????@LOC:8 COM:0 MVG:1@?@d@ +CCCC_Member@EntityFinderWidget@EntityFinderWidget@@(QWidget *)@ +CCCC_MemExt@EntityFinderWidget@EntityFinderWidget@@(QWidget *)@./ui/widgets/entity_finder_widget.cpp@8@definition@F????@LOC:5 COM:0 MVG:0@?@d@ +CCCC_Member@EntityFinderWidget@EntityFinderWidget@@(const QString &,const QString &,QWidget *)@ +CCCC_MemExt@EntityFinderWidget@EntityFinderWidget@@(const QString &,const QString &,QWidget *)@./ui/widgets/entity_finder_widget.cpp@15@definition@F????@LOC:7 COM:0 MVG:0@?@d@ +CCCC_Member@EntityFinderWidget@onFieldRetrieved@@(const QSqlField &)@ +CCCC_MemExt@EntityFinderWidget@onFieldRetrieved@@(const QSqlField &)@./ui/widgets/entity_finder_widget.cpp@111@definition@F????@LOC:3 COM:0 MVG:0@?@d@ +CCCC_Member@EntityFinderWidget@onPushButtonFindEntityClicked@@()@ +CCCC_MemExt@EntityFinderWidget@onPushButtonFindEntityClicked@@()@./ui/widgets/entity_finder_widget.cpp@85@definition@F????@LOC:10 COM:1 MVG:0@?@d@ +CCCC_Member@EntityFinderWidget@onRecordRetrieved@@(const QSqlRecord &)@ +CCCC_MemExt@EntityFinderWidget@onRecordRetrieved@@(const QSqlRecord &)@./ui/widgets/entity_finder_widget.cpp@106@definition@F????@LOC:4 COM:0 MVG:0@?@d@ +CCCC_Member@EntityFinderWidget@onRowSelected@@(int)@ +CCCC_MemExt@EntityFinderWidget@onRowSelected@@(int)@./ui/widgets/entity_finder_widget.cpp@102@definition@F????@LOC:3 COM:0 MVG:0@?@d@ +CCCC_Member@EntityFinderWidget@refreshLineEditText@@(const QSqlRecord &)@ +CCCC_MemExt@EntityFinderWidget@refreshLineEditText@@(const QSqlRecord &)@./ui/widgets/entity_finder_widget.cpp@42@definition@F????@LOC:12 COM:0 MVG:1@?@d@ +CCCC_Member@EntityFinderWidget@resetToDefault@@()@ +CCCC_MemExt@EntityFinderWidget@resetToDefault@@()@./ui/widgets/entity_finder_widget.cpp@77@definition@F????@LOC:6 COM:0 MVG:0@?@d@ +CCCC_Member@EntityFinderWidget@setDefaultRelation@@(const QString &)@ +CCCC_MemExt@EntityFinderWidget@setDefaultRelation@@(const QString &)@./ui/widgets/entity_finder_widget.cpp@59@definition@F????@LOC:7 COM:0 MVG:0@?@d@ +CCCC_Member@EntityFinderWidget@setHiddenFrame@@(bool)@ +CCCC_MemExt@EntityFinderWidget@setHiddenFrame@@(bool)@./ui/widgets/entity_finder_widget.cpp@23@definition@F????@LOC:15 COM:0 MVG:3@?@d@ +CCCC_Member@EntityFinderWidget@setupConnections@@()@ +CCCC_MemExt@EntityFinderWidget@setupConnections@@()@./ui/widgets/entity_finder_widget.cpp@68@definition@F????@LOC:4 COM:0 MVG:0@?@d@ +CCCC_Member@EntityFinderWidget@setupFrameStyle@@()@ +CCCC_MemExt@EntityFinderWidget@setupFrameStyle@@()@./ui/widgets/entity_finder_widget.cpp@73@definition@F????@LOC:3 COM:0 MVG:0@?@d@ +CCCC_Member@EntityUpdaterWidget@EntityUpdaterWidget@@(QWidget *)@ +CCCC_MemExt@EntityUpdaterWidget@EntityUpdaterWidget@@(QWidget *)@./ui/widgets/entity_updater_widget.cpp@33@definition@FT???@LOC:8 COM:1 MVG:0@?@d@ +CCCC_Member@EntityUpdaterWidget@actualColumnValue@@(const QString &)@ +CCCC_MemExt@EntityUpdaterWidget@actualColumnValue@@(const QString &)@./ui/widgets/entity_updater_widget.cpp@145@definition@FT???@LOC:7 COM:0 MVG:2@?@d@ +CCCC_MemExt@EntityUpdaterWidget@actualColumnValue@@(const QString &)@./ui/widgets/entity_updater_widget.cpp@155@definition@FT???@LOC:7 COM:0 MVG:2@?@d@ +CCCC_MemExt@EntityUpdaterWidget@actualColumnValue@@(const QString &)@./ui/widgets/entity_updater_widget.cpp@165@definition@FT???@LOC:7 COM:0 MVG:2@?@d@ +CCCC_MemExt@EntityUpdaterWidget@actualColumnValue@@(const QString &)@./ui/widgets/entity_updater_widget.cpp@175@definition@FT???@LOC:7 COM:0 MVG:2@?@d@ +CCCC_Member@EntityUpdaterWidget@actualForeignKey@@(const QString &)@ +CCCC_MemExt@EntityUpdaterWidget@actualForeignKey@@(const QString &)@./ui/widgets/entity_updater_widget.cpp@184@definition@FT???@LOC:7 COM:0 MVG:2@?@d@ +CCCC_Member@EntityUpdaterWidget@configureForeignKeyFinder@@(const QString &)@ +CCCC_MemExt@EntityUpdaterWidget@configureForeignKeyFinder@@(const QString &)@./ui/widgets/entity_updater_widget.cpp@115@definition@FT???@LOC:5 COM:0 MVG:0@?@d@ +CCCC_Member@EntityUpdaterWidget@configureForeignKeyFinder@@(const QString &,const QString &)@ +CCCC_MemExt@EntityUpdaterWidget@configureForeignKeyFinder@@(const QString &,const QString &)@./ui/widgets/entity_updater_widget.cpp@92@definition@FT???@LOC:16 COM:2 MVG:4@?@d@ +CCCC_Member@EntityUpdaterWidget@configurePrimaryKeyFinder@@(const QString &)@ +CCCC_MemExt@EntityUpdaterWidget@configurePrimaryKeyFinder@@(const QString &)@./ui/widgets/entity_updater_widget.cpp@121@definition@FT???@LOC:5 COM:0 MVG:0@?@d@ +CCCC_Member@EntityUpdaterWidget@findIndexByColumn@@(QAbstractItemModel *,int,const QVariant &)@ +CCCC_MemExt@EntityUpdaterWidget@findIndexByColumn@@(QAbstractItemModel *,int,const QVariant &)@./ui/widgets/entity_updater_widget.cpp@430@definition@FT???@LOC:13 COM:0 MVG:8@?@d@ +CCCC_Member@EntityUpdaterWidget@isColumnsEqual@@(const QString &)@ +CCCC_MemExt@EntityUpdaterWidget@isColumnsEqual@@(const QString &)@./ui/widgets/entity_updater_widget.cpp@446@definition@FT???@LOC:8 COM:0 MVG:2@?@d@ +CCCC_Member@EntityUpdaterWidget@onColumnSelected@@(int)@ +CCCC_MemExt@EntityUpdaterWidget@onColumnSelected@@(int)@./ui/widgets/entity_updater_widget.cpp@394@definition@FT???@LOC:31 COM:0 MVG:8@?@d@ +CCCC_Member@EntityUpdaterWidget@onForeignFieldRetrieved@@(const QSqlField &)@ +CCCC_MemExt@EntityUpdaterWidget@onForeignFieldRetrieved@@(const QSqlField &)@./ui/widgets/entity_updater_widget.cpp@133@definition@FT???@LOC:5 COM:0 MVG:0@?@d@ +CCCC_Member@EntityUpdaterWidget@onPrimaryEntityRetrieved@@(const QSqlRecord &)@ +CCCC_MemExt@EntityUpdaterWidget@onPrimaryEntityRetrieved@@(const QSqlRecord &)@./ui/widgets/entity_updater_widget.cpp@139@definition@FT???@LOC:4 COM:0 MVG:0@?@d@ +CCCC_Member@EntityUpdaterWidget@onPrimaryFieldRetrieved@@(const QSqlField &)@ +CCCC_MemExt@EntityUpdaterWidget@onPrimaryFieldRetrieved@@(const QSqlField &)@./ui/widgets/entity_updater_widget.cpp@127@definition@FT???@LOC:5 COM:0 MVG:0@?@d@ +CCCC_Member@EntityUpdaterWidget@onPushButtonUpdateClicked@@()@ +CCCC_MemExt@EntityUpdaterWidget@onPushButtonUpdateClicked@@()@./ui/widgets/entity_updater_widget.cpp@335@definition@FT???@LOC:23 COM:0 MVG:6@?@d@ +CCCC_Member@EntityUpdaterWidget@onTableSelected@@(int)@ +CCCC_MemExt@EntityUpdaterWidget@onTableSelected@@(int)@./ui/widgets/entity_updater_widget.cpp@368@definition@FT???@LOC:19 COM:1 MVG:2@?@d@ +CCCC_Member@EntityUpdaterWidget@processEntityUpdate@@(RepositoryResult &)@ +CCCC_MemExt@EntityUpdaterWidget@processEntityUpdate@@(RepositoryResult &)@./ui/widgets/entity_updater_widget.cpp@264@definition@FT???@LOC:10 COM:0 MVG:2@?@d@ +CCCC_MemExt@EntityUpdaterWidget@processEntityUpdate@@(RepositoryResult &)@./ui/widgets/entity_updater_widget.cpp@276@definition@FT???@LOC:10 COM:0 MVG:2@?@d@ +CCCC_MemExt@EntityUpdaterWidget@processEntityUpdate@@(RepositoryResult &)@./ui/widgets/entity_updater_widget.cpp@288@definition@FT???@LOC:10 COM:0 MVG:2@?@d@ +CCCC_MemExt@EntityUpdaterWidget@processEntityUpdate@@(RepositoryResult &)@./ui/widgets/entity_updater_widget.cpp@300@definition@FT???@LOC:10 COM:0 MVG:2@?@d@ +CCCC_MemExt@EntityUpdaterWidget@processEntityUpdate@@(RepositoryResult &)@./ui/widgets/entity_updater_widget.cpp@312@definition@FT???@LOC:10 COM:0 MVG:2@?@d@ +CCCC_MemExt@EntityUpdaterWidget@processEntityUpdate@@(RepositoryResult &)@./ui/widgets/entity_updater_widget.cpp@324@definition@FT???@LOC:10 COM:0 MVG:2@?@d@ +CCCC_Member@EntityUpdaterWidget@processUpdateResult@@(const RepositoryResult &)@ +CCCC_MemExt@EntityUpdaterWidget@processUpdateResult@@(const RepositoryResult &)@./ui/widgets/entity_updater_widget.cpp@459@definition@FT???@LOC:18 COM:0 MVG:2@?@d@ +CCCC_Member@EntityUpdaterWidget@setupChildEntityFinderWidget@@()@ +CCCC_MemExt@EntityUpdaterWidget@setupChildEntityFinderWidget@@()@./ui/widgets/entity_updater_widget.cpp@77@definition@FT???@LOC:7 COM:0 MVG:0@?@d@ +CCCC_Member@EntityUpdaterWidget@setupComboBoxCurrentTable@@()@ +CCCC_MemExt@EntityUpdaterWidget@setupComboBoxCurrentTable@@()@./ui/widgets/entity_updater_widget.cpp@43@definition@FT???@LOC:11 COM:0 MVG:1@?@d@ +CCCC_Member@EntityUpdaterWidget@setupConnections@@()@ +CCCC_MemExt@EntityUpdaterWidget@setupConnections@@()@./ui/widgets/entity_updater_widget.cpp@57@definition@FT???@LOC:14 COM:0 MVG:0@?@d@ +CCCC_Member@EntityUpdaterWidget@setupParentEntityFinderWidget@@()@ +CCCC_MemExt@EntityUpdaterWidget@setupParentEntityFinderWidget@@()@./ui/widgets/entity_updater_widget.cpp@85@definition@FT???@LOC:6 COM:0 MVG:0@?@d@ +CCCC_Member@EntityUpdaterWidget@showMessageDialog@@(const RepositoryResult &,const QString &)@ +CCCC_MemExt@EntityUpdaterWidget@showMessageDialog@@(const RepositoryResult &,const QString &)@./ui/widgets/entity_updater_widget.cpp@484@definition@FT???@LOC:8 COM:0 MVG:1@?@d@ +CCCC_Member@EntityUpdaterWidget@updateEntity@@()@ +CCCC_MemExt@EntityUpdaterWidget@updateEntity@@()@./ui/widgets/entity_updater_widget.cpp@195@definition@FT???@LOC:6 COM:0 MVG:1@?@d@ +CCCC_MemExt@EntityUpdaterWidget@updateEntity@@()@./ui/widgets/entity_updater_widget.cpp@204@definition@FT???@LOC:7 COM:0 MVG:1@?@d@ +CCCC_MemExt@EntityUpdaterWidget@updateEntity@@()@./ui/widgets/entity_updater_widget.cpp@215@definition@FT???@LOC:8 COM:0 MVG:1@?@d@ +CCCC_MemExt@EntityUpdaterWidget@updateEntity@@()@./ui/widgets/entity_updater_widget.cpp@227@definition@FT???@LOC:8 COM:0 MVG:1@?@d@ +CCCC_MemExt@EntityUpdaterWidget@updateEntity@@()@./ui/widgets/entity_updater_widget.cpp@239@definition@FT???@LOC:10 COM:0 MVG:1@?@d@ +CCCC_MemExt@EntityUpdaterWidget@updateEntity@@()@./ui/widgets/entity_updater_widget.cpp@253@definition@FT???@LOC:8 COM:0 MVG:1@?@d@ +CCCC_Member@ErrorDialog@displayError@@(QWidget *,const QString &)@ +CCCC_MemExt@ErrorDialog@displayError@@(QWidget *,const QString &)@./ui/dialogs/error_dialog.cpp@39@definition@F????@LOC:28 COM:0 MVG:6@?@d@ +CCCC_Member@ErrorDialog@getDetailedMessage@@(int)@ +CCCC_MemExt@ErrorDialog@getDetailedMessage@@(int)@./ui/dialogs/error_dialog.cpp@199@definition@F????@LOC:19 COM:0 MVG:8@?@d@ +CCCC_Member@ErrorDialog@getDialog@@(QWidget *,const QString &)@ +CCCC_MemExt@ErrorDialog@getDialog@@(QWidget *,const QString &)@./ui/dialogs/error_dialog.cpp@9@definition@F????@LOC:15 COM:7 MVG:2@?@d@ +CCCC_Member@ErrorDialog@handleCheckConstraint@@(const QString &)@ +CCCC_MemExt@ErrorDialog@handleCheckConstraint@@(const QString &)@./ui/dialogs/error_dialog.cpp@169@definition@F????@LOC:28 COM:0 MVG:17@?@d@ +CCCC_Member@ErrorDialog@handleForeignKeyConstraint@@(const QString &)@ +CCCC_MemExt@ErrorDialog@handleForeignKeyConstraint@@(const QString &)@./ui/dialogs/error_dialog.cpp@144@definition@F????@LOC:19 COM:0 MVG:11@?@d@ +CCCC_Member@ErrorDialog@handleNotFoundErrors@@(const QString &)@ +CCCC_MemExt@ErrorDialog@handleNotFoundErrors@@(const QString &)@./ui/dialogs/error_dialog.cpp@75@definition@F????@LOC:21 COM:1 MVG:13@?@d@ +CCCC_Member@ErrorDialog@handlePrimaryKeyConstraint@@()@ +CCCC_MemExt@ErrorDialog@handlePrimaryKeyConstraint@@()@./ui/dialogs/error_dialog.cpp@165@definition@F????@LOC:3 COM:0 MVG:1@?@d@ +CCCC_Member@ErrorDialog@handleSqlConstraints@@(const QString &)@ +CCCC_MemExt@ErrorDialog@handleSqlConstraints@@(const QString &)@./ui/dialogs/error_dialog.cpp@99@definition@F????@LOC:19 COM:0 MVG:11@?@d@ +CCCC_Member@ErrorDialog@handleUniqueConstraint@@(const QString &)@ +CCCC_MemExt@ErrorDialog@handleUniqueConstraint@@(const QString &)@./ui/dialogs/error_dialog.cpp@120@definition@F????@LOC:22 COM:0 MVG:13@?@d@ +CCCC_Member@ExecuteSqlFile@ExecuteSqlFile@@(QSqlDatabase &)@ +CCCC_MemExt@ExecuteSqlFile@ExecuteSqlFile@@(QSqlDatabase &)@./core/db/execute_sql_file.cpp@5@definition@F????@LOC:3 COM:2 MVG:0@?@d@ +CCCC_Member@ExecuteSqlFile@executeStatement@@(const QString &)@ +CCCC_MemExt@ExecuteSqlFile@executeStatement@@(const QString &)@./core/db/execute_sql_file.cpp@101@definition@T????@LOC:8 COM:0 MVG:3@?@d@ +CCCC_Member@ExecuteSqlFile@filterLine@@(QString &)@ +CCCC_MemExt@ExecuteSqlFile@filterLine@@(QString &)@./core/db/execute_sql_file.cpp@96@definition@F????@LOC:4 COM:2 MVG:1@?@d@ +CCCC_Member@ExecuteSqlFile@operator ()@@(const QString &)@ +CCCC_MemExt@ExecuteSqlFile@operator ()@@(const QString &)@./core/db/execute_sql_file.cpp@10@definition@F????@LOC:17 COM:1 MVG:5@?@d@ +CCCC_Member@ExecuteSqlFile@processDelimiterChange@@(QString &)@ +CCCC_MemExt@ExecuteSqlFile@processDelimiterChange@@(QString &)@./core/db/execute_sql_file.cpp@86@definition@F????@LOC:9 COM:1 MVG:3@?@d@ +CCCC_Member@ExecuteSqlFile@processLine@@(QString &,QString &)@ +CCCC_MemExt@ExecuteSqlFile@processLine@@(QString &,QString &)@./core/db/execute_sql_file.cpp@52@definition@F????@LOC:26 COM:3 MVG:9@?@d@ +CCCC_Member@ExecuteSqlFile@processStatements@@(QStringList &)@ +CCCC_MemExt@ExecuteSqlFile@processStatements@@(QStringList &)@./core/db/execute_sql_file.cpp@34@definition@F????@LOC:13 COM:1 MVG:7@?@d@ +CCCC_Member@FileReader@read@@(const string &,string &)@ +CCCC_MemExt@FileReader@read@@(const string &,string &)@./tests_schema/tests_sources/file_reader.cpp@8@definition@F????@LOC:12 COM:2 MVG:3@?@d@ +CCCC_Member@GenresModel@GenresModel@@(QObject *,const QSqlDatabase &)@ +CCCC_MemExt@GenresModel@GenresModel@@(QObject *,const QSqlDatabase &)@./ui/models/genres_model.cpp@5@definition@F????@LOC:2 COM:0 MVG:0@?@d@ +CCCC_Member@GenresModel@headerData@@(int,Orientation,int)@ +CCCC_MemExt@GenresModel@headerData@@(int,Orientation,int)@./ui/models/genres_model.cpp@19@definition@T????@LOC:14 COM:0 MVG:7@?@d@ +CCCC_Member@GenresModel@initialize@@()@ +CCCC_MemExt@GenresModel@initialize@@()@./ui/models/genres_model.cpp@8@definition@F????@LOC:8 COM:0 MVG:1@?@d@ +CCCC_Member@GenresRepository@GenresRepository@@(QSqlDatabase &,QObject *)@ +CCCC_MemExt@GenresRepository@GenresRepository@@(QSqlDatabase &,QObject *)@./data/sql/genres_repository.cpp@10@definition@F????@LOC:2 COM:0 MVG:0@?@d@ +CCCC_Member@GenresRepository@createGenre@@(const CreateGenreRequest &)@ +CCCC_MemExt@GenresRepository@createGenre@@(const CreateGenreRequest &)@./data/sql/genres_repository.cpp@14@definition@F????@LOC:10 COM:0 MVG:3@?@d@ +CCCC_Member@GenresRepository@deleteGenreById@@(qint32)@ +CCCC_MemExt@GenresRepository@deleteGenreById@@(qint32)@./data/sql/genres_repository.cpp@80@definition@F????@LOC:10 COM:0 MVG:3@?@d@ +CCCC_Member@GenresRepository@getAllGenres@@(QVector &)@ +CCCC_MemExt@GenresRepository@getAllGenres@@(QVector &)@./data/sql/genres_repository.cpp@48@definition@T????@LOC:12 COM:0 MVG:4@?@d@ +CCCC_Member@GenresRepository@getGenreById@@(qint32,GenreDTO &)@ +CCCC_MemExt@GenresRepository@getGenreById@@(qint32,GenreDTO &)@./data/sql/genres_repository.cpp@27@definition@T????@LOC:16 COM:0 MVG:5@?@d@ +CCCC_Member@GenresRepository@mapQueryToDTO@@(const QSqlQuery &)@ +CCCC_MemExt@GenresRepository@mapQueryToDTO@@(const QSqlQuery &)@./data/sql/genres_repository.cpp@93@definition@T????@LOC:6 COM:0 MVG:1@?@d@ +CCCC_Member@GenresRepository@updateGenre@@(const UpdateGenreRequest &)@ +CCCC_MemExt@GenresRepository@updateGenre@@(const UpdateGenreRequest &)@./data/sql/genres_repository.cpp@65@definition@F????@LOC:12 COM:0 MVG:3@?@d@ +CCCC_Member@HallsModel@HallsModel@@(QObject *,const QSqlDatabase &)@ +CCCC_MemExt@HallsModel@HallsModel@@(QObject *,const QSqlDatabase &)@./ui/models/halls_model.cpp@5@definition@F????@LOC:2 COM:0 MVG:0@?@d@ +CCCC_Member@HallsModel@headerData@@(int,Orientation,int)@ +CCCC_MemExt@HallsModel@headerData@@(int,Orientation,int)@./ui/models/halls_model.cpp@20@definition@T????@LOC:16 COM:0 MVG:8@?@d@ +CCCC_Member@HallsModel@initialize@@()@ +CCCC_MemExt@HallsModel@initialize@@()@./ui/models/halls_model.cpp@8@definition@F????@LOC:8 COM:0 MVG:1@?@d@ +CCCC_Member@HallsRepository@HallsRepository@@(QSqlDatabase &,QObject *)@ +CCCC_MemExt@HallsRepository@HallsRepository@@(QSqlDatabase &,QObject *)@./data/sql/halls_repository.cpp@10@definition@F????@LOC:2 COM:0 MVG:0@?@d@ +CCCC_Member@HallsRepository@createHall@@(const CreateHallRequest &)@ +CCCC_MemExt@HallsRepository@createHall@@(const CreateHallRequest &)@./data/sql/halls_repository.cpp@13@definition@F????@LOC:12 COM:0 MVG:3@?@d@ +CCCC_Member@HallsRepository@deleteHallById@@(qint32)@ +CCCC_MemExt@HallsRepository@deleteHallById@@(qint32)@./data/sql/halls_repository.cpp@79@definition@F????@LOC:10 COM:0 MVG:3@?@d@ +CCCC_Member@HallsRepository@getAllHalls@@(QVector &)@ +CCCC_MemExt@HallsRepository@getAllHalls@@(QVector &)@./data/sql/halls_repository.cpp@47@definition@T????@LOC:12 COM:0 MVG:4@?@d@ +CCCC_Member@HallsRepository@getHallById@@(qint32,HallDTO &)@ +CCCC_MemExt@HallsRepository@getHallById@@(qint32,HallDTO &)@./data/sql/halls_repository.cpp@28@definition@T????@LOC:15 COM:0 MVG:5@?@d@ +CCCC_Member@HallsRepository@mapQueryToDTO@@(const QSqlQuery &)@ +CCCC_MemExt@HallsRepository@mapQueryToDTO@@(const QSqlQuery &)@./data/sql/halls_repository.cpp@92@definition@T????@LOC:7 COM:0 MVG:1@?@d@ +CCCC_Member@HallsRepository@updateHall@@(const UpdateHallRequest &)@ +CCCC_MemExt@HallsRepository@updateHall@@(const UpdateHallRequest &)@./data/sql/halls_repository.cpp@63@definition@F????@LOC:13 COM:0 MVG:3@?@d@ +CCCC_Member@MainWindow@MainWindow@@(qint32,qint32,QWidget *)@ +CCCC_MemExt@MainWindow@MainWindow@@(qint32,qint32,QWidget *)@./ui/main_window/main_window.cpp@9@definition@F????@LOC:7 COM:2 MVG:0@?@d@ +CCCC_Member@MainWindow@configureAccessLevel@@()@ +CCCC_MemExt@MainWindow@configureAccessLevel@@()@./ui/main_window/main_window.cpp@20@definition@F????@LOC:26 COM:24 MVG:7@?@d@ +CCCC_Member@MainWindow@configureAllTableViews@@()@ +CCCC_MemExt@MainWindow@configureAllTableViews@@()@./ui/main_window/main_window.cpp@69@definition@F????@LOC:10 COM:2 MVG:2@?@d@ +CCCC_Member@MainWindow@disableSelection@@(QTableView *)@ +CCCC_MemExt@MainWindow@disableSelection@@(QTableView *)@./ui/main_window/main_window.cpp@86@definition@F????@LOC:7 COM:3 MVG:0@?@d@ +CCCC_Member@MainWindow@loadDefaultConfiguration@@(QTableView *)@ +CCCC_MemExt@MainWindow@loadDefaultConfiguration@@(QTableView *)@./ui/main_window/main_window.cpp@111@definition@F????@LOC:17 COM:6 MVG:0@?@d@ +CCCC_Member@ModelManager@ModelManager@@()@ +CCCC_MemExt@ModelManager@ModelManager@@()@./core/services/model_manager.cpp@11@definition@F????@LOC:8 COM:1 MVG:2@?@d@ +CCCC_Member@ModelManager@getModel@@(const QString &)@ +CCCC_MemExt@ModelManager@getModel@@(const QString &)@./core/services/model_manager.cpp@75@definition@T????@LOC:9 COM:0 MVG:3@?@d@ +CCCC_Member@ModelManager@initialize@@()@ +CCCC_MemExt@ModelManager@initialize@@()@./core/services/model_manager.cpp@49@definition@F????@LOC:15 COM:2 MVG:0@?@d@ +CCCC_Member@ModelManager@instance@@()@ +CCCC_MemExt@ModelManager@instance@@()@./core/services/model_manager.cpp@27@definition@F????@LOC:4 COM:0 MVG:1@?@d@ +CCCC_Member@ModelManager@registeredModelTableNames@@()@ +CCCC_MemExt@ModelManager@registeredModelTableNames@@()@./core/services/model_manager.cpp@32@definition@T????@LOC:3 COM:0 MVG:1@?@d@ +CCCC_Member@ModelManager@registeredModelTableNames@@(QString)@ +CCCC_MemExt@ModelManager@registeredModelTableNames@@(QString)@./core/services/model_manager.cpp@37@definition@T????@LOC:11 COM:0 MVG:3@?@d@ +CCCC_Member@ModelManager@resetFilter@@(const QString &)@ +CCCC_MemExt@ModelManager@resetFilter@@(const QString &)@./core/services/model_manager.cpp@86@definition@F????@LOC:4 COM:0 MVG:0@?@d@ +CCCC_Member@ModelManager@setMultiColumnFilter@@(const QString &,const QString &)@ +CCCC_MemExt@ModelManager@setMultiColumnFilter@@(const QString &,const QString &)@./core/services/model_manager.cpp@91@definition@F????@LOC:5 COM:0 MVG:0@?@d@ +CCCC_Member@ModelManager@~ModelManager@@()@ +CCCC_MemExt@ModelManager@~ModelManager@@()@./core/services/model_manager.cpp@23@definition@F????@LOC:3 COM:0 MVG:0@?@d@ +CCCC_Member@MoviesModel@MoviesModel@@(QObject *,const QSqlDatabase &)@ +CCCC_MemExt@MoviesModel@MoviesModel@@(QObject *,const QSqlDatabase &)@./ui/models/movies_model.cpp@6@definition@F????@LOC:2 COM:0 MVG:0@?@d@ +CCCC_Member@MoviesModel@buildGenreIdFilterCondition@@(const QString &,QString &)@ +CCCC_MemExt@MoviesModel@buildGenreIdFilterCondition@@(const QString &,QString &)@./ui/models/movies_model.cpp@43@definition@T????@LOC:13 COM:0 MVG:2@?@d@ +CCCC_Member@MoviesModel@createMultiColumnFilter@@(const QString &)@ +CCCC_MemExt@MoviesModel@createMultiColumnFilter@@(const QString &)@./ui/models/movies_model.cpp@60@definition@T????@LOC:14 COM:1 MVG:3@?@d@ +CCCC_Member@MoviesModel@headerData@@(int,Orientation,int)@ +CCCC_MemExt@MoviesModel@headerData@@(int,Orientation,int)@./ui/models/movies_model.cpp@24@definition@T????@LOC:18 COM:0 MVG:9@?@d@ +CCCC_Member@MoviesModel@initialize@@()@ +CCCC_MemExt@MoviesModel@initialize@@()@./ui/models/movies_model.cpp@9@definition@F????@LOC:10 COM:1 MVG:1@?@d@ +CCCC_Member@MoviesRepository@MoviesRepository@@(QSqlDatabase &,QObject *)@ +CCCC_MemExt@MoviesRepository@MoviesRepository@@(QSqlDatabase &,QObject *)@./data/sql/movies_repository.cpp@10@definition@F????@LOC:2 COM:0 MVG:0@?@d@ +CCCC_Member@MoviesRepository@createMovie@@(const CreateMovieRequest &)@ +CCCC_MemExt@MoviesRepository@createMovie@@(const CreateMovieRequest &)@./data/sql/movies_repository.cpp@14@definition@F????@LOC:13 COM:0 MVG:3@?@d@ +CCCC_Member@MoviesRepository@deleteMovieById@@(qint32)@ +CCCC_MemExt@MoviesRepository@deleteMovieById@@(qint32)@./data/sql/movies_repository.cpp@85@definition@F????@LOC:10 COM:0 MVG:3@?@d@ +CCCC_Member@MoviesRepository@getAllMovies@@(QVector &)@ +CCCC_MemExt@MoviesRepository@getAllMovies@@(QVector &)@./data/sql/movies_repository.cpp@31@definition@T????@LOC:12 COM:0 MVG:4@?@d@ +CCCC_Member@MoviesRepository@getMovieById@@(qint32,MovieDTO &)@ +CCCC_MemExt@MoviesRepository@getMovieById@@(qint32,MovieDTO &)@./data/sql/movies_repository.cpp@47@definition@T????@LOC:16 COM:0 MVG:5@?@d@ +CCCC_Member@MoviesRepository@mapQueryToDTO@@(const QSqlQuery &)@ +CCCC_MemExt@MoviesRepository@mapQueryToDTO@@(const QSqlQuery &)@./data/sql/movies_repository.cpp@98@definition@T????@LOC:8 COM:0 MVG:1@?@d@ +CCCC_Member@MoviesRepository@updateMovie@@(const UpdateMovieRequest &)@ +CCCC_MemExt@MoviesRepository@updateMovie@@(const UpdateMovieRequest &)@./data/sql/movies_repository.cpp@68@definition@F????@LOC:14 COM:0 MVG:3@?@d@ +CCCC_Member@MultiColumnSortFilterProxyModel@MultiColumnSortFilterProxyModel@@(QObject *)@ +CCCC_MemExt@MultiColumnSortFilterProxyModel@MultiColumnSortFilterProxyModel@@(QObject *)@./ui/models/multi_column_filter_proxy_model.cpp@5@definition@F????@LOC:3 COM:0 MVG:0@?@d@ +CCCC_Member@MultiColumnSortFilterProxyModel@filterAcceptsRow@@(int,const QModelIndex &)@ +CCCC_MemExt@MultiColumnSortFilterProxyModel@filterAcceptsRow@@(int,const QModelIndex &)@./ui/models/multi_column_filter_proxy_model.cpp@9@definition@T????@LOC:19 COM:0 MVG:7@?@d@ +CCCC_Member@RefundGenerator@RefundGenerator@@(const QPair &,const QPair &,const QPair &)@ +CCCC_MemExt@RefundGenerator@RefundGenerator@@(const QPair &,const QPair &,const QPair &)@./core/services/refund_generator.cpp@14@definition@F????@LOC:15 COM:4 MVG:1@?@d@ +CCCC_Member@RefundGenerator@calculateRemainingCapacity@@()@ +CCCC_MemExt@RefundGenerator@calculateRemainingCapacity@@()@./core/services/refund_generator.cpp@108@definition@T????@LOC:3 COM:0 MVG:1@?@d@ +CCCC_Member@RefundGenerator@clearStaleData@@()@ +CCCC_MemExt@RefundGenerator@clearStaleData@@()@./core/services/refund_generator.cpp@165@definition@F????@LOC:4 COM:0 MVG:0@?@d@ +CCCC_Member@RefundGenerator@createFailureMessage@@(const QString &)@ +CCCC_MemExt@RefundGenerator@createFailureMessage@@(const QString &)@./core/services/refund_generator.cpp@87@definition@T????@LOC:13 COM:0 MVG:1@?@d@ +CCCC_Member@RefundGenerator@createRecord@@()@ +CCCC_MemExt@RefundGenerator@createRecord@@()@./core/services/refund_generator.cpp@112@definition@F????@LOC:11 COM:0 MVG:2@?@d@ +CCCC_Member@RefundGenerator@createSuccessMessage@@()@ +CCCC_MemExt@RefundGenerator@createSuccessMessage@@()@./core/services/refund_generator.cpp@101@definition@T????@LOC:6 COM:0 MVG:1@?@d@ +CCCC_Member@RefundGenerator@initializeRepositories@@()@ +CCCC_MemExt@RefundGenerator@initializeRepositories@@()@./core/services/refund_generator.cpp@32@definition@F????@LOC:13 COM:0 MVG:3@?@d@ +CCCC_Member@RefundGenerator@initializeTicketIdToCacheValueMap@@()@ +CCCC_MemExt@RefundGenerator@initializeTicketIdToCacheValueMap@@()@./core/services/refund_generator.cpp@48@definition@F????@LOC:30 COM:3 MVG:5@?@d@ +CCCC_Member@RefundGenerator@prepareData@@()@ +CCCC_MemExt@RefundGenerator@prepareData@@()@./core/services/refund_generator.cpp@127@definition@F????@LOC:28 COM:2 MVG:4@?@d@ +CCCC_Member@RefundsModel@RefundsModel@@(QObject *,const QSqlDatabase &)@ +CCCC_MemExt@RefundsModel@RefundsModel@@(QObject *,const QSqlDatabase &)@./ui/models/refunds_model.cpp@5@definition@F????@LOC:2 COM:0 MVG:0@?@d@ +CCCC_Member@RefundsModel@createMultiColumnFilter@@(const QString &)@ +CCCC_MemExt@RefundsModel@createMultiColumnFilter@@(const QString &)@./ui/models/refunds_model.cpp@38@definition@T????@LOC:11 COM:2 MVG:2@?@d@ +CCCC_Member@RefundsModel@headerData@@(int,Orientation,int)@ +CCCC_MemExt@RefundsModel@headerData@@(int,Orientation,int)@./ui/models/refunds_model.cpp@19@definition@T????@LOC:18 COM:0 MVG:9@?@d@ +CCCC_Member@RefundsModel@initialize@@()@ +CCCC_MemExt@RefundsModel@initialize@@()@./ui/models/refunds_model.cpp@8@definition@F????@LOC:8 COM:0 MVG:1@?@d@ +CCCC_Member@RefundsRepository@RefundsRepository@@(QSqlDatabase &,QObject *)@ +CCCC_MemExt@RefundsRepository@RefundsRepository@@(QSqlDatabase &,QObject *)@./data/sql/refunds_repository.cpp@10@definition@F????@LOC:2 COM:0 MVG:0@?@d@ +CCCC_Member@RefundsRepository@createRefund@@(const CreateRefundRequest &)@ +CCCC_MemExt@RefundsRepository@createRefund@@(const CreateRefundRequest &)@./data/sql/refunds_repository.cpp@14@definition@F????@LOC:13 COM:0 MVG:3@?@d@ +CCCC_Member@RefundsRepository@deleteRefundById@@(qint32)@ +CCCC_MemExt@RefundsRepository@deleteRefundById@@(qint32)@./data/sql/refunds_repository.cpp@93@definition@F????@LOC:10 COM:0 MVG:3@?@d@ +CCCC_Member@RefundsRepository@getAllRefunds@@(QVector &)@ +CCCC_MemExt@RefundsRepository@getAllRefunds@@(QVector &)@./data/sql/refunds_repository.cpp@57@definition@T????@LOC:13 COM:0 MVG:4@?@d@ +CCCC_Member@RefundsRepository@getRefundById@@(qint32,RefundDTO &)@ +CCCC_MemExt@RefundsRepository@getRefundById@@(qint32,RefundDTO &)@./data/sql/refunds_repository.cpp@30@definition@T????@LOC:21 COM:0 MVG:5@?@d@ +CCCC_Member@RefundsRepository@mapQueryToDTO@@(const QSqlQuery &)@ +CCCC_MemExt@RefundsRepository@mapQueryToDTO@@(const QSqlQuery &)@./data/sql/refunds_repository.cpp@106@definition@T????@LOC:8 COM:0 MVG:1@?@d@ +CCCC_Member@RefundsRepository@updateRefund@@(const UpdateRefundRequest &)@ +CCCC_MemExt@RefundsRepository@updateRefund@@(const UpdateRefundRequest &)@./data/sql/refunds_repository.cpp@75@definition@F????@LOC:15 COM:0 MVG:3@?@d@ +CCCC_Member@RelationIdConfig@RelationIdConfig@@(const QString &,const QString &,const QString &,const QString &)@ +CCCC_MemExt@RelationIdConfig@RelationIdConfig@@(const QString &,const QString &,const QString &,const QString &)@./core/services/relation_id_config.cpp@3@definition@F????@LOC:7 COM:0 MVG:0@?@d@ +CCCC_Member@ReportsWidget@ReportsWidget@@(QWidget *)@ +CCCC_MemExt@ReportsWidget@ReportsWidget@@(QWidget *)@./ui/widgets/reports_widget.cpp@9@definition@F????@LOC:4 COM:0 MVG:0@?@d@ +CCCC_Member@ReportsWidget@setupTicketSalesReportWidgets@@()@ +CCCC_MemExt@ReportsWidget@setupTicketSalesReportWidgets@@()@./ui/widgets/reports_widget.cpp@15@definition@F????@LOC:5 COM:0 MVG:0@?@d@ +CCCC_Member@RepositoryManager@RepositoryManager@@()@ +CCCC_MemExt@RepositoryManager@RepositoryManager@@()@./core/services/repository_manager.cpp@14@definition@F????@LOC:8 COM:0 MVG:2@?@d@ +CCCC_Member@RepositoryManager@getRepository@@(const QString &)@ +CCCC_MemExt@RepositoryManager@getRepository@@(const QString &)@./core/services/repository_manager.cpp@71@definition@T????@LOC:11 COM:0 MVG:3@?@d@ +CCCC_Member@RepositoryManager@initialize@@()@ +CCCC_MemExt@RepositoryManager@initialize@@()@./core/services/repository_manager.cpp@33@definition@F????@LOC:21 COM:4 MVG:0@?@d@ +CCCC_Member@RepositoryManager@instance@@()@ +CCCC_MemExt@RepositoryManager@instance@@()@./core/services/repository_manager.cpp@28@definition@F????@LOC:4 COM:0 MVG:1@?@d@ +CCCC_Member@RepositoryManager@~RepositoryManager@@()@ +CCCC_MemExt@RepositoryManager@~RepositoryManager@@()@./core/services/repository_manager.cpp@24@definition@F????@LOC:3 COM:0 MVG:0@?@d@ +CCCC_Member@RepositoryResult@failureResult@@(const QString &)@ +CCCC_MemExt@RepositoryResult@failureResult@@(const QString &)@./core/repositories/repository_result.cpp@5@definition@F????@LOC:3 COM:0 MVG:1@?@d@ +CCCC_Member@RepositoryResult@successResult@@()@ +CCCC_MemExt@RepositoryResult@successResult@@()@./core/repositories/repository_result.cpp@3@definition@F????@LOC:1 COM:0 MVG:1@?@d@ +CCCC_Member@ReservationManager@ReservationManager@@(qsizetype,qsizetype,const DayManager &)@ +CCCC_MemExt@ReservationManager@ReservationManager@@(qsizetype,qsizetype,const DayManager &)@./core/utils/reservation_manager.cpp@5@definition@F????@LOC:6 COM:0 MVG:0@?@d@ +CCCC_Member@ReservationManager@calculateAvailableDaysCount@@()@ +CCCC_MemExt@ReservationManager@calculateAvailableDaysCount@@()@./core/utils/reservation_manager.cpp@19@definition@T????@LOC:5 COM:0 MVG:2@?@d@ +CCCC_Member@ReservationManager@calculateAvailableSlotsCount@@()@ +CCCC_MemExt@ReservationManager@calculateAvailableSlotsCount@@()@./core/utils/reservation_manager.cpp@42@definition@T????@LOC:6 COM:0 MVG:2@?@d@ +CCCC_Member@ReservationManager@calculatePossibleReservations@@(qint64)@ +CCCC_MemExt@ReservationManager@calculatePossibleReservations@@(qint64)@./core/utils/reservation_manager.cpp@26@definition@T????@LOC:13 COM:0 MVG:2@?@d@ +CCCC_Member@ReservationManager@dayManager@@(qsizetype)@ +CCCC_MemExt@ReservationManager@dayManager@@(qsizetype)@./core/utils/reservation_manager.cpp@84@definition@F????@LOC:8 COM:0 MVG:2@?@d@ +CCCC_Member@ReservationManager@prepareDaysRange@@()@ +CCCC_MemExt@ReservationManager@prepareDaysRange@@()@./core/utils/reservation_manager.cpp@113@definition@F????@LOC:17 COM:0 MVG:7@?@d@ +CCCC_Member@ReservationManager@reserve@@(const QTime &)@ +CCCC_MemExt@ReservationManager@reserve@@(const QTime &)@./core/utils/reservation_manager.cpp@49@definition@F????@LOC:28 COM:1 MVG:11@?@d@ +CCCC_Member@ReservationManager@reserve@@(qsizetype,const QTime &)@ +CCCC_MemExt@ReservationManager@reserve@@(qsizetype,const QTime &)@./core/utils/reservation_manager.cpp@93@definition@F????@LOC:14 COM:1 MVG:2@?@d@ +CCCC_Member@ReservationManager@setReference@@(const DayManager &)@ +CCCC_MemExt@ReservationManager@setReference@@(const DayManager &)@./core/utils/reservation_manager.cpp@12@definition@F????@LOC:6 COM:0 MVG:0@?@d@ +CCCC_Member@ReservationManagerTest@testReserveBound@@()@ +CCCC_MemExt@ReservationManagerTest@testReserveBound@@()@./tests_class/reservation_manager_test.cpp@52@definition@F????@LOC:12 COM:0 MVG:1@?@d@ +CCCC_Member@ReservationManagerTest@testReserveFailure@@()@ +CCCC_MemExt@ReservationManagerTest@testReserveFailure@@()@./tests_class/reservation_manager_test.cpp@13@definition@F????@LOC:9 COM:0 MVG:0@?@d@ +CCCC_Member@ReservationManagerTest@testReserveSuccess@@()@ +CCCC_MemExt@ReservationManagerTest@testReserveSuccess@@()@./tests_class/reservation_manager_test.cpp@25@definition@F????@LOC:22 COM:0 MVG:5@?@d@ +CCCC_Member@RolesRepository@RolesRepository@@(QSqlDatabase &,QObject *)@ +CCCC_MemExt@RolesRepository@RolesRepository@@(QSqlDatabase &,QObject *)@./data/sql/roles_repository.cpp@10@definition@F????@LOC:2 COM:0 MVG:0@?@d@ +CCCC_Member@RolesRepository@createRole@@(const CreateRoleRequest &)@ +CCCC_MemExt@RolesRepository@createRole@@(const CreateRoleRequest &)@./data/sql/roles_repository.cpp@13@definition@F????@LOC:12 COM:0 MVG:3@?@d@ +CCCC_Member@RolesRepository@deleteRoleById@@(qint32)@ +CCCC_MemExt@RolesRepository@deleteRoleById@@(qint32)@./data/sql/roles_repository.cpp@78@definition@F????@LOC:10 COM:0 MVG:3@?@d@ +CCCC_Member@RolesRepository@getAllRoles@@(QVector &)@ +CCCC_MemExt@RolesRepository@getAllRoles@@(QVector &)@./data/sql/roles_repository.cpp@47@definition@T????@LOC:12 COM:0 MVG:4@?@d@ +CCCC_Member@RolesRepository@getRoleById@@(qint32,RoleDTO &)@ +CCCC_MemExt@RolesRepository@getRoleById@@(qint32,RoleDTO &)@./data/sql/roles_repository.cpp@28@definition@T????@LOC:15 COM:0 MVG:5@?@d@ +CCCC_Member@RolesRepository@mapQueryToDTO@@(const QSqlQuery &)@ +CCCC_MemExt@RolesRepository@mapQueryToDTO@@(const QSqlQuery &)@./data/sql/roles_repository.cpp@91@definition@T????@LOC:7 COM:0 MVG:1@?@d@ +CCCC_Member@RolesRepository@updateRole@@(const UpdateRoleRequest &)@ +CCCC_MemExt@RolesRepository@updateRole@@(const UpdateRoleRequest &)@./data/sql/roles_repository.cpp@63@definition@F????@LOC:12 COM:0 MVG:3@?@d@ +CCCC_Member@SQLiteDatabase@SQLiteDatabase@@(...)@ +CCCC_MemExt@SQLiteDatabase@SQLiteDatabase@@(...)@./tests_schema/tests_sources/sqlite_database.cpp@23@definition@F????@LOC:2 COM:0 MVG:1@?@d@ +CCCC_Member@SQLiteDatabase@SQLiteDatabase@@(const string &)@ +CCCC_MemExt@SQLiteDatabase@SQLiteDatabase@@(const string &)@./tests_schema/tests_sources/sqlite_database.cpp@8@definition@F????@LOC:6 COM:2 MVG:1@?@d@ +CCCC_Member@SQLiteDatabase@addGenre@@(const NewGenre &)@ +CCCC_MemExt@SQLiteDatabase@addGenre@@(const NewGenre &)@./tests_schema/tests_sources/sqlite_database.cpp@86@definition@F????@LOC:7 COM:2 MVG:1@?@d@ +CCCC_Member@SQLiteDatabase@addHall@@(const NewHall &)@ +CCCC_MemExt@SQLiteDatabase@addHall@@(const NewHall &)@./tests_schema/tests_sources/sqlite_database.cpp@216@definition@F????@LOC:9 COM:2 MVG:1@?@d@ +CCCC_Member@SQLiteDatabase@addMovie@@(const NewMovie &)@ +CCCC_MemExt@SQLiteDatabase@addMovie@@(const NewMovie &)@./tests_schema/tests_sources/sqlite_database.cpp@147@definition@F????@LOC:10 COM:2 MVG:1@?@d@ +CCCC_Member@SQLiteDatabase@addRefund@@(const NewRefund &)@ +CCCC_MemExt@SQLiteDatabase@addRefund@@(const NewRefund &)@./tests_schema/tests_sources/sqlite_database.cpp@422@definition@F????@LOC:11 COM:2 MVG:1@?@d@ +CCCC_Member@SQLiteDatabase@addSession@@(const NewSession &)@ +CCCC_MemExt@SQLiteDatabase@addSession@@(const NewSession &)@./tests_schema/tests_sources/sqlite_database.cpp@280@definition@F????@LOC:11 COM:2 MVG:1@?@d@ +CCCC_Member@SQLiteDatabase@addTicket@@(const NewTicket &)@ +CCCC_MemExt@SQLiteDatabase@addTicket@@(const NewTicket &)@./tests_schema/tests_sources/sqlite_database.cpp@354@definition@F????@LOC:10 COM:2 MVG:1@?@d@ +CCCC_Member@SQLiteDatabase@executeNonQuery@@(const string &,const function &)@ +CCCC_MemExt@SQLiteDatabase@executeNonQuery@@(const string &,const function &)@./tests_schema/tests_sources/sqlite_database.cpp@37@definition@F????@LOC:15 COM:1 MVG:4@?@d@ +CCCC_Member@SQLiteDatabase@getAllGenres@@()@ +CCCC_MemExt@SQLiteDatabase@getAllGenres@@()@./tests_schema/tests_sources/sqlite_database.cpp@132@definition@F????@LOC:9 COM:1 MVG:2@?@d@ +CCCC_Member@SQLiteDatabase@getAllHalls@@()@ +CCCC_MemExt@SQLiteDatabase@getAllHalls@@()@./tests_schema/tests_sources/sqlite_database.cpp@266@definition@F????@LOC:9 COM:1 MVG:2@?@d@ +CCCC_Member@SQLiteDatabase@getAllMovies@@()@ +CCCC_MemExt@SQLiteDatabase@getAllMovies@@()@./tests_schema/tests_sources/sqlite_database.cpp@201@definition@F????@LOC:10 COM:1 MVG:2@?@d@ +CCCC_Member@SQLiteDatabase@getAllRefunds@@()@ +CCCC_MemExt@SQLiteDatabase@getAllRefunds@@()@./tests_schema/tests_sources/sqlite_database.cpp@477@definition@F????@LOC:10 COM:1 MVG:2@?@d@ +CCCC_Member@SQLiteDatabase@getAllSessions@@()@ +CCCC_MemExt@SQLiteDatabase@getAllSessions@@()@./tests_schema/tests_sources/sqlite_database.cpp@339@definition@F????@LOC:10 COM:1 MVG:2@?@d@ +CCCC_Member@SQLiteDatabase@getAllTickets@@()@ +CCCC_MemExt@SQLiteDatabase@getAllTickets@@()@./tests_schema/tests_sources/sqlite_database.cpp@407@definition@F????@LOC:10 COM:1 MVG:2@?@d@ +CCCC_Member@SQLiteDatabase@getGenre@@(int)@ +CCCC_MemExt@SQLiteDatabase@getGenre@@(int)@./tests_schema/tests_sources/sqlite_database.cpp@117@definition@F????@LOC:12 COM:1 MVG:3@?@d@ +CCCC_Member@SQLiteDatabase@getHall@@(int)@ +CCCC_MemExt@SQLiteDatabase@getHall@@(int)@./tests_schema/tests_sources/sqlite_database.cpp@250@definition@F????@LOC:13 COM:1 MVG:3@?@d@ +CCCC_Member@SQLiteDatabase@getMovie@@(int)@ +CCCC_MemExt@SQLiteDatabase@getMovie@@(int)@./tests_schema/tests_sources/sqlite_database.cpp@184@definition@F????@LOC:14 COM:1 MVG:3@?@d@ +CCCC_Member@SQLiteDatabase@getRefund@@(int)@ +CCCC_MemExt@SQLiteDatabase@getRefund@@(int)@./tests_schema/tests_sources/sqlite_database.cpp@460@definition@F????@LOC:14 COM:1 MVG:3@?@d@ +CCCC_Member@SQLiteDatabase@getSession@@(int)@ +CCCC_MemExt@SQLiteDatabase@getSession@@(int)@./tests_schema/tests_sources/sqlite_database.cpp@320@definition@F????@LOC:16 COM:1 MVG:3@?@d@ +CCCC_Member@SQLiteDatabase@getTicket@@(int)@ +CCCC_MemExt@SQLiteDatabase@getTicket@@(int)@./tests_schema/tests_sources/sqlite_database.cpp@390@definition@F????@LOC:14 COM:1 MVG:3@?@d@ +CCCC_Member@SQLiteDatabase@operator =@@(...)@ +CCCC_MemExt@SQLiteDatabase@operator =@@(...)@./tests_schema/tests_sources/sqlite_database.cpp@26@definition@F????@LOC:9 COM:0 MVG:4@?@d@ +CCCC_Member@SQLiteDatabase@removeGenre@@(int)@ +CCCC_MemExt@SQLiteDatabase@removeGenre@@(int)@./tests_schema/tests_sources/sqlite_database.cpp@96@definition@F????@LOC:6 COM:1 MVG:1@?@d@ +CCCC_Member@SQLiteDatabase@removeHall@@(int)@ +CCCC_MemExt@SQLiteDatabase@removeHall@@(int)@./tests_schema/tests_sources/sqlite_database.cpp@228@definition@F????@LOC:6 COM:1 MVG:1@?@d@ +CCCC_Member@SQLiteDatabase@removeMovie@@(int)@ +CCCC_MemExt@SQLiteDatabase@removeMovie@@(int)@./tests_schema/tests_sources/sqlite_database.cpp@160@definition@F????@LOC:6 COM:1 MVG:1@?@d@ +CCCC_Member@SQLiteDatabase@removeRefund@@(int)@ +CCCC_MemExt@SQLiteDatabase@removeRefund@@(int)@./tests_schema/tests_sources/sqlite_database.cpp@436@definition@F????@LOC:6 COM:1 MVG:1@?@d@ +CCCC_Member@SQLiteDatabase@removeSession@@(int)@ +CCCC_MemExt@SQLiteDatabase@removeSession@@(int)@./tests_schema/tests_sources/sqlite_database.cpp@294@definition@F????@LOC:7 COM:1 MVG:1@?@d@ +CCCC_Member@SQLiteDatabase@removeTicket@@(int)@ +CCCC_MemExt@SQLiteDatabase@removeTicket@@(int)@./tests_schema/tests_sources/sqlite_database.cpp@367@definition@F????@LOC:6 COM:1 MVG:1@?@d@ +CCCC_Member@SQLiteDatabase@updateGenre@@(const Genre &)@ +CCCC_MemExt@SQLiteDatabase@updateGenre@@(const Genre &)@./tests_schema/tests_sources/sqlite_database.cpp@105@definition@F????@LOC:9 COM:1 MVG:1@?@d@ +CCCC_Member@SQLiteDatabase@updateHall@@(const Hall &)@ +CCCC_MemExt@SQLiteDatabase@updateHall@@(const Hall &)@./tests_schema/tests_sources/sqlite_database.cpp@237@definition@F????@LOC:10 COM:1 MVG:1@?@d@ +CCCC_Member@SQLiteDatabase@updateMovie@@(const Movie &)@ +CCCC_MemExt@SQLiteDatabase@updateMovie@@(const Movie &)@./tests_schema/tests_sources/sqlite_database.cpp@169@definition@F????@LOC:12 COM:1 MVG:1@?@d@ +CCCC_Member@SQLiteDatabase@updateRefund@@(const Refund &)@ +CCCC_MemExt@SQLiteDatabase@updateRefund@@(const Refund &)@./tests_schema/tests_sources/sqlite_database.cpp@445@definition@F????@LOC:12 COM:1 MVG:1@?@d@ +CCCC_Member@SQLiteDatabase@updateSession@@(const Session &)@ +CCCC_MemExt@SQLiteDatabase@updateSession@@(const Session &)@./tests_schema/tests_sources/sqlite_database.cpp@304@definition@F????@LOC:13 COM:1 MVG:1@?@d@ +CCCC_Member@SQLiteDatabase@updateTicket@@(const Ticket &)@ +CCCC_MemExt@SQLiteDatabase@updateTicket@@(const Ticket &)@./tests_schema/tests_sources/sqlite_database.cpp@376@definition@F????@LOC:11 COM:1 MVG:1@?@d@ +CCCC_Member@SQLiteDatabase@~SQLiteDatabase@@()@ +CCCC_MemExt@SQLiteDatabase@~SQLiteDatabase@@()@./tests_schema/tests_sources/sqlite_database.cpp@17@definition@F????@LOC:5 COM:1 MVG:1@?@d@ +CCCC_Member@SQLiteFileExecutor@SQLiteFileExecutor@@(const string &)@ +CCCC_MemExt@SQLiteFileExecutor@SQLiteFileExecutor@@(const string &)@./tests_schema/tests_sources/sqlite_file_executor.cpp@6@definition@F????@LOC:6 COM:1 MVG:1@?@d@ +CCCC_Member@SQLiteFileExecutor@executeSQLFile@@(const string &)@ +CCCC_MemExt@SQLiteFileExecutor@executeSQLFile@@(const string &)@./tests_schema/tests_sources/sqlite_file_executor.cpp@21@definition@F????@LOC:15 COM:1 MVG:3@?@d@ +CCCC_Member@SQLiteFileExecutor@~SQLiteFileExecutor@@()@ +CCCC_MemExt@SQLiteFileExecutor@~SQLiteFileExecutor@@()@./tests_schema/tests_sources/sqlite_file_executor.cpp@14@definition@F????@LOC:5 COM:0 MVG:1@?@d@ +CCCC_Member@SQLiteStatement@SQLiteStatement@@(sqlite3 *,const string &)@ +CCCC_MemExt@SQLiteStatement@SQLiteStatement@@(sqlite3 *,const string &)@./tests_schema/tests_sources/sqlite_statement.cpp@5@definition@F????@LOC:15 COM:1 MVG:3@?@d@ +CCCC_Member@SQLiteStatement@bind@@(int,const string &)@ +CCCC_MemExt@SQLiteStatement@bind@@(int,const string &)@./tests_schema/tests_sources/sqlite_statement.cpp@38@definition@F????@LOC:4 COM:1 MVG:1@?@d@ +CCCC_Member@SQLiteStatement@bind@@(int,double)@ +CCCC_MemExt@SQLiteStatement@bind@@(int,double)@./tests_schema/tests_sources/sqlite_statement.cpp@33@definition@F????@LOC:3 COM:1 MVG:1@?@d@ +CCCC_Member@SQLiteStatement@bind@@(int,int)@ +CCCC_MemExt@SQLiteStatement@bind@@(int,int)@./tests_schema/tests_sources/sqlite_statement.cpp@28@definition@F????@LOC:3 COM:1 MVG:1@?@d@ +CCCC_Member@SQLiteStatement@bindNull@@(int)@ +CCCC_MemExt@SQLiteStatement@bindNull@@(int)@./tests_schema/tests_sources/sqlite_statement.cpp@44@definition@F????@LOC:3 COM:1 MVG:1@?@d@ +CCCC_Member@SQLiteStatement@changes@@()@ +CCCC_MemExt@SQLiteStatement@changes@@()@./tests_schema/tests_sources/sqlite_statement.cpp@68@definition@F????@LOC:1 COM:1 MVG:1@?@d@ +CCCC_Member@SQLiteStatement@execute@@()@ +CCCC_MemExt@SQLiteStatement@execute@@()@./tests_schema/tests_sources/sqlite_statement.cpp@50@definition@F????@LOC:1 COM:2 MVG:1@?@d@ +CCCC_Member@SQLiteStatement@finalize@@()@ +CCCC_MemExt@SQLiteStatement@finalize@@()@./tests_schema/tests_sources/sqlite_statement.cpp@74@definition@F????@LOC:6 COM:1 MVG:1@?@d@ +CCCC_Member@SQLiteStatement@getColumnCount@@()@ +CCCC_MemExt@SQLiteStatement@getColumnCount@@()@./tests_schema/tests_sources/sqlite_statement.cpp@82@definition@T????@LOC:3 COM:1 MVG:1@?@d@ +CCCC_Member@SQLiteStatement@getColumnText@@(int)@ +CCCC_MemExt@SQLiteStatement@getColumnText@@(int)@./tests_schema/tests_sources/sqlite_statement.cpp@87@definition@T????@LOC:4 COM:1 MVG:2@?@d@ +CCCC_Member@SQLiteStatement@reset@@()@ +CCCC_MemExt@SQLiteStatement@reset@@()@./tests_schema/tests_sources/sqlite_statement.cpp@71@definition@F????@LOC:1 COM:1 MVG:0@?@d@ +CCCC_Member@SQLiteStatement@step@@()@ +CCCC_MemExt@SQLiteStatement@step@@()@./tests_schema/tests_sources/sqlite_statement.cpp@53@definition@F????@LOC:11 COM:1 MVG:5@?@d@ +CCCC_Member@SQLiteStatement@~SQLiteStatement@@()@ +CCCC_MemExt@SQLiteStatement@~SQLiteStatement@@()@./tests_schema/tests_sources/sqlite_statement.cpp@25@definition@F????@LOC:1 COM:1 MVG:0@?@d@ +CCCC_Member@SalesData@SalesData@@()@ +CCCC_MemExt@SalesData@SalesData@@()@./ui/widgets/ticket_sales_report_widget.cpp@15@definition@F????@LOC:3 COM:0 MVG:0@?@d@ +CCCC_Member@SalesData@SalesData@@(double,double,qint32,qint32,qint32)@ +CCCC_MemExt@SalesData@SalesData@@(double,double,qint32,qint32,qint32)@./ui/widgets/ticket_sales_report_widget.cpp@19@definition@F????@LOC:8 COM:0 MVG:0@?@d@ +CCCC_Member@SalesData@operator +@@(const SalesData &)@ +CCCC_MemExt@SalesData@operator +@@(const SalesData &)@./ui/widgets/ticket_sales_report_widget.cpp@29@definition@T????@LOC:9 COM:0 MVG:1@?@d@ +CCCC_Member@SalesData@operator +=@@(const SalesData &)@ +CCCC_MemExt@SalesData@operator +=@@(const SalesData &)@./ui/widgets/ticket_sales_report_widget.cpp@40@definition@F????@LOC:4 COM:0 MVG:1@?@d@ +CCCC_Member@SchemaMetadata@SchemaMetadata@@()@ +CCCC_MemExt@SchemaMetadata@SchemaMetadata@@()@./core/services/schema_metadata.cpp@73@definition@F????@LOC:3 COM:0 MVG:0@?@d@ +CCCC_Member@SchemaMetadata@SchemaMetadata@@(const SchemaMetadata &)@ +CCCC_MemExt@SchemaMetadata@SchemaMetadata@@(const SchemaMetadata &)@./core/services/schema_metadata.cpp@77@definition@F????@LOC:1 COM:0 MVG:0@?@d@ +CCCC_Member@SchemaMetadata@defaultSchema@@()@ +CCCC_MemExt@SchemaMetadata@defaultSchema@@()@./core/services/schema_metadata.cpp@83@definition@F????@LOC:1 COM:0 MVG:1@?@d@ +CCCC_Member@SchemaMetadata@initialize@@()@ +CCCC_MemExt@SchemaMetadata@initialize@@()@./core/services/schema_metadata.cpp@8@definition@F????@LOC:54 COM:0 MVG:0@?@d@ +CCCC_Member@SchemaMetadata@modelTableName@@(const QString &)@ +CCCC_MemExt@SchemaMetadata@modelTableName@@(const QString &)@./core/services/schema_metadata.cpp@85@definition@F????@LOC:8 COM:0 MVG:2@?@d@ +CCCC_Member@SchemaMetadata@operator =@@(const SchemaMetadata &)@ +CCCC_MemExt@SchemaMetadata@operator =@@(const SchemaMetadata &)@./core/services/schema_metadata.cpp@79@definition@F????@LOC:3 COM:0 MVG:1@?@d@ +CCCC_Member@SchemaMetadata@primaryIdColumnName@@(const QString &)@ +CCCC_MemExt@SchemaMetadata@primaryIdColumnName@@(const QString &)@./core/services/schema_metadata.cpp@96@definition@F????@LOC:9 COM:0 MVG:2@?@d@ +CCCC_Member@SchemaMetadata@relationIdConfig@@(const QString &)@ +CCCC_MemExt@SchemaMetadata@relationIdConfig@@(const QString &)@./core/services/schema_metadata.cpp@133@definition@F????@LOC:5 COM:0 MVG:1@?@d@ +CCCC_Member@SchemaMetadata@repositoryTableName@@(const QString &)@ +CCCC_MemExt@SchemaMetadata@repositoryTableName@@(const QString &)@./core/services/schema_metadata.cpp@108@definition@F????@LOC:9 COM:0 MVG:2@?@d@ +CCCC_Member@SchemaMetadata@translatedTableName@@(const QString &)@ +CCCC_MemExt@SchemaMetadata@translatedTableName@@(const QString &)@./core/services/schema_metadata.cpp@120@definition@F????@LOC:9 COM:0 MVG:2@?@d@ +CCCC_Member@SearchDialog@SearchDialog@@(QWidget *)@ +CCCC_MemExt@SearchDialog@SearchDialog@@(QWidget *)@./ui/dialogs/search_dialog.cpp@8@definition@F????@LOC:7 COM:1 MVG:0@?@d@ +CCCC_Member@SearchDialog@SearchDialog@@(const QString &,const QString &,QWidget *)@ +CCCC_MemExt@SearchDialog@SearchDialog@@(const QString &,const QString &,QWidget *)@./ui/dialogs/search_dialog.cpp@17@definition@F????@LOC:10 COM:0 MVG:2@?@d@ +CCCC_Member@SearchDialog@initializeProxyModel@@()@ +CCCC_MemExt@SearchDialog@initializeProxyModel@@()@./ui/dialogs/search_dialog.cpp@73@definition@F????@LOC:3 COM:0 MVG:0@?@d@ +CCCC_Member@SearchDialog@onLineEditSearchTextChanged@@(const QString &)@ +CCCC_MemExt@SearchDialog@onLineEditSearchTextChanged@@(const QString &)@./ui/dialogs/search_dialog.cpp@111@definition@F????@LOC:10 COM:2 MVG:2@?@d@ +CCCC_Member@SearchDialog@onPushButtonSelectClicked@@()@ +CCCC_MemExt@SearchDialog@onPushButtonSelectClicked@@()@./ui/dialogs/search_dialog.cpp@129@definition@F????@LOC:21 COM:0 MVG:4@?@d@ +CCCC_Member@SearchDialog@setFieldName@@(const QString &)@ +CCCC_MemExt@SearchDialog@setFieldName@@(const QString &)@./ui/dialogs/search_dialog.cpp@34@definition@F????@LOC:8 COM:0 MVG:3@?@d@ +CCCC_Member@SearchDialog@setTableName@@(const QString &)@ +CCCC_MemExt@SearchDialog@setTableName@@(const QString &)@./ui/dialogs/search_dialog.cpp@43@definition@F????@LOC:18 COM:0 MVG:5@?@d@ +CCCC_Member@SearchDialog@setupConnections@@()@ +CCCC_MemExt@SearchDialog@setupConnections@@()@./ui/dialogs/search_dialog.cpp@77@definition@F????@LOC:6 COM:0 MVG:0@?@d@ +CCCC_Member@SearchDialog@setupTableView@@()@ +CCCC_MemExt@SearchDialog@setupTableView@@()@./ui/dialogs/search_dialog.cpp@85@definition@F????@LOC:15 COM:0 MVG:0@?@d@ +CCCC_Member@SearchDialog@~SearchDialog@@()@ +CCCC_MemExt@SearchDialog@~SearchDialog@@()@./ui/dialogs/search_dialog.cpp@28@definition@F????@LOC:5 COM:0 MVG:1@?@d@ +CCCC_Member@SessionGenerator@SessionGenerator@@(const ReservationManager &)@ +CCCC_MemExt@SessionGenerator@SessionGenerator@@(const ReservationManager &)@./core/services/session_generator.cpp@13@definition@F????@LOC:10 COM:6 MVG:0@?@d@ +CCCC_Member@SessionGenerator@calculateRemainingCapacity@@()@ +CCCC_MemExt@SessionGenerator@calculateRemainingCapacity@@()@./core/services/session_generator.cpp@152@definition@T????@LOC:7 COM:1 MVG:2@?@d@ +CCCC_Member@SessionGenerator@createFailureMessage@@(const QString &)@ +CCCC_MemExt@SessionGenerator@createFailureMessage@@(const QString &)@./core/services/session_generator.cpp@120@definition@T????@LOC:8 COM:0 MVG:1@?@d@ +CCCC_Member@SessionGenerator@createRecord@@()@ +CCCC_MemExt@SessionGenerator@createRecord@@()@./core/services/session_generator.cpp@107@definition@F????@LOC:9 COM:0 MVG:1@?@d@ +CCCC_Member@SessionGenerator@createSuccessMessage@@()@ +CCCC_MemExt@SessionGenerator@createSuccessMessage@@()@./core/services/session_generator.cpp@129@definition@T????@LOC:12 COM:15 MVG:1@?@d@ +CCCC_Member@SessionGenerator@duration@@(qint32)@ +CCCC_MemExt@SessionGenerator@duration@@(qint32)@./core/services/session_generator.cpp@214@definition@T????@LOC:2 COM:0 MVG:0@?@d@ +CCCC_Member@SessionGenerator@initializeBounds@@()@ +CCCC_MemExt@SessionGenerator@initializeBounds@@()@./core/services/session_generator.cpp@63@definition@F????@LOC:7 COM:1 MVG:0@?@d@ +CCCC_Member@SessionGenerator@initializeDayManager@@()@ +CCCC_MemExt@SessionGenerator@initializeDayManager@@()@./core/services/session_generator.cpp@72@definition@F????@LOC:13 COM:0 MVG:1@?@d@ +CCCC_Member@SessionGenerator@initializeHallIdToReservationManagerMap@@()@ +CCCC_MemExt@SessionGenerator@initializeHallIdToReservationManagerMap@@()@./core/services/session_generator.cpp@88@definition@F????@LOC:14 COM:0 MVG:3@?@d@ +CCCC_Member@SessionGenerator@initializeMovieIdToDurationMap@@(qint32)@ +CCCC_MemExt@SessionGenerator@initializeMovieIdToDurationMap@@(qint32)@./core/services/session_generator.cpp@42@definition@F????@LOC:16 COM:0 MVG:3@?@d@ +CCCC_Member@SessionGenerator@initializeRepositories@@()@ +CCCC_MemExt@SessionGenerator@initializeRepositories@@()@./core/services/session_generator.cpp@26@definition@F????@LOC:13 COM:0 MVG:3@?@d@ +CCCC_Member@SessionGenerator@prepareData@@()@ +CCCC_MemExt@SessionGenerator@prepareData@@()@./core/services/session_generator.cpp@162@definition@F????@LOC:15 COM:0 MVG:4@?@d@ +CCCC_Member@SessionGenerator@prepareData@@(qint32,const QList &)@ +CCCC_MemExt@SessionGenerator@prepareData@@(qint32,const QList &)@./core/services/session_generator.cpp@181@definition@F????@LOC:26 COM:0 MVG:5@?@d@ +CCCC_Member@SessionManagementWidget@SessionManagementWidget@@(QWidget *)@ +CCCC_MemExt@SessionManagementWidget@SessionManagementWidget@@(QWidget *)@./ui/widgets/session_management_widget.cpp@13@definition@F????@LOC:10 COM:3 MVG:0@?@d@ +CCCC_Member@SessionManagementWidget@initializeModels@@()@ +CCCC_MemExt@SessionManagementWidget@initializeModels@@()@./ui/widgets/session_management_widget.cpp@38@definition@F????@LOC:10 COM:0 MVG:1@?@d@ +CCCC_Member@SessionManagementWidget@initializeRepositories@@()@ +CCCC_MemExt@SessionManagementWidget@initializeRepositories@@()@./ui/widgets/session_management_widget.cpp@25@definition@F????@LOC:10 COM:0 MVG:1@?@d@ +CCCC_Member@SessionManagementWidget@onHallFieldRetrieved@@(const QSqlField &)@ +CCCC_MemExt@SessionManagementWidget@onHallFieldRetrieved@@(const QSqlField &)@./ui/widgets/session_management_widget.cpp@97@definition@F????@LOC:3 COM:0 MVG:0@?@d@ +CCCC_Member@SessionManagementWidget@onMovieFieldRetrieved@@(const QSqlField &)@ +CCCC_MemExt@SessionManagementWidget@onMovieFieldRetrieved@@(const QSqlField &)@./ui/widgets/session_management_widget.cpp@101@definition@F????@LOC:3 COM:0 MVG:0@?@d@ +CCCC_Member@SessionManagementWidget@onPushButtonAddSessionClicked@@()@ +CCCC_MemExt@SessionManagementWidget@onPushButtonAddSessionClicked@@()@./ui/widgets/session_management_widget.cpp@80@definition@F????@LOC:13 COM:0 MVG:1@?@d@ +CCCC_Member@SessionManagementWidget@setupConnections@@()@ +CCCC_MemExt@SessionManagementWidget@setupConnections@@()@./ui/widgets/session_management_widget.cpp@55@definition@F????@LOC:8 COM:0 MVG:0@?@d@ +CCCC_Member@SessionManagementWidget@setupHallFinder@@()@ +CCCC_MemExt@SessionManagementWidget@setupHallFinder@@()@./ui/widgets/session_management_widget.cpp@66@definition@F????@LOC:6 COM:0 MVG:0@?@d@ +CCCC_Member@SessionManagementWidget@setupMovieFinder@@()@ +CCCC_MemExt@SessionManagementWidget@setupMovieFinder@@()@./ui/widgets/session_management_widget.cpp@73@definition@F????@LOC:6 COM:0 MVG:0@?@d@ +CCCC_Member@SessionManagementWidget@setupTableView@@()@ +CCCC_MemExt@SessionManagementWidget@setupTableView@@()@./ui/widgets/session_management_widget.cpp@51@definition@F????@LOC:3 COM:0 MVG:0@?@d@ +CCCC_Member@SessionsModel@SessionsModel@@(QObject *,const QSqlDatabase &)@ +CCCC_MemExt@SessionsModel@SessionsModel@@(QObject *,const QSqlDatabase &)@./ui/models/sessions_model.cpp@6@definition@F????@LOC:2 COM:0 MVG:0@?@d@ +CCCC_Member@SessionsModel@buildHallIdFilterCondition@@(const QString &,QString &)@ +CCCC_MemExt@SessionsModel@buildHallIdFilterCondition@@(const QString &,QString &)@./ui/models/sessions_model.cpp@26@definition@T????@LOC:16 COM:0 MVG:4@?@d@ +CCCC_Member@SessionsModel@buildMovieIdFilterCondition@@(const QString &,QString &)@ +CCCC_MemExt@SessionsModel@buildMovieIdFilterCondition@@(const QString &,QString &)@./ui/models/sessions_model.cpp@47@definition@T????@LOC:16 COM:0 MVG:4@?@d@ +CCCC_Member@SessionsModel@createMultiColumnFilter@@(const QString &)@ +CCCC_MemExt@SessionsModel@createMultiColumnFilter@@(const QString &)@./ui/models/sessions_model.cpp@89@definition@T????@LOC:18 COM:3 MVG:4@?@d@ +CCCC_Member@SessionsModel@headerData@@(int,Orientation,int)@ +CCCC_MemExt@SessionsModel@headerData@@(int,Orientation,int)@./ui/models/sessions_model.cpp@68@definition@T????@LOC:20 COM:0 MVG:10@?@d@ +CCCC_Member@SessionsModel@initialize@@()@ +CCCC_MemExt@SessionsModel@initialize@@()@./ui/models/sessions_model.cpp@9@definition@F????@LOC:12 COM:1 MVG:1@?@d@ +CCCC_Member@SessionsRepository@SessionsRepository@@(QSqlDatabase &,QObject *)@ +CCCC_MemExt@SessionsRepository@SessionsRepository@@(QSqlDatabase &,QObject *)@./data/sql/sessions_repository.cpp@10@definition@F????@LOC:2 COM:0 MVG:0@?@d@ +CCCC_Member@SessionsRepository@createSession@@(const CreateSessionRequest &)@ +CCCC_MemExt@SessionsRepository@createSession@@(const CreateSessionRequest &)@./data/sql/sessions_repository.cpp@14@definition@F????@LOC:15 COM:0 MVG:3@?@d@ +CCCC_Member@SessionsRepository@deleteSessionById@@(qint32)@ +CCCC_MemExt@SessionsRepository@deleteSessionById@@(qint32)@./data/sql/sessions_repository.cpp@90@definition@F????@LOC:10 COM:0 MVG:3@?@d@ +CCCC_Member@SessionsRepository@getAllSessions@@(QVector &)@ +CCCC_MemExt@SessionsRepository@getAllSessions@@(QVector &)@./data/sql/sessions_repository.cpp@53@definition@T????@LOC:13 COM:0 MVG:4@?@d@ +CCCC_Member@SessionsRepository@getSessionById@@(qint32,SessionDTO &)@ +CCCC_MemExt@SessionsRepository@getSessionById@@(qint32,SessionDTO &)@./data/sql/sessions_repository.cpp@32@definition@T????@LOC:16 COM:0 MVG:5@?@d@ +CCCC_Member@SessionsRepository@mapQueryToDTO@@(const QSqlQuery &)@ +CCCC_MemExt@SessionsRepository@mapQueryToDTO@@(const QSqlQuery &)@./data/sql/sessions_repository.cpp@103@definition@T????@LOC:9 COM:0 MVG:1@?@d@ +CCCC_Member@SessionsRepository@updateSession@@(const UpdateSessionRequest &)@ +CCCC_MemExt@SessionsRepository@updateSession@@(const UpdateSessionRequest &)@./data/sql/sessions_repository.cpp@71@definition@F????@LOC:16 COM:0 MVG:3@?@d@ +CCCC_Member@SessionsStatisticsRepository@SessionsStatisticsRepository@@(QSqlDatabase &,QObject *)@ +CCCC_MemExt@SessionsStatisticsRepository@SessionsStatisticsRepository@@(QSqlDatabase &,QObject *)@./data/sql/sessions_statistics_repository.cpp@11@definition@F????@LOC:3 COM:0 MVG:0@?@d@ +CCCC_Member@SessionsStatisticsRepository@bindDateFilters@@(QString &,const optional &,const optional &)@ +CCCC_MemExt@SessionsStatisticsRepository@bindDateFilters@@(QString &,const optional &,const optional &)@./data/sql/sessions_statistics_repository.cpp@148@definition@T????@LOC:11 COM:0 MVG:4@?@d@ +CCCC_Member@SessionsStatisticsRepository@bindDateValues@@(QSqlQuery &,const optional &,const optional &)@ +CCCC_MemExt@SessionsStatisticsRepository@bindDateValues@@(QSqlQuery &,const optional &,const optional &)@./data/sql/sessions_statistics_repository.cpp@160@definition@T????@LOC:10 COM:0 MVG:2@?@d@ +CCCC_Member@SessionsStatisticsRepository@executeAndMapQuery@@(QSqlQuery &,QVector &)@ +CCCC_MemExt@SessionsStatisticsRepository@executeAndMapQuery@@(QSqlQuery &,QVector &)@./data/sql/sessions_statistics_repository.cpp@40@definition@T????@LOC:13 COM:0 MVG:4@?@d@ +CCCC_Member@SessionsStatisticsRepository@getAllSessions@@(QVector &)@ +CCCC_MemExt@SessionsStatisticsRepository@getAllSessions@@(QVector &)@./data/sql/sessions_statistics_repository.cpp@77@definition@T????@LOC:13 COM:0 MVG:4@?@d@ +CCCC_Member@SessionsStatisticsRepository@getSessionById@@(qint32,SessionStatisticsDTO &)@ +CCCC_MemExt@SessionsStatisticsRepository@getSessionById@@(qint32,SessionStatisticsDTO &)@./data/sql/sessions_statistics_repository.cpp@58@definition@T????@LOC:15 COM:0 MVG:5@?@d@ +CCCC_Member@SessionsStatisticsRepository@getSessionsForGenre@@(qint32,optional,optional,QVector &)@ +CCCC_MemExt@SessionsStatisticsRepository@getSessionsForGenre@@(qint32,optional,optional,QVector &)@./data/sql/sessions_statistics_repository.cpp@130@definition@T????@LOC:13 COM:0 MVG:1@?@d@ +CCCC_Member@SessionsStatisticsRepository@getSessionsForHall@@(qint32,optional,optional,QVector &)@ +CCCC_MemExt@SessionsStatisticsRepository@getSessionsForHall@@(qint32,optional,optional,QVector &)@./data/sql/sessions_statistics_repository.cpp@94@definition@T????@LOC:13 COM:0 MVG:1@?@d@ +CCCC_Member@SessionsStatisticsRepository@getSessionsForMovie@@(qint32,optional,optional,QVector &)@ +CCCC_MemExt@SessionsStatisticsRepository@getSessionsForMovie@@(qint32,optional,optional,QVector &)@./data/sql/sessions_statistics_repository.cpp@112@definition@T????@LOC:13 COM:0 MVG:1@?@d@ +CCCC_Member@SessionsStatisticsRepository@mapQueryToDTO@@(const QSqlQuery &)@ +CCCC_MemExt@SessionsStatisticsRepository@mapQueryToDTO@@(const QSqlQuery &)@./data/sql/sessions_statistics_repository.cpp@16@definition@T????@LOC:19 COM:2 MVG:1@?@d@ +CCCC_Member@SingleRecordTimeRangeWidget@SingleRecordTimeRangeWidget@@(QWidget *)@ +CCCC_MemExt@SingleRecordTimeRangeWidget@SingleRecordTimeRangeWidget@@(QWidget *)@./ui/widgets/single_record_time_range_widget.cpp@3@definition@F????@LOC:4 COM:0 MVG:0@?@d@ +CCCC_Member@TableInfoSQLite@TableInfoSQLite@@()@ +CCCC_MemExt@TableInfoSQLite@TableInfoSQLite@@()@./data/sql/table_info_sqlite.cpp@7@definition@F????@LOC:1 COM:0 MVG:0@?@d@ +CCCC_Member@TableInfoSQLite@TableInfoSQLite@@(const QString &)@ +CCCC_MemExt@TableInfoSQLite@TableInfoSQLite@@(const QString &)@./data/sql/table_info_sqlite.cpp@9@definition@F????@LOC:4 COM:0 MVG:0@?@d@ +CCCC_Member@TableInfoSQLite@columnIndex@@(const QString &)@ +CCCC_MemExt@TableInfoSQLite@columnIndex@@(const QString &)@./data/sql/table_info_sqlite.cpp@98@definition@T????@LOC:0 COM:0 MVG:0@?@d@ +CCCC_Member@TableInfoSQLite@columnName@@(qint32)@ +CCCC_MemExt@TableInfoSQLite@columnName@@(qint32)@./data/sql/table_info_sqlite.cpp@102@definition@T????@LOC:0 COM:0 MVG:0@?@d@ +CCCC_Member@TableInfoSQLite@columnNames@@()@ +CCCC_MemExt@TableInfoSQLite@columnNames@@()@./data/sql/table_info_sqlite.cpp@86@definition@T????@LOC:0 COM:0 MVG:0@?@d@ +CCCC_Member@TableInfoSQLite@databaseTableName@@()@ +CCCC_MemExt@TableInfoSQLite@databaseTableName@@()@./data/sql/table_info_sqlite.cpp@49@declaration@T????@LOC:0 COM:0 MVG:0@?@D@ +CCCC_Member@TableInfoSQLite@foreignKeyTable@@(const QString &)@ +CCCC_MemExt@TableInfoSQLite@foreignKeyTable@@(const QString &)@./data/sql/table_info_sqlite.cpp@54@definition@T????@LOC:0 COM:0 MVG:0@?@d@ +CCCC_Member@TableInfoSQLite@isPrimaryKey@@(const QString &)@ +CCCC_MemExt@TableInfoSQLite@isPrimaryKey@@(const QString &)@./data/sql/table_info_sqlite.cpp@90@definition@T????@LOC:0 COM:0 MVG:0@?@d@ +CCCC_Member@TableInfoSQLite@loadColumnInfo@@()@ +CCCC_MemExt@TableInfoSQLite@loadColumnInfo@@()@./data/sql/table_info_sqlite.cpp@14@definition@F????@LOC:26 COM:0 MVG:6@?@d@ +CCCC_Member@TicketGenerator@TicketGenerator@@(const QPair &,const QPair &,const QPair &)@ +CCCC_MemExt@TicketGenerator@TicketGenerator@@(const QPair &,const QPair &,const QPair &)@./core/services/ticket_generator.cpp@21@definition@F????@LOC:13 COM:3 MVG:1@?@d@ +CCCC_Member@TicketGenerator@calculateRemainingCapacity@@()@ +CCCC_MemExt@TicketGenerator@calculateRemainingCapacity@@()@./core/services/ticket_generator.cpp@154@definition@T????@LOC:3 COM:0 MVG:1@?@d@ +CCCC_Member@TicketGenerator@clearStaleData@@()@ +CCCC_MemExt@TicketGenerator@clearStaleData@@()@./core/services/ticket_generator.cpp@205@definition@F????@LOC:13 COM:0 MVG:1@?@d@ +CCCC_Member@TicketGenerator@createFailureMessage@@(const QString &)@ +CCCC_MemExt@TicketGenerator@createFailureMessage@@(const QString &)@./core/services/ticket_generator.cpp@136@definition@T????@LOC:11 COM:0 MVG:1@?@d@ +CCCC_Member@TicketGenerator@createRecord@@()@ +CCCC_MemExt@TicketGenerator@createRecord@@()@./core/services/ticket_generator.cpp@158@definition@F????@LOC:11 COM:0 MVG:2@?@d@ +CCCC_Member@TicketGenerator@createSuccessMessage@@()@ +CCCC_MemExt@TicketGenerator@createSuccessMessage@@()@./core/services/ticket_generator.cpp@148@definition@T????@LOC:5 COM:0 MVG:1@?@d@ +CCCC_Member@TicketGenerator@generateFillRatioPerSession@@()@ +CCCC_MemExt@TicketGenerator@generateFillRatioPerSession@@()@./core/services/ticket_generator.cpp@120@definition@T????@LOC:5 COM:0 MVG:1@?@d@ +CCCC_Member@TicketGenerator@generator_@@(...)@ +CCCC_MemExt@TicketGenerator@generator_@@(...)@./core/services/ticket_generator.cpp@19@declaration@F????@LOC:1 COM:0 MVG:0@?@D@ +CCCC_Member@TicketGenerator@initializeRemainingCapacity@@()@ +CCCC_MemExt@TicketGenerator@initializeRemainingCapacity@@()@./core/services/ticket_generator.cpp@126@definition@F????@LOC:8 COM:0 MVG:1@?@d@ +CCCC_Member@TicketGenerator@initializeRepositories@@()@ +CCCC_MemExt@TicketGenerator@initializeRepositories@@()@./core/services/ticket_generator.cpp@37@definition@F????@LOC:13 COM:0 MVG:2@?@d@ +CCCC_Member@TicketGenerator@initializeSessionIdToAvailableSeatMap@@()@ +CCCC_MemExt@TicketGenerator@initializeSessionIdToAvailableSeatMap@@()@./core/services/ticket_generator.cpp@53@definition@F????@LOC:31 COM:2 MVG:5@?@d@ +CCCC_Member@TicketGenerator@initializeSessionIdToBeginAtMap@@()@ +CCCC_MemExt@TicketGenerator@initializeSessionIdToBeginAtMap@@()@./core/services/ticket_generator.cpp@92@definition@F????@LOC:11 COM:0 MVG:2@?@d@ +CCCC_Member@TicketGenerator@prepareData@@()@ +CCCC_MemExt@TicketGenerator@prepareData@@()@./core/services/ticket_generator.cpp@173@definition@F????@LOC:23 COM:2 MVG:3@?@d@ +CCCC_Member@TicketGenerator@setFillRatioPerSessionRange@@(const QPair &)@ +CCCC_MemExt@TicketGenerator@setFillRatioPerSessionRange@@(const QPair &)@./core/services/ticket_generator.cpp@105@definition@F????@LOC:12 COM:0 MVG:3@?@d@ +CCCC_Member@TicketReturnWidget@TicketReturnWidget@@(QWidget *)@ +CCCC_MemExt@TicketReturnWidget@TicketReturnWidget@@(QWidget *)@./ui/widgets/ticket_return_widget.cpp@13@definition@F????@LOC:9 COM:1 MVG:0@?@d@ +CCCC_Member@TicketReturnWidget@initializeModels@@()@ +CCCC_MemExt@TicketReturnWidget@initializeModels@@()@./ui/widgets/ticket_return_widget.cpp@49@definition@F????@LOC:10 COM:0 MVG:1@?@d@ +CCCC_Member@TicketReturnWidget@initializeRepositories@@()@ +CCCC_MemExt@TicketReturnWidget@initializeRepositories@@()@./ui/widgets/ticket_return_widget.cpp@36@definition@F????@LOC:10 COM:0 MVG:1@?@d@ +CCCC_Member@TicketReturnWidget@onPushButtonRefundTicketClicked@@()@ +CCCC_MemExt@TicketReturnWidget@onPushButtonRefundTicketClicked@@()@./ui/widgets/ticket_return_widget.cpp@70@definition@F????@LOC:29 COM:0 MVG:5@?@d@ +CCCC_Member@TicketReturnWidget@onTicketFieldRetrieved@@(const QSqlField &)@ +CCCC_MemExt@TicketReturnWidget@onTicketFieldRetrieved@@(const QSqlField &)@./ui/widgets/ticket_return_widget.cpp@107@definition@F????@LOC:3 COM:0 MVG:0@?@d@ +CCCC_Member@TicketReturnWidget@setupConnections@@()@ +CCCC_MemExt@TicketReturnWidget@setupConnections@@()@./ui/widgets/ticket_return_widget.cpp@62@definition@F????@LOC:6 COM:0 MVG:0@?@d@ +CCCC_Member@TicketReturnWidget@setupTableView@@()@ +CCCC_MemExt@TicketReturnWidget@setupTableView@@()@./ui/widgets/ticket_return_widget.cpp@25@definition@F????@LOC:3 COM:1 MVG:0@?@d@ +CCCC_Member@TicketReturnWidget@setupTicketFinder@@()@ +CCCC_MemExt@TicketReturnWidget@setupTicketFinder@@()@./ui/widgets/ticket_return_widget.cpp@29@definition@F????@LOC:6 COM:0 MVG:0@?@d@ +CCCC_Member@TicketSaleWidget@TicketSaleWidget@@(QWidget *)@ +CCCC_MemExt@TicketSaleWidget@TicketSaleWidget@@(QWidget *)@./ui/widgets/ticket_sale_widget.cpp@15@definition@F????@LOC:9 COM:3 MVG:0@?@d@ +CCCC_Member@TicketSaleWidget@initializeModels@@()@ +CCCC_MemExt@TicketSaleWidget@initializeModels@@()@./ui/widgets/ticket_sale_widget.cpp@43@definition@F????@LOC:10 COM:0 MVG:1@?@d@ +CCCC_Member@TicketSaleWidget@initializeRepositories@@()@ +CCCC_MemExt@TicketSaleWidget@initializeRepositories@@()@./ui/widgets/ticket_sale_widget.cpp@30@definition@F????@LOC:10 COM:0 MVG:1@?@d@ +CCCC_Member@TicketSaleWidget@onFieldRetrieved@@(const QSqlField &)@ +CCCC_MemExt@TicketSaleWidget@onFieldRetrieved@@(const QSqlField &)@./ui/widgets/ticket_sale_widget.cpp@97@definition@F????@LOC:3 COM:0 MVG:0@?@d@ +CCCC_Member@TicketSaleWidget@onPushButtonSellTicketClicked@@()@ +CCCC_MemExt@TicketSaleWidget@onPushButtonSellTicketClicked@@()@./ui/widgets/ticket_sale_widget.cpp@71@definition@F????@LOC:21 COM:0 MVG:5@?@d@ +CCCC_Member@TicketSaleWidget@setupConnections@@()@ +CCCC_MemExt@TicketSaleWidget@setupConnections@@()@./ui/widgets/ticket_sale_widget.cpp@56@definition@F????@LOC:6 COM:0 MVG:0@?@d@ +CCCC_Member@TicketSaleWidget@setupSessionFinder@@()@ +CCCC_MemExt@TicketSaleWidget@setupSessionFinder@@()@./ui/widgets/ticket_sale_widget.cpp@64@definition@F????@LOC:6 COM:0 MVG:0@?@d@ +CCCC_Member@TicketSaleWidget@setupTableView@@()@ +CCCC_MemExt@TicketSaleWidget@setupTableView@@()@./ui/widgets/ticket_sale_widget.cpp@26@definition@F????@LOC:3 COM:0 MVG:0@?@d@ +CCCC_Member@TicketSaleWidget@validateSessionValues@@(const initializer_list &)@ +CCCC_MemExt@TicketSaleWidget@validateSessionValues@@(const initializer_list &)@./ui/widgets/ticket_sale_widget.cpp@102@definition@F????@LOC:8 COM:1 MVG:3@?@d@ +CCCC_Member@TicketSalesReportWidget@TicketSalesReportWidget@@(QWidget *)@ +CCCC_MemExt@TicketSalesReportWidget@TicketSalesReportWidget@@(QWidget *)@./ui/widgets/ticket_sales_report_widget.cpp@45@definition@F????@LOC:8 COM:1 MVG:0@?@d@ +CCCC_Member@TicketSalesReportWidget@aggregateByDateTime@@(const QVector &,function)@ +CCCC_MemExt@TicketSalesReportWidget@aggregateByDateTime@@(const QVector &,function)@./ui/widgets/ticket_sales_report_widget.cpp@207@definition@F????@LOC:17 COM:0 MVG:4@?@d@ +CCCC_Member@TicketSalesReportWidget@configureEntityFinder@@(const QString &,const QString &,const QString &)@ +CCCC_MemExt@TicketSalesReportWidget@configureEntityFinder@@(const QString &,const QString &,const QString &)@./ui/widgets/ticket_sales_report_widget.cpp@158@definition@F????@LOC:7 COM:0 MVG:0@?@d@ +CCCC_Member@TicketSalesReportWidget@configureReportForGenre@@()@ +CCCC_MemExt@TicketSalesReportWidget@configureReportForGenre@@()@./ui/widgets/ticket_sales_report_widget.cpp@55@definition@F????@LOC:18 COM:4 MVG:0@?@d@ +CCCC_Member@TicketSalesReportWidget@configureReportForHall@@()@ +CCCC_MemExt@TicketSalesReportWidget@configureReportForHall@@()@./ui/widgets/ticket_sales_report_widget.cpp@77@definition@F????@LOC:18 COM:4 MVG:0@?@d@ +CCCC_Member@TicketSalesReportWidget@configureReportForMovie@@()@ +CCCC_MemExt@TicketSalesReportWidget@configureReportForMovie@@()@./ui/widgets/ticket_sales_report_widget.cpp@99@definition@F????@LOC:18 COM:4 MVG:0@?@d@ +CCCC_Member@TicketSalesReportWidget@createChart@@(const QMap &)@ +CCCC_MemExt@TicketSalesReportWidget@createChart@@(const QMap &)@./ui/widgets/ticket_sales_report_widget.cpp@281@definition@F????@LOC:51 COM:0 MVG:3@?@d@ +CCCC_Member@TicketSalesReportWidget@createDateTimeAxis@@(int,const QString &,const QDateTime &,const QDateTime &)@ +CCCC_MemExt@TicketSalesReportWidget@createDateTimeAxis@@(int,const QString &,const QDateTime &,const QDateTime &)@./ui/widgets/ticket_sales_report_widget.cpp@231@definition@T????@LOC:10 COM:0 MVG:1@?@d@ +CCCC_Member@TicketSalesReportWidget@createValueAxis@@(int,const QString &)@ +CCCC_MemExt@TicketSalesReportWidget@createValueAxis@@(int,const QString &)@./ui/widgets/ticket_sales_report_widget.cpp@243@definition@T????@LOC:8 COM:0 MVG:1@?@d@ +CCCC_Member@TicketSalesReportWidget@dateRange@@(QDateTime &,QDateTime &)@ +CCCC_MemExt@TicketSalesReportWidget@dateRange@@(QDateTime &,QDateTime &)@./ui/widgets/ticket_sales_report_widget.cpp@274@definition@F????@LOC:6 COM:0 MVG:1@?@d@ +CCCC_Member@TicketSalesReportWidget@initializeChart@@()@ +CCCC_MemExt@TicketSalesReportWidget@initializeChart@@()@./ui/widgets/ticket_sales_report_widget.cpp@135@definition@F????@LOC:4 COM:0 MVG:0@?@d@ +CCCC_Member@TicketSalesReportWidget@initializeRepositories@@()@ +CCCC_MemExt@TicketSalesReportWidget@initializeRepositories@@()@./ui/widgets/ticket_sales_report_widget.cpp@121@definition@F????@LOC:11 COM:0 MVG:1@?@d@ +CCCC_Member@TicketSalesReportWidget@onEntityFinderReseted@@()@ +CCCC_MemExt@TicketSalesReportWidget@onEntityFinderReseted@@()@./ui/widgets/ticket_sales_report_widget.cpp@166@definition@F????@LOC:4 COM:0 MVG:0@?@d@ +CCCC_Member@TicketSalesReportWidget@onFieldRetrieved@@(const QSqlField &)@ +CCCC_MemExt@TicketSalesReportWidget@onFieldRetrieved@@(const QSqlField &)@./ui/widgets/ticket_sales_report_widget.cpp@196@definition@F????@LOC:4 COM:0 MVG:0@?@d@ +CCCC_Member@TicketSalesReportWidget@onPushButtonGenerateClicked@@()@ +CCCC_MemExt@TicketSalesReportWidget@onPushButtonGenerateClicked@@()@./ui/widgets/ticket_sales_report_widget.cpp@171@definition@F????@LOC:21 COM:0 MVG:6@?@d@ +CCCC_Member@TicketSalesReportWidget@onRecordRetrieved@@(const QSqlRecord &)@ +CCCC_MemExt@TicketSalesReportWidget@onRecordRetrieved@@(const QSqlRecord &)@./ui/widgets/ticket_sales_report_widget.cpp@201@definition@F????@LOC:4 COM:0 MVG:0@?@d@ +CCCC_Member@TicketSalesReportWidget@retrieveSessions@@(QVector &)@ +CCCC_MemExt@TicketSalesReportWidget@retrieveSessions@@(QVector &)@./ui/widgets/ticket_sales_report_widget.cpp@266@definition@F????@LOC:7 COM:0 MVG:1@?@d@ +CCCC_Member@TicketSalesReportWidget@setupChart@@()@ +CCCC_MemExt@TicketSalesReportWidget@setupChart@@()@./ui/widgets/ticket_sales_report_widget.cpp@140@definition@F????@LOC:3 COM:0 MVG:0@?@d@ +CCCC_Member@TicketSalesReportWidget@setupChart@@(QChart *,QAbstractSeries *,QAbstractAxis *,QAbstractAxis *)@ +CCCC_MemExt@TicketSalesReportWidget@setupChart@@(QChart *,QAbstractSeries *,QAbstractAxis *,QAbstractAxis *)@./ui/widgets/ticket_sales_report_widget.cpp@346@definition@T????@LOC:9 COM:0 MVG:0@?@d@ +CCCC_Member@TicketSalesReportWidget@setupConnections@@()@ +CCCC_MemExt@TicketSalesReportWidget@setupConnections@@()@./ui/widgets/ticket_sales_report_widget.cpp@144@definition@F????@LOC:10 COM:0 MVG:0@?@d@ +CCCC_Member@TicketSalesReportWidget@updateChartView@@(QChart *)@ +CCCC_MemExt@TicketSalesReportWidget@updateChartView@@(QChart *)@./ui/widgets/ticket_sales_report_widget.cpp@356@definition@T????@LOC:4 COM:0 MVG:0@?@d@ +CCCC_Member@TicketSalesReportWidget@validateData@@(const QMap &)@ +CCCC_MemExt@TicketSalesReportWidget@validateData@@(const QMap &)@./ui/widgets/ticket_sales_report_widget.cpp@252@definition@T????@LOC:8 COM:2 MVG:3@?@d@ +CCCC_Member@TicketsModel@TicketsModel@@(QObject *,const QSqlDatabase &)@ +CCCC_MemExt@TicketsModel@TicketsModel@@(QObject *,const QSqlDatabase &)@./ui/models/tickets_model.cpp@6@definition@F????@LOC:2 COM:0 MVG:0@?@d@ +CCCC_Member@TicketsModel@createMultiColumnFilter@@(const QString &)@ +CCCC_MemExt@TicketsModel@createMultiColumnFilter@@(const QString &)@./ui/models/tickets_model.cpp@39@definition@T????@LOC:12 COM:2 MVG:2@?@d@ +CCCC_Member@TicketsModel@headerData@@(int,Orientation,int)@ +CCCC_MemExt@TicketsModel@headerData@@(int,Orientation,int)@./ui/models/tickets_model.cpp@20@definition@T????@LOC:18 COM:0 MVG:9@?@d@ +CCCC_Member@TicketsModel@initialize@@()@ +CCCC_MemExt@TicketsModel@initialize@@()@./ui/models/tickets_model.cpp@9@definition@F????@LOC:8 COM:0 MVG:1@?@d@ +CCCC_Member@TicketsRepository@TicketsRepository@@(QSqlDatabase &,QObject *)@ +CCCC_MemExt@TicketsRepository@TicketsRepository@@(QSqlDatabase &,QObject *)@./data/sql/tickets_repository.cpp@10@definition@F????@LOC:2 COM:0 MVG:0@?@d@ +CCCC_Member@TicketsRepository@createTicket@@(const CreateTicketRequest &)@ +CCCC_MemExt@TicketsRepository@createTicket@@(const CreateTicketRequest &)@./data/sql/tickets_repository.cpp@14@definition@F????@LOC:13 COM:0 MVG:3@?@d@ +CCCC_Member@TicketsRepository@deleteTicketById@@(qint32)@ +CCCC_MemExt@TicketsRepository@deleteTicketById@@(qint32)@./data/sql/tickets_repository.cpp@87@definition@F????@LOC:10 COM:0 MVG:3@?@d@ +CCCC_Member@TicketsRepository@getAllTickets@@(QVector &)@ +CCCC_MemExt@TicketsRepository@getAllTickets@@(QVector &)@./data/sql/tickets_repository.cpp@51@definition@T????@LOC:13 COM:0 MVG:4@?@d@ +CCCC_Member@TicketsRepository@getTicketById@@(qint32,TicketDTO &)@ +CCCC_MemExt@TicketsRepository@getTicketById@@(qint32,TicketDTO &)@./data/sql/tickets_repository.cpp@30@definition@T????@LOC:16 COM:0 MVG:5@?@d@ +CCCC_Member@TicketsRepository@mapQueryToDTO@@(const QSqlQuery &)@ +CCCC_MemExt@TicketsRepository@mapQueryToDTO@@(const QSqlQuery &)@./data/sql/tickets_repository.cpp@100@definition@T????@LOC:8 COM:0 MVG:1@?@d@ +CCCC_Member@TicketsRepository@updateTicket@@(const UpdateTicketRequest &)@ +CCCC_MemExt@TicketsRepository@updateTicket@@(const UpdateTicketRequest &)@./data/sql/tickets_repository.cpp@69@definition@F????@LOC:15 COM:0 MVG:3@?@d@ +CCCC_Member@UsersRepository@UsersRepository@@(QSqlDatabase &,QObject *)@ +CCCC_MemExt@UsersRepository@UsersRepository@@(QSqlDatabase &,QObject *)@./data/sql/users_repository.cpp@10@definition@F????@LOC:2 COM:0 MVG:0@?@d@ +CCCC_Member@UsersRepository@createUser@@(const CreateUserRequest &)@ +CCCC_MemExt@UsersRepository@createUser@@(const CreateUserRequest &)@./data/sql/users_repository.cpp@13@definition@F????@LOC:14 COM:0 MVG:3@?@d@ +CCCC_Member@UsersRepository@deleteUserById@@(qint32)@ +CCCC_MemExt@UsersRepository@deleteUserById@@(qint32)@./data/sql/users_repository.cpp@108@definition@F????@LOC:10 COM:0 MVG:3@?@d@ +CCCC_Member@UsersRepository@getAllUsers@@(QVector &)@ +CCCC_MemExt@UsersRepository@getAllUsers@@(QVector &)@./data/sql/users_repository.cpp@71@definition@T????@LOC:13 COM:0 MVG:4@?@d@ +CCCC_Member@UsersRepository@getUserById@@(qint32,UserDTO &)@ +CCCC_MemExt@UsersRepository@getUserById@@(qint32,UserDTO &)@./data/sql/users_repository.cpp@30@definition@T????@LOC:16 COM:0 MVG:5@?@d@ +CCCC_Member@UsersRepository@getUserByUsername@@(const QString &,UserDTO &)@ +CCCC_MemExt@UsersRepository@getUserByUsername@@(const QString &,UserDTO &)@./data/sql/users_repository.cpp@50@definition@T????@LOC:17 COM:0 MVG:5@?@d@ +CCCC_Member@UsersRepository@mapQueryToDTO@@(const QSqlQuery &)@ +CCCC_MemExt@UsersRepository@mapQueryToDTO@@(const QSqlQuery &)@./data/sql/users_repository.cpp@121@definition@T????@LOC:9 COM:0 MVG:1@?@d@ +CCCC_Member@UsersRepository@updateUser@@(const UpdateUserRequest &)@ +CCCC_MemExt@UsersRepository@updateUser@@(const UpdateUserRequest &)@./data/sql/users_repository.cpp@88@definition@F????@LOC:16 COM:0 MVG:3@?@d@ +CCCC_Member@anonymous@QTEST_MAIN@@(DayManagerTest)@ +CCCC_MemExt@anonymous@QTEST_MAIN@@(DayManagerTest)@./tests_class/day_manager_test.cpp@174@definition@F????@LOC:1 COM:0 MVG:0@?@d@ +CCCC_Member@anonymous@QTEST_MAIN@@(ReservationManagerTest)@ +CCCC_MemExt@anonymous@QTEST_MAIN@@(ReservationManagerTest)@./tests_class/reservation_manager_test.cpp@67@definition@F????@LOC:1 COM:0 MVG:0@?@d@ +CCCC_Member@anonymous@enableSelection@@(QTableView *)@ +CCCC_MemExt@anonymous@enableSelection@@(QTableView *)@./ui/main_window/main_window.cpp@100@definition@F????@LOC:6 COM:2 MVG:0@?@d@ +CCCC_Member@anonymous@executor@@(TEST_DB)@ +CCCC_MemExt@anonymous@executor@@(TEST_DB)@./tests_schema/tests/sqlite_database_foreign_key_test.cpp@30@declaration@F????@LOC:1 COM:0 MVG:0@?@D@ +CCCC_Member@anonymous@main@@(...)@ +CCCC_MemExt@anonymous@main@@(...)@./src/main.cpp@6@definition@F????@LOC:14 COM:1 MVG:5@?@d@ +CCCC_Member@anonymous@main@@(int,char **)@ +CCCC_MemExt@anonymous@main@@(int,char **)@./tests_schema/tests/main_test.cpp@3@definition@F????@LOC:4 COM:0 MVG:1@?@d@ +CCCC_Member@anonymous@remove@@(...)@ +CCCC_MemExt@anonymous@remove@@(...)@./tests_schema/tests/sqlite_database_crud_test.cpp@30@declaration@F????@LOC:1 COM:0 MVG:0@?@D@ +CCCC_MemExt@anonymous@remove@@(...)@./tests_schema/tests/sqlite_database_trigger_test.cpp@31@declaration@F????@LOC:1 COM:0 MVG:0@?@D@ +CCCC_UseRel@QMetaObject@ApplicationConnector@ +CCCC_UseExt@QMetaObject@ApplicationConnector@./core/controllers/application_connector.cpp@273@pass by reference@F????@*@?@p@ +CCCC_UseExt@QMetaObject@ApplicationConnector@./core/controllers/application_connector.cpp@277@pass by reference@F????@*@?@p@ +CCCC_UseRel@QObject@ApplicationConnector@ +CCCC_UseExt@QObject@ApplicationConnector@./core/controllers/application_connector.cpp@8@pass by reference@?????@*@?@p@ +CCCC_UseExt@QObject@ApplicationConnector@./core/controllers/application_connector.cpp@268@pass by reference@F????@*@?@p@ +CCCC_UseRel@QString@ApplicationConnector@ +CCCC_UseExt@QString@ApplicationConnector@./core/controllers/application_connector.cpp@198@pass by reference@F????@*@?@p@ +CCCC_UseExt@QString@ApplicationConnector@./core/controllers/application_connector.cpp@199@pass by reference@F????@*@?@p@ +CCCC_UseExt@QString@ApplicationConnector@./core/controllers/application_connector.cpp@222@pass by reference@F????@*@?@p@ +CCCC_UseExt@QString@ApplicationConnector@./core/controllers/application_connector.cpp@223@pass by reference@F????@*@?@p@ +CCCC_UseRel@QVector@ApplicationConnector@ +CCCC_UseExt@QVector@ApplicationConnector@./core/controllers/application_connector.cpp@60@pass by reference@F????@*@?@p@ +CCCC_UseRel@bool@ApplicationConnector@ +CCCC_UseExt@bool@ApplicationConnector@./core/controllers/application_connector.cpp@279@pass by value@F????@*@?@P@ +CCCC_UseRel@QString@ApplicationController@ +CCCC_UseExt@QString@ApplicationController@./core/controllers/application_controller.cpp@51@pass by reference@F????@*@?@p@ +CCCC_UseExt@QString@ApplicationController@./core/controllers/application_controller.cpp@119@pass by reference@F????@*@?@p@ +CCCC_UseExt@QString@ApplicationController@./core/controllers/application_controller.cpp@129@pass by reference@F????@*@?@p@ +CCCC_UseExt@QString@ApplicationController@./core/controllers/application_controller.cpp@130@pass by reference@F????@*@?@p@ +CCCC_UseExt@QString@ApplicationController@./core/controllers/application_controller.cpp@131@pass by reference@F????@*@?@p@ +CCCC_UseExt@QString@ApplicationController@./core/controllers/application_controller.cpp@132@pass by reference@F????@*@?@p@ +CCCC_UseRel@qint32@ApplicationController@ +CCCC_UseExt@qint32@ApplicationController@./core/controllers/application_controller.cpp@113@pass by value@F????@*@?@P@ +CCCC_UseExt@qint32@ApplicationController@./core/controllers/application_controller.cpp@114@pass by value@F????@*@?@P@ +CCCC_UseRel@QString@AuthDialog@ +CCCC_UseExt@QString@AuthDialog@./ui/dialogs/auth_dialog.cpp@82@pass by reference@F????@*@?@p@ +CCCC_UseExt@QString@AuthDialog@./ui/dialogs/auth_dialog.cpp@82@pass by reference@F????@*@?@p@ +CCCC_UseExt@QString@AuthDialog@./ui/dialogs/auth_dialog.cpp@90@pass by reference@F????@*@?@p@ +CCCC_UseRel@QWidget@AuthDialog@ +CCCC_UseExt@QWidget@AuthDialog@./ui/dialogs/auth_dialog.cpp@14@pass by reference@?????@*@?@p@ +CCCC_UseRel@UserDTO@AuthDialog@ +CCCC_UseExt@UserDTO@AuthDialog@./ui/dialogs/auth_dialog.cpp@91@pass by reference@F????@*@?@p@ +CCCC_UseRel@QModelIndex@BaseSqlTableModel@ +CCCC_UseExt@QModelIndex@BaseSqlTableModel@./ui/models/base_sql_table_model.cpp@23@pass by reference@F????@*@?@p@ +CCCC_UseRel@QObject@BaseSqlTableModel@ +CCCC_UseExt@QObject@BaseSqlTableModel@./ui/models/base_sql_table_model.cpp@8@pass by reference@?????@*@?@p@ +CCCC_UseRel@QSqlDatabase@BaseSqlTableModel@ +CCCC_UseExt@QSqlDatabase@BaseSqlTableModel@./ui/models/base_sql_table_model.cpp@8@pass by value@?????@*@?@P@ +CCCC_UseRel@QString@BaseSqlTableModel@ +CCCC_UseExt@QString@BaseSqlTableModel@./ui/models/base_sql_table_model.cpp@44@pass by reference@T????@*@?@p@ +CCCC_UseExt@QString@BaseSqlTableModel@./ui/models/base_sql_table_model.cpp@54@pass by reference@F????@*@?@p@ +CCCC_UseExt@QString@BaseSqlTableModel@./ui/models/base_sql_table_model.cpp@68@pass by reference@F????@*@?@p@ +CCCC_UseExt@QString@BaseSqlTableModel@./ui/models/base_sql_table_model.cpp@79@pass by reference@T????@*@?@p@ +CCCC_UseRel@QObject@BaseSqlTableRepository@ +CCCC_UseExt@QObject@BaseSqlTableRepository@./data/sql/base_sql_table_repository.cpp@7@pass by reference@?????@*@?@p@ +CCCC_UseRel@QSqlDatabase@BaseSqlTableRepository@ +CCCC_UseExt@QSqlDatabase@BaseSqlTableRepository@./data/sql/base_sql_table_repository.cpp@6@pass by reference@?????@*@?@p@ +CCCC_UseRel@QSqlDatabase@DatabaseManager@ +CCCC_UseExt@QSqlDatabase@DatabaseManager@./core/db/database_manager.cpp@101@pass by reference@F????@*@?@p@ +CCCC_UseRel@QString@DatabaseManager@ +CCCC_UseExt@QString@DatabaseManager@./core/db/database_manager.cpp@21@pass by reference@F????@*@?@p@ +CCCC_UseExt@QString@DatabaseManager@./core/db/database_manager.cpp@68@pass by reference@F????@*@?@p@ +CCCC_UseRel@QStringList@DatabaseManager@ +CCCC_UseExt@QStringList@DatabaseManager@./core/db/database_manager.cpp@100@pass by reference@F????@*@?@p@ +CCCC_UseRel@QLocale@DateTimeDelegate@ +CCCC_UseExt@QLocale@DateTimeDelegate@./ui/delegates/date_time_delegate.cpp@7@pass by reference@F????@*@?@p@ +CCCC_UseRel@QObject@DateTimeDelegate@ +CCCC_UseExt@QObject@DateTimeDelegate@./ui/delegates/date_time_delegate.cpp@3@pass by reference@?????@*@?@p@ +CCCC_UseRel@QVariant@DateTimeDelegate@ +CCCC_UseExt@QVariant@DateTimeDelegate@./ui/delegates/date_time_delegate.cpp@6@pass by reference@F????@*@?@p@ +CCCC_UseRel@QDateTime@DateTimeGenerator@ +CCCC_UseExt@QDateTime@DateTimeGenerator@./core/services/date_time_generator.cpp@29@pass by reference@F????@*@?@p@ +CCCC_UseExt@QDateTime@DateTimeGenerator@./core/services/date_time_generator.cpp@56@pass by reference@F????@*@?@p@ +CCCC_UseExt@QDateTime@DateTimeGenerator@./core/services/date_time_generator.cpp@57@pass by reference@F????@*@?@p@ +CCCC_UseRel@QPair@DateTimeGenerator@ +CCCC_UseExt@QPair@DateTimeGenerator@./core/services/date_time_generator.cpp@3@pass by reference@?????@*@?@p@ +CCCC_UseExt@QPair@DateTimeGenerator@./core/services/date_time_generator.cpp@4@pass by reference@?????@*@?@p@ +CCCC_UseRel@QTime@DayManager@ +CCCC_UseExt@QTime@DayManager@./core/utils/day_manager.cpp@6@pass by reference@?????@*@?@p@ +CCCC_UseExt@QTime@DayManager@./core/utils/day_manager.cpp@6@pass by reference@?????@*@?@p@ +CCCC_UseExt@QTime@DayManager@./core/utils/day_manager.cpp@10@pass by reference@F????@*@?@p@ +CCCC_UseExt@QTime@DayManager@./core/utils/day_manager.cpp@10@pass by reference@F????@*@?@p@ +CCCC_UseExt@QTime@DayManager@./core/utils/day_manager.cpp@20@pass by reference@F????@*@?@p@ +CCCC_UseExt@QTime@DayManager@./core/utils/day_manager.cpp@60@pass by value@T????@*@?@P@ +CCCC_UseExt@QTime@DayManager@./core/utils/day_manager.cpp@73@pass by value@F????@*@?@P@ +CCCC_UseExt@QTime@DayManager@./core/utils/day_manager.cpp@86@pass by value@F????@*@?@P@ +CCCC_UseExt@QTime@DayManager@./core/utils/day_manager.cpp@119@pass by value@F????@*@?@P@ +CCCC_UseExt@QTime@DayManager@./core/utils/day_manager.cpp@198@pass by reference@F????@*@?@p@ +CCCC_UseExt@QTime@DayManager@./core/utils/day_manager.cpp@233@pass by reference@T????@*@?@p@ +CCCC_UseRel@qint64@DayManager@ +CCCC_UseExt@qint64@DayManager@./core/utils/day_manager.cpp@61@pass by value@T????@*@?@P@ +CCCC_UseExt@qint64@DayManager@./core/utils/day_manager.cpp@74@pass by value@F????@*@?@P@ +CCCC_UseExt@qint64@DayManager@./core/utils/day_manager.cpp@87@pass by value@F????@*@?@P@ +CCCC_UseExt@qint64@DayManager@./core/utils/day_manager.cpp@120@pass by value@F????@*@?@P@ +CCCC_UseExt@qint64@DayManager@./core/utils/day_manager.cpp@134@pass by value@F????@*@?@P@ +CCCC_UseExt@qint64@DayManager@./core/utils/day_manager.cpp@147@pass by value@F????@*@?@P@ +CCCC_UseExt@qint64@DayManager@./core/utils/day_manager.cpp@161@pass by value@F????@*@?@P@ +CCCC_UseExt@qint64@DayManager@./core/utils/day_manager.cpp@171@pass by value@F????@*@?@P@ +CCCC_UseExt@qint64@DayManager@./core/utils/day_manager.cpp@182@pass by value@F????@*@?@P@ +CCCC_UseExt@qint64@DayManager@./core/utils/day_manager.cpp@207@pass by value@F????@*@?@P@ +CCCC_UseRel@QObject@DayManagerTest@ +CCCC_UseExt@QObject@DayManagerTest@./tests_class/day_manager_test.cpp@4@inheritance@????0@*@0@I@ +CCCC_UseRel@QSqlField@DirectoriesManagementWidget@ +CCCC_UseExt@QSqlField@DirectoriesManagementWidget@./ui/widgets/directories_management_widget.cpp@145@pass by reference@F????@*@?@p@ +CCCC_UseRel@QWidget@DirectoriesManagementWidget@ +CCCC_UseExt@QWidget@DirectoriesManagementWidget@./ui/widgets/directories_management_widget.cpp@26@pass by reference@?????@*@?@p@ +CCCC_UseRel@QSqlField@EntityDeleterWidget@ +CCCC_UseExt@QSqlField@EntityDeleterWidget@./ui/widgets/entity_deleter_widget.cpp@71@pass by reference@F????@*@?@p@ +CCCC_UseRel@QSqlRecord@EntityDeleterWidget@ +CCCC_UseExt@QSqlRecord@EntityDeleterWidget@./ui/widgets/entity_deleter_widget.cpp@75@pass by reference@F????@*@?@p@ +CCCC_UseRel@QString@EntityDeleterWidget@ +CCCC_UseExt@QString@EntityDeleterWidget@./ui/widgets/entity_deleter_widget.cpp@173@pass by reference@F????@*@?@p@ +CCCC_UseRel@QWidget@EntityDeleterWidget@ +CCCC_UseExt@QWidget@EntityDeleterWidget@./ui/widgets/entity_deleter_widget.cpp@15@pass by reference@?????@*@?@p@ +CCCC_UseRel@RepositoryResult@EntityDeleterWidget@ +CCCC_UseExt@RepositoryResult@EntityDeleterWidget@./ui/widgets/entity_deleter_widget.cpp@172@pass by reference@F????@*@?@p@ +CCCC_UseRel@QSqlField@EntityFinderWidget@ +CCCC_UseExt@QSqlField@EntityFinderWidget@./ui/widgets/entity_finder_widget.cpp@111@pass by reference@F????@*@?@p@ +CCCC_UseRel@QSqlRecord@EntityFinderWidget@ +CCCC_UseExt@QSqlRecord@EntityFinderWidget@./ui/widgets/entity_finder_widget.cpp@42@pass by reference@F????@*@?@p@ +CCCC_UseExt@QSqlRecord@EntityFinderWidget@./ui/widgets/entity_finder_widget.cpp@106@pass by reference@F????@*@?@p@ +CCCC_UseRel@QString@EntityFinderWidget@ +CCCC_UseExt@QString@EntityFinderWidget@./ui/widgets/entity_finder_widget.cpp@15@pass by reference@F????@*@?@p@ +CCCC_UseExt@QString@EntityFinderWidget@./ui/widgets/entity_finder_widget.cpp@16@pass by reference@F????@*@?@p@ +CCCC_UseExt@QString@EntityFinderWidget@./ui/widgets/entity_finder_widget.cpp@60@pass by reference@F????@*@?@p@ +CCCC_UseRel@QWidget@EntityFinderWidget@ +CCCC_UseExt@QWidget@EntityFinderWidget@./ui/widgets/entity_finder_widget.cpp@8@pass by reference@?????@*@?@p@ +CCCC_UseExt@QWidget@EntityFinderWidget@./ui/widgets/entity_finder_widget.cpp@17@pass by reference@F????@*@?@p@ +CCCC_UseRel@bool@EntityFinderWidget@ +CCCC_UseExt@bool@EntityFinderWidget@./ui/widgets/entity_finder_widget.cpp@23@pass by value@F????@*@?@P@ +CCCC_UseRel@QAbstractItemModel@EntityUpdaterWidget@ +CCCC_UseExt@QAbstractItemModel@EntityUpdaterWidget@./ui/widgets/entity_updater_widget.cpp@430@pass by reference@FT???@*@?@p@ +CCCC_UseRel@QSqlField@EntityUpdaterWidget@ +CCCC_UseExt@QSqlField@EntityUpdaterWidget@./ui/widgets/entity_updater_widget.cpp@127@pass by reference@FT???@*@?@p@ +CCCC_UseExt@QSqlField@EntityUpdaterWidget@./ui/widgets/entity_updater_widget.cpp@133@pass by reference@FT???@*@?@p@ +CCCC_UseRel@QSqlRecord@EntityUpdaterWidget@ +CCCC_UseExt@QSqlRecord@EntityUpdaterWidget@./ui/widgets/entity_updater_widget.cpp@139@pass by reference@FT???@*@?@p@ +CCCC_UseRel@QString@EntityUpdaterWidget@ +CCCC_UseExt@QString@EntityUpdaterWidget@./ui/widgets/entity_updater_widget.cpp@93@pass by reference@FT???@*@?@p@ +CCCC_UseExt@QString@EntityUpdaterWidget@./ui/widgets/entity_updater_widget.cpp@93@pass by reference@FT???@*@?@p@ +CCCC_UseExt@QString@EntityUpdaterWidget@./ui/widgets/entity_updater_widget.cpp@116@pass by reference@FT???@*@?@p@ +CCCC_UseExt@QString@EntityUpdaterWidget@./ui/widgets/entity_updater_widget.cpp@122@pass by reference@FT???@*@?@p@ +CCCC_UseExt@QString@EntityUpdaterWidget@./ui/widgets/entity_updater_widget.cpp@145@pass by reference@FT???@*@?@p@ +CCCC_UseExt@QString@EntityUpdaterWidget@./ui/widgets/entity_updater_widget.cpp@155@pass by reference@FT???@*@?@p@ +CCCC_UseExt@QString@EntityUpdaterWidget@./ui/widgets/entity_updater_widget.cpp@165@pass by reference@FT???@*@?@p@ +CCCC_UseExt@QString@EntityUpdaterWidget@./ui/widgets/entity_updater_widget.cpp@175@pass by reference@FT???@*@?@p@ +CCCC_UseExt@QString@EntityUpdaterWidget@./ui/widgets/entity_updater_widget.cpp@184@pass by reference@FT???@*@?@p@ +CCCC_UseExt@QString@EntityUpdaterWidget@./ui/widgets/entity_updater_widget.cpp@446@pass by reference@FT???@*@?@p@ +CCCC_UseExt@QString@EntityUpdaterWidget@./ui/widgets/entity_updater_widget.cpp@485@pass by reference@FT???@*@?@p@ +CCCC_UseRel@QVariant@EntityUpdaterWidget@ +CCCC_UseExt@QVariant@EntityUpdaterWidget@./ui/widgets/entity_updater_widget.cpp@432@pass by reference@FT???@*@?@p@ +CCCC_UseRel@QWidget@EntityUpdaterWidget@ +CCCC_UseExt@QWidget@EntityUpdaterWidget@./ui/widgets/entity_updater_widget.cpp@33@pass by reference@?T???@*@?@p@ +CCCC_UseRel@RepositoryResult@EntityUpdaterWidget@ +CCCC_UseExt@RepositoryResult@EntityUpdaterWidget@./ui/widgets/entity_updater_widget.cpp@265@pass by reference@FT???@*@?@p@ +CCCC_UseExt@RepositoryResult@EntityUpdaterWidget@./ui/widgets/entity_updater_widget.cpp@277@pass by reference@FT???@*@?@p@ +CCCC_UseExt@RepositoryResult@EntityUpdaterWidget@./ui/widgets/entity_updater_widget.cpp@289@pass by reference@FT???@*@?@p@ +CCCC_UseExt@RepositoryResult@EntityUpdaterWidget@./ui/widgets/entity_updater_widget.cpp@301@pass by reference@FT???@*@?@p@ +CCCC_UseExt@RepositoryResult@EntityUpdaterWidget@./ui/widgets/entity_updater_widget.cpp@313@pass by reference@FT???@*@?@p@ +CCCC_UseExt@RepositoryResult@EntityUpdaterWidget@./ui/widgets/entity_updater_widget.cpp@325@pass by reference@FT???@*@?@p@ +CCCC_UseExt@RepositoryResult@EntityUpdaterWidget@./ui/widgets/entity_updater_widget.cpp@459@pass by reference@FT???@*@?@p@ +CCCC_UseExt@RepositoryResult@EntityUpdaterWidget@./ui/widgets/entity_updater_widget.cpp@484@pass by reference@FT???@*@?@p@ +CCCC_UseRel@QString@ErrorDialog@ +CCCC_UseExt@QString@ErrorDialog@./ui/dialogs/error_dialog.cpp@10@pass by reference@?????@*@?@p@ +CCCC_UseExt@QString@ErrorDialog@./ui/dialogs/error_dialog.cpp@39@pass by reference@F????@*@?@p@ +CCCC_UseExt@QString@ErrorDialog@./ui/dialogs/error_dialog.cpp@75@pass by reference@F????@*@?@p@ +CCCC_UseExt@QString@ErrorDialog@./ui/dialogs/error_dialog.cpp@99@pass by reference@F????@*@?@p@ +CCCC_UseExt@QString@ErrorDialog@./ui/dialogs/error_dialog.cpp@120@pass by reference@F????@*@?@p@ +CCCC_UseExt@QString@ErrorDialog@./ui/dialogs/error_dialog.cpp@144@pass by reference@F????@*@?@p@ +CCCC_UseExt@QString@ErrorDialog@./ui/dialogs/error_dialog.cpp@169@pass by reference@F????@*@?@p@ +CCCC_UseRel@QWidget@ErrorDialog@ +CCCC_UseExt@QWidget@ErrorDialog@./ui/dialogs/error_dialog.cpp@9@pass by reference@?????@*@?@p@ +CCCC_UseExt@QWidget@ErrorDialog@./ui/dialogs/error_dialog.cpp@39@pass by reference@F????@*@?@p@ +CCCC_UseRel@QSqlDatabase@ExecuteSqlFile@ +CCCC_UseExt@QSqlDatabase@ExecuteSqlFile@./core/db/execute_sql_file.cpp@5@pass by reference@?????@*@?@p@ +CCCC_UseRel@QString@ExecuteSqlFile@ +CCCC_UseExt@QString@ExecuteSqlFile@./core/db/execute_sql_file.cpp@10@pass by reference@F????@*@?@p@ +CCCC_UseExt@QString@ExecuteSqlFile@./core/db/execute_sql_file.cpp@52@pass by reference@F????@*@?@p@ +CCCC_UseExt@QString@ExecuteSqlFile@./core/db/execute_sql_file.cpp@52@pass by reference@F????@*@?@p@ +CCCC_UseExt@QString@ExecuteSqlFile@./core/db/execute_sql_file.cpp@86@pass by reference@F????@*@?@p@ +CCCC_UseExt@QString@ExecuteSqlFile@./core/db/execute_sql_file.cpp@96@pass by reference@F????@*@?@p@ +CCCC_UseExt@QString@ExecuteSqlFile@./core/db/execute_sql_file.cpp@101@pass by reference@F????@*@?@p@ +CCCC_UseRel@QStringList@ExecuteSqlFile@ +CCCC_UseExt@QStringList@ExecuteSqlFile@./core/db/execute_sql_file.cpp@34@pass by reference@F????@*@?@p@ +CCCC_UseRel@string@FileReader@ +CCCC_UseExt@string@FileReader@./tests_schema/tests_sources/file_reader.cpp@8@pass by reference@?????@*@?@p@ +CCCC_UseExt@string@FileReader@./tests_schema/tests_sources/file_reader.cpp@8@pass by reference@?????@*@?@p@ +CCCC_UseRel@Orientation@GenresModel@ +CCCC_UseExt@Orientation@GenresModel@./ui/models/genres_model.cpp@19@pass by value@F????@*@?@P@ +CCCC_UseRel@QObject@GenresModel@ +CCCC_UseExt@QObject@GenresModel@./ui/models/genres_model.cpp@5@pass by reference@?????@*@?@p@ +CCCC_UseRel@QSqlDatabase@GenresModel@ +CCCC_UseExt@QSqlDatabase@GenresModel@./ui/models/genres_model.cpp@5@pass by reference@?????@*@?@p@ +CCCC_UseRel@CreateGenreRequest@GenresRepository@ +CCCC_UseExt@CreateGenreRequest@GenresRepository@./data/sql/genres_repository.cpp@14@pass by reference@F????@*@?@p@ +CCCC_UseRel@GenreDTO@GenresRepository@ +CCCC_UseExt@GenreDTO@GenresRepository@./data/sql/genres_repository.cpp@28@pass by reference@F????@*@?@p@ +CCCC_UseRel@QObject@GenresRepository@ +CCCC_UseExt@QObject@GenresRepository@./data/sql/genres_repository.cpp@10@pass by reference@?????@*@?@p@ +CCCC_UseRel@QSqlDatabase@GenresRepository@ +CCCC_UseExt@QSqlDatabase@GenresRepository@./data/sql/genres_repository.cpp@10@pass by reference@?????@*@?@p@ +CCCC_UseRel@QSqlQuery@GenresRepository@ +CCCC_UseExt@QSqlQuery@GenresRepository@./data/sql/genres_repository.cpp@93@pass by reference@F????@*@?@p@ +CCCC_UseRel@QVector@GenresRepository@ +CCCC_UseExt@QVector@GenresRepository@./data/sql/genres_repository.cpp@48@pass by reference@T????@*@?@p@ +CCCC_UseRel@UpdateGenreRequest@GenresRepository@ +CCCC_UseExt@UpdateGenreRequest@GenresRepository@./data/sql/genres_repository.cpp@65@pass by reference@T????@*@?@p@ +CCCC_UseRel@qint32@GenresRepository@ +CCCC_UseExt@qint32@GenresRepository@./data/sql/genres_repository.cpp@27@pass by value@F????@*@?@P@ +CCCC_UseExt@qint32@GenresRepository@./data/sql/genres_repository.cpp@80@pass by value@F????@*@?@P@ +CCCC_UseRel@Orientation@HallsModel@ +CCCC_UseExt@Orientation@HallsModel@./ui/models/halls_model.cpp@20@pass by value@F????@*@?@P@ +CCCC_UseRel@QObject@HallsModel@ +CCCC_UseExt@QObject@HallsModel@./ui/models/halls_model.cpp@5@pass by reference@?????@*@?@p@ +CCCC_UseRel@QSqlDatabase@HallsModel@ +CCCC_UseExt@QSqlDatabase@HallsModel@./ui/models/halls_model.cpp@5@pass by reference@?????@*@?@p@ +CCCC_UseRel@CreateHallRequest@HallsRepository@ +CCCC_UseExt@CreateHallRequest@HallsRepository@./data/sql/halls_repository.cpp@13@pass by reference@F????@*@?@p@ +CCCC_UseRel@HallDTO@HallsRepository@ +CCCC_UseExt@HallDTO@HallsRepository@./data/sql/halls_repository.cpp@28@pass by reference@F????@*@?@p@ +CCCC_UseRel@QObject@HallsRepository@ +CCCC_UseExt@QObject@HallsRepository@./data/sql/halls_repository.cpp@10@pass by reference@?????@*@?@p@ +CCCC_UseRel@QSqlDatabase@HallsRepository@ +CCCC_UseExt@QSqlDatabase@HallsRepository@./data/sql/halls_repository.cpp@10@pass by reference@?????@*@?@p@ +CCCC_UseRel@QSqlQuery@HallsRepository@ +CCCC_UseExt@QSqlQuery@HallsRepository@./data/sql/halls_repository.cpp@92@pass by reference@F????@*@?@p@ +CCCC_UseRel@QVector@HallsRepository@ +CCCC_UseExt@QVector@HallsRepository@./data/sql/halls_repository.cpp@47@pass by reference@T????@*@?@p@ +CCCC_UseRel@UpdateHallRequest@HallsRepository@ +CCCC_UseExt@UpdateHallRequest@HallsRepository@./data/sql/halls_repository.cpp@63@pass by reference@T????@*@?@p@ +CCCC_UseRel@qint32@HallsRepository@ +CCCC_UseExt@qint32@HallsRepository@./data/sql/halls_repository.cpp@28@pass by value@F????@*@?@P@ +CCCC_UseExt@qint32@HallsRepository@./data/sql/halls_repository.cpp@79@pass by value@F????@*@?@P@ +CCCC_UseRel@QTableView@MainWindow@ +CCCC_UseExt@QTableView@MainWindow@./ui/main_window/main_window.cpp@86@pass by reference@F????@*@?@p@ +CCCC_UseExt@QTableView@MainWindow@./ui/main_window/main_window.cpp@111@pass by reference@F????@*@?@p@ +CCCC_UseRel@QWidget@MainWindow@ +CCCC_UseExt@QWidget@MainWindow@./ui/main_window/main_window.cpp@9@pass by reference@?????@*@?@p@ +CCCC_UseRel@qint32@MainWindow@ +CCCC_UseExt@qint32@MainWindow@./ui/main_window/main_window.cpp@9@pass by value@?????@*@?@P@ +CCCC_UseExt@qint32@MainWindow@./ui/main_window/main_window.cpp@9@pass by value@?????@*@?@P@ +CCCC_UseRel@QString@ModelManager@ +CCCC_UseExt@QString@ModelManager@./core/services/model_manager.cpp@37@pass by value@T????@*@?@P@ +CCCC_UseExt@QString@ModelManager@./core/services/model_manager.cpp@75@pass by reference@F????@*@?@p@ +CCCC_UseExt@QString@ModelManager@./core/services/model_manager.cpp@86@pass by reference@T????@*@?@p@ +CCCC_UseExt@QString@ModelManager@./core/services/model_manager.cpp@91@pass by reference@F????@*@?@p@ +CCCC_UseExt@QString@ModelManager@./core/services/model_manager.cpp@92@pass by reference@F????@*@?@p@ +CCCC_UseRel@Orientation@MoviesModel@ +CCCC_UseExt@Orientation@MoviesModel@./ui/models/movies_model.cpp@24@pass by value@F????@*@?@P@ +CCCC_UseRel@QObject@MoviesModel@ +CCCC_UseExt@QObject@MoviesModel@./ui/models/movies_model.cpp@6@pass by reference@?????@*@?@p@ +CCCC_UseRel@QSqlDatabase@MoviesModel@ +CCCC_UseExt@QSqlDatabase@MoviesModel@./ui/models/movies_model.cpp@6@pass by reference@?????@*@?@p@ +CCCC_UseRel@QString@MoviesModel@ +CCCC_UseExt@QString@MoviesModel@./ui/models/movies_model.cpp@43@pass by reference@T????@*@?@p@ +CCCC_UseExt@QString@MoviesModel@./ui/models/movies_model.cpp@44@pass by reference@T????@*@?@p@ +CCCC_UseExt@QString@MoviesModel@./ui/models/movies_model.cpp@60@pass by reference@T????@*@?@p@ +CCCC_UseRel@CreateMovieRequest@MoviesRepository@ +CCCC_UseExt@CreateMovieRequest@MoviesRepository@./data/sql/movies_repository.cpp@14@pass by reference@F????@*@?@p@ +CCCC_UseRel@MovieDTO@MoviesRepository@ +CCCC_UseExt@MovieDTO@MoviesRepository@./data/sql/movies_repository.cpp@48@pass by reference@T????@*@?@p@ +CCCC_UseRel@QObject@MoviesRepository@ +CCCC_UseExt@QObject@MoviesRepository@./data/sql/movies_repository.cpp@10@pass by reference@?????@*@?@p@ +CCCC_UseRel@QSqlDatabase@MoviesRepository@ +CCCC_UseExt@QSqlDatabase@MoviesRepository@./data/sql/movies_repository.cpp@10@pass by reference@?????@*@?@p@ +CCCC_UseRel@QSqlQuery@MoviesRepository@ +CCCC_UseExt@QSqlQuery@MoviesRepository@./data/sql/movies_repository.cpp@98@pass by reference@F????@*@?@p@ +CCCC_UseRel@QVector@MoviesRepository@ +CCCC_UseExt@QVector@MoviesRepository@./data/sql/movies_repository.cpp@31@pass by reference@F????@*@?@p@ +CCCC_UseRel@UpdateMovieRequest@MoviesRepository@ +CCCC_UseExt@UpdateMovieRequest@MoviesRepository@./data/sql/movies_repository.cpp@68@pass by reference@T????@*@?@p@ +CCCC_UseRel@qint32@MoviesRepository@ +CCCC_UseExt@qint32@MoviesRepository@./data/sql/movies_repository.cpp@47@pass by value@T????@*@?@P@ +CCCC_UseExt@qint32@MoviesRepository@./data/sql/movies_repository.cpp@85@pass by value@F????@*@?@P@ +CCCC_UseRel@QModelIndex@MultiColumnSortFilterProxyModel@ +CCCC_UseExt@QModelIndex@MultiColumnSortFilterProxyModel@./ui/models/multi_column_filter_proxy_model.cpp@10@pass by reference@F????@*@?@p@ +CCCC_UseRel@QObject@MultiColumnSortFilterProxyModel@ +CCCC_UseExt@QObject@MultiColumnSortFilterProxyModel@./ui/models/multi_column_filter_proxy_model.cpp@6@pass by reference@?????@*@?@p@ +CCCC_UseRel@QPair@RefundGenerator@ +CCCC_UseExt@QPair@RefundGenerator@./core/services/refund_generator.cpp@14@pass by reference@?????@*@?@p@ +CCCC_UseExt@QPair@RefundGenerator@./core/services/refund_generator.cpp@15@pass by reference@?????@*@?@p@ +CCCC_UseExt@QPair@RefundGenerator@./core/services/refund_generator.cpp@16@pass by reference@?????@*@?@p@ +CCCC_UseRel@QString@RefundGenerator@ +CCCC_UseExt@QString@RefundGenerator@./core/services/refund_generator.cpp@87@pass by reference@F????@*@?@p@ +CCCC_UseRel@Orientation@RefundsModel@ +CCCC_UseExt@Orientation@RefundsModel@./ui/models/refunds_model.cpp@19@pass by value@F????@*@?@P@ +CCCC_UseRel@QObject@RefundsModel@ +CCCC_UseExt@QObject@RefundsModel@./ui/models/refunds_model.cpp@5@pass by reference@?????@*@?@p@ +CCCC_UseRel@QSqlDatabase@RefundsModel@ +CCCC_UseExt@QSqlDatabase@RefundsModel@./ui/models/refunds_model.cpp@5@pass by reference@?????@*@?@p@ +CCCC_UseRel@QString@RefundsModel@ +CCCC_UseExt@QString@RefundsModel@./ui/models/refunds_model.cpp@38@pass by reference@T????@*@?@p@ +CCCC_UseRel@CreateRefundRequest@RefundsRepository@ +CCCC_UseExt@CreateRefundRequest@RefundsRepository@./data/sql/refunds_repository.cpp@14@pass by reference@F????@*@?@p@ +CCCC_UseRel@QObject@RefundsRepository@ +CCCC_UseExt@QObject@RefundsRepository@./data/sql/refunds_repository.cpp@10@pass by reference@?????@*@?@p@ +CCCC_UseRel@QSqlDatabase@RefundsRepository@ +CCCC_UseExt@QSqlDatabase@RefundsRepository@./data/sql/refunds_repository.cpp@10@pass by reference@?????@*@?@p@ +CCCC_UseRel@QSqlQuery@RefundsRepository@ +CCCC_UseExt@QSqlQuery@RefundsRepository@./data/sql/refunds_repository.cpp@106@pass by reference@F????@*@?@p@ +CCCC_UseRel@QVector@RefundsRepository@ +CCCC_UseExt@QVector@RefundsRepository@./data/sql/refunds_repository.cpp@57@pass by reference@T????@*@?@p@ +CCCC_UseRel@RefundDTO@RefundsRepository@ +CCCC_UseExt@RefundDTO@RefundsRepository@./data/sql/refunds_repository.cpp@31@pass by reference@F????@*@?@p@ +CCCC_UseRel@UpdateRefundRequest@RefundsRepository@ +CCCC_UseExt@UpdateRefundRequest@RefundsRepository@./data/sql/refunds_repository.cpp@75@pass by reference@T????@*@?@p@ +CCCC_UseRel@qint32@RefundsRepository@ +CCCC_UseExt@qint32@RefundsRepository@./data/sql/refunds_repository.cpp@30@pass by value@F????@*@?@P@ +CCCC_UseExt@qint32@RefundsRepository@./data/sql/refunds_repository.cpp@93@pass by value@F????@*@?@P@ +CCCC_UseRel@QString@RelationIdConfig@ +CCCC_UseExt@QString@RelationIdConfig@./core/services/relation_id_config.cpp@3@pass by reference@?????@*@?@p@ +CCCC_UseExt@QString@RelationIdConfig@./core/services/relation_id_config.cpp@4@pass by reference@?????@*@?@p@ +CCCC_UseExt@QString@RelationIdConfig@./core/services/relation_id_config.cpp@5@pass by reference@?????@*@?@p@ +CCCC_UseExt@QString@RelationIdConfig@./core/services/relation_id_config.cpp@6@pass by reference@?????@*@?@p@ +CCCC_UseRel@QWidget@ReportsWidget@ +CCCC_UseExt@QWidget@ReportsWidget@./ui/widgets/reports_widget.cpp@9@pass by reference@?????@*@?@p@ +CCCC_UseRel@QString@RepositoryManager@ +CCCC_UseExt@QString@RepositoryManager@./core/services/repository_manager.cpp@71@pass by reference@F????@*@?@p@ +CCCC_UseRel@QString@RepositoryResult@ +CCCC_UseExt@QString@RepositoryResult@./core/repositories/repository_result.cpp@5@pass by reference@F????@*@?@p@ +CCCC_UseRel@DayManager@ReservationManager@ +CCCC_UseExt@DayManager@ReservationManager@./core/utils/reservation_manager.cpp@6@pass by reference@?????@*@?@p@ +CCCC_UseExt@DayManager@ReservationManager@./core/utils/reservation_manager.cpp@12@pass by reference@F????@*@?@p@ +CCCC_UseRel@QTime@ReservationManager@ +CCCC_UseExt@QTime@ReservationManager@./core/utils/reservation_manager.cpp@49@pass by reference@T????@*@?@p@ +CCCC_UseExt@QTime@ReservationManager@./core/utils/reservation_manager.cpp@94@pass by reference@F????@*@?@p@ +CCCC_UseRel@qint64@ReservationManager@ +CCCC_UseExt@qint64@ReservationManager@./core/utils/reservation_manager.cpp@26@pass by value@T????@*@?@P@ +CCCC_UseRel@qsizetype@ReservationManager@ +CCCC_UseExt@qsizetype@ReservationManager@./core/utils/reservation_manager.cpp@5@pass by value@?????@*@?@P@ +CCCC_UseExt@qsizetype@ReservationManager@./core/utils/reservation_manager.cpp@5@pass by value@?????@*@?@P@ +CCCC_UseExt@qsizetype@ReservationManager@./core/utils/reservation_manager.cpp@84@pass by value@F????@*@?@P@ +CCCC_UseExt@qsizetype@ReservationManager@./core/utils/reservation_manager.cpp@93@pass by value@F????@*@?@P@ +CCCC_UseRel@QObject@ReservationManagerTest@ +CCCC_UseExt@QObject@ReservationManagerTest@./tests_class/reservation_manager_test.cpp@4@inheritance@????0@*@0@I@ +CCCC_UseRel@CreateRoleRequest@RolesRepository@ +CCCC_UseExt@CreateRoleRequest@RolesRepository@./data/sql/roles_repository.cpp@13@pass by reference@F????@*@?@p@ +CCCC_UseRel@QObject@RolesRepository@ +CCCC_UseExt@QObject@RolesRepository@./data/sql/roles_repository.cpp@10@pass by reference@?????@*@?@p@ +CCCC_UseRel@QSqlDatabase@RolesRepository@ +CCCC_UseExt@QSqlDatabase@RolesRepository@./data/sql/roles_repository.cpp@10@pass by reference@?????@*@?@p@ +CCCC_UseRel@QSqlQuery@RolesRepository@ +CCCC_UseExt@QSqlQuery@RolesRepository@./data/sql/roles_repository.cpp@91@pass by reference@F????@*@?@p@ +CCCC_UseRel@QVector@RolesRepository@ +CCCC_UseExt@QVector@RolesRepository@./data/sql/roles_repository.cpp@47@pass by reference@T????@*@?@p@ +CCCC_UseRel@RoleDTO@RolesRepository@ +CCCC_UseExt@RoleDTO@RolesRepository@./data/sql/roles_repository.cpp@28@pass by reference@F????@*@?@p@ +CCCC_UseRel@UpdateRoleRequest@RolesRepository@ +CCCC_UseExt@UpdateRoleRequest@RolesRepository@./data/sql/roles_repository.cpp@63@pass by reference@T????@*@?@p@ +CCCC_UseRel@qint32@RolesRepository@ +CCCC_UseExt@qint32@RolesRepository@./data/sql/roles_repository.cpp@28@pass by value@F????@*@?@P@ +CCCC_UseExt@qint32@RolesRepository@./data/sql/roles_repository.cpp@78@pass by value@F????@*@?@P@ +CCCC_UseRel@Genre@SQLiteDatabase@ +CCCC_UseExt@Genre@SQLiteDatabase@./tests_schema/tests_sources/sqlite_database.cpp@105@pass by reference@F????@*@?@p@ +CCCC_UseRel@Hall@SQLiteDatabase@ +CCCC_UseExt@Hall@SQLiteDatabase@./tests_schema/tests_sources/sqlite_database.cpp@237@pass by reference@F????@*@?@p@ +CCCC_UseRel@Movie@SQLiteDatabase@ +CCCC_UseExt@Movie@SQLiteDatabase@./tests_schema/tests_sources/sqlite_database.cpp@169@pass by reference@F????@*@?@p@ +CCCC_UseRel@NewGenre@SQLiteDatabase@ +CCCC_UseExt@NewGenre@SQLiteDatabase@./tests_schema/tests_sources/sqlite_database.cpp@86@pass by reference@F????@*@?@p@ +CCCC_UseRel@NewHall@SQLiteDatabase@ +CCCC_UseExt@NewHall@SQLiteDatabase@./tests_schema/tests_sources/sqlite_database.cpp@216@pass by reference@F????@*@?@p@ +CCCC_UseRel@NewMovie@SQLiteDatabase@ +CCCC_UseExt@NewMovie@SQLiteDatabase@./tests_schema/tests_sources/sqlite_database.cpp@147@pass by reference@F????@*@?@p@ +CCCC_UseRel@NewRefund@SQLiteDatabase@ +CCCC_UseExt@NewRefund@SQLiteDatabase@./tests_schema/tests_sources/sqlite_database.cpp@422@pass by reference@F????@*@?@p@ +CCCC_UseRel@NewSession@SQLiteDatabase@ +CCCC_UseExt@NewSession@SQLiteDatabase@./tests_schema/tests_sources/sqlite_database.cpp@280@pass by reference@F????@*@?@p@ +CCCC_UseRel@NewTicket@SQLiteDatabase@ +CCCC_UseExt@NewTicket@SQLiteDatabase@./tests_schema/tests_sources/sqlite_database.cpp@354@pass by reference@F????@*@?@p@ +CCCC_UseRel@Refund@SQLiteDatabase@ +CCCC_UseExt@Refund@SQLiteDatabase@./tests_schema/tests_sources/sqlite_database.cpp@445@pass by reference@F????@*@?@p@ +CCCC_UseRel@Session@SQLiteDatabase@ +CCCC_UseExt@Session@SQLiteDatabase@./tests_schema/tests_sources/sqlite_database.cpp@304@pass by reference@F????@*@?@p@ +CCCC_UseRel@Ticket@SQLiteDatabase@ +CCCC_UseExt@Ticket@SQLiteDatabase@./tests_schema/tests_sources/sqlite_database.cpp@376@pass by reference@F????@*@?@p@ +CCCC_UseRel@function@SQLiteDatabase@ +CCCC_UseExt@function@SQLiteDatabase@./tests_schema/tests_sources/sqlite_database.cpp@39@pass by reference@F????@*@?@p@ +CCCC_UseRel@string@SQLiteDatabase@ +CCCC_UseExt@string@SQLiteDatabase@./tests_schema/tests_sources/sqlite_database.cpp@8@pass by reference@?????@*@?@p@ +CCCC_UseExt@string@SQLiteDatabase@./tests_schema/tests_sources/sqlite_database.cpp@38@pass by reference@F????@*@?@p@ +CCCC_UseRel@SQLiteDatabase@SQLiteDatabaseCRUDTest@ +CCCC_UseExt@SQLiteDatabase@SQLiteDatabaseCRUDTest@./tests_schema/tests/sqlite_database_crud_test.cpp@13@has by reference@????1@LOC:0 COM:0 MVG:0@1@h@ +CCCC_UseRel@Test@SQLiteDatabaseCRUDTest@ +CCCC_UseExt@Test@SQLiteDatabaseCRUDTest@./tests_schema/tests/sqlite_database_crud_test.cpp@11@inheritance@?????@*@?@I@ +CCCC_UseRel@SQLiteDatabase@SQLiteDatabaseForeignKeyTest@ +CCCC_UseExt@SQLiteDatabase@SQLiteDatabaseForeignKeyTest@./tests_schema/tests/sqlite_database_foreign_key_test.cpp@13@has by reference@????1@LOC:0 COM:0 MVG:0@1@h@ +CCCC_UseRel@Test@SQLiteDatabaseForeignKeyTest@ +CCCC_UseExt@Test@SQLiteDatabaseForeignKeyTest@./tests_schema/tests/sqlite_database_foreign_key_test.cpp@10@inheritance@?????@*@?@I@ +CCCC_UseRel@SQLiteDatabase@SQLiteDatabaseTriggerTest@ +CCCC_UseExt@SQLiteDatabase@SQLiteDatabaseTriggerTest@./tests_schema/tests/sqlite_database_trigger_test.cpp@12@has by reference@????1@LOC:0 COM:0 MVG:0@1@h@ +CCCC_UseRel@Test@SQLiteDatabaseTriggerTest@ +CCCC_UseExt@Test@SQLiteDatabaseTriggerTest@./tests_schema/tests/sqlite_database_trigger_test.cpp@10@inheritance@?????@*@?@I@ +CCCC_UseRel@string@SQLiteFileExecutor@ +CCCC_UseExt@string@SQLiteFileExecutor@./tests_schema/tests_sources/sqlite_file_executor.cpp@6@pass by reference@?????@*@?@p@ +CCCC_UseExt@string@SQLiteFileExecutor@./tests_schema/tests_sources/sqlite_file_executor.cpp@21@pass by reference@F????@*@?@p@ +CCCC_UseRel@sqlite3@SQLiteStatement@ +CCCC_UseExt@sqlite3@SQLiteStatement@./tests_schema/tests_sources/sqlite_statement.cpp@5@pass by reference@?????@*@?@p@ +CCCC_UseRel@string@SQLiteStatement@ +CCCC_UseExt@string@SQLiteStatement@./tests_schema/tests_sources/sqlite_statement.cpp@5@pass by reference@?????@*@?@p@ +CCCC_UseExt@string@SQLiteStatement@./tests_schema/tests_sources/sqlite_statement.cpp@38@pass by reference@F????@*@?@p@ +CCCC_UseRel@qint32@SalesData@ +CCCC_UseExt@qint32@SalesData@./ui/widgets/ticket_sales_report_widget.cpp@21@pass by value@F????@*@?@P@ +CCCC_UseExt@qint32@SalesData@./ui/widgets/ticket_sales_report_widget.cpp@22@pass by value@F????@*@?@P@ +CCCC_UseExt@qint32@SalesData@./ui/widgets/ticket_sales_report_widget.cpp@23@pass by value@F????@*@?@P@ +CCCC_UseRel@QString@SchemaMetadata@ +CCCC_UseExt@QString@SchemaMetadata@./core/services/schema_metadata.cpp@85@pass by reference@F????@*@?@p@ +CCCC_UseExt@QString@SchemaMetadata@./core/services/schema_metadata.cpp@96@pass by reference@F????@*@?@p@ +CCCC_UseExt@QString@SchemaMetadata@./core/services/schema_metadata.cpp@108@pass by reference@F????@*@?@p@ +CCCC_UseExt@QString@SchemaMetadata@./core/services/schema_metadata.cpp@120@pass by reference@F????@*@?@p@ +CCCC_UseExt@QString@SchemaMetadata@./core/services/schema_metadata.cpp@133@pass by reference@F????@*@?@p@ +CCCC_UseRel@QString@SearchDialog@ +CCCC_UseExt@QString@SearchDialog@./ui/dialogs/search_dialog.cpp@17@pass by reference@F????@*@?@p@ +CCCC_UseExt@QString@SearchDialog@./ui/dialogs/search_dialog.cpp@18@pass by reference@F????@*@?@p@ +CCCC_UseExt@QString@SearchDialog@./ui/dialogs/search_dialog.cpp@34@pass by reference@F????@*@?@p@ +CCCC_UseExt@QString@SearchDialog@./ui/dialogs/search_dialog.cpp@43@pass by reference@F????@*@?@p@ +CCCC_UseExt@QString@SearchDialog@./ui/dialogs/search_dialog.cpp@111@pass by reference@F????@*@?@p@ +CCCC_UseRel@QWidget@SearchDialog@ +CCCC_UseExt@QWidget@SearchDialog@./ui/dialogs/search_dialog.cpp@8@pass by reference@?????@*@?@p@ +CCCC_UseExt@QWidget@SearchDialog@./ui/dialogs/search_dialog.cpp@18@pass by reference@F????@*@?@p@ +CCCC_UseRel@QList@SessionGenerator@ +CCCC_UseExt@QList@SessionGenerator@./core/services/session_generator.cpp@182@pass by reference@F????@*@?@p@ +CCCC_UseRel@QString@SessionGenerator@ +CCCC_UseExt@QString@SessionGenerator@./core/services/session_generator.cpp@120@pass by reference@F????@*@?@p@ +CCCC_UseRel@ReservationManager@SessionGenerator@ +CCCC_UseExt@ReservationManager@SessionGenerator@./core/services/session_generator.cpp@14@pass by reference@?????@*@?@p@ +CCCC_UseRel@qint32@SessionGenerator@ +CCCC_UseExt@qint32@SessionGenerator@./core/services/session_generator.cpp@43@pass by value@F????@*@?@P@ +CCCC_UseExt@qint32@SessionGenerator@./core/services/session_generator.cpp@181@pass by value@F????@*@?@P@ +CCCC_UseExt@qint32@SessionGenerator@./core/services/session_generator.cpp@214@pass by value@F????@*@?@P@ +CCCC_UseRel@QSqlField@SessionManagementWidget@ +CCCC_UseExt@QSqlField@SessionManagementWidget@./ui/widgets/session_management_widget.cpp@97@pass by reference@F????@*@?@p@ +CCCC_UseExt@QSqlField@SessionManagementWidget@./ui/widgets/session_management_widget.cpp@101@pass by reference@F????@*@?@p@ +CCCC_UseRel@QWidget@SessionManagementWidget@ +CCCC_UseExt@QWidget@SessionManagementWidget@./ui/widgets/session_management_widget.cpp@13@pass by reference@?????@*@?@p@ +CCCC_UseRel@Orientation@SessionsModel@ +CCCC_UseExt@Orientation@SessionsModel@./ui/models/sessions_model.cpp@68@pass by value@T????@*@?@P@ +CCCC_UseRel@QObject@SessionsModel@ +CCCC_UseExt@QObject@SessionsModel@./ui/models/sessions_model.cpp@6@pass by reference@?????@*@?@p@ +CCCC_UseRel@QSqlDatabase@SessionsModel@ +CCCC_UseExt@QSqlDatabase@SessionsModel@./ui/models/sessions_model.cpp@6@pass by reference@?????@*@?@p@ +CCCC_UseRel@QString@SessionsModel@ +CCCC_UseExt@QString@SessionsModel@./ui/models/sessions_model.cpp@26@pass by reference@F????@*@?@p@ +CCCC_UseExt@QString@SessionsModel@./ui/models/sessions_model.cpp@27@pass by reference@F????@*@?@p@ +CCCC_UseExt@QString@SessionsModel@./ui/models/sessions_model.cpp@47@pass by reference@T????@*@?@p@ +CCCC_UseExt@QString@SessionsModel@./ui/models/sessions_model.cpp@48@pass by reference@T????@*@?@p@ +CCCC_UseExt@QString@SessionsModel@./ui/models/sessions_model.cpp@89@pass by reference@T????@*@?@p@ +CCCC_UseRel@CreateSessionRequest@SessionsRepository@ +CCCC_UseExt@CreateSessionRequest@SessionsRepository@./data/sql/sessions_repository.cpp@14@pass by reference@F????@*@?@p@ +CCCC_UseRel@QObject@SessionsRepository@ +CCCC_UseExt@QObject@SessionsRepository@./data/sql/sessions_repository.cpp@10@pass by reference@?????@*@?@p@ +CCCC_UseRel@QSqlDatabase@SessionsRepository@ +CCCC_UseExt@QSqlDatabase@SessionsRepository@./data/sql/sessions_repository.cpp@10@pass by reference@?????@*@?@p@ +CCCC_UseRel@QSqlQuery@SessionsRepository@ +CCCC_UseExt@QSqlQuery@SessionsRepository@./data/sql/sessions_repository.cpp@103@pass by reference@F????@*@?@p@ +CCCC_UseRel@QVector@SessionsRepository@ +CCCC_UseExt@QVector@SessionsRepository@./data/sql/sessions_repository.cpp@53@pass by reference@T????@*@?@p@ +CCCC_UseRel@SessionDTO@SessionsRepository@ +CCCC_UseExt@SessionDTO@SessionsRepository@./data/sql/sessions_repository.cpp@33@pass by reference@F????@*@?@p@ +CCCC_UseRel@UpdateSessionRequest@SessionsRepository@ +CCCC_UseExt@UpdateSessionRequest@SessionsRepository@./data/sql/sessions_repository.cpp@71@pass by reference@T????@*@?@p@ +CCCC_UseRel@qint32@SessionsRepository@ +CCCC_UseExt@qint32@SessionsRepository@./data/sql/sessions_repository.cpp@32@pass by value@F????@*@?@P@ +CCCC_UseExt@qint32@SessionsRepository@./data/sql/sessions_repository.cpp@90@pass by value@F????@*@?@P@ +CCCC_UseRel@QObject@SessionsStatisticsRepository@ +CCCC_UseExt@QObject@SessionsStatisticsRepository@./data/sql/sessions_statistics_repository.cpp@12@pass by reference@?????@*@?@p@ +CCCC_UseRel@QSqlDatabase@SessionsStatisticsRepository@ +CCCC_UseExt@QSqlDatabase@SessionsStatisticsRepository@./data/sql/sessions_statistics_repository.cpp@12@pass by reference@?????@*@?@p@ +CCCC_UseRel@QSqlQuery@SessionsStatisticsRepository@ +CCCC_UseExt@QSqlQuery@SessionsStatisticsRepository@./data/sql/sessions_statistics_repository.cpp@16@pass by reference@F????@*@?@p@ +CCCC_UseExt@QSqlQuery@SessionsStatisticsRepository@./data/sql/sessions_statistics_repository.cpp@41@pass by reference@T????@*@?@p@ +CCCC_UseExt@QSqlQuery@SessionsStatisticsRepository@./data/sql/sessions_statistics_repository.cpp@161@pass by reference@T????@*@?@p@ +CCCC_UseRel@QString@SessionsStatisticsRepository@ +CCCC_UseExt@QString@SessionsStatisticsRepository@./data/sql/sessions_statistics_repository.cpp@149@pass by reference@T????@*@?@p@ +CCCC_UseRel@QVector@SessionsStatisticsRepository@ +CCCC_UseExt@QVector@SessionsStatisticsRepository@./data/sql/sessions_statistics_repository.cpp@41@pass by reference@T????@*@?@p@ +CCCC_UseExt@QVector@SessionsStatisticsRepository@./data/sql/sessions_statistics_repository.cpp@78@pass by reference@T????@*@?@p@ +CCCC_UseExt@QVector@SessionsStatisticsRepository@./data/sql/sessions_statistics_repository.cpp@97@pass by reference@T????@*@?@p@ +CCCC_UseExt@QVector@SessionsStatisticsRepository@./data/sql/sessions_statistics_repository.cpp@115@pass by reference@T????@*@?@p@ +CCCC_UseExt@QVector@SessionsStatisticsRepository@./data/sql/sessions_statistics_repository.cpp@133@pass by reference@T????@*@?@p@ +CCCC_UseRel@SessionStatisticsDTO@SessionsStatisticsRepository@ +CCCC_UseExt@SessionStatisticsDTO@SessionsStatisticsRepository@./data/sql/sessions_statistics_repository.cpp@59@pass by reference@T????@*@?@p@ +CCCC_UseRel@optional@SessionsStatisticsRepository@ +CCCC_UseExt@optional@SessionsStatisticsRepository@./data/sql/sessions_statistics_repository.cpp@95@pass by value@T????@*@?@P@ +CCCC_UseExt@optional@SessionsStatisticsRepository@./data/sql/sessions_statistics_repository.cpp@96@pass by value@T????@*@?@P@ +CCCC_UseExt@optional@SessionsStatisticsRepository@./data/sql/sessions_statistics_repository.cpp@113@pass by value@T????@*@?@P@ +CCCC_UseExt@optional@SessionsStatisticsRepository@./data/sql/sessions_statistics_repository.cpp@114@pass by value@T????@*@?@P@ +CCCC_UseExt@optional@SessionsStatisticsRepository@./data/sql/sessions_statistics_repository.cpp@131@pass by value@T????@*@?@P@ +CCCC_UseExt@optional@SessionsStatisticsRepository@./data/sql/sessions_statistics_repository.cpp@132@pass by value@T????@*@?@P@ +CCCC_UseExt@optional@SessionsStatisticsRepository@./data/sql/sessions_statistics_repository.cpp@149@pass by reference@T????@*@?@p@ +CCCC_UseExt@optional@SessionsStatisticsRepository@./data/sql/sessions_statistics_repository.cpp@150@pass by reference@T????@*@?@p@ +CCCC_UseExt@optional@SessionsStatisticsRepository@./data/sql/sessions_statistics_repository.cpp@161@pass by reference@T????@*@?@p@ +CCCC_UseExt@optional@SessionsStatisticsRepository@./data/sql/sessions_statistics_repository.cpp@162@pass by reference@T????@*@?@p@ +CCCC_UseRel@qint32@SessionsStatisticsRepository@ +CCCC_UseExt@qint32@SessionsStatisticsRepository@./data/sql/sessions_statistics_repository.cpp@59@pass by value@T????@*@?@P@ +CCCC_UseExt@qint32@SessionsStatisticsRepository@./data/sql/sessions_statistics_repository.cpp@95@pass by value@T????@*@?@P@ +CCCC_UseExt@qint32@SessionsStatisticsRepository@./data/sql/sessions_statistics_repository.cpp@113@pass by value@T????@*@?@P@ +CCCC_UseExt@qint32@SessionsStatisticsRepository@./data/sql/sessions_statistics_repository.cpp@131@pass by value@T????@*@?@P@ +CCCC_UseRel@QWidget@SingleRecordTimeRangeWidget@ +CCCC_UseExt@QWidget@SingleRecordTimeRangeWidget@./ui/widgets/single_record_time_range_widget.cpp@3@pass by reference@?????@*@?@p@ +CCCC_UseRel@QString@TableInfoSQLite@ +CCCC_UseExt@QString@TableInfoSQLite@./data/sql/table_info_sqlite.cpp@9@pass by reference@F????@*@?@p@ +CCCC_UseExt@QString@TableInfoSQLite@./data/sql/table_info_sqlite.cpp@54@pass by reference@T????@*@?@p@ +CCCC_UseExt@QString@TableInfoSQLite@./data/sql/table_info_sqlite.cpp@90@pass by reference@T????@*@?@p@ +CCCC_UseExt@QString@TableInfoSQLite@./data/sql/table_info_sqlite.cpp@98@pass by reference@T????@*@?@p@ +CCCC_UseRel@qint32@TableInfoSQLite@ +CCCC_UseExt@qint32@TableInfoSQLite@./data/sql/table_info_sqlite.cpp@102@pass by value@T????@*@?@P@ +CCCC_UseRel@QPair@TicketGenerator@ +CCCC_UseExt@QPair@TicketGenerator@./core/services/ticket_generator.cpp@22@pass by reference@F????@*@?@p@ +CCCC_UseExt@QPair@TicketGenerator@./core/services/ticket_generator.cpp@22@pass by reference@F????@*@?@p@ +CCCC_UseExt@QPair@TicketGenerator@./core/services/ticket_generator.cpp@23@pass by reference@F????@*@?@p@ +CCCC_UseExt@QPair@TicketGenerator@./core/services/ticket_generator.cpp@106@pass by reference@F????@*@?@p@ +CCCC_UseRel@QString@TicketGenerator@ +CCCC_UseExt@QString@TicketGenerator@./core/services/ticket_generator.cpp@136@pass by reference@F????@*@?@p@ +CCCC_UseRel@QSqlField@TicketReturnWidget@ +CCCC_UseExt@QSqlField@TicketReturnWidget@./ui/widgets/ticket_return_widget.cpp@107@pass by reference@F????@*@?@p@ +CCCC_UseRel@QWidget@TicketReturnWidget@ +CCCC_UseExt@QWidget@TicketReturnWidget@./ui/widgets/ticket_return_widget.cpp@13@pass by reference@?????@*@?@p@ +CCCC_UseRel@QSqlField@TicketSaleWidget@ +CCCC_UseExt@QSqlField@TicketSaleWidget@./ui/widgets/ticket_sale_widget.cpp@97@pass by reference@F????@*@?@p@ +CCCC_UseRel@QWidget@TicketSaleWidget@ +CCCC_UseExt@QWidget@TicketSaleWidget@./ui/widgets/ticket_sale_widget.cpp@15@pass by reference@?????@*@?@p@ +CCCC_UseRel@initializer_list@TicketSaleWidget@ +CCCC_UseExt@initializer_list@TicketSaleWidget@./ui/widgets/ticket_sale_widget.cpp@103@pass by reference@F????@*@?@p@ +CCCC_UseRel@QAbstractAxis@TicketSalesReportWidget@ +CCCC_UseExt@QAbstractAxis@TicketSalesReportWidget@./ui/widgets/ticket_sales_report_widget.cpp@347@pass by reference@F????@*@?@p@ +CCCC_UseExt@QAbstractAxis@TicketSalesReportWidget@./ui/widgets/ticket_sales_report_widget.cpp@348@pass by reference@F????@*@?@p@ +CCCC_UseRel@QAbstractSeries@TicketSalesReportWidget@ +CCCC_UseExt@QAbstractSeries@TicketSalesReportWidget@./ui/widgets/ticket_sales_report_widget.cpp@346@pass by reference@F????@*@?@p@ +CCCC_UseRel@QChart@TicketSalesReportWidget@ +CCCC_UseExt@QChart@TicketSalesReportWidget@./ui/widgets/ticket_sales_report_widget.cpp@346@pass by reference@F????@*@?@p@ +CCCC_UseExt@QChart@TicketSalesReportWidget@./ui/widgets/ticket_sales_report_widget.cpp@356@pass by reference@T????@*@?@p@ +CCCC_UseRel@QDateTime@TicketSalesReportWidget@ +CCCC_UseExt@QDateTime@TicketSalesReportWidget@./ui/widgets/ticket_sales_report_widget.cpp@232@pass by reference@F????@*@?@p@ +CCCC_UseExt@QDateTime@TicketSalesReportWidget@./ui/widgets/ticket_sales_report_widget.cpp@233@pass by reference@F????@*@?@p@ +CCCC_UseExt@QDateTime@TicketSalesReportWidget@./ui/widgets/ticket_sales_report_widget.cpp@274@pass by reference@F????@*@?@p@ +CCCC_UseExt@QDateTime@TicketSalesReportWidget@./ui/widgets/ticket_sales_report_widget.cpp@275@pass by reference@F????@*@?@p@ +CCCC_UseRel@QMap@TicketSalesReportWidget@ +CCCC_UseExt@QMap@TicketSalesReportWidget@./ui/widgets/ticket_sales_report_widget.cpp@253@pass by reference@T????@*@?@p@ +CCCC_UseExt@QMap@TicketSalesReportWidget@./ui/widgets/ticket_sales_report_widget.cpp@282@pass by reference@F????@*@?@p@ +CCCC_UseRel@QSqlField@TicketSalesReportWidget@ +CCCC_UseExt@QSqlField@TicketSalesReportWidget@./ui/widgets/ticket_sales_report_widget.cpp@196@pass by reference@F????@*@?@p@ +CCCC_UseRel@QSqlRecord@TicketSalesReportWidget@ +CCCC_UseExt@QSqlRecord@TicketSalesReportWidget@./ui/widgets/ticket_sales_report_widget.cpp@201@pass by reference@F????@*@?@p@ +CCCC_UseRel@QString@TicketSalesReportWidget@ +CCCC_UseExt@QString@TicketSalesReportWidget@./ui/widgets/ticket_sales_report_widget.cpp@159@pass by reference@F????@*@?@p@ +CCCC_UseExt@QString@TicketSalesReportWidget@./ui/widgets/ticket_sales_report_widget.cpp@159@pass by reference@F????@*@?@p@ +CCCC_UseExt@QString@TicketSalesReportWidget@./ui/widgets/ticket_sales_report_widget.cpp@160@pass by reference@F????@*@?@p@ +CCCC_UseExt@QString@TicketSalesReportWidget@./ui/widgets/ticket_sales_report_widget.cpp@232@pass by reference@F????@*@?@p@ +CCCC_UseExt@QString@TicketSalesReportWidget@./ui/widgets/ticket_sales_report_widget.cpp@244@pass by reference@T????@*@?@p@ +CCCC_UseRel@QVector@TicketSalesReportWidget@ +CCCC_UseExt@QVector@TicketSalesReportWidget@./ui/widgets/ticket_sales_report_widget.cpp@208@pass by reference@F????@*@?@p@ +CCCC_UseExt@QVector@TicketSalesReportWidget@./ui/widgets/ticket_sales_report_widget.cpp@267@pass by reference@T????@*@?@p@ +CCCC_UseRel@QWidget@TicketSalesReportWidget@ +CCCC_UseExt@QWidget@TicketSalesReportWidget@./ui/widgets/ticket_sales_report_widget.cpp@45@pass by reference@F????@*@?@p@ +CCCC_UseRel@function@TicketSalesReportWidget@ +CCCC_UseExt@function@TicketSalesReportWidget@./ui/widgets/ticket_sales_report_widget.cpp@209@pass by value@F????@*@?@P@ +CCCC_UseRel@Orientation@TicketsModel@ +CCCC_UseExt@Orientation@TicketsModel@./ui/models/tickets_model.cpp@20@pass by value@F????@*@?@P@ +CCCC_UseRel@QObject@TicketsModel@ +CCCC_UseExt@QObject@TicketsModel@./ui/models/tickets_model.cpp@6@pass by reference@?????@*@?@p@ +CCCC_UseRel@QSqlDatabase@TicketsModel@ +CCCC_UseExt@QSqlDatabase@TicketsModel@./ui/models/tickets_model.cpp@6@pass by reference@?????@*@?@p@ +CCCC_UseRel@QString@TicketsModel@ +CCCC_UseExt@QString@TicketsModel@./ui/models/tickets_model.cpp@39@pass by reference@T????@*@?@p@ +CCCC_UseRel@CreateTicketRequest@TicketsRepository@ +CCCC_UseExt@CreateTicketRequest@TicketsRepository@./data/sql/tickets_repository.cpp@14@pass by reference@F????@*@?@p@ +CCCC_UseRel@QObject@TicketsRepository@ +CCCC_UseExt@QObject@TicketsRepository@./data/sql/tickets_repository.cpp@10@pass by reference@?????@*@?@p@ +CCCC_UseRel@QSqlDatabase@TicketsRepository@ +CCCC_UseExt@QSqlDatabase@TicketsRepository@./data/sql/tickets_repository.cpp@10@pass by reference@?????@*@?@p@ +CCCC_UseRel@QSqlQuery@TicketsRepository@ +CCCC_UseExt@QSqlQuery@TicketsRepository@./data/sql/tickets_repository.cpp@100@pass by reference@F????@*@?@p@ +CCCC_UseRel@QVector@TicketsRepository@ +CCCC_UseExt@QVector@TicketsRepository@./data/sql/tickets_repository.cpp@51@pass by reference@T????@*@?@p@ +CCCC_UseRel@TicketDTO@TicketsRepository@ +CCCC_UseExt@TicketDTO@TicketsRepository@./data/sql/tickets_repository.cpp@31@pass by reference@F????@*@?@p@ +CCCC_UseRel@UpdateTicketRequest@TicketsRepository@ +CCCC_UseExt@UpdateTicketRequest@TicketsRepository@./data/sql/tickets_repository.cpp@69@pass by reference@T????@*@?@p@ +CCCC_UseRel@qint32@TicketsRepository@ +CCCC_UseExt@qint32@TicketsRepository@./data/sql/tickets_repository.cpp@30@pass by value@F????@*@?@P@ +CCCC_UseExt@qint32@TicketsRepository@./data/sql/tickets_repository.cpp@87@pass by value@F????@*@?@P@ +CCCC_UseRel@CreateUserRequest@UsersRepository@ +CCCC_UseExt@CreateUserRequest@UsersRepository@./data/sql/users_repository.cpp@13@pass by reference@F????@*@?@p@ +CCCC_UseRel@QObject@UsersRepository@ +CCCC_UseExt@QObject@UsersRepository@./data/sql/users_repository.cpp@10@pass by reference@?????@*@?@p@ +CCCC_UseRel@QSqlDatabase@UsersRepository@ +CCCC_UseExt@QSqlDatabase@UsersRepository@./data/sql/users_repository.cpp@10@pass by reference@?????@*@?@p@ +CCCC_UseRel@QSqlQuery@UsersRepository@ +CCCC_UseExt@QSqlQuery@UsersRepository@./data/sql/users_repository.cpp@121@pass by reference@F????@*@?@p@ +CCCC_UseRel@QString@UsersRepository@ +CCCC_UseExt@QString@UsersRepository@./data/sql/users_repository.cpp@50@pass by reference@T????@*@?@p@ +CCCC_UseRel@QVector@UsersRepository@ +CCCC_UseExt@QVector@UsersRepository@./data/sql/users_repository.cpp@71@pass by reference@T????@*@?@p@ +CCCC_UseRel@UpdateUserRequest@UsersRepository@ +CCCC_UseExt@UpdateUserRequest@UsersRepository@./data/sql/users_repository.cpp@88@pass by reference@T????@*@?@p@ +CCCC_UseRel@UserDTO@UsersRepository@ +CCCC_UseExt@UserDTO@UsersRepository@./data/sql/users_repository.cpp@30@pass by reference@F????@*@?@p@ +CCCC_UseExt@UserDTO@UsersRepository@./data/sql/users_repository.cpp@51@pass by reference@T????@*@?@p@ +CCCC_UseRel@qint32@UsersRepository@ +CCCC_UseExt@qint32@UsersRepository@./data/sql/users_repository.cpp@30@pass by value@F????@*@?@P@ +CCCC_UseExt@qint32@UsersRepository@./data/sql/users_repository.cpp@108@pass by value@F????@*@?@P@ +CCCC_RejExt@./data/sql/base_sql_table_repository.cpp@1@@T????@LOC:0 COM:0 MVG:0@?@r@ +CCCC_RejExt@./data/sql/sessions_statistics_repository.cpp@1@@T????@LOC:2 COM:0 MVG:0@?@r@ +CCCC_RejExt@./data/sql/movies_repository.cpp@1@@T????@LOC:4 COM:0 MVG:0@?@r@ +CCCC_RejExt@./data/sql/roles_repository.cpp@1@@T????@LOC:1 COM:0 MVG:0@?@r@ +CCCC_RejExt@./data/sql/table_info_sqlite.cpp@49@noexcept { return @T????@LOC:3 COM:0 MVG:1@?@r@ +CCCC_RejExt@./data/sql/table_info_sqlite.cpp@54@noexcept { if @T????@LOC:25 COM:0 MVG:10@?@r@ +CCCC_RejExt@./data/sql/table_info_sqlite.cpp@86@noexcept { return @T????@LOC:3 COM:0 MVG:1@?@r@ +CCCC_RejExt@./data/sql/table_info_sqlite.cpp@90@noexcept { int @T????@LOC:7 COM:0 MVG:3@?@r@ +CCCC_RejExt@./data/sql/table_info_sqlite.cpp@98@noexcept { return @T????@LOC:3 COM:0 MVG:1@?@r@ +CCCC_RejExt@./data/sql/table_info_sqlite.cpp@102@noexcept { if @T????@LOC:6 COM:0 MVG:4@?@r@ +CCCC_RejExt@./data/sql/genres_repository.cpp@1@@T????@LOC:4 COM:0 MVG:0@?@r@ +CCCC_RejExt@./data/sql/sessions_repository.cpp@1@@T????@LOC:4 COM:0 MVG:0@?@r@ +CCCC_RejExt@./data/sql/users_repository.cpp@1@@T????@LOC:1 COM:0 MVG:0@?@r@ +CCCC_RejExt@./data/sql/halls_repository.cpp@1@@T????@LOC:1 COM:0 MVG:0@?@r@ +CCCC_RejExt@./data/sql/refunds_repository.cpp@1@@T????@LOC:4 COM:0 MVG:0@?@r@ +CCCC_RejExt@./data/sql/tickets_repository.cpp@1@@T????@LOC:4 COM:0 MVG:0@?@r@ +CCCC_RejExt@./core/utils/day_manager.cpp@49@QList < std @T????@LOC:10 COM:0 MVG:3@?@r@ +CCCC_RejExt@./core/utils/day_manager.cpp@1@@T????@LOC:2 COM:0 MVG:0@?@r@ +CCCC_RejExt@./core/utils/reservation_manager.cpp@1@@F????@LOC:2 COM:0 MVG:0@?@r@ +CCCC_RejExt@./core/services/schema_metadata.cpp@1@@F????@LOC:4 COM:0 MVG:0@?@r@ +CCCC_RejExt@./core/services/ticket_generator.cpp@1@@F????@LOC:3 COM:0 MVG:0@?@r@ +CCCC_RejExt@./core/services/base_generator.cpp@7@noexcept { return @T????@LOC:3 COM:0 MVG:2@?@r@ +CCCC_RejExt@./core/services/date_time_generator.cpp@1@@F????@LOC:1 COM:0 MVG:0@?@r@ +CCCC_RejExt@./core/services/session_generator.cpp@1@@T????@LOC:3 COM:0 MVG:0@?@r@ +CCCC_RejExt@./core/services/relation_id_config.cpp@1@@F????@LOC:1 COM:0 MVG:0@?@r@ +CCCC_RejExt@./core/services/refund_generator.cpp@1@@F????@LOC:2 COM:0 MVG:0@?@r@ +CCCC_RejExt@./core/services/model_manager.cpp@1@@F????@LOC:2 COM:0 MVG:0@?@r@ +CCCC_RejExt@./core/services/repository_manager.cpp@1@@T????@LOC:2 COM:0 MVG:0@?@r@ +CCCC_RejExt@./core/db/database_manager.cpp@1@@F????@LOC:2 COM:0 MVG:0@?@r@ +CCCC_RejExt@./core/db/execute_sql_file.cpp@1@@T????@LOC:1 COM:0 MVG:0@?@r@ +CCCC_RejExt@./core/repositories/repository_result.cpp@1@@F????@LOC:1 COM:0 MVG:0@?@r@ +CCCC_RejExt@./core/controllers/application_connector.cpp@1@@F????@LOC:12 COM:0 MVG:0@?@r@ +CCCC_RejExt@./core/controllers/application_controller.cpp@1@@F????@LOC:3 COM:3 MVG:0@?@r@ +CCCC_RejExt@./tests_schema/tests_sources/sqlite_file_executor.cpp@1@@F????@LOC:1 COM:0 MVG:0@?@r@ +CCCC_RejExt@./tests_schema/tests_sources/sqlite_statement.cpp@1@@T????@LOC:1 COM:0 MVG:0@?@r@ +CCCC_RejExt@./tests_schema/tests_sources/file_reader.cpp@1@@F????@LOC:1 COM:0 MVG:0@?@r@ +CCCC_RejExt@./tests_schema/tests_sources/sqlite_database.cpp@58@std :: vector @F????@LOC:20 COM:1 MVG:5@?@r@ +CCCC_RejExt@./tests_schema/tests_sources/sqlite_database.cpp@1@@F????@LOC:1 COM:0 MVG:0@?@r@ +CCCC_RejExt@./tests_schema/tests/sqlite_database_foreign_key_test.cpp@31@executor . executeSQLFile @F????@LOC:1 COM:0 MVG:0@?@r@ +CCCC_RejExt@./tests_schema/tests/sqlite_database_foreign_key_test.cpp@32@executor . executeSQLFile @F????@LOC:1 COM:0 MVG:0@?@r@ +CCCC_RejExt@./tests_schema/tests/main_test.cpp@1@@F????@LOC:1 COM:0 MVG:0@?@r@ +CCCC_RejExt@./src/main.cpp@1@@F????@LOC:1 COM:0 MVG:0@?@r@ +CCCC_RejExt@./ui/models/sessions_model.cpp@1@@T????@LOC:1 COM:0 MVG:0@?@r@ +CCCC_RejExt@./ui/models/movies_model.cpp@1@@T????@LOC:1 COM:0 MVG:0@?@r@ +CCCC_RejExt@./ui/models/tickets_model.cpp@1@@T????@LOC:1 COM:0 MVG:0@?@r@ +CCCC_RejExt@./ui/models/halls_model.cpp@1@@T????@LOC:1 COM:0 MVG:0@?@r@ +CCCC_RejExt@./ui/models/base_sql_table_model.cpp@1@@T????@LOC:3 COM:0 MVG:0@?@r@ +CCCC_RejExt@./ui/models/genres_model.cpp@1@@T????@LOC:1 COM:0 MVG:0@?@r@ +CCCC_RejExt@./ui/models/multi_column_filter_proxy_model.cpp@1@@T????@LOC:1 COM:0 MVG:0@?@r@ +CCCC_RejExt@./ui/models/refunds_model.cpp@1@@T????@LOC:1 COM:0 MVG:0@?@r@ +CCCC_RejExt@./ui/main_window/main_window.cpp@1@@F????@LOC:2 COM:0 MVG:0@?@r@ +CCCC_RejExt@./ui/dialogs/error_dialog.cpp@1@@F????@LOC:1 COM:0 MVG:0@?@r@ +CCCC_RejExt@./ui/dialogs/search_dialog.cpp@1@@F????@LOC:1 COM:0 MVG:0@?@r@ +CCCC_RejExt@./ui/dialogs/auth_dialog.cpp@1@@F????@LOC:1 COM:0 MVG:0@?@r@ +CCCC_RejExt@./ui/widgets/single_record_time_range_widget.cpp@1@@F????@LOC:1 COM:0 MVG:0@?@r@ +CCCC_RejExt@./ui/widgets/ticket_sales_report_widget.cpp@1@@T????@LOC:6 COM:0 MVG:0@?@r@ +CCCC_RejExt@./ui/widgets/entity_updater_widget.cpp@25@constexpr char Genres @?T???@LOC:1 COM:0 MVG:0@?@r@ +CCCC_RejExt@./ui/widgets/entity_updater_widget.cpp@26@constexpr char Halls @?T???@LOC:1 COM:0 MVG:0@?@r@ +CCCC_RejExt@./ui/widgets/entity_updater_widget.cpp@27@constexpr char Movies @?T???@LOC:1 COM:0 MVG:0@?@r@ +CCCC_RejExt@./ui/widgets/entity_updater_widget.cpp@28@constexpr char Refunds @?T???@LOC:1 COM:0 MVG:0@?@r@ +CCCC_RejExt@./ui/widgets/entity_updater_widget.cpp@29@constexpr char Sessions @?T???@LOC:1 COM:0 MVG:0@?@r@ +CCCC_RejExt@./ui/widgets/entity_updater_widget.cpp@30@constexpr char Tickets @?T???@LOC:1 COM:0 MVG:0@?@r@ +CCCC_RejExt@./ui/widgets/entity_updater_widget.cpp@1@@FT???@LOC:25 COM:1 MVG:0@?@r@ +CCCC_RejExt@./ui/widgets/entity_finder_widget.cpp@1@@F????@LOC:1 COM:0 MVG:0@?@r@ +CCCC_RejExt@./ui/widgets/reports_widget.cpp@1@@F????@LOC:1 COM:0 MVG:0@?@r@ +CCCC_RejExt@./ui/widgets/session_management_widget.cpp@1@@F????@LOC:2 COM:0 MVG:0@?@r@ +CCCC_RejExt@./ui/widgets/directories_management_widget.cpp@1@@F????@LOC:1 COM:0 MVG:0@?@r@ +CCCC_RejExt@./ui/widgets/entity_deleter_widget.cpp@1@@F????@LOC:13 COM:0 MVG:0@?@r@ +CCCC_RejExt@./ui/widgets/ticket_return_widget.cpp@1@@F????@LOC:1 COM:0 MVG:0@?@r@ +CCCC_RejExt@./ui/widgets/ticket_sale_widget.cpp@1@@F????@LOC:1 COM:0 MVG:0@?@r@ +CCCC_RejExt@./ui/delegates/date_time_delegate.cpp@1@@T????@LOC:1 COM:0 MVG:0@?@r@ +CCCC_RejExt@./tests_class/reservation_manager_test.cpp@1@@F????@LOC:1 COM:0 MVG:0@?@r@ +CCCC_RejExt@./tests_class/day_manager_test.cpp@1@@F????@LOC:1 COM:0 MVG:0@?@r@ diff --git a/artifacts/cccc/cccc.html b/artifacts/cccc/cccc.html new file mode 100644 index 0000000..6f287eb --- /dev/null +++ b/artifacts/cccc/cccc.html @@ -0,0 +1,1946 @@ + +Report on software metrics + + + + + + + + + + + + + + + + + + + + + + + +
+CCCC Software Metrics Report +
generated Sun Mar 16 18:53:21 2025 + +

Project Summary

+Summary table of high level measures summed over all files processed in the current run. +

Procedural Metrics Summary

+Table of procedural measures (i.e. lines of code, lines of comment, McCabe's cyclomatic complexity summed over each module. +

Object Oriented Design

+Table of four of the 6 metrics proposed by Chidamber and Kemerer in their various papers on 'a metrics suite for object oriented design'. +

Structural Metrics Summary

+Structural metrics based on the relationships of each module with others. Includes fan-out (i.e. number of other modules the current module uses), fan-in (number of other modules which use the current module), and the Information Flow measure suggested by Henry and Kafura, which combines these to give a measure of coupling for the module. +

Other Extents

+Lexical counts for parts of submitted source files which the analyser was unable to assign to a module. Each record in this table relates to either a part of the code which triggered a parse failure, or to the residual lexical counts relating to parts of a file not associated with a specific module. +

About CCCC

+A description of the CCCC program. +
+

Project Summary

+This table shows measures over the project as a whole. +
    +
  • NOM = Number of modules
    +Number of non-trivial modules identified by the analyser. Non-trivial modules include all classes, and any other module for which member functions are identified. +
  • LOC = Lines of Code
    +Number of non-blank, non-comment lines of source code counted by the analyser. +
  • COM = Lines of Comments
    +Number of lines of comment identified by the analyser +
  • MVG = McCabe's Cyclomatic Complexity
    +A measure of the decision complexity of the functions which make up the program.The strict definition of this measure is that it is the number of linearly independent routes through a directed acyclic graph which maps the flow of control of a subprogram. The analyser counts this by recording the number of distinct decision outcomes contained within each function, which yields a good approximation to the formally defined version of the measure. +
  • L_C = Lines of code per line of comment
    +Indicates density of comments with respect to textual size of program +
  • M_C = Cyclomatic Complexity per line of comment
    +Indicates density of comments with respect to logical complexity of program +
  • IF4 = Information Flow measure
    +Measure of information flow between modules suggested by Henry and Kafura. The analyser makes an approximate count of this by counting inter-module couplings identified in the module interfaces. +
+Two variants on the information flow measure IF4 are also presented, one (IF4v) calculated using only relationships in the visible part of the module interface, and the other (IF4c) calculated using only those relationships which imply that changes to the client must be recompiled of the supplier's definition changes. + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Module
Number of modulesNOM 132 
Lines of CodeLOC 510838.697
McCabe's Cyclomatic NumberMVG 992 7.515
Lines of CommentCOM 282 2.136
LOC/COML_C18.113 
MVG/COMM_C 3.518 
Information Flow measure (  inclusive )IF4 1788 13.545
Information Flow measure (  visible )IF4v 1788 13.545
Information Flow measure (  concrete )IF4c 0 0.000
Lines of Code rejected by parserREJ 230 
+

Procedural Metrics Summary

+For descriptions of each of these metrics see the information preceding the project summary table. + +The label cell for each row in this table provides a link to the functions table in the detailed report for the module in question + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Module NameLOCMVGCOML_CM_C
+ApplicationConnector + 224 56 1224.00056.000
+ApplicationController + 96 20 15 6.400 1.333
+AuthDialog + 60 11 160.00011.000
+BaseGenerator + 0 0 0------------
+BaseSqlTableModel + 53 9 17 3.118 0.529
+BaseSqlTableRepository + 16 3 0------------
+CreateGenreRequest + 0 0 0------------
+CreateHallRequest + 0 0 0------------
+CreateMovieRequest + 0 0 0------------
+CreateRefundRequest + 0 0 0------------
+CreateRoleRequest + 0 0 0------------
+CreateSessionRequest + 0 0 0------------
+CreateTicketRequest + 0 0 0------------
+CreateUserRequest + 0 0 0------------
+DatabaseManager + 79 19 239.500 9.500
+DateTimeDelegate + 14 4 2------------
+DateTimeGenerator + 58 12 0************
+DayManager + 188 64 294.00032.000
+DayManagerTest + 133 2 719.000------
+DirectoriesManagementWidget + 104 10 714.857 1.429
+EntityDeleterWidget + 107 14 617.833 2.333
+EntityFinderWidget + 79 4 179.000------
+EntityUpdaterWidget + 348 62 487.00015.500
+ErrorDialog + 174 82 821.75010.250
+ExecuteSqlFile + 80 28 10 8.000 2.800
+FileReader + 12 3 2------------
+Genre + 0 0 0------------
+GenreDTO + 0 0 0------------
+GenresModel + 24 8 0************
+GenresRepository + 68 19 0************
+Hall + 0 0 0------------
+HallDTO + 0 0 0------------
+HallsModel + 26 9 0************
+HallsRepository + 71 19 0************
+MainWindow + 67 9 37 1.811 0.243
+ModelManager + 62 10 320.667 3.333
+Movie + 0 0 0------------
+MovieDTO + 0 0 0------------
+MoviesModel + 57 15 228.500 7.500
+MoviesRepository + 75 19 0************
+MultiColumnSortFilterProxyModel + 22 7 0************
+NewGenre + 0 0 0------------
+NewHall + 0 0 0------------
+NewMovie + 0 0 0------------
+NewRefund + 0 0 0------------
+NewSession + 0 0 0------------
+NewTicket + 0 0 0------------
+Orientation + 0 0 0------------
+QAbstractAxis + 0 0 0------------
+QAbstractItemModel + 0 0 0------------
+QAbstractSeries + 0 0 0------------
+QChart + 0 0 0------------
+QDateTime + 0 0 0------------
+QList + 0 0 0------------
+QLocale + 0 0 0------------
+QMap + 0 0 0------------
+QMetaObject + 0 0 0------------
+QModelIndex + 0 0 0------------
+QObject + 0 0 0------------
+QPair + 0 0 0------------
+QSqlDatabase + 0 0 0------------
+QSqlField + 0 0 0------------
+QSqlQuery + 0 0 0------------
+QSqlRecord + 0 0 0------------
+QString + 0 0 0------------
+QStringList + 0 0 0------------
+QTableView + 0 0 0------------
+QTime + 0 0 0------------
+QVariant + 0 0 0------------
+QVector + 0 0 0------------
+QWidget + 0 0 0------------
+Refund + 0 0 0------------
+RefundDTO + 0 0 0------------
+RefundGenerator + 123 18 913.667 2.000
+RefundsModel + 39 12 219.500 6.000
+RefundsRepository + 82 19 0************
+RelationIdConfig + 7 0 0------------
+ReportsWidget + 9 0 0------------
+RepositoryManager + 47 6 411.750 1.500
+RepositoryResult + 4 2 0------------
+ReservationManager + 103 28 251.50014.000
+ReservationManagerTest + 50 6 0************
+RoleDTO + 0 0 0------------
+RolesRepository + 70 19 0************
+SQLiteDatabase + 340 59 40 8.500 1.475
+SQLiteDatabaseCRUDTest + 15 0 2------------
+SQLiteDatabaseForeignKeyTest + 12 1 5------------
+SQLiteDatabaseTriggerTest + 17 0 2------------
+SQLiteFileExecutor + 26 5 213.000 2.500
+SQLiteStatement + 56 18 14 4.000 1.286
+SalesData + 24 2 0******------
+SchemaMetadata + 102 11 0************
+SearchDialog + 103 17 334.333 5.667
+Session + 0 0 0------------
+SessionDTO + 0 0 0------------
+SessionGenerator + 152 24 23 6.609 1.043
+SessionManagementWidget + 72 3 324.000------
+SessionStatisticsDTO + 0 0 0------------
+SessionsModel + 84 23 421.000 5.750
+SessionsRepository + 81 19 0************
+SessionsStatisticsRepository + 123 23 261.50011.500
+SingleRecordTimeRangeWidget + 4 0 0------------
+TableInfoSQLite + 31 6 0************
+Test + 0 0 0------------
+Ticket + 0 0 0------------
+TicketDTO + 0 0 0------------
+TicketGenerator + 160 24 722.857 3.429
+TicketReturnWidget + 76 7 238.000 3.500
+TicketSaleWidget + 76 10 419.000 2.500
+TicketSalesReportWidget + 250 21 1516.667 1.400
+TicketsModel + 40 12 220.000 6.000
+TicketsRepository + 77 19 0************
+UpdateGenreRequest + 0 0 0------------
+UpdateHallRequest + 0 0 0------------
+UpdateMovieRequest + 0 0 0------------
+UpdateRefundRequest + 0 0 0------------
+UpdateRoleRequest + 0 0 0------------
+UpdateSessionRequest + 0 0 0------------
+UpdateTicketRequest + 0 0 0------------
+UpdateUserRequest + 0 0 0------------
+UserDTO + 0 0 0------------
+UsersRepository + 97 24 0************
+anonymous + 29 6 3 9.667 2.000
+bool + 0 0 0------------
+function + 0 0 0------------
+initializer_list + 0 0 0------------
+optional + 0 0 0------------
+qint32 + 0 0 0------------
+qint64 + 0 0 0------------
+qsizetype + 0 0 0------------
+sqlite3 + 0 0 0------------
+string + 0 0 0------------
+

Object Oriented Design

+
    +
  • WMC = Weighted methods per class
    +The sum of a weighting function over the functions of the module. Two different weighting functions are applied: WMC1 uses the nominal weight of 1 for each function, and hence measures the number of functions, WMCv uses a weighting function which is 1 for functions accessible to other modules, 0 for private functions. +
  • DIT = Depth of inheritance tree
    +The length of the longest path of inheritance ending at the current module. The deeper the inheritance tree for a module, the harder it may be to predict its behaviour. On the other hand, increasing depth gives the potential of greater reuse by the current module of behaviour defined for ancestor classes. +
  • NOC = Number of children
    +The number of modules which inherit directly from the current module. Moderate values of this measure indicate scope for reuse, however high values may indicate an inappropriate abstraction in the design. +
  • CBO = Coupling between objects
    +The number of other modules which are coupled to the current module either as a client or a supplier. Excessive coupling indicates weakness of module encapsulation and may inhibit reuse. +
+ +The label cell for each row in this table provides a link to the module summary table in the detailed report for the module in question + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Module NameWMC1WMCvDITNOCCBO
+ApplicationConnector + 19 0 0 0 5
+ApplicationController + 6 0 0 0 2
+AuthDialog + 7 0 0 0 3
+BaseGenerator + 1 0 0 0 0
+BaseSqlTableModel + 8 0 0 0 4
+BaseSqlTableRepository + 2 0 0 0 2
+CreateGenreRequest + 0 0 0 0 1
+CreateHallRequest + 0 0 0 0 1
+CreateMovieRequest + 0 0 0 0 1
+CreateRefundRequest + 0 0 0 0 1
+CreateRoleRequest + 0 0 0 0 1
+CreateSessionRequest + 0 0 0 0 1
+CreateTicketRequest + 0 0 0 0 1
+CreateUserRequest + 0 0 0 0 1
+DatabaseManager + 5 0 0 0 3
+DateTimeDelegate + 2 0 0 0 3
+DateTimeGenerator + 3 0 0 0 2
+DayManager + 17 0 0 0 3
+DayManagerTest + 8 0 1 0 1
+DirectoriesManagementWidget + 10 0 0 0 2
+EntityDeleterWidget + 11 0 0 0 5
+EntityFinderWidget + 12 0 0 0 5
+EntityUpdaterWidget + 22 0 0 0 7
+ErrorDialog + 9 0 0 0 2
+ExecuteSqlFile + 7 0 0 0 3
+FileReader + 1 0 0 0 1
+Genre + 0 0 0 0 1
+GenreDTO + 0 0 0 0 1
+GenresModel + 3 0 0 0 3
+GenresRepository + 7 0 0 0 8
+Hall + 0 0 0 0 1
+HallDTO + 0 0 0 0 1
+HallsModel + 3 0 0 0 3
+HallsRepository + 7 0 0 0 8
+MainWindow + 5 0 0 0 3
+ModelManager + 9 0 0 0 1
+Movie + 0 0 0 0 1
+MovieDTO + 0 0 0 0 1
+MoviesModel + 5 0 0 0 4
+MoviesRepository + 7 0 0 0 8
+MultiColumnSortFilterProxyModel + 2 0 0 0 2
+NewGenre + 0 0 0 0 1
+NewHall + 0 0 0 0 1
+NewMovie + 0 0 0 0 1
+NewRefund + 0 0 0 0 1
+NewSession + 0 0 0 0 1
+NewTicket + 0 0 0 0 1
+Orientation + 0 0 0 0 6
+QAbstractAxis + 0 0 0 0 1
+QAbstractItemModel + 0 0 0 0 1
+QAbstractSeries + 0 0 0 0 1
+QChart + 0 0 0 0 1
+QDateTime + 0 0 0 0 2
+QList + 0 0 0 0 1
+QLocale + 0 0 0 0 1
+QMap + 0 0 0 0 1
+QMetaObject + 0 0 0 0 1
+QModelIndex + 0 0 0 0 2
+QObject + 0 0 0 2 22
+QPair + 0 0 0 0 3
+QSqlDatabase + 0 0 0 0 19
+QSqlField + 0 0 0 0 8
+QSqlQuery + 0 0 0 0 9
+QSqlRecord + 0 0 0 0 4
+QString + 0 0 0 0 27
+QStringList + 0 0 0 0 2
+QTableView + 0 0 0 0 1
+QTime + 0 0 0 0 2
+QVariant + 0 0 0 0 2
+QVector + 0 0 0 0 11
+QWidget + 0 0 0 0 14
+Refund + 0 0 0 0 1
+RefundDTO + 0 0 0 0 1
+RefundGenerator + 9 0 0 0 2
+RefundsModel + 4 0 0 0 4
+RefundsRepository + 7 0 0 0 8
+RelationIdConfig + 1 0 0 0 1
+ReportsWidget + 2 0 0 0 1
+RepositoryManager + 5 0 0 0 1
+RepositoryResult + 2 0 0 0 3
+ReservationManager + 9 0 0 0 5
+ReservationManagerTest + 3 0 1 0 1
+RoleDTO + 0 0 0 0 1
+RolesRepository + 7 0 0 0 8
+SQLiteDatabase + 35 0 0 0 17
+SQLiteDatabaseCRUDTest + 0 0 1 0 2
+SQLiteDatabaseForeignKeyTest + 0 0 1 0 2
+SQLiteDatabaseTriggerTest + 0 0 1 0 2
+SQLiteFileExecutor + 3 0 0 0 1
+SQLiteStatement + 13 0 0 0 2
+SalesData + 4 0 0 0 1
+SchemaMetadata + 10 0 0 0 1
+SearchDialog + 10 0 0 0 2
+Session + 0 0 0 0 1
+SessionDTO + 0 0 0 0 1
+SessionGenerator + 13 0 0 0 4
+SessionManagementWidget + 10 0 0 0 2
+SessionStatisticsDTO + 0 0 0 0 1
+SessionsModel + 6 0 0 0 4
+SessionsRepository + 7 0 0 0 8
+SessionsStatisticsRepository + 10 0 0 0 8
+SingleRecordTimeRangeWidget + 1 0 0 0 1
+TableInfoSQLite + 9 0 0 0 2
+Test + 0 0 0 3 3
+Ticket + 0 0 0 0 1
+TicketDTO + 0 0 0 0 1
+TicketGenerator + 14 0 0 0 2
+TicketReturnWidget + 8 0 0 0 2
+TicketSaleWidget + 9 0 0 0 3
+TicketSalesReportWidget + 22 0 0 0 11
+TicketsModel + 4 0 0 0 4
+TicketsRepository + 7 0 0 0 8
+UpdateGenreRequest + 0 0 0 0 1
+UpdateHallRequest + 0 0 0 0 1
+UpdateMovieRequest + 0 0 0 0 1
+UpdateRefundRequest + 0 0 0 0 1
+UpdateRoleRequest + 0 0 0 0 1
+UpdateSessionRequest + 0 0 0 0 1
+UpdateTicketRequest + 0 0 0 0 1
+UpdateUserRequest + 0 0 0 0 1
+UserDTO + 0 0 0 0 2
+UsersRepository + 8 0 0 0 9
+anonymous + 7 0 0 0 0
+bool + 0 0 0 0 2
+function + 0 0 0 0 2
+initializer_list + 0 0 0 0 1
+optional + 0 0 0 0 1
+qint32 + 0 0 0 0 14
+qint64 + 0 0 0 0 2
+qsizetype + 0 0 0 0 1
+sqlite3 + 0 0 0 0 1
+string + 0 0 0 0 4
+

Structural Metrics Summary

+
    +
  • FI = Fan-in
    +The number of other modules which pass information into the current module. +
  • FO = Fan-out
    +The number of other modules into which the current module passes information +
  • IF4 = Information Flow measure
    +A composite measure of structural complexity, calculated as the square of the product of the fan-in and fan-out of a single module. Proposed by Henry and Kafura. +
+Note that the fan-in and fan-out are calculated by examining the interface of each module. As noted above, three variants of each each of these measures are presented: a count restricted to the part of the interface which is externally visible, a count which only includes relationships which imply the client module needs to be recompiled if the supplier's implementation changes, and an inclusive count + +The label cell for each row in this table provides a link to the relationships table in the detailed report for the module in question + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Module NameFan-outFan-inIF4
visconincvisconinclvisconinc
+ApplicationConnector + 5 1 5 0 0 0 0 0 0
+ApplicationController + 2 1 2 0 0 0 0 0 0
+AuthDialog + 3 0 3 0 0 0 0 0 0
+BaseGenerator + 0 0 0 0 0 0 0 0 0
+BaseSqlTableModel + 4 1 4 0 0 0 0 0 0
+BaseSqlTableRepository + 2 0 2 0 0 0 0 0 0
+CreateGenreRequest + 0 0 0 1 0 1 0 0 0
+CreateHallRequest + 0 0 0 1 0 1 0 0 0
+CreateMovieRequest + 0 0 0 1 0 1 0 0 0
+CreateRefundRequest + 0 0 0 1 0 1 0 0 0
+CreateRoleRequest + 0 0 0 1 0 1 0 0 0
+CreateSessionRequest + 0 0 0 1 0 1 0 0 0
+CreateTicketRequest + 0 0 0 1 0 1 0 0 0
+CreateUserRequest + 0 0 0 1 0 1 0 0 0
+DatabaseManager + 3 0 3 0 0 0 0 0 0
+DateTimeDelegate + 3 0 3 0 0 0 0 0 0
+DateTimeGenerator + 2 0 2 0 0 0 0 0 0
+DayManager + 2 2 2 1 0 1 4 0 4
+DayManagerTest + 1 1 1 0 0 0 0 0 0
+DirectoriesManagementWidget + 2 0 2 0 0 0 0 0 0
+EntityDeleterWidget + 5 0 5 0 0 0 0 0 0
+EntityFinderWidget + 5 1 5 0 0 0 0 0 0
+EntityUpdaterWidget + 7 0 7 0 0 0 0 0 0
+ErrorDialog + 2 0 2 0 0 0 0 0 0
+ExecuteSqlFile + 3 0 3 0 0 0 0 0 0
+FileReader + 1 0 1 0 0 0 0 0 0
+Genre + 0 0 0 1 0 1 0 0 0
+GenreDTO + 0 0 0 1 0 1 0 0 0
+GenresModel + 3 1 3 0 0 0 0 0 0
+GenresRepository + 8 1 8 0 0 0 0 0 0
+Hall + 0 0 0 1 0 1 0 0 0
+HallDTO + 0 0 0 1 0 1 0 0 0
+HallsModel + 3 1 3 0 0 0 0 0 0
+HallsRepository + 8 1 8 0 0 0 0 0 0
+MainWindow + 3 1 3 0 0 0 0 0 0
+ModelManager + 1 1 1 0 0 0 0 0 0
+Movie + 0 0 0 1 0 1 0 0 0
+MovieDTO + 0 0 0 1 0 1 0 0 0
+MoviesModel + 4 1 4 0 0 0 0 0 0
+MoviesRepository + 8 1 8 0 0 0 0 0 0
+MultiColumnSortFilterProxyModel + 2 0 2 0 0 0 0 0 0
+NewGenre + 0 0 0 1 0 1 0 0 0
+NewHall + 0 0 0 1 0 1 0 0 0
+NewMovie + 0 0 0 1 0 1 0 0 0
+NewRefund + 0 0 0 1 0 1 0 0 0
+NewSession + 0 0 0 1 0 1 0 0 0
+NewTicket + 0 0 0 1 0 1 0 0 0
+Orientation + 0 0 0 6 6 6 0 0 0
+QAbstractAxis + 0 0 0 1 0 1 0 0 0
+QAbstractItemModel + 0 0 0 1 0 1 0 0 0
+QAbstractSeries + 0 0 0 1 0 1 0 0 0
+QChart + 0 0 0 1 0 1 0 0 0
+QDateTime + 0 0 0 2 0 2 0 0 0
+QList + 0 0 0 1 0 1 0 0 0
+QLocale + 0 0 0 1 0 1 0 0 0
+QMap + 0 0 0 1 0 1 0 0 0
+QMetaObject + 0 0 0 1 0 1 0 0 0
+QModelIndex + 0 0 0 2 0 2 0 0 0
+QObject + 0 0 0 22 2 22 0 0 0
+QPair + 0 0 0 3 0 3 0 0 0
+QSqlDatabase + 0 0 0 19 1 19 0 0 0
+QSqlField + 0 0 0 8 0 8 0 0 0
+QSqlQuery + 0 0 0 9 0 9 0 0 0
+QSqlRecord + 0 0 0 4 0 4 0 0 0
+QString + 0 0 0 27 1 27 0 0 0
+QStringList + 0 0 0 2 0 2 0 0 0
+QTableView + 0 0 0 1 0 1 0 0 0
+QTime + 0 0 0 2 1 2 0 0 0
+QVariant + 0 0 0 2 0 2 0 0 0
+QVector + 0 0 0 11 0 11 0 0 0
+QWidget + 0 0 0 14 0 14 0 0 0
+Refund + 0 0 0 1 0 1 0 0 0
+RefundDTO + 0 0 0 1 0 1 0 0 0
+RefundGenerator + 2 0 2 0 0 0 0 0 0
+RefundsModel + 4 1 4 0 0 0 0 0 0
+RefundsRepository + 8 1 8 0 0 0 0 0 0
+RelationIdConfig + 1 0 1 0 0 0 0 0 0
+ReportsWidget + 1 0 1 0 0 0 0 0 0
+RepositoryManager + 1 0 1 0 0 0 0 0 0
+RepositoryResult + 1 0 1 2 0 2 4 0 4
+ReservationManager + 4 2 4 1 0 1 16 0 16
+ReservationManagerTest + 1 1 1 0 0 0 0 0 0
+RoleDTO + 0 0 0 1 0 1 0 0 0
+RolesRepository + 8 1 8 0 0 0 0 0 0
+SQLiteDatabase + 14 0 14 3 0 3 1764 0 1764
+SQLiteDatabaseCRUDTest + 2 1 2 0 0 0 0 0 0
+SQLiteDatabaseForeignKeyTest + 2 1 2 0 0 0 0 0 0
+SQLiteDatabaseTriggerTest + 2 1 2 0 0 0 0 0 0
+SQLiteFileExecutor + 1 0 1 0 0 0 0 0 0
+SQLiteStatement + 2 0 2 0 0 0 0 0 0
+SalesData + 1 1 1 0 0 0 0 0 0
+SchemaMetadata + 1 0 1 0 0 0 0 0 0
+SearchDialog + 2 0 2 0 0 0 0 0 0
+Session + 0 0 0 1 0 1 0 0 0
+SessionDTO + 0 0 0 1 0 1 0 0 0
+SessionGenerator + 4 1 4 0 0 0 0 0 0
+SessionManagementWidget + 2 0 2 0 0 0 0 0 0
+SessionStatisticsDTO + 0 0 0 1 0 1 0 0 0
+SessionsModel + 4 1 4 0 0 0 0 0 0
+SessionsRepository + 8 1 8 0 0 0 0 0 0
+SessionsStatisticsRepository + 8 2 8 0 0 0 0 0 0
+SingleRecordTimeRangeWidget + 1 0 1 0 0 0 0 0 0
+TableInfoSQLite + 2 1 2 0 0 0 0 0 0
+Test + 0 0 0 3 3 3 0 0 0
+Ticket + 0 0 0 1 0 1 0 0 0
+TicketDTO + 0 0 0 1 0 1 0 0 0
+TicketGenerator + 2 0 2 0 0 0 0 0 0
+TicketReturnWidget + 2 0 2 0 0 0 0 0 0
+TicketSaleWidget + 3 0 3 0 0 0 0 0 0
+TicketSalesReportWidget + 11 1 11 0 0 0 0 0 0
+TicketsModel + 4 1 4 0 0 0 0 0 0
+TicketsRepository + 8 1 8 0 0 0 0 0 0
+UpdateGenreRequest + 0 0 0 1 0 1 0 0 0
+UpdateHallRequest + 0 0 0 1 0 1 0 0 0
+UpdateMovieRequest + 0 0 0 1 0 1 0 0 0
+UpdateRefundRequest + 0 0 0 1 0 1 0 0 0
+UpdateRoleRequest + 0 0 0 1 0 1 0 0 0
+UpdateSessionRequest + 0 0 0 1 0 1 0 0 0
+UpdateTicketRequest + 0 0 0 1 0 1 0 0 0
+UpdateUserRequest + 0 0 0 1 0 1 0 0 0
+UserDTO + 0 0 0 2 0 2 0 0 0
+UsersRepository + 9 1 9 0 0 0 0 0 0
+anonymous + 0 0 0 0 0 0 0 0 0
+bool + 0 0 0 2 2 2 0 0 0
+function + 0 0 0 2 1 2 0 0 0
+initializer_list + 0 0 0 1 0 1 0 0 0
+optional + 0 0 0 1 1 1 0 0 0
+qint32 + 0 0 0 14 14 14 0 0 0
+qint64 + 0 0 0 2 2 2 0 0 0
+qsizetype + 0 0 0 1 1 1 0 0 0
+sqlite3 + 0 0 0 1 0 1 0 0 0
+string + 0 0 0 4 0 4 0 0 0
+

Other Extents

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
LocationTextLOCCOMMVG
./data/sql/base_sql_table_repository.cpp:1
+
<file scope items> 0 0 0
./data/sql/sessions_statistics_repository.cpp:1
+
<file scope items> 2 0 0
./data/sql/movies_repository.cpp:1
+
<file scope items> 4 0 0
./data/sql/roles_repository.cpp:1
+
<file scope items> 1 0 0
./data/sql/table_info_sqlite.cpp:49
+
noexcept { return 3 0 1
./data/sql/table_info_sqlite.cpp:54
+
noexcept { if 25 0 10
./data/sql/table_info_sqlite.cpp:86
+
noexcept { return 3 0 1
./data/sql/table_info_sqlite.cpp:90
+
noexcept { int 7 0 3
./data/sql/table_info_sqlite.cpp:98
+
noexcept { return 3 0 1
./data/sql/table_info_sqlite.cpp:102
+
noexcept { if 6 0 4
./data/sql/genres_repository.cpp:1
+
<file scope items> 4 0 0
./data/sql/sessions_repository.cpp:1
+
<file scope items> 4 0 0
./data/sql/users_repository.cpp:1
+
<file scope items> 1 0 0
./data/sql/halls_repository.cpp:1
+
<file scope items> 1 0 0
./data/sql/refunds_repository.cpp:1
+
<file scope items> 4 0 0
./data/sql/tickets_repository.cpp:1
+
<file scope items> 4 0 0
./core/utils/day_manager.cpp:49
+
QList < std 10 0 3
./core/utils/day_manager.cpp:1
+
<file scope items> 2 0 0
./core/utils/reservation_manager.cpp:1
+
<file scope items> 2 0 0
./core/services/schema_metadata.cpp:1
+
<file scope items> 4 0 0
./core/services/ticket_generator.cpp:1
+
<file scope items> 3 0 0
./core/services/base_generator.cpp:7
+
noexcept { return 3 0 2
./core/services/date_time_generator.cpp:1
+
<file scope items> 1 0 0
./core/services/session_generator.cpp:1
+
<file scope items> 3 0 0
./core/services/relation_id_config.cpp:1
+
<file scope items> 1 0 0
./core/services/refund_generator.cpp:1
+
<file scope items> 2 0 0
./core/services/model_manager.cpp:1
+
<file scope items> 2 0 0
./core/services/repository_manager.cpp:1
+
<file scope items> 2 0 0
./core/db/database_manager.cpp:1
+
<file scope items> 2 0 0
./core/db/execute_sql_file.cpp:1
+
<file scope items> 1 0 0
./core/repositories/repository_result.cpp:1
+
<file scope items> 1 0 0
./core/controllers/application_connector.cpp:1
+
<file scope items> 12 0 0
./core/controllers/application_controller.cpp:1
+
<file scope items> 3 3 0
./tests_schema/tests_sources/sqlite_file_executor.cpp:1
+
<file scope items> 1 0 0
./tests_schema/tests_sources/sqlite_statement.cpp:1
+
<file scope items> 1 0 0
./tests_schema/tests_sources/file_reader.cpp:1
+
<file scope items> 1 0 0
./tests_schema/tests_sources/sqlite_database.cpp:58
+
std :: vector 20 1 5
./tests_schema/tests_sources/sqlite_database.cpp:1
+
<file scope items> 1 0 0
./tests_schema/tests/sqlite_database_foreign_key_test.cpp:31
+
executor . executeSQLFile 1 0 0
./tests_schema/tests/sqlite_database_foreign_key_test.cpp:32
+
executor . executeSQLFile 1 0 0
./tests_schema/tests/main_test.cpp:1
+
<file scope items> 1 0 0
./src/main.cpp:1
+
<file scope items> 1 0 0
./ui/models/sessions_model.cpp:1
+
<file scope items> 1 0 0
./ui/models/movies_model.cpp:1
+
<file scope items> 1 0 0
./ui/models/tickets_model.cpp:1
+
<file scope items> 1 0 0
./ui/models/halls_model.cpp:1
+
<file scope items> 1 0 0
./ui/models/base_sql_table_model.cpp:1
+
<file scope items> 3 0 0
./ui/models/genres_model.cpp:1
+
<file scope items> 1 0 0
./ui/models/multi_column_filter_proxy_model.cpp:1
+
<file scope items> 1 0 0
./ui/models/refunds_model.cpp:1
+
<file scope items> 1 0 0
./ui/main_window/main_window.cpp:1
+
<file scope items> 2 0 0
./ui/dialogs/error_dialog.cpp:1
+
<file scope items> 1 0 0
./ui/dialogs/search_dialog.cpp:1
+
<file scope items> 1 0 0
./ui/dialogs/auth_dialog.cpp:1
+
<file scope items> 1 0 0
./ui/widgets/single_record_time_range_widget.cpp:1
+
<file scope items> 1 0 0
./ui/widgets/ticket_sales_report_widget.cpp:1
+
<file scope items> 6 0 0
./ui/widgets/entity_updater_widget.cpp:25
+
constexpr char Genres 1 0 0
./ui/widgets/entity_updater_widget.cpp:26
+
constexpr char Halls 1 0 0
./ui/widgets/entity_updater_widget.cpp:27
+
constexpr char Movies 1 0 0
./ui/widgets/entity_updater_widget.cpp:28
+
constexpr char Refunds 1 0 0
./ui/widgets/entity_updater_widget.cpp:29
+
constexpr char Sessions 1 0 0
./ui/widgets/entity_updater_widget.cpp:30
+
constexpr char Tickets 1 0 0
./ui/widgets/entity_updater_widget.cpp:1
+
<file scope items> 25 1 0
./ui/widgets/entity_finder_widget.cpp:1
+
<file scope items> 1 0 0
./ui/widgets/reports_widget.cpp:1
+
<file scope items> 1 0 0
./ui/widgets/session_management_widget.cpp:1
+
<file scope items> 2 0 0
./ui/widgets/directories_management_widget.cpp:1
+
<file scope items> 1 0 0
./ui/widgets/entity_deleter_widget.cpp:1
+
<file scope items> 13 0 0
./ui/widgets/ticket_return_widget.cpp:1
+
<file scope items> 1 0 0
./ui/widgets/ticket_sale_widget.cpp:1
+
<file scope items> 1 0 0
./ui/delegates/date_time_delegate.cpp:1
+
<file scope items> 1 0 0
./tests_class/reservation_manager_test.cpp:1
+
<file scope items> 1 0 0
./tests_class/day_manager_test.cpp:1
+
<file scope items> 1 0 0
+

About CCCC

+

This report was generated by the program CCCC, which is FREELY REDISTRIBUTABLE but carries NO WARRANTY. +

CCCC was developed by Tim Littlefair. +as part of a PhD research project. This project is now completed and descriptions of the findings can be accessed at http://www.chs.ecu.edu.au/~tlittlef.

User support for CCCC can be obtained by mailing the list cccc-users@lists.sourceforge.net.

Please also visit the new CCCC development website at http://sarnold.github.io/cccc/. + diff --git a/artifacts/cccc/cccc.opt b/artifacts/cccc/cccc.opt new file mode 100644 index 0000000..cc6d756 --- /dev/null +++ b/artifacts/cccc/cccc.opt @@ -0,0 +1,62 @@ +CCCC_FileExt@.ADA@ada.95@ +CCCC_FileExt@.ADB@ada.95@ +CCCC_FileExt@.ADS@ada.95@ +CCCC_FileExt@.C@c++.ansi@ +CCCC_FileExt@.CC@c++.ansi@ +CCCC_FileExt@.CPP@c++.ansi@ +CCCC_FileExt@.CXX@c++.ansi@ +CCCC_FileExt@.H@c++.ansi@ +CCCC_FileExt@.H++@c++.ansi@ +CCCC_FileExt@.HH@c++.ansi@ +CCCC_FileExt@.HPP@c++.ansi@ +CCCC_FileExt@.HXX@c++.ansi@ +CCCC_FileExt@.J@java@ +CCCC_FileExt@.JAV@java@ +CCCC_FileExt@.JAVA@java@ +CCCC_FileExt@.ada@ada.95@ +CCCC_FileExt@.adb@ada.95@ +CCCC_FileExt@.ads@ada.95@ +CCCC_FileExt@.c@c.ansi@ +CCCC_FileExt@.c++@c++.ansi@ +CCCC_FileExt@.cc@c++.ansi@ +CCCC_FileExt@.cpp@c++.ansi@ +CCCC_FileExt@.cxx@c++.ansi@ +CCCC_FileExt@.h@c.ansi@ +CCCC_FileExt@.h++@c++.ansi@ +CCCC_FileExt@.hh@c++.ansi@ +CCCC_FileExt@.hpp@c++.ansi@ +CCCC_FileExt@.hxx@c++.ansi@ +CCCC_FileExt@.j@java@ +CCCC_FileExt@.jav@java@ +CCCC_FileExt@.java@java@ +CCCC_MetTmnt@8.3@999999.000000@999999.000000@0@8@3@General format for fixed precision 3 d.p.@ +CCCC_MetTmnt@CBO@12.000000@30.000000@0@6@0@Coupling between objects@ +CCCC_MetTmnt@COM@999999.000000@999999.000000@0@6@0@Comment lines@ +CCCC_MetTmnt@COMper@999999.000000@999999.000000@0@6@3@Comment lines (averaged)@ +CCCC_MetTmnt@DIT@3.000000@6.000000@0@6@0@Depth of Inheritance Tree@ +CCCC_MetTmnt@FI@12.000000@20.000000@0@6@0@Fan in (overall)@ +CCCC_MetTmnt@FIc@6.000000@12.000000@0@6@0@Fan in (concrete uses only)@ +CCCC_MetTmnt@FIv@6.000000@12.000000@0@6@0@Fan in (visible uses only)@ +CCCC_MetTmnt@FO@12.000000@20.000000@0@6@0@Fan out (overall)@ +CCCC_MetTmnt@FOc@6.000000@12.000000@0@6@0@Fan out (concrete uses only)@ +CCCC_MetTmnt@FOv@6.000000@12.000000@0@6@0@Fan out (visible uses only)@ +CCCC_MetTmnt@IF4@100.000000@1000.000000@0@6@0@Henry-Kafura/Shepperd measure (overall)@ +CCCC_MetTmnt@IF4c@30.000000@100.000000@0@6@0@Henry-Kafura/Shepperd measure (concrete)@ +CCCC_MetTmnt@IF4v@30.000000@100.000000@0@6@0@Henry-Kafura/Shepperd measure (visible)@ +CCCC_MetTmnt@LOCf@30.000000@100.000000@0@6@0@Lines of code/function@ +CCCC_MetTmnt@LOCm@500.000000@2000.000000@0@6@0@Lines of code/single module@ +CCCC_MetTmnt@LOCp@999999.000000@999999.000000@0@6@0@Lines of code/project@ +CCCC_MetTmnt@LOCper@500.000000@2000.000000@0@6@3@Lines of code/average module@ +CCCC_MetTmnt@L_C@7.000000@30.000000@20@6@3@LOC/COM Lines of code/comment line@ +CCCC_MetTmnt@MVGf@10.000000@30.000000@0@6@0@Cyclomatic complexity/function@ +CCCC_MetTmnt@MVGm@200.000000@1000.000000@0@6@0@Cyclomatic complexity/single module@ +CCCC_MetTmnt@MVGp@999999.000000@999999.000000@0@6@0@Cyclomatic complexity/project@ +CCCC_MetTmnt@MVGper@200.000000@1000.000000@0@6@3@Cyclomatic complexity/average module@ +CCCC_MetTmnt@M_C@5.000000@10.000000@5@6@3@MVG/COM McCabe/comment line@ +CCCC_MetTmnt@NOC@4.000000@15.000000@0@6@0@Number of children@ +CCCC_MetTmnt@WMC1@30.000000@100.000000@0@6@0@Weighting function=1 unit per method@ +CCCC_MetTmnt@WMCv@10.000000@30.000000@0@6@0@Weighting function=1 unit per visible method@ +CCCC_Dialect@c++.mfc@BEGIN_MESSAGE_MAP@start_skipping@ +CCCC_Dialect@c++.mfc@END_MESSAGE_MAP@stop_skipping@ +CCCC_Dialect@c++.stl@__STL_BEGIN_NAMESPACE@ignore@ +CCCC_Dialect@c++.stl@__STL_END_NAMESPACE@ignore@ diff --git a/artifacts/cccc/cccc.xml b/artifacts/cccc/cccc.xml new file mode 100644 index 0000000..0c44c36 --- /dev/null +++ b/artifacts/cccc/cccc.xml @@ -0,0 +1,4239 @@ + + + +Sun Mar 16 18:53:21 2025 + + + + + + + + + + + + + + + + + + + + + +ApplicationConnector + + + + + + + +ApplicationController + + + + + + + +AuthDialog + + + + + + + +BaseGenerator + + + + + + + +BaseSqlTableModel + + + + + + + +BaseSqlTableRepository + + + + + + + +CreateGenreRequest + + + + + + + +CreateHallRequest + + + + + + + +CreateMovieRequest + + + + + + + +CreateRefundRequest + + + + + + + +CreateRoleRequest + + + + + + + +CreateSessionRequest + + + + + + + +CreateTicketRequest + + + + + + + +CreateUserRequest + + + + + + + +DatabaseManager + + + + + + + +DateTimeDelegate + + + + + + + +DateTimeGenerator + + + + + + + +DayManager + + + + + + + +DayManagerTest + + + + + + + +DirectoriesManagementWidget + + + + + + + +EntityDeleterWidget + + + + + + + +EntityFinderWidget + + + + + + + +EntityUpdaterWidget + + + + + + + +ErrorDialog + + + + + + + +ExecuteSqlFile + + + + + + + +FileReader + + + + + + + +Genre + + + + + + + +GenreDTO + + + + + + + +GenresModel + + + + + + + +GenresRepository + + + + + + + +Hall + + + + + + + +HallDTO + + + + + + + +HallsModel + + + + + + + +HallsRepository + + + + + + + +MainWindow + + + + + + + +ModelManager + + + + + + + +Movie + + + + + + + +MovieDTO + + + + + + + +MoviesModel + + + + + + + +MoviesRepository + + + + + + + +MultiColumnSortFilterProxyModel + + + + + + + +NewGenre + + + + + + + +NewHall + + + + + + + +NewMovie + + + + + + + +NewRefund + + + + + + + +NewSession + + + + + + + +NewTicket + + + + + + + +Orientation + + + + + + + +QAbstractAxis + + + + + + + +QAbstractItemModel + + + + + + + +QAbstractSeries + + + + + + + +QChart + + + + + + + +QDateTime + + + + + + + +QList + + + + + + + +QLocale + + + + + + + +QMap + + + + + + + +QMetaObject + + + + + + + +QModelIndex + + + + + + + +QObject + + + + + + + +QPair + + + + + + + +QSqlDatabase + + + + + + + +QSqlField + + + + + + + +QSqlQuery + + + + + + + +QSqlRecord + + + + + + + +QString + + + + + + + +QStringList + + + + + + + +QTableView + + + + + + + +QTime + + + + + + + +QVariant + + + + + + + +QVector + + + + + + + +QWidget + + + + + + + +Refund + + + + + + + +RefundDTO + + + + + + + +RefundGenerator + + + + + + + +RefundsModel + + + + + + + +RefundsRepository + + + + + + + +RelationIdConfig + + + + + + + +ReportsWidget + + + + + + + +RepositoryManager + + + + + + + +RepositoryResult + + + + + + + +ReservationManager + + + + + + + +ReservationManagerTest + + + + + + + +RoleDTO + + + + + + + +RolesRepository + + + + + + + +SQLiteDatabase + + + + + + + +SQLiteDatabaseCRUDTest + + + + + + + +SQLiteDatabaseForeignKeyTest + + + + + + + +SQLiteDatabaseTriggerTest + + + + + + + +SQLiteFileExecutor + + + + + + + +SQLiteStatement + + + + + + + +SalesData + + + + + + + +SchemaMetadata + + + + + + + +SearchDialog + + + + + + + +Session + + + + + + + +SessionDTO + + + + + + + +SessionGenerator + + + + + + + +SessionManagementWidget + + + + + + + +SessionStatisticsDTO + + + + + + + +SessionsModel + + + + + + + +SessionsRepository + + + + + + + +SessionsStatisticsRepository + + + + + + + +SingleRecordTimeRangeWidget + + + + + + + +TableInfoSQLite + + + + + + + +Test + + + + + + + +Ticket + + + + + + + +TicketDTO + + + + + + + +TicketGenerator + + + + + + + +TicketReturnWidget + + + + + + + +TicketSaleWidget + + + + + + + +TicketSalesReportWidget + + + + + + + +TicketsModel + + + + + + + +TicketsRepository + + + + + + + +UpdateGenreRequest + + + + + + + +UpdateHallRequest + + + + + + + +UpdateMovieRequest + + + + + + + +UpdateRefundRequest + + + + + + + +UpdateRoleRequest + + + + + + + +UpdateSessionRequest + + + + + + + +UpdateTicketRequest + + + + + + + +UpdateUserRequest + + + + + + + +UserDTO + + + + + + + +UsersRepository + + + + + + + +anonymous + + + + + + + +bool + + + + + + + +function + + + + + + + +initializer_list + + + + + + + +optional + + + + + + + +qint32 + + + + + + + +qint64 + + + + + + + +qsizetype + + + + + + + +sqlite3 + + + + + + + +string + + + + + + + + + +ApplicationConnector + + + + + + + +ApplicationController + + + + + + + +AuthDialog + + + + + + + +BaseGenerator + + + + + + + +BaseSqlTableModel + + + + + + + +BaseSqlTableRepository + + + + + + + +CreateGenreRequest + + + + + + + +CreateHallRequest + + + + + + + +CreateMovieRequest + + + + + + + +CreateRefundRequest + + + + + + + +CreateRoleRequest + + + + + + + +CreateSessionRequest + + + + + + + +CreateTicketRequest + + + + + + + +CreateUserRequest + + + + + + + +DatabaseManager + + + + + + + +DateTimeDelegate + + + + + + + +DateTimeGenerator + + + + + + + +DayManager + + + + + + + +DayManagerTest + + + + + + + +DirectoriesManagementWidget + + + + + + + +EntityDeleterWidget + + + + + + + +EntityFinderWidget + + + + + + + +EntityUpdaterWidget + + + + + + + +ErrorDialog + + + + + + + +ExecuteSqlFile + + + + + + + +FileReader + + + + + + + +Genre + + + + + + + +GenreDTO + + + + + + + +GenresModel + + + + + + + +GenresRepository + + + + + + + +Hall + + + + + + + +HallDTO + + + + + + + +HallsModel + + + + + + + +HallsRepository + + + + + + + +MainWindow + + + + + + + +ModelManager + + + + + + + +Movie + + + + + + + +MovieDTO + + + + + + + +MoviesModel + + + + + + + +MoviesRepository + + + + + + + +MultiColumnSortFilterProxyModel + + + + + + + +NewGenre + + + + + + + +NewHall + + + + + + + +NewMovie + + + + + + + +NewRefund + + + + + + + +NewSession + + + + + + + +NewTicket + + + + + + + +Orientation + + + + + + + +QAbstractAxis + + + + + + + +QAbstractItemModel + + + + + + + +QAbstractSeries + + + + + + + +QChart + + + + + + + +QDateTime + + + + + + + +QList + + + + + + + +QLocale + + + + + + + +QMap + + + + + + + +QMetaObject + + + + + + + +QModelIndex + + + + + + + +QObject + + + + + + + +QPair + + + + + + + +QSqlDatabase + + + + + + + +QSqlField + + + + + + + +QSqlQuery + + + + + + + +QSqlRecord + + + + + + + +QString + + + + + + + +QStringList + + + + + + + +QTableView + + + + + + + +QTime + + + + + + + +QVariant + + + + + + + +QVector + + + + + + + +QWidget + + + + + + + +Refund + + + + + + + +RefundDTO + + + + + + + +RefundGenerator + + + + + + + +RefundsModel + + + + + + + +RefundsRepository + + + + + + + +RelationIdConfig + + + + + + + +ReportsWidget + + + + + + + +RepositoryManager + + + + + + + +RepositoryResult + + + + + + + +ReservationManager + + + + + + + +ReservationManagerTest + + + + + + + +RoleDTO + + + + + + + +RolesRepository + + + + + + + +SQLiteDatabase + + + + + + + +SQLiteDatabaseCRUDTest + + + + + + + +SQLiteDatabaseForeignKeyTest + + + + + + + +SQLiteDatabaseTriggerTest + + + + + + + +SQLiteFileExecutor + + + + + + + +SQLiteStatement + + + + + + + +SalesData + + + + + + + +SchemaMetadata + + + + + + + +SearchDialog + + + + + + + +Session + + + + + + + +SessionDTO + + + + + + + +SessionGenerator + + + + + + + +SessionManagementWidget + + + + + + + +SessionStatisticsDTO + + + + + + + +SessionsModel + + + + + + + +SessionsRepository + + + + + + + +SessionsStatisticsRepository + + + + + + + +SingleRecordTimeRangeWidget + + + + + + + +TableInfoSQLite + + + + + + + +Test + + + + + + + +Ticket + + + + + + + +TicketDTO + + + + + + + +TicketGenerator + + + + + + + +TicketReturnWidget + + + + + + + +TicketSaleWidget + + + + + + + +TicketSalesReportWidget + + + + + + + +TicketsModel + + + + + + + +TicketsRepository + + + + + + + +UpdateGenreRequest + + + + + + + +UpdateHallRequest + + + + + + + +UpdateMovieRequest + + + + + + + +UpdateRefundRequest + + + + + + + +UpdateRoleRequest + + + + + + + +UpdateSessionRequest + + + + + + + +UpdateTicketRequest + + + + + + + +UpdateUserRequest + + + + + + + +UserDTO + + + + + + + +UsersRepository + + + + + + + +anonymous + + + + + + + +bool + + + + + + + +function + + + + + + + +initializer_list + + + + + + + +optional + + + + + + + +qint32 + + + + + + + +qint64 + + + + + + + +qsizetype + + + + + + + +sqlite3 + + + + + + + +string + + + + + + + + + +ApplicationConnector + + + + + + + + + + + +ApplicationController + + + + + + + + + + + +AuthDialog + + + + + + + + + + + +BaseGenerator + + + + + + + + + + + +BaseSqlTableModel + + + + + + + + + + + +BaseSqlTableRepository + + + + + + + + + + + +CreateGenreRequest + + + + + + + + + + + +CreateHallRequest + + + + + + + + + + + +CreateMovieRequest + + + + + + + + + + + +CreateRefundRequest + + + + + + + + + + + +CreateRoleRequest + + + + + + + + + + + +CreateSessionRequest + + + + + + + + + + + +CreateTicketRequest + + + + + + + + + + + +CreateUserRequest + + + + + + + + + + + +DatabaseManager + + + + + + + + + + + +DateTimeDelegate + + + + + + + + + + + +DateTimeGenerator + + + + + + + + + + + +DayManager + + + + + + + + + + + +DayManagerTest + + + + + + + + + + + +DirectoriesManagementWidget + + + + + + + + + + + +EntityDeleterWidget + + + + + + + + + + + +EntityFinderWidget + + + + + + + + + + + +EntityUpdaterWidget + + + + + + + + + + + +ErrorDialog + + + + + + + + + + + +ExecuteSqlFile + + + + + + + + + + + +FileReader + + + + + + + + + + + +Genre + + + + + + + + + + + +GenreDTO + + + + + + + + + + + +GenresModel + + + + + + + + + + + +GenresRepository + + + + + + + + + + + +Hall + + + + + + + + + + + +HallDTO + + + + + + + + + + + +HallsModel + + + + + + + + + + + +HallsRepository + + + + + + + + + + + +MainWindow + + + + + + + + + + + +ModelManager + + + + + + + + + + + +Movie + + + + + + + + + + + +MovieDTO + + + + + + + + + + + +MoviesModel + + + + + + + + + + + +MoviesRepository + + + + + + + + + + + +MultiColumnSortFilterProxyModel + + + + + + + + + + + +NewGenre + + + + + + + + + + + +NewHall + + + + + + + + + + + +NewMovie + + + + + + + + + + + +NewRefund + + + + + + + + + + + +NewSession + + + + + + + + + + + +NewTicket + + + + + + + + + + + +Orientation + + + + + + + + + + + +QAbstractAxis + + + + + + + + + + + +QAbstractItemModel + + + + + + + + + + + +QAbstractSeries + + + + + + + + + + + +QChart + + + + + + + + + + + +QDateTime + + + + + + + + + + + +QList + + + + + + + + + + + +QLocale + + + + + + + + + + + +QMap + + + + + + + + + + + +QMetaObject + + + + + + + + + + + +QModelIndex + + + + + + + + + + + +QObject + + + + + + + + + + + +QPair + + + + + + + + + + + +QSqlDatabase + + + + + + + + + + + +QSqlField + + + + + + + + + + + +QSqlQuery + + + + + + + + + + + +QSqlRecord + + + + + + + + + + + +QString + + + + + + + + + + + +QStringList + + + + + + + + + + + +QTableView + + + + + + + + + + + +QTime + + + + + + + + + + + +QVariant + + + + + + + + + + + +QVector + + + + + + + + + + + +QWidget + + + + + + + + + + + +Refund + + + + + + + + + + + +RefundDTO + + + + + + + + + + + +RefundGenerator + + + + + + + + + + + +RefundsModel + + + + + + + + + + + +RefundsRepository + + + + + + + + + + + +RelationIdConfig + + + + + + + + + + + +ReportsWidget + + + + + + + + + + + +RepositoryManager + + + + + + + + + + + +RepositoryResult + + + + + + + + + + + +ReservationManager + + + + + + + + + + + +ReservationManagerTest + + + + + + + + + + + +RoleDTO + + + + + + + + + + + +RolesRepository + + + + + + + + + + + +SQLiteDatabase + + + + + + + + + + + +SQLiteDatabaseCRUDTest + + + + + + + + + + + +SQLiteDatabaseForeignKeyTest + + + + + + + + + + + +SQLiteDatabaseTriggerTest + + + + + + + + + + + +SQLiteFileExecutor + + + + + + + + + + + +SQLiteStatement + + + + + + + + + + + +SalesData + + + + + + + + + + + +SchemaMetadata + + + + + + + + + + + +SearchDialog + + + + + + + + + + + +Session + + + + + + + + + + + +SessionDTO + + + + + + + + + + + +SessionGenerator + + + + + + + + + + + +SessionManagementWidget + + + + + + + + + + + +SessionStatisticsDTO + + + + + + + + + + + +SessionsModel + + + + + + + + + + + +SessionsRepository + + + + + + + + + + + +SessionsStatisticsRepository + + + + + + + + + + + +SingleRecordTimeRangeWidget + + + + + + + + + + + +TableInfoSQLite + + + + + + + + + + + +Test + + + + + + + + + + + +Ticket + + + + + + + + + + + +TicketDTO + + + + + + + + + + + +TicketGenerator + + + + + + + + + + + +TicketReturnWidget + + + + + + + + + + + +TicketSaleWidget + + + + + + + + + + + +TicketSalesReportWidget + + + + + + + + + + + +TicketsModel + + + + + + + + + + + +TicketsRepository + + + + + + + + + + + +UpdateGenreRequest + + + + + + + + + + + +UpdateHallRequest + + + + + + + + + + + +UpdateMovieRequest + + + + + + + + + + + +UpdateRefundRequest + + + + + + + + + + + +UpdateRoleRequest + + + + + + + + + + + +UpdateSessionRequest + + + + + + + + + + + +UpdateTicketRequest + + + + + + + + + + + +UpdateUserRequest + + + + + + + + + + + +UserDTO + + + + + + + + + + + +UsersRepository + + + + + + + + + + + +anonymous + + + + + + + + + + + +bool + + + + + + + + + + + +function + + + + + + + + + + + +initializer_list + + + + + + + + + + + +optional + + + + + + + + + + + +qint32 + + + + + + + + + + + +qint64 + + + + + + + + + + + +qsizetype + + + + + + + + + + + +sqlite3 + + + + + + + + + + + +string + + + + + + + + + + + + + +<file scope items> + + + + + + +<file scope items> + + + + + + +<file scope items> + + + + + + +<file scope items> + + + + + + +noexcept { return + + + + + + +noexcept { if + + + + + + +noexcept { return + + + + + + +noexcept { int + + + + + + +noexcept { return + + + + + + +noexcept { if + + + + + + +<file scope items> + + + + + + +<file scope items> + + + + + + +<file scope items> + + + + + + +<file scope items> + + + + + + +<file scope items> + + + + + + +<file scope items> + + + + + + +QList < std + + + + + + +<file scope items> + + + + + + +<file scope items> + + + + + + +<file scope items> + + + + + + +<file scope items> + + + + + + +noexcept { return + + + + + + +<file scope items> + + + + + + +<file scope items> + + + + + + +<file scope items> + + + + + + +<file scope items> + + + + + + +<file scope items> + + + + + + +<file scope items> + + + + + + +<file scope items> + + + + + + +<file scope items> + + + + + + +<file scope items> + + + + + + +<file scope items> + + + + + + +<file scope items> + + + + + + +<file scope items> + + + + + + +<file scope items> + + + + + + +<file scope items> + + + + + + +std :: vector + + + + + + +<file scope items> + + + + + + +executor . executeSQLFile + + + + + + +executor . executeSQLFile + + + + + + +<file scope items> + + + + + + +<file scope items> + + + + + + +<file scope items> + + + + + + +<file scope items> + + + + + + +<file scope items> + + + + + + +<file scope items> + + + + + + +<file scope items> + + + + + + +<file scope items> + + + + + + +<file scope items> + + + + + + +<file scope items> + + + + + + +<file scope items> + + + + + + +<file scope items> + + + + + + +<file scope items> + + + + + + +<file scope items> + + + + + + +<file scope items> + + + + + + +<file scope items> + + + + + + +constexpr char Genres + + + + + + +constexpr char Halls + + + + + + +constexpr char Movies + + + + + + +constexpr char Refunds + + + + + + +constexpr char Sessions + + + + + + +constexpr char Tickets + + + + + + +<file scope items> + + + + + + +<file scope items> + + + + + + +<file scope items> + + + + + + +<file scope items> + + + + + + +<file scope items> + + + + + + +<file scope items> + + + + + + +<file scope items> + + + + + + +<file scope items> + + + + + + +<file scope items> + + + + + + +<file scope items> + + + + + + +<file scope items> + + + + + + + diff --git a/artifacts/cccc/cccc_src.html b/artifacts/cccc/cccc_src.html new file mode 100644 index 0000000..1db616a --- /dev/null +++ b/artifacts/cccc/cccc_src.html @@ -0,0 +1,7956 @@ + +source file + + + + + +

./core/controllers/application_connector.cpp

+ +       1  #include "application_connector.h"
+          
+          #include "model_manager.h"
+          #include "repository_manager.h"
+          #include "schema_metadata.h"
+          #include <QObject>
+          
+       8  ApplicationConnector::ApplicationConnector(  QObject *rootObject )
+           : modelManager_(  ModelManager::instance(   ) ),  
+           repositoryManager_(  RepositoryManager::instance(   ) ),  
+           rootObject_(  rootObject ) {}
+          
+      13  bool ApplicationConnector::connect(   ) {
+           if (  !connectSelfReferenceTableLinks(   ) ) {
+           return false;
+           }
+          
+           if (  !connectTablePairLinks(   ) ) {
+           return false;
+           }
+          
+           if (  !connectUpdateDeleteRFLinks(   ) ) {
+           return false;
+           }
+          
+           if (  !connectDeleteRFLinks(   ) ) {
+           return false;
+           }
+          
+           return true;
+          }
+          
+          ApplicationConnector::RMLinkList
+      34  ApplicationConnector::initializeSelfReferenceTableLinks(   ) {
+           return {linkRepositoryToModel(  "genres",   "genres" ),  
+           linkRepositoryToModel(  "halls",   "halls" ),  
+           linkRepositoryToModel(  "movies",   "movies" ),  
+           linkRepositoryToModel(  "sessions",   "sessions" ),  
+           linkRepositoryToModel(  "refunds",   "refunds" ),  
+           linkRepositoryToModel(  "tickets",   "tickets" )};
+          }
+          
+          ApplicationConnector::RMLinkList
+      44  ApplicationConnector::initializeTablePairLinks(   ) {
+           return {linkRepositoryToModel(  "genres",   "movies" ),  
+           linkRepositoryToModel(  "genres",   "sessions" ),  
+           linkRepositoryToModel(  "genres",   "tickets" ),  
+           linkRepositoryToModel(  "genres",   "refunds" ),  
+           linkRepositoryToModel(  "halls",   "sessions" ),  
+           linkRepositoryToModel(  "halls",   "tickets" ),  
+           linkRepositoryToModel(  "halls",   "refunds" ),  
+           linkRepositoryToModel(  "movies",   "sessions" ),  
+           linkRepositoryToModel(  "movies",   "tickets" ),  
+           linkRepositoryToModel(  "movies",   "refunds" ),  
+           linkRepositoryToModel(  "sessions",   "refunds" ),  
+           linkRepositoryToModel(  "tickets",   "refunds" )};
+          }
+          
+          ApplicationConnector::RFLinkList
+      60  ApplicationConnector::flattenLinkList(  const QVector<RFLinkList> &linkLists ) {
+           RFLinkList result;
+           for (  const RFLinkList &currentList : linkLists ) {
+           std::move(  currentList.cbegin(   ),   currentList.cend(   ),  
+           std::back_inserter(  result ) );
+           }
+           return result;
+          }
+          
+          ApplicationConnector::RFLinkList
+      70  ApplicationConnector::initializeUpdateDeleteCandidates(   ) {
+           const QVector<RFLinkList> updateDeleteCandidates = {
+           linkRepositoryToFinder(  "genres",   "genreFinder" ),  
+           linkRepositoryToFinder(  "genres",   "movieFinder" ),  
+           linkRepositoryToFinder(  "genres",   "sessionFinder" ),  
+           linkRepositoryToFinder(  "genres",   "ticketFinder" ),  
+           linkRepositoryToFinder(  "genres",   "entityFinder" ),  
+           linkRepositoryToFinder(  "halls",   "hallFinder" ),  
+           linkRepositoryToFinder(  "halls",   "movieFinder" ),  
+           linkRepositoryToFinder(  "halls",   "sessionFinder" ),  
+           linkRepositoryToFinder(  "halls",   "ticketFinder" ),  
+           linkRepositoryToFinder(  "halls",   "entityFinder" ),  
+           linkRepositoryToFinder(  "movies",   "movieFinder" ),  
+           linkRepositoryToFinder(  "movies",   "sessionFinder" ),  
+           linkRepositoryToFinder(  "movies",   "ticketFinder" ),  
+           linkRepositoryToFinder(  "movies",   "entityFinder" ),  
+           linkRepositoryToFinder(  "sessions",   "sessionFinder" ),  
+           linkRepositoryToFinder(  "sessions",   "ticketFinder" ),  
+           linkRepositoryToFinder(  "sessions",   "entityFinder" ),  
+           linkRepositoryToFinder(  "tickets",   "ticketFinder" ),  
+           linkRepositoryToFinder(  "tickets",   "entityFinder" ),  
+           linkRepositoryToFinder(  "refunds",   "entityFinder" )};
+          
+           return flattenLinkList(  updateDeleteCandidates );
+          }
+          
+          ApplicationConnector::RFLinkList
+      97  ApplicationConnector::initializeDeleteCandidates(   ) {
+           // foreignKeyFinder will reset to default on signal primaryKeyFinder
+          
+           const QVector<RFLinkList> deleteCandidates = {
+           linkRepositoryToFinder(  "genres",   "primaryKeyFinder" ),  
+           linkRepositoryToFinder(  "halls",   "primaryKeyFinder" ),  
+           linkRepositoryToFinder(  "movies",   "primaryKeyFinder" ),  
+           linkRepositoryToFinder(  "sessions",   "primaryKeyFinder" ),  
+           linkRepositoryToFinder(  "tickets",   "primaryKeyFinder" ),  
+           linkRepositoryToFinder(  "refunds",   "primaryKeyFinder" )};
+          
+           return flattenLinkList(  deleteCandidates );
+          }
+          
+     111  bool ApplicationConnector::connectSelfReferenceTableLinks(   ) {
+           const QList<RMLink> selfReferenceTableLinks =
+           initializeSelfReferenceTableLinks(   );
+           qInfo(   ) << "Connecting self-reference tables...";
+          
+           if (  !connect(  selfReferenceTableLinks,   singleTableConnections(   ) ) ) {
+           qWarning(   ) << "Failed to connect self-reference tables";
+           return false;
+           }
+           return true;
+          }
+          
+     123  bool ApplicationConnector::connectTablePairLinks(   ) {
+           const RMLinkList tablePairLinks = initializeTablePairLinks(   );
+           qInfo(   ) << "Connecting pair tables...";
+          
+           if (  !connect(  tablePairLinks,   pairTableConnections(   ) ) ) {
+           qWarning(   ) << "Failed to connect pair tables";
+           return false;
+           }
+           return true;
+          }
+          
+     134  bool ApplicationConnector::connectUpdateDeleteRFLinks(   ) {
+           const RFLinkList repositoryToFinderLinks = initializeUpdateDeleteCandidates(   );
+           qInfo(   ) << "Connecting repository to finder...";
+          
+           if (  !connect(  repositoryToFinderLinks,   repositoryToFinderConnections(   ) ) ) {
+           qWarning(   ) << "Failed to connect repository to finder";
+           return false;
+           }
+           return true;
+          }
+          
+     145  bool ApplicationConnector::connectDeleteRFLinks(   ) {
+           const RFLinkList repositoryToFinderLinks = initializeDeleteCandidates(   );
+           qInfo(   ) << "Connecting repository to finder...";
+          
+           using Signal = void (  Repository::* )(   );
+           using Slot = void (  Finder::* )(   );
+           RFConnectionList connections;
+           connections.append(  Connection<Signal,   Slot>(  &Repository::dataDeleted,  
+           &Finder::resetToDefault ) );
+          
+           if (  !connect(  repositoryToFinderLinks,   connections ) ) {
+           qWarning(   ) << "Failed to connect repository to finder";
+           return false;
+           }
+           return true;
+          }
+          
+          ApplicationConnector::RMConnectionList
+     163  ApplicationConnector::pairTableConnections(   ) {
+           using Signal = void (  Repository::* )(   );
+           using Slot = bool (  Model::* )(   );
+          
+           RMConnectionList result;
+           std::initializer_list<Connection<Signal,   Slot>> initList = {
+           {&Repository::dataUpdated,   &Model::refreshAll},  
+           {&Repository::dataDeleted,   &Model::refreshAll}};
+          
+           for (  const auto &connection : initList ) {
+           result.append(  connection );
+           }
+          
+           return result;
+          }
+          
+          ApplicationConnector::RMConnectionList
+     180  ApplicationConnector::singleTableConnections(   ) {
+           using Signal = void (  Repository::* )(   );
+           using Slot = bool (  Model::* )(   );
+          
+           RMConnectionList result;
+           std::initializer_list<Connection<Signal,   Slot>> initList = {
+           {&Repository::dataCreated,   &Model::refreshAll},  
+           {&Repository::dataUpdated,   &Model::refreshAll},  
+           {&Repository::dataDeleted,   &Model::refreshAll}};
+          
+           for (  const auto &connection : initList ) {
+           result.append(  connection );
+           }
+          
+           return result;
+          }
+          
+     197  ApplicationConnector::RMLink ApplicationConnector::linkRepositoryToModel(  
+     198   const QString &senderDatabaseTableName,  
+     199   const QString &receiverDatabaseTableName ) {
+           SchemaMetadata metadata = SchemaMetadata::defaultSchema(   );
+          
+           Repository *sender = repositoryManager_.getRepositoryAs<Repository>(  
+           metadata.repositoryTableName(  senderDatabaseTableName ) );
+           if (  !sender ) {
+           qWarning(   ) << "Sender with type" << typeid(  sender ).name(   ) << "is null";
+           }
+          
+           Model *receiver = modelManager_.getModelAs<Model>(  
+           metadata.modelTableName(  receiverDatabaseTableName ) );
+           if (  !receiver ) {
+           qWarning(   ) << "Receiver with type" << typeid(  receiver ).name(   ) << "is null";
+           }
+          
+           if (  !sender || !receiver ) {
+           return qMakePair(  nullptr,   nullptr );
+           }
+          
+           return qMakePair(  sender,   receiver );
+          }
+          
+     221  ApplicationConnector::RFLinkList ApplicationConnector::linkRepositoryToFinder(  
+     222   const QString &senderDatabaseTableName,  
+     223   const QString &receiverEntityFinderName ) {
+           SchemaMetadata metadata = SchemaMetadata::defaultSchema(   );
+          
+           Repository *sender = repositoryManager_.getRepositoryAs<Repository>(  
+           metadata.repositoryTableName(  senderDatabaseTableName ) );
+           if (  !sender ) {
+           qWarning(   ) << "Sender with type" << typeid(  sender ).name(   ) << "is null";
+           }
+          
+           QList<Finder *> receiver =
+           rootObject_->findChildren<Finder *>(  receiverEntityFinderName );
+           if (  receiver.isEmpty(   ) ) {
+           qWarning(   ) << "Receivers with type" << typeid(  receiver ).name(   )
+           << "there is not";
+           }
+          
+           if (  !sender || receiver.isEmpty(   ) ) {
+           return QList<RFLink>(   );
+           }
+          
+           RFLinkList result;
+           for (  Finder *currentReceiver : receiver ) {
+           result.append(  qMakePair(  sender,   currentReceiver ) );
+           }
+          
+           return result;
+          }
+          
+          ApplicationConnector::RFConnectionList
+     252  ApplicationConnector::repositoryToFinderConnections(   ) {
+           using Signal = void (  Repository::* )(   );
+           using Slot = void (  Finder::* )(   );
+          
+           RFConnectionList result;
+           std::initializer_list<Connection<Signal,   Slot>> initList = {
+           {&Repository::dataDeleted,   &Finder::resetToDefault},  
+           {&Repository::dataUpdated,   &Finder::resetToDefault}};
+          
+           for (  const auto &connection : initList ) {
+           result.append(  connection );
+           }
+          
+           return result;
+          }
+          
+     268  QString ApplicationConnector::getAddress(  const QObject *object ) {
+           quintptr address = reinterpret_cast<quintptr>(  object );
+           return object ? QString::number(  address,   16 ) : "null";
+          };
+          
+     273  QString ApplicationConnector::getMetaClassName(  const QMetaObject *meta ) {
+           return meta ? meta->className(   ) : "Unknown";
+          };
+          
+     277  QString ApplicationConnector::getMethodSignature(  const QMetaObject *meta,  
+           const char *methodType,  
+     279   bool isSignal ) {
+           if (  !meta ) {
+           return "Unknown";
+           }
+          
+           QByteArray normalizedSignature = QMetaObject::normalizedSignature(  methodType );
+           int methodIndex = isSignal ? meta->indexOfSignal(  normalizedSignature )
+           : meta->indexOfSlot(  normalizedSignature );
+          
+           if (  methodIndex < 0 ) {
+           return normalizedSignature;
+           }
+          
+           QString result = meta->method(  methodIndex ).methodSignature(   );
+           return result;
+          };
+
+

./core/controllers/application_controller.cpp

+ +       1  #include "application_controller.h"
+          #include "config.h"
+          #include "database_manager.h"
+          
+          // Translations
+          #include <QCoreApplication>
+          #include <QLocale>
+          #include <QTranslator>
+          
+          // Generation of records
+          #include "refund_generator.h"
+          #include "session_generator.h"
+          #include "ticket_generator.h"
+          
+          // Auntification
+          #include "auth_dialog.h"
+          
+          qint32 ApplicationController::userId_ = -1;
+          qint32 ApplicationController::accessLevel_ = 0;
+          
+      21  bool ApplicationController::setupApplication(   ) {
+          
+           if (  !ensureDatabaseExists(  DATABASE_NAME ) ) {
+           return false;
+           }
+          
+           if (  !connectToDatabase(  DATABASE_NAME ) ) {
+           return false;
+           }
+          
+           if (  !loadTranslations(  "ru",   "app",   "_",   ":/translations" ) ) {
+           return false;
+           }
+          
+           AuthDialog authDialog;
+          
+           QObject::connect(  &authDialog,   &AuthDialog::loginSuccessful,  
+           &ApplicationController::onLoginSuccessful );
+          
+           QObject::connect(  &authDialog,   &AuthDialog::loginFailed,  
+           &ApplicationController::onLoginFailed );
+          
+           // if (  authDialog.exec(   ) != QDialog::Accepted ) {
+           // return false; // User has not logged in
+           // }
+          
+           return true;
+          }
+          
+      50  bool ApplicationController::ensureDatabaseExists(  
+      51   const QString &databaseFileName ) {
+           DatabaseManager::CreateDatabaseResult result =
+           DatabaseManager::createDefaultDatabaseIfMissing(  databaseFileName );
+          
+           switch (  result ) {
+           case DatabaseManager::CreateDatabaseResult::Success: {
+          
+          #ifndef NDEBUG
+           qInfo(   ) << "Generating test data...";
+          
+           DayManager dayManager(  QTime(  8,   0 ),   QTime(  17,   0 ) );
+           dayManager.setMode(  DayManager::SlotSelectionMode::Quick );
+           dayManager.setMode(  DayManager::StartTimeMode::Random );
+          
+           const QDate begin = QDate(  2025,   1,   1 ); // Since 01-01-2025
+           const QDate end = begin.addDays(  5 );
+           ReservationManager reservationManager(  14,   begin.daysTo(  end ),  
+           std::move(  dayManager ) );
+          
+           SessionGenerator sessionGenerator(  reservationManager );
+          
+           sessionGenerator.generateAll(  
+           sessionGenerator.defaultShouldLog(  1 /* percent */,   60 /* seconds */ ) );
+          
+           QPair<QTime,   QTime> timeRange(  QTime(  9,   30 ),   QTime(  15,   30 ) );
+          
+           TicketGenerator ticketsGenerator(  
+           {0,   30} /* day range */,   timeRange,  
+           {0.0,   1.0} /* fill ratio per session range*/ );
+           GeneratorInterface::ShouldLogSuccess performOtherwise =
+           ticketsGenerator.shouldLogFirstAndLastPercent(   );
+           ticketsGenerator.generateByFillRatio(  
+           0.35,  
+           ticketsGenerator.defaultShouldLog(  1 /* percent */,   600 /* seconds */ ) );
+          
+           RefundGenerator refundGenerator(  {0.1,   0.5} /* refund ratio range */,  
+           {0,   7} /* day range */,   timeRange );
+           refundGenerator.generateByFillRatio(  
+           0.1,  
+           refundGenerator.defaultShouldLog(  1 /* percent */,   600 /* seconds
+           */ ) );
+          
+           qInfo(   ) << "Test data generated successfully";
+          #endif
+          
+           qInfo(   ) << "Database created and initialized successfully";
+           } break;
+           case DatabaseManager::CreateDatabaseResult::AlreadyExists:
+           break;
+           case DatabaseManager::CreateDatabaseResult::Error:
+           qCritical(   ) << "Failed to create and connect to the database";
+           return false;
+           }
+          
+           return true;
+          }
+          
+     108  void ApplicationController::onLoginFailed(   ) {
+           userId_ = -1;
+           accessLevel_ = 0;
+          }
+          
+     113  void ApplicationController::onLoginSuccessful(  qint32 userId,  
+     114   qint32 accessLevel ) {
+           userId_ = userId;
+           accessLevel_ = accessLevel;
+          }
+          
+     119  bool ApplicationController::connectToDatabase(  const QString &databaseName ) {
+           if (  !DatabaseManager::connectToDefaultDatabase(  databaseName ) ) {
+           qCritical(   ) << "Failed to connect to the database";
+           return false;
+           }
+          
+           qInfo(   ) << "Connected to database" << databaseName << "successfully";
+           return true;
+          }
+          
+     129  bool ApplicationController::loadTranslations(  const QString &locale,  
+     130   const QString &filename,  
+     131   const QString &prefix,  
+     132   const QString &directory ) {
+           QCoreApplication *app = QCoreApplication::instance(   );
+           QTranslator *translator = new QTranslator(  app );
+          
+           bool loaded = translator->load(  QLocale(  locale ),   filename,   prefix,   directory );
+           if (  !loaded ) {
+           qWarning(   ) << "Failed to load translations";
+           return false;
+           }
+          
+           bool installed = app->installTranslator(  translator );
+           if (  !installed ) {
+           qWarning(   ) << "Failed to install translations";
+           return false;
+           }
+          
+           qInfo(   ) << "Translations are loaded successfully";
+           return true;
+          }
+
+

./core/db/database_manager.cpp

+ +       1  #include "database_manager.h"
+          
+          #include "config.h"
+          #include "execute_sql_file.h"
+          #include <QFile>
+          #include <QSqlError>
+          #include <qsqldatabase.h>
+          
+       9  DatabaseManager::~DatabaseManager(   ) {
+           disconnectDefaultDatabase(   );
+          
+           QString defaultConnectionName = QSqlDatabase::database(   ).connectionName(   );
+           QSqlDatabase::removeDatabase(  QSqlDatabase::database(   ).connectionName(   ) );
+          
+           qInfo(   ) << "Database with default connection name:" << defaultConnectionName
+           << "was removed";
+          }
+          
+          DatabaseManager::CreateDatabaseResult
+      20  DatabaseManager::createDefaultDatabaseIfMissing(  
+      21   const QString &databaseFileName ) {
+           if (  QFile::exists(  databaseFileName ) ) {
+           qInfo(   )
+           << "Database file name already exists and will not be created again:"
+           << databaseFileName;
+           return CreateDatabaseResult::AlreadyExists;
+           }
+          
+           if (  !connectToDefaultDatabase(  databaseFileName ) ) {
+           qWarning(   ) << "Failed to create and connect to the database";
+           return CreateDatabaseResult::Error;
+           }
+          
+           // Execute SQL files to initialize the database
+           QStringList sqlFiles = {":/sql/create_tables.sql",   ":/sql/create_indexes.sql",  
+           ":/sql/create_views.sql",   ":/sql/create_triggers.sql",  
+           ":/sql/insert_role.sql"};
+          
+          #ifndef NDEBUG
+           QStringList additionalSqlFiles = {
+           ":/sql/insert_genre.sql",   ":/sql/insert_hall.sql",  
+           ":/sql/insert_movie.sql",   ":/sql/insert_user.sql"};
+           sqlFiles.append(  additionalSqlFiles );
+          #endif
+          
+           QSqlDatabase defaultDatabase = QSqlDatabase::database(   );
+           bool success = executeSqlFiles(  sqlFiles,   defaultDatabase );
+           disconnectDefaultDatabase(   );
+          
+           if (  success ) {
+           qInfo(   ) << "Database created and initialized successfully";
+           return CreateDatabaseResult::Success;
+           }
+          
+           qWarning(   ) << "Failed to execute initialization SQL files";
+          
+           if (  QFile::remove(  databaseFileName ) ) {
+           qInfo(   ) << "Database file deleted due to initialization failure:"
+           << databaseFileName;
+           } else {
+           qWarning(   ) << "Failed to delete database file:" << databaseFileName;
+           }
+          
+           return CreateDatabaseResult::Error;
+          }
+          
+      67  bool DatabaseManager::connectToDefaultDatabase(  
+      68   const QString &databaseFileName ) {
+           QSqlDatabase defaultDatabase = QSqlDatabase::database(   );
+          
+           defaultDatabase.setDatabaseName(  databaseFileName );
+           if (  defaultDatabase.isValid(   ) && defaultDatabase.isOpen(   ) ) {
+           qInfo(   ) << "Database is already connected";
+           return true;
+           }
+          
+           // Constructor does not open/close the connection
+           defaultDatabase = QSqlDatabase::addDatabase(  DATABASE_DRIVER );
+           defaultDatabase.setDatabaseName(  databaseFileName );
+          
+           if (  !defaultDatabase.open(   ) ) {
+           qWarning(   ) << "Failed to connect to the database:" << databaseFileName;
+           return false;
+           }
+          
+           qDebug(   ) << "Database was connected successfully: Connection name:"
+           << defaultDatabase.connectionName(   );
+          
+           return true;
+          }
+          
+      92  void DatabaseManager::disconnectDefaultDatabase(   ) {
+           QSqlDatabase defaultDatabase = QSqlDatabase::database(   );
+           if (  defaultDatabase.isOpen(   ) ) {
+           defaultDatabase.close(   );
+           qInfo(   ) << "Database disconnected";
+           }
+          }
+          
+     100  bool DatabaseManager::executeSqlFiles(  const QStringList &filePaths,  
+     101   QSqlDatabase &database ) {
+           ExecuteSqlFile executor(  database );
+           for (  const QString &filePath : filePaths ) {
+           qInfo(   ) << "Executing SQL file:" << filePath;
+           if (  !executor(  filePath ) ) {
+           qWarning(   ) << "Failed to execute SQL file:" << filePath;
+           return false;
+           }
+           }
+           return true;
+          }
+
+

./core/db/execute_sql_file.cpp

+ +       1  #include "execute_sql_file.h"
+          
+          #include <QRegularExpression>
+          
+       5  ExecuteSqlFile::ExecuteSqlFile(  QSqlDatabase &db )
+           : db_(  db ),   delimiter_(  ";" ) { // Default delimiter is ";"
+           // Constructor does not open/close the connection
+          }
+          
+      10  bool ExecuteSqlFile::operator(   )(  const QString &filePath ) {
+           // Ensure the database connection is open
+           if (  !db_.isOpen(   ) ) {
+           qWarning(   ) << "Database connection is not open";
+           return false;
+           }
+          
+           QFile file(  filePath );
+           if (  !file.open(  QIODevice::ReadOnly | QIODevice::Text ) ) {
+           qWarning(   ) << "Failed to open file:" << filePath;
+           return false;
+           }
+          
+           QTextStream in(  &file );
+           QString sqlContent = in.readAll(   );
+           file.close(   );
+          
+           QStringList statements = sqlContent.split(  "\n",   Qt::SkipEmptyParts );
+          
+           qInfo(   ) << "Executing SQL file:" << filePath;
+          
+           return processStatements(  statements );
+          }
+          
+      34  bool ExecuteSqlFile::processStatements(  QStringList &statements ) {
+           QString currentStatement;
+          
+           for (  QString &line : statements ) {
+           qInfo(   ) << "Processing line:" << line;
+           if (  !processLine(  line,   currentStatement ) ) {
+           return false;
+           }
+           }
+          
+           // Execute any remaining statement
+           if (  !currentStatement.isEmpty(   ) && !executeStatement(  currentStatement ) ) {
+           return false;
+           }
+          
+           return true;
+          }
+          
+      52  bool ExecuteSqlFile::processLine(  QString &line,   QString &currentStatement ) {
+           if (  !filterLine(  line ) ) {
+           qInfo(   ) << "Line is empty after filtering";
+           return true; // Line was empty after filtering
+           }
+          
+           if (  processDelimiterChange(  line ) ) {
+           qInfo(   ) << "Delimiter changed to:" << delimiter_;
+           return true;
+           }
+          
+           currentStatement += line + " ";
+          
+           auto delimiterIndex = currentStatement.lastIndexOf(  delimiter_ );
+           if (  delimiterIndex == -1 ) {
+           qInfo(   ) << "Delimiter not found,   current statement is not finished";
+           return true;
+           }
+           qInfo(   ) << "Statement finished,   delimiter found at index:" << delimiterIndex;
+          
+           // Execute the current statement
+           QString completedStatement =
+           currentStatement.replace(  delimiter_,   ";" ).trimmed(   );
+           if (  !executeStatement(  completedStatement ) ) {
+           qWarning(   ) << "Failed to execute statement:" << completedStatement;
+           return false; // Execution failed
+           }
+           qInfo(   ) << "Successfully executed statement:" << completedStatement;
+          
+           currentStatement.clear(   );
+          
+           return true;
+          }
+          
+      86  bool ExecuteSqlFile::processDelimiterChange(  QString &line ) {
+           QRegularExpression regex(  R"(  ^DELIMITER\s+(  \S+ ) )" );
+           QRegularExpressionMatch match = regex.match(  line );
+           if (  !match.hasMatch(   ) ) {
+           return false;
+           }
+           delimiter_ = match.captured(  1 ); // Update the delimiter_
+           return true;
+          }
+          
+      96  bool ExecuteSqlFile::filterLine(  QString &line ) {
+           line = line.section(  "--",   0,   0 ).trimmed(   ); // Remove comments and trim
+           return !line.isEmpty(   ); // Return true if line is not empty
+          }
+          
+     101  bool ExecuteSqlFile::executeStatement(  const QString &statement ) const {
+           QSqlQuery query(  db_ );
+           if (  !query.exec(  statement ) ) {
+           qWarning(   ) << "Error:" << query.lastError(   ).text(   );
+           return false;
+           }
+           return true;
+          }
+
+

./core/repositories/repository_result.cpp

+ +       1  #include "repository_result.h"
+          
+       3  RepositoryResult RepositoryResult::successResult(   ) { return {"",   true}; }
+          
+       5  RepositoryResult RepositoryResult::failureResult(  const QString &error ) {
+           return {error,   false};
+          }
+
+

./core/services/base_generator.cpp

+ +          #include "base_generator.h"
+          
+          #include <QElapsedTimer>
+          #include <QVariant>
+          
+          BaseGenerator::ShouldLogSuccess
+       7  BaseGenerator::shouldLogAllSuccesses(   ) const noexcept {
+           return [this](   ) { return true; };
+          }
+          
+          BaseGenerator::ShouldLogSuccess
+          BaseGenerator::shouldLogEveryNPercent(  int percent ) const noexcept {
+           if (  percent <= 0 ) {
+           return [this](   ) { return false; };
+           }
+          
+           int oldLastPercentage = 0;
+           return [this,   percent,   oldLastPercentage](   ) mutable {
+           if (  oldLastPercentage == lastPercentage_ ) {
+           return false;
+           }
+          
+           oldLastPercentage = lastPercentage_;
+           return !bool(  lastPercentage_ % percent );
+           };
+          }
+          
+          BaseGenerator::ShouldLogSuccess
+          BaseGenerator::shouldLogFirstAndLastPercent(   ) const noexcept {
+           return [this](   ) { return createdRecords_ == 1 || lastPercentage_ == 100; };
+          }
+          
+          BaseGenerator::ShouldLogSuccess BaseGenerator::shouldLogEveryNSeconds(  
+           int seconds,   const ShouldLogSuccess &performOtherwise ) const noexcept {
+           QElapsedTimer timer;
+           timer.start(   );
+          
+           return [this,   timer,   seconds,   performOtherwise](   ) mutable {
+           if (  timer.elapsed(   ) >= seconds * 1000 ) {
+           timer.restart(   );
+           return true;
+           }
+           return performOtherwise(   );
+           };
+          }
+          
+          BaseGenerator::ShouldLogSuccess
+          BaseGenerator::defaultShouldLog(  int percent,   int seconds ) const noexcept {
+           ShouldLogSuccess first =
+           shouldLogEveryNSeconds(  seconds,   shouldLogFirstAndLastPercent(   ) );
+           ShouldLogSuccess second = shouldLogEveryNPercent(  percent );
+          
+           return [first,   second](   ) { return first(   ) || second(   ); };
+          }
+          
+          void BaseGenerator::generateAll(  const ShouldLogSuccess &shouldLogSuccess ) {
+           auto withoutLimit = [](   ) { return true; };
+          
+           generateImplementation(  withoutLimit,   shouldLogSuccess );
+          }
+          
+          void BaseGenerator::generateByFillRatio(  
+           double fillRatio,   const ShouldLogSuccess &shouldLogSuccess ) {
+           fillRatio >= 1.0 ? fillRatio = 1.0 : fillRatio;
+          
+           qInfo(   ) << "Limit fill ratio of records to create: " << fillRatio;
+          
+           auto shouldContinue = [this,   fillRatio](   ) -> bool {
+           double currentFillRatio = lastPercentage_ / 100.0;
+           bool shouldContinue = currentFillRatio < fillRatio;
+           if (  !shouldContinue ) {
+           qInfo(   ) << "Limit of records to create reached";
+           }
+           return shouldContinue;
+           };
+          
+           generateImplementation(  shouldContinue,   shouldLogSuccess );
+          };
+          
+          void BaseGenerator::generateByRecordCount(  
+           qsizetype totalRecordsToCreate,   const ShouldLogSuccess &shouldLogSuccess ) {
+           int limit = std::min(  totalRecordsToCreate,   calculateRemainingCapacity(   ) );
+          
+           qInfo(   ) << "Limit of records to create: " << limit;
+          
+           auto shouldContinue = [this,   limit](   ) -> bool {
+           bool shouldContinue = createdRecords_ < limit;
+           if (  !shouldContinue ) {
+           qInfo(   ) << "Limit of records to create reached";
+           }
+           return shouldContinue;
+           };
+          
+           generateImplementation(  shouldContinue,   shouldLogSuccess );
+          };
+          
+          void BaseGenerator::generateImplementation(  
+           std::function<bool(   )> shouldContinue,  
+           std::function<bool(   )> shouldLogSuccess ) {
+           maximumRecords_ = calculateRemainingCapacity(   );
+           qInfo(   ) << "The number of records available for creation:" << maximumRecords_;
+          
+           qInfo(   ).noquote(   ) << createTemplateMessage(   ) << "Started";
+          
+           while (  shouldContinue(   ) && prepareData(   ) ) {
+           bool success;
+           RepositoryResult result = createRecord(   );
+          
+           if (  !result.success ) {
+           qWarning(   ).noquote(   ) << createTemplateMessage(   )
+           << createFailureMessage(  result.errorMessage );
+           continue;
+           }
+           ++createdRecords_;
+           updatePercentage(   );
+          
+           if (  shouldLogSuccess(   ) ) {
+           qInfo(   ).noquote(   ) << createTemplateMessage(   ) << createSuccessMessage(   );
+           }
+          
+           clearStaleData(   );
+           }
+          
+           qInfo(   ).noquote(   ) << createTemplateMessage(   ) << "Completed";
+          }
+          
+          void BaseGenerator::updatePercentage(   ) {
+           int numerator = maximumRecords_ - calculateRemainingCapacity(   );
+           int newPercentage = std::floor(  numerator * 100.0 / maximumRecords_ );
+           lastPercentage_ = std::max(  newPercentage,   lastPercentage_ );
+          }
+          
+          QString BaseGenerator::createFailureMessage(  const QString &errorMessage ) const {
+           QString failureMessage = "Failure: Error message:\n\t%1";
+           return failureMessage.arg(  errorMessage );
+          }
+          
+          QString BaseGenerator::createSuccessMessage(   ) const { return "Success"; }
+          
+          QString BaseGenerator::createTemplateMessage(   ) const {
+           auto digitCount = [](  int number ) {
+           if (  number == 0 ) {
+           return 1;
+           }
+           return static_cast<int>(  std::log10(  std::abs(  number ) ) ) + 1;
+           };
+          
+           int maximumRecordsValue = calculateRemainingCapacity(   );
+           int newFieldWidth =
+           std::max(  digitCount(  createdRecords_ ),   digitCount(  maximumRecordsValue ) );
+           fieldWidth_ = std::max(  fieldWidth_,   newFieldWidth );
+          
+           static constexpr int progressBarSize = 25;
+           static constexpr int progressBarStep = 100 / progressBarSize;
+           const QString progressBar(  lastPercentage_ / progressBarStep,   QChar(  '#' ) );
+          
+           return QString(  "Creating records of entity %1 [ %2 <~ %3] [%4]:" )
+           .arg(  entityName_ )
+           .arg(  createdRecords_,   fieldWidth_,   10,   QChar(  ' ' ) )
+           .arg(  maximumRecordsValue,   fieldWidth_,   10,   QChar(  ' ' ) )
+           .arg(  progressBar.leftJustified(  progressBarSize,   QChar(  ' ' ) ) );
+          };
+
+

./core/services/date_time_generator.cpp

+ +       1  #include "date_time_generator.h"
+          
+       3  DateTimeGenerator::DateTimeGenerator(  const QPair<qint64,   qint64> &dayRange,  
+       4   const QPair<QTime,   QTime> &timeRange )
+           : dayRange_(  dayRange ),   timeRange_(  timeRange ) {
+           auto &[lowestDate,   highestDate] = dayRange_;
+           if (  lowestDate < 0 || highestDate < 0 ) {
+           qFatal(   ) << "Lowest or highest date is negative";
+           }
+          
+           if (  lowestDate > highestDate ) {
+           qCritical(   ) << "Lowest date is greater than the highest date,   values will "
+           "be swapped";
+           std::swap(  lowestDate,   highestDate );
+           }
+          
+           auto &[lowestTime,   highestTime] = timeRange_;
+           if (  !lowestTime.isValid(   ) || !highestTime.isValid(   ) ) {
+           qFatal(   ) << "Lowest or highest time is not valid";
+           }
+          
+           if (  lowestTime > highestTime ) {
+           qCritical(   ) << "Lowest time is greater than the highest time,   values will "
+           "be swapped";
+           std::swap(  lowestTime,   highestTime );
+           }
+          }
+          
+      29  QDateTime DateTimeGenerator::generate(  const QDateTime &upperBoundInclusive ) {
+           auto [lowestDate,   highestDate] = dayRange_;
+           auto [lowestTime,   highestTime] = timeRange_;
+           const QDate &maxDateValue = upperBoundInclusive.date(   );
+           const qint64 maxTimeValueMs =
+           upperBoundInclusive.time(   ).msecsSinceStartOfDay(   );
+          
+           QDate epochDate = QDateTime::fromMSecsSinceEpoch(  0 ).date(   );
+           qint64 daysFromEpochDateToMaxDateValue = epochDate.daysTo(  maxDateValue );
+           highestDate = std::min(  highestDate,   daysFromEpochDateToMaxDateValue );
+          
+           qint64 minusDeltaDays = -bounded(  lowestDate,   highestDate );
+           QDate dateSoldAt = maxDateValue.addDays(  minusDeltaDays );
+          
+           qint64 lowestTimeMs = lowestTime.msecsSinceStartOfDay(   );
+           qint64 highestTimeMs = highestTime.msecsSinceStartOfDay(   ) + 1;
+           qint64 msecsSinceStartOfDay = bounded(  lowestTimeMs,   highestTimeMs );
+          
+           if (  msecsSinceStartOfDay > maxTimeValueMs ) {
+           msecsSinceStartOfDay = maxTimeValueMs;
+           }
+          
+           QTime timeSoldAt = QTime::fromMSecsSinceStartOfDay(  msecsSinceStartOfDay );
+          
+           return {std::move(  dateSoldAt ),   std::move(  timeSoldAt )};
+          }
+          
+      56  QDateTime DateTimeGenerator::generate(  const QDateTime &lowerBoundInclusive,  
+      57   const QDateTime &upperBoundInclusive ) {
+           if (  lowerBoundInclusive > upperBoundInclusive ) {
+           qFatal(   ) << "Lower bound date is greater than the upper bound date";
+           }
+          
+           const QDate &minDateValue = lowerBoundInclusive.date(   );
+           const QTime &minTimeValue = lowerBoundInclusive.time(   );
+          
+           QDateTime unboundedLower = generate(  upperBoundInclusive );
+          
+           QDate boundedDate = unboundedLower.date(   ) <= minDateValue
+           ? minDateValue
+           : unboundedLower.date(   );
+           QTime boundedTime = unboundedLower.time(   ) <= minTimeValue
+           ? minTimeValue
+           : unboundedLower.time(   );
+          
+           return {std::move(  boundedDate ),   std::move(  boundedTime )};
+          }
+
+

./core/services/model_manager.cpp

+ +       1  #include "model_manager.h"
+          
+          #include "genres_model.h"
+          #include "halls_model.h"
+          #include "movies_model.h"
+          #include "refunds_model.h"
+          #include "schema_metadata.h"
+          #include "sessions_model.h"
+          #include "tickets_model.h"
+          
+      11  ModelManager::ModelManager(   ) {
+           // Get connection to the database
+           database_ = QSqlDatabase::database(   );
+          
+           if (  !database_.isOpen(   ) ) {
+           qDebug(   ) << "Database is not open. Cannot initialize models";
+           return;
+           }
+          
+           initialize(   );
+          }
+          
+      23  ModelManager::~ModelManager(   ) {
+           qInfo(   ) << "Models manager is being destroyed";
+          }
+          
+      27  ModelManager &ModelManager::instance(   ) {
+           static ModelManager instance;
+           return instance;
+          }
+          
+      32  QStringList ModelManager::registeredModelTableNames(   ) const {
+           return models_.keys(   );
+          }
+          
+          QStringList
+      37  ModelManager::registeredModelTableNames(  QString databaseTableName ) const {
+           QStringList registeredModelTableNames;
+           for (  const auto &modelTableName : models_.keys(   ) ) {
+           QSqlTableModel *currentModel = getModelAs<QSqlTableModel>(  modelTableName );
+           QString currentDatabaseTableName = currentModel->tableName(   );
+           if (  currentDatabaseTableName == databaseTableName ) {
+           registeredModelTableNames.append(  modelTableName );
+           }
+           }
+           return registeredModelTableNames;
+          }
+          
+      49  void ModelManager::initialize(   ) {
+           // clang-format off
+          
+           SchemaMetadata metadata = SchemaMetadata::defaultSchema(   );
+          
+           registerModel<GenresModel>(  
+           metadata.modelTableName(  "genres" ),   database_ );
+          
+           registerModel<HallsModel>(  
+           metadata.modelTableName(  "halls" ),   database_ );
+          
+           registerModel<MoviesModel>(  
+           metadata.modelTableName(  "movies" ),   database_ );
+          
+           registerModel<RefundsModel>(  
+           metadata.modelTableName(  "refunds" ),   database_ );
+          
+           registerModel<SessionsModel>(  
+           metadata.modelTableName(  "sessions" ),   database_ );
+          
+           registerModel<TicketsModel>(  
+           metadata.modelTableName(  "tickets" ),   database_ );
+          
+           // clang-format on
+          }
+          
+      75  QSqlTableModel *ModelManager::getModel(  const QString &modelTableName ) const {
+           QSqlTableModel *model = models_.value(  modelTableName,   nullptr );
+           if (  model == nullptr ) {
+           qDebug(   ) << "Model" << modelTableName << "is not registered";
+           return nullptr;
+           }
+           qDebug(   ) << "Getting model" << modelTableName << "with value" << model;
+          
+           return model;
+          }
+          
+      86  void ModelManager::resetFilter(  const QString &modelTableName ) {
+           BaseSqlTableModel *model = getModelAs<BaseSqlTableModel>(  modelTableName );
+           model->resetFilter(   );
+          }
+          
+      91  void ModelManager::setMultiColumnFilter(  const QString &modelTableName,  
+      92   const QString &filter ) {
+           BaseSqlTableModel *model = getModelAs<BaseSqlTableModel>(  modelTableName );
+           model->setMultiColumnFilter(  filter );
+          }
+
+

./core/services/refund_generator.cpp

+ +       1  #include "refund_generator.h"
+          
+          #include "create_refund_request.h"
+          #include "refunds_repository.h"
+          #include "repository_manager.h"
+          #include "repository_result.h"
+          #include "schema_metadata.h"
+          #include "session_dto.h"
+          #include "sessions_repository.h"
+          #include "ticket_dto.h"
+          #include "tickets_repository.h"
+          #include <QRandomGenerator>
+          
+      14  RefundGenerator::RefundGenerator(  const QPair<double,   double> &refundRatioRange,  
+      15   const QPair<qint64,   qint64> &dayRange,  
+      16   const QPair<QTime,   QTime> &timeRange )
+           : BaseGenerator(  "Refund" ),   DateTimeGenerator(  dayRange,   timeRange ),  
+           refundRatioRange_(  refundRatioRange ) {
+           auto &[lowest,   highest] = refundRatioRange_;
+           if (  lowest > highest ) {
+           qCritical(   ) << "Lowest refund ratio is greater than the highest refund,   "
+           "values will be swapped";
+           std::swap(  lowest,   highest );
+           }
+          
+           initializeRepositories(   ); // First
+           initializeTicketIdToCacheValueMap(   ); // After initializing
+           // repositories
+           initializeRemainingCapacity(   ); // After initializing ticketIdToCacheValue
+          }
+          
+      32  void RefundGenerator::initializeRepositories(   ) {
+           RepositoryManager &repositoryManager = RepositoryManager::instance(   );
+           SchemaMetadata metadata = SchemaMetadata::defaultSchema(   );
+          
+           ticketsRepository_ = repositoryManager.getRepositoryAs<TicketsRepository>(  
+           metadata.repositoryTableName(  "tickets" ) );
+           refundsRepository_ = repositoryManager.getRepositoryAs<RefundsRepository>(  
+           metadata.repositoryTableName(  "refunds" ) );
+           sessionsRepository_ = repositoryManager.getRepositoryAs<SessionsRepository>(  
+           metadata.repositoryTableName(  "sessions" ) );
+          
+           if (  !bool(  ticketsRepository_ && refundsRepository_ && sessionsRepository_ ) ) {
+           qFatal(   ) << "Failed to initialize repositories";
+           }
+          }
+          
+      48  void RefundGenerator::initializeTicketIdToCacheValueMap(   ) {
+           QVector<SessionDTO> sessions;
+           RepositoryResult resultGetAllSessions =
+           sessionsRepository_->getAllSessions(  sessions );
+           if (  !resultGetAllSessions.success ) {
+           qFatal(   ) << "Failed to retrieve sessions";
+           }
+          
+           QMap<qint32 /* sessionId */,  
+           QPair<QDateTime /* beginAt */,   double /* ticketPrice */>>
+           sessionIdToBeginAtAndTicketPrice;
+          
+           for (  const SessionDTO &session : sessions ) {
+           sessionIdToBeginAtAndTicketPrice[session.sessionId(   )] =
+           qMakePair(  session.beginAt(   ),   session.ticketPrice(   ) );
+           }
+          
+           QVector<TicketDTO> tickets;
+           RepositoryResult resultGetAllTickets =
+           ticketsRepository_->getAllTickets(  tickets );
+          
+           if (  !resultGetAllTickets.success ) {
+           qFatal(   ) << "Failed to retrieve tickets";
+           }
+          
+           for (  const auto &ticket : tickets ) {
+           const auto &[beginAt,   ticketPrice] =
+           sessionIdToBeginAtAndTicketPrice[ticket.sessionId(   )];
+           CacheValue cacheValue{beginAt,   ticket.soldAt(   ),   ticketPrice};
+          
+           if (  calculateDurationMs(  cacheValue ) < 2 ) {
+           continue;
+           }
+          
+           ticketIdToCacheValue_[ticket.ticketId(   )] = cacheValue;
+           }
+          }
+          
+          QString
+      87  RefundGenerator::createFailureMessage(  const QString &errorMessage ) const {
+           const QString dateTimeFormat = "yyyy-MM-dd hh:mm:ss.zzz";
+           QString additionalInfo =
+           QString(  "Additional info: Ticket id: %1 Refund amount: %2 Sold at: %3 "
+           "Refund at: %4 Begin at: %5" )
+           .arg(  reservationContext_.ticketId )
+           .arg(  reservationContext_.refundAmount )
+           .arg(  reservationContext_.soldAt.toString(  dateTimeFormat ) )
+           .arg(  reservationContext_.refundAt.toString(  dateTimeFormat ) )
+           .arg(  reservationContext_.beginAt.toString(  dateTimeFormat ) );
+           QString failureMessage = "Failure:\n\t%1\n\tError message: %2";
+           return failureMessage.arg(  additionalInfo ).arg(  errorMessage );
+          }
+          
+     101  QString RefundGenerator::createSuccessMessage(   ) const {
+           return QString(  "Success: EId: %1 RAm: %2 RAt: %3" )
+           .arg(  reservationContext_.ticketId )
+           .arg(  reservationContext_.refundAmount )
+           .arg(  reservationContext_.refundAt.toString(  "yyyy-MM-dd hh:mm:ss" ) );
+          }
+          
+     108  qsizetype RefundGenerator::calculateRemainingCapacity(   ) const {
+           return remainingCapacity_;
+          }
+          
+     112  RepositoryResult RefundGenerator::createRecord(   ) {
+           CreateRefundRequest request;
+           request.setRefundAmount(  reservationContext_.refundAmount );
+           request.setRefundAt(  reservationContext_.refundAt );
+           request.setTicketId(  reservationContext_.ticketId );
+          
+           RepositoryResult result = refundsRepository_->createRefund(  request );
+          
+           if (  result.success ) {
+           --remainingCapacity_;
+           }
+          
+           return result;
+          }
+          
+     127  bool RefundGenerator::prepareData(   ) {
+           if (  ticketIdToCacheValue_.isEmpty(   ) ) {
+           qInfo(   ) << "No tickets to refund";
+           return false;
+           }
+          
+           qsizetype ticketIdIndex = bounded<qsizetype>(  0,   ticketIdToCacheValue_.size(   ) );
+           auto ticketIdIt = ticketIdToCacheValue_.cbegin(   );
+           std::advance(  ticketIdIt,   ticketIdIndex );
+          
+           qint32 ticketId = ticketIdIt.key(   );
+           CacheValue cacheValue = ticketIdIt.value(   );
+          
+           constexpr qint32 fiveMinutesMs = 5 * 1000 * 60;
+           qint64 deltaBoundMs = calculateDurationMs(  cacheValue ) / 2;
+           if (  deltaBoundMs > fiveMinutesMs ) {
+           deltaBoundMs = fiveMinutesMs;
+           }
+          
+           const QDateTime refundAt =
+           // SoldAt < RefundAt < BeginAt
+           // SoldAt + n minute <= RefundAt <= BeginAt - n minute
+           generate(  cacheValue.soldAt.addMSecs(  +deltaBoundMs ),  
+           cacheValue.beginAt.addMSecs(  -deltaBoundMs ) );
+          
+           const auto [refundRatioLowest,   refundRatioHighest] = refundRatioRange_;
+           int lowest = refundRatioLowest * 100;
+           int highest = refundRatioHighest * 100;
+           int numerator = bounded(  lowest,   highest );
+           double refundAmount = std::floor(  numerator * cacheValue.ticketPrice ) / 100.0;
+          
+           ReservationContext context{cacheValue.beginAt,   refundAt,   cacheValue.soldAt,  
+           refundAmount,   ticketId};
+           reservationContext_ = std::move(  context );
+          
+           return true;
+          }
+          
+     165  void RefundGenerator::clearStaleData(   ) {
+           qint32 ticketId = reservationContext_.ticketId;
+           ticketIdToCacheValue_.remove(  ticketId );
+          }
+
+

./core/services/relation_id_config.cpp

+ +       1  #include "relation_id_config.h"
+          
+       3  RelationIdConfig::RelationIdConfig(  const QString &translentTableName,  
+       4   const QString &modelTableName,  
+       5   const QString &primaryIdColumnName,  
+       6   const QString &repositoryTableName ) noexcept
+           : translatedTableName_(  translentTableName ),   modelTableName_(  modelTableName ),  
+           primaryIdColumnName_(  primaryIdColumnName ),  
+           repositoryTableName_(  repositoryTableName ) {}
+
+

./core/services/repository_manager.cpp

+ +       1  #include "repository_manager.h"
+          
+          #include "genres_repository.h"
+          #include "halls_repository.h"
+          #include "movies_repository.h"
+          #include "refunds_repository.h"
+          #include "roles_repository.h"
+          #include "schema_metadata.h"
+          #include "sessions_repository.h"
+          #include "sessions_statistics_repository.h"
+          #include "tickets_repository.h"
+          #include "users_repository.h"
+          
+      14  RepositoryManager::RepositoryManager(   ) {
+           database_ = QSqlDatabase::database(   );
+           if (  !database_.isOpen(   ) ) {
+           qDebug(   ) << "Database is not open. Cannot initialize repositories";
+           return;
+           }
+          
+           initialize(   );
+          }
+          
+      24  RepositoryManager::~RepositoryManager(   ) {
+           qInfo(   ) << "Repositories manager is being destroyed";
+          }
+          
+      28  RepositoryManager &RepositoryManager::instance(   ) {
+           static RepositoryManager instance;
+           return instance;
+          }
+          
+      33  void RepositoryManager::initialize(   ) {
+           // clang-format off
+          
+           SchemaMetadata metadata = SchemaMetadata::defaultSchema(   );
+          
+           // Tables
+           registerRepository<GenresRepository>(  
+           metadata.repositoryTableName(  "genres" ) );
+          
+           registerRepository<HallsRepository>(  
+           metadata.repositoryTableName(  "halls" ) );
+          
+           registerRepository<MoviesRepository>(  
+           metadata.repositoryTableName(  "movies" ) );
+          
+           registerRepository<RefundsRepository>(  
+           metadata.repositoryTableName(  "refunds" ) );
+          
+           registerRepository<SessionsRepository>(  
+           metadata.repositoryTableName(  "sessions" ) );
+          
+           registerRepository<TicketsRepository>(  
+           metadata.repositoryTableName(  "tickets" ) );
+          
+           registerRepository<UsersRepository>(  
+           metadata.repositoryTableName(  "users" ) );
+          
+           registerRepository<RolesRepository>(  
+           metadata.repositoryTableName(  "roles" ) );
+          
+           // Views
+           registerRepository<SessionsStatisticsRepository>(  
+           metadata.repositoryTableName(  "sessions_statistics" ) );
+          
+           // clang-format on
+          }
+          
+          RepositoryInterface *
+      71  RepositoryManager::getRepository(  const QString &repositoryTableName ) const {
+           RepositoryInterface *repository =
+           repositories_.value(  repositoryTableName,   nullptr );
+          
+           if (  repository == nullptr ) {
+           qDebug(   ) << "Repository" << repositoryTableName << "is not registered";
+           return nullptr;
+           }
+           qDebug(   ) << "Getting model" << repositoryTableName << "with value"
+           << repository;
+          
+           return repository;
+          }
+
+

./core/services/schema_metadata.cpp

+ +       1  #include "schema_metadata.h"
+          
+          #include <QDebug>
+          
+          QMap<QString,   RelationIdConfig> SchemaMetadata::databaseTableNameToConfigMap_;
+          std::once_flag SchemaMetadata::initFlag;
+          
+       8  void SchemaMetadata::initialize(   ) {
+           qInfo(   ) << "Initializing schema metadata...";
+          
+           RelationIdConfig genreConfig;
+           genreConfig.setPrimaryIdColumnName(  "genre_id" );
+           genreConfig.setTranslatedTableName(  tr(  "Genres" ) );
+           genreConfig.setModelTableName(  "GenresModel" );
+           genreConfig.setRepositoryTableName(  "GenresRepository" );
+           databaseTableNameToConfigMap_.insert(  "genres",   genreConfig );
+          
+           RelationIdConfig hallConfig;
+           hallConfig.setPrimaryIdColumnName(  "hall_id" );
+           hallConfig.setTranslatedTableName(  tr(  "Halls" ) );
+           hallConfig.setModelTableName(  "HallsModel" );
+           hallConfig.setRepositoryTableName(  "HallsRepository" );
+           databaseTableNameToConfigMap_.insert(  "halls",   hallConfig );
+          
+           RelationIdConfig movieConfig;
+           movieConfig.setPrimaryIdColumnName(  "movie_id" );
+           movieConfig.setTranslatedTableName(  tr(  "Movies" ) );
+           movieConfig.setModelTableName(  "MoviesModel" );
+           movieConfig.setRepositoryTableName(  "MoviesRepository" );
+           databaseTableNameToConfigMap_.insert(  "movies",   movieConfig );
+          
+           RelationIdConfig refundConfig;
+           refundConfig.setPrimaryIdColumnName(  "refund_id" );
+           refundConfig.setTranslatedTableName(  tr(  "Refunds" ) );
+           refundConfig.setModelTableName(  "RefundsModel" );
+           refundConfig.setRepositoryTableName(  "RefundsRepository" );
+           databaseTableNameToConfigMap_.insert(  "refunds",   refundConfig );
+          
+           RelationIdConfig sessionConfig;
+           sessionConfig.setPrimaryIdColumnName(  "session_id" );
+           sessionConfig.setTranslatedTableName(  tr(  "Sessions" ) );
+           sessionConfig.setModelTableName(  "SessionsModel" );
+           sessionConfig.setRepositoryTableName(  "SessionsRepository" );
+           databaseTableNameToConfigMap_.insert(  "sessions",   sessionConfig );
+          
+           RelationIdConfig ticketConfig;
+           ticketConfig.setPrimaryIdColumnName(  "ticket_id" );
+           ticketConfig.setTranslatedTableName(  tr(  "Tickets" ) );
+           ticketConfig.setModelTableName(  "TicketsModel" );
+           ticketConfig.setRepositoryTableName(  "TicketsRepository" );
+           databaseTableNameToConfigMap_.insert(  "tickets",   ticketConfig );
+          
+           RelationIdConfig userConfig;
+           userConfig.setPrimaryIdColumnName(  "user_id" );
+           userConfig.setTranslatedTableName(  tr(  "Users" ) );
+           userConfig.setRepositoryTableName(  "UsersRepository" );
+           databaseTableNameToConfigMap_.insert(  "users",   userConfig );
+          
+           RelationIdConfig roleConfig;
+           roleConfig.setPrimaryIdColumnName(  "role_id" );
+           roleConfig.setTranslatedTableName(  tr(  "Roles" ) );
+           roleConfig.setRepositoryTableName(  "RolesRepository" );
+           databaseTableNameToConfigMap_.insert(  "roles",   roleConfig );
+          
+           RelationIdConfig tableInfoConfig;
+           tableInfoConfig.setTranslatedTableName(  tr(  "Sessions statistics" ) );
+           tableInfoConfig.setRepositoryTableName(  "SessionsStatisticsRepository" );
+           databaseTableNameToConfigMap_.insert(  "sessions_statistics",   tableInfoConfig );
+          
+           qInfo(   ) << "Schema metadata initialized successfully";
+          }
+          
+      73  SchemaMetadata::SchemaMetadata(   ) noexcept {
+           std::call_once(  initFlag,   &SchemaMetadata::initialize );
+          }
+          
+      77  SchemaMetadata::SchemaMetadata(  const SchemaMetadata & ) {}
+          
+      79  SchemaMetadata &SchemaMetadata::operator=(  const SchemaMetadata & ) {
+           return *this;
+          }
+          
+      83  SchemaMetadata SchemaMetadata::defaultSchema(   ) { return SchemaMetadata(   ); }
+          
+      85  QString SchemaMetadata::modelTableName(  const QString &databaseTableName ) {
+           QString modelTableName = relationIdConfig(  databaseTableName ).modelTableName(   );
+          
+           if (  modelTableName.isEmpty(   ) ) {
+           qFatal(   ) << "Model table name is empty: Database table name:"
+           << databaseTableName;
+           }
+          
+           return modelTableName;
+          }
+          
+      96  QString SchemaMetadata::primaryIdColumnName(  const QString &databaseTableName ) {
+           QString primaryIdColumnName =
+           relationIdConfig(  databaseTableName ).primaryIdColumnName(   );
+          
+           if (  primaryIdColumnName.isEmpty(   ) ) {
+           qFatal(   ) << "Primary id column name is empty: Database table name:"
+           << databaseTableName;
+           }
+          
+           return primaryIdColumnName;
+          }
+          
+     108  QString SchemaMetadata::repositoryTableName(  const QString &databaseTableName ) {
+           QString repositoryTableName =
+           relationIdConfig(  databaseTableName ).repositoryTableName(   );
+          
+           if (  repositoryTableName.isEmpty(   ) ) {
+           qFatal(   ) << "Repository table name is empty: Database table name:"
+           << databaseTableName;
+           }
+          
+           return repositoryTableName;
+          }
+          
+     120  QString SchemaMetadata::translatedTableName(  const QString &databaseTableName ) {
+           QString translatedTableName =
+           relationIdConfig(  databaseTableName ).translatedTableName(   );
+          
+           if (  translatedTableName.isEmpty(   ) ) {
+           qFatal(   ) << "Translated table name is empty: Database table name:"
+           << databaseTableName;
+           }
+          
+           return translatedTableName;
+          }
+          
+          RelationIdConfig
+     133  SchemaMetadata::relationIdConfig(  const QString &databaseTableName ) {
+           RelationIdConfig config =
+           databaseTableNameToConfigMap_.value(  databaseTableName );
+           return config;
+          }
+
+

./core/services/session_generator.cpp

+ +       1  #include "session_generator.h"
+          
+          #include "create_session_request.h"
+          #include "hall_dto.h"
+          #include "halls_repository.h"
+          #include "movie_dto.h"
+          #include "movies_repository.h"
+          #include "repository_manager.h"
+          #include "repository_result.h"
+          #include "schema_metadata.h"
+          #include "sessions_repository.h"
+          
+      13  SessionGenerator::SessionGenerator(  
+      14   const ReservationManager &reservationReference )
+           : BaseGenerator(  "Session" ),   reservationReference_(  reservationReference ) {
+           initializeRepositories(   ); // First
+          
+           qint32 extraTime = 45; // Extra time for cleaning the room
+           initializeMovieIdToDurationMap(  extraTime ); // After initializing repositories
+          
+           initializeBounds(   ); // After initializing movieIdToDuration
+           initializeDayManager(   ); // After initializing bounds
+           initializeHallIdToReservationManagerMap(   ); // After initializing dayManager
+          }
+          
+      26  void SessionGenerator::initializeRepositories(   ) {
+           RepositoryManager &repositoryManager = RepositoryManager::instance(   );
+           SchemaMetadata metadata = SchemaMetadata::defaultSchema(   );
+          
+           moviesRepository_ = repositoryManager.getRepositoryAs<MoviesRepository>(  
+           metadata.repositoryTableName(  "movies" ) );
+           hallsRepository_ = repositoryManager.getRepositoryAs<HallsRepository>(  
+           metadata.repositoryTableName(  "halls" ) );
+           sessionsRepository_ = repositoryManager.getRepositoryAs<SessionsRepository>(  
+           metadata.repositoryTableName(  "sessions" ) );
+          
+           if (  !bool(  moviesRepository_ && hallsRepository_ && sessionsRepository_ ) ) {
+           qFatal(   ) << "Failed to initialize repositories";
+           }
+          }
+          
+      42  void SessionGenerator::initializeMovieIdToDurationMap(  
+      43   qint32 additionalMinutes ) {
+           QVector<MovieDTO> movies;
+           RepositoryResult result = moviesRepository_->getAllMovies(  movies );
+          
+           if (  !result.success ) {
+           qFatal(   ) << "Failed to retrieve movies";
+           }
+          
+           for (  const MovieDTO &movie : movies ) {
+           movieIdToDurationMinutes_[movie.movieId(   )] =
+           movie.duration(   ) + additionalMinutes;
+           }
+          
+           if (  movieIdToDurationMinutes_.isEmpty(   ) ) {
+           qFatal(   ) << "Failed to initialize movieIdToDuration";
+           }
+          
+           qInfo(   ) << "Number of movies:" << movieIdToDurationMinutes_.size(   );
+          }
+          
+      63  void SessionGenerator::initializeBounds(   ) {
+           qint32 lowerBoundReservationMin = *std::min_element(  
+           movieIdToDurationMinutes_.cbegin(   ),   movieIdToDurationMinutes_.cend(   ) );
+           lowerBoundReservationMs_ = lowerBoundReservationMin * 60'000; // 60 * 1000
+          
+           qint32 upperBoundReservationMin = *std::max_element(  
+           movieIdToDurationMinutes_.cbegin(   ),   movieIdToDurationMinutes_.cend(   ) );
+           upperBoundReservationMs_ = upperBoundReservationMin * 60'000; // 60 * 1000
+          
+      72   qInfo(   ) << "Lower bound reservation in Ms:" << lowerBoundReservationMs_;
+           qInfo(   ) << "Upper bound reservation in Ms:" << upperBoundReservationMs_;
+          }
+          
+          void SessionGenerator::initializeDayManager(   ) {
+           QTime minDuration = QTime::fromMSecsSinceStartOfDay(  lowerBoundReservationMs_ );
+           DayManager dayManager(  reservationReference_.reference(   ) );
+           dayManager.setMinDuration(  minDuration );
+           reservationReference_.setReference(  dayManager );
+          
+           if (  !reservationReference_.reference(   ).minDuration(   ).isValid(   ) ) {
+           qFatal(   ) << "Failed to initialize dayManager";
+           }
+          
+           qInfo(   ) << "Day manager: Min duration:"
+           << reservationReference_.reference(   ).minDuration(   );
+      88   qInfo(   ) << "Day manager: Slot count:"
+           << reservationReference_.reference(   ).slotCount(   );
+          }
+          
+          void SessionGenerator::initializeHallIdToReservationManagerMap(   ) {
+           QVector<HallDTO> halls;
+           RepositoryResult result = hallsRepository_->getAllHalls(  halls );
+          
+           if (  !result.success ) {
+           qFatal(   ) << "Failed to retrieve halls";
+           }
+          
+           for (  const HallDTO &hall : halls ) {
+           hallIdToReservationManager_[hall.hallId(   )] = reservationReference_;
+           }
+          
+           if (  hallIdToReservationManager_.isEmpty(   ) ) {
+           qFatal(   ) << "Failed to initialize hallIdToReservationManager";
+           }
+     107  
+           qInfo(   ) << "Number of halls:" << hallIdToReservationManager_.size(   );
+          }
+          
+          RepositoryResult SessionGenerator::createRecord(   ) {
+           CreateSessionRequest request;
+           request.setBeginAt(  reservationContext_.beginAt );
+           request.setHallId(  reservationContext_.hallId );
+           request.setMovieId(  reservationContext_.movieId );
+           request.setTicketPrice(  reservationContext_.ticketPrice );
+          
+           RepositoryResult result = sessionsRepository_->createSession(  request );
+          
+     120   return result;
+          }
+          
+          QString
+          SessionGenerator::createFailureMessage(  const QString &errorMessage ) const {
+           QString additionalInfo =
+           QString(  "Additional info: Hall id: %1 Begin at: %2" )
+           .arg(  reservationContext_.hallId )
+           .arg(  reservationContext_.beginAt.toString(  "yyyy-MM-dd hh:mm:ss" ) );
+     129   QString failureMessage = "Failure:\n\t%1\n\tError message: %2";
+           return failureMessage.arg(  additionalInfo ).arg(  errorMessage );
+          }
+          
+          QString SessionGenerator::createSuccessMessage(   ) const {
+           qint32 hallId = reservationContext_.hallId;
+           const ReservationManager &manager = hallIdToReservationManager_.value(  hallId );
+           QTime duration = calculateDuration(  reservationContext_ );
+          
+           // return QString(  "Success: TAD: %1 TAS: %2 EId: %3 AD: %4 AS: %5 CR: %6 B: %7
+           // D: %8" )
+           return QString(  "Success: TAD: %1 TAS: %2 EId: %3 AD: %4 AS: %5 CR: %6" )
+           .arg(  calculateAvailableDaysCount(   ) ) // Total available days
+           .arg(  calculateAvailableSlotsCount(   ) ) // Total available slots
+           .arg(  hallId ) // Entity id
+           .arg(  manager.calculateAvailableDaysCount(   ) ) // Available days for the
+           // current hall
+           .arg(  manager.calculateAvailableSlotsCount(   ) ) // Available slots for the
+           // current hall
+           .arg(  manager.createdRecords(   ) ); // Created records for the
+           // current hall
+           // .arg(  reservationContext_.beginAt.toString(   //
+           // "yyyy-MM-dd hh:mm:ss" ) ) // Begin
+     152   // // of created record
+           // .arg(  duration.toString(  "hh:mm:ss" ) ); // Duration of created record
+          }
+          
+          qsizetype SessionGenerator::calculateRemainingCapacity(   ) const {
+           // Maximum number of sessions that can be created
+           return std::accumulate(  hallIdToReservationManager_.cbegin(   ),  
+           hallIdToReservationManager_.cend(   ),   0,  
+           [&](  qsizetype sum,   const ReservationManager &manager ) {
+           return sum + manager.calculatePossibleReservations(  
+     162   lowerBoundReservationMs_ );
+           } );
+          };
+          
+          bool SessionGenerator::prepareData(   ) {
+           std::random_device rd;
+           std::mt19937 g{rd(   )};
+          
+           QList<qint32> hallIds = hallIdToReservationManager_.keys(   );
+           std::shuffle(  hallIds.begin(   ),   hallIds.end(   ),   g );
+           QList<qint32> movieIds = movieIdToDurationMinutes_.keys(   );
+           std::shuffle(  movieIds.begin(   ),   movieIds.end(   ),   g );
+          
+           for (  qint32 hallId : hallIds ) {
+           if (  prepareData(  hallId,   movieIds ) ) {
+           return true;
+           }
+           }
+           qWarning(   ) << "No available halls";
+     181  
+     182   return false;
+          }
+          
+          bool SessionGenerator::prepareData(  qint32 hallId,  
+           const QList<qint32> &movieIds ) {
+           for (  qint32 movieId : movieIds ) {
+           ReservationManager &manager = hallIdToReservationManager_[hallId];
+          
+           auto [beginDateTime,   endTime] = manager.reserve(  duration(  movieId ) );
+           if (  !beginDateTime.isValid(   ) || !endTime.isValid(   ) ) {
+           continue;
+           }
+          
+           const QDate epochDate = QDateTime::fromMSecsSinceEpoch(  0 ).date(   );
+           const qint64 deltaDays = epochDate.daysTo(  QDate(  2025,   1,   1 ) );
+           const QDate newBeginDate = beginDateTime.date(   ).addDays(  deltaDays );
+           const QTime beginTime = beginDateTime.time(   );
+          
+           reservationContext_ = ReservationContext{
+           QDateTime(  std::move(  newBeginDate ),   std::move(  beginTime ) ),  
+           std::move(  endTime ),  
+           bounded(  10'000,   50'000 ) / 100.0,  
+           hallId,  
+           movieId,  
+           };
+          
+           return true;
+           }
+          
+           qCritical(   )
+           << "SessionGenerator::prepareData: No available movies for hall with id"
+           << hallId;
+     214  
+           return false;
+          }
+          
+          QTime SessionGenerator::duration(  qint32 movieId ) const {
+           qint32 durationMin = movieIdToDurationMinutes_[movieId];
+           qint64 durationMs = durationMin * 60'000; // 60 * 1000
+           QTime durationTime = QTime::fromMSecsSinceStartOfDay(  durationMs );
+           return durationTime;
+          }
+          
+          qsizetype SessionGenerator::calculateAvailableDaysCount(   ) const {
+           return std::accumulate(  hallIdToReservationManager_.cbegin(   ),  
+           hallIdToReservationManager_.cend(   ),   0,  
+           [&](  int sum,   const ReservationManager &manager ) {
+           return sum + manager.calculateAvailableDaysCount(   );
+           } );
+          }
+          
+          qsizetype SessionGenerator::calculateAvailableSlotsCount(   ) const {
+           return std::accumulate(  hallIdToReservationManager_.cbegin(   ),  
+           hallIdToReservationManager_.cend(   ),   0,  
+           [&](  int sum,   const ReservationManager &manager ) {
+           return sum + manager.calculateAvailableSlotsCount(   );
+           } );
+          }
+          
+          QTime SessionGenerator::calculateDuration(  ReservationContext context ) const {
+           QTime beginTime = context.beginAt.time(   );
+           QTime endTime = context.endTime;
+           qint64 durationMs = beginTime.msecsTo(  endTime );
+           return QTime::fromMSecsSinceStartOfDay(  durationMs );
+          }
+          
+          void SessionGenerator::clearStaleData(   ) {
+           qint64 hallId = reservationContext_.hallId;
+           if (  hallIdToReservationManager_[hallId].calculateAvailableDaysCount(   ) == 0 ) {
+           qWarning(   ) << "No available days for hall" << hallId;
+           hallIdToReservationManager_.remove(  hallId );
+           }
+          }
+
+

./core/services/ticket_generator.cpp

+ +       1  #include "ticket_generator.h"
+          
+          #include "create_ticket_request.h"
+          #include "hall_dto.h"
+          #include "halls_repository.h"
+          #include "repository_manager.h"
+          #include "repository_result.h"
+          #include "schema_metadata.h"
+          #include "session_dto.h"
+          #include "sessions_repository.h"
+          #include "tickets_repository.h"
+          #include <QDebug>
+          #include <QStack>
+          #include <numeric>
+          
+          #include "repository_result.h"
+          
+          std::random_device TicketGenerator::rd_;
+      19  std::mt19937 TicketGenerator::generator_(  rd_(   ) );
+          
+      21  TicketGenerator::TicketGenerator(  
+      22   const QPair<qint32,   qint32> &dayRange,   const QPair<QTime,   QTime> &timeRange,  
+      23   const QPair<double,   double> &fillRatioPerSessionRange )
+           : BaseGenerator(  "Ticket" ),   DateTimeGenerator(  dayRange,   timeRange ) {
+           if (  !setFillRatioPerSessionRange(  fillRatioPerSessionRange ) ) {
+           qFatal(   ) << "Failed to set fill ratio per session range";
+           }
+          
+           initializeRepositories(   );
+           initializeSessionIdToAvailableSeatMap(   ); // After initializing repositories
+           initializeSessionIdToBeginAtMap(   ); // After initializing repositories
+           initializeRemainingCapacity(   ); // After initializing sessionToAvailableSeats
+          
+           qInfo(   ) << "Number of sessions:" << sessionIdToAvailableSeatNumbers_.size(   );
+          }
+          
+      37  void TicketGenerator::initializeRepositories(   ) {
+           RepositoryManager &repositoryManager = RepositoryManager::instance(   );
+           SchemaMetadata metadata = SchemaMetadata::defaultSchema(   );
+          
+           hallsRepository_ = repositoryManager.getRepositoryAs<HallsRepository>(  
+           metadata.repositoryTableName(  "halls" ) );
+           sessionsRepository_ = repositoryManager.getRepositoryAs<SessionsRepository>(  
+           metadata.repositoryTableName(  "sessions" ) );
+           ticketsRepository_ = repositoryManager.getRepositoryAs<TicketsRepository>(  
+           metadata.repositoryTableName(  "tickets" ) );
+          
+           if (  !bool(  ticketsRepository_ && sessionsRepository_ ) ) {
+           qFatal(   ) << "Failed to initialize repositories";
+           }
+          }
+          
+      53  void TicketGenerator::initializeSessionIdToAvailableSeatMap(   ) {
+           QVector<HallDTO> halls;
+           RepositoryResult resultGetAllHalls = hallsRepository_->getAllHalls(  halls );
+           if (  !resultGetAllHalls.success ) {
+           qFatal(   ) << "Failed to retrieve halls";
+           }
+          
+           QVector<SessionDTO> sessions;
+           RepositoryResult resultGetAllSessions =
+           sessionsRepository_->getAllSessions(  sessions );
+           if (  !resultGetAllSessions.success ) {
+           qFatal(   ) << "Failed to retrieve sessions";
+           }
+          
+           QMap<qint32 /* sessionId */,   QSet<qint32> /* availableSeatNumbers */>
+           hallIdToAvailableSeatNumbers;
+          
+           for (  const HallDTO &hall : halls ) {
+           qint32 targetCapacity =
+           std::ceil(  hall.capacity(   ) * generateFillRatioPerSession(   ) );
+          
+           QVector<qint32> availableSeats(  targetCapacity );
+           std::iota(  availableSeats.begin(   ),   availableSeats.end(   ),   1 );
+           std::shuffle(  availableSeats.begin(   ),   availableSeats.end(   ),   generator_ );
+          
+           QSet<qint32> buffer;
+           for (  qint32 i = 0; i < targetCapacity; ++i ) {
+           buffer.insert(  availableSeats[i] );
+           }
+          
+           hallIdToAvailableSeatNumbers[hall.hallId(   )] = std::move(  buffer );
+           }
+          
+           for (  const SessionDTO &session : sessions ) {
+           sessionIdToAvailableSeatNumbers_[session.sessionId(   )] =
+           hallIdToAvailableSeatNumbers[session.hallId(   )];
+           }
+          }
+          
+      92  void TicketGenerator::initializeSessionIdToBeginAtMap(   ) {
+           QVector<SessionDTO> sessions;
+           RepositoryResult resultGetAllSessions =
+           sessionsRepository_->getAllSessions(  sessions );
+           if (  !resultGetAllSessions.success ) {
+           qFatal(   ) << "Failed to retrieve sessions";
+           }
+          
+           for (  const SessionDTO &session : sessions ) {
+           sessionIdToBeginAt_[session.sessionId(   )] = session.beginAt(   );
+           }
+          }
+          
+     105  bool TicketGenerator::setFillRatioPerSessionRange(  
+     106   const QPair<double,   double> &range ) {
+           const auto &[minValue,   maxValue] = range;
+           if (  minValue > maxValue ) {
+           return false;
+           }
+          
+           auto &[minFillRatioPerSession,   maxFillRatioPerSession] =
+           fillRatioPerSessionRange_;
+           minFillRatioPerSession = std::max(  minValue,   0.0 );
+           maxFillRatioPerSession = std::min(  maxValue,   1.0 );
+          
+           return true;
+          }
+          
+     120  double TicketGenerator::generateFillRatioPerSession(   ) const {
+           const auto &[min,   max] = fillRatioPerSessionRange_;
+           std::uniform_real_distribution<double> distribution(  min,   max );
+           return distribution(  generator_ );
+          }
+          
+     126  void TicketGenerator::initializeRemainingCapacity(   ) {
+           remainingCapacity_ =
+           std::accumulate(  sessionIdToAvailableSeatNumbers_.cbegin(   ),  
+           sessionIdToAvailableSeatNumbers_.cend(   ),   0,  
+           [&](  qsizetype sum,   const QSet<qint32> &availableSeats ) {
+           return sum + availableSeats.size(   );
+           } );
+          }
+          
+          QString
+     136  TicketGenerator::createFailureMessage(  const QString &errorMessage ) const {
+           QString additionalInfo =
+           QString(  "Additional info: Session id: %1 Seat number: %2 Sold at: %3 "
+           "Begin at: %4" )
+           .arg(  reservationContext_.sessionId )
+           .arg(  reservationContext_.seatNumber )
+           .arg(  reservationContext_.soldAt.toString(  "yyyy-MM-dd hh:mm:ss" ) )
+           .arg(  reservationContext_.beginAt.toString(  "yyyy-MM-dd hh:mm:ss" ) );
+           QString failureMessage = "Failure:\n\t%1\n\tError message: %2";
+           return failureMessage.arg(  additionalInfo ).arg(  errorMessage );
+          }
+          
+     148  QString TicketGenerator::createSuccessMessage(   ) const {
+           return QString(  "Success: EId: %1 SN: %2" )
+           .arg(  reservationContext_.sessionId )
+           .arg(  reservationContext_.seatNumber );
+          }
+          
+     154  qsizetype TicketGenerator::calculateRemainingCapacity(   ) const {
+           return remainingCapacity_;
+          }
+          
+     158  RepositoryResult TicketGenerator::createRecord(   ) {
+           CreateTicketRequest request;
+           request.setSessionId(  reservationContext_.sessionId );
+           request.setSeatNumber(  reservationContext_.seatNumber );
+           request.setSoldAt(  reservationContext_.soldAt );
+          
+           RepositoryResult result = ticketsRepository_->createTicket(  request );
+          
+           if (  result.success ) {
+           --remainingCapacity_;
+           }
+          
+           return result;
+          }
+          
+     173  bool TicketGenerator::prepareData(   ) {
+           if (  remainingCapacity_ <= 0 ) {
+           qInfo(   ) << "All tickets have been sold";
+           return false;
+           }
+          
+           qsizetype deltaIndex =
+           bounded<qsizetype>(  0,   sessionIdToAvailableSeatNumbers_.size(   ) );
+           auto it = sessionIdToAvailableSeatNumbers_.begin(   );
+           std::advance(  it,   deltaIndex );
+          
+           const qint32 sessionId = it.key(   );
+           QSet<qint32> &availableSeatNumbers = it.value(   ); // Not empty
+          
+           const QDateTime &beginAt = sessionIdToBeginAt_[sessionId];
+           constexpr qint32 minus20MinutesMs = -20 * 1000 * 60;
+           // soldAt < beginAt || soldAt + 20 minute <= beginAt
+           QDateTime soldAt = generate(  beginAt.addMSecs(  minus20MinutesMs ) );
+          
+           qsizetype seatNumberIndex =
+           bounded<qsizetype>(  0,   availableSeatNumbers.size(   ) );
+           auto seatNumberIt = availableSeatNumbers.cbegin(   );
+           std::advance(  seatNumberIt,   seatNumberIndex );
+          
+           qint32 seatNumber = *seatNumberIt;
+          
+           ReservationContext context{beginAt,   soldAt,   seatNumber,   sessionId};
+           reservationContext_ = std::move(  context );
+          
+           return true;
+          }
+          
+     205  void TicketGenerator::clearStaleData(   ) {
+          
+           qint32 sessionId = reservationContext_.sessionId;
+           qint32 seatNumber = reservationContext_.seatNumber;
+           QSet<qint32> &availableSeatNumbers =
+           sessionIdToAvailableSeatNumbers_[sessionId];
+          
+           availableSeatNumbers.remove(  seatNumber );
+           if (  availableSeatNumbers.empty(   ) ) {
+           qWarning(   ) << "All tickets for session with id" << sessionId
+           << "have been sold";
+           sessionIdToAvailableSeatNumbers_.remove(  sessionId );
+           sessionIdToBeginAt_.remove(  sessionId );
+           }
+          }
+
+

./core/utils/day_manager.cpp

+ +       1  #include "day_manager.h"
+          
+          #include <QRandomGenerator>
+          #include <algorithm>
+          
+       6  DayManager::DayManager(  const QTime &begin,   const QTime &end ) : DayManager(   ) {
+           addAvailableSlot(  begin,   end );
+          }
+          
+      10  void DayManager::addAvailableSlot(  const QTime &begin,   const QTime &end ) {
+           if (  !begin.isValid(   ) || !end.isValid(   ) || begin >= end ) {
+           qWarning(   ) << "DayManager::addAvailableSlot: begin or end is invalid";
+           return;
+           }
+           if (  begin.msecsTo(  end ) >= minDurationMs_ ) {
+           availableSlots_.insert(  begin,   end );
+           }
+          }
+          
+      20  QPair<QTime,   QTime> DayManager::reserve(  const QTime &duration ) {
+           if (  !duration.isValid(   ) ) {
+           qWarning(   ) << "DayManager::reserve: duration is invalid";
+           return {};
+           }
+          
+           const qint64 requiredMs = duration.msecsSinceStartOfDay(   );
+           if (  requiredMs <= 0 ) {
+           qWarning(   ) << "DayManager::reserve: duration is invalid";
+           return {};
+           }
+          
+           QPair<QTime,   QTime> result = reserveImpl(  requiredMs );
+           if (  !isAvailable(  result.first,   result.second ) ) {
+           return {};
+           }
+          
+           ++createdRecords_;
+           return result;
+          }
+          
+          template <typename... Times>
+      42  bool DayManager::isAvailable(  const QTime &first,   const Times &...others ) const {
+           static const auto isAvailable = [](  const QTime &time ) {
+           return time.isValid(   );
+           };
+           return isAvailable(  first ) && isAvailable(  others... );
+          }
+          
+      49  QList<std::reference_wrapper<const QTime>>
+          DayManager::availableSlots(  qint64 requiredMs ) const {
+           QList<std::reference_wrapper<const QTime>> result;
+           for (  auto const &[begin,   end] : availableSlots_.asKeyValueRange(   ) ) {
+           if (  begin.msecsTo(  end ) >= requiredMs ) {
+           result.append(  begin );
+           }
+           }
+           return result;
+          }
+          
+      60  QPair<QTime,   QTime> DayManager::reserveAvailableSlotLeft(  QTime begin,  
+      61   qint64 requiredMs ) {
+           QTime end = availableSlots_.value(  begin );
+          
+           QTime reservedEnd = begin.addMSecs(  requiredMs );
+           if (  reservedEnd < end ) {
+           addAvailableSlot(  reservedEnd,   end );
+           }
+           availableSlots_.remove(  begin );
+          
+           return {begin,   reservedEnd};
+          }
+          
+      73  QPair<QTime,   QTime> DayManager::reserveAvailableSlotRight(  QTime begin,  
+      74   qint64 requiredMs ) {
+           QTime end = availableSlots_.value(  begin );
+           availableSlots_.remove(  begin );
+          
+           QTime reservedBegin = end.addMSecs(  -requiredMs );
+           if (  reservedBegin > begin ) {
+           addAvailableSlot(  begin,   reservedBegin );
+           }
+          
+           return {reservedBegin,   end};
+          }
+          
+      86  QPair<QTime,   QTime> DayManager::reserveAvailableSlotRandom(  QTime begin,  
+      87   qint64 requiredMs ) {
+           QTime end = availableSlots_.value(  begin );
+           if (  !end.isValid(   ) ) {
+           qCritical(   ) << "DayManager::reserveAvailableSlotRandom: end is invalid";
+           }
+          
+           qint64 beginMs = begin.msecsSinceStartOfDay(   );
+           qint64 endMs = end.msecsSinceStartOfDay(   );
+          
+           // x <= bounded(  x,   y ) < y
+           qint64 highestMs = endMs - requiredMs;
+           qint64 startTimeMs =
+           QRandomGenerator::global(   )->bounded(  beginMs,   highestMs + 1 );
+          
+           if (  startTimeMs == beginMs ) {
+           return reserveAvailableSlotLeft(  begin,   requiredMs );
+           }
+           if (  startTimeMs == highestMs ) {
+           return reserveAvailableSlotRight(  begin,   requiredMs );
+           }
+          
+           availableSlots_.remove(  begin );
+          
+           QTime reservedBegin = QTime::fromMSecsSinceStartOfDay(  startTimeMs );
+           QTime reservedEnd = QTime::fromMSecsSinceStartOfDay(  startTimeMs + requiredMs );
+          
+           addAvailableSlot(  begin,   reservedBegin );
+           addAvailableSlot(  reservedEnd,   end );
+          
+           return {reservedBegin,   reservedEnd};
+          }
+          
+     119  QPair<QTime,   QTime> DayManager::reserveAvailableSlot(  QTime begin,  
+     120   qint64 requiredMs ) {
+           switch (  startTimeMode_ ) {
+           case StartTimeMode::Left:
+           return reserveAvailableSlotLeft(  begin,   requiredMs );
+           case StartTimeMode::Random:
+           return reserveAvailableSlotRandom(  begin,   requiredMs );
+           case StartTimeMode::Right:
+           return reserveAvailableSlotRight(  begin,   requiredMs );
+           default:
+           qWarning(   ) << "DayManager::reserve: unknown start time mode";
+           return {};
+           }
+          }
+          
+     134  QPair<QTime,   QTime> DayManager::reserveImplMaximal(  qint64 requiredMs ) {
+           auto keys = availableSlots(  requiredMs );
+           if (  keys.isEmpty(   ) ) {
+           return {};
+           }
+          
+           QTime begin = *std::max_element(  
+           keys.begin(   ),   keys.end(   ),   [this](  const auto &largest,   const auto &other ) {
+           return duration(  largest ) < duration(  other );
+           } );
+           return reserveAvailableSlot(  begin,   requiredMs );
+          }
+          
+     147  QPair<QTime,   QTime> DayManager::reserveImplMinimal(  qint64 requiredMs ) {
+           auto keys = availableSlots(  requiredMs );
+           if (  keys.isEmpty(   ) ) {
+           return {};
+           }
+          
+           QTime begin =
+           *std::min_element(  keys.begin(   ),   keys.end(   ),  
+           [this](  const QTime &smallest,   const QTime &other ) {
+           return duration(  smallest ) < duration(  other );
+           } );
+           return reserveAvailableSlot(  begin,   requiredMs );
+          }
+          
+     161  QPair<QTime,   QTime> DayManager::reserveImplQuick(  qint64 requiredMs ) {
+           for (  auto const &[begin,   end] : availableSlots_.asKeyValueRange(   ) ) {
+           if (  begin.msecsTo(  end ) >= requiredMs ) {
+           return reserveAvailableSlot(  begin,   requiredMs );
+           }
+           }
+          
+           return {};
+          }
+          
+     171  QPair<QTime,   QTime> DayManager::reserveImplRandom(  qint64 requiredMs ) {
+           auto keys = availableSlots(  requiredMs );
+           if (  keys.isEmpty(   ) ) {
+           return {};
+           }
+          
+           QRandomGenerator *g = QRandomGenerator::global(   );
+           QTime begin = keys.at(  g->bounded(  keys.size(   ) ) );
+           return reserveAvailableSlot(  begin,   requiredMs );
+          }
+          
+     182  QPair<QTime,   QTime> DayManager::reserveImpl(  qint64 requiredMs ) {
+           switch (  slotSelectionMode_ ) {
+           case SlotSelectionMode::Quick:
+           return DayManager::reserveImplQuick(  requiredMs );
+           case SlotSelectionMode::Maximal:
+           return DayManager::reserveImplMaximal(  requiredMs );
+           case SlotSelectionMode::Minimal:
+           return DayManager::reserveImplMinimal(  requiredMs );
+           case SlotSelectionMode::Random:
+           return DayManager::reserveImplRandom(  requiredMs );
+           default:
+           qWarning(   ) << "DayManager::reserve: unknown reserve mode";
+           return {};
+           }
+          }
+          
+     198  void DayManager::setMinDuration(  const QTime &duration ) {
+           if (  !duration.isValid(   ) ) {
+           qWarning(   ) << "DayManager::setMinDuration: duration is invalid";
+           return;
+           }
+          
+           minDurationMs_ = duration.msecsSinceStartOfDay(   );
+          }
+          
+     207  qsizetype DayManager::calculatePossibleReservations(  qint64 requiredMs ) const {
+           auto keys = availableSlots(  requiredMs );
+           return std::accumulate(  keys.begin(   ),   keys.end(   ),   0,  
+           [this,   requiredMs](  qsizetype sum,   const QTime &key ) {
+           qint64 durationMs =
+           duration(  key ).msecsSinceStartOfDay(   );
+           return sum + std::floor(  durationMs / requiredMs );
+           } );
+          }
+          
+     217  QTime DayManager::duration(   ) const {
+           if (  availableSlots_.isEmpty(   ) ) {
+           // qWarning(   ) << "DayManager::duration: no available slots";
+           return {};
+           }
+          
+           const auto &kvRange = availableSlots_.asKeyValueRange(   );
+           auto f = [this](  qint64 sum,   const auto &kv ) -> qint64 {
+           auto const &[begin,   end] = kv;
+           return sum + begin.msecsTo(  end );
+           };
+           qint64 sum = std::accumulate(  kvRange.begin(   ),   kvRange.end(   ),   0,   f );
+          
+           return QTime::fromMSecsSinceStartOfDay(  sum );
+          }
+          
+     233  QTime DayManager::duration(  const QTime &begin ) const {
+           if (  !begin.isValid(   ) ) {
+           qWarning(   ) << "DayManager::duration: begin is invalid";
+           return {};
+           }
+          
+           const QTime &end = availableSlots_.value(  begin );
+           if (  !end.isValid(   ) ) {
+           qWarning(   ) << "DayManager::duration: end is invalid";
+           return {};
+           }
+          
+           return end.addMSecs(  -begin.msecsSinceStartOfDay(   ) );
+          }
+
+

./core/utils/reservation_manager.cpp

+ +       1  #include "reservation_manager.h"
+          
+          #include <QRandomGenerator>
+          
+       5  ReservationManager::ReservationManager(  qsizetype dayRange,   qsizetype dayBound,  
+       6   const DayManager &reference )
+           : createdRecords_(  0 ),   dayBound_(  dayBound ),   dayRange_(  dayRange ),  
+           excludedDays_(  0 ),   lastIndex_(  -1 ),   dayReference_(  reference ) {
+           prepareDaysRange(   );
+          }
+          
+      12  void ReservationManager::setReference(  const DayManager &reference ) {
+           dayReference_ = reference;
+           days_.clear(   );
+           lastIndex_ = -1;
+           prepareDaysRange(   );
+          }
+          
+      19  qsizetype ReservationManager::calculateAvailableDaysCount(   ) const {
+           qsizetype bound =
+           dayBound_ != -1 ? dayBound_ : std::numeric_limits<qsizetype>::max(   );
+           return bound - excludedDays_;
+          }
+          
+          qsizetype
+      26  ReservationManager::calculatePossibleReservations(  qint64 requiredMs ) const {
+           qsizetype possibleReservations = std::accumulate(  
+           days_.cbegin(   ),   days_.cend(   ),   0,  
+           [&](  qsizetype sum,   const DayManager manager ) {
+           return sum + manager.calculatePossibleReservations(  requiredMs );
+           } );
+          
+           qsizetype possibleReservationsByReference =
+           dayReference_.calculatePossibleReservations(  requiredMs );
+           qsizetype futureReservationsCount =
+           calculateAvailableDaysCount(   ) - days_.size(   );
+          
+           return possibleReservations +
+           possibleReservationsByReference * futureReservationsCount;
+          }
+          
+      42  qsizetype ReservationManager::calculateAvailableSlotsCount(   ) const {
+           return std::accumulate(  days_.cbegin(   ),   days_.cend(   ),   0,  
+           [&](  qsizetype sum,   const DayManager manager ) {
+           return sum + manager.slotCount(   );
+           } );
+          }
+          
+      49  QPair<QDateTime,   QTime> ReservationManager::reserve(  const QTime &duration ) {
+           if (  !duration.isValid(   ) ) {
+           qWarning(   ) << "ReservationManager::reserve: duration is invalid";
+           return {};
+           }
+          
+           const qint64 requiredMs = duration.msecsSinceStartOfDay(   );
+           if (  requiredMs <= 0 ) {
+           qWarning(   )
+           << "ReservationManager::reserve: duration should be greater than 0";
+           return {};
+           }
+          
+           if (  days_.isEmpty(   ) ) {
+           qWarning(   ) << "ReservationManager::reserve: no available days";
+           return {};
+           }
+          
+           std::mt19937 g{std::random_device{}(   )};
+           QList<qsizetype> dayIndexes = days_.keys(   );
+           std::shuffle(  dayIndexes.begin(   ),   dayIndexes.end(   ),   g );
+          
+           for (  qsizetype dayIndex : dayIndexes ) {
+           QPair<QDateTime,   QTime> result = reserve(  dayIndex,   duration );
+           const auto &[beginDateTime,   endTime] = result;
+           if (  beginDateTime.isValid(   ) && endTime.isValid(   ) ) {
+           ++createdRecords_;
+           return result;
+           }
+           }
+          
+           // qWarning(   ) << "ReservationManager::reserve: reservation failed";
+           return {};
+          }
+          
+      84  DayManager &ReservationManager::dayManager(  qsizetype dayIndex ) {
+           auto it = days_.find(  dayIndex );
+           if (  it != days_.end(   ) ) {
+           return it.value(   );
+           }
+           qCritical(   ) << "ReservationManager::dayManager: dayIndex is out of range";
+           throw std::out_of_range(  "dayIndex is out of range" );
+          }
+          
+      93  QPair<QDateTime,   QTime> ReservationManager::reserve(  qsizetype dayIndex,  
+      94   const QTime &duration ) {
+          
+           QTime beginTime,   endTime;
+           DayManager &dayManagerValue = dayManager(  dayIndex );
+          
+           std::tie(  beginTime,   endTime ) = dayManagerValue.reserve(  duration );
+          
+           if (  !dayManagerValue.duration(   ).isValid(   ) ) {
+           days_.remove(  dayIndex );
+           ++excludedDays_;
+           }
+           prepareDaysRange(   ); // Add new days after excluded days
+          
+           QDate beginDate = QDateTime::fromMSecsSinceEpoch(  0 ).date(   ).addDays(  dayIndex );
+           QDateTime beginDateTime(  beginDate,   beginTime );
+          
+           return {std::move(  beginDateTime ),   std::move(  endTime )};
+          }
+          
+     113  void ReservationManager::prepareDaysRange(   ) {
+           if (  !dayReference_.duration(   ).isValid(   ) ) {
+           qWarning(   ) << "ReservationManager::prepareDaysRange: reference is invalid";
+           return;
+           }
+          
+           auto condition = [this](  qsizetype currentSize ) {
+           qsizetype bound =
+           dayBound_ != -1 ? dayBound_ : std::numeric_limits<qsizetype>::max(   );
+           if (  lastIndex_ + 1 < bound ) {
+           return currentSize < dayRange_;
+           }
+           return false;
+           };
+          
+           for (  qsizetype size = days_.size(   ); condition(  size ); ++size ) {
+           days_[++lastIndex_] = DayManager(  dayReference_ );
+           }
+          }
+
+

./data/sql/base_sql_table_repository.cpp

+ +       1  #include "base_sql_table_repository.h"
+          
+          #include <QSqlError>
+          #include <QSqlQuery>
+          
+       6  BaseSqlTableRepository::BaseSqlTableRepository(  QSqlDatabase &database,  
+       7   QObject *parent )
+           : DataRepositorySignals(  parent ),   database_(  database ) {
+           if (  !database_.isOpen(   ) ) {
+           qWarning(   ) << "Database is not open: Database name:"
+           << database_.databaseName(   )
+           << "Database connection name:" << database_.connectionName(   );
+           }
+          }
+          
+      16  QSqlQuery BaseSqlTableRepository::foreignKeysOnQuery(   ) const {
+           QSqlQuery query(  database_ );
+           if (  !query.exec(  "PRAGMA foreign_keys = ON" ) ) {
+           qFatal(   ) << "Failed to enable foreign keys:" << query.lastError(   ).text(   );
+           }
+          
+           return query;
+          }
+
+

./data/sql/genres_repository.cpp

+ +       1  #include "genres_repository.h"
+          
+          #include "create_genre_request.h"
+          #include "genre_dto.h"
+          #include "repository_result.h"
+          #include "update_genre_request.h"
+          #include <QSqlError>
+          #include <QSqlQuery>
+          
+      10  GenresRepository::GenresRepository(  QSqlDatabase &database,   QObject *parent )
+           : BaseSqlTableRepository(  database,   parent ) {}
+          
+          RepositoryResult
+      14  GenresRepository::createGenre(  const CreateGenreRequest &request ) {
+           QSqlQuery query = foreignKeysOnQuery(   );
+           query.prepare(  "INSERT INTO genres (  genre_name ) VALUES (  :genre_name )" );
+           query.bindValue(  ":genre_name",   request.genreName(   ) );
+          
+           if (  !query.exec(   ) ) {
+           return RepositoryResult::failureResult(  query.lastError(   ).text(   ) );
+           }
+          
+           emit dataCreated(   );
+           return RepositoryResult::successResult(   );
+          }
+          
+      27  RepositoryResult GenresRepository::getGenreById(  qint32 id,  
+      28   GenreDTO &genre ) const {
+           QSqlQuery query = foreignKeysOnQuery(   );
+           query.prepare(  
+           "SELECT genre_id,   genre_name FROM genres WHERE genre_id = :genre_id" );
+           query.bindValue(  ":genre_id",   id );
+          
+           if (  !query.exec(   ) ) {
+           return RepositoryResult::failureResult(  query.lastError(   ).text(   ) );
+           }
+           if (  !query.next(   ) ) {
+           return RepositoryResult::failureResult(  "Genre not found" );
+           }
+          
+           genre = mapQueryToDTO(  query );
+          
+           emit dataRetrieved(   );
+           return RepositoryResult::successResult(   );
+          }
+          
+          RepositoryResult
+      48  GenresRepository::getAllGenres(  QVector<GenreDTO> &genres ) const {
+           QSqlQuery query = foreignKeysOnQuery(   );
+           query.prepare(  "SELECT genre_id,   genre_name FROM genres" );
+          
+           if (  !query.exec(   ) ) {
+           return RepositoryResult::failureResult(  query.lastError(   ).text(   ) );
+           }
+          
+           while (  query.next(   ) ) {
+           genres.append(  mapQueryToDTO(  query ) );
+           }
+          
+           emit dataRetrieved(   );
+           return RepositoryResult::successResult(   );
+          }
+          
+          RepositoryResult
+      65  GenresRepository::updateGenre(  const UpdateGenreRequest &request ) {
+           QSqlQuery query = foreignKeysOnQuery(   );
+           query.prepare(  
+           "UPDATE genres SET genre_name = :genre_name WHERE genre_id = :genre_id" );
+           query.bindValue(  ":genre_name",   request.genreName(   ) );
+           query.bindValue(  ":genre_id",   request.genreId(   ) );
+          
+           if (  !query.exec(   ) ) {
+           return RepositoryResult::failureResult(  query.lastError(   ).text(   ) );
+           }
+          
+           emit dataUpdated(   );
+           return RepositoryResult::successResult(   );
+          }
+          
+      80  RepositoryResult GenresRepository::deleteGenreById(  qint32 genreId ) {
+           QSqlQuery query = foreignKeysOnQuery(   );
+           query.prepare(  "DELETE FROM genres WHERE genre_id = :genre_id" );
+           query.bindValue(  ":genre_id",   genreId );
+          
+           if (  !query.exec(   ) ) {
+           return RepositoryResult::failureResult(  query.lastError(   ).text(   ) );
+           }
+          
+           emit dataDeleted(   );
+           return RepositoryResult::successResult(   );
+          }
+          
+      93  GenreDTO GenresRepository::mapQueryToDTO(  const QSqlQuery &query ) const {
+           GenreDTO genreDTO;
+           genreDTO.setGenreId(  query.value(  "genre_id" ).toInt(   ) );
+           genreDTO.setGenreName(  query.value(  "genre_name" ).toString(   ) );
+          
+           return genreDTO;
+          }
+
+

./data/sql/halls_repository.cpp

+ +       1  #include "halls_repository.h"
+          
+          #include "create_hall_request.h"
+          #include "hall_dto.h"
+          #include "repository_result.h"
+          #include "update_hall_request.h"
+          #include <QSqlError>
+          #include <QSqlQuery>
+          
+      10  HallsRepository::HallsRepository(  QSqlDatabase &database,   QObject *parent )
+           : BaseSqlTableRepository(  database,   parent ) {}
+          
+      13  RepositoryResult HallsRepository::createHall(  const CreateHallRequest &request ) {
+           QSqlQuery query = foreignKeysOnQuery(   );
+           query.prepare(  "INSERT INTO halls (  hall_name,   capacity ) VALUES "
+           "(  :hall_name,   :capacity )" );
+           query.bindValue(  ":hall_name",   request.hallName(   ) );
+           query.bindValue(  ":capacity",   request.capacity(   ) );
+          
+           if (  !query.exec(   ) ) {
+           return RepositoryResult::failureResult(  query.lastError(   ).text(   ) );
+           }
+          
+           emit dataCreated(   );
+           return RepositoryResult::successResult(   );
+          }
+          
+      28  RepositoryResult HallsRepository::getHallById(  qint32 id,   HallDTO &hall ) const {
+           QSqlQuery query = foreignKeysOnQuery(   );
+           query.prepare(  
+           "SELECT hall_id,   hall_name,   capacity FROM halls WHERE hall_id = :id" );
+           query.bindValue(  ":id",   id );
+          
+           if (  !query.exec(   ) ) {
+           return RepositoryResult::failureResult(  query.lastError(   ).text(   ) );
+           }
+           if (  !query.next(   ) ) {
+           return RepositoryResult::failureResult(  "Hall not found" );
+           }
+          
+           hall = mapQueryToDTO(  query );
+          
+           emit dataRetrieved(   );
+           return RepositoryResult::successResult(   );
+          }
+          
+      47  RepositoryResult HallsRepository::getAllHalls(  QVector<HallDTO> &halls ) const {
+           QSqlQuery query = foreignKeysOnQuery(   );
+           query.prepare(  "SELECT hall_id,   hall_name,   capacity FROM halls" );
+          
+           if (  !query.exec(   ) ) {
+           return RepositoryResult::failureResult(  query.lastError(   ).text(   ) );
+           }
+          
+           while (  query.next(   ) ) {
+           halls.append(  mapQueryToDTO(  query ) );
+           }
+          
+           emit dataRetrieved(   );
+           return RepositoryResult::successResult(   );
+          }
+          
+      63  RepositoryResult HallsRepository::updateHall(  const UpdateHallRequest &request ) {
+           QSqlQuery query = foreignKeysOnQuery(   );
+           query.prepare(  "UPDATE halls SET hall_name = :hall_name,   capacity = :capacity "
+           "WHERE hall_id = :hall_id" );
+           query.bindValue(  ":capacity",   request.capacity(   ) );
+           query.bindValue(  ":hall_id",   request.hallId(   ) );
+           query.bindValue(  ":hall_name",   request.hallName(   ) );
+          
+           if (  !query.exec(   ) ) {
+           return RepositoryResult::failureResult(  query.lastError(   ).text(   ) );
+           }
+          
+           emit dataUpdated(   );
+           return RepositoryResult::successResult(   );
+          }
+          
+      79  RepositoryResult HallsRepository::deleteHallById(  qint32 hallId ) {
+           QSqlQuery query = foreignKeysOnQuery(   );
+           query.prepare(  "DELETE FROM halls WHERE hall_id = :hall_id" );
+           query.bindValue(  ":hall_id",   hallId );
+          
+           if (  !query.exec(   ) ) {
+           return RepositoryResult::failureResult(  query.lastError(   ).text(   ) );
+           }
+          
+           emit dataDeleted(   );
+           return RepositoryResult::successResult(   );
+          }
+          
+      92  HallDTO HallsRepository::mapQueryToDTO(  const QSqlQuery &query ) const {
+           HallDTO hallDTO;
+           hallDTO.setCapacity(  query.value(  "capacity" ).toInt(   ) );
+           hallDTO.setHallId(  query.value(  "hall_id" ).toInt(   ) );
+           hallDTO.setHallName(  query.value(  "hall_name" ).toString(   ) );
+          
+           return hallDTO;
+          }
+
+

./data/sql/movies_repository.cpp

+ +       1  #include "movies_repository.h"
+          
+          #include "create_movie_request.h"
+          #include "movie_dto.h"
+          #include "repository_result.h"
+          #include "update_movie_request.h"
+          #include <QSqlError>
+          #include <QSqlQuery>
+          
+      10  MoviesRepository::MoviesRepository(  QSqlDatabase &database,   QObject *parent )
+           : BaseSqlTableRepository(  database,   parent ) {}
+          
+          RepositoryResult
+      14  MoviesRepository::createMovie(  const CreateMovieRequest &request ) {
+           QSqlQuery query = foreignKeysOnQuery(   );
+           query.prepare(  "INSERT INTO movies (  title,   genre_id,   duration ) VALUES "
+           "(  :title,   :genre_id,   :duration )" );
+           query.bindValue(  ":title",   request.title(   ) );
+           query.bindValue(  ":genre_id",   request.genreId(   ) );
+           query.bindValue(  ":duration",   request.duration(   ) );
+          
+           if (  !query.exec(   ) ) {
+           return RepositoryResult::failureResult(  query.lastError(   ).text(   ) );
+           }
+          
+           emit dataCreated(   );
+           return RepositoryResult::successResult(   );
+          }
+          
+          RepositoryResult
+      31  MoviesRepository::getAllMovies(  QVector<MovieDTO> &movies ) const {
+           QSqlQuery query = foreignKeysOnQuery(   );
+           query.prepare(  "SELECT movie_id,   title,   genre_id,   duration FROM movies" );
+          
+           if (  !query.exec(   ) ) {
+           return RepositoryResult::failureResult(  query.lastError(   ).text(   ) );
+           }
+          
+           while (  query.next(   ) ) {
+           movies.append(  mapQueryToDTO(  query ) );
+           }
+          
+           emit dataRetrieved(   );
+           return RepositoryResult::successResult(   );
+          }
+          
+      47  RepositoryResult MoviesRepository::getMovieById(  qint32 id,  
+      48   MovieDTO &movie ) const {
+           QSqlQuery query = foreignKeysOnQuery(   );
+           query.prepare(  "SELECT movie_id,   title,   genre_id,   duration FROM movies WHERE "
+           "movie_id = :id" );
+           query.bindValue(  ":id",   id );
+          
+           if (  !query.exec(   ) ) {
+           return RepositoryResult::failureResult(  query.lastError(   ).text(   ) );
+           }
+           if (  !query.next(   ) ) {
+           return RepositoryResult::failureResult(  "Movie not found" );
+           }
+          
+           movie = mapQueryToDTO(  query );
+          
+           emit dataRetrieved(   );
+           return RepositoryResult::successResult(   );
+          }
+          
+          RepositoryResult
+      68  MoviesRepository::updateMovie(  const UpdateMovieRequest &request ) {
+           QSqlQuery query = foreignKeysOnQuery(   );
+           query.prepare(  "UPDATE movies SET title = :title,   genre_id = :genre_id,   "
+           "duration = :duration WHERE movie_id = :id" );
+           query.bindValue(  ":duration",   request.duration(   ) );
+           query.bindValue(  ":genre_id",   request.genreId(   ) );
+           query.bindValue(  ":id",   request.movieId(   ) );
+           query.bindValue(  ":title",   request.title(   ) );
+          
+           if (  !query.exec(   ) ) {
+           return RepositoryResult::failureResult(  query.lastError(   ).text(   ) );
+           }
+          
+           emit dataUpdated(   );
+           return RepositoryResult::successResult(   );
+          }
+          
+      85  RepositoryResult MoviesRepository::deleteMovieById(  qint32 movieId ) {
+           QSqlQuery query = foreignKeysOnQuery(   );
+           query.prepare(  "DELETE FROM movies WHERE movie_id = :id" );
+           query.bindValue(  ":id",   movieId );
+          
+           if (  !query.exec(   ) ) {
+           return RepositoryResult::failureResult(  query.lastError(   ).text(   ) );
+           }
+          
+           emit dataDeleted(   );
+           return RepositoryResult::successResult(   );
+          }
+          
+      98  MovieDTO MoviesRepository::mapQueryToDTO(  const QSqlQuery &query ) const {
+           MovieDTO movieDTO;
+           movieDTO.setDuration(  query.value(  "duration" ).toInt(   ) );
+           movieDTO.setGenreId(  query.value(  "genre_id" ).toInt(   ) );
+           movieDTO.setMovieId(  query.value(  "movie_id" ).toInt(   ) );
+           movieDTO.setTitle(  query.value(  "title" ).toString(   ) );
+          
+           return movieDTO;
+          }
+
+

./data/sql/refunds_repository.cpp

+ +       1  #include "refunds_repository.h"
+          
+          #include "create_refund_request.h"
+          #include "refund_dto.h"
+          #include "repository_result.h"
+          #include "update_refund_request.h"
+          #include <QSqlError>
+          #include <QSqlQuery>
+          
+      10  RefundsRepository::RefundsRepository(  QSqlDatabase &database,   QObject *parent )
+           : BaseSqlTableRepository(  database,   parent ) {}
+          
+          RepositoryResult
+      14  RefundsRepository::createRefund(  const CreateRefundRequest &request ) {
+           QSqlQuery query = foreignKeysOnQuery(   );
+           query.prepare(  "INSERT INTO refunds (  ticket_id,   refund_at,   refund_amount ) "
+           "VALUES (  :ticket_id,   :refund_at,   :refund_amount )" );
+           query.bindValue(  ":ticket_id",   request.ticketId(   ) );
+           query.bindValue(  ":refund_at",   request.refundAt(   ) );
+           query.bindValue(  ":refund_amount",   request.refundAmount(   ) );
+          
+           if (  !query.exec(   ) ) {
+           return RepositoryResult::failureResult(  query.lastError(   ).text(   ) );
+           }
+          
+           emit dataCreated(   );
+           return RepositoryResult::successResult(   );
+          }
+          
+      30  RepositoryResult RefundsRepository::getRefundById(  qint32 id,  
+      31   RefundDTO &refund ) const {
+           QSqlQuery query = foreignKeysOnQuery(   );
+           query.prepare(  "SELECT refund_id,   ticket_id,   refund_at,   refund_amount FROM "
+           "refunds WHERE refund_id = :id" );
+           query.bindValue(  ":id",   id );
+          
+           if (  !query.exec(   ) ) {
+           return RepositoryResult::failureResult(  query.lastError(   ).text(   ) );
+           }
+           if (  !query.next(   ) ) {
+           return RepositoryResult::failureResult(  "Refund not found" );
+           }
+          
+           RefundDTO refundDTO;
+           refundDTO.setRefundAmount(  query.value(  "refund_amount" ).toDouble(   ) );
+           refundDTO.setRefundAt(  query.value(  "refund_at" ).toDateTime(   ) );
+           refundDTO.setRefundId(  query.value(  "refund_id" ).toInt(   ) );
+           refundDTO.setTicketId(  query.value(  "ticket_id" ).toInt(   ) );
+          
+           refund = mapQueryToDTO(  query );
+          
+           emit dataRetrieved(   );
+           return RepositoryResult::successResult(   );
+          }
+          
+          RepositoryResult
+      57  RefundsRepository::getAllRefunds(  QVector<RefundDTO> &refunds ) const {
+           QSqlQuery query = foreignKeysOnQuery(   );
+           query.prepare(  
+           "SELECT refund_id,   ticket_id,   refund_at,   refund_amount FROM refunds" );
+          
+           if (  !query.exec(   ) ) {
+           return RepositoryResult::failureResult(  query.lastError(   ).text(   ) );
+           }
+          
+           while (  query.next(   ) ) {
+           refunds.append(  mapQueryToDTO(  query ) );
+           }
+          
+           emit dataRetrieved(   );
+           return RepositoryResult::successResult(   );
+          }
+          
+          RepositoryResult
+      75  RefundsRepository::updateRefund(  const UpdateRefundRequest &request ) {
+           QSqlQuery query = foreignKeysOnQuery(   );
+           query.prepare(  
+           "UPDATE refunds SET ticket_id = :ticket_id,   refund_at = :refund_at,   "
+           "refund_amount = :refund_amount WHERE refund_id = :refund_id" );
+           query.bindValue(  ":refund_amount",   request.refundAmount(   ) );
+           query.bindValue(  ":refund_at",   request.refundAt(   ) );
+           query.bindValue(  ":refund_id",   request.refundId(   ) );
+           query.bindValue(  ":ticket_id",   request.ticketId(   ) );
+          
+           if (  !query.exec(   ) ) {
+           return RepositoryResult::failureResult(  query.lastError(   ).text(   ) );
+           }
+          
+           emit dataUpdated(   );
+           return RepositoryResult::successResult(   );
+          }
+          
+      93  RepositoryResult RefundsRepository::deleteRefundById(  qint32 refundId ) {
+           QSqlQuery query = foreignKeysOnQuery(   );
+           query.prepare(  "DELETE FROM refunds WHERE refund_id = :refund_id" );
+           query.bindValue(  ":refund_id",   refundId );
+          
+           if (  !query.exec(   ) ) {
+           return RepositoryResult::failureResult(  query.lastError(   ).text(   ) );
+           }
+          
+           emit dataDeleted(   );
+           return RepositoryResult::successResult(   );
+          }
+          
+     106  RefundDTO RefundsRepository::mapQueryToDTO(  const QSqlQuery &query ) const {
+           RefundDTO refundDTO;
+           refundDTO.setRefundAmount(  query.value(  "refund_amount" ).toDouble(   ) );
+           refundDTO.setRefundAt(  query.value(  "refund_at" ).toDateTime(   ) );
+           refundDTO.setRefundId(  query.value(  "refund_id" ).toInt(   ) );
+           refundDTO.setTicketId(  query.value(  "ticket_id" ).toInt(   ) );
+          
+           return refundDTO;
+          }
+
+

./data/sql/roles_repository.cpp

+ +       1  #include "roles_repository.h"
+          
+          #include "create_role_request.h"
+          #include "repository_result.h"
+          #include "role_dto.h"
+          #include "update_role_request.h"
+          #include <QSqlError>
+          #include <QSqlQuery>
+          
+      10  RolesRepository::RolesRepository(  QSqlDatabase &database,   QObject *parent )
+           : BaseSqlTableRepository(  database,   parent ) {}
+          
+      13  RepositoryResult RolesRepository::createRole(  const CreateRoleRequest &request ) {
+           QSqlQuery query = foreignKeysOnQuery(   );
+           query.prepare(  "INSERT INTO roles (  role_name,   access_level ) VALUES "
+           "(  :role_name,   :access_level )" );
+           query.bindValue(  ":role_name",   request.roleName(   ) );
+           query.bindValue(  ":access_level",   request.accessLevel(   ) );
+          
+           if (  !query.exec(   ) ) {
+           return RepositoryResult::failureResult(  query.lastError(   ).text(   ) );
+           }
+          
+           emit dataCreated(   );
+           return RepositoryResult::successResult(   );
+          }
+          
+      28  RepositoryResult RolesRepository::getRoleById(  qint32 id,   RoleDTO &role ) const {
+           QSqlQuery query = foreignKeysOnQuery(   );
+           query.prepare(  "SELECT role_id,   role_name,   access_level FROM roles WHERE "
+           "role_id = :role_id" );
+           query.bindValue(  ":role_id",   id );
+          
+           if (  !query.exec(   ) ) {
+           return RepositoryResult::failureResult(  query.lastError(   ).text(   ) );
+           }
+           if (  !query.next(   ) ) {
+           return RepositoryResult::failureResult(  "Role not found" );
+           }
+          
+           role = mapQueryToDTO(  query );
+          
+           emit dataRetrieved(   );
+           return RepositoryResult::successResult(   );
+          }
+          
+      47  RepositoryResult RolesRepository::getAllRoles(  QVector<RoleDTO> &roles ) const {
+           QSqlQuery query = foreignKeysOnQuery(   );
+           query.prepare(  "SELECT role_id,   role_name,   access_level FROM roles" );
+          
+           if (  !query.exec(   ) ) {
+           return RepositoryResult::failureResult(  query.lastError(   ).text(   ) );
+           }
+          
+           while (  query.next(   ) ) {
+           roles.append(  mapQueryToDTO(  query ) );
+           }
+          
+           emit dataRetrieved(   );
+           return RepositoryResult::successResult(   );
+          }
+          
+      63  RepositoryResult RolesRepository::updateRole(  const UpdateRoleRequest &request ) {
+           QSqlQuery query = foreignKeysOnQuery(   );
+           query.prepare(  
+           "UPDATE roles SET role_name = :role_name WHERE role_id = :role_id" );
+           query.bindValue(  ":role_name",   request.roleName(   ) );
+           query.bindValue(  ":role_id",   request.roleId(   ) );
+          
+           if (  !query.exec(   ) ) {
+           return RepositoryResult::failureResult(  query.lastError(   ).text(   ) );
+           }
+          
+           emit dataUpdated(   );
+           return RepositoryResult::successResult(   );
+          }
+          
+      78  RepositoryResult RolesRepository::deleteRoleById(  qint32 roleId ) {
+           QSqlQuery query = foreignKeysOnQuery(   );
+           query.prepare(  "DELETE FROM roles WHERE role_id = :role_id" );
+           query.bindValue(  ":role_id",   roleId );
+          
+           if (  !query.exec(   ) ) {
+           return RepositoryResult::failureResult(  query.lastError(   ).text(   ) );
+           }
+          
+           emit dataDeleted(   );
+           return RepositoryResult::successResult(   );
+          }
+          
+      91  RoleDTO RolesRepository::mapQueryToDTO(  const QSqlQuery &query ) const {
+           RoleDTO roleDTO;
+           roleDTO.setAccessLevel(  query.value(  "access_level" ).toInt(   ) );
+           roleDTO.setRoleId(  query.value(  "role_id" ).toInt(   ) );
+           roleDTO.setRoleName(  query.value(  "role_name" ).toString(   ) );
+          
+           return roleDTO;
+          }
+
+

./data/sql/sessions_repository.cpp

+ +       1  #include "sessions_repository.h"
+          
+          #include "create_session_request.h"
+          #include "repository_result.h"
+          #include "session_dto.h"
+          #include "update_session_request.h"
+          #include <QSqlError>
+          #include <QSqlQuery>
+          
+      10  SessionsRepository::SessionsRepository(  QSqlDatabase &database,   QObject *parent )
+           : BaseSqlTableRepository(  database,   parent ) {}
+          
+          RepositoryResult
+      14  SessionsRepository::createSession(  const CreateSessionRequest &request ) {
+           QSqlQuery query = foreignKeysOnQuery(   );
+           query.prepare(  
+           "INSERT INTO sessions (  movie_id,   hall_id,   begin_at,   ticket_price ) VALUES "
+           "(  :movie_id,   :hall_id,   :begin_at,   :ticket_price )" );
+           query.bindValue(  ":begin_at",   request.beginAt(   ) );
+           query.bindValue(  ":hall_id",   request.hallId(   ) );
+           query.bindValue(  ":movie_id",   request.movieId(   ) );
+           query.bindValue(  ":ticket_price",   request.ticketPrice(   ) );
+          
+           if (  !query.exec(   ) ) {
+           return RepositoryResult::failureResult(  query.lastError(   ).text(   ) );
+           }
+          
+           emit dataCreated(   );
+           return RepositoryResult::successResult(   );
+          }
+          
+      32  RepositoryResult SessionsRepository::getSessionById(  qint32 id,  
+      33   SessionDTO &session ) const {
+           QSqlQuery query = foreignKeysOnQuery(   );
+           query.prepare(  "SELECT session_id,   movie_id,   hall_id,   begin_at,   ticket_price "
+           "FROM sessions WHERE session_id = :id" );
+           query.bindValue(  ":id",   id );
+          
+           if (  !query.exec(   ) ) {
+           return RepositoryResult::failureResult(  query.lastError(   ).text(   ) );
+           }
+           if (  !query.next(   ) ) {
+           return RepositoryResult::failureResult(  "Session not found" );
+           }
+          
+           session = mapQueryToDTO(  query );
+          
+           emit dataRetrieved(   );
+           return RepositoryResult::successResult(   );
+          }
+          
+          RepositoryResult
+      53  SessionsRepository::getAllSessions(  QVector<SessionDTO> &sessions ) const {
+           QSqlQuery query = foreignKeysOnQuery(   );
+           query.prepare(  "SELECT session_id,   movie_id,   hall_id,   begin_at,   ticket_price "
+           "FROM sessions" );
+          
+           if (  !query.exec(   ) ) {
+           return RepositoryResult::failureResult(  query.lastError(   ).text(   ) );
+           }
+          
+           while (  query.next(   ) ) {
+           sessions.append(  mapQueryToDTO(  query ) );
+           }
+          
+           emit dataRetrieved(   );
+           return RepositoryResult::successResult(   );
+          }
+          
+          RepositoryResult
+      71  SessionsRepository::updateSession(  const UpdateSessionRequest &request ) {
+           QSqlQuery query = foreignKeysOnQuery(   );
+           query.prepare(  "UPDATE sessions SET movie_id = :movie_id,   hall_id = :hall_id,   "
+           "begin_at = :begin_at,   ticket_price = :ticket_price WHERE "
+           "session_id = :session_id" );
+           query.bindValue(  ":begin_at",   request.beginAt(   ) );
+           query.bindValue(  ":hall_id",   request.hallId(   ) );
+           query.bindValue(  ":movie_id",   request.movieId(   ) );
+           query.bindValue(  ":session_id",   request.sessionId(   ) );
+           query.bindValue(  ":ticket_price",   request.ticketPrice(   ) );
+          
+           if (  !query.exec(   ) ) {
+           return RepositoryResult::failureResult(  query.lastError(   ).text(   ) );
+           }
+          
+           emit dataUpdated(   );
+           return RepositoryResult::successResult(   );
+          }
+          
+      90  RepositoryResult SessionsRepository::deleteSessionById(  qint32 sessionId ) {
+           QSqlQuery query = foreignKeysOnQuery(   );
+           query.prepare(  "DELETE FROM sessions WHERE session_id = :session_id" );
+           query.bindValue(  ":session_id",   sessionId );
+          
+           if (  !query.exec(   ) ) {
+           return RepositoryResult::failureResult(  query.lastError(   ).text(   ) );
+           }
+          
+           emit dataDeleted(   );
+           return RepositoryResult::successResult(   );
+          }
+          
+     103  SessionDTO SessionsRepository::mapQueryToDTO(  const QSqlQuery &query ) const {
+           SessionDTO sessionDTO;
+           sessionDTO.setBeginAt(  query.value(  "begin_at" ).toDateTime(   ) );
+           sessionDTO.setHallId(  query.value(  "hall_id" ).toInt(   ) );
+           sessionDTO.setMovieId(  query.value(  "movie_id" ).toInt(   ) );
+           sessionDTO.setSessionId(  query.value(  "session_id" ).toInt(   ) );
+           sessionDTO.setTicketPrice(  query.value(  "ticket_price" ).toDouble(   ) );
+          
+           return sessionDTO;
+          }
+
+

./data/sql/sessions_statistics_repository.cpp

+ +       1  #include "sessions_statistics_repository.h"
+          
+          #include "repository_result.h"
+          #include "session_statistics_dto.h"
+          
+          #include <QSqlError>
+          #include <QSqlQuery>
+          #include <QVariant>
+          #include <QVector>
+          
+      11  SessionsStatisticsRepository::SessionsStatisticsRepository(  
+      12   QSqlDatabase &database,   QObject *parent )
+           : BaseSqlTableRepository(  database,   parent ) {}
+          
+          SessionStatisticsDTO
+      16  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;
+          }
+          
+      40  RepositoryResult SessionsStatisticsRepository::executeAndMapQuery(  
+      41   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(   );
+          }
+          
+      58  RepositoryResult SessionsStatisticsRepository::getSessionById(  
+      59   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(   );
+          }
+          
+      77  RepositoryResult SessionsStatisticsRepository::getAllSessions(  
+      78   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(   );
+          }
+          
+      94  RepositoryResult SessionsStatisticsRepository::getSessionsForHall(  
+      95   qint32 hallId,   std::optional<QDateTime> startDate,  
+      96   std::optional<QDateTime> endDate,  
+      97   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 );
+          }
+          
+     112  RepositoryResult SessionsStatisticsRepository::getSessionsForMovie(  
+     113   qint32 movieId,   std::optional<QDateTime> startDate,  
+     114   std::optional<QDateTime> endDate,  
+     115   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 );
+          }
+          
+     130  RepositoryResult SessionsStatisticsRepository::getSessionsForGenre(  
+     131   qint32 genreId,   std::optional<QDateTime> startDate,  
+     132   std::optional<QDateTime> endDate,  
+     133   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 );
+          }
+          
+     148  void SessionsStatisticsRepository::bindDateFilters(  
+     149   QString &queryString,   const std::optional<QDateTime> &startDate,  
+     150   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";
+           }
+          }
+          
+     160  void SessionsStatisticsRepository::bindDateValues(  
+     161   QSqlQuery &query,   const std::optional<QDateTime> &startDate,  
+     162   const std::optional<QDateTime> &endDate ) const {
+           if (  startDate ) {
+           query.bindValue(  ":start_date",   *startDate );
+           }
+           if (  endDate ) {
+           query.bindValue(  ":end_date",   *endDate );
+           }
+          }
+
+

./data/sql/table_info_sqlite.cpp

+ +          #include "table_info_sqlite.h"
+          
+          #include <QDebug>
+          #include <QMetaType>
+          #include <QSqlError>
+          
+       7  TableInfoSQLite::TableInfoSQLite(   ) : databaseTableName_(  "" ) {}
+          
+       9  TableInfoSQLite::TableInfoSQLite(  const QString &databaseTableName )
+           : databaseTableName_(  databaseTableName ) {
+           loadColumnInfo(   );
+          }
+          
+      14  void TableInfoSQLite::loadColumnInfo(   ) {
+           QSqlDatabase defaultDatabase = QSqlDatabase::database(   );
+          
+           if (  !defaultDatabase.isValid(   ) ) {
+           qCritical(   ) << "TableInfoSQLite::loadColumnInfo: Database is invalid";
+           }
+          
+           if (  !defaultDatabase.isOpen(   ) ) {
+           qCritical(   ) << "TableInfoSQLite::loadColumnInfo: Database is not open";
+          
+           databaseTableName_.clear(   );
+           columnNames_.clear(   );
+           columnTypes_.clear(   );
+           isPrimaryKey_.clear(   );
+          
+           return;
+           }
+          
+           QSqlQuery query(  defaultDatabase );
+           query.prepare(  QString(  "PRAGMA table_info(  %1 )" ).arg(  databaseTableName_ ) );
+          
+           if (  !query.exec(   ) ) {
+           qWarning(   ) << "Failed to get table info: Error:" << query.lastError(   ).text(   )
+           << "Database table name:" << databaseTableName_;
+          
+           return;
+           }
+          
+           while (  query.next(   ) ) {
+           columnNames_.append(  query.value(  "name" ).toString(   ) );
+           columnTypes_.append(  query.value(  "type" ).toString(   ) );
+           isPrimaryKey_.append(  query.value(  "pk" ).toInt(   ) > 0 );
+           }
+          }
+          
+      49  QString TableInfoSQLite::databaseTableName(   ) const noexcept {
+           return databaseTableName_;
+          }
+          
+          QString
+      54  TableInfoSQLite::foreignKeyTable(  const QString &columnName ) const noexcept {
+           if (  databaseTableName_.isEmpty(   ) ) {
+           qWarning(   ) << "TableInfoSQLite::foreignKeyTable: No table name set";
+           return QString(   );
+           }
+          
+           QSqlDatabase defaultDatabase = QSqlDatabase::database(   );
+           if (  !defaultDatabase.isOpen(   ) ) {
+           qCritical(   ) << "TableInfoSQLite::foreignKeyTable: Database is not open";
+           return QString(   );
+           }
+          
+           QSqlQuery query(  defaultDatabase );
+           query.prepare(  QString(  "PRAGMA foreign_key_list(  %1 )" ).arg(  databaseTableName_ ) );
+          
+           if (  !query.exec(   ) ) {
+           qWarning(   ) << "Failed to get foreign key info:" << query.lastError(   ).text(   );
+           return QString(   );
+           }
+          
+           while (  query.next(   ) ) {
+           QString fkColumn = query.value(  "from" ).toString(   );
+           QString referencedTable = query.value(  "table" ).toString(   );
+          
+           if (  fkColumn == columnName ) {
+           return referencedTable;
+           }
+           }
+          
+           return QString(   );
+          }
+          
+      86  QStringList TableInfoSQLite::columnNames(   ) const noexcept {
+           return QStringList(  columnNames_.begin(   ),   columnNames_.end(   ) );
+          }
+          
+      90  bool TableInfoSQLite::isPrimaryKey(  const QString &columnName ) const noexcept {
+           int index = columnIndex(  columnName );
+           if (  index == -1 ) {
+           return false;
+           }
+           return isPrimaryKey_.at(  index );
+          }
+          
+      98  qint32 TableInfoSQLite::columnIndex(  const QString &columnName ) const noexcept {
+           return columnNames_.indexOf(  columnName );
+          }
+          
+     102  QString TableInfoSQLite::columnName(  qint32 columnIndex ) const noexcept {
+           if (  columnIndex < 0 || columnIndex >= columnNames_.size(   ) ) {
+           return QString(   );
+           }
+           return columnNames_.at(  columnIndex );
+          }
+          
+          QMetaType::Type
+          TableInfoSQLite::columnMetaType(  const QString &columnName ) const noexcept {
+           int index = columnIndex(  columnName );
+           if (  index == -1 ) {
+           return QMetaType::UnknownType;
+           }
+          
+           QString typeName = columnTypes_.at(  index ).toLower(   );
+          
+           if (  typeName.contains(  "int" ) ) {
+           return QMetaType::Int;
+           } else if (  typeName.contains(  "double" ) || typeName.contains(  "real" ) ||
+           typeName.contains(  "float" ) ) {
+           return QMetaType::Double;
+           } else if (  typeName.contains(  "date" ) || typeName.contains(  "time" ) ) {
+           return QMetaType::QDateTime;
+           } else if (  typeName.contains(  "bool" ) ) {
+           return QMetaType::Bool;
+           } else if (  typeName.contains(  "blob" ) ) {
+           return QMetaType::QByteArray;
+           } else {
+           return QMetaType::QString;
+           }
+          }
+          
+          void TableInfoSQLite::setDatabaseTableName(  
+           const QString &databaseTableName ) noexcept {
+           databaseTableName_ = databaseTableName;
+           loadColumnInfo(   );
+          }
+
+

./data/sql/tickets_repository.cpp

+ +       1  #include "tickets_repository.h"
+          
+          #include "create_ticket_request.h"
+          #include "repository_result.h"
+          #include "ticket_dto.h"
+          #include "update_ticket_request.h"
+          #include <QSqlError>
+          #include <QSqlQuery>
+          
+      10  TicketsRepository::TicketsRepository(  QSqlDatabase &database,   QObject *parent )
+           : BaseSqlTableRepository(  database,   parent ) {}
+          
+          RepositoryResult
+      14  TicketsRepository::createTicket(  const CreateTicketRequest &request ) {
+           QSqlQuery query = foreignKeysOnQuery(   );
+           query.prepare(  "INSERT INTO tickets (  session_id,   seat_number,   sold_at ) VALUES "
+           "(  :session_id,   :seat_number,   :sold_at )" );
+           query.bindValue(  ":seat_number",   request.seatNumber(   ) );
+           query.bindValue(  ":session_id",   request.sessionId(   ) );
+           query.bindValue(  ":sold_at",   request.soldAt(   ) );
+          
+           if (  !query.exec(   ) ) {
+           return RepositoryResult::failureResult(  query.lastError(   ).text(   ) );
+           }
+          
+           emit dataCreated(   );
+           return RepositoryResult::successResult(   );
+          }
+          
+      30  RepositoryResult TicketsRepository::getTicketById(  qint32 id,  
+      31   TicketDTO &ticket ) const {
+           QSqlQuery query = foreignKeysOnQuery(   );
+           query.prepare(  "SELECT ticket_id,   session_id,   seat_number,   sold_at FROM "
+           "tickets WHERE ticket_id = :id" );
+           query.bindValue(  ":id",   id );
+          
+           if (  !query.exec(   ) ) {
+           return RepositoryResult::failureResult(  query.lastError(   ).text(   ) );
+           }
+           if (  !query.next(   ) ) {
+           return RepositoryResult::failureResult(  "Ticket not found" );
+           }
+          
+           ticket = mapQueryToDTO(  query );
+          
+           emit dataRetrieved(   );
+           return RepositoryResult::successResult(   );
+          }
+          
+          RepositoryResult
+      51  TicketsRepository::getAllTickets(  QVector<TicketDTO> &tickets ) const {
+           QSqlQuery query = foreignKeysOnQuery(   );
+           query.prepare(  
+           "SELECT ticket_id,   session_id,   seat_number,   sold_at FROM tickets" );
+          
+           if (  !query.exec(   ) ) {
+           return RepositoryResult::failureResult(  query.lastError(   ).text(   ) );
+           }
+          
+           while (  query.next(   ) ) {
+           tickets.append(  mapQueryToDTO(  query ) );
+           }
+          
+           emit dataRetrieved(   );
+           return RepositoryResult::successResult(   );
+          }
+          
+          RepositoryResult
+      69  TicketsRepository::updateTicket(  const UpdateTicketRequest &request ) {
+           QSqlQuery query = foreignKeysOnQuery(   );
+           query.prepare(  
+           "UPDATE tickets SET session_id = :session_id,   seat_number = "
+           ":seat_number,   sold_at = :sold_at WHERE ticket_id = :ticket_id" );
+           query.bindValue(  ":seat_number",   request.seatNumber(   ) );
+           query.bindValue(  ":session_id",   request.sessionId(   ) );
+           query.bindValue(  ":sold_at",   request.soldAt(   ) );
+           query.bindValue(  ":ticket_id",   request.ticketId(   ) );
+          
+           if (  !query.exec(   ) ) {
+           return RepositoryResult::failureResult(  query.lastError(   ).text(   ) );
+           }
+          
+           emit dataUpdated(   );
+           return RepositoryResult::successResult(   );
+          }
+          
+      87  RepositoryResult TicketsRepository::deleteTicketById(  qint32 ticketId ) {
+           QSqlQuery query = foreignKeysOnQuery(   );
+           query.prepare(  "DELETE FROM tickets WHERE ticket_id = :ticket_id" );
+           query.bindValue(  ":ticket_id",   ticketId );
+          
+           if (  !query.exec(   ) ) {
+           return RepositoryResult::failureResult(  query.lastError(   ).text(   ) );
+           }
+          
+           emit dataDeleted(   );
+           return RepositoryResult::successResult(   );
+          }
+          
+     100  TicketDTO TicketsRepository::mapQueryToDTO(  const QSqlQuery &query ) const {
+           TicketDTO ticketDTO;
+           ticketDTO.setSeatNumber(  query.value(  "seat_number" ).toInt(   ) );
+           ticketDTO.setSessionId(  query.value(  "session_id" ).toInt(   ) );
+           ticketDTO.setSoldAt(  query.value(  "sold_at" ).toDateTime(   ) );
+           ticketDTO.setTicketId(  query.value(  "ticket_id" ).toInt(   ) );
+          
+           return ticketDTO;
+          }
+
+

./data/sql/users_repository.cpp

+ +       1  #include "users_repository.h"
+          
+          #include "create_user_request.h"
+          #include "repository_result.h"
+          #include "update_user_request.h"
+          #include "user_dto.h"
+          #include <QSqlError>
+          #include <QSqlQuery>
+          
+      10  UsersRepository::UsersRepository(  QSqlDatabase &database,   QObject *parent )
+           : BaseSqlTableRepository(  database,   parent ) {}
+          
+      13  RepositoryResult UsersRepository::createUser(  const CreateUserRequest &request ) {
+           QSqlQuery query = foreignKeysOnQuery(   );
+           query.prepare(  "INSERT INTO users (  username,   password_hash,   salt,   role_id ) "
+           "VALUES (  :username,   :password_hash,   :salt,   :role_id )" );
+           query.bindValue(  ":password_hash",   request.passwordHash(   ) );
+           query.bindValue(  ":role_id",   request.roleId(   ) );
+           query.bindValue(  ":salt",   request.salt(   ) );
+           query.bindValue(  ":username",   request.username(   ) );
+          
+           if (  !query.exec(   ) ) {
+           return RepositoryResult::failureResult(  query.lastError(   ).text(   ) );
+           }
+          
+           emit dataCreated(   );
+           return RepositoryResult::successResult(   );
+          }
+          
+      30  RepositoryResult UsersRepository::getUserById(  qint32 id,   UserDTO &user ) const {
+           QSqlQuery query = foreignKeysOnQuery(   );
+           query.prepare(  "SELECT user_id,   username,   password_hash,   salt,   role_id FROM "
+           "users WHERE "
+           "user_id = :user_id" );
+           query.bindValue(  ":user_id",   id );
+          
+           if (  !query.exec(   ) ) {
+           return RepositoryResult::failureResult(  query.lastError(   ).text(   ) );
+           }
+           if (  !query.next(   ) ) {
+           return RepositoryResult::failureResult(  "User not found" );
+           }
+          
+           user = mapQueryToDTO(  query );
+          
+           emit dataRetrieved(   );
+           return RepositoryResult::successResult(   );
+          }
+          
+      50  RepositoryResult UsersRepository::getUserByUsername(  const QString &username,  
+      51   UserDTO &user ) const {
+           QSqlQuery query = foreignKeysOnQuery(   );
+           query.prepare(  "SELECT user_id,   username,   password_hash,   salt,   role_id FROM "
+           "users WHERE "
+           "username = :username" );
+           query.bindValue(  ":username",   username );
+          
+           if (  !query.exec(   ) ) {
+           return RepositoryResult::failureResult(  query.lastError(   ).text(   ) );
+           }
+           if (  !query.next(   ) ) {
+           return RepositoryResult::failureResult(  "User not found" );
+           }
+          
+           user = mapQueryToDTO(  query );
+          
+           emit dataRetrieved(   );
+           return RepositoryResult::successResult(   );
+          }
+          
+      71  RepositoryResult UsersRepository::getAllUsers(  QVector<UserDTO> &users ) const {
+           QSqlQuery query = foreignKeysOnQuery(   );
+           query.prepare(  
+           "SELECT user_id,   username,   password_hash,   salt,   role_id FROM users" );
+          
+           if (  !query.exec(   ) ) {
+           return RepositoryResult::failureResult(  query.lastError(   ).text(   ) );
+           }
+          
+           while (  query.next(   ) ) {
+           users.append(  mapQueryToDTO(  query ) );
+           }
+          
+           emit dataRetrieved(   );
+           return RepositoryResult::successResult(   );
+          }
+          
+      88  RepositoryResult UsersRepository::updateUser(  const UpdateUserRequest &request ) {
+           QSqlQuery query = foreignKeysOnQuery(   );
+           query.prepare(  "UPDATE users SET username = :username,   password_hash = "
+           ":password_hash,   "
+           "salt = :salt,   role_id = :role_id WHERE user_id = :user_id" );
+          
+           query.bindValue(  ":username",   request.username(   ) );
+           query.bindValue(  ":password_hash",   request.passwordHash(   ) );
+           query.bindValue(  ":salt",   request.salt(   ) );
+           query.bindValue(  ":role_id",   request.roleId(   ) );
+           query.bindValue(  ":user_id",   request.userId(   ) );
+          
+           if (  !query.exec(   ) ) {
+           return RepositoryResult::failureResult(  query.lastError(   ).text(   ) );
+           }
+          
+           emit dataUpdated(   );
+           return RepositoryResult::successResult(   );
+          }
+          
+     108  RepositoryResult UsersRepository::deleteUserById(  qint32 userId ) {
+           QSqlQuery query = foreignKeysOnQuery(   );
+           query.prepare(  "DELETE FROM users WHERE user_id = :user_id" );
+           query.bindValue(  ":user_id",   userId );
+          
+           if (  !query.exec(   ) ) {
+           return RepositoryResult::failureResult(  query.lastError(   ).text(   ) );
+           }
+          
+           emit dataDeleted(   );
+           return RepositoryResult::successResult(   );
+          }
+          
+     121  UserDTO UsersRepository::mapQueryToDTO(  const QSqlQuery &query ) const {
+           UserDTO userDTO;
+           userDTO.setPasswordHash(  query.value(  "password_hash" ).toString(   ) );
+           userDTO.setRoleId(  query.value(  "role_id" ).toInt(   ) );
+           userDTO.setSalt(  query.value(  "salt" ).toString(   ) );
+           userDTO.setUserId(  query.value(  "user_id" ).toInt(   ) );
+           userDTO.setUsername(  query.value(  "username" ).toString(   ) );
+          
+           return userDTO;
+          }
+
+

./src/main.cpp

+ +       1  #include "application_connector.h"
+          #include "application_controller.h"
+          #include "main_window.h"
+          #include <QApplication>
+          
+       6  int main(  int argc,   char *argv[] ) {
+           QApplication app(  argc,   argv );
+          
+           ApplicationController controller;
+           if (  !controller.setupApplication(   ) ) {
+           return -1;
+           }
+          
+           // MainWindow mainWindow(  controller.userId(   ),   controller.accessLevel(   ) );
+           MainWindow mainWindow(  1,   100 );
+          
+           ApplicationConnector connector(  &mainWindow );
+           if (  !connector.connect(   ) ) {
+           return -1;
+           }
+          
+           mainWindow.show(   );
+          
+           return app.exec(   );
+          }
+
+

./tests_class/day_manager_test.cpp

+ +       1  #include "day_manager.h"
+          #include <QtTest>
+          
+       4  class DayManagerTest : public QObject {
+           Q_OBJECT
+          
+          private slots:
+           void testAddAvailableSlot(   );
+           void testDuration(   );
+           void testReserveFailure(   );
+           void testReserveImplMaximal(   );
+           void testReserveImplMinimal(   );
+           void testReserveImplQuick(   );
+           void testReserveImplRandom(   );
+           void testReserveSuccess(   );
+          };
+          
+      18  void DayManagerTest::testAddAvailableSlot(   ) {
+           DayManager manager(  QTime(  9,   0 ),   QTime(  12,   0 ) );
+          
+           QCOMPARE(  manager.minDurationMs_,   0 );
+           QVERIFY(  !manager.availableSlots_.isEmpty(   ) );
+           QCOMPARE(  manager.availableSlots_.size(   ),   1 );
+           QCOMPARE(  manager.availableSlots_.value(  QTime(  9,   0 ) ),   QTime(  12,   0 ) );
+          }
+          
+      27  void DayManagerTest::testDuration(   ) {
+           DayManager manager(  QTime(  9,   0 ),   QTime(  12,   0 ) );
+          
+           QCOMPARE(  manager.duration(  QTime(  10,   0 ) ),   {} ); // Print warning
+           QCOMPARE(  manager.duration(  QTime(  9,   0 ) ),   QTime(  3,   0 ) );
+          
+           manager.addAvailableSlot(  QTime(  12,   0 ),   QTime(  13,   0 ) );
+           QCOMPARE(  manager.duration(  QTime(  12,   0 ) ),   QTime(  1,   0 ) );
+          
+           QCOMPARE(  manager.duration(   ),   QTime(  4,   0 ) );
+          }
+          
+      39  void DayManagerTest::testReserveImplQuick(   ) {
+           DayManager manager(  QTime(  9,   0 ),   QTime(  12,   0 ) );
+          
+           for (  int i = 0; i < 3; ++i ) {
+           QCOMPARE(  manager.slotCount(   ),   1 );
+           QTime availableHourCount = manager.duration(  QTime(  9 + i,   0 ) );
+           QCOMPARE(  manager.duration(  QTime(  9 + i,   0 ) ),   QTime(  3 - i,   0 ) );
+          
+           auto [begin,   end] =
+           manager.reserveImplQuick(  QTime(  1,   0 ).msecsSinceStartOfDay(   ) );
+           QVERIFY(  begin.isValid(   ) );
+           QVERIFY(  end.isValid(   ) );
+           }
+          
+           QCOMPARE(  manager.slotCount(   ),   0 );
+          }
+          
+      56  void DayManagerTest::testReserveImplMaximal(   ) {
+           DayManager manager;
+          
+           manager.addAvailableSlot(  QTime(  9,   0 ),   QTime(  12,   0 ) ); // 3 hour; first,   second
+           manager.addAvailableSlot(  QTime(  8,   0 ),   QTime(  9,   0 ) ); // 1 hour
+           manager.addAvailableSlot(  QTime(  12,   0 ),   QTime(  14,   0 ) ); // 2 hour; third
+          
+           auto [begin1,   end1] =
+           manager.reserveImplMaximal(  QTime(  1,   0 ).msecsSinceStartOfDay(   ) );
+           QVERIFY(  begin1.isValid(   ) );
+           QVERIFY(  end1.isValid(   ) );
+           QCOMPARE(  begin1,   QTime(  9,   0 ) );
+          
+           auto [begin2,   end2] =
+           manager.reserveImplMaximal(  QTime(  1,   0 ).msecsSinceStartOfDay(   ) );
+           QVERIFY(  begin2.isValid(   ) );
+           QVERIFY(  end2.isValid(   ) );
+           QCOMPARE(  begin2,   QTime(  10,   0 ) );
+          
+           auto [begin3,   end3] =
+           manager.reserveImplMaximal(  QTime(  1,   0 ).msecsSinceStartOfDay(   ) );
+           QVERIFY(  begin3.isValid(   ) );
+           QVERIFY(  end3.isValid(   ) );
+           QCOMPARE(  begin3,   QTime(  12,   0 ) );
+          
+           QCOMPARE(  manager.slotCount(   ),   3 );
+          }
+          
+      84  void DayManagerTest::testReserveImplMinimal(   ) {
+           DayManager manager;
+          
+           manager.addAvailableSlot(  QTime(  9,   0 ),   QTime(  12,   0 ) ); // 3 hour
+           manager.addAvailableSlot(  QTime(  8,   0 ),   QTime(  9,   0 ) ); // 1 hour; first
+           manager.addAvailableSlot(  QTime(  12,   0 ),   QTime(  14,   0 ) ); // 2 hour; second,   third
+          
+           auto [begin1,   end1] =
+           manager.reserveImplMinimal(  QTime(  1,   0 ).msecsSinceStartOfDay(   ) );
+           QVERIFY(  begin1.isValid(   ) );
+           QVERIFY(  end1.isValid(   ) );
+           QCOMPARE(  begin1,   QTime(  8,   0 ) );
+          
+           auto [begin2,   end2] =
+           manager.reserveImplMinimal(  QTime(  1,   0 ).msecsSinceStartOfDay(   ) );
+           QVERIFY(  begin2.isValid(   ) );
+           QVERIFY(  end2.isValid(   ) );
+           QCOMPARE(  begin2,   QTime(  12,   0 ) );
+          
+           auto [begin3,   end3] =
+           manager.reserveImplMinimal(  QTime(  1,   0 ).msecsSinceStartOfDay(   ) );
+           QVERIFY(  begin3.isValid(   ) );
+           QVERIFY(  end3.isValid(   ) );
+           QCOMPARE(  begin3,   QTime(  13,   0 ) );
+          
+           QCOMPARE(  manager.slotCount(   ),   1 );
+          }
+          
+     112  void DayManagerTest::testReserveImplRandom(   ) {
+           DayManager manager(  QTime(  9,   0 ),   QTime(  12,   0 ) );
+          
+           for (  int i = 0; i < 3; ++i ) {
+           QCOMPARE(  manager.slotCount(   ),   1 );
+           auto [begin,   end] =
+           manager.reserveImplRandom(  QTime(  1,   0 ).msecsSinceStartOfDay(   ) );
+           QVERIFY(  begin.isValid(   ) );
+           QVERIFY(  end.isValid(   ) );
+           }
+          
+           QCOMPARE(  manager.slotCount(   ),   0 );
+          }
+          
+     126  void DayManagerTest::testReserveSuccess(   ) {
+           DayManager manager(  QTime(  9,   0 ),   QTime(  12,   0 ) );
+           manager.setMinDuration(  QTime(  0,   30 ) );
+          
+           auto [begin,   end] = manager.reserve(  QTime(  1,   0 ) );
+           QVERIFY(  begin.isValid(   ) );
+           QVERIFY(  end.isValid(   ) );
+           QCOMPARE(  begin.hour(   ),   9 );
+           QCOMPARE(  end.hour(   ),   10 );
+           QCOMPARE(  end.minute(   ),   0 );
+          
+           std::tie(  begin,   end ) = manager.reserve(  QTime(  1,   30 ) );
+           QVERIFY(  begin.isValid(   ) );
+           QVERIFY(  end.isValid(   ) );
+           QCOMPARE(  begin.hour(   ),   10 );
+           QCOMPARE(  end.hour(   ),   11 );
+           QCOMPARE(  end.minute(   ),   30 );
+          }
+          
+     145  void DayManagerTest::testReserveFailure(   ) {
+           DayManager manager(  QTime(  9,   0 ),   QTime(  12,   0 ) );
+           manager.setMinDuration(  QTime(  0,   30 ) );
+          
+           QCOMPARE(  manager.duration(  QTime(  9,   0 ) ),   QTime(  3,   0 ) );
+          
+           QTime begin,   end;
+          
+           std::tie(  begin,   end ) = manager.reserve(  QTime(  4,   0 ) );
+           QVERIFY(  !begin.isValid(   ) );
+           QVERIFY(  !end.isValid(   ) );
+          
+           std::tie(  begin,   end ) = manager.reserve(  QTime(  3,   0,   1 ) );
+           QVERIFY(  !begin.isValid(   ) );
+           QVERIFY(  !end.isValid(   ) );
+          
+           std::tie(  begin,   end ) = manager.reserve(  QTime(  2,   30 ) );
+           QVERIFY(  begin.isValid(   ) );
+           QVERIFY(  end.isValid(   ) );
+           QVERIFY(  !manager.availableSlots_.isEmpty(   ) );
+           QCOMPARE(  manager.duration(  end ),   QTime(  0,   30 ) );
+          
+           std::tie(  begin,   end ) = manager.reserve(  QTime(  0,   0,   1 ) );
+           QVERIFY(  begin.isValid(   ) );
+           QVERIFY(  end.isValid(   ) );
+           QCOMPARE(  begin.msecsTo(  end ),   QTime(  0,   0,   1 ).msecsSinceStartOfDay(   ) );
+           QVERIFY(  manager.availableSlots_.isEmpty(   ) );
+          }
+          
+     174  QTEST_MAIN(  DayManagerTest )
+          #include "day_manager_test.moc"
+
+

./tests_class/reservation_manager_test.cpp

+ +       1  #include "reservation_manager.h"
+          #include <QtTest>
+          
+       4  class ReservationManagerTest : public QObject {
+           Q_OBJECT
+          
+          private slots:
+           void testReserveFailure(   );
+           void testReserveSuccess(   );
+           void testReserveBound(   );
+          };
+          
+      13  void ReservationManagerTest::testReserveFailure(   ) {
+           DayManager dayManager(  QTime(  8,   0 ),   QTime(  9,   0 ) );
+           ReservationManager manager(  3,   3,   dayManager );
+          
+           QDateTime begin;
+           QTime end;
+          
+           std::tie(  begin,   end ) = manager.reserve(  QTime(  2,   0 ) );
+           QVERIFY(  !begin.isValid(   ) );
+           QVERIFY(  !end.isValid(   ) );
+          }
+          
+      25  void ReservationManagerTest::testReserveSuccess(   ) {
+           DayManager dayManager(  QTime(  8,   0 ),   QTime(  9,   0 ) );
+           ReservationManager manager(  3,   4,   dayManager );
+          
+           QDateTime begin;
+           QTime end;
+          
+           for (  int i = 0; i < 3; ++i ) {
+           std::tie(  begin,   end ) = manager.reserve(  QTime(  1,   0 ) );
+           QVERIFY(  begin.isValid(   ) );
+           QVERIFY(  end.isValid(   ) );
+           }
+           QCOMPARE(  manager.days_.size(   ),   1 );
+          
+           const auto &keys = manager.days_.keys(   );
+           auto it = std::find_if(  keys.cbegin(   ),   keys.cend(   ),   [](  const auto &key ) {
+           for (  auto expected : {1,   2,   3,   4} ) {
+           if (  key == expected ) {
+           return true;
+           }
+           }
+           return false;
+           } );
+          
+           QVERIFY(  it != keys.cend(   ) );
+          }
+          
+      52  void ReservationManagerTest::testReserveBound(   ) {
+           DayManager dayManager(  QTime(  8,   0 ),   QTime(  9,   0 ) );
+           ReservationManager manager(  3,   4,   dayManager );
+          
+           QDateTime begin;
+           QTime end;
+          
+           for (  int i = 0; i < 4; ++i ) {
+           std::tie(  begin,   end ) = manager.reserve(  QTime(  1,   0 ) );
+           QVERIFY(  begin.isValid(   ) );
+           QVERIFY(  end.isValid(   ) );
+           }
+           QVERIFY(  manager.days_.isEmpty(   ) );
+          }
+          
+      67  QTEST_MAIN(  ReservationManagerTest )
+          #include "reservation_manager_test.moc"
+
+

./tests_schema/tests/main_test.cpp

+ +       1  #include <gtest/gtest.h>
+          
+       3  int main(  int argc,   char **argv ) {
+           ::testing::InitGoogleTest(  &argc,   argv );
+           return RUN_ALL_TESTS(   );
+          }
+
+

./tests_schema/tests/sqlite_database_crud_test.cpp

+ +          #include "sqlite_database.h"
+          #include "sqlite_file_executor.h"
+          #include "gtest/gtest.h"
+          
+          // WARNING: Foreign keys are off
+          // WARNING: Triggers are off
+          
+          const std::string TEST_DB = "test.db";
+          
+          // Test fixture for SQLiteDatabase
+      11  class SQLiteDatabaseCRUDTest : public ::testing::Test {
+          protected:
+      13   SQLiteDatabase *db_;
+          
+           void SetUp(   ) override {
+           db_ = new SQLiteDatabase(  TEST_DB );
+           SQLiteFileExecutor executor(  TEST_DB );
+           executor.executeSQLFile(  "sql/cinema_db_drop_table.sql" );
+           executor.executeSQLFile(  "sql/cinema_db_create_table.sql" );
+          
+           // Not necessarily,   since the default setting
+           std::string sql;
+           FileReaderInterface *reader = &executor;
+           reader->read(  "sql/cinema_db_foreign_key_off.sql",   sql );
+           db_->executeNonQuery(  sql );
+           }
+          
+           void TearDown(   ) override {
+           delete db_;
+      30   remove(  TEST_DB.c_str(   ) );
+           }
+          };
+          
+          // INFO: ----- GENERAL -----
+          
+          // Check that the test fixture is working
+          class SimpleClass : public ::testing::Test {
+          protected:
+           void SetUp(   ) override {}
+           void TearDown(   ) override {}
+          };
+          // Simle test
+          TEST_F(  SimpleClass,   SimpleTest ) { EXPECT_EQ(  1,   1 ); }
+          
+          // INFO: ----- GENERAL -----
+          
+          // Test checking if the database is available
+          TEST_F(  SQLiteDatabaseCRUDTest,   IsDatabaseAvailable ) {
+           EXPECT_TRUE(  db_->isDatabaseAvailable(   ) );
+          }
+          
+          // INFO: ----- GENRE -----
+          
+          // Test adding a genre
+          TEST_F(  SQLiteDatabaseCRUDTest,   AddGenre ) {
+           NewGenre genre{"Action"};
+           EXPECT_TRUE(  db_->addGenre(  genre ) );
+          
+           auto genres = db_->getAllGenres(   );
+           ASSERT_EQ(  genres.size(   ),   1 );
+           EXPECT_EQ(  genres[0].genre_name,   "Action" );
+          }
+          
+          // Test getting a genre by ID
+          TEST_F(  SQLiteDatabaseCRUDTest,   GetGenreById ) {
+           NewGenre genre{"Drama"};
+           db_->addGenre(  genre );
+          
+           Genre retrieved_genre = db_->getGenre(  1 );
+           EXPECT_EQ(  retrieved_genre.genre_id,   1 );
+           EXPECT_EQ(  retrieved_genre.genre_name,   "Drama" );
+          }
+          
+          // Test updating a genre
+          TEST_F(  SQLiteDatabaseCRUDTest,   UpdateGenre ) {
+           NewGenre genre{"Drama"};
+           db_->addGenre(  genre );
+          
+           Genre updated_genre = db_->getGenre(  1 );
+           updated_genre.genre_name = "Horror";
+           EXPECT_TRUE(  db_->updateGenre(  updated_genre ) );
+          
+           Genre retrieved_genre = db_->getGenre(  1 );
+           EXPECT_EQ(  retrieved_genre.genre_id,   1 );
+           EXPECT_EQ(  retrieved_genre.genre_name,   "Horror" );
+          }
+          
+          // Test removing a genre
+          TEST_F(  SQLiteDatabaseCRUDTest,   RemoveGenre ) {
+           NewGenre genre{"Horror"};
+           db_->addGenre(  genre );
+           EXPECT_TRUE(  db_->removeGenre(  1 ) );
+          
+           auto genres = db_->getAllGenres(   );
+           EXPECT_TRUE(  genres.empty(   ) );
+          }
+          
+          // Test getting all genres
+          TEST_F(  SQLiteDatabaseCRUDTest,   GetAllGenres ) {
+           db_->addGenre(  {"Comedy"} );
+           db_->addGenre(  {"Thriller"} );
+          
+           auto genres = db_->getAllGenres(   );
+           ASSERT_EQ(  genres.size(   ),   2 );
+           EXPECT_EQ(  genres[0].genre_name,   "Comedy" );
+           EXPECT_EQ(  genres[1].genre_name,   "Thriller" );
+          }
+          
+          // INFO: ----- MOVIE -----
+          
+          // Test adding a movie
+          TEST_F(  SQLiteDatabaseCRUDTest,   AddMovie ) {
+           NewMovie movie{"The Shawshank Redemption",   1,   142};
+           EXPECT_TRUE(  db_->addMovie(  movie ) );
+          
+           auto movies = db_->getAllMovies(   );
+           ASSERT_EQ(  movies.size(   ),   1 );
+           EXPECT_EQ(  movies[0].title,   "The Shawshank Redemption" );
+           EXPECT_EQ(  movies[0].genre_id,   1 );
+           EXPECT_EQ(  movies[0].duration,   142 );
+          }
+          
+          // Test getting a movie by ID
+          TEST_F(  SQLiteDatabaseCRUDTest,   GetMovieById ) {
+           NewMovie movie{"The Godfather",   2,   175};
+           db_->addMovie(  movie );
+          
+           Movie retrieved_movie = db_->getMovie(  1 );
+           EXPECT_EQ(  retrieved_movie.movie_id,   1 );
+           EXPECT_EQ(  retrieved_movie.title,   "The Godfather" );
+           EXPECT_EQ(  retrieved_movie.genre_id,   2 );
+           EXPECT_EQ(  retrieved_movie.duration,   175 );
+          }
+          
+          // Test removing a movie
+          TEST_F(  SQLiteDatabaseCRUDTest,   RemoveMovie ) {
+           NewMovie movie{"The Dark Knight",   3,   152};
+           db_->addMovie(  movie );
+           EXPECT_TRUE(  db_->removeMovie(  1 ) );
+          
+           auto movies = db_->getAllMovies(   );
+           EXPECT_TRUE(  movies.empty(   ) );
+          }
+          
+          // Test updating a movie
+          TEST_F(  SQLiteDatabaseCRUDTest,   UpdateMovie ) {
+           NewMovie movie{"The Shawshank Redemption",   1,   142};
+           db_->addMovie(  movie );
+          
+           Movie updated_movie = db_->getMovie(  1 );
+           updated_movie.title = "The Godfather";
+           updated_movie.duration = 155;
+           EXPECT_TRUE(  db_->updateMovie(  updated_movie ) );
+          
+           Movie retrieved_movie = db_->getMovie(  1 );
+           EXPECT_EQ(  retrieved_movie.movie_id,   1 );
+           EXPECT_EQ(  retrieved_movie.title,   "The Godfather" );
+           EXPECT_EQ(  retrieved_movie.genre_id,   1 );
+           EXPECT_EQ(  retrieved_movie.duration,   155 );
+          }
+          
+          // Test getting all movies
+          TEST_F(  SQLiteDatabaseCRUDTest,   GetAllMovies ) {
+           db_->addMovie(  {"The Shawshank Redemption",   1,   142} );
+           db_->addMovie(  {"The Godfather",   2,   175} );
+          
+           auto movies = db_->getAllMovies(   );
+           ASSERT_EQ(  movies.size(   ),   2 );
+           EXPECT_EQ(  movies[0].title,   "The Shawshank Redemption" );
+           EXPECT_EQ(  movies[0].genre_id,   1 );
+           EXPECT_EQ(  movies[0].duration,   142 );
+           EXPECT_EQ(  movies[1].title,   "The Godfather" );
+           EXPECT_EQ(  movies[1].genre_id,   2 );
+           EXPECT_EQ(  movies[1].duration,   175 );
+          }
+          
+          // INFO: ----- HALL -----
+          
+          // Test adding a hall
+          TEST_F(  SQLiteDatabaseCRUDTest,   AddHall ) {
+           NewHall hall{"Hall 1",   132};
+           EXPECT_TRUE(  db_->addHall(  hall ) );
+          
+           auto halls = db_->getAllHalls(   );
+           ASSERT_EQ(  halls.size(   ),   1 );
+           EXPECT_EQ(  halls[0].hall_id,   1 );
+           EXPECT_EQ(  halls[0].hall_name,   "Hall 1" );
+           EXPECT_EQ(  halls[0].capacity,   132 );
+          }
+          
+          // Test getting a hall by ID
+          TEST_F(  SQLiteDatabaseCRUDTest,   GetHallById ) {
+           NewHall hall{"Hall 2",   142};
+           db_->addHall(  hall );
+          
+           Hall retrieved_hall = db_->getHall(  1 );
+           EXPECT_EQ(  retrieved_hall.hall_id,   1 );
+           EXPECT_EQ(  retrieved_hall.hall_name,   "Hall 2" );
+           EXPECT_EQ(  retrieved_hall.capacity,   142 );
+          }
+          
+          // Test removing a hall
+          TEST_F(  SQLiteDatabaseCRUDTest,   RemoveHall ) {
+           NewHall hall{"Hall 3",   152};
+           db_->addHall(  hall );
+           EXPECT_TRUE(  db_->removeHall(  1 ) );
+          
+           auto halls = db_->getAllHalls(   );
+           EXPECT_TRUE(  halls.empty(   ) );
+          }
+          
+          // Test updating a hall
+          TEST_F(  SQLiteDatabaseCRUDTest,   UpdateHall ) {
+           NewHall hall{"Hall 4",   162};
+           db_->addHall(  hall );
+          
+           Hall updated_hall = db_->getHall(  1 );
+           updated_hall.hall_name = "Hall 5";
+           updated_hall.capacity = 172;
+           EXPECT_TRUE(  db_->updateHall(  updated_hall ) );
+          
+           Hall retrieved_hall = db_->getHall(  1 );
+           EXPECT_EQ(  retrieved_hall.hall_id,   1 );
+           EXPECT_EQ(  retrieved_hall.hall_name,   "Hall 5" );
+           EXPECT_EQ(  retrieved_hall.capacity,   172 );
+          }
+          
+          // Test getting all halls
+          TEST_F(  SQLiteDatabaseCRUDTest,   GetAllHalls ) {
+           db_->addHall(  {"Hall 6",   172} );
+           db_->addHall(  {"Hall 7",   182} );
+          
+           auto halls = db_->getAllHalls(   );
+           ASSERT_EQ(  halls.size(   ),   2 );
+           EXPECT_EQ(  halls[0].hall_id,   1 );
+           EXPECT_EQ(  halls[0].hall_name,   "Hall 6" );
+           EXPECT_EQ(  halls[0].capacity,   172 );
+           EXPECT_EQ(  halls[1].hall_id,   2 );
+           EXPECT_EQ(  halls[1].hall_name,   "Hall 7" );
+           EXPECT_EQ(  halls[1].capacity,   182 );
+          }
+          
+          // INFO: ----- SESSION -----
+          
+          // Test adding a session
+          TEST_F(  SQLiteDatabaseCRUDTest,   AddSession ) {
+           NewSession session{1,   1,   "2025-01-01 12:00:00",   10};
+           EXPECT_TRUE(  db_->addSession(  session ) );
+          
+           auto sessions = db_->getAllSessions(   );
+           ASSERT_EQ(  sessions.size(   ),   1 );
+           EXPECT_EQ(  sessions[0].movie_id,   1 );
+           EXPECT_EQ(  sessions[0].hall_id,   1 );
+           EXPECT_EQ(  sessions[0].begin_at,   "2025-01-01 12:00:00" );
+           EXPECT_EQ(  sessions[0].ticket_price,   10 );
+          }
+          
+          // Test getting a session by ID
+          TEST_F(  SQLiteDatabaseCRUDTest,   GetSessionById ) {
+           NewSession session{2,   2,   "2025-01-01 12:00:00",   10};
+           db_->addSession(  session );
+          
+           Session retrieved_session = db_->getSession(  1 );
+           EXPECT_EQ(  retrieved_session.session_id,   1 );
+           EXPECT_EQ(  retrieved_session.movie_id,   2 );
+           EXPECT_EQ(  retrieved_session.hall_id,   2 );
+           EXPECT_EQ(  retrieved_session.begin_at,   "2025-01-01 12:00:00" );
+           EXPECT_EQ(  retrieved_session.ticket_price,   10 );
+          }
+          
+          // Test removing a session
+          TEST_F(  SQLiteDatabaseCRUDTest,   RemoveSession ) {
+           NewSession session{3,   3,   "2025-01-01 12:00:00",   10};
+           db_->addSession(  session );
+           EXPECT_TRUE(  db_->removeSession(  1 ) );
+          
+           auto sessions = db_->getAllSessions(   );
+           EXPECT_TRUE(  sessions.empty(   ) );
+          }
+          
+          // Test updating a session
+          TEST_F(  SQLiteDatabaseCRUDTest,   UpdateSession ) {
+           NewSession session{4,   4,   "2025-01-01 12:00:00",   10};
+           db_->addSession(  session );
+          
+           Session updated_session = db_->getSession(  1 );
+           updated_session.begin_at = "2025-01-01 13:00:00";
+           EXPECT_TRUE(  db_->updateSession(  updated_session ) );
+          
+           Session retrieved_session = db_->getSession(  1 );
+           EXPECT_EQ(  retrieved_session.session_id,   1 );
+           EXPECT_EQ(  retrieved_session.movie_id,   4 );
+           EXPECT_EQ(  retrieved_session.hall_id,   4 );
+           EXPECT_EQ(  retrieved_session.begin_at,   "2025-01-01 13:00:00" );
+           EXPECT_EQ(  retrieved_session.ticket_price,   10 );
+          }
+          
+          // Test getting all sessions
+          TEST_F(  SQLiteDatabaseCRUDTest,   GetAllSessions ) {
+           db_->addSession(  {5,   5,   "2025-01-01 12:00:00",   10} );
+           db_->addSession(  {6,   6,   "2025-01-01 13:00:00",   10} );
+          
+           auto sessions = db_->getAllSessions(   );
+           ASSERT_EQ(  sessions.size(   ),   2 );
+           EXPECT_EQ(  sessions[0].movie_id,   5 );
+           EXPECT_EQ(  sessions[0].hall_id,   5 );
+           EXPECT_EQ(  sessions[0].begin_at,   "2025-01-01 12:00:00" );
+           EXPECT_EQ(  sessions[0].ticket_price,   10 );
+           EXPECT_EQ(  sessions[1].movie_id,   6 );
+           EXPECT_EQ(  sessions[1].hall_id,   6 );
+           EXPECT_EQ(  sessions[1].begin_at,   "2025-01-01 13:00:00" );
+           EXPECT_EQ(  sessions[1].ticket_price,   10 );
+          }
+          
+          // INFO: ----- TICKET -----
+          
+          // Test adding a ticket
+          TEST_F(  SQLiteDatabaseCRUDTest,   AddTicket ) {
+           NewTicket ticket{1,   1,   "2025-01-01 12:00:00"};
+           EXPECT_TRUE(  db_->addTicket(  ticket ) );
+          
+           auto tickets = db_->getAllTickets(   );
+           ASSERT_EQ(  tickets.size(   ),   1 );
+           EXPECT_EQ(  tickets[0].session_id,   1 );
+           EXPECT_EQ(  tickets[0].seat_number,   1 );
+           EXPECT_EQ(  tickets[0].sold_at,   "2025-01-01 12:00:00" );
+          }
+          
+          // Test getting a ticket by ID
+          TEST_F(  SQLiteDatabaseCRUDTest,   GetTicketById ) {
+           NewTicket ticket{2,   2,   "2025-01-01 12:00:00"};
+           db_->addTicket(  ticket );
+          
+           Ticket retrieved_ticket = db_->getTicket(  1 );
+           EXPECT_EQ(  retrieved_ticket.ticket_id,   1 );
+           EXPECT_EQ(  retrieved_ticket.session_id,   2 );
+           EXPECT_EQ(  retrieved_ticket.seat_number,   2 );
+           EXPECT_EQ(  retrieved_ticket.sold_at,   "2025-01-01 12:00:00" );
+          }
+          
+          // Test removing a ticket
+          TEST_F(  SQLiteDatabaseCRUDTest,   RemoveTicket ) {
+           NewTicket ticket{3,   3,   "2025-01-01 12:00:00"};
+           db_->addTicket(  ticket );
+           EXPECT_TRUE(  db_->removeTicket(  1 ) );
+          
+           auto tickets = db_->getAllTickets(   );
+           EXPECT_TRUE(  tickets.empty(   ) );
+          }
+          
+          // Test updating a ticket
+          TEST_F(  SQLiteDatabaseCRUDTest,   UpdateTicket ) {
+           NewTicket ticket{4,   4,   "2025-01-01 12:00:00"};
+           db_->addTicket(  ticket );
+          
+           Ticket updated_ticket = db_->getTicket(  1 );
+           updated_ticket.seat_number = 5;
+           EXPECT_TRUE(  db_->updateTicket(  updated_ticket ) );
+          
+           Ticket retrieved_ticket = db_->getTicket(  1 );
+           EXPECT_EQ(  retrieved_ticket.ticket_id,   1 );
+           EXPECT_EQ(  retrieved_ticket.session_id,   4 );
+           EXPECT_EQ(  retrieved_ticket.seat_number,   5 );
+           EXPECT_EQ(  retrieved_ticket.sold_at,   "2025-01-01 12:00:00" );
+          }
+          
+          // Test getting all tickets
+          TEST_F(  SQLiteDatabaseCRUDTest,   GetAllTickets ) {
+           db_->addTicket(  {5,   5,   "2025-01-01 12:00:00"} );
+           db_->addTicket(  {6,   6,   "2025-01-01 13:00:00"} );
+          
+           auto tickets = db_->getAllTickets(   );
+           ASSERT_EQ(  tickets.size(   ),   2 );
+           EXPECT_EQ(  tickets[0].session_id,   5 );
+           EXPECT_EQ(  tickets[0].seat_number,   5 );
+           EXPECT_EQ(  tickets[0].sold_at,   "2025-01-01 12:00:00" );
+           EXPECT_EQ(  tickets[1].session_id,   6 );
+           EXPECT_EQ(  tickets[1].seat_number,   6 );
+           EXPECT_EQ(  tickets[1].sold_at,   "2025-01-01 13:00:00" );
+          }
+
+

./tests_schema/tests/sqlite_database_foreign_key_test.cpp

+ +          #include "sqlite_database.h"
+          #include "sqlite_file_executor.h"
+          #include "gtest/gtest.h"
+          
+          // WARNING: Triggers are off
+          
+          const std::string TEST_DB = "test.db";
+          
+          // Test fixture for SQLiteDatabase
+      10  class SQLiteDatabaseForeignKeyTest : public ::testing::Test {
+          
+          protected:
+      13   SQLiteDatabase *db_;
+          
+          public:
+           // void pragmaForeignKeysOn(   ) {
+           // const std::string query = "PRAGMA foreign_keys = ON;";
+           // db_->executeNonQuery(  query );
+           // }
+          
+           std::vector<std::vector<std::string>> pragmaForeignKeys(   ) {
+           const std::string query = "PRAGMA foreign_keys;";
+           auto results = db_->executeSelectQuery(  query );
+           return results;
+           }
+          
+          protected:
+           void SetUp(   ) override {
+           db_ = new SQLiteDatabase(  TEST_DB );
+      30   SQLiteFileExecutor executor(  TEST_DB );
+      31   executor.executeSQLFile(  "sql/cinema_db_drop_table.sql" );
+      32   executor.executeSQLFile(  "sql/cinema_db_create_table.sql" );
+          
+           // pragmaForeignKeysOn(   );
+          
+           std::string sql;
+           FileReaderInterface *reader = &executor;
+           reader->read(  "sql/cinema_db_foreign_key_on.sql",   sql );
+           db_->executeNonQuery(  sql );
+           }
+          
+           void TearDown(   ) override {
+           delete db_;
+           remove(  TEST_DB.c_str(   ) );
+           }
+          };
+          
+          // INFO: ----- GENERAL -----
+          
+          // Check pragma foreign_keys is true
+          TEST_F(  SQLiteDatabaseForeignKeyTest,   PragmaForeignKeys ) {
+           auto results = pragmaForeignKeys(   );
+           ASSERT_FALSE(  results.empty(   ) );
+           ASSERT_EQ(  results[0][0],   "1" );
+          }
+          
+          // Test adding a movie
+          TEST_F(  SQLiteDatabaseForeignKeyTest,   AddMovie ) {
+           NewMovie movie{"The Shawshank Redemption",   1,   142};
+           EXPECT_FALSE(  db_->addMovie(  movie ) );
+          
+           auto movies = db_->getAllMovies(   );
+           ASSERT_TRUE(  movies.empty(   ) );
+          
+           NewGenre genre{"Drama"};
+           EXPECT_TRUE(  db_->addGenre(  genre ) );
+           EXPECT_TRUE(  db_->addMovie(  movie ) );
+           movies = db_->getAllMovies(   );
+           ASSERT_FALSE(  movies.empty(   ) );
+          }
+          
+          // Test adding session
+          TEST_F(  SQLiteDatabaseForeignKeyTest,   AddSession ) {
+           NewSession session{1,   1,   "2025-01-01 12:00:00",   10};
+           EXPECT_FALSE(  db_->addSession(  session ) );
+          
+           NewHall hall{"Hall 1",   100};
+           db_->addHall(  hall );
+           EXPECT_FALSE(  db_->addSession(  session ) );
+          
+           NewGenre genre{"Drama"};
+           db_->addGenre(  genre );
+           NewMovie movie{"The Shawshank Redemption",   1,   142};
+           db_->addMovie(  movie );
+           EXPECT_TRUE(  db_->addSession(  session ) );
+          }
+          
+          // Test adding ticket
+          TEST_F(  SQLiteDatabaseForeignKeyTest,   AddTicket ) {
+           NewTicket ticket{1,   1,   "2025-01-01 12:00:00"};
+           EXPECT_FALSE(  db_->addTicket(  ticket ) );
+          
+           NewHall hall{"Hall 1",   100};
+           db_->addHall(  hall );
+           NewGenre genre{"Drama"};
+           db_->addGenre(  genre );
+           NewMovie movie{"The Shawshank Redemption",   1,   142};
+           db_->addMovie(  movie );
+           NewSession session{1,   1,   "2025-01-01 12:00:00",   10};
+           db_->addSession(  session );
+          
+           EXPECT_TRUE(  db_->addTicket(  ticket ) );
+          }
+
+

./tests_schema/tests/sqlite_database_trigger_test.cpp

+ +          #include "sqlite_database.h"
+          #include "sqlite_file_executor.h"
+          #include "gtest/gtest.h"
+          
+          // WARNING: Foreign keys are off
+          
+          const std::string TEST_DB = "test.db";
+          
+          // Test fixture for SQLiteDatabase
+      10  class SQLiteDatabaseTriggerTest : public ::testing::Test {
+          protected:
+      12   SQLiteDatabase *db_;
+          
+           void SetUp(   ) override {
+           db_ = new SQLiteDatabase(  TEST_DB );
+           SQLiteFileExecutor executor(  TEST_DB );
+           executor.executeSQLFile(  "sql/cinema_db_drop_table.sql" );
+           executor.executeSQLFile(  "sql/cinema_db_create_table.sql" );
+           executor.executeSQLFile(  "sql/cinema_db_drop_trigger.sql" );
+           executor.executeSQLFile(  "sql/cinema_db_create_trigger.sql" );
+          
+           // Not necessarily,   since the default setting
+           std::string sql;
+           FileReaderInterface *reader = &executor;
+           reader->read(  "sql/cinema_db_foreign_key_off.sql",   sql );
+           db_->executeNonQuery(  sql );
+           }
+          
+           void TearDown(   ) override {
+           delete db_;
+      31   remove(  TEST_DB.c_str(   ) );
+           }
+          };
+          
+          // INFO: ----- TICKET -----
+          
+          // Test trigger check_seat_number
+          TEST_F(  SQLiteDatabaseTriggerTest,   CheckSeatNumber ) {
+           db_->addHall(  {"Hall 1",   100} );
+           db_->addSession(  {1,   1,   "2025-01-01 12:00:00",   10} );
+          
+           NewTicket ticket;
+           ticket.session_id = 1;
+           ticket.sold_at = "2025-01-01 12:00:00";
+          
+           ticket.seat_number = 101;
+           EXPECT_FALSE(  db_->addTicket(  ticket ) );
+          
+           ticket.seat_number = 100;
+           EXPECT_TRUE(  db_->addTicket(  ticket ) );
+          
+           ticket.seat_number = 1;
+           EXPECT_TRUE(  db_->addTicket(  ticket ) );
+          }
+          
+          // Test trigger check_session_not_started
+          TEST_F(  SQLiteDatabaseTriggerTest,   CheckSessionNotStarted ) {
+           db_->addSession(  {1,   1,   "2025-01-01 12:00:00",   10} );
+          
+           NewTicket ticket;
+           ticket.session_id = 1;
+           ticket.seat_number = 1;
+          
+           ticket.sold_at = "2025-01-01 13:00:00";
+           EXPECT_FALSE(  db_->addTicket(  ticket ) );
+          
+           ticket.sold_at = "2025-01-01 11:00:00";
+           EXPECT_TRUE(  db_->addTicket(  ticket ) );
+          
+           ticket.seat_number = 2;
+           ticket.sold_at = "2025-01-01 12:00:00";
+           EXPECT_TRUE(  db_->addTicket(  ticket ) );
+          }
+          
+          // Test trigger prevent_late_ticket_purchase
+          TEST_F(  SQLiteDatabaseTriggerTest,   PreventLateTicketPurchase ) {
+           db_->addHall(  {"Hall 1",   100} );
+           db_->addSession(  {1,   1,   "2025-01-01 12:00:00",   10} );
+          
+           NewTicket ticket;
+           ticket.session_id = 1;
+           ticket.seat_number = 1;
+          
+           ticket.sold_at = "2025-01-01 13:00:00";
+           EXPECT_FALSE(  db_->addTicket(  ticket ) );
+          
+           ticket.sold_at = "2025-01-01 12:00:00";
+           EXPECT_TRUE(  db_->addTicket(  ticket ) );
+          
+           ticket.seat_number = 2;
+           ticket.sold_at = "2025-01-01 11:00:00";
+           EXPECT_TRUE(  db_->addTicket(  ticket ) );
+          }
+          
+          // INFO: ----- REFUND -----
+          
+          // Test trigger validate_refund_amount
+          TEST_F(  SQLiteDatabaseTriggerTest,   ValidateRefundAmount ) {
+           db_->addHall(  {"Hall 1",   100} );
+           db_->addSession(  {1,   1,   "2025-01-01 12:00:00",   10} );
+          
+           // ID 1
+           db_->addTicket(  {1,   1,   "2025-01-01 10:00:00"} );
+           // ID 2
+           db_->addTicket(  {1,   2,   "2025-01-01 10:00:00"} );
+          
+           NewRefund refund;
+           refund.ticket_id = 1;
+           refund.refund_at = "2025-01-01 11:00:00";
+          
+           refund.refund_amount = 11;
+           EXPECT_FALSE(  db_->addRefund(  refund ) );
+          
+           refund.refund_amount = 10;
+           EXPECT_TRUE(  db_->addRefund(  refund ) );
+          
+           refund.ticket_id = 2;
+           refund.refund_amount = 9;
+           EXPECT_TRUE(  db_->addRefund(  refund ) );
+          }
+          
+          // Test trigger validate_refund_date
+          TEST_F(  SQLiteDatabaseTriggerTest,   ValidateRefundDate ) {
+           db_->addHall(  {"Hall 1",   100} );
+           db_->addSession(  {1,   1,   "2025-01-01 12:00:00",   10} );
+          
+           // ID 1
+           db_->addTicket(  {1,   1,   "2025-01-01 10:00:00"} );
+           // ID 2
+           db_->addTicket(  {1,   2,   "2025-01-01 10:00:00"} );
+          
+           NewRefund refund;
+           refund.ticket_id = 1;
+           refund.refund_amount = 10;
+          
+           refund.refund_at = "2025-01-01 09:00:00";
+           EXPECT_FALSE(  db_->addRefund(  refund ) );
+          
+           refund.refund_at = "2025-01-01 11:00:00";
+           EXPECT_TRUE(  db_->addRefund(  refund ) );
+          
+           refund.refund_at = "2025-01-01 12:00:00";
+           EXPECT_FALSE(  db_->addRefund(  refund ) );
+          }
+
+

./tests_schema/tests_sources/file_reader.cpp

+ +       1  #include "file_reader.h"
+          
+          #include <fstream>
+          #include <iostream>
+          #include <sstream>
+          
+          // Read a SQL file
+       8  bool FileReader::read(  const std::string &sqlFilePath,   std::string &sql ) {
+           // Try read the SQL file
+           std::ifstream file(  sqlFilePath );
+           if (  !file.is_open(   ) ) {
+           std::cerr << "Error opening file:" << sqlFilePath << std::endl;
+           return false;
+           }
+          
+           std::stringstream buffer;
+           buffer << file.rdbuf(   );
+          
+           sql = buffer.str(   );
+           file.close(   );
+          
+           return true;
+          }
+
+

./tests_schema/tests_sources/sqlite_database.cpp

+ +       1  #include "sqlite_database.h"
+          
+          #include "sqlite_statement.h"
+          #include <iostream>
+          #include <utility> // std::exchange
+          
+          // Constructor: Opens the SQLite database
+       8  SQLiteDatabase::SQLiteDatabase(  const std::string &db_file ) {
+           // WARNING: The database is not blocked
+           if (  sqlite3_open(  db_file.c_str(   ),   &db_ ) != SQLITE_OK ) {
+           std::cerr << "Failed to open database:" << sqlite3_errmsg(  db_ ) << std::endl;
+           db_ = nullptr;
+           }
+          }
+          
+          // Destructor: Closes the database connection
+      17  SQLiteDatabase::~SQLiteDatabase(   ) {
+           if (  db_ ) {
+           sqlite3_close(  db_ );
+           }
+          }
+          
+      23  SQLiteDatabase::SQLiteDatabase(  SQLiteDatabase &&other ) noexcept
+           : db_(  std::exchange(  other.db_,   nullptr ) ) {}
+          
+      26  SQLiteDatabase &SQLiteDatabase::operator=(  SQLiteDatabase &&other ) noexcept {
+           if (  this != &other ) {
+           if (  db_ ) {
+           sqlite3_close(  db_ );
+           }
+           db_ = std::exchange(  other.db_,   nullptr );
+           }
+           return *this;
+          }
+          
+          // Helper function for executing non-SELECT queries
+      37  int SQLiteDatabase::executeNonQuery(  
+      38   const std::string &query,  
+      39   const std::function<void(  SQLiteStatement & )> &bindFunc ) {
+           SQLiteStatement stmt(  db_,   query );
+          
+           if (  db_ == nullptr ) {
+           throw std::runtime_error(  "Database is not open" );
+           }
+          
+           if (  bindFunc ) {
+           bindFunc(  stmt );
+           }
+          
+           if (  !stmt.execute(   ) ) {
+           std::cerr << "Failed to execute query:" << sqlite3_errmsg(  db_ );
+           }
+          
+           return stmt.changes(   );
+          }
+          
+          // Helper function for executing SELECT queries
+      58  std::vector<std::vector<std::string>> SQLiteDatabase::executeSelectQuery(  
+           const std::string &query,  
+           const std::function<void(  SQLiteStatement & )> &bindFunc ) {
+           std::vector<std::vector<std::string>> results;
+           SQLiteStatement stmt(  db_,   query );
+          
+           if (  db_ == nullptr ) {
+           throw std::runtime_error(  "Database is not open" );
+           }
+          
+           if (  bindFunc ) {
+           bindFunc(  stmt );
+           }
+          
+           while (  stmt.step(   ) ) {
+           std::vector<std::string> row;
+           for (  int i = 0,   count = stmt.getColumnCount(   ); i < count; ++i ) {
+           row.emplace_back(  stmt.getColumnText(  i ) );
+           }
+           results.push_back(  row );
+           }
+          
+           return results;
+          }
+          
+          // INFO: ----- GENRE -----
+          
+          // Add a new genre
+      86  bool SQLiteDatabase::addGenre(  const NewGenre &genre ) {
+           const std::string query = "INSERT INTO genres (  genre_name ) VALUES (  ? );";
+           int changes = executeNonQuery(  query,   [&genre](  SQLiteStatement &stmt ) {
+           stmt.bind(  1,   genre.genre_name );
+           } );
+          
+           return changes > 0;
+          }
+          
+          // Remove a genre by ID
+      96  bool SQLiteDatabase::removeGenre(  int genre_id ) {
+           const std::string query = "DELETE FROM genres WHERE genre_id = ?;";
+           int changes = executeNonQuery(  
+           query,   [&genre_id](  SQLiteStatement &stmt ) { stmt.bind(  1,   genre_id ); } );
+          
+           return changes > 0;
+          }
+          
+          // Update an existing genre
+     105  bool SQLiteDatabase::updateGenre(  const Genre &genre ) {
+           const std::string query =
+           "UPDATE genres SET genre_name = ? WHERE genre_id = ?;";
+           int changes = executeNonQuery(  query,   [&genre](  SQLiteStatement &stmt ) {
+           stmt.bind(  1,   genre.genre_name );
+           stmt.bind(  2,   genre.genre_id );
+           } );
+          
+           return changes > 0;
+          }
+          
+          // Get a genre by ID
+     117  Genre SQLiteDatabase::getGenre(  int genre_id ) {
+           const std::string query = "SELECT * FROM genres WHERE genre_id = ?;";
+           auto result = executeSelectQuery(  
+           query,   [&genre_id](  SQLiteStatement &stmt ) { stmt.bind(  1,   genre_id ); } );
+          
+           if (  !result.empty(   ) ) {
+           auto genre_id = std::stoi(  result[0][0] );
+           auto genre_name = result[0][1];
+           Genre genre(  genre_id,   genre_name );
+           return genre;
+           }
+           return {};
+          }
+          
+          // Get all genres
+     132  std::vector<Genre> SQLiteDatabase::getAllGenres(   ) {
+           const std::string query = "SELECT * FROM genres;";
+           auto result = executeSelectQuery(  query );
+          
+           std::vector<Genre> genres;
+           for (  const auto &row : result ) {
+           genres.push_back(  {std::stoi(  row[0] ),   row[1]} );
+           }
+          
+           return genres;
+          }
+          
+          // INFO: ----- MOVIE -----
+          
+          // Add a new movie
+     147  bool SQLiteDatabase::addMovie(  const NewMovie &movie ) {
+           const std::string query =
+           "INSERT INTO movies (  title,   genre_id,   duration ) VALUES (  ?,   ?,   ? );";
+           int changes = executeNonQuery(  query,   [&movie](  SQLiteStatement &stmt ) {
+           stmt.bind(  1,   movie.title );
+           stmt.bind(  2,   movie.genre_id );
+           stmt.bind(  3,   movie.duration );
+           } );
+          
+           return changes > 0;
+          }
+          
+          // Remove a movie by ID
+     160  bool SQLiteDatabase::removeMovie(  int movie_id ) {
+           const std::string query = "DELETE FROM movies WHERE movie_id = ?;";
+           int changes = executeNonQuery(  
+           query,   [&movie_id](  SQLiteStatement &stmt ) { stmt.bind(  1,   movie_id ); } );
+          
+           return changes > 0;
+          }
+          
+          // Update an existing movie
+     169  bool SQLiteDatabase::updateMovie(  const Movie &movie ) {
+           const std::string query =
+           "UPDATE movies SET title = ?,   genre_id = ?,   duration = ? WHERE movie_id "
+           "= ?;";
+           int changes = executeNonQuery(  query,   [&movie](  SQLiteStatement &stmt ) {
+           stmt.bind(  1,   movie.title );
+           stmt.bind(  2,   movie.genre_id );
+           stmt.bind(  3,   movie.duration );
+           stmt.bind(  4,   movie.movie_id );
+           } );
+          
+           return changes > 0;
+          }
+          
+          // Get a movie by ID
+     184  Movie SQLiteDatabase::getMovie(  int movie_id ) {
+           const std::string query = "SELECT * FROM movies WHERE movie_id = ?;";
+           auto result = executeSelectQuery(  
+           query,   [&movie_id](  SQLiteStatement &stmt ) { stmt.bind(  1,   movie_id ); } );
+          
+           if (  !result.empty(   ) ) {
+           auto movie_id = std::stoi(  result[0][0] );
+           auto title = result[0][1];
+           auto genre_id = std::stoi(  result[0][2] );
+           auto duration = std::stoi(  result[0][3] );
+           Movie movie(  movie_id,   title,   genre_id,   duration );
+           return movie;
+           }
+           return {};
+          }
+          
+          // Get all movies
+     201  std::vector<Movie> SQLiteDatabase::getAllMovies(   ) {
+           const std::string query = "SELECT * FROM movies;";
+           auto result = executeSelectQuery(  query );
+           std::vector<Movie> movies;
+          
+           for (  const auto &row : result ) {
+           movies.push_back(  
+           {std::stoi(  row[0] ),   row[1],   std::stoi(  row[2] ),   std::stoi(  row[3] )} );
+           }
+           return movies;
+          }
+          
+          // INFO: ----- HALL -----
+          
+          // Add a new hall
+     216  bool SQLiteDatabase::addHall(  const NewHall &hall ) {
+           const std::string query =
+           "INSERT INTO halls (  hall_name,   capacity ) VALUES (  ?,   ? );";
+           int changes = executeNonQuery(  query,   [&hall](  SQLiteStatement &stmt ) {
+           stmt.bind(  1,   hall.hall_name );
+           stmt.bind(  2,   hall.capacity );
+           } );
+          
+           return changes > 0;
+          }
+          
+          // Remove a hall by ID
+     228  bool SQLiteDatabase::removeHall(  int hall_id ) {
+           const std::string query = "DELETE FROM halls WHERE hall_id = ?;";
+           int changes = executeNonQuery(  
+           query,   [&hall_id](  SQLiteStatement &stmt ) { stmt.bind(  1,   hall_id ); } );
+          
+           return changes > 0;
+          }
+          
+          // Update an existing hall
+     237  bool SQLiteDatabase::updateHall(  const Hall &hall ) {
+           const std::string query =
+           "UPDATE halls SET hall_name = ?,   capacity = ? WHERE hall_id = ?;";
+           int changes = executeNonQuery(  query,   [&hall](  SQLiteStatement &stmt ) {
+           stmt.bind(  1,   hall.hall_name );
+           stmt.bind(  2,   hall.capacity );
+           stmt.bind(  3,   hall.hall_id );
+           } );
+          
+           return changes > 0;
+          }
+          
+          // Get a hall by ID
+     250  Hall SQLiteDatabase::getHall(  int hall_id ) {
+           const std::string query = "SELECT * FROM halls WHERE hall_id = ?;";
+           auto result = executeSelectQuery(  
+           query,   [&hall_id](  SQLiteStatement &stmt ) { stmt.bind(  1,   hall_id ); } );
+          
+           if (  !result.empty(   ) ) {
+           auto hall_id = std::stoi(  result[0][0] );
+           auto hall_name = result[0][1];
+           auto capacity = std::stoi(  result[0][2] );
+           Hall hall(  hall_id,   hall_name,   capacity );
+           return hall;
+           }
+           return {};
+          }
+          
+          // Get all halls
+     266  std::vector<Hall> SQLiteDatabase::getAllHalls(   ) {
+           const std::string query = "SELECT * FROM halls;";
+           auto result = executeSelectQuery(  query );
+           std::vector<Hall> halls;
+          
+           for (  const auto &row : result ) {
+           halls.push_back(  {std::stoi(  row[0] ),   row[1],   std::stoi(  row[2] )} );
+           }
+           return halls;
+          }
+          
+          // INFO: ----- SESSION -----
+          
+          // Add a new session
+     280  bool SQLiteDatabase::addSession(  const NewSession &session ) {
+           const std::string query = "INSERT INTO sessions (  movie_id,   hall_id,   "
+           "begin_at,   ticket_price ) VALUES (  ?,   ?,   ?,   ? );";
+           int changes = executeNonQuery(  query,   [&session](  SQLiteStatement &stmt ) {
+           stmt.bind(  1,   session.movie_id );
+           stmt.bind(  2,   session.hall_id );
+           stmt.bind(  3,   session.begin_at );
+           stmt.bind(  4,   session.ticket_price );
+           } );
+          
+           return changes > 0;
+          }
+          
+          // Remove a session by ID
+     294  bool SQLiteDatabase::removeSession(  int session_id ) {
+           const std::string query = "DELETE FROM sessions WHERE session_id = ?;";
+           int changes = executeNonQuery(  query,   [&session_id](  SQLiteStatement &stmt ) {
+           stmt.bind(  1,   session_id );
+           } );
+          
+           return changes > 0;
+          }
+          
+          // Update an existing session
+     304  bool SQLiteDatabase::updateSession(  const Session &session ) {
+           const std::string query = "UPDATE sessions SET movie_id = ?,   hall_id = ?,   "
+           "begin_at = ?,   ticket_price = ? WHERE "
+           "session_id = ?;";
+           int changes = executeNonQuery(  query,   [&session](  SQLiteStatement &stmt ) {
+           stmt.bind(  1,   session.movie_id );
+           stmt.bind(  2,   session.hall_id );
+           stmt.bind(  3,   session.begin_at );
+           stmt.bind(  4,   session.ticket_price );
+           stmt.bind(  5,   session.session_id );
+           } );
+          
+           return changes > 0;
+          }
+          
+          // Get a session by ID
+     320  Session SQLiteDatabase::getSession(  int session_id ) {
+           const std::string query = "SELECT * FROM sessions WHERE session_id = ?;";
+           auto result = executeSelectQuery(  query,   [&session_id](  SQLiteStatement &stmt ) {
+           stmt.bind(  1,   session_id );
+           } );
+          
+           if (  !result.empty(   ) ) {
+           auto session_id = std::stoi(  result[0][0] );
+           auto movie_id = std::stoi(  result[0][1] );
+           auto hall_id = std::stoi(  result[0][2] );
+           auto begin_at = result[0][3];
+           auto ticket_price = std::stod(  result[0][4] );
+           Session session(  session_id,   movie_id,   hall_id,   begin_at,   ticket_price );
+           return session;
+           }
+           return {};
+          }
+          
+          // Get all sessions
+     339  std::vector<Session> SQLiteDatabase::getAllSessions(   ) {
+           const std::string query = "SELECT * FROM sessions;";
+           auto result = executeSelectQuery(  query );
+           std::vector<Session> sessions;
+          
+           for (  const auto &row : result ) {
+           sessions.push_back(  {std::stoi(  row[0] ),   std::stoi(  row[1] ),   std::stoi(  row[2] ),  
+           row[3],   std::stod(  row[4] )} );
+           }
+           return sessions;
+          }
+          
+          // INFO: ----- TICKET -----
+          
+          // Add a new ticket
+     354  bool SQLiteDatabase::addTicket(  const NewTicket &ticket ) {
+           const std::string query = "INSERT INTO tickets (  session_id,   seat_number,   "
+           "sold_at ) VALUES (  ?,   ?,   ? );";
+           int changes = executeNonQuery(  query,   [&ticket](  SQLiteStatement &stmt ) {
+           stmt.bind(  1,   ticket.session_id );
+           stmt.bind(  2,   ticket.seat_number );
+           stmt.bind(  3,   ticket.sold_at );
+           } );
+          
+           return changes > 0;
+          }
+          
+          // Remove a ticket by ID
+     367  bool SQLiteDatabase::removeTicket(  int ticket_id ) {
+           const std::string query = "DELETE FROM tickets WHERE ticket_id = ?;";
+           int changes = executeNonQuery(  
+           query,   [&ticket_id](  SQLiteStatement &stmt ) { stmt.bind(  1,   ticket_id ); } );
+          
+           return changes > 0;
+          }
+          
+          // Update an existing ticket
+     376  bool SQLiteDatabase::updateTicket(  const Ticket &ticket ) {
+           const std::string query = "UPDATE tickets SET session_id = ?,   seat_number = "
+           "?,   sold_at = ? WHERE ticket_id = ?;";
+           int changes = executeNonQuery(  query,   [&ticket](  SQLiteStatement &stmt ) {
+           stmt.bind(  1,   ticket.session_id );
+           stmt.bind(  2,   ticket.seat_number );
+           stmt.bind(  3,   ticket.sold_at );
+           stmt.bind(  4,   ticket.ticket_id );
+           } );
+          
+           return changes > 0;
+          }
+          
+          // Get a ticket by ID
+     390  Ticket SQLiteDatabase::getTicket(  int ticket_id ) {
+           const std::string query = "SELECT * FROM tickets WHERE ticket_id = ?;";
+           auto result = executeSelectQuery(  
+           query,   [&ticket_id](  SQLiteStatement &stmt ) { stmt.bind(  1,   ticket_id ); } );
+          
+           if (  !result.empty(   ) ) {
+           auto ticket_id = std::stoi(  result[0][0] );
+           auto session_id = std::stoi(  result[0][1] );
+           auto seat_number = std::stoi(  result[0][2] );
+           auto sold_at = result[0][3];
+           Ticket ticket(  ticket_id,   session_id,   seat_number,   sold_at );
+           return ticket;
+           }
+           return {};
+          }
+          
+          // Get all tickets
+     407  std::vector<Ticket> SQLiteDatabase::getAllTickets(   ) {
+           const std::string query = "SELECT * FROM tickets;";
+           auto result = executeSelectQuery(  query );
+           std::vector<Ticket> tickets;
+          
+           for (  const auto &row : result ) {
+           tickets.push_back(  
+           {std::stoi(  row[0] ),   std::stoi(  row[1] ),   std::stoi(  row[2] ),   row[3]} );
+           }
+           return tickets;
+          }
+          
+          // INFO: ----- REFUND -----
+          
+          // Add a new refund
+     422  bool SQLiteDatabase::addRefund(  const NewRefund &refund ) {
+           const std::string query =
+           "INSERT INTO refunds (  ticket_id,   refund_at,   refund_amount ) "
+           "VALUES (  ?,   ?,   ? );";
+           int changes = executeNonQuery(  query,   [&refund](  SQLiteStatement &stmt ) {
+           stmt.bind(  1,   refund.ticket_id );
+           stmt.bind(  2,   refund.refund_at );
+           stmt.bind(  3,   refund.refund_amount );
+           } );
+          
+           return changes > 0;
+          }
+          
+          // Remove a refund by ID
+     436  bool SQLiteDatabase::removeRefund(  int refund_id ) {
+           const std::string query = "DELETE FROM refunds WHERE refund_id = ?;";
+           int changes = executeNonQuery(  
+           query,   [&refund_id](  SQLiteStatement &stmt ) { stmt.bind(  1,   refund_id ); } );
+          
+           return changes > 0;
+          }
+          
+          // Update an existing refund
+     445  bool SQLiteDatabase::updateRefund(  const Refund &refund ) {
+           const std::string query =
+           "UPDATE refunds SET ticket_id = ?,   refund_at = ?,   refund_amount = ? "
+           "WHERE refund_id = ?;";
+           int changes = executeNonQuery(  query,   [&refund](  SQLiteStatement &stmt ) {
+           stmt.bind(  1,   refund.ticket_id );
+           stmt.bind(  2,   refund.refund_at );
+           stmt.bind(  3,   refund.refund_amount );
+           stmt.bind(  4,   refund.refund_id );
+           } );
+          
+           return changes > 0;
+          }
+          
+          // Get a refund by ID
+     460  Refund SQLiteDatabase::getRefund(  int refund_id ) {
+           const std::string query = "SELECT * FROM refunds WHERE refund_id = ?;";
+           auto result = executeSelectQuery(  
+           query,   [&refund_id](  SQLiteStatement &stmt ) { stmt.bind(  1,   refund_id ); } );
+          
+           if (  !result.empty(   ) ) {
+           auto refund_id = std::stoi(  result[0][0] );
+           auto ticket_id = std::stoi(  result[0][1] );
+           auto refund_at = result[0][2];
+           auto refund_amount = std::stod(  result[0][3] );
+           Refund refund(  refund_id,   ticket_id,   refund_at,   refund_amount );
+           return refund;
+           }
+           return {};
+          }
+          
+          // Get all refunds
+     477  std::vector<Refund> SQLiteDatabase::getAllRefunds(   ) {
+           const std::string query = "SELECT * FROM refunds;";
+           auto result = executeSelectQuery(  query );
+           std::vector<Refund> refunds;
+          
+           for (  const auto &row : result ) {
+           refunds.push_back(  
+           {std::stoi(  row[0] ),   std::stoi(  row[1] ),   row[2],   std::stod(  row[3] )} );
+           }
+           return refunds;
+          }
+
+

./tests_schema/tests_sources/sqlite_file_executor.cpp

+ +       1  #include "sqlite_file_executor.h"
+          
+          #include "sqlite_statement.h"
+          #include <iostream>
+          
+       6  SQLiteFileExecutor::SQLiteFileExecutor(  const std::string &dbPath ) {
+           // WARNING: The database is not blocked
+           if (  sqlite3_open(  dbPath.c_str(   ),   &db_ ) != SQLITE_OK ) {
+           std::cerr << "Failed to open database:" << sqlite3_errmsg(  db_ ) << std::endl;
+           db_ = nullptr;
+           }
+          }
+          
+      14  SQLiteFileExecutor::~SQLiteFileExecutor(   ) {
+           if (  db_ ) {
+           sqlite3_close(  db_ );
+           }
+          }
+          
+          // Execute a SQL file
+      21  void SQLiteFileExecutor::executeSQLFile(  const std::string &sqlFilePath ) {
+           if (  db_ == nullptr ) {
+           throw std::runtime_error(  "Database is not open" );
+           }
+          
+           std::string sqlContent;
+           if (  !read(  sqlFilePath,   sqlContent ) ) {
+           throw std::runtime_error(  "Failed to read SQL file: " + sqlFilePath );
+           }
+          
+           char *errorMessage = nullptr;
+           if (  sqlite3_exec(  db_,   sqlContent.c_str(   ),   nullptr,   nullptr,   &errorMessage ) !=
+           SQLITE_OK ) {
+           std::cerr << "Error executing SQL:" << errorMessage << std::endl;
+           sqlite3_free(  errorMessage );
+           }
+          }
+
+

./tests_schema/tests_sources/sqlite_statement.cpp

+ +       1  #include "sqlite_statement.h"
+          #include <iostream>
+          
+          // Constructor: Prepares the SQL statement
+       5  SQLiteStatement::SQLiteStatement(  sqlite3 *db,   const std::string &query )
+           : db_(  db ),   stmt_(  nullptr ) {
+           if (  db == nullptr ) {
+           throw std::invalid_argument(  "Database connection is null" );
+           }
+          
+           if (  sqlite3_prepare_v2(  db,   query.c_str(   ),   -1,   &stmt_,   nullptr ) != SQLITE_OK ) {
+           std::cerr << "Error preparing SQL statement:" << "\"" + query + "\""
+           << std::endl;
+           std::cerr << "Error message:" << sqlite3_errmsg(  db ) << std::endl;
+          
+           if (  stmt_ ) {
+           sqlite3_finalize(  stmt_ );
+           }
+          
+           throw std::runtime_error(  "Failed to prepare SQLite statement: " + query );
+           }
+          }
+          
+          // Destructor: Finalizes the statement
+      25  SQLiteStatement::~SQLiteStatement(   ) { finalize(   ); }
+          
+          // Bind integer value
+      28  bool SQLiteStatement::bind(  int index,   int value ) {
+           return sqlite3_bind_int(  stmt_,   index,   value ) == SQLITE_OK;
+          }
+          
+          // Bind double value
+      33  bool SQLiteStatement::bind(  int index,   double value ) {
+           return sqlite3_bind_double(  stmt_,   index,   value ) == SQLITE_OK;
+          }
+          
+          // Bind text value
+      38  bool SQLiteStatement::bind(  int index,   const std::string &value ) {
+           return sqlite3_bind_text(  stmt_,   index,   value.c_str(   ),   -1,   SQLITE_TRANSIENT ) ==
+           SQLITE_OK;
+          }
+          
+          // Bind NULL value
+      44  bool SQLiteStatement::bindNull(  int index ) {
+           return sqlite3_bind_null(  stmt_,   index ) == SQLITE_OK;
+          }
+          
+          // Run the statement
+          // step(   ) returns true if there are more rows
+      50  bool SQLiteStatement::execute(   ) { return step(   ) == false; }
+          
+          // Execute the statement
+      53  bool SQLiteStatement::step(   ) {
+           int rc = sqlite3_step(  stmt_ );
+          
+           if (  rc == SQLITE_ROW ) {
+           return true;
+           }
+           if (  rc == SQLITE_DONE ) {
+           return false;
+           }
+          
+           std::cerr << "Failed to step:" << sqlite3_errmsg(  db_ ) << std::endl;
+           return false;
+          }
+          
+          // Get the number of rows affected
+      68  int SQLiteStatement::changes(   ) { return sqlite3_changes(  db_ ); }
+          
+          // Reset the statement for re-use
+      71  void SQLiteStatement::reset(   ) { sqlite3_reset(  stmt_ ); }
+          
+          // Finalize and clean up the statement
+      74  void SQLiteStatement::finalize(   ) {
+           if (  stmt_ ) {
+           sqlite3_finalize(  stmt_ );
+           stmt_ = nullptr;
+           }
+          }
+          
+          // Adapter for sqlite3_column_count
+      82  int SQLiteStatement::getColumnCount(   ) const {
+           return sqlite3_column_count(  stmt_ );
+          }
+          
+          // Adapter for sqlite3_column_text
+      87  std::string SQLiteStatement::getColumnText(  int column_index ) const {
+           const unsigned char *text = sqlite3_column_text(  stmt_,   column_index );
+           return text ? reinterpret_cast<const char *>(  text ) : "";
+          }
+
+

./ui/delegates/date_time_delegate.cpp

+ +       1  #include "date_time_delegate.h"
+          
+       3  DateTimeDelegate::DateTimeDelegate(  QObject *parent )
+           : QStyledItemDelegate(  parent ) {}
+          
+       6  QString DateTimeDelegate::displayText(  const QVariant &value,  
+       7   const QLocale &locale ) const {
+           QDateTime datetime = QDateTime::fromString(  value.toString(   ),   Qt::ISODate );
+           if (  !datetime.isValid(   ) ) {
+           return value.toString(   ); // Return raw value if parsing fails
+           }
+          
+           QString formattedDateTime = locale.toString(  datetime,   QLocale::LongFormat );
+           if (  !formattedDateTime.isEmpty(   ) ) {
+           // Capitalize the first letter of the formatted date string
+           formattedDateTime[0] = formattedDateTime[0].toUpper(   );
+           }
+           return formattedDateTime;
+          }
+
+

./ui/dialogs/auth_dialog.cpp

+ +       1  #include "auth_dialog.h"
+          
+          #include "repository_manager.h"
+          #include "repository_result.h"
+          #include "role_dto.h"
+          #include "roles_repository.h"
+          #include "schema_metadata.h"
+          #include "user_dto.h"
+          #include "users_repository.h"
+          #include <QCryptographicHash>
+          #include <QErrorMessage>
+          #include <QMessageBox>
+          
+      14  AuthDialog::AuthDialog(  QWidget *parent ) : QDialog(  parent ) {
+           setupUi(  this );
+          
+           // WARNING: Models must be initialized before setting up table view
+           if (  initializeRepositories(   ) ) {
+           setupConnections(   );
+           } else {
+           qWarning(   ) << "Initialization failed";
+           }
+          }
+          
+      25  bool AuthDialog::initializeRepositories(   ) {
+           RepositoryManager &repositoryManager = RepositoryManager::instance(   );
+           SchemaMetadata metadata = SchemaMetadata::defaultSchema(   );
+          
+           rolesRepository_ = repositoryManager.getRepositoryAs<RolesRepository>(  
+           metadata.repositoryTableName(  "roles" ) );
+          
+           usersRepository_ = repositoryManager.getRepositoryAs<UsersRepository>(  
+           metadata.repositoryTableName(  "users" ) );
+          
+           return rolesRepository_ && usersRepository_;
+          }
+          
+      38  void AuthDialog::setupConnections(   ) {
+           connect(  btnLogin,   &QPushButton::clicked,   this,   &AuthDialog::onLoginClicked );
+           connect(  btnCancel,   &QPushButton::clicked,   this,   &AuthDialog::onCancelClicked );
+          }
+          
+      43  void AuthDialog::onCancelClicked(   ) {
+           emit loginFailed(   );
+           reject(   );
+          }
+          
+      48  void AuthDialog::onLoginClicked(   ) {
+           QString username = txtUsername->text(   ).trimmed(   );
+           QString password = txtPassword->text(   );
+          
+           UserDTO userDTO;
+           RepositoryResult result =
+           usersRepository_->getUserByUsername(  username,   userDTO );
+          
+           bool userExists = result.success;
+           bool passwordMatch = !userExists ? false : verifyPassword(  password,   userDTO );
+          
+           if (  !userExists || !passwordMatch ) {
+           QMessageBox::warning(  this,   QMessageBox::tr(  "Error" ),  
+           QMessageBox::tr(  "Wrong user name or password" ) );
+           return;
+           }
+          
+           RoleDTO roleDTO;
+           result = rolesRepository_->getRoleById(  userDTO.roleId(   ),   roleDTO );
+          
+           if (  !result.success ) {
+           QMessageBox::warning(  this,   QMessageBox::tr(  "Error" ),  
+           QMessageBox::tr(  "Role of user not found" ) );
+           return;
+           }
+          
+           qint32 userId = userDTO.userId(   );
+           qint32 accessLevel_ = roleDTO.accessLevel(   );
+          
+           emit loginSuccessful(  userId,   accessLevel_ );
+          
+           accept(   );
+          }
+          
+      82  QString AuthDialog::hashPassword(  const QString &password,   const QString &salt ) {
+           QByteArray data = (  password + salt ).toUtf8(   );
+          
+           QByteArray hash = QCryptographicHash::hash(  data,   QCryptographicHash::Sha256 );
+          
+           return QString(  hash.toHex(   ) );
+          }
+          
+      90  bool AuthDialog::verifyPassword(  const QString &password,  
+      91   const UserDTO &userDTO ) {
+           QString inputHash = hashPassword(  password,   userDTO.salt(   ) );
+          
+           return (  inputHash == userDTO.passwordHash(   ) );
+          }
+
+

./ui/dialogs/error_dialog.cpp

+ +       1  #include "error_dialog.h"
+          
+          #include <QCheckBox>
+          #include <QDebug>
+          #include <QErrorMessage>
+          #include <QRegularExpression>
+          #include <QRegularExpressionMatch>
+          
+       9  QErrorMessage *ErrorDialog::getDialog(  QWidget *parent,  
+      10   const QString &errorMsg ) {
+           // Initialize the error dialog
+           QErrorMessage *dialog =
+           new QErrorMessage(  parent ); // parent is needed for the correct location
+           dialog->setAttribute(  Qt::WA_DeleteOnClose ); // delete the dialog when closed
+          
+           // Hide the "don't show again" checkbox
+          #define ERROR_DIALOG_NEW_VERSION 0
+          #if (  ERROR_DIALOG_NEW_VERSION == 1 && QT_VERSION >= QT_VERSION_CHECK(  6,   3,   0 ) )
+           // You need to set DontShowAgainVisible to true in Qt 6.3
+           errorDialog->setDontShowAgainVisible(  false );
+          #else
+           QCheckBox *cb = dialog->findChild<QCheckBox *>(   );
+           if (  cb ) {
+           cb->setEnabled(  false );
+           cb->hide(   );
+           }
+          #endif
+          #undef ERROR_DIALOG_NEW_VERSION
+          
+           // Set the window title
+           dialog->setWindowTitle(  QObject::tr(  "Information messages" ) );
+          
+           // Set minimum width size
+           dialog->setMinimumWidth(  600 );
+          
+           return dialog;
+          }
+          
+      39  void ErrorDialog::displayError(  QWidget *parent,   const QString &errorMsg ) {
+           qDebug(   ) << "Displaying error message:" << errorMsg;
+          
+           QErrorMessage *dialog = getDialog(  parent,   errorMsg );
+          
+           if (  errorMsg.contains(  "constraint failed" ) ) {
+           QString detailedMessage = handleSqlConstraints(  errorMsg );
+           dialog->showMessage(  detailedMessage );
+           dialog->exec(   );
+           return;
+           }
+          
+           if (  errorMsg.contains(  "not found" ) ) {
+           QString detailedMessage = handleNotFoundErrors(  errorMsg );
+           dialog->showMessage(  detailedMessage );
+           dialog->exec(   );
+           return;
+           }
+          
+           QRegularExpression regex(  "Error (  \\d+ ):" );
+           QRegularExpressionMatch match = regex.match(  errorMsg );
+          
+           if (  !match.hasMatch(   ) ) {
+           dialog->showMessage(  QObject::tr(  
+           "An error occurred from an unknown source of the problem." ) );
+           dialog->exec(   );
+           return;
+           }
+          
+           int errorCode = match.captured(  1 ).toInt(   );
+           QString detailedMessage = getDetailedMessage(  errorCode );
+          
+           dialog->showMessage(  detailedMessage );
+           dialog->exec(   );
+          }
+          
+      75  QString ErrorDialog::handleNotFoundErrors(  const QString &errorMsg ) {
+           if (  errorMsg.contains(  "Genre",   Qt::CaseInsensitive ) ) {
+           return QObject::tr(  "The specified genre was not found." );
+           }
+           if (  errorMsg.contains(  "Hall",   Qt::CaseInsensitive ) ) {
+           return QObject::tr(  "The specified hall was not found." );
+           }
+           if (  errorMsg.contains(  "Movie",   Qt::CaseInsensitive ) ) {
+           return QObject::tr(  "The specified movie was not found." );
+           }
+           if (  errorMsg.contains(  "Refund",   Qt::CaseInsensitive ) ) {
+           return QObject::tr(  "The specified refund was not found." );
+           }
+           if (  errorMsg.contains(  "Session",   Qt::CaseInsensitive ) ) {
+           return QObject::tr(  "The specified session was not found." );
+           }
+           if (  errorMsg.contains(  "Ticket",   Qt::CaseInsensitive ) ) {
+           return QObject::tr(  "The specified ticket was not found." );
+           }
+          
+           // If the specific error is not recognized,   return a general message
+           return QObject::tr(  "The requested object was not found in the database." );
+          }
+          
+      99  QString ErrorDialog::handleSqlConstraints(  const QString &errorMsg ) {
+           if (  errorMsg.contains(  "UNIQUE constraint failed" ) ) {
+           return handleUniqueConstraint(  errorMsg );
+           }
+           if (  errorMsg.contains(  "FOREIGN KEY constraint failed" ) ) {
+           return handleForeignKeyConstraint(  errorMsg );
+           }
+           if (  errorMsg.contains(  "PRIMARY KEY constraint failed" ) ) {
+           return handlePrimaryKeyConstraint(   );
+           }
+           if (  errorMsg.contains(  "CHECK constraint failed" ) ) {
+           return handleCheckConstraint(  errorMsg );
+           }
+           if (  errorMsg.contains(  "NOT NULL constraint failed" ) ) {
+           return tr(  "A required field is missing. Please fill all required fields." );
+           }
+          
+           return tr(  "An SQL constraint violation occurred,   but at the moment it has "
+           "not been described in detail yet." );
+          }
+          
+     120  QString ErrorDialog::handleUniqueConstraint(  const QString &errorMsg ) {
+           if (  errorMsg.contains(  "genres.genre_name" ) ) {
+           return tr(  "A genre with the same name already exists." );
+           }
+           if (  errorMsg.contains(  "movies.title" ) ) {
+           return tr(  "A movie with the same title already exists." );
+           }
+           if (  errorMsg.contains(  "halls.hall_name" ) ) {
+           return tr(  "A hall with the same name already exists." );
+           }
+           if (  errorMsg.contains(  "tickets.session_id,   tickets.seat_number" ) ) {
+           return tr(  "A ticket with the same session and seat number already exists." );
+           }
+           if (  errorMsg.contains(  "refunds.ticket_id" ) ) {
+           return tr(  "A refund for the same ticket already exists." );
+           }
+           if (  errorMsg.contains(  "sessions.hall_id,   sessions.begin_at" ) ) {
+           return tr(  "A session is already scheduled in this hall at the same time." );
+           }
+          
+           return tr(  "A unique constraint violation occurred,   but at the moment it has "
+           "not been described in detail yet." );
+          }
+          
+     144  QString ErrorDialog::handleForeignKeyConstraint(  const QString &errorMsg ) {
+           if (  errorMsg.contains(  "sessions.movie_id" ) ) {
+           return tr(  "The movie ID for the session does not exist." );
+           }
+           if (  errorMsg.contains(  "sessions.hall_id" ) ) {
+           return tr(  "The hall ID for the session does not exist." );
+           }
+           if (  errorMsg.contains(  "movies.genre_id" ) ) {
+           return tr(  "The genre ID for the movie does not exist." );
+           }
+           if (  errorMsg.contains(  "tickets.session_id" ) ) {
+           return tr(  "The session ID for the ticket does not exist." );
+           }
+           if (  errorMsg.contains(  "refunds.ticket_id" ) ) {
+           return tr(  "The ticket ID for the refund does not exist." );
+           }
+          
+           return tr(  "Operation violates a foreign key constraint,   but at the moment it "
+           "has not been described in detail yet." );
+          }
+          
+     165  QString ErrorDialog::handlePrimaryKeyConstraint(   ) {
+           return tr(  "Duplicate primary key value. Ensure the primary key is unique." );
+          }
+          
+     169  QString ErrorDialog::handleCheckConstraint(  const QString &errorMsg ) {
+           if (  errorMsg.contains(  "length(  genre_name ) > 0" ) ) {
+           return tr(  "Genre name must not be empty." );
+           }
+           if (  errorMsg.contains(  "length(  title ) > 0" ) ) {
+           return tr(  "Movie title must not be empty." );
+           }
+           if (  errorMsg.contains(  "duration > 0" ) ) {
+           return tr(  "Movie duration must be a positive value." );
+           }
+           if (  errorMsg.contains(  "length(  hall_name ) > 0" ) ) {
+           return tr(  "Hall name must not be empty." );
+           }
+           if (  errorMsg.contains(  "capacity > 0" ) ) {
+           return tr(  "Hall capacity must be a positive number." );
+           }
+           if (  errorMsg.contains(  "ticket_price >= 0" ) ) {
+           return tr(  "Ticket price must be a non-negative value." );
+           }
+           if (  errorMsg.contains(  "seat_number > 0" ) ) {
+           return tr(  "Seat number must be a positive value." );
+           }
+           if (  errorMsg.contains(  "refund_amount >= 0" ) ) {
+           return tr(  "Refund amount must be a non-negative value." );
+           }
+          
+           return tr(  "A value violates a CHECK constraint,   but at the moment it has not "
+           "been described in detail yet." );
+          }
+          
+     199  QString ErrorDialog::getDetailedMessage(  int errorCode ) {
+           switch (  errorCode ) {
+           case 1001:
+           return tr(  "Seat number exceeds hall capacity." );
+           case 1002:
+           return tr(  "Cannot purchase ticket after the session has started." );
+           case 1003:
+           return tr(  "Refunds cannot be made after the session has started." );
+           case 1004:
+           return tr(  "Refund amount cannot exceed the sale amount." );
+           case 1005:
+           return tr(  "Refund date cannot be earlier than the sale date." );
+           case 1006:
+           return tr(  "The new session overlaps with an ongoing movie in the hall." );
+           default:
+           return tr(  "A known error has occurred,   but at the moment it has not been "
+           "described in detail yet." );
+           }
+          }
+
+

./ui/dialogs/search_dialog.cpp

+ +       1  #include "search_dialog.h"
+          
+          #include "base_sql_table_model.h"
+          #include "model_manager.h"
+          #include "multi_column_filter_proxy_model.h"
+          #include <QMessageBox>
+          
+       8  SearchDialog::SearchDialog(  QWidget *parent )
+           : QDialog(  parent ),   originalModel_(  nullptr ) {
+           setupUi(  this );
+          
+           initializeProxyModel(   );
+           setupTableView(   ); // After initializing proxy model
+           setupConnections(   );
+          }
+          
+      17  SearchDialog::SearchDialog(  const QString &modelTableName,  
+      18   const QString &fieldName,   QWidget *parent )
+           : SearchDialog(  parent ) {
+           if (  !setTableName(  modelTableName ) ) {
+           qFatal(  "SearchDialog::SearchDialog: Failed to set table name" );
+           }
+           if (  !setFieldName(  fieldName ) ) {
+           qFatal(  "SearchDialog::SearchDialog: Failed to set field name" );
+           }
+          }
+          
+      28  SearchDialog::~SearchDialog(   ) {
+           if (  originalModel_ != nullptr ) {
+           originalModel_->resetFilter(   );
+           }
+          }
+          
+      34  bool SearchDialog::setFieldName(  const QString &fieldName ) {
+           int columnIndex = originalModel_->columnIndex(  fieldName );
+           if (  columnIndex == -1 ) {
+           return false;
+           }
+           columnIndex_ = columnIndex;
+           return true;
+          }
+          
+      43  bool SearchDialog::setTableName(  const QString &modelTableName ) {
+           ModelManager &modelManger = ModelManager::instance(   );
+          
+           if (  originalModel_ != nullptr ) {
+           originalModel_->resetFilter(   );
+           }
+          
+           modelTableName_ = modelTableName;
+          
+           originalModel_ = modelManger.getModelAs<BaseSqlTableModel>(  modelTableName );
+          
+           proxyModel_->setSourceModel(  originalModel_ );
+          
+           tableView->clearSelection(   );
+          
+           columnIndex_ = -1;
+          
+           if (  originalModel_->isCompleteDatabaseFiltering(   ) ) {
+           return true;
+           }
+          
+          #ifdef NOPTIMIZATION
+           while (  originalModel_->canFetchMore(   ) ) {
+           originalModel_->fetchMore(   );
+           }
+          #endif
+          
+           return true;
+          }
+          
+      73  void SearchDialog::initializeProxyModel(   ) {
+           proxyModel_ = new MultiColumnSortFilterProxyModel(  this );
+          }
+          
+      77  void SearchDialog::setupConnections(   ) {
+           connect(  lineEditSearch,   &QLineEdit::textChanged,   this,  
+           &SearchDialog::onLineEditSearchTextChanged );
+          
+           connect(  pushButtonSelect,   &QPushButton::clicked,   this,  
+           &SearchDialog::onPushButtonSelectClicked );
+          }
+          
+      85  void SearchDialog::setupTableView(   ) {
+           QHeaderView *horizontalHeader = tableView->horizontalHeader(   );
+           horizontalHeader->setHighlightSections(  false );
+           horizontalHeader->setSectionResizeMode(  QHeaderView::ResizeToContents );
+          
+           tableView->setAlternatingRowColors(  true );
+          
+           tableView->setEditTriggers(  QAbstractItemView::NoEditTriggers );
+          
+           tableView->setFocusPolicy(  Qt::NoFocus );
+          
+           tableView->setHorizontalScrollMode(  QAbstractItemView::ScrollPerPixel );
+          
+           tableView->setSelectionBehavior(  QAbstractItemView::SelectRows );
+          
+           tableView->setSelectionMode(  QAbstractItemView::SingleSelection );
+          
+           tableView->setSortingEnabled(  true );
+          
+           tableView->setVerticalScrollMode(  QAbstractItemView::ScrollPerPixel );
+          
+           tableView->sortByColumn(  0,   Qt::AscendingOrder );
+          
+           tableView->setModel(  proxyModel_ );
+          }
+          
+     111  void SearchDialog::onLineEditSearchTextChanged(  const QString &text ) {
+           ModelManager &modelManger = ModelManager::instance(   );
+          
+          #ifdef NOPTIMIZATION
+           if (  originalModel_->isCompleteDatabaseFiltering(   ) ) {
+           originalModel_->setMultiColumnFilter(  text );
+           return;
+           }
+          
+           // Model filtering
+           QRegularExpression regex(  text,   QRegularExpression::CaseInsensitiveOption );
+           proxyModel_->setFilterRegularExpression(  regex );
+          #else
+           // Database filtering
+           originalModel_->setMultiColumnFilter(  text );
+          #endif
+          }
+          
+     129  void SearchDialog::onPushButtonSelectClicked(   ) {
+           if (  columnIndex_ == -1 ) {
+           qFatal(  "SearchDialog::onPushButtonSelectClicked: Column index not set" );
+           }
+          
+           QModelIndexList selectedIndexes = tableView->selectionModel(   )->selectedRows(   );
+           if (  selectedIndexes.isEmpty(   ) ) {
+           QMessageBox::warning(  this,   QMessageBox::tr(  "Error" ),  
+           QMessageBox::tr(  "No row selected" ) );
+           return;
+           }
+          
+           QModelIndex selectedRowIndex = selectedIndexes.first(   );
+           emit rowSelected(  selectedRowIndex.row(   ) );
+          
+           QSqlRecord record = originalModel_->record(  selectedRowIndex.row(   ) );
+           emit recordRetrieved(  record );
+          
+           if (  columnIndex_ != -1 ) {
+           QSqlRecord record = originalModel_->record(  selectedRowIndex.row(   ) );
+           QSqlField field = record.field(  columnIndex_ );
+           emit fieldRetrieved(  field );
+           }
+          
+           accept(   );
+          }
+
+

./ui/main_window/main_window.cpp

+ +       1  #include "main_window.h"
+          
+          #include "date_time_delegate.h"
+          
+          // Set up the table view
+          // #define ENABLE_SELECTION // Uncomment to enable highlighting
+          #define DISABLE_SELECTION // Uncomment to disable highlighting
+          
+       9  MainWindow::MainWindow(  qint32 userId,   qint32 accessLevel,   QWidget *parent )
+           : QMainWindow(  parent ),   userId_(  userId ),   accessLevel_(  accessLevel ) {
+           qInfo(   ) << "Initializing main window...";
+          
+           setupUi(  this );
+           configureAllTableViews(   );
+           configureAccessLevel(   );
+          
+           qInfo(   ) << "Main window initialized successfully";
+          };
+          
+      20  void MainWindow::configureAccessLevel(   ) {
+           qInfo(   ) << "Configuring access level...";
+          
+           if (  accessLevel_ < 1 ) {
+           qCritical(   ) << "Access level is less than 1";
+           QCoreApplication::quit(   );
+           }
+          
+           qInfo(   ) << "Access level is" << accessLevel_;
+          
+           // Full access to all system functionalities
+           // Manage system settings and user permissions
+           // Can perform all actions of lower roles
+           if (  accessLevel_ < 100 ) { // Lower than Super Administrator
+           }
+           // Delete records (  sessions,   tickets,   halls,   movies,   genres )
+           // Modify system-critical data
+           // Has all permissions of lower roles
+           if (  accessLevel_ < 82 ) { // Lower than Data Administrator
+           findChild<QWidget *>(  "DangerZonePage" )->setDisabled(  true );
+           }
+           // Add new sessions,   movies,   halls,   and genres
+           // Manage show schedules
+           // Has all permissions of lower roles
+           if (  accessLevel_ < 64 ) { // Lower than Repertoire Manager
+           findChild<QWidget *>(  "DirectoriesManagementPage" )->setDisabled(  true );
+           findChild<QWidget *>(  "SessionManagementPage" )->setDisabled(  true );
+           }
+           // Edit session,   movie,   hall,   and genre information
+           // Adjust ticket prices
+           // Has all permissions of lower roles
+           if (  accessLevel_ < 46 ) { // Lower than Data Editor
+           }
+           // View ticket sales
+           // View attendance statistics
+           // Has all permissions of lower roles
+           if (  accessLevel_ < 28 ) { // Lower than Sales Manager
+           findChild<QWidget *>(  "ReportsPage" )->setDisabled(  true );
+           }
+           // Sell tickets
+           // Ticket refunds
+           if (  accessLevel_ < 10 ) { // Lower than Cashier
+           findChild<QWidget *>(  "MainWindow" )->setDisabled(  true );
+           }
+           // Nothing
+          
+           qInfo(   ) << "Access level configured successfully";
+          }
+          
+      69  void MainWindow::configureAllTableViews(   ) {
+           qInfo(   ) << "Configuring all QAbstractItemViews...";
+          
+           // Find all QAbstractItemView children
+           auto tableViews = findChildren<QAbstractItemView *>(   );
+          
+           for (  QAbstractItemView *abstractItemView : tableViews ) {
+          
+           // Check if the view is a QTableView
+           if (  auto *tableView = qobject_cast<QTableView *>(  abstractItemView ) ) {
+           loadDefaultConfiguration(  tableView );
+           }
+           }
+          
+           qInfo(   ) << "All QAbstractItemViews configured successfully";
+          }
+          
+      86  void MainWindow::MainWindow::disableSelection(  QTableView *tableView ) {
+           qInfo(   ) << "Disabling selection for QAbstractItemView:"
+           << tableView->objectName(   );
+          
+           // Disable selection
+           tableView->setSelectionMode(  QAbstractItemView::NoSelection );
+          
+           // Clear the selection
+           tableView->clearSelection(   );
+          
+           // Disable focus
+           tableView->setFocusPolicy(  Qt::NoFocus );
+          }
+          
+     100  void enableSelection(  QTableView *tableView ) {
+           qInfo(   ) << "Enabling selection for QAbstractItemView:"
+           << tableView->objectName(   );
+          
+           // Set the selection behavior
+           tableView->setSelectionBehavior(  QAbstractItemView::SelectRows );
+          
+           // Set the selection mode
+           tableView->setSelectionMode(  QAbstractItemView::SingleSelection );
+          }
+          
+     111  void MainWindow::loadDefaultConfiguration(  QTableView *tableView ) {
+           qInfo(   ) << "Loading default configuration for QAbstractItemView:"
+           << tableView->objectName(   );
+          
+           DateTimeDelegate *dateTimeDelegate = new DateTimeDelegate(  this );
+          
+           tableView->setItemDelegate(  dateTimeDelegate );
+          
+           QHeaderView *horizontalHeader = tableView->horizontalHeader(   );
+           // Disable horizontal header highlight
+           horizontalHeader->setHighlightSections(  false );
+           // Set the horizontal header to resize to contents
+           horizontalHeader->setSectionResizeMode(  QHeaderView::ResizeToContents );
+          
+           tableView->setSortingEnabled(  true ); // Enable sorting
+           tableView->sortByColumn(  0,   Qt::AscendingOrder );
+          
+           // Disable editing
+           tableView->setEditTriggers(  QAbstractItemView::NoEditTriggers );
+          
+           // Set the scroll mode
+           tableView->setVerticalScrollMode(  QAbstractItemView::ScrollPerPixel );
+           tableView->setHorizontalScrollMode(  QAbstractItemView::ScrollPerPixel );
+          
+           // Enable alternating row colors
+           tableView->setAlternatingRowColors(  true );
+          
+          #ifdef ENABLE_SELECTION
+           enableSelection(  view );
+          #elif defined(  DISABLE_SELECTION )
+           disableSelection(  tableView );
+          #else
+          #error "Define ENABLE_SELECTION or DISABLE_SELECTION"
+          #endif
+          }
+
+

./ui/models/base_sql_table_model.cpp

+ +       1  #include "base_sql_table_model.h"
+          
+          #include "QSqlError"
+          #include "table_info_sqlite.h"
+          #include <QDateTime>
+          #include <QSqlQuery>
+          
+       8  BaseSqlTableModel::BaseSqlTableModel(  QObject *parent,   QSqlDatabase database )
+           : QSqlRelationalTableModel(  parent,   database ) {}
+          
+      11  bool BaseSqlTableModel::refreshAll(   ) {
+           beginResetModel(   );
+           bool result = select(   );
+           endResetModel(   );
+          
+           result ? qInfo(   ) << "Model of table with database name" << tableName(   )
+           << "was refreshed successfully"
+           : qWarning(   ) << "Failed to refresh model: Database name of table:"
+           << tableName(   ) << "Error:" << lastError(   ).text(   );
+           return result;
+          }
+          
+      23  QVariant BaseSqlTableModel::data(  const QModelIndex &index,   int role ) const {
+           // if (  role != Qt::DisplayRole ) {
+           return QSqlRelationalTableModel::data(  index,   role );
+           // }
+           //
+           // QVariant value = QSqlRelationalTableModel::data(  index,   role );
+           //
+           // QDateTime datetime = QDateTime::fromString(  value.toString(   ),   Qt::ISODate );
+           //
+           // if (  !datetime.isValid(   ) ) {
+           // return value;
+           // }
+           //
+           // QLocale locale;
+           // QString formattedDateTime = locale.toString(  datetime,   QLocale::LongFormat );
+           //
+           // formattedDateTime[0] = formattedDateTime[0].toUpper(   );
+           //
+           // return formattedDateTime;
+          }
+          
+      44  void BaseSqlTableModel::setTable(  const QString &databaseTableName ) {
+           tableInfo_.setDatabaseTableName(  databaseTableName );
+           QSqlRelationalTableModel::setTable(  databaseTableName );
+          }
+          
+      49  void BaseSqlTableModel::resetFilter(   ) {
+           qInfo(   ).noquote(   ) << createUpdateFilterMessage(  "" );
+           setFilter(  "" );
+          }
+          
+      54  void BaseSqlTableModel::setMultiColumnFilter(  const QString &filter ) {
+           if (  filter.isEmpty(   ) ) {
+           resetFilter(   );
+           return;
+           }
+          
+           const QString filterQuery = createMultiColumnFilter(  filter );
+          
+           qInfo(   ).noquote(   ) << createUpdateFilterMessage(  filter );
+          
+           setFilter(  filterQuery );
+          }
+          
+          QString
+      68  BaseSqlTableModel::createMultiColumnFilter(  const QString &filter ) const {
+          
+           QStringList conditions;
+           for (  const QString &column : columnNames(   ) ) {
+           conditions.append(  QString(  "%1 LIKE '%%2%'" ).arg(  column ).arg(  filter ) );
+           }
+          
+           return conditions.join(  " OR " );
+          }
+          
+          QString
+      79  BaseSqlTableModel::createUpdateFilterMessage(  const QString &filter ) const {
+           QString classInfoMessage =
+           QString(  "Model manager class name: %1" ).arg(  metaObject(   )->className(   ) );
+          
+           QString tableInfoMessage =
+           QString(  "Database table name: %1" ).arg(  tableName(   ) );
+          
+           QString filterInfoMessage = filter.isEmpty(   )
+           ? "The filter was reset"
+           : QString(  "Filter: \"%1\"" ).arg(  filter );
+          
+           QString message = QString(  "The model was updated: %1: %2: %3" )
+           .arg(  classInfoMessage )
+           .arg(  tableInfoMessage )
+           .arg(  filterInfoMessage );
+          
+           return message;
+          }
+
+

./ui/models/genres_model.cpp

+ +       1  #include "genres_model.h"
+          
+          #include <QSqlError>
+          
+       5  GenresModel::GenresModel(  QObject *parent,   const QSqlDatabase &database )
+           : BaseSqlTableModel(  parent,   database ) {}
+          
+       8  void GenresModel::initialize(   ) {
+           setTable(  "genres" );
+          
+           setEditStrategy(  QSqlTableModel::OnFieldChange );
+          
+           bool success = select(   );
+           if (  !success ) {
+           qWarning(   ) << "Error:" << lastError(   ).text(   );
+           }
+          }
+          
+      19  QVariant GenresModel::headerData(  int section,   Qt::Orientation orientation,  
+           int role ) const {
+           if (  role == Qt::DisplayRole && orientation == Qt::Horizontal ) {
+           switch (  section ) {
+           case GenresColumns::Id:
+           return tr(  "ID" );
+           case GenresColumns::Name:
+           return tr(  "Name" );
+           default:
+           return QVariant(   );
+           }
+           }
+           return QSqlTableModel::headerData(  section,   orientation,   role );
+          }
+
+

./ui/models/halls_model.cpp

+ +       1  #include "halls_model.h"
+          
+          #include <QSqlError>
+          
+       5  HallsModel::HallsModel(  QObject *parent,   const QSqlDatabase &database )
+           : BaseSqlTableModel(  parent,   database ) {}
+          
+       8  void HallsModel::initialize(   ) {
+          
+           setTable(  "halls" );
+          
+           setEditStrategy(  QSqlTableModel::OnFieldChange );
+          
+           bool success = select(   );
+           if (  !success ) {
+           qWarning(   ) << "Error:" << lastError(   ).text(   );
+           }
+          }
+          
+      20  QVariant HallsModel::headerData(  int section,   Qt::Orientation orientation,  
+           int role ) const {
+           if (  role == Qt::DisplayRole && orientation == Qt::Horizontal ) {
+           switch (  section ) {
+           case HallsColumns::Id:
+           return tr(  "ID" );
+           case HallsColumns::Name:
+           return tr(  "Name" );
+           case HallsColumns::Capacity:
+           return tr(  "Capacity" );
+           default:
+           return QVariant(   );
+           }
+           }
+           return QSqlTableModel::headerData(  section,   orientation,   role );
+          }
+
+

./ui/models/movies_model.cpp

+ +       1  #include "movies_model.h"
+          
+          #include <QSqlError>
+          #include <QSqlQuery>
+          
+       6  MoviesModel::MoviesModel(  QObject *parent,   const QSqlDatabase &database )
+           : BaseSqlTableModel(  parent,   database ) {}
+          
+       9  void MoviesModel::initialize(   ) {
+           setTable(  "movies" );
+          
+           // Set up the relationship with the genres table
+           setRelation(  fieldIndex(  "genre_id" ),  
+           QSqlRelation(  "genres",   "genre_id",   "genre_name" ) );
+          
+           setEditStrategy(  QSqlTableModel::OnFieldChange );
+          
+           bool success = select(   );
+           if (  !success ) {
+           qWarning(   ) << "Error:" << lastError(   ).text(   );
+           }
+          }
+          
+      24  QVariant MoviesModel::headerData(  int section,   Qt::Orientation orientation,  
+           int role ) const {
+           if (  role == Qt::DisplayRole && orientation == Qt::Horizontal ) {
+           switch (  section ) {
+           case MoviesColumns::Id:
+           return tr(  "ID" );
+           case MoviesColumns::Title:
+           return tr(  "Title" );
+           case MoviesColumns::GenreId:
+           return tr(  "Genre" );
+           case MoviesColumns::Duration:
+           return tr(  "Duration" );
+           default:
+           return QVariant(   );
+           }
+           }
+           return QSqlRelationalTableModel::headerData(  section,   orientation,   role );
+          }
+          
+      43  bool MoviesModel::buildGenreIdFilterCondition(  const QString &inFilter,  
+      44   QString &outFilter ) const {
+           QSqlQuery query;
+           query.prepare(  "SELECT genre_id FROM genres WHERE genre_name LIKE ?" );
+           query.addBindValue(  "%" + inFilter + "%" );
+           query.exec(   );
+          
+           QStringList genreIds;
+           while (  query.next(   ) ) {
+           genreIds << query.value(  0 ).toString(   );
+           }
+          
+           outFilter = QString(  "movies.genre_id IN (  %1 )" ).arg(  genreIds.join(  ",   " ) );
+          
+           return true;
+          }
+          
+      60  QString MoviesModel::createMultiColumnFilter(  const QString &filter ) const {
+           QStringList conditions;
+          
+           QString buffer; // MoviesColumns::GenreId
+           if (  buildGenreIdFilterCondition(  filter,   buffer ) ) {
+           conditions.append(  buffer );
+           }
+          
+           using Columns = MoviesColumns;
+           QStringList columns = {columnName(  Columns::Id ),   columnName(  Columns::Title ),  
+           columnName(  Columns::Duration )};
+          
+           for (  const QString &column : columns ) {
+           conditions.append(  QString(  "%1 LIKE '%%2%'" ).arg(  column ).arg(  filter ) );
+           }
+          
+           return conditions.join(  " OR " );
+          }
+
+

./ui/models/multi_column_filter_proxy_model.cpp

+ +       1  #include "multi_column_filter_proxy_model.h"
+          
+          #include <QDateTime>
+          
+       5  MultiColumnSortFilterProxyModel::MultiColumnSortFilterProxyModel(  
+       6   QObject *parent )
+           : QSortFilterProxyModel(  parent ) {}
+          
+       9  bool MultiColumnSortFilterProxyModel::filterAcceptsRow(  
+      10   int sourceRow,   const QModelIndex &sourceParent ) const {
+          
+           QRegularExpression regex = filterRegularExpression(   );
+           if (  !regex.isValid(   ) || regex.pattern(   ).isEmpty(   ) ) {
+           return true;
+           }
+          
+           int columnCount = sourceModel(   )->columnCount(  sourceParent );
+           for (  int column = 0; column < columnCount; ++column ) {
+           QModelIndex sourceIndex =
+           sourceModel(   )->index(  sourceRow,   column,   sourceParent );
+           QString dataValue =
+           sourceModel(   )->data(  sourceIndex,   Qt::DisplayRole ).toString(   );
+          
+           dataValue.replace(  QRegularExpression(  "\\s+" ),   " " );
+          
+           if (  regex.match(  dataValue ).hasMatch(   ) ) {
+           return true;
+           }
+           }
+          
+           return false;
+          }
+
+

./ui/models/refunds_model.cpp

+ +       1  #include "refunds_model.h"
+          
+          #include <QSqlError>
+          
+       5  RefundsModel::RefundsModel(  QObject *parent,   const QSqlDatabase &database )
+           : BaseSqlTableModel(  parent,   database ) {}
+          
+       8  void RefundsModel::initialize(   ) {
+           setTable(  "refunds" );
+          
+           setEditStrategy(  QSqlTableModel::OnFieldChange );
+          
+           bool success = select(   );
+           if (  !success ) {
+           qWarning(   ) << "Error:" << lastError(   ).text(   );
+           }
+          }
+          
+      19  QVariant RefundsModel::headerData(  int section,   Qt::Orientation orientation,  
+           int role ) const {
+           if (  role == Qt::DisplayRole && orientation == Qt::Horizontal ) {
+           switch (  section ) {
+           case RefundsColumns::Id:
+           return tr(  "ID" );
+           case RefundsColumns::TicketId:
+           return tr(  "Ticket ID" );
+           case RefundsColumns::RefundAt:
+           return tr(  "Refund At" );
+           case RefundsColumns::RefundAmount:
+           return tr(  "Refund Amount" );
+           default:
+           return QVariant(   );
+           }
+           }
+           return QSqlTableModel::headerData(  section,   orientation,   role );
+          }
+          
+      38  QString RefundsModel::createMultiColumnFilter(  const QString &filter ) const {
+           QStringList conditions;
+          
+           // WARNING: Does not filter these models transmitted through the data method,  
+           // such as QDatetime
+          
+           using Columns = RefundsModel;
+           QStringList columns = {columnName(  Columns::Id ),   columnName(  Columns::TicketId ),  
+           columnName(  Columns::RefundAmount )};
+          
+          #ifndef NO_DATE_TIME_SEARCH
+           columns.append(  columnName(  Columns::RefundAt ) );
+          #endif
+          
+           for (  const QString &column : columns ) {
+           conditions.append(  QString(  "%1 LIKE '%%2%'" ).arg(  column ).arg(  filter ) );
+           }
+          
+           return conditions.join(  " OR " );
+          }
+
+

./ui/models/sessions_model.cpp

+ +       1  #include "sessions_model.h"
+          
+          #include <QSqlError>
+          #include <QSqlQuery>
+          
+       6  SessionsModel::SessionsModel(  QObject *parent,   const QSqlDatabase &database )
+           : BaseSqlTableModel(  parent,   database ) {}
+          
+       9  void SessionsModel::initialize(   ) {
+           setTable(  "sessions" );
+          
+           // Set up the relationship with the movies and halls tables
+           setRelation(  fieldIndex(  "movie_id" ),  
+           QSqlRelation(  "movies",   "movie_id",   "title" ) );
+           setRelation(  fieldIndex(  "hall_id" ),  
+           QSqlRelation(  "halls",   "hall_id",   "hall_name" ) );
+          
+           setEditStrategy(  QSqlTableModel::OnFieldChange );
+          
+           bool success = select(   );
+           if (  !success ) {
+           qWarning(   ) << "Error:" << lastError(   ).text(   );
+           }
+          }
+          
+      26  bool SessionsModel::buildHallIdFilterCondition(  const QString &inFilter,  
+      27   QString &outFilter ) const {
+           QSqlQuery query;
+           query.prepare(  "SELECT hall_id FROM halls WHERE hall_name LIKE ?" );
+           query.addBindValue(  "%" + inFilter + "%" );
+           query.exec(   );
+          
+           QStringList hallIds;
+           while (  query.next(   ) ) {
+           hallIds << query.value(  0 ).toString(   );
+           }
+          
+           if (  hallIds.isEmpty(   ) ) {
+           return false;
+           }
+          
+           outFilter = QString(  "sessions.hall_id IN (  %1 )" ).arg(  hallIds.join(  ",   " ) );
+          
+           return true;
+          }
+          
+      47  bool SessionsModel::buildMovieIdFilterCondition(  const QString &inFilter,  
+      48   QString &outFilter ) const {
+           QSqlQuery query;
+           query.prepare(  "SELECT movie_id FROM movies WHERE title LIKE ?" );
+           query.addBindValue(  "%" + inFilter + "%" );
+           query.exec(   );
+          
+           QStringList movieIds;
+           while (  query.next(   ) ) {
+           movieIds << query.value(  0 ).toString(   );
+           }
+          
+           if (  movieIds.isEmpty(   ) ) {
+           return false;
+           }
+          
+           outFilter = QString(  "sessions.movie_id IN (  %1 )" ).arg(  movieIds.join(  ",   " ) );
+          
+           return true;
+          }
+          
+      68  QVariant SessionsModel::headerData(  int section,   Qt::Orientation orientation,  
+           int role ) const {
+           if (  role == Qt::DisplayRole && orientation == Qt::Horizontal ) {
+           switch (  section ) {
+           case SessionsColumns::Id:
+           return tr(  "ID" );
+           case SessionsColumns::MovieId:
+           return tr(  "Movie Title" );
+           case SessionsColumns::HallId:
+           return tr(  "Hall Name" );
+           case SessionsColumns::BeginAt:
+           return tr(  "Start Time" );
+           case SessionsColumns::TicketPrice:
+           return tr(  "Ticket Price" );
+           default:
+           return QVariant(   );
+           }
+           }
+           return QSqlRelationalTableModel::headerData(  section,   orientation,   role );
+          }
+          
+      89  QString SessionsModel::createMultiColumnFilter(  const QString &filter ) const {
+           QStringList conditions;
+          
+           QString buffer; // SessionsColumns::HallId And SessionsColumns::MovieId
+           if (  buildHallIdFilterCondition(  filter,   buffer ) ) {
+           conditions.append(  buffer );
+           }
+           if (  buildMovieIdFilterCondition(  filter,   buffer ) ) {
+           conditions.append(  buffer );
+           }
+          
+           // WARNING: Does not filter these models transmitted through the data method,  
+           // such as QDatetime
+          
+           using Columns = SessionsColumns;
+           QStringList columns = {columnName(  Columns::Id ),  
+           columnName(  Columns::TicketPrice )};
+          
+          #ifndef NO_DATE_TIME_SEARCH
+           columns.append(  columnName(  Columns::BeginAt ) );
+          #endif
+          
+           for (  const QString &column : columns ) {
+           conditions.append(  QString(  "%1 LIKE '%%2%'" ).arg(  column ).arg(  filter ) );
+           }
+          
+           return conditions.join(  " OR " );
+          }
+
+

./ui/models/tickets_model.cpp

+ +       1  #include "tickets_model.h"
+          
+          #include <QSqlError>
+          #include <QSqlRecord>
+          
+       6  TicketsModel::TicketsModel(  QObject *parent,   const QSqlDatabase &database )
+           : BaseSqlTableModel(  parent,   database ) {}
+          
+       9  void TicketsModel::initialize(   ) {
+           setTable(  "tickets" );
+          
+           setEditStrategy(  QSqlTableModel::OnFieldChange );
+          
+           bool success = select(   );
+           if (  !success ) {
+           qWarning(   ) << "Error:" << lastError(   ).text(   );
+           }
+          }
+          
+      20  QVariant TicketsModel::headerData(  int section,   Qt::Orientation orientation,  
+           int role ) const {
+           if (  role == Qt::DisplayRole && orientation == Qt::Horizontal ) {
+           switch (  section ) {
+           case TicketsColumns::Id:
+           return tr(  "ID" );
+           case TicketsColumns::SessionId:
+           return tr(  "Session ID" );
+           case TicketsColumns::SeatNumber:
+           return tr(  "Seat Number" );
+           case TicketsColumns::SoldAt:
+           return tr(  "Sold At" );
+           default:
+           return QVariant(   );
+           }
+           }
+           return QSqlTableModel::headerData(  section,   orientation,   role );
+          }
+          
+      39  QString TicketsModel::createMultiColumnFilter(  const QString &filter ) const {
+           QStringList conditions;
+          
+           // WARNING: Does not filter these models transmitted through the data method,  
+           // such as QDatetime
+          
+           using Columns = TicketsColumns;
+           QStringList columns = {columnName(  Columns::Id ),  
+           columnName(  Columns::SessionId ),  
+           columnName(  Columns::SeatNumber )};
+          
+          #ifndef NO_DATE_TIME_SEARCH
+           columns.append(  columnName(  Columns::SoldAt ) );
+          #endif
+          
+           for (  const QString &column : columns ) {
+           conditions.append(  QString(  "%1 LIKE '%%2%'" ).arg(  column ).arg(  filter ) );
+           }
+          
+           return conditions.join(  " OR " );
+          }
+
+

./ui/widgets/directories_management_widget.cpp

+ +       1  #include "directories_management_widget.h"
+          
+          // Genre
+          #include "create_genre_request.h"
+          #include "genres_model.h"
+          #include "genres_repository.h"
+          
+          // Hall
+          #include "create_hall_request.h"
+          #include "halls_model.h"
+          #include "halls_repository.h"
+          
+          // Movie
+          #include "create_movie_request.h"
+          #include "movies_model.h"
+          #include "movies_repository.h"
+          
+          // Common
+          #include "error_dialog.h"
+          #include "model_manager.h"
+          #include "repository_manager.h"
+          #include "repository_result.h"
+          #include "schema_metadata.h"
+          #include <QMessageBox>
+          
+      26  DirectoriesManagementWidget::DirectoriesManagementWidget(  QWidget *parent )
+           : QWidget(  parent ),   selectedGenreId_(  -1 ),   selectedHallId_(  -1 ),  
+           selectedMovieId_(  -1 ) {
+           setupUi(  this );
+          
+           initializeRepositories(   ); // First of second
+           initializeModels(   ); // First of second
+           setupTableViews(   ); // After initialization of models
+           setupGenreFinder(   );
+           setupConnections(   );
+          }
+          
+      38  void DirectoriesManagementWidget::initializeRepositories(   ) {
+           RepositoryManager &repositoryManager = RepositoryManager::instance(   );
+           SchemaMetadata metadata = SchemaMetadata::defaultSchema(   );
+          
+           genresRepository_ = repositoryManager.getRepositoryAs<GenresRepository>(  
+           metadata.repositoryTableName(  "genres" ) );
+          
+           hallsRepository_ = repositoryManager.getRepositoryAs<HallsRepository>(  
+           metadata.repositoryTableName(  "halls" ) );
+          
+           moviesRepository_ = repositoryManager.getRepositoryAs<MoviesRepository>(  
+           metadata.repositoryTableName(  "movies" ) );
+          
+           if (  !bool(  genresRepository_ && hallsRepository_ && moviesRepository_ ) ) {
+           qFatal(   )
+           << "DirectoriesManagementWidget::initializeRepositories: Failed to "
+           "initialize repositories";
+           }
+          }
+          
+      58  void DirectoriesManagementWidget::initializeModels(   ) {
+           ModelManager &modelManager = ModelManager::instance(   );
+           SchemaMetadata metadata = SchemaMetadata::defaultSchema(   );
+          
+           genresModel_ =
+           modelManager.getModelAs<GenresModel>(  metadata.modelTableName(  "genres" ) );
+          
+           hallsModel_ =
+           modelManager.getModelAs<HallsModel>(  metadata.modelTableName(  "halls" ) );
+          
+           moviesModel_ =
+           modelManager.getModelAs<MoviesModel>(  metadata.modelTableName(  "movies" ) );
+          
+           if (  !bool(  genresModel_ && hallsModel_ && moviesModel_ ) ) {
+           qFatal(   ) << "DirectoriesManagementWidget::initializeModels: Failed to "
+           "initialize models";
+           }
+          }
+          
+      77  void DirectoriesManagementWidget::setupGenreFinder(   ) {
+           SchemaMetadata metadata = SchemaMetadata::defaultSchema(   );
+          
+           genreFinder->setDefaultRelation(  "genres" );
+           genreFinder->setLabelText(  EntityFinderWidget::tr(  "Select genre" ) );
+           genreFinder->setLineEditPlaceholder(  
+           EntityFinderWidget::tr(  "Here will be information about selected genre" ) );
+          }
+          
+      86  void DirectoriesManagementWidget::setupTableViews(   ) {
+           tableHalls->setModel(  hallsModel_ );
+          
+           tableMovies->setModel(  moviesModel_ );
+          
+           tableGenres->setModel(  genresModel_ );
+          }
+          
+      94  void DirectoriesManagementWidget::setupConnections(   ) {
+           connect(  btnAddHall,   &QPushButton::clicked,   this,  
+           &DirectoriesManagementWidget::onPushButtonAddHallClicked );
+          
+           connect(  btnAddMovie,   &QPushButton::clicked,   this,  
+           &DirectoriesManagementWidget::onPushButtonAddMovieClicked );
+          
+           connect(  btnAddGenre,   &QPushButton::clicked,   this,  
+           &DirectoriesManagementWidget::onPushButtonAddGenreClicked );
+          
+           connect(  genreFinder,   &EntityFinderWidget::fieldRetrieved,   this,  
+           &DirectoriesManagementWidget::onGenreFieldRetrieved );
+          }
+          
+     108  void DirectoriesManagementWidget::onPushButtonAddMovieClicked(   ) {
+           if (  selectedGenreId_ == -1 ) {
+           QMessageBox::warning(  this,   QMessageBox::tr(  "Error" ),  
+           QMessageBox::tr(  "No genre selected" ) );
+           }
+          
+           QString title = lineEditMovieName->text(   );
+           int duration = spinBoxMovieDuration->value(   );
+          
+           CreateMovieRequest request;
+           request.setTitle(  title );
+           request.setDuration(  duration );
+           request.setGenreId(  selectedGenreId_ );
+          
+           RepositoryResult result = moviesRepository_->createMovie(  request );
+           if (  !result.success ) {
+           qWarning(   ) << "Failed to create movie:" << result.errorMessage;
+           ErrorDialog::displayError(  this,   result.errorMessage );
+           }
+          }
+          
+     129  void DirectoriesManagementWidget::onPushButtonAddHallClicked(   ) {
+           QString name = lineEditHallName->text(   );
+           int capacity = spinBoxNumberOfSeats->value(   );
+          
+           CreateHallRequest request;
+           request.setHallName(  name );
+           request.setCapacity(  capacity );
+          
+           RepositoryResult result = hallsRepository_->createHall(  request );
+           if (  !result.success ) {
+           qWarning(   ) << "Failed to create hall:" << result.errorMessage;
+           ErrorDialog::displayError(  this,   result.errorMessage );
+           }
+          }
+          
+     144  void DirectoriesManagementWidget::onGenreFieldRetrieved(  
+     145   const QSqlField &field ) {
+           selectedGenreId_ = field.value(   ).toInt(   );
+          }
+          
+     149  void DirectoriesManagementWidget::onPushButtonAddGenreClicked(   ) {
+           QString name = lineEditGenreName->text(   );
+          
+           CreateGenreRequest request;
+           request.setGenreName(  name );
+          
+           RepositoryResult result = genresRepository_->createGenre(  request );
+           if (  !result.success ) {
+           qWarning(   ) << "Failed to create genre:" << result.errorMessage;
+           ErrorDialog::displayError(  this,   result.errorMessage );
+           }
+          }
+
+

./ui/widgets/entity_deleter_widget.cpp

+ +       1  #include "entity_deleter_widget.h"
+          
+          #include "error_dialog.h"
+          #include "genres_repository_interface.h"
+          #include "halls_repository_interface.h"
+          #include "movies_repository_interface.h"
+          #include "refunds_repository_interface.h"
+          #include "repository_result.h"
+          #include "sessions_repository_interface.h"
+          #include "tickets_repository_interface.h"
+          
+          #include <QMessageBox>
+          #include <QSqlTableModel>
+          
+      15  EntityDeleterWidget::EntityDeleterWidget(  QWidget *parent ) : QWidget(  parent ) {
+           setupUi(  this );
+          
+           setupComboBoxCurrentTable(   );
+           setupEntityFinder(   );
+           setupConnections(   );
+          }
+          
+      23  void EntityDeleterWidget::setupComboBoxCurrentTable(   ) {
+           SchemaMetadata metadata = SchemaMetadata::defaultSchema(   );
+          
+           QStringList databaseTableNames = {"genres",   "halls",   "movies",  
+           "refunds",   "sessions",   "tickets"};
+          
+           for (  const QString currentDTN : databaseTableNames ) {
+           comboBoxCurrentTable->addItem(  metadata.translatedTableName(  currentDTN ),  
+           currentDTN );
+           }
+          }
+          
+      35  void EntityDeleterWidget::setupConnections(   ) {
+           connect(  comboBoxCurrentTable,   &QComboBox::currentIndexChanged,   this,  
+           &EntityDeleterWidget::onComboBoxCurrentTableCurrentIndexChanged );
+          
+           connect(  entityFinder,   &EntityFinderWidget::fieldRetrieved,   this,  
+           &EntityDeleterWidget::onFieldRetrieved );
+          
+           connect(  entityFinder,   &EntityFinderWidget::recordRetrieved,   this,  
+           &EntityDeleterWidget::onRecordRetrieved );
+          
+           connect(  pushButtonDeleteEntity,   &QPushButton::clicked,   this,  
+           &EntityDeleterWidget::onPushButtonDeleteEntityClicked );
+          }
+          
+      49  void EntityDeleterWidget::setupEntityFinder(   ) {
+           entityFinder->setLabelText(  tr(  "Select record of current table to delete" ) );
+           refreshEntityFinder(   );
+          }
+          
+      54  void EntityDeleterWidget::refreshEntityFinder(   ) {
+           const QString &databaseTableName =
+           comboBoxCurrentTable->currentData(   ).toString(   );
+          
+           entityFinder->setDefaultRelation(  databaseTableName );
+          }
+          
+      61  void EntityDeleterWidget::onComboBoxCurrentTableCurrentIndexChanged(  int index ) {
+           refreshEntityFinder(   );
+          
+           const QString &databaseTableName =
+           comboBoxCurrentTable->currentData(   ).toString(   );
+          
+           qInfo(   ) << "Current table was changed:" << "CurrentComboBoxIndex:" << index
+           << "databaseTableName:" << databaseTableName;
+          }
+          
+      71  void EntityDeleterWidget::onFieldRetrieved(  const QSqlField &field ) {
+           retrievedField_ = field;
+          }
+          
+      75  void EntityDeleterWidget::onRecordRetrieved(  const QSqlRecord &record ) {
+           // NOTE: It is possible to reduce the behavior of each of the tables if the
+           // removal is in different ways with other data
+           selectedRecord_ = record;
+          }
+          
+          template <>
+          RepositoryResult
+      83  EntityDeleterWidget::deleteEntityById<GenresRepositoryInterface>(   ) {
+           return currentRepository<GenresRepositoryInterface>(   )->deleteGenreById(  
+           retrievedField_.value(   ).toInt(   ) );
+          }
+          
+          template <>
+          RepositoryResult
+      90  EntityDeleterWidget::deleteEntityById<HallsRepositoryInterface>(   ) {
+           return currentRepository<HallsRepositoryInterface>(   )->deleteHallById(  
+           retrievedField_.value(   ).toInt(   ) );
+          }
+          
+          template <>
+          RepositoryResult
+      97  EntityDeleterWidget::deleteEntityById<MoviesRepositoryInterface>(   ) {
+           return currentRepository<MoviesRepositoryInterface>(   )->deleteMovieById(  
+           retrievedField_.value(   ).toInt(   ) );
+          }
+          
+          template <>
+          RepositoryResult
+     104  EntityDeleterWidget::deleteEntityById<RefundsRepositoryInterface>(   ) {
+           return currentRepository<RefundsRepositoryInterface>(   )->deleteRefundById(  
+           retrievedField_.value(   ).toInt(   ) );
+          }
+          
+          template <>
+          RepositoryResult
+     111  EntityDeleterWidget::deleteEntityById<SessionsRepositoryInterface>(   ) {
+           return currentRepository<SessionsRepositoryInterface>(   )->deleteSessionById(  
+           retrievedField_.value(   ).toInt(   ) );
+          }
+          
+          template <>
+          RepositoryResult
+     118  EntityDeleterWidget::deleteEntityById<TicketsRepositoryInterface>(   ) {
+           return currentRepository<TicketsRepositoryInterface>(   )->deleteTicketById(  
+           retrievedField_.value(   ).toInt(   ) );
+          }
+          
+     123  void EntityDeleterWidget::onPushButtonDeleteEntityClicked(   ) {
+           const QString &databaseTableName =
+           comboBoxCurrentTable->currentData(   ).toString(   );
+          
+           RepositoryResult result;
+          
+           if (  databaseTableName == "genres" ) {
+          
+           result = deleteEntityById<GenresRepositoryInterface>(   );
+           showMessageDialog(  result,   tr(  "Genre deleted successfully" ) );
+          
+           } else if (  databaseTableName == "halls" ) {
+          
+           result = deleteEntityById<HallsRepositoryInterface>(   );
+           showMessageDialog(  result,   tr(  "Hall deleted successfully" ) );
+          
+           } else if (  databaseTableName == "movies" ) {
+          
+           result = deleteEntityById<MoviesRepositoryInterface>(   );
+           showMessageDialog(  result,   tr(  "Movie deleted successfully" ) );
+          
+           } else if (  databaseTableName == "refunds" ) {
+          
+           result = deleteEntityById<RefundsRepositoryInterface>(   );
+           showMessageDialog(  result,   tr(  "Refund deleted successfully" ) );
+          
+           } else if (  databaseTableName == "sessions" ) {
+          
+           result = deleteEntityById<SessionsRepositoryInterface>(   );
+           showMessageDialog(  result,   tr(  "Session deleted successfully" ) );
+          
+           } else if (  databaseTableName == "tickets" ) {
+          
+           result = deleteEntityById<TicketsRepositoryInterface>(   );
+           showMessageDialog(  result,   tr(  "Ticket deleted successfully" ) );
+          
+           } else {
+           qCritical(   ) << "EntityDeleterWidget::onPressPushButtonDeleteEntity: "
+           "Unknown database table name:"
+           << databaseTableName;
+           }
+          
+           // NOTE: Application connector will reset entity finder
+          
+           // if (  result.success ) {
+           // entityFinder->resetToDefault(   );
+           // }
+          }
+          
+     172  void EntityDeleterWidget::showMessageDialog(  const RepositoryResult &result,  
+     173   const QString &successMessage ) {
+           if (  !result.success ) {
+           ErrorDialog::displayError(  this,   result.errorMessage );
+           } else {
+           QMessageBox::information(  this,   QMessageBox::tr(  "Success" ),   successMessage );
+           }
+          }
+
+

./ui/widgets/entity_finder_widget.cpp

+ +       1  #include "entity_finder_widget.h"
+          
+          #include "base_sql_table_model.h"
+          #include "model_manager.h"
+          #include "schema_metadata.h"
+          #include "search_dialog.h"
+          
+       8  EntityFinderWidget::EntityFinderWidget(  QWidget *parent ) : QWidget(  parent ) {
+           setupUi(  this );
+          
+           setupConnections(   );
+           setupFrameStyle(   );
+          }
+          
+      15  EntityFinderWidget::EntityFinderWidget(  const QString &tableName,  
+      16   const QString &fieldName,  
+      17   QWidget *parent )
+           : EntityFinderWidget(  parent ) {
+           setModelTableName(  tableName );
+           setFieldName(  fieldName );
+          }
+          
+      23  void EntityFinderWidget::setHiddenFrame(  bool hidden ) {
+           QLayout *frameLayout = frame->layout(   );
+           bool isHidden = frame->frameStyle(   ) == QFrame::NoFrame;
+          
+           if (  isHidden == hidden ) {
+           return;
+           }
+          
+           if (  hidden ) {
+           frame->setFrameStyle(  QFrame::NoFrame );
+           frameLayout->setContentsMargins(  0,   0,   0,   0 );
+           } else {
+           frame->setFrameStyle(  originalFrameStyle_ );
+           frameLayout->setContentsMargins(  9,   9,   9,   9 );
+           }
+          
+           parentWidget(   )->adjustSize(   );
+          }
+          
+      42  void EntityFinderWidget::refreshLineEditText(  const QSqlRecord &record ) {
+           ModelManager &modelManager = ModelManager::instance(   );
+          
+           BaseSqlTableModel *model =
+           modelManager.getModelAs<BaseSqlTableModel>(  modelTableName_ );
+          
+           QStringList columnDataList;
+          
+           for (  int i = 0; i < record.count(   ); ++i ) {
+           QString columnName = model->headerData(  i,   Qt::Horizontal ).toString(   );
+           QString columnValue = record.value(  i ).toString(   );
+           columnDataList.append(  QString(  "%1: %2" ).arg(  columnName,   columnValue ) );
+           }
+          
+           lineEditEntityInformation->setText(  columnDataList.join(  " | " ) );
+          }
+          
+      59  void EntityFinderWidget::setDefaultRelation(  
+      60   const QString &databaseRelationName ) {
+           SchemaMetadata metadata = SchemaMetadata::defaultSchema(   );
+           setModelTableName(  metadata.modelTableName(  databaseRelationName ) );
+           setFieldName(  metadata.primaryIdColumnName(  databaseRelationName ) );
+          
+           qInfo(   ) << "Default relation name set to:" << databaseRelationName;
+          }
+          
+      68  void EntityFinderWidget::setupConnections(   ) {
+           connect(  pushButtonFindEntity,   &QPushButton::clicked,   this,  
+           &EntityFinderWidget::onPushButtonFindEntityClicked );
+          }
+          
+      73  void EntityFinderWidget::setupFrameStyle(   ) {
+           originalFrameStyle_ = frame->frameStyle(   );
+          }
+          
+      77  void EntityFinderWidget::resetToDefault(   ) {
+           qInfo(   ) << "Resetting entity finder to default:"
+           << "Name of EntityFinderWidget:" << objectName(   );
+           lineEditEntityInformation->setText(  "" );
+          
+           emit reseted(   );
+          }
+          
+      85  void EntityFinderWidget::onPushButtonFindEntityClicked(   ) {
+           SearchDialog searchDialog(  modelTableName_,   fieldName_,   this );
+          
+           // All its signals are automatically disconnected from the slots
+          
+           connect(  &searchDialog,   &SearchDialog::rowSelected,   this,  
+           &EntityFinderWidget::onRowSelected );
+          
+           connect(  &searchDialog,   &SearchDialog::fieldRetrieved,   this,  
+           &EntityFinderWidget::onFieldRetrieved );
+          
+           connect(  &searchDialog,   &SearchDialog::recordRetrieved,   this,  
+           &EntityFinderWidget::onRecordRetrieved );
+          
+           searchDialog.exec(   );
+          }
+          
+     102  void EntityFinderWidget::onRowSelected(  int rowIndex ) {
+           emit rowSelected(  rowIndex );
+          }
+          
+     106  void EntityFinderWidget::onRecordRetrieved(  const QSqlRecord &rowValues ) {
+           refreshLineEditText(  rowValues );
+           emit recordRetrieved(  rowValues );
+          }
+          
+     111  void EntityFinderWidget::onFieldRetrieved(  const QSqlField &field ) {
+           emit fieldRetrieved(  field );
+          }
+
+

./ui/widgets/entity_updater_widget.cpp

+ +       1  #include "entity_updater_widget.h"
+          
+          #include "genres_repository_interface.h"
+          #include "halls_repository_interface.h"
+          #include "movies_repository_interface.h"
+          #include "refunds_repository_interface.h"
+          #include "sessions_repository_interface.h"
+          #include "tickets_repository_interface.h"
+          
+          #include "update_genre_request.h"
+          #include "update_hall_request.h"
+          #include "update_movie_request.h"
+          #include "update_refund_request.h"
+          #include "update_session_request.h"
+          #include "update_ticket_request.h"
+          
+          #include "error_dialog.h"
+          #include "model_manager.h"
+          
+          #include "base_sql_table_model.h"
+          #include <QMessageBox>
+          #include <qsqlrelationaltablemodel.h>
+          
+          namespace DatabaseTableNames {
+      25  static constexpr char Genres[] = "genres";
+      26  static constexpr char Halls[] = "halls";
+      27  static constexpr char Movies[] = "movies";
+      28  static constexpr char Refunds[] = "refunds";
+      29  static constexpr char Sessions[] = "sessions";
+      30  static constexpr char Tickets[] = "tickets";
+          } // namespace DatabaseTableNames
+          
+      33  EntityUpdaterWidget::EntityUpdaterWidget(  QWidget *parent )
+           : QWidget(  parent ),   primaryKey_(  -1 ) {
+           setupUi(  this );
+          
+           setupConnections(   );
+           setupComboBoxCurrentTable(   ); // After setup connections
+           setupParentEntityFinderWidget(   );
+           setupChildEntityFinderWidget(   );
+          }
+          
+      43  void EntityUpdaterWidget::setupComboBoxCurrentTable(   ) {
+           SchemaMetadata metadata = SchemaMetadata::defaultSchema(   );
+          
+           QList<QString> databaseTableNames = {
+           DatabaseTableNames::Genres,   DatabaseTableNames::Halls,  
+           DatabaseTableNames::Movies,   DatabaseTableNames::Refunds,  
+           DatabaseTableNames::Sessions,   DatabaseTableNames::Tickets};
+          
+           for (  const QString &tableName : databaseTableNames ) {
+           comboBoxCurrentTable->addItem(  metadata.translatedTableName(  tableName ),  
+           tableName );
+           }
+          }
+          
+      57  void EntityUpdaterWidget::setupConnections(   ) {
+           connect(  foreignKeyFinder,   &EntityFinderWidget::fieldRetrieved,   this,  
+           &EntityUpdaterWidget::onForeignFieldRetrieved );
+          
+           connect(  primaryKeyFinder,   &EntityFinderWidget::fieldRetrieved,   this,  
+           &EntityUpdaterWidget::onPrimaryFieldRetrieved );
+          
+           connect(  primaryKeyFinder,   &EntityFinderWidget::recordRetrieved,   this,  
+           &EntityUpdaterWidget::onPrimaryEntityRetrieved );
+          
+           connect(  comboBoxCurrentTable,   &QComboBox::currentIndexChanged,   this,  
+           &EntityUpdaterWidget::onTableSelected );
+          
+           connect(  comboBoxCurrentColumn,   &QComboBox::currentIndexChanged,   this,  
+           &EntityUpdaterWidget::onColumnSelected );
+          
+           connect(  pushButtonUpdate,   &QPushButton::clicked,   this,  
+           &EntityUpdaterWidget::onPushButtonUpdateClicked );
+          }
+          
+      77  void EntityUpdaterWidget::setupChildEntityFinderWidget(   ) {
+           foreignKeyFinder->setLabelText(  
+           EntityFinderWidget::tr(  "Select entity for replacement" ) );
+           foreignKeyFinder->setLineEditPlaceholder(  
+           EntityFinderWidget::tr(  "Here will be information about selected entity" ) );
+           foreignKeyFinder->setHiddenFrame(  true );
+          }
+          
+      85  void EntityUpdaterWidget::setupParentEntityFinderWidget(   ) {
+           primaryKeyFinder->setLabelText(  
+           EntityFinderWidget::tr(  "Select entity for updating" ) );
+           primaryKeyFinder->setLineEditPlaceholder(  
+           EntityFinderWidget::tr(  "Here will be information about selected entry" ) );
+          }
+          
+      92  void EntityUpdaterWidget::configureForeignKeyFinder(  
+      93   const QString &columnName,   const QString &databaseTableName ) {
+           TableInfoSQLite tableInfo(  databaseTableName );
+          
+           if (  tableInfo.isPrimaryKey(  columnName ) ) {
+           // NOTE: Change Primary Key is prohibited
+          
+           // configurePrimaryKeyFinder(  databaseTableName );
+           return;
+           }
+          
+           QString foreignKeyDatabaseTableName = tableInfo.foreignKeyTable(  columnName );
+           if (  foreignKeyDatabaseTableName.isEmpty(   ) ) {
+           qCritical(   )
+           << "Could not find the database table name for the key column,   which "
+           "contains \"_id\":"
+           << columnName;
+           return;
+           }
+          
+           configureForeignKeyFinder(  foreignKeyDatabaseTableName );
+          }
+          
+     115  void EntityUpdaterWidget::configureForeignKeyFinder(  
+     116   const QString &databaseTableName ) {
+           foreignKeyFinder->resetToDefault(   );
+           foreignKeyFinder->setDefaultRelation(  databaseTableName );
+          }
+          
+     121  void EntityUpdaterWidget::configurePrimaryKeyFinder(  
+     122   const QString &databaseTableName ) {
+           primaryKeyFinder->resetToDefault(   );
+           primaryKeyFinder->setDefaultRelation(  databaseTableName );
+          }
+          
+     127  void EntityUpdaterWidget::onPrimaryFieldRetrieved(  const QSqlField &field ) {
+           qInfo(   ) << "Selected primary field: Name:" << field.name(   )
+           << "Value:" << field.value(   );
+           primaryKey_ = field.value(   ).toInt(   );
+          }
+          
+     133  void EntityUpdaterWidget::onForeignFieldRetrieved(  const QSqlField &field ) {
+           qInfo(   ) << "Selected foreign field: Name:" << field.name(   )
+           << "Value:" << field.value(   );
+           selectedForeignField_ = field;
+          }
+          
+     139  void EntityUpdaterWidget::onPrimaryEntityRetrieved(  const QSqlRecord &entity ) {
+           qInfo(   ) << "Retrieved foreign entity:" << entity;
+           selectedPrimaryEntity_ = entity;
+          }
+          
+          template <>
+     145  QString EntityUpdaterWidget::actualColumnValue(  const QString &columnName ) {
+           QString value = isColumnsEqual(  columnName )
+           ? lineEdit->text(   )
+           : selectedPrimaryEntity_.value(  columnName ).toString(   );
+          
+           qInfo(   ) << "Actual column QString value:" << value;
+           return value;
+          }
+          
+          template <>
+     155  QDateTime EntityUpdaterWidget::actualColumnValue(  const QString &columnName ) {
+           QDateTime value = isColumnsEqual(  columnName )
+           ? dateTimeEdit->dateTime(   )
+           : selectedPrimaryEntity_.value(  columnName ).toDateTime(   );
+          
+           qInfo(   ) << "Actual column QDateTime value:" << value;
+           return value;
+          }
+          
+          template <>
+     165  int EntityUpdaterWidget::actualColumnValue(  const QString &columnName ) {
+           int value = isColumnsEqual(  columnName )
+           ? spinBox->value(   )
+           : selectedPrimaryEntity_.value(  columnName ).toInt(   );
+          
+           qInfo(   ) << "Actual column int value:" << value;
+           return value;
+          }
+          
+          template <>
+     175  double EntityUpdaterWidget::actualColumnValue(  const QString &columnName ) {
+           double value = isColumnsEqual(  columnName )
+           ? doubleSpinBox->value(   )
+           : selectedPrimaryEntity_.value(  columnName ).toDouble(   );
+          
+           qInfo(   ) << "Actual column double value:" << value;
+           return value;
+          }
+          
+     184  qint32 EntityUpdaterWidget::actualForeignKey(  const QString &columnName ) {
+           qint32 value = isColumnsEqual(  columnName )
+           ? selectedForeignField_.value(   ).toInt(   )
+           : selectedPrimaryEntity_.value(  columnName ).toInt(   );
+          
+           qInfo(   ) << "Actual foreign key:" << value;
+           return value;
+          }
+          
+          template <>
+          RepositoryResult
+     195  EntityUpdaterWidget::updateEntity<GenresRepositoryInterface>(   ) {
+           UpdateGenreRequest request;
+           request.setGenreId(  primaryKey_ );
+           request.setGenreName(  actualColumnValue<QString>(  "genre_name" ) );
+          
+           return currentRepository<GenresRepositoryInterface>(   )->updateGenre(  request );
+          }
+          
+          template <>
+     204  RepositoryResult EntityUpdaterWidget::updateEntity<HallsRepositoryInterface>(   ) {
+           UpdateHallRequest request;
+           request.setHallId(  primaryKey_ );
+           request.setCapacity(  actualColumnValue<int>(  "capacity" ) );
+           request.setHallName(  actualColumnValue<QString>(  "hall_name" ) );
+          
+           return currentRepository<HallsRepositoryInterface>(   )->updateHall(  request );
+          }
+          
+          template <>
+          RepositoryResult
+     215  EntityUpdaterWidget::updateEntity<MoviesRepositoryInterface>(   ) {
+           UpdateMovieRequest request;
+           request.setMovieId(  primaryKey_ );
+           request.setDuration(  actualColumnValue<int>(  "duration" ) );
+           request.setGenreId(  actualForeignKey(  "genre_id" ) );
+           request.setTitle(  actualColumnValue<QString>(  "title" ) );
+          
+           return currentRepository<MoviesRepositoryInterface>(   )->updateMovie(  request );
+          }
+          
+          template <>
+          RepositoryResult
+     227  EntityUpdaterWidget::updateEntity<RefundsRepositoryInterface>(   ) {
+           UpdateRefundRequest request;
+           request.setRefundId(  primaryKey_ );
+           request.setRefundAmount(  actualColumnValue<double>(  "refund_amount" ) );
+           request.setRefundAt(  actualColumnValue<QDateTime>(  "refund_at" ) );
+           request.setTicketId(  actualForeignKey(  "ticket_id" ) );
+          
+           return currentRepository<RefundsRepositoryInterface>(   )->updateRefund(  request );
+          }
+          
+          template <>
+          RepositoryResult
+     239  EntityUpdaterWidget::updateEntity<SessionsRepositoryInterface>(   ) {
+           UpdateSessionRequest request;
+           request.setSessionId(  primaryKey_ );
+           request.setHallId(  actualForeignKey(  "hall_id" ) );
+           request.setMovieId(  actualForeignKey(  "movie_id" ) );
+           request.setBeginAt(  actualColumnValue<QDateTime>(  "begin_at" ) );
+           request.setTicketPrice(  actualColumnValue<double>(  "ticket_price" ) );
+          
+           return currentRepository<SessionsRepositoryInterface>(   )->updateSession(  
+           request );
+          }
+          
+          template <>
+          RepositoryResult
+     253  EntityUpdaterWidget::updateEntity<TicketsRepositoryInterface>(   ) {
+           UpdateTicketRequest request;
+           request.setTicketId(  primaryKey_ );
+           request.setSeatNumber(  actualColumnValue<int>(  "seat_number" ) );
+           request.setSessionId(  actualForeignKey(  "session_id" ) );
+           request.setSoldAt(  actualColumnValue<QDateTime>(  "sold_at" ) );
+          
+           return currentRepository<TicketsRepositoryInterface>(   )->updateTicket(  request );
+          }
+          
+          template <>
+     264  void EntityUpdaterWidget::processEntityUpdate<DatabaseTableNames::Genres>(  
+     265   RepositoryResult &resultOut ) {
+           resultOut = updateEntity<GenresRepositoryInterface>(   );
+           if (  !resultOut.success ) {
+           ErrorDialog::displayError(  this,   resultOut.errorMessage );
+           return;
+           }
+           showMessageDialog(  resultOut,  
+           EntityUpdaterWidget::tr(  "Genre updated successfully" ) );
+          }
+          
+          template <>
+     276  void EntityUpdaterWidget::processEntityUpdate<DatabaseTableNames::Halls>(  
+     277   RepositoryResult &resultOut ) {
+           resultOut = updateEntity<HallsRepositoryInterface>(   );
+           if (  !resultOut.success ) {
+           ErrorDialog::displayError(  this,   resultOut.errorMessage );
+           return;
+           }
+           showMessageDialog(  resultOut,  
+           EntityUpdaterWidget::tr(  "Hall updated successfully" ) );
+          }
+          
+          template <>
+     288  void EntityUpdaterWidget::processEntityUpdate<DatabaseTableNames::Movies>(  
+     289   RepositoryResult &resultOut ) {
+           resultOut = updateEntity<MoviesRepositoryInterface>(   );
+           if (  !resultOut.success ) {
+           ErrorDialog::displayError(  this,   resultOut.errorMessage );
+           return;
+           }
+           showMessageDialog(  resultOut,  
+           EntityUpdaterWidget::tr(  "Movie updated successfully" ) );
+          }
+          
+          template <>
+     300  void EntityUpdaterWidget::processEntityUpdate<DatabaseTableNames::Refunds>(  
+     301   RepositoryResult &resultOut ) {
+           resultOut = updateEntity<RefundsRepositoryInterface>(   );
+           if (  !resultOut.success ) {
+           ErrorDialog::displayError(  this,   resultOut.errorMessage );
+           return;
+           }
+           showMessageDialog(  resultOut,  
+           EntityUpdaterWidget::tr(  "Refund updated successfully" ) );
+          }
+          
+          template <>
+     312  void EntityUpdaterWidget::processEntityUpdate<DatabaseTableNames::Sessions>(  
+     313   RepositoryResult &resultOut ) {
+           resultOut = updateEntity<SessionsRepositoryInterface>(   );
+           if (  !resultOut.success ) {
+           ErrorDialog::displayError(  this,   resultOut.errorMessage );
+           return;
+           }
+           showMessageDialog(  resultOut,  
+           EntityUpdaterWidget::tr(  "Session updated successfully" ) );
+          }
+          
+          template <>
+     324  void EntityUpdaterWidget::processEntityUpdate<DatabaseTableNames::Tickets>(  
+     325   RepositoryResult &resultOut ) {
+           resultOut = updateEntity<TicketsRepositoryInterface>(   );
+           if (  !resultOut.success ) {
+           ErrorDialog::displayError(  this,   resultOut.errorMessage );
+           return;
+           }
+           showMessageDialog(  resultOut,  
+           EntityUpdaterWidget::tr(  "Ticket updated successfully" ) );
+          }
+          
+     335  void EntityUpdaterWidget::onPushButtonUpdateClicked(   ) {
+           const QString &databaseTableName =
+           comboBoxCurrentTable->currentData(   ).toString(   );
+          
+           RepositoryResult result;
+          
+           if (  databaseTableName == DatabaseTableNames::Genres ) {
+           processEntityUpdate<DatabaseTableNames::Genres>(  result );
+          
+           } else if (  databaseTableName == DatabaseTableNames::Halls ) {
+           processEntityUpdate<DatabaseTableNames::Halls>(  result );
+          
+           } else if (  databaseTableName == DatabaseTableNames::Movies ) {
+           processEntityUpdate<DatabaseTableNames::Movies>(  result );
+          
+           } else if (  databaseTableName == DatabaseTableNames::Refunds ) {
+           processEntityUpdate<DatabaseTableNames::Refunds>(  result );
+          
+           } else if (  databaseTableName == DatabaseTableNames::Sessions ) {
+           processEntityUpdate<DatabaseTableNames::Sessions>(  result );
+          
+           } else if (  databaseTableName == DatabaseTableNames::Tickets ) {
+           processEntityUpdate<DatabaseTableNames::Tickets>(  result );
+          
+           } else {
+           qFatal(   ) << "EntityDeleterWidget::onPressPushButtonDeleteEntity: "
+           "Unknown database table name:"
+           << databaseTableName;
+           }
+          
+           processUpdateResult(  result );
+          }
+          
+     368  void EntityUpdaterWidget::onTableSelected(  int tableIndex ) {
+           SchemaMetadata metadata = SchemaMetadata::defaultSchema(   );
+          
+           const QString &databaseTableName =
+           comboBoxCurrentTable->itemData(  tableIndex ).toString(   );
+          
+           ModelManager &modelManager = ModelManager::instance(   );
+           BaseSqlTableModel *model = modelManager.getModelAs<BaseSqlTableModel>(  
+           metadata.modelTableName(  databaseTableName ) );
+          
+           comboBoxCurrentColumn->clear(   );
+           for (  const auto &columnName : model->columnNames(   ) ) {
+           if (  metadata.primaryIdColumnName(  databaseTableName ) == columnName ) {
+           // NOTE: Change Primary Key is prohibited
+           continue;
+           }
+          
+           int headerIndex = model->columnIndex(  columnName );
+           QString displayName =
+           model->headerData(  headerIndex,   Qt::Horizontal ).toString(   );
+           comboBoxCurrentColumn->addItem(  displayName,   columnName );
+           }
+          
+           configurePrimaryKeyFinder(  databaseTableName );
+          }
+          
+     394  void EntityUpdaterWidget::onColumnSelected(  int columnIndex ) {
+           Q_UNUSED(  columnIndex );
+          
+           const QString &databaseTableName =
+           comboBoxCurrentTable->currentData(   ).toString(   );
+           TableInfoSQLite tableInfoSQLite(  databaseTableName );
+          
+           QString columnName = comboBoxCurrentColumn->currentData(   ).toString(   );
+           bool isKey = columnName.contains(  "_id",   Qt::CaseInsensitive );
+          
+           QWidget *page;
+           switch (  tableInfoSQLite.columnMetaType(  columnName ) ) {
+           case QMetaType::Int: {
+           page =
+           findChild<QWidget *>(  isKey ? "pageChildFinderWidget" : "pageSpinBox" );
+           } break;
+           case QMetaType::Double:
+           page = findChild<QWidget *>(  "pageDoubleSpinBox" );
+           break;
+           case QMetaType::QString:
+           page = findChild<QWidget *>(  "pageLineEdit" );
+           break;
+           case QMetaType::QDateTime:
+           page = findChild<QWidget *>(  "pageDateTimeEdit" );
+           break;
+           default:
+           qCritical(   ) << "Unknown column selected";
+           return;
+           }
+           stackedWidget->setCurrentWidget(  page );
+          
+           if (  isKey ) {
+           configureForeignKeyFinder(  columnName,   databaseTableName );
+           }
+          }
+          
+     430  QModelIndex EntityUpdaterWidget::findIndexByColumn(  QAbstractItemModel *model,  
+           int column,  
+     432   const QVariant &value ) {
+           if (  !model || column < 0 || column >= model->columnCount(   ) )
+           return QModelIndex(   );
+          
+           for (  int row = 0; row < model->rowCount(   ); ++row ) {
+           QModelIndex index = model->index(  row,   column );
+           if (  model->data(  index ) == value ) {
+           return index;
+           }
+           }
+          
+           return QModelIndex(   );
+          }
+          
+     446  bool EntityUpdaterWidget::isColumnsEqual(  const QString &other ) {
+           TableInfoSQLite tableInfo(  comboBoxCurrentTable->currentData(   ).toString(   ) );
+           QString current = comboBoxCurrentColumn->currentData(   ).toString(   );
+          
+           bool isEqual = tableInfo.columnIndex(  current ) == tableInfo.columnIndex(  other );
+          
+           const static QString billet(  "Column \"%1\" and column \"%2\": %3" );
+           qInfo(   ).noquote(   ) << billet.arg(  current ).arg(  other ).arg(  
+           isEqual ? "Equal" : "Not equal" );
+          
+           return isEqual;
+          };
+          
+     459  void EntityUpdaterWidget::processUpdateResult(  const RepositoryResult &result ) {
+           if (  !result.success ) {
+           return;
+           }
+          
+           const QString &databaseTableName =
+           comboBoxCurrentTable->currentData(   ).toString(   );
+          
+           SchemaMetadata metadata = SchemaMetadata::defaultSchema(   );
+           ModelManager &modelManager = ModelManager::instance(   );
+          
+           QSqlTableModel *model =
+           modelManager.getModel(  metadata.modelTableName(  databaseTableName ) );
+          
+           QString primaryKeyColumnName =
+           metadata.primaryIdColumnName(  databaseTableName );
+          
+           int columnIndex = selectedPrimaryEntity_.indexOf(  primaryKeyColumnName );
+           QModelIndex rowIndex = findIndexByColumn(  model,   columnIndex,   primaryKey_ );
+           selectedPrimaryEntity_ = model->record(  rowIndex.row(   ) );
+          
+           primaryKeyFinder->refreshLineEditText(  selectedPrimaryEntity_ );
+           foreignKeyFinder->resetToDefault(   );
+          }
+          
+     484  void EntityUpdaterWidget::showMessageDialog(  const RepositoryResult &result,  
+     485   const QString &successMessage ) {
+           if (  !result.success ) {
+           ErrorDialog::displayError(  this,   result.errorMessage );
+           } else {
+           QMessageBox::information(  this,   QMessageBox::tr(  "Success" ),   successMessage );
+           }
+          }
+
+

./ui/widgets/reports_widget.cpp

+ +       1  #include "reports_widget.h"
+          
+          #include <QMessageBox>
+          #include <QtCharts/QBarCategoryAxis>
+          #include <QtCharts/QDateTimeAxis>
+          #include <QtCharts/QLineSeries>
+          #include <QtCharts/QValueAxis>
+          
+       9  ReportsWidget::ReportsWidget(  QWidget *parent ) : QWidget(  parent ) {
+           setupUi(  this );
+          
+           setupTicketSalesReportWidgets(   );
+          }
+          
+      15  void ReportsWidget::setupTicketSalesReportWidgets(   ) {
+           genreReportWidget->configureReportForGenre(   );
+           hallReportWidget->configureReportForHall(   );
+           movieReportWidget->configureReportForMovie(   );
+          }
+
+

./ui/widgets/session_management_widget.cpp

+ +       1  #include "session_management_widget.h"
+          
+          #include "create_session_request.h"
+          #include "error_dialog.h"
+          #include "model_manager.h"
+          #include "repository_manager.h"
+          #include "repository_result.h"
+          #include "schema_metadata.h"
+          #include "sessions_model.h"
+          #include "sessions_repository.h"
+          #include <qnamespace.h>
+          
+      13  SessionManagementWidget::SessionManagementWidget(  QWidget *parent )
+           : QWidget(  parent ) {
+           setupUi(  this );
+          
+           initializeRepositories(   ); // First of second
+           initializeModels(   ); // First of second
+           setupTableView(   ); // After initialization of repositories
+           setupHallFinder(   );
+           setupMovieFinder(   );
+           setupConnections(   );
+          }
+          
+      25  void SessionManagementWidget::initializeRepositories(   ) {
+           RepositoryManager &repositoryManager = RepositoryManager::instance(   );
+           SchemaMetadata metadata = SchemaMetadata::defaultSchema(   );
+          
+           sessionsRepository_ = repositoryManager.getRepositoryAs<SessionsRepository>(  
+           metadata.repositoryTableName(  "sessions" ) );
+          
+           if (  !sessionsRepository_ ) {
+           qFatal(   ) << "SessionManagementWidget::initializeRepositories: Failed to "
+           "initialize repositories";
+           }
+          }
+          
+      38  void SessionManagementWidget::initializeModels(   ) {
+           ModelManager &modelManager = ModelManager::instance(   );
+           SchemaMetadata metadata = SchemaMetadata::defaultSchema(   );
+          
+           sessionsModel_ = modelManager.getModelAs<SessionsModel>(  
+           metadata.modelTableName(  "sessions" ) );
+          
+           if (  !bool(  sessionsModel_ ) ) {
+           qFatal(   ) << "SessionManagementWidget::initializeModels: Failed to "
+           "initialize models";
+           }
+          }
+          
+      51  void SessionManagementWidget::setupTableView(   ) {
+           tableSessions->setModel(  sessionsModel_ );
+          }
+          
+      55  void SessionManagementWidget::setupConnections(   ) {
+           connect(  btnAddSession,   &QPushButton::clicked,   this,  
+           &SessionManagementWidget::onPushButtonAddSessionClicked );
+          
+           connect(  hallFinder,   &EntityFinderWidget::fieldRetrieved,   this,  
+           &SessionManagementWidget::onHallFieldRetrieved );
+          
+           connect(  movieFinder,   &EntityFinderWidget::fieldRetrieved,   this,  
+           &SessionManagementWidget::onMovieFieldRetrieved );
+          }
+          
+      66  void SessionManagementWidget::setupHallFinder(   ) {
+           hallFinder->setDefaultRelation(  "halls" );
+           hallFinder->setLabelText(  EntityFinderWidget::tr(  "Select hall" ) );
+           hallFinder->setLineEditPlaceholder(  
+           EntityFinderWidget::tr(  "Here will be information about selected hall" ) );
+          }
+          
+      73  void SessionManagementWidget::setupMovieFinder(   ) {
+           movieFinder->setDefaultRelation(  "movies" );
+           movieFinder->setLabelText(  EntityFinderWidget::tr(  "Select movie" ) );
+           movieFinder->setLineEditPlaceholder(  
+           EntityFinderWidget::tr(  "Here will be information about selected movie" ) );
+          }
+          
+      80  void SessionManagementWidget::onPushButtonAddSessionClicked(   ) {
+           QDateTime beginAt = dateTimeEditBeginAt->dateTime(   );
+           double ticketPrice = spinBoxTicketPrice->value(   );
+          
+           CreateSessionRequest request;
+           request.setBeginAt(  beginAt );
+           request.setHallId(  selectedHallId_ );
+           request.setMovieId(  selectedMovieId_ );
+           request.setTicketPrice(  ticketPrice );
+          
+           RepositoryResult result = sessionsRepository_->createSession(  request );
+           if (  !result.success ) {
+           qWarning(   ) << "Failed to create session:" << result.errorMessage;
+           ErrorDialog::displayError(  this,   result.errorMessage );
+           }
+          };
+          
+      97  void SessionManagementWidget::onHallFieldRetrieved(  const QSqlField &field ) {
+           selectedHallId_ = field.value(   ).toInt(   );
+          }
+          
+     101  void SessionManagementWidget::onMovieFieldRetrieved(  const QSqlField &field ) {
+           selectedMovieId_ = field.value(   ).toInt(   );
+          }
+
+

./ui/widgets/single_record_time_range_widget.cpp

+ +       1  #include "single_record_time_range_widget.h"
+          
+       3  SingleRecordTimeRangeWidget::SingleRecordTimeRangeWidget(  QWidget *parent )
+           : QWidget(  parent ) {
+           setupUi(  this );
+          }
+
+

./ui/widgets/ticket_return_widget.cpp

+ +       1  #include "ticket_return_widget.h"
+          
+          #include "create_refund_request.h"
+          #include "error_dialog.h"
+          #include "model_manager.h"
+          #include "refunds_model.h"
+          #include "refunds_repository.h"
+          #include "repository_manager.h"
+          #include "repository_result.h"
+          #include "schema_metadata.h"
+          #include <QMessageBox>
+          
+      13  TicketReturnWidget::TicketReturnWidget(  QWidget *parent )
+           : QWidget(  parent ),   retrievedTicketField_(  -1 ) {
+           setupUi(  this );
+          
+           initializeRepositories(   );
+           initializeModels(   );
+           setupTableView(   ); // After initialization of models
+           setupTicketFinder(   );
+           setupConnections(   );
+          }
+          
+          // Setup widgets
+      25  void TicketReturnWidget::setupTableView(   ) {
+           tableRefunds->setModel(  refundsModel_ );
+          }
+          
+      29  void TicketReturnWidget::setupTicketFinder(   ) {
+           ticketFinder->setDefaultRelation(  "tickets" );
+           ticketFinder->setLabelText(  EntityFinderWidget::tr(  "Select ticket" ) );
+           ticketFinder->setLineEditPlaceholder(  
+           EntityFinderWidget::tr(  "Here will be information about selected ticket" ) );
+          }
+          
+      36  void TicketReturnWidget::initializeRepositories(   ) {
+           RepositoryManager &repositoryManager = RepositoryManager::instance(   );
+           SchemaMetadata metadata = SchemaMetadata::defaultSchema(   );
+          
+           refundsRepository_ = repositoryManager.getRepositoryAs<RefundsRepository>(  
+           metadata.repositoryTableName(  "refunds" ) );
+          
+           if (  !bool(  refundsRepository_ ) ) {
+           qFatal(   ) << "TicketReturnWidget::initializeRepositories: Failed to "
+           "initialize repositories";
+           }
+          }
+          
+      49  void TicketReturnWidget::initializeModels(   ) {
+           ModelManager &modelManager = ModelManager::instance(   );
+           SchemaMetadata metadata = SchemaMetadata::defaultSchema(   );
+          
+           refundsModel_ =
+           modelManager.getModelAs<RefundsModel>(  metadata.modelTableName(  "refunds" ) );
+          
+           if (  !bool(  refundsModel_ ) ) {
+           qFatal(   ) << "TicketReturnWidget::initializeModels: Failed to initialize "
+           "models";
+           }
+          }
+          
+      62  void TicketReturnWidget::setupConnections(   ) {
+           connect(  pushButtonRefundTicket,   &QPushButton::clicked,   this,  
+           &TicketReturnWidget::onPushButtonRefundTicketClicked );
+          
+           connect(  ticketFinder,   &EntityFinderWidget::fieldRetrieved,   this,  
+           &TicketReturnWidget::onTicketFieldRetrieved );
+          }
+          
+      70  void TicketReturnWidget::onPushButtonRefundTicketClicked(   ) {
+           if (  retrievedTicketField_ == -1 ) {
+           QMessageBox::warning(  this,   QMessageBox::tr(  "Error" ),  
+           QMessageBox::tr(  "No ticket selected" ) );
+           return;
+           }
+          
+           QDateTime refundAt;
+           if (  dateTimeEditRefund->isEnabled(   ) ) {
+           refundAt = dateTimeEditRefund->dateTime(   );
+           } else {
+           refundAt = QDateTime::currentDateTime(   );
+           }
+          
+           double refundAmount = spinBoxRefundAmount->value(   );
+          
+           CreateRefundRequest request;
+           request.setTicketId(  retrievedTicketField_ );
+           request.setRefundAt(  refundAt );
+           request.setRefundAmount(  refundAmount );
+          
+           RepositoryResult refundResult = refundsRepository_->createRefund(  request );
+          
+           if (  !refundResult.success ) {
+           qInfo(   ) << "Failed to refund ticket by id:" << retrievedTicketField_;
+           ErrorDialog::displayError(  this,   refundResult.errorMessage );
+           return;
+           }
+          
+           QString successMessage =
+           QMessageBox::tr(  "Ticket with number %1 has been successfully refunded." )
+           .arg(  retrievedTicketField_ );
+           QMessageBox::information(  this,   QMessageBox::tr(  "Success" ),   successMessage );
+          
+           ticketFinder->resetLineEditText(   );
+          }
+          
+     107  void TicketReturnWidget::onTicketFieldRetrieved(  const QSqlField &field ) {
+           retrievedTicketField_ = field.value(   ).toInt(   );
+          }
+
+

./ui/widgets/ticket_sale_widget.cpp

+ +       1  #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>
+          
+      15  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(   );
+          }
+          
+      26  void TicketSaleWidget::setupTableView(   ) {
+           tableTickets->setModel(  ticketsModel_ );
+          }
+          
+      30  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";
+           }
+          }
+          
+      43  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";
+           }
+          }
+          
+      56  void TicketSaleWidget::setupConnections(   ) {
+           connect(  btnSellTicket,   &QPushButton::clicked,   this,  
+           &TicketSaleWidget::onPushButtonSellTicketClicked );
+          
+           connect(  sessionFinder,   &EntityFinderWidget::fieldRetrieved,   this,  
+           &TicketSaleWidget::onFieldRetrieved );
+          }
+          
+      64  void TicketSaleWidget::setupSessionFinder(   ) {
+           sessionFinder->setDefaultRelation(  "sessions" );
+           sessionFinder->setLabelText(  EntityFinderWidget::tr(  "Select session" ) );
+           sessionFinder->setLineEditPlaceholder(  EntityFinderWidget::tr(  
+           "Here will be information about selected session" ) );
+          }
+          
+      71  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;
+           }
+          }
+          
+      97  void TicketSaleWidget::onFieldRetrieved(  const QSqlField &field ) {
+           selectedSessionId_ = field.value(   ).toInt(   );
+          }
+          
+          // Check if all values in initializer list are valid
+     102  void TicketSaleWidget::validateSessionValues(  
+     103   const std::initializer_list<QVariant> &valuesList ) {
+           for (  const auto &value : valuesList ) {
+           if (  !value.isValid(   ) ) {
+           return;
+           }
+           }
+          }
+
+

./ui/widgets/ticket_sales_report_widget.cpp

+ +       1  #include "ticket_sales_report_widget.h"
+          
+          #include "error_dialog.h"
+          #include "repository_manager.h"
+          #include "repository_result.h"
+          #include "schema_metadata.h"
+          #include "session_statistics_dto.h"
+          #include "sessions_statistics_repository.h"
+          #include "table_info_sqlite.h"
+          #include <QDateTimeAxis>
+          #include <QMessageBox>
+          #include <QScatterSeries>
+          #include <QValueAxis>
+          
+      15  TicketSalesReportWidget::SalesData::SalesData(   )
+           : refundExpenses_(  0 ),   refundedTickets_(  0 ),   salesRevenue_(  0 ),  
+           soldTickets_(  0 ),   maximumTickets_(  0 ) {}
+          
+      19  TicketSalesReportWidget::SalesData::SalesData(  double refundExpenses,  
+           double salesRevenue,  
+      21   qint32 refundedTickets,  
+      22   qint32 soldTickets,  
+      23   qint32 maxTickets )
+           : refundExpenses_(  refundExpenses ),   refundedTickets_(  refundedTickets ),  
+           salesRevenue_(  salesRevenue ),   soldTickets_(  soldTickets ),  
+           maximumTickets_(  maxTickets ) {}
+          
+          TicketSalesReportWidget::SalesData
+      29  TicketSalesReportWidget::SalesData::operator+(  const SalesData &other ) const {
+           SalesData result;
+           result.setMaximumTickets(  maximumTickets(   ) + other.maximumTickets(   ) );
+           result.setSoldTickets(  soldTickets(   ) + other.soldTickets(   ) );
+           result.setRefundedTickets(  refundedTickets(   ) + other.refundedTickets(   ) );
+           result.setSalesRevenue(  salesRevenue(   ) + other.salesRevenue(   ) );
+           result.setRefundExpenses(  refundExpenses(   ) + other.refundExpenses(   ) );
+           return result;
+          }
+          
+          TicketSalesReportWidget::SalesData &
+      40  TicketSalesReportWidget::SalesData::operator+=(  const SalesData &other ) {
+           *this = std::move(  *this + other );
+           return *this;
+          }
+          
+      45  TicketSalesReportWidget::TicketSalesReportWidget(  QWidget *parent )
+           : QWidget(  parent ) {
+           setupUi(  this );
+          
+           initializeRepositories(   );
+           initializeChart(   );
+           setupChart(   ); // After initialize chart
+           setupConnections(   );
+          }
+          
+      55  void TicketSalesReportWidget::configureReportForGenre(   ) {
+           TableInfoSQLite tableInfo(  "genres" );
+           columnInfoIndex_ = tableInfo.columnIndex(  "genre_name" );
+          
+           configureEntityFinder(  
+           "genres",   EntityFinderWidget::tr(  "Select genre" ),  
+           EntityFinderWidget::tr(  "Here will be information about selected genre" ) );
+          
+           sessionsStatisticsMethod_ =
+           std::bind(  &SessionsStatisticsRepository::getSessionsForGenre,  
+           sessionsStatisticsRepository,  
+           std::placeholders::_1,   // entityId
+           std::placeholders::_2,   // startDate
+           std::placeholders::_3,   // endDate
+           std::placeholders::_4 // sessions
+            );
+          
+           billetChartTitle_ = tr(  "Popularity of Genre: Name: \"%1\"" );
+           seriesName_ = tr(  "Tickets Sold" );
+           yAxisTitle_ = tr(  "Number of Tickets Sold" );
+          }
+          
+      77  void TicketSalesReportWidget::configureReportForHall(   ) {
+           TableInfoSQLite tableInfo(  "halls" );
+           columnInfoIndex_ = tableInfo.columnIndex(  "hall_name" );
+          
+           configureEntityFinder(  
+           "halls",   EntityFinderWidget::tr(  "Select hall" ),  
+           EntityFinderWidget::tr(  "Here will be information about selected hall" ) );
+          
+           sessionsStatisticsMethod_ =
+           std::bind(  &SessionsStatisticsRepository::getSessionsForHall,  
+           sessionsStatisticsRepository,  
+           std::placeholders::_1,   // entityId
+           std::placeholders::_2,   // startDate
+           std::placeholders::_3,   // endDate
+           std::placeholders::_4 // sessions
+            );
+          
+           billetChartTitle_ = tr(  "Attendance for Hall: Name: \"%1\"" );
+           seriesName_ = tr(  "Visitors" );
+           yAxisTitle_ = tr(  "Number of Visitors" );
+          }
+          
+      99  void TicketSalesReportWidget::configureReportForMovie(   ) {
+           TableInfoSQLite tableInfo(  "movies" );
+           columnInfoIndex_ = tableInfo.columnIndex(  "title" );
+          
+           configureEntityFinder(  
+           "movies",   EntityFinderWidget::tr(  "Select movie" ),  
+           EntityFinderWidget::tr(  "Here will be information about selected movie" ) );
+          
+           sessionsStatisticsMethod_ =
+           std::bind(  &SessionsStatisticsRepository::getSessionsForMovie,  
+           sessionsStatisticsRepository,  
+           std::placeholders::_1,   // entityId
+           std::placeholders::_2,   // startDate
+           std::placeholders::_3,   // endDate
+           std::placeholders::_4 // sessions
+            );
+          
+           billetChartTitle_ = tr(  "Tickets Sold for Movie: Title: \"%1\"" );
+           seriesName_ = tr(  "Tickets Sold" );
+           yAxisTitle_ = tr(  "Number of Tickets Sold" );
+          }
+          
+     121  void TicketSalesReportWidget::initializeRepositories(   ) {
+           RepositoryManager &repositoryManager = RepositoryManager::instance(   );
+           SchemaMetadata metadata = SchemaMetadata::defaultSchema(   );
+          
+           sessionsStatisticsRepository =
+           repositoryManager.getRepositoryAs<SessionsStatisticsRepository>(  
+           metadata.repositoryTableName(  "sessions_statistics" ) );
+          
+           if (  !bool(  sessionsStatisticsRepository ) ) {
+           qFatal(   ) << "TicketSalesReportWidget::initializeRepositories: Failed to "
+           "initialize repositories";
+           }
+          }
+          
+     135  void TicketSalesReportWidget::initializeChart(   ) {
+           chartView_ = new QChartView(  this );
+           chartView_->setRenderHint(  QPainter::Antialiasing );
+          }
+          
+     140  void TicketSalesReportWidget::setupChart(   ) {
+           frameChart->layout(   )->addWidget(  chartView_ );
+          }
+          
+     144  void TicketSalesReportWidget::setupConnections(   ) {
+           connect(  btnGenerate,   &QPushButton::clicked,   this,  
+           &TicketSalesReportWidget::onPushButtonGenerateClicked );
+          
+           connect(  entityFinder,   &EntityFinderWidget::fieldRetrieved,   this,  
+           &TicketSalesReportWidget::onFieldRetrieved );
+          
+           connect(  entityFinder,   &EntityFinderWidget::reseted,   this,  
+           &TicketSalesReportWidget::onEntityFinderReseted );
+          
+           connect(  entityFinder,   &EntityFinderWidget::recordRetrieved,   this,  
+           &TicketSalesReportWidget::onRecordRetrieved );
+          }
+          
+     158  void TicketSalesReportWidget::configureEntityFinder(  
+     159   const QString &databaseTableName,   const QString &labelText,  
+     160   const QString &placeholder ) {
+           entityFinder->setDefaultRelation(  databaseTableName );
+           entityFinder->setLabelText(  labelText );
+           entityFinder->setLineEditPlaceholder(  placeholder );
+          }
+          
+     166  void TicketSalesReportWidget::onEntityFinderReseted(   ) {
+           selectedEntityId_ = -1;
+           chartView_->setChart(  new QChart(   ) );
+          }
+          
+     171  void TicketSalesReportWidget::onPushButtonGenerateClicked(   ) {
+           if (  !dateRange(  startRange_,   endRange_ ) ) {
+           QMessageBox::QMessageBox::warning(  this,   QMessageBox::tr(  "Error" ),  
+           QMessageBox::tr(  "Invalid date range" ) );
+           return;
+           }
+          
+           QVector<SessionStatisticsDTO> sessions;
+           RepositoryResult result = retrieveSessions(  sessions );
+           if (  !result.success ) {
+           ErrorDialog::displayError(  this,   result.errorMessage );
+           return;
+           }
+          
+           if (  sessions.isEmpty(   ) ) {
+           QMessageBox::warning(  this,   QMessageBox::tr(  "Error" ),  
+           QMessageBox::tr(  "No sessions found between %1 and %2." )
+           .arg(  startRange_.toString(  "dd.MM.yyyy" ) )
+           .arg(  endRange_.toString(  "dd.MM.yyyy" ) ) );
+           return;
+           }
+          
+           createChart(  aggregateByDateTime(  sessions ) );
+          }
+          
+     196  void TicketSalesReportWidget::onFieldRetrieved(  const QSqlField &field ) {
+           selectedEntityId_ = field.value(   ).toInt(   );
+           chartView_->setChart(  new QChart(   ) );
+          }
+          
+     201  void TicketSalesReportWidget::onRecordRetrieved(  const QSqlRecord &rowValues ) {
+           QString columnInfoValue = rowValues.value(  columnInfoIndex_ ).toString(   );
+           chartTitle_ = billetChartTitle_.arg(  columnInfoValue );
+          }
+          
+          QMap<QDateTime,   TicketSalesReportWidget::SalesData>
+     207  TicketSalesReportWidget::aggregateByDateTime(  
+     208   const QVector<SessionStatisticsDTO> &sessions,  
+     209   std::function<bool(  const SessionStatisticsDTO & )> filter ) {
+          
+           QMap<QDateTime,   SalesData> accamulatedSalesData;
+          
+           for (  const SessionStatisticsDTO &session : sessions ) {
+           if (  !filter || filter(  session ) ) {
+           QDateTime dateTime = session.beginAt(   );
+          
+           SalesData buffer;
+           buffer.setRefundExpenses(  session.refundExpenses(   ) );
+           buffer.setRefundedTickets(  session.refundedTickets(   ) );
+           buffer.setSalesRevenue(  session.salesRevenue(   ) );
+           buffer.setSoldTickets(  session.soldTickets(   ) );
+           buffer.setMaximumTickets(  session.totalSeats(   ) );
+          
+           accamulatedSalesData[dateTime] += buffer;
+           }
+           }
+          
+           return accamulatedSalesData;
+          };
+          
+     231  QAbstractAxis *TicketSalesReportWidget::createDateTimeAxis(  
+     232   int tickCount,   const QString &axisTitle,   const QDateTime &minDate,  
+     233   const QDateTime &maxDate ) const {
+           QDateTimeAxis *axisX = new QDateTimeAxis(   );
+           axisX->setTitleText(  axisTitle );
+           axisX->setFormat(  "dd.MM.yyyy" );
+           axisX->setTickCount(  tickCount );
+           axisX->setRange(  minDate,   maxDate );
+           return axisX;
+          }
+          
+          QAbstractAxis *
+     243  TicketSalesReportWidget::createValueAxis(  int maxValue,  
+     244   const QString &axisTitle ) const {
+           QValueAxis *axisY = new QValueAxis(   );
+           axisY->setTitleText(  axisTitle );
+           axisY->setLabelFormat(  "%d" );
+           axisY->setRange(  0,   maxValue );
+           return axisY;
+          }
+          
+     252  bool TicketSalesReportWidget::validateData(  
+     253   const QMap<QDateTime,   SalesData> &data ) const {
+           if (  !data.isEmpty(   ) ) {
+           return true;
+           }
+          
+           qWarning(   ) << "No data for chart:" << chartTitle_;
+          
+           // QMessageBox::warning(  this,   QMessageBox::tr(  "Error" ),  
+           // QMessageBox::tr(  "No data for chart" ) );
+          
+           return false;
+          }
+          
+     266  RepositoryResult TicketSalesReportWidget::retrieveSessions(  
+     267   QVector<SessionStatisticsDTO> &sessions ) {
+           RepositoryResult result =
+           sessionsStatisticsMethod_(  selectedEntityId_,   std::cref(  startRange_ ),  
+           std::cref(  endRange_ ),   std::ref(  sessions ) );
+           return result;
+          }
+          
+     274  bool TicketSalesReportWidget::dateRange(  QDateTime &startOut,  
+     275   QDateTime &endOut ) {
+           startOut = dateTimeEditStartOfPeriod->dateTime(   );
+           endOut = dateTimeEditEndOfPeriod->dateTime(   );
+           return endOut > startOut;
+          }
+          
+     281  void TicketSalesReportWidget::createChart(  
+     282   const QMap<QDateTime,   SalesData> &data ) {
+           if (  !validateData(  data ) ) {
+           return;
+           }
+          
+           QDateTime minDate,   maxDate;
+           int tickCount = data.size(   );
+           if (  tickCount > 10 ) {
+           tickCount = 10;
+           }
+          
+           QChart *chart = new QChart(   );
+           chart->setTitle(  chartTitle_ );
+          
+           QAbstractSeries *maximumTicketsSeries = createScatterSeries(  
+           data,   minDate,   maxDate,   &SalesData::maximumTickets,   "Maximum Tickets" );
+           QAbstractSeries *soldTicketsSeries = createScatterSeries(  
+           data,   minDate,   maxDate,   &SalesData::soldTickets,   "Sold Tickets" );
+           QAbstractSeries *refundedTicketsSeries = createScatterSeries(  
+           data,   minDate,   maxDate,   &SalesData::refundedTickets,   "Refunded Tickets" );
+           QAbstractSeries *salesRevenueSeries = createScatterSeries(  
+           data,   minDate,   maxDate,   &SalesData::salesRevenue,   "Sales Revenue" );
+           QAbstractSeries *refundExpensesSeries = createScatterSeries(  
+           data,   minDate,   maxDate,   &SalesData::refundExpenses,   "Refund Expenses" );
+          
+           chart->addSeries(  maximumTicketsSeries );
+           chart->addSeries(  soldTicketsSeries );
+           chart->addSeries(  refundedTicketsSeries );
+           chart->addSeries(  salesRevenueSeries );
+           chart->addSeries(  refundExpensesSeries );
+          
+           QAbstractAxis *axisX =
+           createDateTimeAxis(  tickCount,   tr(  "Date" ),   minDate,   maxDate );
+           chart->addAxis(  axisX,   Qt::AlignBottom );
+          
+           double maxMoneyValue = std::max(  {maxValue(  data,   &SalesData::refundExpenses ),  
+           maxValue(  data,   &SalesData::salesRevenue )} );
+           QAbstractAxis *axisYMoney = createValueAxis(  maxMoneyValue,   tr(  "Money" ) );
+           chart->addAxis(  axisYMoney,   Qt::AlignLeft );
+          
+           int maxTickets = maxValue(  data,   &SalesData::maximumTickets );
+          
+           QAbstractAxis *axisYTickets = createValueAxis(  maxTickets,   tr(  "Tickets" ) );
+           chart->addAxis(  axisYTickets,   Qt::AlignRight );
+          
+           qDebug(   ) << "Maximum movey Value" << maxMoneyValue << "maxTickets"
+           << maxTickets;
+          
+           maximumTicketsSeries->attachAxis(  axisYTickets );
+           refundedTicketsSeries->attachAxis(  axisYTickets );
+           soldTicketsSeries->attachAxis(  axisYTickets );
+          
+           refundExpensesSeries->attachAxis(  axisYMoney );
+           salesRevenueSeries->attachAxis(  axisYMoney );
+          
+           maximumTicketsSeries->attachAxis(  axisX );
+           refundExpensesSeries->attachAxis(  axisX );
+           refundedTicketsSeries->attachAxis(  axisX );
+           salesRevenueSeries->attachAxis(  axisX );
+           soldTicketsSeries->attachAxis(  axisX );
+          
+           updateChartView(  chart );
+          }
+          
+     346  void TicketSalesReportWidget::setupChart(  QChart *chart,   QAbstractSeries *series,  
+     347   QAbstractAxis *axisX,  
+     348   QAbstractAxis *axisY ) const {
+           chart->addSeries(  series );
+           chart->addAxis(  axisX,   Qt::AlignBottom );
+           chart->addAxis(  axisY,   Qt::AlignLeft );
+           series->attachAxis(  axisX );
+           series->attachAxis(  axisY );
+          }
+          
+     356  void TicketSalesReportWidget::updateChartView(  QChart *chart ) const {
+           chartView_->setChart(  chart );
+           chartView_->setRenderHint(  QPainter::Antialiasing );
+          }
+
+ diff --git a/artifacts/cccc/function.html b/artifacts/cccc/function.html new file mode 100644 index 0000000..ce0d0f0 --- /dev/null +++ b/artifacts/cccc/function.html @@ -0,0 +1,68 @@ + +Detailed report on module function + + + +

Detailed report on module function

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 2 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+SQLiteDatabase [V]
+pass by reference   +./tests_schema/tests_sources/sqlite_database.cpp:39
+
+
+TicketSalesReportWidget [CV]
+pass by value   +./ui/widgets/ticket_sales_report_widget.cpp:209
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/function.xml b/artifacts/cccc/function.xml new file mode 100644 index 0000000..ca28241 --- /dev/null +++ b/artifacts/cccc/function.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +function + +SQLiteDatabase +true +false + +pass by reference + + +TicketSalesReportWidget +true +true + +pass by value + + + + + + + + diff --git a/artifacts/cccc/initializer_list.html b/artifacts/cccc/initializer_list.html new file mode 100644 index 0000000..fa91558 --- /dev/null +++ b/artifacts/cccc/initializer_list.html @@ -0,0 +1,63 @@ + +Detailed report on module initializer_list + + + +

Detailed report on module initializer_list

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+TicketSaleWidget [V]
+pass by reference   +./ui/widgets/ticket_sale_widget.cpp:103
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/initializer_list.xml b/artifacts/cccc/initializer_list.xml new file mode 100644 index 0000000..8bb41cf --- /dev/null +++ b/artifacts/cccc/initializer_list.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +initializer_list + +TicketSaleWidget +true +false + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/mt19937.html b/artifacts/cccc/mt19937.html new file mode 100644 index 0000000..b45d19d --- /dev/null +++ b/artifacts/cccc/mt19937.html @@ -0,0 +1,63 @@ + +Detailed report on module mt19937 + + + +

Detailed report on module mt19937

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+TicketGenerator [CV]
+has by value   +./core/services/ticket_generator.h:28
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/mt19937.xml b/artifacts/cccc/mt19937.xml new file mode 100644 index 0000000..98bc19e --- /dev/null +++ b/artifacts/cccc/mt19937.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +mt19937 + +TicketGenerator +true +true + +has by value + + + + + + + + diff --git a/artifacts/cccc/optional.html b/artifacts/cccc/optional.html new file mode 100644 index 0000000..74249c5 --- /dev/null +++ b/artifacts/cccc/optional.html @@ -0,0 +1,81 @@ + +Detailed report on module optional + + + +

Detailed report on module optional

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+SessionsStatisticsRepository [CV]
+pass by value   +./data/sql/sessions_statistics_repository.cpp:95
+pass by value   +./data/sql/sessions_statistics_repository.cpp:96
+pass by value   +./data/sql/sessions_statistics_repository.cpp:113
+pass by value   +./data/sql/sessions_statistics_repository.cpp:114
+pass by value   +./data/sql/sessions_statistics_repository.cpp:131
+pass by value   +./data/sql/sessions_statistics_repository.cpp:132
+pass by reference   +./data/sql/sessions_statistics_repository.cpp:149
+pass by reference   +./data/sql/sessions_statistics_repository.cpp:150
+pass by reference   +./data/sql/sessions_statistics_repository.cpp:161
+pass by reference   +./data/sql/sessions_statistics_repository.cpp:162
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/optional.xml b/artifacts/cccc/optional.xml new file mode 100644 index 0000000..ed20c6b --- /dev/null +++ b/artifacts/cccc/optional.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +optional + +SessionsStatisticsRepository +true +true + +pass by value + + + +pass by value + + + +pass by value + + + +pass by value + + + +pass by value + + + +pass by value + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/qint32.html b/artifacts/cccc/qint32.html new file mode 100644 index 0000000..04d2353 --- /dev/null +++ b/artifacts/cccc/qint32.html @@ -0,0 +1,162 @@ + +Detailed report on module qint32 + + + +

Detailed report on module qint32

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 14 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+ApplicationController [CV]
+pass by value   +./core/controllers/application_controller.cpp:113
+pass by value   +./core/controllers/application_controller.cpp:114
+
+
+GenresRepository [CV]
+pass by value   +./data/sql/genres_repository.cpp:27
+pass by value   +./data/sql/genres_repository.cpp:80
+
+
+HallsRepository [CV]
+pass by value   +./data/sql/halls_repository.cpp:28
+pass by value   +./data/sql/halls_repository.cpp:79
+
+
+MainWindow [CV]
+pass by value   +./ui/main_window/main_window.cpp:9
+pass by value   +./ui/main_window/main_window.cpp:9
+
+
+MoviesRepository [CV]
+pass by value   +./data/sql/movies_repository.cpp:47
+pass by value   +./data/sql/movies_repository.cpp:85
+
+
+RefundsRepository [CV]
+pass by value   +./data/sql/refunds_repository.cpp:30
+pass by value   +./data/sql/refunds_repository.cpp:93
+
+
+RolesRepository [CV]
+pass by value   +./data/sql/roles_repository.cpp:28
+pass by value   +./data/sql/roles_repository.cpp:78
+
+
+SalesData [CV]
+pass by value   +./ui/widgets/ticket_sales_report_widget.cpp:21
+pass by value   +./ui/widgets/ticket_sales_report_widget.cpp:22
+pass by value   +./ui/widgets/ticket_sales_report_widget.cpp:23
+
+
+SessionGenerator [CV]
+pass by value   +./core/services/session_generator.cpp:43
+pass by value   +./core/services/session_generator.cpp:181
+pass by value   +./core/services/session_generator.cpp:214
+
+
+SessionsRepository [CV]
+pass by value   +./data/sql/sessions_repository.cpp:32
+pass by value   +./data/sql/sessions_repository.cpp:90
+
+
+SessionsStatisticsRepository [CV]
+pass by value   +./data/sql/sessions_statistics_repository.cpp:59
+pass by value   +./data/sql/sessions_statistics_repository.cpp:95
+pass by value   +./data/sql/sessions_statistics_repository.cpp:113
+pass by value   +./data/sql/sessions_statistics_repository.cpp:131
+
+
+TableInfoSQLite [CV]
+pass by value   +./data/sql/table_info_sqlite.cpp:102
+
+
+TicketsRepository [CV]
+pass by value   +./data/sql/tickets_repository.cpp:30
+pass by value   +./data/sql/tickets_repository.cpp:87
+
+
+UsersRepository [CV]
+pass by value   +./data/sql/users_repository.cpp:30
+pass by value   +./data/sql/users_repository.cpp:108
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/qint32.xml b/artifacts/cccc/qint32.xml new file mode 100644 index 0000000..3a7d064 --- /dev/null +++ b/artifacts/cccc/qint32.xml @@ -0,0 +1,204 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +qint32 + +ApplicationController +true +true + +pass by value + + + +pass by value + + +GenresRepository +true +true + +pass by value + + + +pass by value + + +HallsRepository +true +true + +pass by value + + + +pass by value + + +MainWindow +true +true + +pass by value + + + +pass by value + + +MoviesRepository +true +true + +pass by value + + + +pass by value + + +RefundsRepository +true +true + +pass by value + + + +pass by value + + +RolesRepository +true +true + +pass by value + + + +pass by value + + +SalesData +true +true + +pass by value + + + +pass by value + + + +pass by value + + +SessionGenerator +true +true + +pass by value + + + +pass by value + + + +pass by value + + +SessionsRepository +true +true + +pass by value + + + +pass by value + + +SessionsStatisticsRepository +true +true + +pass by value + + + +pass by value + + + +pass by value + + + +pass by value + + +TableInfoSQLite +true +true + +pass by value + + +TicketsRepository +true +true + +pass by value + + + +pass by value + + +UsersRepository +true +true + +pass by value + + + +pass by value + + + + + + + + diff --git a/artifacts/cccc/qint64.html b/artifacts/cccc/qint64.html new file mode 100644 index 0000000..cfaffd2 --- /dev/null +++ b/artifacts/cccc/qint64.html @@ -0,0 +1,86 @@ + +Detailed report on module qint64 + + + +

Detailed report on module qint64

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 2 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+DayManager [CV]
+pass by value   +./core/utils/day_manager.cpp:61
+pass by value   +./core/utils/day_manager.cpp:74
+pass by value   +./core/utils/day_manager.cpp:87
+pass by value   +./core/utils/day_manager.cpp:120
+pass by value   +./core/utils/day_manager.cpp:134
+pass by value   +./core/utils/day_manager.cpp:147
+pass by value   +./core/utils/day_manager.cpp:161
+pass by value   +./core/utils/day_manager.cpp:171
+pass by value   +./core/utils/day_manager.cpp:182
+pass by value   +./core/utils/day_manager.cpp:207
+
+
+ReservationManager [CV]
+pass by value   +./core/utils/reservation_manager.cpp:26
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/qint64.xml b/artifacts/cccc/qint64.xml new file mode 100644 index 0000000..a9bb5dd --- /dev/null +++ b/artifacts/cccc/qint64.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +qint64 + +DayManager +true +true + +pass by value + + + +pass by value + + + +pass by value + + + +pass by value + + + +pass by value + + + +pass by value + + + +pass by value + + + +pass by value + + + +pass by value + + + +pass by value + + +ReservationManager +true +true + +pass by value + + + + + + + + diff --git a/artifacts/cccc/qsizetype.html b/artifacts/cccc/qsizetype.html new file mode 100644 index 0000000..4cf2ab0 --- /dev/null +++ b/artifacts/cccc/qsizetype.html @@ -0,0 +1,69 @@ + +Detailed report on module qsizetype + + + +

Detailed report on module qsizetype

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+ReservationManager [CV]
+pass by value   +./core/utils/reservation_manager.cpp:5
+pass by value   +./core/utils/reservation_manager.cpp:5
+pass by value   +./core/utils/reservation_manager.cpp:84
+pass by value   +./core/utils/reservation_manager.cpp:93
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/qsizetype.xml b/artifacts/cccc/qsizetype.xml new file mode 100644 index 0000000..a55a6d6 --- /dev/null +++ b/artifacts/cccc/qsizetype.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +qsizetype + +ReservationManager +true +true + +pass by value + + + +pass by value + + + +pass by value + + + +pass by value + + + + + + + + diff --git a/artifacts/cccc/random_device.html b/artifacts/cccc/random_device.html new file mode 100644 index 0000000..39a2943 --- /dev/null +++ b/artifacts/cccc/random_device.html @@ -0,0 +1,63 @@ + +Detailed report on module random_device + + + +

Detailed report on module random_device

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+TicketGenerator [CV]
+has by value   +./core/services/ticket_generator.h:27
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/random_device.xml b/artifacts/cccc/random_device.xml new file mode 100644 index 0000000..dfd994b --- /dev/null +++ b/artifacts/cccc/random_device.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +random_device + +TicketGenerator +true +true + +has by value + + + + + + + + diff --git a/artifacts/cccc/sqlite3.html b/artifacts/cccc/sqlite3.html new file mode 100644 index 0000000..9b8466b --- /dev/null +++ b/artifacts/cccc/sqlite3.html @@ -0,0 +1,63 @@ + +Detailed report on module sqlite3 + + + +

Detailed report on module sqlite3

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+SQLiteStatement [V]
+pass by reference   +./tests_schema/tests_sources/sqlite_statement.cpp:5
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/sqlite3.xml b/artifacts/cccc/sqlite3.xml new file mode 100644 index 0000000..3c25836 --- /dev/null +++ b/artifacts/cccc/sqlite3.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +sqlite3 + +SQLiteStatement +true +false + +pass by reference + + + + + + + + diff --git a/artifacts/cccc/sqlite3_stmt.html b/artifacts/cccc/sqlite3_stmt.html new file mode 100644 index 0000000..37bae3c --- /dev/null +++ b/artifacts/cccc/sqlite3_stmt.html @@ -0,0 +1,63 @@ + +Detailed report on module sqlite3_stmt + + + +

Detailed report on module sqlite3_stmt

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 1 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+SQLiteStatement
+has by reference   +./tests_schema/tests_sources/sqlite_statement.h:10
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/sqlite3_stmt.xml b/artifacts/cccc/sqlite3_stmt.xml new file mode 100644 index 0000000..8691ca8 --- /dev/null +++ b/artifacts/cccc/sqlite3_stmt.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +sqlite3_stmt + +SQLiteStatement +false +false + +has by reference + + + + + + + + diff --git a/artifacts/cccc/string.html b/artifacts/cccc/string.html new file mode 100644 index 0000000..301832d --- /dev/null +++ b/artifacts/cccc/string.html @@ -0,0 +1,86 @@ + +Detailed report on module string + + + +

Detailed report on module string

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetricTagOverallPer Function
Lines of CodeLOC 0******
McCabe's Cyclomatic NumberMVG 0******
Lines of CommentCOM 0********
LOC/COML_C------ 
MVG/COMM_C------ 
Weighted Methods per Class (  weighting = unity )WMC1 0 
Weighted Methods per Class (  weighting = visible )WMCv 0 
Depth of Inheritance TreeDIT 0 
Number of ChildrenNOC 0 
Coupling between objectsCBO 4 
Information Flow measure (  inclusive )IF4 0********
Information Flow measure (  visible )IF4v 0********
Information Flow measure (  concrete )IF4c 0********
+

Definitions and Declarations

+ + + +
DescriptionLOCMVGCOML_CM_C
No module extents have been identified for this module
+

Functions

+ + + +
Function prototypeLOCMVGCOML_CM_C
No member functions have been identified for this module
+

Relationships

+ + + + + +
ClientsSuppliers
+FileReader [V]
+pass by reference   +./tests_schema/tests_sources/file_reader.cpp:8
+pass by reference   +./tests_schema/tests_sources/file_reader.cpp:8
+
+
+SQLiteDatabase [V]
+pass by reference   +./tests_schema/tests_sources/sqlite_database.cpp:8
+pass by reference   +./tests_schema/tests_sources/sqlite_database.cpp:38
+
+
+SQLiteFileExecutor [V]
+pass by reference   +./tests_schema/tests_sources/sqlite_file_executor.cpp:6
+pass by reference   +./tests_schema/tests_sources/sqlite_file_executor.cpp:21
+
+
+SQLiteStatement [V]
+pass by reference   +./tests_schema/tests_sources/sqlite_statement.cpp:5
+pass by reference   +./tests_schema/tests_sources/sqlite_statement.cpp:38
+
+
+  +
+  +
+ diff --git a/artifacts/cccc/string.xml b/artifacts/cccc/string.xml new file mode 100644 index 0000000..8888113 --- /dev/null +++ b/artifacts/cccc/string.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +string + +FileReader +true +false + +pass by reference + + + +pass by reference + + +SQLiteDatabase +true +false + +pass by reference + + + +pass by reference + + +SQLiteFileExecutor +true +false + +pass by reference + + + +pass by reference + + +SQLiteStatement +true +false + +pass by reference + + + +pass by reference + + + + + + + + diff --git a/artifacts/cinema_db.puml b/artifacts/cinema_db.puml new file mode 100644 index 0000000..3aa6d6d --- /dev/null +++ b/artifacts/cinema_db.puml @@ -0,0 +1,47 @@ +@startuml +' Entities definition +entity "Genres" as genres { + + genre_id: INTEGER [PK] + -- + genre_name: TEXT [UNIQUE, NOT NULL] +} + +entity "Movies" as movies { + + movie_id: INTEGER [PK] + -- + title: TEXT [NOT NULL] + genre_id: INTEGER [FK] + duration: INTEGER [CHECK > 0] +} + +entity "Halls" as halls { + + hall_id: INTEGER [PK] + -- + hall_name: TEXT [NOT NULL, UNIQUE] + capacity: INTEGER [CHECK > 0] +} + +entity "Sessions" as sessions { + + session_id: INTEGER [PK] + -- + movie_id: INTEGER [FK] + hall_id: INTEGER [FK] + session_time: DATETIME [NOT NULL] + ticket_price: REAL [CHECK >= 0] +} + +entity "Tickets" as tickets { + + ticket_id: INTEGER [PK] + -- + session_id: INTEGER [FK] + seat_number: INTEGER [CHECK > 0] + sold_at: TIMESTAMP [DEFAULT CURRENT_TIMESTAMP] +} + +' Relationships +genres ||--o{ movies : "1 to Many" +movies ||--o{ sessions : "1 to Many" +halls ||--o{ sessions : "1 to Many" +sessions ||--o{ tickets : "1 to Many" + +@enduml diff --git a/artifacts/cmake_lines_count.txt b/artifacts/cmake_lines_count.txt new file mode 100644 index 0000000..a3a6e54 --- /dev/null +++ b/artifacts/cmake_lines_count.txt @@ -0,0 +1,28 @@ + 69 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/.qt/QtDeploySupport.cmake + 8 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/.qt/QtDeployTargets.cmake + 105 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/CMakeFiles/3.30.3/CMakeCXXCompiler.cmake + 15 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/CMakeFiles/3.30.3/CMakeSystem.cmake + 19 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/CMakeFiles/clean_additional.cmake + 8 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/CTestTestfile.cmake + 72 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/cmake_install.cmake + 10 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/tests_class/CTestTestfile.cmake + 44 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/tests_class/cmake_install.cmake + 7 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/tests_schema/CTestTestfile.cmake + 44 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/tests_schema/cmake_install.cmake + 5 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/tests_schema/tests_schema[1]_include.cmake + 73 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/tests_schema/tests_schema[1]_tests.cmake + 8 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/cmake/dependencies/FindPackages.cmake + 10 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/cmake/generation/ClangdSetup.cmake + 11 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/cmake/generation/ConfigureFiles.cmake + 41 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/cmake/generation/CountLines.cmake + 21 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/cmake/generation/ProjectTree.cmake + 2 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/cmake/generation/UiFiles.cmake + 10 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/cmake/helpers/PrintMessages.cmake + 59 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/cmake/paths/CombineFileGroups.cmake + 272 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/cmake/paths/GroupFilesByLocation.cmake + 74 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/cmake/paths/PathsAndIncludes.cmake + 18 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/cmake/setup/Config.cmake + 6 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/cmake/setup/ProjectVariables.cmake + 19 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/cmake/setup/TargetSetup.cmake + 33 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/cmake/setup/Translations.cmake + 1063 итого diff --git a/artifacts/cmake_lists_lines_count.txt b/artifacts/cmake_lists_lines_count.txt new file mode 100644 index 0000000..e8b16fa --- /dev/null +++ b/artifacts/cmake_lists_lines_count.txt @@ -0,0 +1,4 @@ + 51 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/CMakeLists.txt + 29 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_class/CMakeLists.txt + 72 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_schema/CMakeLists.txt + 152 итого diff --git a/artifacts/header_lines_count.txt b/artifacts/header_lines_count.txt new file mode 100644 index 0000000..f087cb5 --- /dev/null +++ b/artifacts/header_lines_count.txt @@ -0,0 +1,111 @@ + 86 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/include/ui_entity_finder_widget.h + 17 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/config.h + 111 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/ui_auth_dialog.h + 209 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/ui_directories_management_widget.h + 107 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/ui_entity_deleter_widget.h + 249 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/ui_entity_updater_widget.h + 142 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/ui_main_window.h + 103 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/ui_reports_widget.h + 90 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/ui_search_dialog.h + 109 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/ui_session_management_widget.h + 85 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/ui_single_record_time_range_widget.h + 104 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/ui_ticket_return_widget.h + 110 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/ui_ticket_sale_widget.h + 107 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/ui_ticket_sales_report_widget.h + 238 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers/application_connector.h + 37 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers/application_controller.h + 31 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db/database_manager.h + 45 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db/execute_sql_file.h + 26 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db/table_info_interface.h + 26 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto/genre_dto.h + 29 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto/hall_dto.h + 35 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto/movie_dto.h + 37 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto/refund_dto.h + 30 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto/role_dto.h + 38 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto/session_dto.h + 81 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto/session_statistics_dto.h + 35 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto/ticket_dto.h + 40 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto/user_dto.h + 34 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories/genres_repository_interface.h + 33 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories/halls_repository_interface.h + 34 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories/movies_repository_interface.h + 34 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories/refunds_repository_interface.h + 11 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories/repository_interface.h + 18 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories/repository_result.h + 33 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories/roles_repository_interface.h + 37 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories/sessions_repository_interface.h + 38 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories/sessions_statistics_repository_interface.h + 34 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories/tickets_repository_interface.h + 37 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories/users_repository_interface.h + 24 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests/create_genre_request.h + 26 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests/create_hall_request.h + 30 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests/create_movie_request.h + 32 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests/create_refund_request.h + 27 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests/create_role_request.h + 34 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests/create_session_request.h + 30 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests/create_ticket_request.h + 36 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests/create_user_request.h + 26 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests/update_genre_request.h + 30 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests/update_hall_request.h + 35 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests/update_movie_request.h + 37 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests/update_refund_request.h + 30 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests/update_role_request.h + 38 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests/update_session_request.h + 35 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests/update_ticket_request.h + 40 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests/update_user_request.h + 72 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services/base_generator.h + 35 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services/date_time_generator.h + 29 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services/generator_interface.h + 113 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services/model_manager.h + 34 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services/range_limiter.h + 76 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services/refund_generator.h + 66 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services/relation_id_config.h + 90 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services/repository_manager.h + 40 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services/schema_metadata.h + 72 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services/session_generator.h + 68 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services/ticket_generator.h + 75 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils/day_manager.h + 62 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils/reservation_manager.h + 20 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql/base_sql_table_repository.h + 32 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql/data_repository_signals.h + 38 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql/genres_repository.h + 39 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql/halls_repository.h + 38 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql/movies_repository.h + 37 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql/refunds_repository.h + 38 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql/roles_repository.h + 38 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql/sessions_repository.h + 65 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql/sessions_statistics_repository.h + 46 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql/table_info_sqlite.h + 38 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql/tickets_repository.h + 41 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql/users_repository.h + 188 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_schema/tests_sources/database_interface.h + 12 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_schema/tests_sources/file_reader.h + 12 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_schema/tests_sources/file_reader_interface.h + 13 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_schema/tests_sources/sql_file_executor_interfase.h + 85 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_schema/tests_sources/sqlite_database.h + 22 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_schema/tests_sources/sqlite_file_executor.h + 33 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_schema/tests_sources/sqlite_statement.h + 17 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates/date_time_delegate.h + 39 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs/auth_dialog.h + 34 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs/error_dialog.h + 48 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs/search_dialog.h + 27 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window/main_window.h + 67 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models/base_sql_table_model.h + 27 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models/genres_model.h + 27 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models/halls_model.h + 34 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models/movies_model.h + 15 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models/multi_column_filter_proxy_model.h + 35 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models/refunds_model.h + 43 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models/sessions_model.h + 35 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models/tickets_model.h + 47 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets/directories_management_widget.h + 53 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets/entity_deleter_widget.h + 85 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets/entity_finder_widget.h + 76 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets/entity_updater_widget.h + 28 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets/reports_widget.h + 38 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets/session_management_widget.h + 14 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets/single_record_time_range_widget.h + 34 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets/ticket_return_widget.h + 37 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets/ticket_sale_widget.h + 209 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets/ticket_sales_report_widget.h + 5946 итого diff --git a/artifacts/report_lizard.txt b/artifacts/report_lizard.txt new file mode 100644 index 0000000..4a1dcdf --- /dev/null +++ b/artifacts/report_lizard.txt @@ -0,0 +1,610 @@ +================================================ + NLOC CCN token PARAM length location +------------------------------------------------ + 9 2 59 2 9 BaseSqlTableRepository::BaseSqlTableRepository@6-14@./data/sql/base_sql_table_repository.cpp + 7 2 47 0 8 BaseSqlTableRepository::foreignKeysOnQuery@16-23@./data/sql/base_sql_table_repository.cpp + 3 1 21 2 3 SessionsStatisticsRepository::SessionsStatisticsRepository@11-13@./data/sql/sessions_statistics_repository.cpp + 19 1 258 1 23 SessionsStatisticsRepository::mapQueryToDTO@16-38@./data/sql/sessions_statistics_repository.cpp + 13 3 101 2 17 SessionsStatisticsRepository::executeAndMapQuery@40-56@./data/sql/sessions_statistics_repository.cpp + 15 3 110 2 18 SessionsStatisticsRepository::getSessionById@58-75@./data/sql/sessions_statistics_repository.cpp + 13 3 87 1 16 SessionsStatisticsRepository::getAllSessions@77-92@./data/sql/sessions_statistics_repository.cpp + 13 1 95 4 17 SessionsStatisticsRepository::getSessionsForHall@94-110@./data/sql/sessions_statistics_repository.cpp + 13 1 95 4 17 SessionsStatisticsRepository::getSessionsForMovie@112-128@./data/sql/sessions_statistics_repository.cpp + 13 1 95 4 17 SessionsStatisticsRepository::getSessionsForGenre@130-146@./data/sql/sessions_statistics_repository.cpp + 11 5 65 3 11 SessionsStatisticsRepository::bindDateFilters@148-158@./data/sql/sessions_statistics_repository.cpp + 10 3 63 3 10 SessionsStatisticsRepository::bindDateValues@160-169@./data/sql/sessions_statistics_repository.cpp + 2 1 21 2 2 MoviesRepository::MoviesRepository@10-11@./data/sql/movies_repository.cpp + 13 2 104 1 15 MoviesRepository::createMovie@14-28@./data/sql/movies_repository.cpp + 12 3 87 1 15 MoviesRepository::getAllMovies@31-45@./data/sql/movies_repository.cpp + 16 3 103 2 19 MoviesRepository::getMovieById@47-65@./data/sql/movies_repository.cpp + 14 2 117 1 16 MoviesRepository::updateMovie@68-83@./data/sql/movies_repository.cpp + 10 2 71 1 12 MoviesRepository::deleteMovieById@85-96@./data/sql/movies_repository.cpp + 8 1 82 1 9 MoviesRepository::mapQueryToDTO@98-106@./data/sql/movies_repository.cpp + 2 1 21 2 2 RolesRepository::RolesRepository@10-11@./data/sql/roles_repository.cpp + 12 2 91 1 14 RolesRepository::createRole@13-26@./data/sql/roles_repository.cpp + 15 3 103 2 18 RolesRepository::getRoleById@28-45@./data/sql/roles_repository.cpp + 12 3 87 1 15 RolesRepository::getAllRoles@47-61@./data/sql/roles_repository.cpp + 12 2 90 1 14 RolesRepository::updateRole@63-76@./data/sql/roles_repository.cpp + 10 2 71 1 12 RolesRepository::deleteRoleById@78-89@./data/sql/roles_repository.cpp + 7 1 66 1 8 RolesRepository::mapQueryToDTO@91-98@./data/sql/roles_repository.cpp + 1 1 12 0 1 TableInfoSQLite::TableInfoSQLite@7-7@./data/sql/table_info_sqlite.cpp + 4 1 20 1 4 TableInfoSQLite::TableInfoSQLite@9-12@./data/sql/table_info_sqlite.cpp + 26 5 196 0 34 TableInfoSQLite::loadColumnInfo@14-47@./data/sql/table_info_sqlite.cpp + 3 1 12 0 3 TableInfoSQLite::databaseTableName@49-51@./data/sql/table_info_sqlite.cpp + 25 6 176 1 31 TableInfoSQLite::foreignKeyTable@54-84@./data/sql/table_info_sqlite.cpp + 3 1 25 0 3 TableInfoSQLite::columnNames@86-88@./data/sql/table_info_sqlite.cpp + 7 2 41 1 7 TableInfoSQLite::isPrimaryKey@90-96@./data/sql/table_info_sqlite.cpp + 3 1 21 1 3 TableInfoSQLite::columnIndex@98-100@./data/sql/table_info_sqlite.cpp + 6 3 40 1 6 TableInfoSQLite::columnName@102-107@./data/sql/table_info_sqlite.cpp + 21 10 162 1 23 TableInfoSQLite::columnMetaType@110-132@./data/sql/table_info_sqlite.cpp + 5 1 20 1 5 TableInfoSQLite::setDatabaseTableName@134-138@./data/sql/table_info_sqlite.cpp + 2 1 21 2 2 GenresRepository::GenresRepository@10-11@./data/sql/genres_repository.cpp + 10 2 77 1 12 GenresRepository::createGenre@14-25@./data/sql/genres_repository.cpp + 16 3 102 2 19 GenresRepository::getGenreById@27-45@./data/sql/genres_repository.cpp + 12 3 87 1 15 GenresRepository::getAllGenres@48-62@./data/sql/genres_repository.cpp + 12 2 90 1 14 GenresRepository::updateGenre@65-78@./data/sql/genres_repository.cpp + 10 2 71 1 12 GenresRepository::deleteGenreById@80-91@./data/sql/genres_repository.cpp + 6 1 50 1 7 GenresRepository::mapQueryToDTO@93-99@./data/sql/genres_repository.cpp + 2 1 21 2 2 SessionsRepository::SessionsRepository@10-11@./data/sql/sessions_repository.cpp + 15 2 117 1 17 SessionsRepository::createSession@14-30@./data/sql/sessions_repository.cpp + 16 3 103 2 19 SessionsRepository::getSessionById@32-50@./data/sql/sessions_repository.cpp + 13 3 88 1 16 SessionsRepository::getAllSessions@53-68@./data/sql/sessions_repository.cpp + 16 2 131 1 18 SessionsRepository::updateSession@71-88@./data/sql/sessions_repository.cpp + 10 2 71 1 12 SessionsRepository::deleteSessionById@90-101@./data/sql/sessions_repository.cpp + 9 1 98 1 10 SessionsRepository::mapQueryToDTO@103-112@./data/sql/sessions_repository.cpp + 2 1 21 2 2 UsersRepository::UsersRepository@10-11@./data/sql/users_repository.cpp + 14 2 117 1 16 UsersRepository::createUser@13-28@./data/sql/users_repository.cpp + 16 3 104 2 19 UsersRepository::getUserById@30-48@./data/sql/users_repository.cpp + 17 3 106 2 20 UsersRepository::getUserByUsername@50-69@./data/sql/users_repository.cpp + 13 3 87 1 16 UsersRepository::getAllUsers@71-86@./data/sql/users_repository.cpp + 16 2 131 1 19 UsersRepository::updateUser@88-106@./data/sql/users_repository.cpp + 10 2 71 1 12 UsersRepository::deleteUserById@108-119@./data/sql/users_repository.cpp + 9 1 98 1 10 UsersRepository::mapQueryToDTO@121-130@./data/sql/users_repository.cpp + 2 1 21 2 2 HallsRepository::HallsRepository@10-11@./data/sql/halls_repository.cpp + 12 2 91 1 14 HallsRepository::createHall@13-26@./data/sql/halls_repository.cpp + 15 3 102 2 18 HallsRepository::getHallById@28-45@./data/sql/halls_repository.cpp + 12 3 87 1 15 HallsRepository::getAllHalls@47-61@./data/sql/halls_repository.cpp + 13 2 104 1 15 HallsRepository::updateHall@63-77@./data/sql/halls_repository.cpp + 10 2 71 1 12 HallsRepository::deleteHallById@79-90@./data/sql/halls_repository.cpp + 7 1 66 1 8 HallsRepository::mapQueryToDTO@92-99@./data/sql/halls_repository.cpp + 2 1 21 2 2 RefundsRepository::RefundsRepository@10-11@./data/sql/refunds_repository.cpp + 13 2 104 1 15 RefundsRepository::createRefund@14-28@./data/sql/refunds_repository.cpp + 21 3 170 2 25 RefundsRepository::getRefundById@30-54@./data/sql/refunds_repository.cpp + 13 3 87 1 16 RefundsRepository::getAllRefunds@57-72@./data/sql/refunds_repository.cpp + 15 2 117 1 17 RefundsRepository::updateRefund@75-91@./data/sql/refunds_repository.cpp + 10 2 71 1 12 RefundsRepository::deleteRefundById@93-104@./data/sql/refunds_repository.cpp + 8 1 82 1 9 RefundsRepository::mapQueryToDTO@106-114@./data/sql/refunds_repository.cpp + 2 1 21 2 2 TicketsRepository::TicketsRepository@10-11@./data/sql/tickets_repository.cpp + 13 2 104 1 15 TicketsRepository::createTicket@14-28@./data/sql/tickets_repository.cpp + 16 3 103 2 19 TicketsRepository::getTicketById@30-48@./data/sql/tickets_repository.cpp + 13 3 87 1 16 TicketsRepository::getAllTickets@51-66@./data/sql/tickets_repository.cpp + 15 2 117 1 17 TicketsRepository::updateTicket@69-85@./data/sql/tickets_repository.cpp + 10 2 71 1 12 TicketsRepository::deleteTicketById@87-98@./data/sql/tickets_repository.cpp + 8 1 82 1 9 TicketsRepository::mapQueryToDTO@100-108@./data/sql/tickets_repository.cpp + 3 1 27 2 3 DayManager::DayManager@6-8@./core/utils/day_manager.cpp + 9 5 69 2 9 DayManager::addAvailableSlot@10-18@./core/utils/day_manager.cpp + 17 4 101 1 20 DayManager::reserve@20-39@./core/utils/day_manager.cpp + 6 2 53 2 6 DayManager::isAvailable@42-47@./core/utils/day_manager.cpp + 9 3 64 1 9 DayManager::availableSlots@50-58@./core/utils/day_manager.cpp + 10 2 61 2 12 DayManager::reserveAvailableSlotLeft@60-71@./core/utils/day_manager.cpp + 10 2 62 2 12 DayManager::reserveAvailableSlotRight@73-84@./core/utils/day_manager.cpp + 24 4 165 2 32 DayManager::reserveAvailableSlotRandom@86-117@./core/utils/day_manager.cpp + 14 4 70 2 14 DayManager::reserveAvailableSlot@119-132@./core/utils/day_manager.cpp + 11 2 88 1 12 DayManager::reserveImplMaximal@134-145@./core/utils/day_manager.cpp + 12 2 88 1 13 DayManager::reserveImplMinimal@147-159@./core/utils/day_manager.cpp + 8 3 53 1 9 DayManager::reserveImplQuick@161-169@./core/utils/day_manager.cpp + 9 2 68 1 10 DayManager::reserveImplRandom@171-180@./core/utils/day_manager.cpp + 15 5 80 1 15 DayManager::reserveImpl@182-196@./core/utils/day_manager.cpp + 7 2 39 1 8 DayManager::setMinDuration@198-205@./core/utils/day_manager.cpp + 9 1 79 1 9 DayManager::calculatePossibleReservations@207-215@./core/utils/day_manager.cpp + 12 2 106 0 15 DayManager::duration@217-231@./core/utils/day_manager.cpp + 12 3 81 1 14 DayManager::duration@233-246@./core/utils/day_manager.cpp + 6 1 52 3 6 ReservationManager::ReservationManager@5-10@./core/utils/reservation_manager.cpp + 6 1 30 1 6 ReservationManager::setReference@12-17@./core/utils/reservation_manager.cpp + 5 2 34 0 5 ReservationManager::calculateAvailableDaysCount@19-23@./core/utils/reservation_manager.cpp + 13 1 86 1 15 ReservationManager::calculatePossibleReservations@26-40@./core/utils/reservation_manager.cpp + 6 1 51 0 6 ReservationManager::calculateAvailableSlotsCount@42-47@./core/utils/reservation_manager.cpp + 28 7 189 1 34 ReservationManager::reserve@49-82@./core/utils/reservation_manager.cpp + 8 2 53 1 8 ReservationManager::dayManager@84-91@./core/utils/reservation_manager.cpp + 14 2 117 2 19 ReservationManager::reserve@93-111@./core/utils/reservation_manager.cpp + 17 5 115 0 19 ReservationManager::prepareDaysRange@113-131@./core/utils/reservation_manager.cpp + 54 1 380 0 64 SchemaMetadata::initialize@8-71@./core/services/schema_metadata.cpp + 3 1 20 0 3 SchemaMetadata::SchemaMetadata@73-75@./core/services/schema_metadata.cpp + 1 1 10 0 1 SchemaMetadata::SchemaMetadata@77-77@./core/services/schema_metadata.cpp + 3 1 15 0 3 SchemaMetadata::operator =@79-81@./core/services/schema_metadata.cpp + 1 1 12 0 1 SchemaMetadata::defaultSchema@83-83@./core/services/schema_metadata.cpp + 8 2 46 1 10 SchemaMetadata::modelTableName@85-94@./core/services/schema_metadata.cpp + 9 2 46 1 11 SchemaMetadata::primaryIdColumnName@96-106@./core/services/schema_metadata.cpp + 9 2 46 1 11 SchemaMetadata::repositoryTableName@108-118@./core/services/schema_metadata.cpp + 9 2 46 1 11 SchemaMetadata::translatedTableName@120-130@./core/services/schema_metadata.cpp + 5 1 24 1 5 SchemaMetadata::relationIdConfig@133-137@./core/services/schema_metadata.cpp + 13 2 95 3 15 TicketGenerator::TicketGenerator@21-35@./core/services/ticket_generator.cpp + 13 3 96 0 15 TicketGenerator::initializeRepositories@37-51@./core/services/ticket_generator.cpp + 31 6 235 0 38 TicketGenerator::initializeSessionIdToAvailableSeatMap@53-90@./core/services/ticket_generator.cpp + 11 3 65 0 12 TicketGenerator::initializeSessionIdToBeginAtMap@92-103@./core/services/ticket_generator.cpp + 12 2 73 1 14 TicketGenerator::setFillRatioPerSessionRange@105-118@./core/services/ticket_generator.cpp + 5 1 38 0 5 TicketGenerator::generateFillRatioPerSession@120-124@./core/services/ticket_generator.cpp + 8 1 55 0 8 TicketGenerator::initializeRemainingCapacity@126-133@./core/services/ticket_generator.cpp + 11 1 77 1 11 TicketGenerator::createFailureMessage@136-146@./core/services/ticket_generator.cpp + 5 1 28 0 5 TicketGenerator::createSuccessMessage@148-152@./core/services/ticket_generator.cpp + 3 1 11 0 3 TicketGenerator::calculateRemainingCapacity@154-156@./core/services/ticket_generator.cpp + 11 2 61 0 14 TicketGenerator::createRecord@158-171@./core/services/ticket_generator.cpp + 23 2 182 0 31 TicketGenerator::prepareData@173-203@./core/services/ticket_generator.cpp + 13 2 77 0 15 TicketGenerator::clearStaleData@205-219@./core/services/ticket_generator.cpp + 3 1 21 0 3 BaseGenerator::shouldLogAllSuccesses@7-9@./core/services/base_generator.cpp + 13 3 74 1 15 BaseGenerator::shouldLogEveryNPercent@12-26@./core/services/base_generator.cpp + 3 2 27 0 3 BaseGenerator::shouldLogFirstAndLastPercent@29-31@./core/services/base_generator.cpp + 12 2 69 2 13 BaseGenerator::shouldLogEveryNSeconds@33-45@./core/services/base_generator.cpp + 6 2 54 2 7 BaseGenerator::defaultShouldLog@48-54@./core/services/base_generator.cpp + 4 1 31 1 5 BaseGenerator::generateAll@56-60@./core/services/base_generator.cpp + 14 3 87 2 17 BaseGenerator::generateByFillRatio@62-78@./core/services/base_generator.cpp + 13 2 84 2 16 BaseGenerator::generateByRecordCount@80-95@./core/services/base_generator.cpp + 23 5 165 2 29 BaseGenerator::generateImplementation@97-125@./core/services/base_generator.cpp + 5 1 41 0 5 BaseGenerator::updatePercentage@127-131@./core/services/base_generator.cpp + 4 1 25 1 4 BaseGenerator::createFailureMessage@133-136@./core/services/base_generator.cpp + 1 1 11 0 1 BaseGenerator::createSuccessMessage@138-138@./core/services/base_generator.cpp + 20 2 172 0 23 BaseGenerator::createTemplateMessage@140-162@./core/services/base_generator.cpp + 22 7 150 2 25 DateTimeGenerator::DateTimeGenerator@3-27@./core/services/date_time_generator.cpp + 20 2 179 1 26 DateTimeGenerator::generate@29-54@./core/services/date_time_generator.cpp + 16 4 116 2 20 DateTimeGenerator::generate@56-75@./core/services/date_time_generator.cpp + 10 1 47 1 12 SessionGenerator::SessionGenerator@13-24@./core/services/session_generator.cpp + 13 4 98 0 15 SessionGenerator::initializeRepositories@26-40@./core/services/session_generator.cpp + 16 4 100 1 20 SessionGenerator::initializeMovieIdToDurationMap@42-61@./core/services/session_generator.cpp + 10 1 81 0 12 SessionGenerator::initializeBounds@63-74@./core/services/session_generator.cpp + 13 2 103 0 15 SessionGenerator::initializeDayManager@76-90@./core/services/session_generator.cpp + 14 4 92 0 18 SessionGenerator::initializeHallIdToReservationManagerMap@92-109@./core/services/session_generator.cpp + 9 1 59 0 11 SessionGenerator::createRecord@111-121@./core/services/session_generator.cpp + 8 1 57 1 8 SessionGenerator::createFailureMessage@124-131@./core/services/session_generator.cpp + 12 1 87 0 22 SessionGenerator::createSuccessMessage@133-154@./core/services/session_generator.cpp + 8 1 53 0 9 SessionGenerator::calculateRemainingCapacity@156-164@./core/services/session_generator.cpp + 15 3 117 0 18 SessionGenerator::prepareData@166-183@./core/services/session_generator.cpp + 26 4 189 2 32 SessionGenerator::prepareData@185-216@./core/services/session_generator.cpp + 6 1 38 1 6 SessionGenerator::duration@218-223@./core/services/session_generator.cpp + 7 1 52 0 7 SessionGenerator::calculateAvailableDaysCount@225-231@./core/services/session_generator.cpp + 7 1 52 0 7 SessionGenerator::calculateAvailableSlotsCount@233-239@./core/services/session_generator.cpp + 6 1 46 1 6 SessionGenerator::calculateDuration@241-246@./core/services/session_generator.cpp + 7 2 46 0 7 SessionGenerator::clearStaleData@248-254@./core/services/session_generator.cpp + 7 1 47 4 7 RelationIdConfig::RelationIdConfig@3-9@./core/services/relation_id_config.cpp + 15 2 100 3 17 RefundGenerator::RefundGenerator@14-30@./core/services/refund_generator.cpp + 13 4 98 0 15 RefundGenerator::initializeRepositories@32-46@./core/services/refund_generator.cpp + 30 6 186 0 37 RefundGenerator::initializeTicketIdToCacheValueMap@48-84@./core/services/refund_generator.cpp + 13 1 95 1 13 RefundGenerator::createFailureMessage@87-99@./core/services/refund_generator.cpp + 6 1 40 0 6 RefundGenerator::createSuccessMessage@101-106@./core/services/refund_generator.cpp + 3 1 11 0 3 RefundGenerator::calculateRemainingCapacity@108-110@./core/services/refund_generator.cpp + 11 2 61 0 14 RefundGenerator::createRecord@112-125@./core/services/refund_generator.cpp + 28 3 219 0 37 RefundGenerator::prepareData@127-163@./core/services/refund_generator.cpp + 4 1 21 0 4 RefundGenerator::clearStaleData@165-168@./core/services/refund_generator.cpp + 8 2 39 0 11 ModelManager::ModelManager@11-21@./core/services/model_manager.cpp + 3 1 14 0 3 ModelManager::~ModelManager@23-25@./core/services/model_manager.cpp + 4 1 14 0 4 ModelManager::instance@27-30@./core/services/model_manager.cpp + 3 1 15 0 3 ModelManager::registeredModelTableNames@32-34@./core/services/model_manager.cpp + 11 3 67 1 11 ModelManager::registeredModelTableNames@37-47@./core/services/model_manager.cpp + 15 1 106 0 25 ModelManager::initialize@49-73@./core/services/model_manager.cpp + 9 2 68 1 10 ModelManager::getModel@75-84@./core/services/model_manager.cpp + 4 1 29 1 4 ModelManager::resetFilter@86-89@./core/services/model_manager.cpp + 5 1 35 2 5 ModelManager::setMultiColumnFilter@91-95@./core/services/model_manager.cpp + 8 2 39 0 9 RepositoryManager::RepositoryManager@14-22@./core/services/repository_manager.cpp + 3 1 14 0 3 RepositoryManager::~RepositoryManager@24-26@./core/services/repository_manager.cpp + 4 1 14 0 4 RepositoryManager::instance@28-31@./core/services/repository_manager.cpp + 21 1 133 0 36 RepositoryManager::initialize@33-68@./core/services/repository_manager.cpp + 11 2 68 1 13 RepositoryManager::getRepository@71-83@./core/services/repository_manager.cpp + 7 1 52 0 9 DatabaseManager::~DatabaseManager@9-17@./core/db/database_manager.cpp + 35 5 181 1 46 DatabaseManager::createDefaultDatabaseIfMissing@20-65@./core/db/database_manager.cpp + 18 4 110 1 24 DatabaseManager::connectToDefaultDatabase@67-90@./core/db/database_manager.cpp + 7 2 39 0 7 DatabaseManager::disconnectDefaultDatabase@92-98@./core/db/database_manager.cpp + 12 3 68 2 12 DatabaseManager::executeSqlFiles@100-111@./core/db/database_manager.cpp + 3 1 20 1 4 ExecuteSqlFile::ExecuteSqlFile@5-8@./core/db/execute_sql_file.cpp + 17 3 123 1 23 ExecuteSqlFile::operator ( )@10-32@./core/db/execute_sql_file.cpp + 13 5 71 1 17 ExecuteSqlFile::processStatements@34-50@./core/db/execute_sql_file.cpp + 26 5 159 2 33 ExecuteSqlFile::processLine@52-84@./core/db/execute_sql_file.cpp + 9 2 53 1 9 ExecuteSqlFile::processDelimiterChange@86-94@./core/db/execute_sql_file.cpp + 4 1 35 1 4 ExecuteSqlFile::filterLine@96-99@./core/db/execute_sql_file.cpp + 8 2 54 1 8 ExecuteSqlFile::executeStatement@101-108@./core/db/execute_sql_file.cpp + 1 1 14 0 1 RepositoryResult::successResult@3-3@./core/repositories/repository_result.cpp + 3 1 18 1 3 RepositoryResult::failureResult@5-7@./core/repositories/repository_result.cpp + 4 1 33 1 4 ApplicationConnector::ApplicationConnector@8-11@./core/controllers/application_connector.cpp + 15 5 58 0 19 ApplicationConnector::connect@13-31@./core/controllers/application_connector.cpp + 8 1 52 0 8 ApplicationConnector::initializeSelfReferenceTableLinks@34-41@./core/controllers/application_connector.cpp + 14 1 94 0 14 ApplicationConnector::initializeTablePairLinks@44-57@./core/controllers/application_connector.cpp + 8 2 55 1 8 ApplicationConnector::flattenLinkList@60-67@./core/controllers/application_connector.cpp + 24 1 162 0 25 ApplicationConnector::initializeUpdateDeleteCandidates@70-94@./core/controllers/application_connector.cpp + 10 1 64 0 13 ApplicationConnector::initializeDeleteCandidates@97-109@./core/controllers/application_connector.cpp + 10 2 52 0 11 ApplicationConnector::connectSelfReferenceTableLinks@111-121@./core/controllers/application_connector.cpp + 9 2 49 0 10 ApplicationConnector::connectTablePairLinks@123-132@./core/controllers/application_connector.cpp + 9 2 49 0 10 ApplicationConnector::connectUpdateDeleteRFLinks@134-143@./core/controllers/application_connector.cpp + 14 2 97 0 16 ApplicationConnector::connectDeleteRFLinks@145-160@./core/controllers/application_connector.cpp + 12 2 94 0 15 ApplicationConnector::pairTableConnections@163-177@./core/controllers/application_connector.cpp + 13 2 106 0 16 ApplicationConnector::singleTableConnections@180-195@./core/controllers/application_connector.cpp + 19 5 143 2 23 ApplicationConnector::linkRepositoryToModel@197-219@./core/controllers/application_connector.cpp + 24 6 168 2 29 ApplicationConnector::linkRepositoryToFinder@221-249@./core/controllers/application_connector.cpp + 12 2 94 0 15 ApplicationConnector::repositoryToFinderConnections@252-266@./core/controllers/application_connector.cpp + 4 2 36 1 4 ApplicationConnector::getAddress@268-271@./core/controllers/application_connector.cpp + 3 2 22 1 3 ApplicationConnector::getMetaClassName@273-275@./core/controllers/application_connector.cpp + 15 4 86 3 18 ApplicationConnector::getMethodSignature@277-294@./core/controllers/application_connector.cpp + 17 4 94 0 28 ApplicationController::setupApplication@21-48@./core/controllers/application_controller.cpp + 43 4 296 1 57 ApplicationController::ensureDatabaseExists@50-106@./core/controllers/application_controller.cpp + 4 1 16 0 4 ApplicationController::onLoginFailed@108-111@./core/controllers/application_controller.cpp + 5 1 20 2 5 ApplicationController::onLoginSuccessful@113-117@./core/controllers/application_controller.cpp + 8 2 49 1 9 ApplicationController::connectToDatabase@119-127@./core/controllers/application_controller.cpp + 19 3 119 4 22 ApplicationController::loadTranslations@129-150@./core/controllers/application_controller.cpp + 6 2 53 1 7 SQLiteFileExecutor::SQLiteFileExecutor@6-12@./tests_schema/tests_sources/sqlite_file_executor.cpp + 5 2 18 0 5 SQLiteFileExecutor::~SQLiteFileExecutor@14-18@./tests_schema/tests_sources/sqlite_file_executor.cpp + 15 4 106 1 17 SQLiteFileExecutor::executeSQLFile@21-37@./tests_schema/tests_sources/sqlite_file_executor.cpp + 15 4 126 2 18 SQLiteStatement::SQLiteStatement@5-22@./tests_schema/tests_sources/sqlite_statement.cpp + 1 1 11 0 1 SQLiteStatement::~SQLiteStatement@25-25@./tests_schema/tests_sources/sqlite_statement.cpp + 3 1 24 2 3 SQLiteStatement::bind@28-30@./tests_schema/tests_sources/sqlite_statement.cpp + 3 1 24 2 3 SQLiteStatement::bind@33-35@./tests_schema/tests_sources/sqlite_statement.cpp + 4 1 37 2 4 SQLiteStatement::bind@38-41@./tests_schema/tests_sources/sqlite_statement.cpp + 3 1 19 1 3 SQLiteStatement::bindNull@44-46@./tests_schema/tests_sources/sqlite_statement.cpp + 1 1 14 0 1 SQLiteStatement::execute@50-50@./tests_schema/tests_sources/sqlite_statement.cpp + 11 3 58 0 13 SQLiteStatement::step@53-65@./tests_schema/tests_sources/sqlite_statement.cpp + 1 1 13 0 1 SQLiteStatement::changes@68-68@./tests_schema/tests_sources/sqlite_statement.cpp + 1 1 12 0 1 SQLiteStatement::reset@71-71@./tests_schema/tests_sources/sqlite_statement.cpp + 6 2 22 0 6 SQLiteStatement::finalize@74-79@./tests_schema/tests_sources/sqlite_statement.cpp + 3 1 14 0 3 SQLiteStatement::getColumnCount@82-84@./tests_schema/tests_sources/sqlite_statement.cpp + 4 2 38 1 4 SQLiteStatement::getColumnText@87-90@./tests_schema/tests_sources/sqlite_statement.cpp + 12 2 87 2 16 FileReader::read@8-23@./tests_schema/tests_sources/file_reader.cpp + 6 2 53 1 7 SQLiteDatabase::SQLiteDatabase@8-14@./tests_schema/tests_sources/sqlite_database.cpp + 5 2 18 0 5 SQLiteDatabase::~SQLiteDatabase@17-21@./tests_schema/tests_sources/sqlite_database.cpp + 2 1 25 1 2 SQLiteDatabase::SQLiteDatabase@23-24@./tests_schema/tests_sources/sqlite_database.cpp + 9 3 49 1 9 SQLiteDatabase::operator =@26-34@./tests_schema/tests_sources/sqlite_database.cpp + 15 4 93 2 19 SQLiteDatabase::executeNonQuery@37-55@./tests_schema/tests_sources/sqlite_database.cpp + 20 5 143 2 24 SQLiteDatabase::executeSelectQuery@58-81@./tests_schema/tests_sources/sqlite_database.cpp + 7 1 55 1 8 SQLiteDatabase::addGenre@86-93@./tests_schema/tests_sources/sqlite_database.cpp + 6 1 51 1 7 SQLiteDatabase::removeGenre@96-102@./tests_schema/tests_sources/sqlite_database.cpp + 9 1 66 1 10 SQLiteDatabase::updateGenre@105-114@./tests_schema/tests_sources/sqlite_database.cpp + 12 2 99 1 13 SQLiteDatabase::getGenre@117-129@./tests_schema/tests_sources/sqlite_database.cpp + 9 2 67 0 11 SQLiteDatabase::getAllGenres@132-142@./tests_schema/tests_sources/sqlite_database.cpp + 10 1 77 1 11 SQLiteDatabase::addMovie@147-157@./tests_schema/tests_sources/sqlite_database.cpp + 6 1 51 1 7 SQLiteDatabase::removeMovie@160-166@./tests_schema/tests_sources/sqlite_database.cpp + 12 1 89 1 13 SQLiteDatabase::updateMovie@169-181@./tests_schema/tests_sources/sqlite_database.cpp + 14 2 135 1 15 SQLiteDatabase::getMovie@184-198@./tests_schema/tests_sources/sqlite_database.cpp + 10 2 87 0 11 SQLiteDatabase::getAllMovies@201-211@./tests_schema/tests_sources/sqlite_database.cpp + 9 1 66 1 10 SQLiteDatabase::addHall@216-225@./tests_schema/tests_sources/sqlite_database.cpp + 6 1 51 1 7 SQLiteDatabase::removeHall@228-234@./tests_schema/tests_sources/sqlite_database.cpp + 10 1 77 1 11 SQLiteDatabase::updateHall@237-247@./tests_schema/tests_sources/sqlite_database.cpp + 13 2 117 1 14 SQLiteDatabase::getHall@250-263@./tests_schema/tests_sources/sqlite_database.cpp + 9 2 77 0 10 SQLiteDatabase::getAllHalls@266-275@./tests_schema/tests_sources/sqlite_database.cpp + 11 1 89 1 12 SQLiteDatabase::addSession@280-291@./tests_schema/tests_sources/sqlite_database.cpp + 7 1 51 1 8 SQLiteDatabase::removeSession@294-301@./tests_schema/tests_sources/sqlite_database.cpp + 13 1 101 1 14 SQLiteDatabase::updateSession@304-317@./tests_schema/tests_sources/sqlite_database.cpp + 16 2 153 1 17 SQLiteDatabase::getSession@320-336@./tests_schema/tests_sources/sqlite_database.cpp + 10 2 97 0 11 SQLiteDatabase::getAllSessions@339-349@./tests_schema/tests_sources/sqlite_database.cpp + 10 1 78 1 11 SQLiteDatabase::addTicket@354-364@./tests_schema/tests_sources/sqlite_database.cpp + 6 1 51 1 7 SQLiteDatabase::removeTicket@367-373@./tests_schema/tests_sources/sqlite_database.cpp + 11 1 89 1 12 SQLiteDatabase::updateTicket@376-387@./tests_schema/tests_sources/sqlite_database.cpp + 14 2 135 1 15 SQLiteDatabase::getTicket@390-404@./tests_schema/tests_sources/sqlite_database.cpp + 10 2 87 0 11 SQLiteDatabase::getAllTickets@407-417@./tests_schema/tests_sources/sqlite_database.cpp + 11 1 78 1 12 SQLiteDatabase::addRefund@422-433@./tests_schema/tests_sources/sqlite_database.cpp + 6 1 51 1 7 SQLiteDatabase::removeRefund@436-442@./tests_schema/tests_sources/sqlite_database.cpp + 12 1 89 1 13 SQLiteDatabase::updateRefund@445-457@./tests_schema/tests_sources/sqlite_database.cpp + 14 2 135 1 15 SQLiteDatabase::getRefund@460-474@./tests_schema/tests_sources/sqlite_database.cpp + 10 2 87 0 11 SQLiteDatabase::getAllRefunds@477-487@./tests_schema/tests_sources/sqlite_database.cpp + 10 1 62 0 12 SQLiteDatabaseCRUDTest::SetUp@15-26@./tests_schema/tests/sqlite_database_crud_test.cpp + 4 1 18 0 4 SQLiteDatabaseCRUDTest::TearDown@28-31@./tests_schema/tests/sqlite_database_crud_test.cpp + 1 1 6 0 1 SimpleClass::SetUp@39-39@./tests_schema/tests/sqlite_database_crud_test.cpp + 1 1 6 0 1 SimpleClass::TearDown@40-40@./tests_schema/tests/sqlite_database_crud_test.cpp + 1 1 15 2 1 TEST_F@43-43@./tests_schema/tests/sqlite_database_crud_test.cpp + 3 1 17 2 3 TEST_F@48-50@./tests_schema/tests/sqlite_database_crud_test.cpp + 7 1 56 2 8 TEST_F@55-62@./tests_schema/tests/sqlite_database_crud_test.cpp + 7 1 49 2 8 TEST_F@65-72@./tests_schema/tests/sqlite_database_crud_test.cpp + 10 1 75 2 12 TEST_F@75-86@./tests_schema/tests/sqlite_database_crud_test.cpp + 7 1 49 2 8 TEST_F@89-96@./tests_schema/tests/sqlite_database_crud_test.cpp + 8 1 70 2 9 TEST_F@99-107@./tests_schema/tests/sqlite_database_crud_test.cpp + 9 1 84 2 10 TEST_F@112-121@./tests_schema/tests/sqlite_database_crud_test.cpp + 9 1 71 2 10 TEST_F@124-133@./tests_schema/tests/sqlite_database_crud_test.cpp + 7 1 53 2 8 TEST_F@136-143@./tests_schema/tests/sqlite_database_crud_test.cpp + 13 1 103 2 15 TEST_F@146-160@./tests_schema/tests/sqlite_database_crud_test.cpp + 12 1 126 2 13 TEST_F@163-175@./tests_schema/tests/sqlite_database_crud_test.cpp + 9 1 82 2 10 TEST_F@180-189@./tests_schema/tests/sqlite_database_crud_test.cpp + 8 1 60 2 9 TEST_F@192-200@./tests_schema/tests/sqlite_database_crud_test.cpp + 7 1 51 2 8 TEST_F@203-210@./tests_schema/tests/sqlite_database_crud_test.cpp + 12 1 92 2 14 TEST_F@213-226@./tests_schema/tests/sqlite_database_crud_test.cpp + 12 1 122 2 13 TEST_F@229-241@./tests_schema/tests/sqlite_database_crud_test.cpp + 10 1 98 2 11 TEST_F@246-256@./tests_schema/tests/sqlite_database_crud_test.cpp + 10 1 82 2 11 TEST_F@259-269@./tests_schema/tests/sqlite_database_crud_test.cpp + 7 1 55 2 8 TEST_F@272-279@./tests_schema/tests/sqlite_database_crud_test.cpp + 13 1 108 2 15 TEST_F@282-296@./tests_schema/tests/sqlite_database_crud_test.cpp + 14 1 154 2 15 TEST_F@299-313@./tests_schema/tests/sqlite_database_crud_test.cpp + 9 1 84 2 10 TEST_F@318-327@./tests_schema/tests/sqlite_database_crud_test.cpp + 9 1 71 2 10 TEST_F@330-339@./tests_schema/tests/sqlite_database_crud_test.cpp + 7 1 53 2 8 TEST_F@342-349@./tests_schema/tests/sqlite_database_crud_test.cpp + 12 1 97 2 14 TEST_F@352-365@./tests_schema/tests/sqlite_database_crud_test.cpp + 12 1 126 2 13 TEST_F@368-380@./tests_schema/tests/sqlite_database_crud_test.cpp + 5 1 26 0 5 SQLiteDatabaseForeignKeyTest::pragmaForeignKeys@21-25@./tests_schema/tests/sqlite_database_foreign_key_test.cpp + 10 1 62 0 13 SQLiteDatabaseForeignKeyTest::SetUp@28-40@./tests_schema/tests/sqlite_database_foreign_key_test.cpp + 4 1 18 0 4 SQLiteDatabaseForeignKeyTest::TearDown@42-45@./tests_schema/tests/sqlite_database_foreign_key_test.cpp + 5 1 37 2 5 TEST_F@51-55@./tests_schema/tests/sqlite_database_foreign_key_test.cpp + 11 1 89 2 13 TEST_F@58-70@./tests_schema/tests/sqlite_database_foreign_key_test.cpp + 12 1 95 2 14 TEST_F@73-86@./tests_schema/tests/sqlite_database_foreign_key_test.cpp + 13 1 102 2 15 TEST_F@89-103@./tests_schema/tests/sqlite_database_foreign_key_test.cpp + 12 1 76 0 14 SQLiteDatabaseTriggerTest::SetUp@14-27@./tests_schema/tests/sqlite_database_trigger_test.cpp + 4 1 18 0 4 SQLiteDatabaseTriggerTest::TearDown@29-32@./tests_schema/tests/sqlite_database_trigger_test.cpp + 13 1 97 2 17 TEST_F@38-54@./tests_schema/tests/sqlite_database_trigger_test.cpp + 13 1 92 2 17 TEST_F@57-73@./tests_schema/tests/sqlite_database_trigger_test.cpp + 14 1 103 2 18 TEST_F@76-93@./tests_schema/tests/sqlite_database_trigger_test.cpp + 16 1 129 2 23 TEST_F@98-120@./tests_schema/tests/sqlite_database_trigger_test.cpp + 15 1 123 2 22 TEST_F@123-144@./tests_schema/tests/sqlite_database_trigger_test.cpp + 4 1 27 2 4 main@3-6@./tests_schema/tests/main_test.cpp + 18 4 101 1 26 main@6-31@./src/main.cpp + 2 1 22 2 2 SessionsModel::SessionsModel@6-7@./ui/models/sessions_model.cpp + 12 2 83 0 16 SessionsModel::initialize@9-24@./ui/models/sessions_model.cpp + 16 3 103 2 20 SessionsModel::buildHallIdFilterCondition@26-45@./ui/models/sessions_model.cpp + 16 3 103 2 20 SessionsModel::buildMovieIdFilterCondition@47-66@./ui/models/sessions_model.cpp + 20 8 114 3 20 SessionsModel::headerData@68-87@./ui/models/sessions_model.cpp + 18 4 129 1 28 SessionsModel::createMultiColumnFilter@89-116@./ui/models/sessions_model.cpp + 2 1 22 2 2 MoviesModel::MoviesModel@6-7@./ui/models/movies_model.cpp + 10 2 66 0 14 MoviesModel::initialize@9-22@./ui/models/movies_model.cpp + 18 7 103 3 18 MoviesModel::headerData@24-41@./ui/models/movies_model.cpp + 13 2 90 2 16 MoviesModel::buildGenreIdFilterCondition@43-58@./ui/models/movies_model.cpp + 14 3 106 1 18 MoviesModel::createMultiColumnFilter@60-77@./ui/models/movies_model.cpp + 2 1 22 2 2 TicketsModel::TicketsModel@6-7@./ui/models/tickets_model.cpp + 8 2 49 0 10 TicketsModel::initialize@9-18@./ui/models/tickets_model.cpp + 18 7 103 3 18 TicketsModel::headerData@20-37@./ui/models/tickets_model.cpp + 12 2 97 1 21 TicketsModel::createMultiColumnFilter@39-59@./ui/models/tickets_model.cpp + 2 1 22 2 2 HallsModel::HallsModel@5-6@./ui/models/halls_model.cpp + 8 2 49 0 11 HallsModel::initialize@8-18@./ui/models/halls_model.cpp + 16 6 92 3 16 HallsModel::headerData@20-35@./ui/models/halls_model.cpp + 2 1 20 2 2 BaseSqlTableModel::BaseSqlTableModel@8-9@./ui/models/base_sql_table_model.cpp + 10 2 66 0 11 BaseSqlTableModel::refreshAll@11-21@./ui/models/base_sql_table_model.cpp + 3 1 25 2 20 BaseSqlTableModel::data@23-42@./ui/models/base_sql_table_model.cpp + 4 1 25 1 4 BaseSqlTableModel::setTable@44-47@./ui/models/base_sql_table_model.cpp + 4 1 26 0 4 BaseSqlTableModel::resetFilter@49-52@./ui/models/base_sql_table_model.cpp + 9 2 55 1 12 BaseSqlTableModel::setMultiColumnFilter@54-65@./ui/models/base_sql_table_model.cpp + 7 2 56 1 9 BaseSqlTableModel::createMultiColumnFilter@68-76@./ui/models/base_sql_table_model.cpp + 14 2 93 1 18 BaseSqlTableModel::createUpdateFilterMessage@79-96@./ui/models/base_sql_table_model.cpp + 2 1 22 2 2 GenresModel::GenresModel@5-6@./ui/models/genres_model.cpp + 8 2 49 0 10 GenresModel::initialize@8-17@./ui/models/genres_model.cpp + 14 5 81 3 14 GenresModel::headerData@19-32@./ui/models/genres_model.cpp + 3 1 15 1 3 MultiColumnSortFilterProxyModel::MultiColumnSortFilterProxyModel@5-7@./ui/models/multi_column_filter_proxy_model.cpp + 19 5 143 2 24 MultiColumnSortFilterProxyModel::filterAcceptsRow@9-32@./ui/models/multi_column_filter_proxy_model.cpp + 2 1 22 2 2 RefundsModel::RefundsModel@5-6@./ui/models/refunds_model.cpp + 8 2 49 0 10 RefundsModel::initialize@8-17@./ui/models/refunds_model.cpp + 18 7 103 3 18 RefundsModel::headerData@19-36@./ui/models/refunds_model.cpp + 11 2 97 1 20 RefundsModel::createMultiColumnFilter@38-57@./ui/models/refunds_model.cpp + 8 1 58 3 10 MainWindow::MainWindow@9-18@./ui/main_window/main_window.cpp + 26 8 170 0 48 MainWindow::configureAccessLevel@20-67@./ui/main_window/main_window.cpp + 10 3 64 0 16 MainWindow::configureAllTableViews@69-84@./ui/main_window/main_window.cpp + 7 1 50 1 13 MainWindow::MainWindow::disableSelection@86-98@./ui/main_window/main_window.cpp + 6 1 40 1 10 enableSelection@100-109@./ui/main_window/main_window.cpp + 17 3 129 1 35 MainWindow::loadDefaultConfiguration@111-145@./ui/main_window/main_window.cpp + 15 3 96 2 29 ErrorDialog::getDialog@9-37@./ui/dialogs/error_dialog.cpp + 28 4 186 2 35 ErrorDialog::displayError@39-73@./ui/dialogs/error_dialog.cpp + 21 7 157 1 23 ErrorDialog::handleNotFoundErrors@75-97@./ui/dialogs/error_dialog.cpp + 19 6 102 1 20 ErrorDialog::handleSqlConstraints@99-118@./ui/dialogs/error_dialog.cpp + 22 7 120 1 23 ErrorDialog::handleUniqueConstraint@120-142@./ui/dialogs/error_dialog.cpp + 19 6 103 1 20 ErrorDialog::handleForeignKeyConstraint@144-163@./ui/dialogs/error_dialog.cpp + 3 1 13 0 3 ErrorDialog::handlePrimaryKeyConstraint@165-167@./ui/dialogs/error_dialog.cpp + 28 9 154 1 29 ErrorDialog::handleCheckConstraint@169-197@./ui/dialogs/error_dialog.cpp + 19 7 78 1 19 ErrorDialog::getDetailedMessage@199-217@./ui/dialogs/error_dialog.cpp + 7 1 37 1 8 SearchDialog::SearchDialog@8-15@./ui/dialogs/search_dialog.cpp + 10 3 55 3 10 SearchDialog::SearchDialog@17-26@./ui/dialogs/search_dialog.cpp + 5 2 21 0 5 SearchDialog::~SearchDialog@28-32@./ui/dialogs/search_dialog.cpp + 8 2 40 1 8 SearchDialog::setFieldName@34-41@./ui/dialogs/search_dialog.cpp + 18 5 101 1 29 SearchDialog::setTableName@43-71@./ui/dialogs/search_dialog.cpp + 3 1 15 0 3 SearchDialog::initializeProxyModel@73-75@./ui/dialogs/search_dialog.cpp + 6 1 41 0 7 SearchDialog::setupConnections@77-83@./ui/dialogs/search_dialog.cpp + 15 1 119 0 25 SearchDialog::setupTableView@85-109@./ui/dialogs/search_dialog.cpp + 10 3 64 1 17 SearchDialog::onLineEditSearchTextChanged@111-127@./ui/dialogs/search_dialog.cpp + 21 4 149 0 26 SearchDialog::onPushButtonSelectClicked@129-154@./ui/dialogs/search_dialog.cpp + 8 2 42 1 10 AuthDialog::AuthDialog@14-23@./ui/dialogs/auth_dialog.cpp + 9 2 65 0 12 AuthDialog::initializeRepositories@25-36@./ui/dialogs/auth_dialog.cpp + 4 1 41 0 4 AuthDialog::setupConnections@38-41@./ui/dialogs/auth_dialog.cpp + 4 1 16 0 4 AuthDialog::onCancelClicked@43-46@./ui/dialogs/auth_dialog.cpp + 25 5 179 0 33 AuthDialog::onLoginClicked@48-80@./ui/dialogs/auth_dialog.cpp + 5 1 53 2 7 AuthDialog::hashPassword@82-88@./ui/dialogs/auth_dialog.cpp + 5 1 41 2 6 AuthDialog::verifyPassword@90-95@./ui/dialogs/auth_dialog.cpp + 4 1 20 1 4 SingleRecordTimeRangeWidget::SingleRecordTimeRangeWidget@3-6@./ui/widgets/single_record_time_range_widget.cpp + 3 1 34 0 3 TicketSalesReportWidget::SalesData::SalesData@15-17@./ui/widgets/ticket_sales_report_widget.cpp + 8 1 48 5 8 TicketSalesReportWidget::SalesData::SalesData@19-26@./ui/widgets/ticket_sales_report_widget.cpp + 9 1 96 1 9 TicketSalesReportWidget::SalesData::operator +@29-37@./ui/widgets/ticket_sales_report_widget.cpp + 4 1 31 1 4 TicketSalesReportWidget::SalesData::operator +=@40-43@./ui/widgets/ticket_sales_report_widget.cpp + 8 1 36 1 9 TicketSalesReportWidget::TicketSalesReportWidget@45-53@./ui/widgets/ticket_sales_report_widget.cpp + 18 1 100 0 21 TicketSalesReportWidget::configureReportForGenre@55-75@./ui/widgets/ticket_sales_report_widget.cpp + 18 1 100 0 21 TicketSalesReportWidget::configureReportForHall@77-97@./ui/widgets/ticket_sales_report_widget.cpp + 18 1 100 0 21 TicketSalesReportWidget::configureReportForMovie@99-119@./ui/widgets/ticket_sales_report_widget.cpp + 11 2 61 0 13 TicketSalesReportWidget::initializeRepositories@121-133@./ui/widgets/ticket_sales_report_widget.cpp + 4 1 24 0 4 TicketSalesReportWidget::initializeChart@135-138@./ui/widgets/ticket_sales_report_widget.cpp + 3 1 18 0 3 TicketSalesReportWidget::setupChart@140-142@./ui/widgets/ticket_sales_report_widget.cpp + 10 1 75 0 13 TicketSalesReportWidget::setupConnections@144-156@./ui/widgets/ticket_sales_report_widget.cpp + 7 1 42 3 7 TicketSalesReportWidget::configureEntityFinder@158-164@./ui/widgets/ticket_sales_report_widget.cpp + 4 1 22 0 4 TicketSalesReportWidget::onEntityFinderReseted@166-169@./ui/widgets/ticket_sales_report_widget.cpp + 21 4 141 0 24 TicketSalesReportWidget::onPushButtonGenerateClicked@171-194@./ui/widgets/ticket_sales_report_widget.cpp + 4 1 33 1 4 TicketSalesReportWidget::onFieldRetrieved@196-199@./ui/widgets/ticket_sales_report_widget.cpp + 4 1 34 1 4 TicketSalesReportWidget::onRecordRetrieved@201-204@./ui/widgets/ticket_sales_report_widget.cpp + 18 4 135 2 23 TicketSalesReportWidget::aggregateByDateTime@207-229@./ui/widgets/ticket_sales_report_widget.cpp + 10 1 67 4 10 TicketSalesReportWidget::createDateTimeAxis@231-240@./ui/widgets/ticket_sales_report_widget.cpp + 8 1 50 2 8 TicketSalesReportWidget::createValueAxis@243-250@./ui/widgets/ticket_sales_report_widget.cpp + 8 2 44 1 13 TicketSalesReportWidget::validateData@252-264@./ui/widgets/ticket_sales_report_widget.cpp + 7 1 45 1 7 TicketSalesReportWidget::retrieveSessions@266-272@./ui/widgets/ticket_sales_report_widget.cpp + 6 1 35 2 6 TicketSalesReportWidget::dateRange@274-279@./ui/widgets/ticket_sales_report_widget.cpp + 51 3 418 1 64 TicketSalesReportWidget::createChart@281-344@./ui/widgets/ticket_sales_report_widget.cpp + 9 1 66 4 9 TicketSalesReportWidget::setupChart@346-354@./ui/widgets/ticket_sales_report_widget.cpp + 4 1 27 1 4 TicketSalesReportWidget::updateChartView@356-359@./ui/widgets/ticket_sales_report_widget.cpp + 8 1 42 1 9 EntityUpdaterWidget::EntityUpdaterWidget@33-41@./ui/widgets/entity_updater_widget.cpp + 11 2 73 0 13 EntityUpdaterWidget::setupComboBoxCurrentTable@43-55@./ui/widgets/entity_updater_widget.cpp + 14 1 109 0 19 EntityUpdaterWidget::setupConnections@57-75@./ui/widgets/entity_updater_widget.cpp + 7 1 38 0 7 EntityUpdaterWidget::setupChildEntityFinderWidget@77-83@./ui/widgets/entity_updater_widget.cpp + 6 1 31 0 6 EntityUpdaterWidget::setupParentEntityFinderWidget@85-90@./ui/widgets/entity_updater_widget.cpp + 16 3 73 2 22 EntityUpdaterWidget::configureForeignKeyFinder@92-113@./ui/widgets/entity_updater_widget.cpp + 5 1 24 1 5 EntityUpdaterWidget::configureForeignKeyFinder@115-119@./ui/widgets/entity_updater_widget.cpp + 5 1 24 1 5 EntityUpdaterWidget::configurePrimaryKeyFinder@121-125@./ui/widgets/entity_updater_widget.cpp + 5 1 47 1 5 EntityUpdaterWidget::onPrimaryFieldRetrieved@127-131@./ui/widgets/entity_updater_widget.cpp + 5 1 39 1 5 EntityUpdaterWidget::onForeignFieldRetrieved@133-137@./ui/widgets/entity_updater_widget.cpp + 4 1 25 1 4 EntityUpdaterWidget::onPrimaryEntityRetrieved@139-142@./ui/widgets/entity_updater_widget.cpp + 7 2 49 1 8 EntityUpdaterWidget::actualColumnValue@145-152@./ui/widgets/entity_updater_widget.cpp + 7 2 49 1 8 EntityUpdaterWidget::actualColumnValue@155-162@./ui/widgets/entity_updater_widget.cpp + 7 2 49 1 8 EntityUpdaterWidget::actualColumnValue@165-172@./ui/widgets/entity_updater_widget.cpp + 7 2 49 1 8 EntityUpdaterWidget::actualColumnValue@175-182@./ui/widgets/entity_updater_widget.cpp + 7 2 53 1 8 EntityUpdaterWidget::actualForeignKey@184-191@./ui/widgets/entity_updater_widget.cpp + 6 1 46 0 7 EntityUpdaterWidget::updateEntity@195-201@./ui/widgets/entity_updater_widget.cpp + 7 1 59 0 8 EntityUpdaterWidget::updateEntity@204-211@./ui/widgets/entity_updater_widget.cpp + 8 1 69 0 9 EntityUpdaterWidget::updateEntity@215-223@./ui/widgets/entity_updater_widget.cpp + 8 1 69 0 9 EntityUpdaterWidget::updateEntity@227-235@./ui/widgets/entity_updater_widget.cpp + 10 1 79 0 11 EntityUpdaterWidget::updateEntity@239-249@./ui/widgets/entity_updater_widget.cpp + 8 1 69 0 9 EntityUpdaterWidget::updateEntity@253-261@./ui/widgets/entity_updater_widget.cpp + 10 2 58 1 10 EntityUpdaterWidget::processEntityUpdate@264-273@./ui/widgets/entity_updater_widget.cpp + 10 2 58 1 10 EntityUpdaterWidget::processEntityUpdate@276-285@./ui/widgets/entity_updater_widget.cpp + 10 2 58 1 10 EntityUpdaterWidget::processEntityUpdate@288-297@./ui/widgets/entity_updater_widget.cpp + 10 2 58 1 10 EntityUpdaterWidget::processEntityUpdate@300-309@./ui/widgets/entity_updater_widget.cpp + 10 2 58 1 10 EntityUpdaterWidget::processEntityUpdate@312-321@./ui/widgets/entity_updater_widget.cpp + 10 2 58 1 10 EntityUpdaterWidget::processEntityUpdate@324-333@./ui/widgets/entity_updater_widget.cpp + 23 7 169 0 32 EntityUpdaterWidget::onPushButtonUpdateClicked@335-366@./ui/widgets/entity_updater_widget.cpp + 19 3 141 1 25 EntityUpdaterWidget::onTableSelected@368-392@./ui/widgets/entity_updater_widget.cpp + 31 7 186 1 35 EntityUpdaterWidget::onColumnSelected@394-428@./ui/widgets/entity_updater_widget.cpp + 13 6 93 3 15 EntityUpdaterWidget::findIndexByColumn@430-444@./ui/widgets/entity_updater_widget.cpp + 9 2 96 1 12 EntityUpdaterWidget::isColumnsEqual@446-457@./ui/widgets/entity_updater_widget.cpp + 18 2 130 1 24 EntityUpdaterWidget::processUpdateResult@459-482@./ui/widgets/entity_updater_widget.cpp + 8 2 55 2 8 EntityUpdaterWidget::showMessageDialog@484-491@./ui/widgets/entity_updater_widget.cpp + 5 1 28 1 6 EntityFinderWidget::EntityFinderWidget@8-13@./ui/widgets/entity_finder_widget.cpp + 7 1 35 3 7 EntityFinderWidget::EntityFinderWidget@15-21@./ui/widgets/entity_finder_widget.cpp + 15 3 101 1 18 EntityFinderWidget::setHiddenFrame@23-40@./ui/widgets/entity_finder_widget.cpp + 12 2 119 1 16 EntityFinderWidget::refreshLineEditText@42-57@./ui/widgets/entity_finder_widget.cpp + 7 1 50 1 8 EntityFinderWidget::setDefaultRelation@59-66@./ui/widgets/entity_finder_widget.cpp + 4 1 24 0 4 EntityFinderWidget::setupConnections@68-71@./ui/widgets/entity_finder_widget.cpp + 3 1 15 0 3 EntityFinderWidget::setupFrameStyle@73-75@./ui/widgets/entity_finder_widget.cpp + 6 1 34 0 7 EntityFinderWidget::resetToDefault@77-83@./ui/widgets/entity_finder_widget.cpp + 10 1 77 0 16 EntityFinderWidget::onPushButtonFindEntityClicked@85-100@./ui/widgets/entity_finder_widget.cpp + 3 1 15 1 3 EntityFinderWidget::onRowSelected@102-104@./ui/widgets/entity_finder_widget.cpp + 4 1 22 1 4 EntityFinderWidget::onRecordRetrieved@106-109@./ui/widgets/entity_finder_widget.cpp + 3 1 17 1 3 EntityFinderWidget::onFieldRetrieved@111-113@./ui/widgets/entity_finder_widget.cpp + 4 1 24 1 5 ReportsWidget::ReportsWidget@9-13@./ui/widgets/reports_widget.cpp + 5 1 25 0 5 ReportsWidget::setupTicketSalesReportWidgets@15-19@./ui/widgets/reports_widget.cpp + 10 1 44 1 11 SessionManagementWidget::SessionManagementWidget@13-23@./ui/widgets/session_management_widget.cpp + 10 2 58 0 12 SessionManagementWidget::initializeRepositories@25-36@./ui/widgets/session_management_widget.cpp + 10 2 61 0 12 SessionManagementWidget::initializeModels@38-49@./ui/widgets/session_management_widget.cpp + 3 1 14 0 3 SessionManagementWidget::setupTableView@51-53@./ui/widgets/session_management_widget.cpp + 8 1 58 0 10 SessionManagementWidget::setupConnections@55-64@./ui/widgets/session_management_widget.cpp + 6 1 38 0 6 SessionManagementWidget::setupHallFinder@66-71@./ui/widgets/session_management_widget.cpp + 6 1 38 0 6 SessionManagementWidget::setupMovieFinder@73-78@./ui/widgets/session_management_widget.cpp + 14 2 98 0 16 SessionManagementWidget::onPushButtonAddSessionClicked@80-95@./ui/widgets/session_management_widget.cpp + 3 1 23 1 3 SessionManagementWidget::onHallFieldRetrieved@97-99@./ui/widgets/session_management_widget.cpp + 3 1 23 1 3 SessionManagementWidget::onMovieFieldRetrieved@101-103@./ui/widgets/session_management_widget.cpp + 10 1 58 1 11 DirectoriesManagementWidget::DirectoriesManagementWidget@26-36@./ui/widgets/directories_management_widget.cpp + 15 4 99 0 19 DirectoriesManagementWidget::initializeRepositories@38-56@./ui/widgets/directories_management_widget.cpp + 14 4 99 0 18 DirectoriesManagementWidget::initializeModels@58-75@./ui/widgets/directories_management_widget.cpp + 7 1 47 0 8 DirectoriesManagementWidget::setupGenreFinder@77-84@./ui/widgets/directories_management_widget.cpp + 5 1 28 0 7 DirectoriesManagementWidget::setupTableViews@86-92@./ui/widgets/directories_management_widget.cpp + 10 1 75 0 13 DirectoriesManagementWidget::setupConnections@94-106@./ui/widgets/directories_management_widget.cpp + 17 3 121 0 20 DirectoriesManagementWidget::onPushButtonAddMovieClicked@108-127@./ui/widgets/directories_management_widget.cpp + 12 2 84 0 14 DirectoriesManagementWidget::onPushButtonAddHallClicked@129-142@./ui/widgets/directories_management_widget.cpp + 4 1 23 1 4 DirectoriesManagementWidget::onGenreFieldRetrieved@144-147@./ui/widgets/directories_management_widget.cpp + 10 2 68 0 12 DirectoriesManagementWidget::onPushButtonAddGenreClicked@149-160@./ui/widgets/directories_management_widget.cpp + 6 1 32 1 7 EntityDeleterWidget::EntityDeleterWidget@15-21@./ui/widgets/entity_deleter_widget.cpp + 9 2 57 0 11 EntityDeleterWidget::setupComboBoxCurrentTable@23-33@./ui/widgets/entity_deleter_widget.cpp + 10 1 75 0 13 EntityDeleterWidget::setupConnections@35-47@./ui/widgets/entity_deleter_widget.cpp + 4 1 21 0 4 EntityDeleterWidget::setupEntityFinder@49-52@./ui/widgets/entity_deleter_widget.cpp + 5 1 29 0 6 EntityDeleterWidget::refreshEntityFinder@54-59@./ui/widgets/entity_deleter_widget.cpp + 7 1 47 1 9 EntityDeleterWidget::onComboBoxCurrentTableCurrentIndexChanged@61-69@./ui/widgets/entity_deleter_widget.cpp + 3 1 15 1 3 EntityDeleterWidget::onFieldRetrieved@71-73@./ui/widgets/entity_deleter_widget.cpp + 3 1 15 1 5 EntityDeleterWidget::onRecordRetrieved@75-79@./ui/widgets/entity_deleter_widget.cpp + 4 1 31 0 4 EntityDeleterWidget::deleteEntityById@83-86@./ui/widgets/entity_deleter_widget.cpp + 4 1 31 0 4 EntityDeleterWidget::deleteEntityById@90-93@./ui/widgets/entity_deleter_widget.cpp + 4 1 31 0 4 EntityDeleterWidget::deleteEntityById@97-100@./ui/widgets/entity_deleter_widget.cpp + 4 1 31 0 4 EntityDeleterWidget::deleteEntityById@104-107@./ui/widgets/entity_deleter_widget.cpp + 4 1 31 0 4 EntityDeleterWidget::deleteEntityById@111-114@./ui/widgets/entity_deleter_widget.cpp + 4 1 31 0 4 EntityDeleterWidget::deleteEntityById@118-121@./ui/widgets/entity_deleter_widget.cpp + 28 7 206 0 48 EntityDeleterWidget::onPushButtonDeleteEntityClicked@123-170@./ui/widgets/entity_deleter_widget.cpp + 8 2 55 2 8 EntityDeleterWidget::showMessageDialog@172-179@./ui/widgets/entity_deleter_widget.cpp + 9 1 46 1 10 TicketReturnWidget::TicketReturnWidget@13-22@./ui/widgets/ticket_return_widget.cpp + 3 1 14 0 3 TicketReturnWidget::setupTableView@25-27@./ui/widgets/ticket_return_widget.cpp + 6 1 38 0 6 TicketReturnWidget::setupTicketFinder@29-34@./ui/widgets/ticket_return_widget.cpp + 10 2 61 0 12 TicketReturnWidget::initializeRepositories@36-47@./ui/widgets/ticket_return_widget.cpp + 10 2 61 0 12 TicketReturnWidget::initializeModels@49-60@./ui/widgets/ticket_return_widget.cpp + 6 1 41 0 7 TicketReturnWidget::setupConnections@62-68@./ui/widgets/ticket_return_widget.cpp + 29 4 183 0 36 TicketReturnWidget::onPushButtonRefundTicketClicked@70-105@./ui/widgets/ticket_return_widget.cpp + 3 1 23 1 3 TicketReturnWidget::onTicketFieldRetrieved@107-109@./ui/widgets/ticket_return_widget.cpp + 9 1 46 1 10 TicketSaleWidget::TicketSaleWidget@15-24@./ui/widgets/ticket_sale_widget.cpp + 3 1 14 0 3 TicketSaleWidget::setupTableView@26-28@./ui/widgets/ticket_sale_widget.cpp + 10 2 58 0 12 TicketSaleWidget::initializeRepositories@30-41@./ui/widgets/ticket_sale_widget.cpp + 10 2 61 0 12 TicketSaleWidget::initializeModels@43-54@./ui/widgets/ticket_sale_widget.cpp + 6 1 41 0 7 TicketSaleWidget::setupConnections@56-62@./ui/widgets/ticket_sale_widget.cpp + 6 1 38 0 6 TicketSaleWidget::setupSessionFinder@64-69@./ui/widgets/ticket_sale_widget.cpp + 21 4 137 0 25 TicketSaleWidget::onPushButtonSellTicketClicked@71-95@./ui/widgets/ticket_sale_widget.cpp + 3 1 23 1 3 TicketSaleWidget::onFieldRetrieved@97-99@./ui/widgets/ticket_sale_widget.cpp + 8 3 40 1 8 TicketSaleWidget::validateSessionValues@102-109@./ui/widgets/ticket_sale_widget.cpp + 2 1 15 1 2 DateTimeDelegate::DateTimeDelegate@3-4@./ui/delegates/date_time_delegate.cpp + 12 3 95 2 14 DateTimeDelegate::displayText@6-19@./ui/delegates/date_time_delegate.cpp + 9 1 82 0 11 ReservationManagerTest::testReserveFailure@13-23@./tests_class/reservation_manager_test.cpp + 22 4 195 0 26 ReservationManagerTest::testReserveSuccess@25-50@./tests_class/reservation_manager_test.cpp + 12 2 107 0 14 ReservationManagerTest::testReserveBound@52-65@./tests_class/reservation_manager_test.cpp + 7 1 83 0 8 DayManagerTest::testAddAvailableSlot@18-25@./tests_class/day_manager_test.cpp + 8 1 122 0 11 DayManagerTest::testDuration@27-37@./tests_class/day_manager_test.cpp + 13 2 147 0 16 DayManagerTest::testReserveImplQuick@39-54@./tests_class/day_manager_test.cpp + 22 1 237 0 27 DayManagerTest::testReserveImplMaximal@56-82@./tests_class/day_manager_test.cpp + 22 1 237 0 27 DayManagerTest::testReserveImplMinimal@84-110@./tests_class/day_manager_test.cpp + 11 2 104 0 13 DayManagerTest::testReserveImplRandom@112-124@./tests_class/day_manager_test.cpp + 16 1 179 0 18 DayManagerTest::testReserveSuccess@126-143@./tests_class/day_manager_test.cpp + 22 1 291 0 28 DayManagerTest::testReserveFailure@145-172@./tests_class/day_manager_test.cpp +61 file analyzed. +============================================================== +NLOC Avg.NLOC AvgCCN Avg.token function_cnt file +-------------------------------------------------------------- + 19 8.0 2.0 53.0 2 ./data/sql/base_sql_table_repository.cpp + 131 12.3 2.2 99.0 10 ./data/sql/sessions_statistics_repository.cpp + 85 10.7 2.0 83.6 7 ./data/sql/movies_repository.cpp + 77 10.0 2.0 75.6 7 ./data/sql/roles_repository.cpp + 110 9.5 2.9 65.9 11 ./data/sql/table_info_sqlite.cpp + 78 9.7 2.0 71.1 7 ./data/sql/genres_repository.cpp + 91 11.6 2.0 89.9 7 ./data/sql/sessions_repository.cpp + 104 12.1 2.1 91.9 8 ./data/sql/users_repository.cpp + 78 10.1 2.0 77.4 7 ./data/sql/halls_repository.cpp + 92 11.7 2.0 93.1 7 ./data/sql/refunds_repository.cpp + 87 11.0 2.0 83.6 7 ./data/sql/tickets_repository.cpp + 202 10.9 2.7 75.2 18 ./core/utils/day_manager.cpp + 106 11.4 2.4 80.8 9 ./core/utils/reservation_manager.cpp + 107 10.2 1.4 64.5 10 ./core/services/schema_metadata.cpp + 176 12.2 2.1 84.1 13 ./core/services/ticket_generator.cpp + 128 9.3 2.0 66.2 13 ./core/services/base_generator.cpp + 59 19.3 4.3 148.3 3 ./core/services/date_time_generator.cpp + 198 11.0 1.9 77.5 17 ./core/services/session_generator.cpp + 8 7.0 1.0 47.0 1 ./core/services/relation_id_config.cpp + 135 13.7 2.3 92.3 9 ./core/services/refund_generator.cpp + 71 6.9 1.4 43.0 9 ./core/services/model_manager.cpp + 59 9.4 1.4 53.6 5 ./core/services/repository_manager.cpp + 86 15.8 3.0 90.0 5 ./core/db/database_manager.cpp + 82 11.4 2.7 73.6 7 ./core/db/execute_sql_file.cpp + 5 2.0 1.0 16.0 2 ./core/repositories/repository_result.cpp + 240 11.9 2.4 79.7 19 ./core/controllers/application_connector.cpp + 108 16.0 2.5 99.0 6 ./core/controllers/application_controller.cpp + 29 8.7 2.7 59.0 3 ./tests_schema/tests_sources/sqlite_file_executor.cpp + 58 4.3 1.5 31.7 13 ./tests_schema/tests_sources/sqlite_statement.cpp + 16 12.0 2.0 87.0 1 ./tests_schema/tests_sources/file_reader.cpp + 364 10.0 1.6 81.0 36 ./tests_schema/tests_sources/sqlite_database.cpp + 271 8.4 1.0 70.8 31 ./tests_schema/tests/sqlite_database_crud_test.cpp + 70 8.6 1.0 61.3 7 ./tests_schema/tests/sqlite_database_foreign_key_test.cpp + 95 12.4 1.0 91.1 7 ./tests_schema/tests/sqlite_database_trigger_test.cpp + 5 4.0 1.0 27.0 1 ./tests_schema/tests/main_test.cpp + 22 18.0 4.0 101.0 1 ./src/main.cpp + 87 14.0 3.5 92.3 6 ./ui/models/sessions_model.cpp + 60 11.4 3.0 77.4 5 ./ui/models/movies_model.cpp + 43 10.0 3.0 67.8 4 ./ui/models/tickets_model.cpp + 28 8.7 3.0 54.3 3 ./ui/models/halls_model.cpp + 60 6.6 1.5 45.8 8 ./ui/models/base_sql_table_model.cpp + 26 8.0 2.7 50.7 3 ./ui/models/genres_model.cpp + 24 11.0 3.0 79.0 2 ./ui/models/multi_column_filter_proxy_model.cpp + 41 9.8 3.0 67.8 4 ./ui/models/refunds_model.cpp + 76 12.3 2.8 85.2 6 ./ui/main_window/main_window.cpp + 180 19.3 5.6 112.1 9 ./ui/dialogs/error_dialog.cpp + 108 10.3 2.3 64.2 10 ./ui/dialogs/search_dialog.cpp + 71 8.6 1.9 62.4 7 ./ui/dialogs/auth_dialog.cpp + 5 4.0 1.0 20.0 1 ./ui/widgets/single_record_time_range_widget.cpp + 291 10.6 1.4 72.4 26 ./ui/widgets/ticket_sales_report_widget.cpp + 396 10.0 2.0 68.1 35 ./ui/widgets/entity_updater_widget.cpp + 84 6.6 1.2 44.8 12 ./ui/widgets/entity_finder_widget.cpp + 15 4.5 1.0 24.5 2 ./ui/widgets/reports_widget.cpp + 83 7.3 1.3 45.5 10 ./ui/widgets/session_management_widget.cpp + 120 10.4 2.0 70.2 10 ./ui/widgets/directories_management_widget.cpp + 130 6.7 1.5 46.1 16 ./ui/widgets/entity_deleter_widget.cpp + 86 9.5 1.6 58.4 8 ./ui/widgets/ticket_return_widget.cpp + 88 8.4 1.8 50.9 9 ./ui/widgets/ticket_sale_widget.cpp + 15 7.0 2.0 55.0 2 ./ui/delegates/date_time_delegate.cpp + 54 14.3 2.3 128.0 3 ./tests_class/reservation_manager_test.cpp + 137 15.1 1.2 175.0 8 ./tests_class/day_manager_test.cpp + +=============================================================================================================== +No thresholds exceeded (cyclomatic_complexity > 15 or length > 1000 or nloc > 1000000 or parameter_count > 100) +========================================================================================== +Total nloc Avg.NLOC AvgCCN Avg.token Fun Cnt Warning cnt Fun Rt nloc Rt +------------------------------------------------------------------------------------------ + 5960 10.3 2.0 73.2 535 0 0.00 0.00 diff --git a/artifacts/source_lines_count.txt b/artifacts/source_lines_count.txt new file mode 100644 index 0000000..e9b6df7 --- /dev/null +++ b/artifacts/source_lines_count.txt @@ -0,0 +1,68 @@ + 919 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/CMakeFiles/3.30.3/CompilerIdCXX/CMakeCXXCompilerId.cpp + 1402 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/EWIEGA46WW/qrc_resources.cpp + 27 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/mocs_compilation.cpp + 3 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/tests_class/day_manager_test_autogen/mocs_compilation.cpp + 3 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/tests_class/reservation_manager_test_autogen/mocs_compilation.cpp + 3 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/tests_schema/tests_schema_autogen/mocs_compilation.cpp + 294 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers/application_connector.cpp + 150 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers/application_controller.cpp + 111 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db/database_manager.cpp + 108 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db/execute_sql_file.cpp + 7 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories/repository_result.cpp + 162 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services/base_generator.cpp + 75 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services/date_time_generator.cpp + 95 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services/model_manager.cpp + 168 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services/refund_generator.cpp + 9 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services/relation_id_config.cpp + 83 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services/repository_manager.cpp + 137 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services/schema_metadata.cpp + 254 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services/session_generator.cpp + 219 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services/ticket_generator.cpp + 246 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils/day_manager.cpp + 131 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils/reservation_manager.cpp + 23 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql/base_sql_table_repository.cpp + 99 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql/genres_repository.cpp + 99 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql/halls_repository.cpp + 106 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql/movies_repository.cpp + 114 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql/refunds_repository.cpp + 98 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql/roles_repository.cpp + 112 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql/sessions_repository.cpp + 169 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql/sessions_statistics_repository.cpp + 138 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql/table_info_sqlite.cpp + 108 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql/tickets_repository.cpp + 130 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql/users_repository.cpp + 25 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/src/main.cpp + 175 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_class/day_manager_test.cpp + 68 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_class/reservation_manager_test.cpp + 6 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_schema/tests/main_test.cpp + 380 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_schema/tests/sqlite_database_crud_test.cpp + 103 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_schema/tests/sqlite_database_foreign_key_test.cpp + 144 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_schema/tests/sqlite_database_trigger_test.cpp + 23 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_schema/tests_sources/file_reader.cpp + 487 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_schema/tests_sources/sqlite_database.cpp + 37 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_schema/tests_sources/sqlite_file_executor.cpp + 90 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_schema/tests_sources/sqlite_statement.cpp + 19 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates/date_time_delegate.cpp + 95 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs/auth_dialog.cpp + 217 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs/error_dialog.cpp + 154 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs/search_dialog.cpp + 145 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window/main_window.cpp + 96 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models/base_sql_table_model.cpp + 32 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models/genres_model.cpp + 35 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models/halls_model.cpp + 77 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models/movies_model.cpp + 32 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models/multi_column_filter_proxy_model.cpp + 57 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models/refunds_model.cpp + 116 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models/sessions_model.cpp + 59 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models/tickets_model.cpp + 160 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets/directories_management_widget.cpp + 179 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets/entity_deleter_widget.cpp + 113 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets/entity_finder_widget.cpp + 491 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets/entity_updater_widget.cpp + 19 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets/reports_widget.cpp + 103 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets/session_management_widget.cpp + 6 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets/single_record_time_range_widget.cpp + 109 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets/ticket_return_widget.cpp + 109 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets/ticket_sale_widget.cpp + 362 /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets/ticket_sales_report_widget.cpp + 10125 итого diff --git a/artifacts/tree.txt b/artifacts/tree.txt new file mode 100644 index 0000000..04d3f91 --- /dev/null +++ b/artifacts/tree.txt @@ -0,0 +1,516 @@ +/media/sdb1/projects/coursework-metrology/coursework-metrology-main +├── build_linux +│   ├── build.ninja +│   ├── Cinema +│   ├── Cinema_autogen +│   │   ├── BDOFDOW4MI +│   │   │   ├── moc_main_window.cpp +│   │   │   └── moc_main_window.cpp.d +│   │   ├── CEMMROP6SC +│   │   │   ├── moc_data_repository_signals.cpp +│   │   │   └── moc_data_repository_signals.cpp.d +│   │   ├── deps +│   │   ├── EWIEGA46WW +│   │   │   └── qrc_resources.cpp +│   │   ├── include +│   │   │   └── ui_entity_finder_widget.h +│   │   ├── moc_predefs.h +│   │   ├── mocs_compilation.cpp +│   │   ├── NJHUVPU35C +│   │   │   ├── moc_directories_management_widget.cpp +│   │   │   ├── moc_directories_management_widget.cpp.d +│   │   │   ├── moc_entity_deleter_widget.cpp +│   │   │   ├── moc_entity_deleter_widget.cpp.d +│   │   │   ├── moc_entity_finder_widget.cpp +│   │   │   ├── moc_entity_finder_widget.cpp.d +│   │   │   ├── moc_entity_updater_widget.cpp +│   │   │   ├── moc_entity_updater_widget.cpp.d +│   │   │   ├── moc_reports_widget.cpp +│   │   │   ├── moc_reports_widget.cpp.d +│   │   │   ├── moc_session_management_widget.cpp +│   │   │   ├── moc_session_management_widget.cpp.d +│   │   │   ├── moc_single_record_time_range_widget.cpp +│   │   │   ├── moc_single_record_time_range_widget.cpp.d +│   │   │   ├── moc_ticket_return_widget.cpp +│   │   │   ├── moc_ticket_return_widget.cpp.d +│   │   │   ├── moc_ticket_sales_report_widget.cpp +│   │   │   ├── moc_ticket_sales_report_widget.cpp.d +│   │   │   ├── moc_ticket_sale_widget.cpp +│   │   │   └── moc_ticket_sale_widget.cpp.d +│   │   ├── RIZZCN5Q4D +│   │   │   ├── moc_model_manager.cpp +│   │   │   ├── moc_model_manager.cpp.d +│   │   │   ├── moc_repository_manager.cpp +│   │   │   ├── moc_repository_manager.cpp.d +│   │   │   ├── moc_schema_metadata.cpp +│   │   │   └── moc_schema_metadata.cpp.d +│   │   ├── timestamp +│   │   ├── XTPST4PFOC +│   │   │   ├── moc_base_sql_table_model.cpp +│   │   │   ├── moc_base_sql_table_model.cpp.d +│   │   │   ├── moc_genres_model.cpp +│   │   │   ├── moc_genres_model.cpp.d +│   │   │   ├── moc_halls_model.cpp +│   │   │   ├── moc_halls_model.cpp.d +│   │   │   ├── moc_movies_model.cpp +│   │   │   ├── moc_movies_model.cpp.d +│   │   │   ├── moc_refunds_model.cpp +│   │   │   ├── moc_refunds_model.cpp.d +│   │   │   ├── moc_sessions_model.cpp +│   │   │   ├── moc_sessions_model.cpp.d +│   │   │   ├── moc_tickets_model.cpp +│   │   │   └── moc_tickets_model.cpp.d +│   │   ├── YJ2CNJDW36 +│   │   │   ├── moc_date_time_delegate.cpp +│   │   │   └── moc_date_time_delegate.cpp.d +│   │   └── ZB24L4LU7T +│   │   ├── moc_auth_dialog.cpp +│   │   ├── moc_auth_dialog.cpp.d +│   │   ├── moc_error_dialog.cpp +│   │   ├── moc_error_dialog.cpp.d +│   │   ├── moc_search_dialog.cpp +│   │   └── moc_search_dialog.cpp.d +│   ├── CMakeCache.txt +│   ├── CMakeFiles +│   │   ├── 3.30.3 +│   │   │   ├── CMakeCXXCompiler.cmake +│   │   │   ├── CMakeDetermineCompilerABI_CXX.bin +│   │   │   ├── CMakeSystem.cmake +│   │   │   └── CompilerIdCXX +│   │   │   ├── a.out +│   │   │   ├── CMakeCXXCompilerId.cpp +│   │   │   └── tmp +│   │   ├── Cinema_autogen.dir +│   │   │   ├── AutogenInfo.json +│   │   │   ├── AutogenUsed.txt +│   │   │   ├── AutoRcc_resources_EWIEGA46WW_Info.json +│   │   │   ├── AutoRcc_resources_EWIEGA46WW_Lock.lock +│   │   │   ├── AutoRcc_resources_EWIEGA46WW_Used.txt +│   │   │   └── ParseCache.txt +│   │   ├── Cinema.dir +│   │   │   ├── Cinema_autogen +│   │   │   │   ├── EWIEGA46WW +│   │   │   │   │   └── qrc_resources.cpp.o +│   │   │   │   └── mocs_compilation.cpp.o +│   │   │   ├── core +│   │   │   │   ├── controllers +│   │   │   │   │   ├── application_connector.cpp.o +│   │   │   │   │   └── application_controller.cpp.o +│   │   │   │   ├── db +│   │   │   │   │   ├── database_manager.cpp.o +│   │   │   │   │   └── execute_sql_file.cpp.o +│   │   │   │   ├── repositories +│   │   │   │   │   └── repository_result.cpp.o +│   │   │   │   ├── services +│   │   │   │   │   ├── base_generator.cpp.o +│   │   │   │   │   ├── date_time_generator.cpp.o +│   │   │   │   │   ├── model_manager.cpp.o +│   │   │   │   │   ├── refund_generator.cpp.o +│   │   │   │   │   ├── relation_id_config.cpp.o +│   │   │   │   │   ├── repository_manager.cpp.o +│   │   │   │   │   ├── schema_metadata.cpp.o +│   │   │   │   │   ├── session_generator.cpp.o +│   │   │   │   │   └── ticket_generator.cpp.o +│   │   │   │   └── utils +│   │   │   │   ├── day_manager.cpp.o +│   │   │   │   └── reservation_manager.cpp.o +│   │   │   ├── data +│   │   │   │   └── sql +│   │   │   │   ├── base_sql_table_repository.cpp.o +│   │   │   │   ├── genres_repository.cpp.o +│   │   │   │   ├── halls_repository.cpp.o +│   │   │   │   ├── movies_repository.cpp.o +│   │   │   │   ├── refunds_repository.cpp.o +│   │   │   │   ├── roles_repository.cpp.o +│   │   │   │   ├── sessions_repository.cpp.o +│   │   │   │   ├── sessions_statistics_repository.cpp.o +│   │   │   │   ├── table_info_sqlite.cpp.o +│   │   │   │   ├── tickets_repository.cpp.o +│   │   │   │   └── users_repository.cpp.o +│   │   │   ├── src +│   │   │   │   └── main.cpp.o +│   │   │   └── ui +│   │   │   ├── delegates +│   │   │   │   └── date_time_delegate.cpp.o +│   │   │   ├── dialogs +│   │   │   │   ├── auth_dialog.cpp.o +│   │   │   │   ├── error_dialog.cpp.o +│   │   │   │   └── search_dialog.cpp.o +│   │   │   ├── main_window +│   │   │   │   └── main_window.cpp.o +│   │   │   ├── models +│   │   │   │   ├── base_sql_table_model.cpp.o +│   │   │   │   ├── genres_model.cpp.o +│   │   │   │   ├── halls_model.cpp.o +│   │   │   │   ├── movies_model.cpp.o +│   │   │   │   ├── multi_column_filter_proxy_model.cpp.o +│   │   │   │   ├── refunds_model.cpp.o +│   │   │   │   ├── sessions_model.cpp.o +│   │   │   │   └── tickets_model.cpp.o +│   │   │   └── widgets +│   │   │   ├── directories_management_widget.cpp.o +│   │   │   ├── entity_deleter_widget.cpp.o +│   │   │   ├── entity_finder_widget.cpp.o +│   │   │   ├── entity_updater_widget.cpp.o +│   │   │   ├── reports_widget.cpp.o +│   │   │   ├── session_management_widget.cpp.o +│   │   │   ├── single_record_time_range_widget.cpp.o +│   │   │   ├── ticket_return_widget.cpp.o +│   │   │   ├── ticket_sales_report_widget.cpp.o +│   │   │   └── ticket_sale_widget.cpp.o +│   │   ├── clean_additional.cmake +│   │   ├── cmake.check_cache +│   │   ├── CMakeConfigureLog.yaml +│   │   ├── d +│   │   ├── pkgRedirects +│   │   ├── rules.ninja +│   │   └── TargetDirectories.txt +│   ├── cmake_install.cmake +│   ├── compile_commands.json +│   ├── config.h +│   ├── CTestTestfile.cmake +│   ├── database.db-journal +│   ├── tests_class +│   │   ├── CMakeFiles +│   │   │   ├── day_manager_test_autogen.dir +│   │   │   │   ├── AutogenInfo.json +│   │   │   │   ├── AutogenUsed.txt +│   │   │   │   └── ParseCache.txt +│   │   │   ├── day_manager_test.dir +│   │   │   │   ├── __ +│   │   │   │   │   └── core +│   │   │   │   │   └── utils +│   │   │   │   │   ├── day_manager.cpp.o +│   │   │   │   │   └── reservation_manager.cpp.o +│   │   │   │   ├── day_manager_test_autogen +│   │   │   │   │   └── mocs_compilation.cpp.o +│   │   │   │   └── day_manager_test.cpp.o +│   │   │   ├── reservation_manager_test_autogen.dir +│   │   │   │   ├── AutogenInfo.json +│   │   │   │   ├── AutogenUsed.txt +│   │   │   │   └── ParseCache.txt +│   │   │   └── reservation_manager_test.dir +│   │   │   ├── __ +│   │   │   │   └── core +│   │   │   │   └── utils +│   │   │   │   ├── day_manager.cpp.o +│   │   │   │   └── reservation_manager.cpp.o +│   │   │   ├── reservation_manager_test_autogen +│   │   │   │   └── mocs_compilation.cpp.o +│   │   │   └── reservation_manager_test.cpp.o +│   │   ├── cmake_install.cmake +│   │   ├── CTestTestfile.cmake +│   │   ├── day_manager_test +│   │   ├── day_manager_test_autogen +│   │   │   ├── deps +│   │   │   ├── include +│   │   │   │   ├── day_manager_test.moc +│   │   │   │   └── day_manager_test.moc.d +│   │   │   ├── moc_predefs.h +│   │   │   ├── mocs_compilation.cpp +│   │   │   └── timestamp +│   │   ├── reservation_manager_test +│   │   └── reservation_manager_test_autogen +│   │   ├── deps +│   │   ├── include +│   │   │   ├── reservation_manager_test.moc +│   │   │   └── reservation_manager_test.moc.d +│   │   ├── moc_predefs.h +│   │   ├── mocs_compilation.cpp +│   │   └── timestamp +│   ├── tests_schema +│   │   ├── CMakeFiles +│   │   │   ├── tests_schema_autogen.dir +│   │   │   │   ├── AutogenInfo.json +│   │   │   │   ├── AutogenUsed.txt +│   │   │   │   └── ParseCache.txt +│   │   │   └── tests_schema.dir +│   │   │   ├── tests +│   │   │   │   ├── main_test.cpp.o +│   │   │   │   ├── sqlite_database_crud_test.cpp.o +│   │   │   │   ├── sqlite_database_foreign_key_test.cpp.o +│   │   │   │   └── sqlite_database_trigger_test.cpp.o +│   │   │   ├── tests_schema_autogen +│   │   │   │   └── mocs_compilation.cpp.o +│   │   │   └── tests_sources +│   │   │   ├── file_reader.cpp.o +│   │   │   ├── sqlite_database.cpp.o +│   │   │   ├── sqlite_file_executor.cpp.o +│   │   │   └── sqlite_statement.cpp.o +│   │   ├── cmake_install.cmake +│   │   ├── core +│   │   │   └── sql +│   │   │   ├── cinema_db_create_indexes.sql +│   │   │   ├── cinema_db_create_tables.sql +│   │   │   ├── cinema_db_create_triggers.sql +│   │   │   ├── cinema_db_create_views.sql +│   │   │   ├── cinema_db_foreign_key_off.sql +│   │   │   ├── cinema_db_foreign_key_on.sql +│   │   │   ├── cinema_db_genre_insert.sql +│   │   │   ├── cinema_db_hall_insert.sql +│   │   │   ├── cinema_db_movie_insert.sql +│   │   │   ├── cinema_db_role_insert.sql +│   │   │   └── cinema_db_user_insert.sql +│   │   ├── CTestTestfile.cmake +│   │   ├── tests_schema +│   │   ├── tests_schema[1]_include.cmake +│   │   ├── tests_schema[1]_tests.cmake +│   │   └── tests_schema_autogen +│   │   ├── deps +│   │   ├── include +│   │   ├── moc_predefs.h +│   │   ├── mocs_compilation.cpp +│   │   └── timestamp +│   ├── translations +│   │   └── app_ru.qm +│   ├── ui_auth_dialog.h +│   ├── ui_directories_management_widget.h +│   ├── ui_entity_deleter_widget.h +│   ├── ui_entity_updater_widget.h +│   ├── ui_main_window.h +│   ├── ui_reports_widget.h +│   ├── ui_search_dialog.h +│   ├── ui_session_management_widget.h +│   ├── ui_single_record_time_range_widget.h +│   ├── ui_ticket_return_widget.h +│   ├── ui_ticket_sales_report_widget.h +│   └── ui_ticket_sale_widget.h +├── cmake +│   ├── dependencies +│   │   └── FindPackages.cmake +│   ├── generation +│   │   ├── ClangdSetup.cmake +│   │   ├── ConfigureFiles.cmake +│   │   ├── CountLines.cmake +│   │   ├── ProjectTree.cmake +│   │   └── UiFiles.cmake +│   ├── helpers +│   │   └── PrintMessages.cmake +│   ├── paths +│   │   ├── CombineFileGroups.cmake +│   │   ├── GroupFilesByLocation.cmake +│   │   └── PathsAndIncludes.cmake +│   └── setup +│   ├── Config.cmake +│   ├── ProjectVariables.cmake +│   ├── TargetSetup.cmake +│   └── Translations.cmake +├── CMakeLists.txt +├── compile_commands.json +├── config +│   ├── config.h.in +│   └── resources.qrc.in +├── core +│   ├── controllers +│   │   ├── application_connector.cpp +│   │   ├── application_connector.h +│   │   ├── application_controller.cpp +│   │   └── application_controller.h +│   ├── db +│   │   ├── database_manager.cpp +│   │   ├── database_manager.h +│   │   ├── execute_sql_file.cpp +│   │   ├── execute_sql_file.h +│   │   └── table_info_interface.h +│   ├── dto +│   │   ├── genre_dto.h +│   │   ├── hall_dto.h +│   │   ├── movie_dto.h +│   │   ├── refund_dto.h +│   │   ├── role_dto.h +│   │   ├── session_dto.h +│   │   ├── session_statistics_dto.h +│   │   ├── ticket_dto.h +│   │   └── user_dto.h +│   ├── repositories +│   │   ├── genres_repository_interface.h +│   │   ├── halls_repository_interface.h +│   │   ├── movies_repository_interface.h +│   │   ├── refunds_repository_interface.h +│   │   ├── repository_interface.h +│   │   ├── repository_result.cpp +│   │   ├── repository_result.h +│   │   ├── roles_repository_interface.h +│   │   ├── sessions_repository_interface.h +│   │   ├── sessions_statistics_repository_interface.h +│   │   ├── tickets_repository_interface.h +│   │   └── users_repository_interface.h +│   ├── requests +│   │   ├── create_genre_request.h +│   │   ├── create_hall_request.h +│   │   ├── create_movie_request.h +│   │   ├── create_refund_request.h +│   │   ├── create_role_request.h +│   │   ├── create_session_request.h +│   │   ├── create_ticket_request.h +│   │   ├── create_user_request.h +│   │   ├── update_genre_request.h +│   │   ├── update_hall_request.h +│   │   ├── update_movie_request.h +│   │   ├── update_refund_request.h +│   │   ├── update_role_request.h +│   │   ├── update_session_request.h +│   │   ├── update_ticket_request.h +│   │   └── update_user_request.h +│   ├── services +│   │   ├── base_generator.cpp +│   │   ├── base_generator.h +│   │   ├── date_time_generator.cpp +│   │   ├── date_time_generator.h +│   │   ├── generator_interface.h +│   │   ├── model_manager.cpp +│   │   ├── model_manager.h +│   │   ├── range_limiter.h +│   │   ├── refund_generator.cpp +│   │   ├── refund_generator.h +│   │   ├── relation_id_config.cpp +│   │   ├── relation_id_config.h +│   │   ├── repository_manager.cpp +│   │   ├── repository_manager.h +│   │   ├── schema_metadata.cpp +│   │   ├── schema_metadata.h +│   │   ├── session_generator.cpp +│   │   ├── session_generator.h +│   │   ├── ticket_generator.cpp +│   │   └── ticket_generator.h +│   ├── sql +│   │   ├── cinema_db_create_indexes.sql +│   │   ├── cinema_db_create_tables.sql +│   │   ├── cinema_db_create_triggers.sql +│   │   ├── cinema_db_create_views.sql +│   │   ├── cinema_db_foreign_key_off.sql +│   │   ├── cinema_db_foreign_key_on.sql +│   │   ├── cinema_db_genre_insert.sql +│   │   ├── cinema_db_hall_insert.sql +│   │   ├── cinema_db_movie_insert.sql +│   │   ├── cinema_db_role_insert.sql +│   │   └── cinema_db_user_insert.sql +│   └── utils +│   ├── day_manager.cpp +│   ├── day_manager.h +│   ├── reservation_manager.cpp +│   └── reservation_manager.h +├── cppcheck_report.txt +├── data +│   └── sql +│   ├── base_sql_table_repository.cpp +│   ├── base_sql_table_repository.h +│   ├── data_repository_signals.h +│   ├── genres_repository.cpp +│   ├── genres_repository.h +│   ├── halls_repository.cpp +│   ├── halls_repository.h +│   ├── movies_repository.cpp +│   ├── movies_repository.h +│   ├── refunds_repository.cpp +│   ├── refunds_repository.h +│   ├── roles_repository.cpp +│   ├── roles_repository.h +│   ├── sessions_repository.cpp +│   ├── sessions_repository.h +│   ├── sessions_statistics_repository.cpp +│   ├── sessions_statistics_repository.h +│   ├── table_info_sqlite.cpp +│   ├── table_info_sqlite.h +│   ├── tickets_repository.cpp +│   ├── tickets_repository.h +│   ├── users_repository.cpp +│   └── users_repository.h +├── database.db +├── deprecated +│   └── deprecated.zip +├── resources.qrc +├── src +│   └── main.cpp +├── tests_class +│   ├── CMakeLists.txt +│   ├── day_manager_test.cpp +│   └── reservation_manager_test.cpp +├── tests_schema +│   ├── CMakeLists.txt +│   ├── tests +│   │   ├── main_test.cpp +│   │   ├── sqlite_database_crud_test.cpp +│   │   ├── sqlite_database_foreign_key_test.cpp +│   │   └── sqlite_database_trigger_test.cpp +│   └── tests_sources +│   ├── database_interface.h +│   ├── file_reader.cpp +│   ├── file_reader.h +│   ├── file_reader_interface.h +│   ├── sql_file_executor_interfase.h +│   ├── sqlite_database.cpp +│   ├── sqlite_database.h +│   ├── sqlite_file_executor.cpp +│   ├── sqlite_file_executor.h +│   ├── sqlite_statement.cpp +│   └── sqlite_statement.h +├── translations +│   └── app_ru.ts +└── ui + ├── delegates + │   ├── date_time_delegate.cpp + │   └── date_time_delegate.h + ├── dialogs + │   ├── auth_dialog.cpp + │   ├── auth_dialog.h + │   ├── auth_dialog.ui + │   ├── error_dialog.cpp + │   ├── error_dialog.h + │   ├── search_dialog.cpp + │   ├── search_dialog.h + │   └── search_dialog.ui + ├── main_window + │   ├── main_window.cpp + │   ├── main_window.h + │   └── main_window.ui + ├── models + │   ├── base_sql_table_model.cpp + │   ├── base_sql_table_model.h + │   ├── genres_model.cpp + │   ├── genres_model.h + │   ├── halls_model.cpp + │   ├── halls_model.h + │   ├── movies_model.cpp + │   ├── movies_model.h + │   ├── multi_column_filter_proxy_model.cpp + │   ├── multi_column_filter_proxy_model.h + │   ├── refunds_model.cpp + │   ├── refunds_model.h + │   ├── sessions_model.cpp + │   ├── sessions_model.h + │   ├── tickets_model.cpp + │   └── tickets_model.h + └── widgets + ├── directories_management_widget.cpp + ├── directories_management_widget.h + ├── directories_management_widget.ui + ├── entity_deleter_widget.cpp + ├── entity_deleter_widget.h + ├── entity_deleter_widget.ui + ├── entity_finder_widget.cpp + ├── entity_finder_widget.h + ├── entity_finder_widget.ui + ├── entity_updater_widget.cpp + ├── entity_updater_widget.h + ├── entity_updater_widget.ui + ├── reports_widget.cpp + ├── reports_widget.h + ├── reports_widget.ui + ├── session_management_widget.cpp + ├── session_management_widget.h + ├── session_management_widget.ui + ├── single_record_time_range_widget.cpp + ├── single_record_time_range_widget.h + ├── single_record_time_range_widget.ui + ├── ticket_return_widget.cpp + ├── ticket_return_widget.h + ├── ticket_return_widget.ui + ├── ticket_sales_report_widget.cpp + ├── ticket_sales_report_widget.h + ├── ticket_sales_report_widget.ui + ├── ticket_sale_widget.cpp + ├── ticket_sale_widget.h + └── ticket_sale_widget.ui + +98 directories, 416 files diff --git a/cmake/dependencies/FindPackages.cmake b/cmake/dependencies/FindPackages.cmake new file mode 100644 index 0000000..102281c --- /dev/null +++ b/cmake/dependencies/FindPackages.cmake @@ -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) diff --git a/cmake/generation/ClangdSetup.cmake b/cmake/generation/ClangdSetup.cmake new file mode 100644 index 0000000..c0b36c7 --- /dev/null +++ b/cmake/generation/ClangdSetup.cmake @@ -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() diff --git a/cmake/generation/ConfigureFiles.cmake b/cmake/generation/ConfigureFiles.cmake new file mode 100644 index 0000000..ceee269 --- /dev/null +++ b/cmake/generation/ConfigureFiles.cmake @@ -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 +) + diff --git a/cmake/generation/CountLines.cmake b/cmake/generation/CountLines.cmake new file mode 100644 index 0000000..a474e1c --- /dev/null +++ b/cmake/generation/CountLines.cmake @@ -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}") + diff --git a/cmake/generation/ProjectTree.cmake b/cmake/generation/ProjectTree.cmake new file mode 100644 index 0000000..de55bab --- /dev/null +++ b/cmake/generation/ProjectTree.cmake @@ -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") diff --git a/cmake/generation/UiFiles.cmake b/cmake/generation/UiFiles.cmake new file mode 100644 index 0000000..facbe99 --- /dev/null +++ b/cmake/generation/UiFiles.cmake @@ -0,0 +1,2 @@ +# Generate UI files +qt_wrap_ui(UI_HEADERS ${UI_FILES}) diff --git a/cmake/helpers/PrintMessages.cmake b/cmake/helpers/PrintMessages.cmake new file mode 100644 index 0000000..f47b45a --- /dev/null +++ b/cmake/helpers/PrintMessages.cmake @@ -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() diff --git a/cmake/paths/CombineFileGroups.cmake b/cmake/paths/CombineFileGroups.cmake new file mode 100644 index 0000000..83aa22a --- /dev/null +++ b/cmake/paths/CombineFileGroups.cmake @@ -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}) + diff --git a/cmake/paths/GroupFilesByLocation.cmake b/cmake/paths/GroupFilesByLocation.cmake new file mode 100644 index 0000000..3fca3b5 --- /dev/null +++ b/cmake/paths/GroupFilesByLocation.cmake @@ -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 +) diff --git a/cmake/paths/PathsAndIncludes.cmake b/cmake/paths/PathsAndIncludes.cmake new file mode 100644 index 0000000..b53896b --- /dev/null +++ b/cmake/paths/PathsAndIncludes.cmake @@ -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} +) + diff --git a/cmake/setup/Config.cmake b/cmake/setup/Config.cmake new file mode 100644 index 0000000..5ed8f4f --- /dev/null +++ b/cmake/setup/Config.cmake @@ -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) + diff --git a/cmake/setup/ProjectVariables.cmake b/cmake/setup/ProjectVariables.cmake new file mode 100644 index 0000000..9537fe6 --- /dev/null +++ b/cmake/setup/ProjectVariables.cmake @@ -0,0 +1,6 @@ +# Set the database name +set(DATABASE_NAME "database.db") + +# Set the database driver +set(DATABASE_DRIVER "QSQLITE") + diff --git a/cmake/setup/TargetSetup.cmake b/cmake/setup/TargetSetup.cmake new file mode 100644 index 0000000..f208386 --- /dev/null +++ b/cmake/setup/TargetSetup.cmake @@ -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 +) diff --git a/cmake/setup/Translations.cmake b/cmake/setup/Translations.cmake new file mode 100644 index 0000000..304500f --- /dev/null +++ b/cmake/setup/Translations.cmake @@ -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}) diff --git a/compile_commands.json b/compile_commands.json new file mode 100644 index 0000000..7d8eb37 --- /dev/null +++ b/compile_commands.json @@ -0,0 +1,422 @@ +[ +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CHARTS_LIB -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_OPENGLWIDGETS_LIB -DQT_OPENGL_LIB -DQT_SQL_LIB -DQT_WIDGETS_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCharts -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -isystem /home/user/Qt/6.8.1/gcc_64/include/QtGui -isystem /home/user/Qt/6.8.1/gcc_64/include/QtWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGL -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGLWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtSql -std=c++20 -fPIC -o CMakeFiles/Cinema.dir/Cinema_autogen/mocs_compilation.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/mocs_compilation.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/mocs_compilation.cpp", + "output": "CMakeFiles/Cinema.dir/Cinema_autogen/mocs_compilation.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CHARTS_LIB -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_OPENGLWIDGETS_LIB -DQT_OPENGL_LIB -DQT_SQL_LIB -DQT_WIDGETS_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCharts -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -isystem /home/user/Qt/6.8.1/gcc_64/include/QtGui -isystem /home/user/Qt/6.8.1/gcc_64/include/QtWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGL -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGLWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtSql -std=c++20 -fPIC -o CMakeFiles/Cinema.dir/data/sql/base_sql_table_repository.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql/base_sql_table_repository.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql/base_sql_table_repository.cpp", + "output": "CMakeFiles/Cinema.dir/data/sql/base_sql_table_repository.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CHARTS_LIB -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_OPENGLWIDGETS_LIB -DQT_OPENGL_LIB -DQT_SQL_LIB -DQT_WIDGETS_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCharts -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -isystem /home/user/Qt/6.8.1/gcc_64/include/QtGui -isystem /home/user/Qt/6.8.1/gcc_64/include/QtWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGL -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGLWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtSql -std=c++20 -fPIC -o CMakeFiles/Cinema.dir/data/sql/table_info_sqlite.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql/table_info_sqlite.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql/table_info_sqlite.cpp", + "output": "CMakeFiles/Cinema.dir/data/sql/table_info_sqlite.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CHARTS_LIB -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_OPENGLWIDGETS_LIB -DQT_OPENGL_LIB -DQT_SQL_LIB -DQT_WIDGETS_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCharts -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -isystem /home/user/Qt/6.8.1/gcc_64/include/QtGui -isystem /home/user/Qt/6.8.1/gcc_64/include/QtWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGL -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGLWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtSql -std=c++20 -fPIC -o CMakeFiles/Cinema.dir/core/controllers/application_controller.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers/application_controller.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers/application_controller.cpp", + "output": "CMakeFiles/Cinema.dir/core/controllers/application_controller.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CHARTS_LIB -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_OPENGLWIDGETS_LIB -DQT_OPENGL_LIB -DQT_SQL_LIB -DQT_WIDGETS_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCharts -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -isystem /home/user/Qt/6.8.1/gcc_64/include/QtGui -isystem /home/user/Qt/6.8.1/gcc_64/include/QtWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGL -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGLWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtSql -std=c++20 -fPIC -o CMakeFiles/Cinema.dir/core/controllers/application_connector.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers/application_connector.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers/application_connector.cpp", + "output": "CMakeFiles/Cinema.dir/core/controllers/application_connector.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CHARTS_LIB -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_OPENGLWIDGETS_LIB -DQT_OPENGL_LIB -DQT_SQL_LIB -DQT_WIDGETS_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCharts -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -isystem /home/user/Qt/6.8.1/gcc_64/include/QtGui -isystem /home/user/Qt/6.8.1/gcc_64/include/QtWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGL -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGLWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtSql -std=c++20 -fPIC -o CMakeFiles/Cinema.dir/core/db/database_manager.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db/database_manager.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db/database_manager.cpp", + "output": "CMakeFiles/Cinema.dir/core/db/database_manager.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CHARTS_LIB -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_OPENGLWIDGETS_LIB -DQT_OPENGL_LIB -DQT_SQL_LIB -DQT_WIDGETS_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCharts -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -isystem /home/user/Qt/6.8.1/gcc_64/include/QtGui -isystem /home/user/Qt/6.8.1/gcc_64/include/QtWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGL -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGLWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtSql -std=c++20 -fPIC -o CMakeFiles/Cinema.dir/core/db/execute_sql_file.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db/execute_sql_file.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db/execute_sql_file.cpp", + "output": "CMakeFiles/Cinema.dir/core/db/execute_sql_file.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CHARTS_LIB -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_OPENGLWIDGETS_LIB -DQT_OPENGL_LIB -DQT_SQL_LIB -DQT_WIDGETS_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCharts -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -isystem /home/user/Qt/6.8.1/gcc_64/include/QtGui -isystem /home/user/Qt/6.8.1/gcc_64/include/QtWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGL -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGLWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtSql -std=c++20 -fPIC -o CMakeFiles/Cinema.dir/ui/delegates/date_time_delegate.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates/date_time_delegate.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates/date_time_delegate.cpp", + "output": "CMakeFiles/Cinema.dir/ui/delegates/date_time_delegate.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CHARTS_LIB -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_OPENGLWIDGETS_LIB -DQT_OPENGL_LIB -DQT_SQL_LIB -DQT_WIDGETS_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCharts -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -isystem /home/user/Qt/6.8.1/gcc_64/include/QtGui -isystem /home/user/Qt/6.8.1/gcc_64/include/QtWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGL -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGLWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtSql -std=c++20 -fPIC -o CMakeFiles/Cinema.dir/ui/dialogs/auth_dialog.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs/auth_dialog.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs/auth_dialog.cpp", + "output": "CMakeFiles/Cinema.dir/ui/dialogs/auth_dialog.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CHARTS_LIB -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_OPENGLWIDGETS_LIB -DQT_OPENGL_LIB -DQT_SQL_LIB -DQT_WIDGETS_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCharts -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -isystem /home/user/Qt/6.8.1/gcc_64/include/QtGui -isystem /home/user/Qt/6.8.1/gcc_64/include/QtWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGL -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGLWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtSql -std=c++20 -fPIC -o CMakeFiles/Cinema.dir/ui/dialogs/error_dialog.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs/error_dialog.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs/error_dialog.cpp", + "output": "CMakeFiles/Cinema.dir/ui/dialogs/error_dialog.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CHARTS_LIB -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_OPENGLWIDGETS_LIB -DQT_OPENGL_LIB -DQT_SQL_LIB -DQT_WIDGETS_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCharts -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -isystem /home/user/Qt/6.8.1/gcc_64/include/QtGui -isystem /home/user/Qt/6.8.1/gcc_64/include/QtWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGL -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGLWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtSql -std=c++20 -fPIC -o CMakeFiles/Cinema.dir/ui/dialogs/search_dialog.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs/search_dialog.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs/search_dialog.cpp", + "output": "CMakeFiles/Cinema.dir/ui/dialogs/search_dialog.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CHARTS_LIB -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_OPENGLWIDGETS_LIB -DQT_OPENGL_LIB -DQT_SQL_LIB -DQT_WIDGETS_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCharts -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -isystem /home/user/Qt/6.8.1/gcc_64/include/QtGui -isystem /home/user/Qt/6.8.1/gcc_64/include/QtWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGL -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGLWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtSql -std=c++20 -fPIC -o CMakeFiles/Cinema.dir/ui/main_window/main_window.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window/main_window.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window/main_window.cpp", + "output": "CMakeFiles/Cinema.dir/ui/main_window/main_window.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CHARTS_LIB -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_OPENGLWIDGETS_LIB -DQT_OPENGL_LIB -DQT_SQL_LIB -DQT_WIDGETS_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCharts -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -isystem /home/user/Qt/6.8.1/gcc_64/include/QtGui -isystem /home/user/Qt/6.8.1/gcc_64/include/QtWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGL -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGLWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtSql -std=c++20 -fPIC -o CMakeFiles/Cinema.dir/ui/models/base_sql_table_model.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models/base_sql_table_model.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models/base_sql_table_model.cpp", + "output": "CMakeFiles/Cinema.dir/ui/models/base_sql_table_model.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CHARTS_LIB -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_OPENGLWIDGETS_LIB -DQT_OPENGL_LIB -DQT_SQL_LIB -DQT_WIDGETS_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCharts -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -isystem /home/user/Qt/6.8.1/gcc_64/include/QtGui -isystem /home/user/Qt/6.8.1/gcc_64/include/QtWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGL -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGLWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtSql -std=c++20 -fPIC -o CMakeFiles/Cinema.dir/ui/models/genres_model.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models/genres_model.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models/genres_model.cpp", + "output": "CMakeFiles/Cinema.dir/ui/models/genres_model.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CHARTS_LIB -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_OPENGLWIDGETS_LIB -DQT_OPENGL_LIB -DQT_SQL_LIB -DQT_WIDGETS_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCharts -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -isystem /home/user/Qt/6.8.1/gcc_64/include/QtGui -isystem /home/user/Qt/6.8.1/gcc_64/include/QtWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGL -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGLWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtSql -std=c++20 -fPIC -o CMakeFiles/Cinema.dir/ui/models/halls_model.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models/halls_model.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models/halls_model.cpp", + "output": "CMakeFiles/Cinema.dir/ui/models/halls_model.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CHARTS_LIB -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_OPENGLWIDGETS_LIB -DQT_OPENGL_LIB -DQT_SQL_LIB -DQT_WIDGETS_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCharts -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -isystem /home/user/Qt/6.8.1/gcc_64/include/QtGui -isystem /home/user/Qt/6.8.1/gcc_64/include/QtWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGL -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGLWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtSql -std=c++20 -fPIC -o CMakeFiles/Cinema.dir/ui/models/movies_model.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models/movies_model.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models/movies_model.cpp", + "output": "CMakeFiles/Cinema.dir/ui/models/movies_model.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CHARTS_LIB -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_OPENGLWIDGETS_LIB -DQT_OPENGL_LIB -DQT_SQL_LIB -DQT_WIDGETS_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCharts -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -isystem /home/user/Qt/6.8.1/gcc_64/include/QtGui -isystem /home/user/Qt/6.8.1/gcc_64/include/QtWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGL -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGLWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtSql -std=c++20 -fPIC -o CMakeFiles/Cinema.dir/ui/models/multi_column_filter_proxy_model.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models/multi_column_filter_proxy_model.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models/multi_column_filter_proxy_model.cpp", + "output": "CMakeFiles/Cinema.dir/ui/models/multi_column_filter_proxy_model.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CHARTS_LIB -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_OPENGLWIDGETS_LIB -DQT_OPENGL_LIB -DQT_SQL_LIB -DQT_WIDGETS_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCharts -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -isystem /home/user/Qt/6.8.1/gcc_64/include/QtGui -isystem /home/user/Qt/6.8.1/gcc_64/include/QtWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGL -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGLWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtSql -std=c++20 -fPIC -o CMakeFiles/Cinema.dir/ui/models/refunds_model.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models/refunds_model.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models/refunds_model.cpp", + "output": "CMakeFiles/Cinema.dir/ui/models/refunds_model.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CHARTS_LIB -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_OPENGLWIDGETS_LIB -DQT_OPENGL_LIB -DQT_SQL_LIB -DQT_WIDGETS_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCharts -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -isystem /home/user/Qt/6.8.1/gcc_64/include/QtGui -isystem /home/user/Qt/6.8.1/gcc_64/include/QtWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGL -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGLWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtSql -std=c++20 -fPIC -o CMakeFiles/Cinema.dir/ui/models/sessions_model.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models/sessions_model.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models/sessions_model.cpp", + "output": "CMakeFiles/Cinema.dir/ui/models/sessions_model.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CHARTS_LIB -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_OPENGLWIDGETS_LIB -DQT_OPENGL_LIB -DQT_SQL_LIB -DQT_WIDGETS_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCharts -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -isystem /home/user/Qt/6.8.1/gcc_64/include/QtGui -isystem /home/user/Qt/6.8.1/gcc_64/include/QtWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGL -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGLWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtSql -std=c++20 -fPIC -o CMakeFiles/Cinema.dir/ui/models/tickets_model.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models/tickets_model.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models/tickets_model.cpp", + "output": "CMakeFiles/Cinema.dir/ui/models/tickets_model.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CHARTS_LIB -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_OPENGLWIDGETS_LIB -DQT_OPENGL_LIB -DQT_SQL_LIB -DQT_WIDGETS_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCharts -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -isystem /home/user/Qt/6.8.1/gcc_64/include/QtGui -isystem /home/user/Qt/6.8.1/gcc_64/include/QtWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGL -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGLWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtSql -std=c++20 -fPIC -o CMakeFiles/Cinema.dir/core/repositories/repository_result.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories/repository_result.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories/repository_result.cpp", + "output": "CMakeFiles/Cinema.dir/core/repositories/repository_result.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CHARTS_LIB -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_OPENGLWIDGETS_LIB -DQT_OPENGL_LIB -DQT_SQL_LIB -DQT_WIDGETS_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCharts -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -isystem /home/user/Qt/6.8.1/gcc_64/include/QtGui -isystem /home/user/Qt/6.8.1/gcc_64/include/QtWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGL -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGLWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtSql -std=c++20 -fPIC -o CMakeFiles/Cinema.dir/core/services/base_generator.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services/base_generator.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services/base_generator.cpp", + "output": "CMakeFiles/Cinema.dir/core/services/base_generator.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CHARTS_LIB -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_OPENGLWIDGETS_LIB -DQT_OPENGL_LIB -DQT_SQL_LIB -DQT_WIDGETS_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCharts -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -isystem /home/user/Qt/6.8.1/gcc_64/include/QtGui -isystem /home/user/Qt/6.8.1/gcc_64/include/QtWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGL -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGLWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtSql -std=c++20 -fPIC -o CMakeFiles/Cinema.dir/core/services/date_time_generator.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services/date_time_generator.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services/date_time_generator.cpp", + "output": "CMakeFiles/Cinema.dir/core/services/date_time_generator.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CHARTS_LIB -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_OPENGLWIDGETS_LIB -DQT_OPENGL_LIB -DQT_SQL_LIB -DQT_WIDGETS_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCharts -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -isystem /home/user/Qt/6.8.1/gcc_64/include/QtGui -isystem /home/user/Qt/6.8.1/gcc_64/include/QtWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGL -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGLWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtSql -std=c++20 -fPIC -o CMakeFiles/Cinema.dir/core/services/model_manager.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services/model_manager.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services/model_manager.cpp", + "output": "CMakeFiles/Cinema.dir/core/services/model_manager.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CHARTS_LIB -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_OPENGLWIDGETS_LIB -DQT_OPENGL_LIB -DQT_SQL_LIB -DQT_WIDGETS_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCharts -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -isystem /home/user/Qt/6.8.1/gcc_64/include/QtGui -isystem /home/user/Qt/6.8.1/gcc_64/include/QtWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGL -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGLWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtSql -std=c++20 -fPIC -o CMakeFiles/Cinema.dir/core/services/refund_generator.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services/refund_generator.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services/refund_generator.cpp", + "output": "CMakeFiles/Cinema.dir/core/services/refund_generator.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CHARTS_LIB -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_OPENGLWIDGETS_LIB -DQT_OPENGL_LIB -DQT_SQL_LIB -DQT_WIDGETS_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCharts -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -isystem /home/user/Qt/6.8.1/gcc_64/include/QtGui -isystem /home/user/Qt/6.8.1/gcc_64/include/QtWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGL -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGLWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtSql -std=c++20 -fPIC -o CMakeFiles/Cinema.dir/core/services/relation_id_config.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services/relation_id_config.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services/relation_id_config.cpp", + "output": "CMakeFiles/Cinema.dir/core/services/relation_id_config.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CHARTS_LIB -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_OPENGLWIDGETS_LIB -DQT_OPENGL_LIB -DQT_SQL_LIB -DQT_WIDGETS_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCharts -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -isystem /home/user/Qt/6.8.1/gcc_64/include/QtGui -isystem /home/user/Qt/6.8.1/gcc_64/include/QtWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGL -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGLWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtSql -std=c++20 -fPIC -o CMakeFiles/Cinema.dir/core/services/repository_manager.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services/repository_manager.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services/repository_manager.cpp", + "output": "CMakeFiles/Cinema.dir/core/services/repository_manager.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CHARTS_LIB -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_OPENGLWIDGETS_LIB -DQT_OPENGL_LIB -DQT_SQL_LIB -DQT_WIDGETS_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCharts -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -isystem /home/user/Qt/6.8.1/gcc_64/include/QtGui -isystem /home/user/Qt/6.8.1/gcc_64/include/QtWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGL -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGLWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtSql -std=c++20 -fPIC -o CMakeFiles/Cinema.dir/core/services/schema_metadata.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services/schema_metadata.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services/schema_metadata.cpp", + "output": "CMakeFiles/Cinema.dir/core/services/schema_metadata.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CHARTS_LIB -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_OPENGLWIDGETS_LIB -DQT_OPENGL_LIB -DQT_SQL_LIB -DQT_WIDGETS_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCharts -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -isystem /home/user/Qt/6.8.1/gcc_64/include/QtGui -isystem /home/user/Qt/6.8.1/gcc_64/include/QtWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGL -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGLWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtSql -std=c++20 -fPIC -o CMakeFiles/Cinema.dir/core/services/session_generator.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services/session_generator.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services/session_generator.cpp", + "output": "CMakeFiles/Cinema.dir/core/services/session_generator.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CHARTS_LIB -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_OPENGLWIDGETS_LIB -DQT_OPENGL_LIB -DQT_SQL_LIB -DQT_WIDGETS_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCharts -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -isystem /home/user/Qt/6.8.1/gcc_64/include/QtGui -isystem /home/user/Qt/6.8.1/gcc_64/include/QtWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGL -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGLWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtSql -std=c++20 -fPIC -o CMakeFiles/Cinema.dir/core/services/ticket_generator.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services/ticket_generator.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services/ticket_generator.cpp", + "output": "CMakeFiles/Cinema.dir/core/services/ticket_generator.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CHARTS_LIB -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_OPENGLWIDGETS_LIB -DQT_OPENGL_LIB -DQT_SQL_LIB -DQT_WIDGETS_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCharts -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -isystem /home/user/Qt/6.8.1/gcc_64/include/QtGui -isystem /home/user/Qt/6.8.1/gcc_64/include/QtWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGL -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGLWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtSql -std=c++20 -fPIC -o CMakeFiles/Cinema.dir/data/sql/genres_repository.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql/genres_repository.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql/genres_repository.cpp", + "output": "CMakeFiles/Cinema.dir/data/sql/genres_repository.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CHARTS_LIB -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_OPENGLWIDGETS_LIB -DQT_OPENGL_LIB -DQT_SQL_LIB -DQT_WIDGETS_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCharts -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -isystem /home/user/Qt/6.8.1/gcc_64/include/QtGui -isystem /home/user/Qt/6.8.1/gcc_64/include/QtWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGL -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGLWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtSql -std=c++20 -fPIC -o CMakeFiles/Cinema.dir/data/sql/halls_repository.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql/halls_repository.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql/halls_repository.cpp", + "output": "CMakeFiles/Cinema.dir/data/sql/halls_repository.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CHARTS_LIB -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_OPENGLWIDGETS_LIB -DQT_OPENGL_LIB -DQT_SQL_LIB -DQT_WIDGETS_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCharts -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -isystem /home/user/Qt/6.8.1/gcc_64/include/QtGui -isystem /home/user/Qt/6.8.1/gcc_64/include/QtWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGL -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGLWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtSql -std=c++20 -fPIC -o CMakeFiles/Cinema.dir/data/sql/movies_repository.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql/movies_repository.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql/movies_repository.cpp", + "output": "CMakeFiles/Cinema.dir/data/sql/movies_repository.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CHARTS_LIB -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_OPENGLWIDGETS_LIB -DQT_OPENGL_LIB -DQT_SQL_LIB -DQT_WIDGETS_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCharts -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -isystem /home/user/Qt/6.8.1/gcc_64/include/QtGui -isystem /home/user/Qt/6.8.1/gcc_64/include/QtWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGL -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGLWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtSql -std=c++20 -fPIC -o CMakeFiles/Cinema.dir/data/sql/refunds_repository.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql/refunds_repository.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql/refunds_repository.cpp", + "output": "CMakeFiles/Cinema.dir/data/sql/refunds_repository.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CHARTS_LIB -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_OPENGLWIDGETS_LIB -DQT_OPENGL_LIB -DQT_SQL_LIB -DQT_WIDGETS_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCharts -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -isystem /home/user/Qt/6.8.1/gcc_64/include/QtGui -isystem /home/user/Qt/6.8.1/gcc_64/include/QtWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGL -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGLWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtSql -std=c++20 -fPIC -o CMakeFiles/Cinema.dir/data/sql/roles_repository.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql/roles_repository.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql/roles_repository.cpp", + "output": "CMakeFiles/Cinema.dir/data/sql/roles_repository.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CHARTS_LIB -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_OPENGLWIDGETS_LIB -DQT_OPENGL_LIB -DQT_SQL_LIB -DQT_WIDGETS_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCharts -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -isystem /home/user/Qt/6.8.1/gcc_64/include/QtGui -isystem /home/user/Qt/6.8.1/gcc_64/include/QtWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGL -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGLWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtSql -std=c++20 -fPIC -o CMakeFiles/Cinema.dir/data/sql/sessions_statistics_repository.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql/sessions_statistics_repository.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql/sessions_statistics_repository.cpp", + "output": "CMakeFiles/Cinema.dir/data/sql/sessions_statistics_repository.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CHARTS_LIB -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_OPENGLWIDGETS_LIB -DQT_OPENGL_LIB -DQT_SQL_LIB -DQT_WIDGETS_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCharts -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -isystem /home/user/Qt/6.8.1/gcc_64/include/QtGui -isystem /home/user/Qt/6.8.1/gcc_64/include/QtWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGL -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGLWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtSql -std=c++20 -fPIC -o CMakeFiles/Cinema.dir/data/sql/sessions_repository.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql/sessions_repository.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql/sessions_repository.cpp", + "output": "CMakeFiles/Cinema.dir/data/sql/sessions_repository.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CHARTS_LIB -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_OPENGLWIDGETS_LIB -DQT_OPENGL_LIB -DQT_SQL_LIB -DQT_WIDGETS_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCharts -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -isystem /home/user/Qt/6.8.1/gcc_64/include/QtGui -isystem /home/user/Qt/6.8.1/gcc_64/include/QtWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGL -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGLWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtSql -std=c++20 -fPIC -o CMakeFiles/Cinema.dir/data/sql/tickets_repository.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql/tickets_repository.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql/tickets_repository.cpp", + "output": "CMakeFiles/Cinema.dir/data/sql/tickets_repository.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CHARTS_LIB -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_OPENGLWIDGETS_LIB -DQT_OPENGL_LIB -DQT_SQL_LIB -DQT_WIDGETS_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCharts -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -isystem /home/user/Qt/6.8.1/gcc_64/include/QtGui -isystem /home/user/Qt/6.8.1/gcc_64/include/QtWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGL -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGLWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtSql -std=c++20 -fPIC -o CMakeFiles/Cinema.dir/data/sql/users_repository.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql/users_repository.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql/users_repository.cpp", + "output": "CMakeFiles/Cinema.dir/data/sql/users_repository.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CHARTS_LIB -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_OPENGLWIDGETS_LIB -DQT_OPENGL_LIB -DQT_SQL_LIB -DQT_WIDGETS_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCharts -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -isystem /home/user/Qt/6.8.1/gcc_64/include/QtGui -isystem /home/user/Qt/6.8.1/gcc_64/include/QtWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGL -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGLWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtSql -std=c++20 -fPIC -o CMakeFiles/Cinema.dir/src/main.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/src/main.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src/main.cpp", + "output": "CMakeFiles/Cinema.dir/src/main.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CHARTS_LIB -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_OPENGLWIDGETS_LIB -DQT_OPENGL_LIB -DQT_SQL_LIB -DQT_WIDGETS_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCharts -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -isystem /home/user/Qt/6.8.1/gcc_64/include/QtGui -isystem /home/user/Qt/6.8.1/gcc_64/include/QtWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGL -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGLWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtSql -std=c++20 -fPIC -o CMakeFiles/Cinema.dir/core/utils/day_manager.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils/day_manager.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils/day_manager.cpp", + "output": "CMakeFiles/Cinema.dir/core/utils/day_manager.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CHARTS_LIB -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_OPENGLWIDGETS_LIB -DQT_OPENGL_LIB -DQT_SQL_LIB -DQT_WIDGETS_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCharts -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -isystem /home/user/Qt/6.8.1/gcc_64/include/QtGui -isystem /home/user/Qt/6.8.1/gcc_64/include/QtWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGL -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGLWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtSql -std=c++20 -fPIC -o CMakeFiles/Cinema.dir/core/utils/reservation_manager.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils/reservation_manager.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils/reservation_manager.cpp", + "output": "CMakeFiles/Cinema.dir/core/utils/reservation_manager.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CHARTS_LIB -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_OPENGLWIDGETS_LIB -DQT_OPENGL_LIB -DQT_SQL_LIB -DQT_WIDGETS_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCharts -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -isystem /home/user/Qt/6.8.1/gcc_64/include/QtGui -isystem /home/user/Qt/6.8.1/gcc_64/include/QtWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGL -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGLWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtSql -std=c++20 -fPIC -o CMakeFiles/Cinema.dir/ui/widgets/directories_management_widget.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets/directories_management_widget.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets/directories_management_widget.cpp", + "output": "CMakeFiles/Cinema.dir/ui/widgets/directories_management_widget.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CHARTS_LIB -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_OPENGLWIDGETS_LIB -DQT_OPENGL_LIB -DQT_SQL_LIB -DQT_WIDGETS_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCharts -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -isystem /home/user/Qt/6.8.1/gcc_64/include/QtGui -isystem /home/user/Qt/6.8.1/gcc_64/include/QtWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGL -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGLWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtSql -std=c++20 -fPIC -o CMakeFiles/Cinema.dir/ui/widgets/entity_deleter_widget.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets/entity_deleter_widget.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets/entity_deleter_widget.cpp", + "output": "CMakeFiles/Cinema.dir/ui/widgets/entity_deleter_widget.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CHARTS_LIB -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_OPENGLWIDGETS_LIB -DQT_OPENGL_LIB -DQT_SQL_LIB -DQT_WIDGETS_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCharts -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -isystem /home/user/Qt/6.8.1/gcc_64/include/QtGui -isystem /home/user/Qt/6.8.1/gcc_64/include/QtWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGL -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGLWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtSql -std=c++20 -fPIC -o CMakeFiles/Cinema.dir/ui/widgets/entity_finder_widget.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets/entity_finder_widget.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets/entity_finder_widget.cpp", + "output": "CMakeFiles/Cinema.dir/ui/widgets/entity_finder_widget.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CHARTS_LIB -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_OPENGLWIDGETS_LIB -DQT_OPENGL_LIB -DQT_SQL_LIB -DQT_WIDGETS_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCharts -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -isystem /home/user/Qt/6.8.1/gcc_64/include/QtGui -isystem /home/user/Qt/6.8.1/gcc_64/include/QtWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGL -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGLWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtSql -std=c++20 -fPIC -o CMakeFiles/Cinema.dir/ui/widgets/entity_updater_widget.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets/entity_updater_widget.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets/entity_updater_widget.cpp", + "output": "CMakeFiles/Cinema.dir/ui/widgets/entity_updater_widget.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CHARTS_LIB -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_OPENGLWIDGETS_LIB -DQT_OPENGL_LIB -DQT_SQL_LIB -DQT_WIDGETS_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCharts -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -isystem /home/user/Qt/6.8.1/gcc_64/include/QtGui -isystem /home/user/Qt/6.8.1/gcc_64/include/QtWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGL -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGLWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtSql -std=c++20 -fPIC -o CMakeFiles/Cinema.dir/ui/widgets/reports_widget.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets/reports_widget.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets/reports_widget.cpp", + "output": "CMakeFiles/Cinema.dir/ui/widgets/reports_widget.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CHARTS_LIB -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_OPENGLWIDGETS_LIB -DQT_OPENGL_LIB -DQT_SQL_LIB -DQT_WIDGETS_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCharts -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -isystem /home/user/Qt/6.8.1/gcc_64/include/QtGui -isystem /home/user/Qt/6.8.1/gcc_64/include/QtWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGL -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGLWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtSql -std=c++20 -fPIC -o CMakeFiles/Cinema.dir/ui/widgets/session_management_widget.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets/session_management_widget.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets/session_management_widget.cpp", + "output": "CMakeFiles/Cinema.dir/ui/widgets/session_management_widget.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CHARTS_LIB -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_OPENGLWIDGETS_LIB -DQT_OPENGL_LIB -DQT_SQL_LIB -DQT_WIDGETS_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCharts -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -isystem /home/user/Qt/6.8.1/gcc_64/include/QtGui -isystem /home/user/Qt/6.8.1/gcc_64/include/QtWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGL -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGLWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtSql -std=c++20 -fPIC -o CMakeFiles/Cinema.dir/ui/widgets/single_record_time_range_widget.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets/single_record_time_range_widget.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets/single_record_time_range_widget.cpp", + "output": "CMakeFiles/Cinema.dir/ui/widgets/single_record_time_range_widget.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CHARTS_LIB -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_OPENGLWIDGETS_LIB -DQT_OPENGL_LIB -DQT_SQL_LIB -DQT_WIDGETS_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCharts -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -isystem /home/user/Qt/6.8.1/gcc_64/include/QtGui -isystem /home/user/Qt/6.8.1/gcc_64/include/QtWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGL -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGLWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtSql -std=c++20 -fPIC -o CMakeFiles/Cinema.dir/ui/widgets/ticket_return_widget.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets/ticket_return_widget.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets/ticket_return_widget.cpp", + "output": "CMakeFiles/Cinema.dir/ui/widgets/ticket_return_widget.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CHARTS_LIB -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_OPENGLWIDGETS_LIB -DQT_OPENGL_LIB -DQT_SQL_LIB -DQT_WIDGETS_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCharts -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -isystem /home/user/Qt/6.8.1/gcc_64/include/QtGui -isystem /home/user/Qt/6.8.1/gcc_64/include/QtWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGL -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGLWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtSql -std=c++20 -fPIC -o CMakeFiles/Cinema.dir/ui/widgets/ticket_sale_widget.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets/ticket_sale_widget.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets/ticket_sale_widget.cpp", + "output": "CMakeFiles/Cinema.dir/ui/widgets/ticket_sale_widget.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CHARTS_LIB -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_OPENGLWIDGETS_LIB -DQT_OPENGL_LIB -DQT_SQL_LIB -DQT_WIDGETS_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCharts -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -isystem /home/user/Qt/6.8.1/gcc_64/include/QtGui -isystem /home/user/Qt/6.8.1/gcc_64/include/QtWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGL -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGLWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtSql -std=c++20 -fPIC -o CMakeFiles/Cinema.dir/ui/widgets/ticket_sales_report_widget.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets/ticket_sales_report_widget.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets/ticket_sales_report_widget.cpp", + "output": "CMakeFiles/Cinema.dir/ui/widgets/ticket_sales_report_widget.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CHARTS_LIB -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_OPENGLWIDGETS_LIB -DQT_OPENGL_LIB -DQT_SQL_LIB -DQT_WIDGETS_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCharts -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -isystem /home/user/Qt/6.8.1/gcc_64/include/QtGui -isystem /home/user/Qt/6.8.1/gcc_64/include/QtWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGL -isystem /home/user/Qt/6.8.1/gcc_64/include/QtOpenGLWidgets -isystem /home/user/Qt/6.8.1/gcc_64/include/QtSql -std=c++20 -fPIC -o CMakeFiles/Cinema.dir/Cinema_autogen/EWIEGA46WW/qrc_resources.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/EWIEGA46WW/qrc_resources.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/Cinema_autogen/EWIEGA46WW/qrc_resources.cpp", + "output": "CMakeFiles/Cinema.dir/Cinema_autogen/EWIEGA46WW/qrc_resources.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CORE_LIB -DQT_NO_DEBUG -DQT_TESTCASE_BUILDDIR=\\\"/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/tests_class\\\" -DQT_TESTCASE_SOURCEDIR=\\\"/media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_class\\\" -DQT_TESTLIB_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/tests_class/day_manager_test_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/tests_class -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_class -isystem /home/user/Qt/6.8.1/gcc_64/include/QtTest -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -std=c++20 -fPIC -o tests_class/CMakeFiles/day_manager_test.dir/day_manager_test_autogen/mocs_compilation.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/tests_class/day_manager_test_autogen/mocs_compilation.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/tests_class/day_manager_test_autogen/mocs_compilation.cpp", + "output": "tests_class/CMakeFiles/day_manager_test.dir/day_manager_test_autogen/mocs_compilation.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CORE_LIB -DQT_NO_DEBUG -DQT_TESTCASE_BUILDDIR=\\\"/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/tests_class\\\" -DQT_TESTCASE_SOURCEDIR=\\\"/media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_class\\\" -DQT_TESTLIB_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/tests_class/day_manager_test_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/tests_class -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_class -isystem /home/user/Qt/6.8.1/gcc_64/include/QtTest -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -std=c++20 -fPIC -o tests_class/CMakeFiles/day_manager_test.dir/day_manager_test.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_class/day_manager_test.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_class/day_manager_test.cpp", + "output": "tests_class/CMakeFiles/day_manager_test.dir/day_manager_test.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CORE_LIB -DQT_NO_DEBUG -DQT_TESTCASE_BUILDDIR=\\\"/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/tests_class\\\" -DQT_TESTCASE_SOURCEDIR=\\\"/media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_class\\\" -DQT_TESTLIB_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/tests_class/day_manager_test_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/tests_class -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_class -isystem /home/user/Qt/6.8.1/gcc_64/include/QtTest -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -std=c++20 -fPIC -o tests_class/CMakeFiles/day_manager_test.dir/__/core/utils/day_manager.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils/day_manager.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils/day_manager.cpp", + "output": "tests_class/CMakeFiles/day_manager_test.dir/__/core/utils/day_manager.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CORE_LIB -DQT_NO_DEBUG -DQT_TESTCASE_BUILDDIR=\\\"/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/tests_class\\\" -DQT_TESTCASE_SOURCEDIR=\\\"/media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_class\\\" -DQT_TESTLIB_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/tests_class/day_manager_test_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/tests_class -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_class -isystem /home/user/Qt/6.8.1/gcc_64/include/QtTest -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -std=c++20 -fPIC -o tests_class/CMakeFiles/day_manager_test.dir/__/core/utils/reservation_manager.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils/reservation_manager.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils/reservation_manager.cpp", + "output": "tests_class/CMakeFiles/day_manager_test.dir/__/core/utils/reservation_manager.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CORE_LIB -DQT_NO_DEBUG -DQT_TESTCASE_BUILDDIR=\\\"/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/tests_class\\\" -DQT_TESTCASE_SOURCEDIR=\\\"/media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_class\\\" -DQT_TESTLIB_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/tests_class/reservation_manager_test_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/tests_class -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_class -isystem /home/user/Qt/6.8.1/gcc_64/include/QtTest -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -std=c++20 -fPIC -o tests_class/CMakeFiles/reservation_manager_test.dir/reservation_manager_test_autogen/mocs_compilation.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/tests_class/reservation_manager_test_autogen/mocs_compilation.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/tests_class/reservation_manager_test_autogen/mocs_compilation.cpp", + "output": "tests_class/CMakeFiles/reservation_manager_test.dir/reservation_manager_test_autogen/mocs_compilation.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CORE_LIB -DQT_NO_DEBUG -DQT_TESTCASE_BUILDDIR=\\\"/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/tests_class\\\" -DQT_TESTCASE_SOURCEDIR=\\\"/media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_class\\\" -DQT_TESTLIB_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/tests_class/reservation_manager_test_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/tests_class -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_class -isystem /home/user/Qt/6.8.1/gcc_64/include/QtTest -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -std=c++20 -fPIC -o tests_class/CMakeFiles/reservation_manager_test.dir/reservation_manager_test.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_class/reservation_manager_test.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_class/reservation_manager_test.cpp", + "output": "tests_class/CMakeFiles/reservation_manager_test.dir/reservation_manager_test.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CORE_LIB -DQT_NO_DEBUG -DQT_TESTCASE_BUILDDIR=\\\"/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/tests_class\\\" -DQT_TESTCASE_SOURCEDIR=\\\"/media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_class\\\" -DQT_TESTLIB_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/tests_class/reservation_manager_test_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/tests_class -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_class -isystem /home/user/Qt/6.8.1/gcc_64/include/QtTest -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -std=c++20 -fPIC -o tests_class/CMakeFiles/reservation_manager_test.dir/__/core/utils/day_manager.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils/day_manager.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils/day_manager.cpp", + "output": "tests_class/CMakeFiles/reservation_manager_test.dir/__/core/utils/day_manager.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DQT_CORE_LIB -DQT_NO_DEBUG -DQT_TESTCASE_BUILDDIR=\\\"/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/tests_class\\\" -DQT_TESTCASE_SOURCEDIR=\\\"/media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_class\\\" -DQT_TESTLIB_LIB -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/tests_class/reservation_manager_test_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/tests_class -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_class -isystem /home/user/Qt/6.8.1/gcc_64/include/QtTest -isystem /home/user/Qt/6.8.1/gcc_64/include -isystem /home/user/Qt/6.8.1/gcc_64/include/QtCore -isystem /home/user/Qt/6.8.1/gcc_64/mkspecs/linux-g++ -std=c++20 -fPIC -o tests_class/CMakeFiles/reservation_manager_test.dir/__/core/utils/reservation_manager.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils/reservation_manager.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils/reservation_manager.cpp", + "output": "tests_class/CMakeFiles/reservation_manager_test.dir/__/core/utils/reservation_manager.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DSQL_SCRIPTS_PATH=\\\"/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/tests_schema/core/sql\\\" -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/tests_schema/tests_schema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_schema/tests_sources -std=c++20 -DGTEST_HAS_PTHREAD=1 -o tests_schema/CMakeFiles/tests_schema.dir/tests_schema_autogen/mocs_compilation.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/tests_schema/tests_schema_autogen/mocs_compilation.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/tests_schema/tests_schema_autogen/mocs_compilation.cpp", + "output": "tests_schema/CMakeFiles/tests_schema.dir/tests_schema_autogen/mocs_compilation.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DSQL_SCRIPTS_PATH=\\\"/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/tests_schema/core/sql\\\" -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/tests_schema/tests_schema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_schema/tests_sources -std=c++20 -DGTEST_HAS_PTHREAD=1 -o tests_schema/CMakeFiles/tests_schema.dir/tests/main_test.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_schema/tests/main_test.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_schema/tests/main_test.cpp", + "output": "tests_schema/CMakeFiles/tests_schema.dir/tests/main_test.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DSQL_SCRIPTS_PATH=\\\"/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/tests_schema/core/sql\\\" -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/tests_schema/tests_schema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_schema/tests_sources -std=c++20 -DGTEST_HAS_PTHREAD=1 -o tests_schema/CMakeFiles/tests_schema.dir/tests/sqlite_database_crud_test.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_schema/tests/sqlite_database_crud_test.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_schema/tests/sqlite_database_crud_test.cpp", + "output": "tests_schema/CMakeFiles/tests_schema.dir/tests/sqlite_database_crud_test.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DSQL_SCRIPTS_PATH=\\\"/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/tests_schema/core/sql\\\" -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/tests_schema/tests_schema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_schema/tests_sources -std=c++20 -DGTEST_HAS_PTHREAD=1 -o tests_schema/CMakeFiles/tests_schema.dir/tests/sqlite_database_foreign_key_test.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_schema/tests/sqlite_database_foreign_key_test.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_schema/tests/sqlite_database_foreign_key_test.cpp", + "output": "tests_schema/CMakeFiles/tests_schema.dir/tests/sqlite_database_foreign_key_test.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DSQL_SCRIPTS_PATH=\\\"/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/tests_schema/core/sql\\\" -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/tests_schema/tests_schema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_schema/tests_sources -std=c++20 -DGTEST_HAS_PTHREAD=1 -o tests_schema/CMakeFiles/tests_schema.dir/tests/sqlite_database_trigger_test.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_schema/tests/sqlite_database_trigger_test.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_schema/tests/sqlite_database_trigger_test.cpp", + "output": "tests_schema/CMakeFiles/tests_schema.dir/tests/sqlite_database_trigger_test.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DSQL_SCRIPTS_PATH=\\\"/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/tests_schema/core/sql\\\" -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/tests_schema/tests_schema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_schema/tests_sources -std=c++20 -DGTEST_HAS_PTHREAD=1 -o tests_schema/CMakeFiles/tests_schema.dir/tests_sources/sqlite_database.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_schema/tests_sources/sqlite_database.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_schema/tests_sources/sqlite_database.cpp", + "output": "tests_schema/CMakeFiles/tests_schema.dir/tests_sources/sqlite_database.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DSQL_SCRIPTS_PATH=\\\"/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/tests_schema/core/sql\\\" -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/tests_schema/tests_schema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_schema/tests_sources -std=c++20 -DGTEST_HAS_PTHREAD=1 -o tests_schema/CMakeFiles/tests_schema.dir/tests_sources/sqlite_file_executor.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_schema/tests_sources/sqlite_file_executor.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_schema/tests_sources/sqlite_file_executor.cpp", + "output": "tests_schema/CMakeFiles/tests_schema.dir/tests_sources/sqlite_file_executor.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DSQL_SCRIPTS_PATH=\\\"/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/tests_schema/core/sql\\\" -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/tests_schema/tests_schema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_schema/tests_sources -std=c++20 -DGTEST_HAS_PTHREAD=1 -o tests_schema/CMakeFiles/tests_schema.dir/tests_sources/sqlite_statement.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_schema/tests_sources/sqlite_statement.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_schema/tests_sources/sqlite_statement.cpp", + "output": "tests_schema/CMakeFiles/tests_schema.dir/tests_sources/sqlite_statement.cpp.o" +}, +{ + "directory": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux", + "command": "/bin/c++ -DSQL_SCRIPTS_PATH=\\\"/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/tests_schema/core/sql\\\" -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/tests_schema/tests_schema_autogen/include -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/controllers -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/db -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/dto -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/repositories -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/requests -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/services -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/core/utils -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/data/sql -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/src -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/delegates -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/dialogs -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/main_window -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/models -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/ui/widgets -I/media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_schema/tests_sources -std=c++20 -DGTEST_HAS_PTHREAD=1 -o tests_schema/CMakeFiles/tests_schema.dir/tests_sources/file_reader.cpp.o -c /media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_schema/tests_sources/file_reader.cpp", + "file": "/media/sdb1/projects/coursework-metrology/coursework-metrology-main/tests_schema/tests_sources/file_reader.cpp", + "output": "tests_schema/CMakeFiles/tests_schema.dir/tests_sources/file_reader.cpp.o" +} +] \ No newline at end of file diff --git a/config/config.h.in b/config/config.h.in new file mode 100644 index 0000000..6ae7311 --- /dev/null +++ b/config/config.h.in @@ -0,0 +1,17 @@ +// clang-format off + +/* Configurations */ + +#define PROJECT_NAME "@PROJECT_NAME@" +#define VERSION_MAJOR @VERSION_MAJOR@ +#define VERSION_MINOR @VERSION_MINOR@ + +// Database configuration +#define DATABASE_NAME "@DATABASE_NAME@" +#define DATABASE_DRIVER "@DATABASE_DRIVER@" +// #define DATABASE_HOST "@DATABASE_HOST@" +// #define DATABASE_PORT @DATABASE_PORT@ +// #define DATABASE_USER "@DATABASE_USER@" +// #define DATABASE_PASSWORD "@DATABASE_PASSWORD@" + +// clang-format on diff --git a/config/resources.qrc.in b/config/resources.qrc.in new file mode 100644 index 0000000..b71bc96 --- /dev/null +++ b/config/resources.qrc.in @@ -0,0 +1,19 @@ + + + core/sql/cinema_db_create_indexes.sql + core/sql/cinema_db_create_tables.sql + core/sql/cinema_db_create_triggers.sql + core/sql/cinema_db_create_views.sql + core/sql/cinema_db_foreign_key_off.sql + core/sql/cinema_db_foreign_key_on.sql + core/sql/cinema_db_genre_insert.sql + core/sql/cinema_db_hall_insert.sql + core/sql/cinema_db_movie_insert.sql + core/sql/cinema_db_role_insert.sql + core/sql/cinema_db_user_insert.sql + + + @CMAKE_CURRENT_BINARY_DIR@/translations/app_ru.qm + + + diff --git a/core/controllers/application_connector.cpp b/core/controllers/application_connector.cpp new file mode 100644 index 0000000..4d471cc --- /dev/null +++ b/core/controllers/application_connector.cpp @@ -0,0 +1,294 @@ +#include "application_connector.h" + +#include "model_manager.h" +#include "repository_manager.h" +#include "schema_metadata.h" +#include + +ApplicationConnector::ApplicationConnector(QObject *rootObject) + : modelManager_(ModelManager::instance()), + repositoryManager_(RepositoryManager::instance()), + rootObject_(rootObject) {} + +bool ApplicationConnector::connect() { + if (!connectSelfReferenceTableLinks()) { + return false; + } + + if (!connectTablePairLinks()) { + return false; + } + + if (!connectUpdateDeleteRFLinks()) { + return false; + } + + if (!connectDeleteRFLinks()) { + return false; + } + + return true; +} + +ApplicationConnector::RMLinkList +ApplicationConnector::initializeSelfReferenceTableLinks() { + return {linkRepositoryToModel("genres", "genres"), + linkRepositoryToModel("halls", "halls"), + linkRepositoryToModel("movies", "movies"), + linkRepositoryToModel("sessions", "sessions"), + linkRepositoryToModel("refunds", "refunds"), + linkRepositoryToModel("tickets", "tickets")}; +} + +ApplicationConnector::RMLinkList +ApplicationConnector::initializeTablePairLinks() { + return {linkRepositoryToModel("genres", "movies"), + linkRepositoryToModel("genres", "sessions"), + linkRepositoryToModel("genres", "tickets"), + linkRepositoryToModel("genres", "refunds"), + linkRepositoryToModel("halls", "sessions"), + linkRepositoryToModel("halls", "tickets"), + linkRepositoryToModel("halls", "refunds"), + linkRepositoryToModel("movies", "sessions"), + linkRepositoryToModel("movies", "tickets"), + linkRepositoryToModel("movies", "refunds"), + linkRepositoryToModel("sessions", "refunds"), + linkRepositoryToModel("tickets", "refunds")}; +} + +ApplicationConnector::RFLinkList +ApplicationConnector::flattenLinkList(const QVector &linkLists) { + RFLinkList result; + for (const RFLinkList ¤tList : linkLists) { + std::move(currentList.cbegin(), currentList.cend(), + std::back_inserter(result)); + } + return result; +} + +ApplicationConnector::RFLinkList +ApplicationConnector::initializeUpdateDeleteCandidates() { + const QVector updateDeleteCandidates = { + linkRepositoryToFinder("genres", "genreFinder"), + linkRepositoryToFinder("genres", "movieFinder"), + linkRepositoryToFinder("genres", "sessionFinder"), + linkRepositoryToFinder("genres", "ticketFinder"), + linkRepositoryToFinder("genres", "entityFinder"), + linkRepositoryToFinder("halls", "hallFinder"), + linkRepositoryToFinder("halls", "movieFinder"), + linkRepositoryToFinder("halls", "sessionFinder"), + linkRepositoryToFinder("halls", "ticketFinder"), + linkRepositoryToFinder("halls", "entityFinder"), + linkRepositoryToFinder("movies", "movieFinder"), + linkRepositoryToFinder("movies", "sessionFinder"), + linkRepositoryToFinder("movies", "ticketFinder"), + linkRepositoryToFinder("movies", "entityFinder"), + linkRepositoryToFinder("sessions", "sessionFinder"), + linkRepositoryToFinder("sessions", "ticketFinder"), + linkRepositoryToFinder("sessions", "entityFinder"), + linkRepositoryToFinder("tickets", "ticketFinder"), + linkRepositoryToFinder("tickets", "entityFinder"), + linkRepositoryToFinder("refunds", "entityFinder")}; + + return flattenLinkList(updateDeleteCandidates); +} + +ApplicationConnector::RFLinkList +ApplicationConnector::initializeDeleteCandidates() { + // foreignKeyFinder will reset to default on signal primaryKeyFinder + + const QVector deleteCandidates = { + linkRepositoryToFinder("genres", "primaryKeyFinder"), + linkRepositoryToFinder("halls", "primaryKeyFinder"), + linkRepositoryToFinder("movies", "primaryKeyFinder"), + linkRepositoryToFinder("sessions", "primaryKeyFinder"), + linkRepositoryToFinder("tickets", "primaryKeyFinder"), + linkRepositoryToFinder("refunds", "primaryKeyFinder")}; + + return flattenLinkList(deleteCandidates); +} + +bool ApplicationConnector::connectSelfReferenceTableLinks() { + const QList selfReferenceTableLinks = + initializeSelfReferenceTableLinks(); + qInfo() << "Connecting self-reference tables..."; + + if (!connect(selfReferenceTableLinks, singleTableConnections())) { + qWarning() << "Failed to connect self-reference tables"; + return false; + } + return true; +} + +bool ApplicationConnector::connectTablePairLinks() { + const RMLinkList tablePairLinks = initializeTablePairLinks(); + qInfo() << "Connecting pair tables..."; + + if (!connect(tablePairLinks, pairTableConnections())) { + qWarning() << "Failed to connect pair tables"; + return false; + } + return true; +} + +bool ApplicationConnector::connectUpdateDeleteRFLinks() { + const RFLinkList repositoryToFinderLinks = initializeUpdateDeleteCandidates(); + qInfo() << "Connecting repository to finder..."; + + if (!connect(repositoryToFinderLinks, repositoryToFinderConnections())) { + qWarning() << "Failed to connect repository to finder"; + return false; + } + return true; +} + +bool ApplicationConnector::connectDeleteRFLinks() { + const RFLinkList repositoryToFinderLinks = initializeDeleteCandidates(); + qInfo() << "Connecting repository to finder..."; + + using Signal = void (Repository::*)(); + using Slot = void (Finder::*)(); + RFConnectionList connections; + connections.append(Connection(&Repository::dataDeleted, + &Finder::resetToDefault)); + + if (!connect(repositoryToFinderLinks, connections)) { + qWarning() << "Failed to connect repository to finder"; + return false; + } + return true; +} + +ApplicationConnector::RMConnectionList +ApplicationConnector::pairTableConnections() { + using Signal = void (Repository::*)(); + using Slot = bool (Model::*)(); + + RMConnectionList result; + std::initializer_list> initList = { + {&Repository::dataUpdated, &Model::refreshAll}, + {&Repository::dataDeleted, &Model::refreshAll}}; + + for (const auto &connection : initList) { + result.append(connection); + } + + return result; +} + +ApplicationConnector::RMConnectionList +ApplicationConnector::singleTableConnections() { + using Signal = void (Repository::*)(); + using Slot = bool (Model::*)(); + + RMConnectionList result; + std::initializer_list> initList = { + {&Repository::dataCreated, &Model::refreshAll}, + {&Repository::dataUpdated, &Model::refreshAll}, + {&Repository::dataDeleted, &Model::refreshAll}}; + + for (const auto &connection : initList) { + result.append(connection); + } + + return result; +} + +ApplicationConnector::RMLink ApplicationConnector::linkRepositoryToModel( + const QString &senderDatabaseTableName, + const QString &receiverDatabaseTableName) { + SchemaMetadata metadata = SchemaMetadata::defaultSchema(); + + Repository *sender = repositoryManager_.getRepositoryAs( + metadata.repositoryTableName(senderDatabaseTableName)); + if (!sender) { + qWarning() << "Sender with type" << typeid(sender).name() << "is null"; + } + + Model *receiver = modelManager_.getModelAs( + metadata.modelTableName(receiverDatabaseTableName)); + if (!receiver) { + qWarning() << "Receiver with type" << typeid(receiver).name() << "is null"; + } + + if (!sender || !receiver) { + return qMakePair(nullptr, nullptr); + } + + return qMakePair(sender, receiver); +} + +ApplicationConnector::RFLinkList ApplicationConnector::linkRepositoryToFinder( + const QString &senderDatabaseTableName, + const QString &receiverEntityFinderName) { + SchemaMetadata metadata = SchemaMetadata::defaultSchema(); + + Repository *sender = repositoryManager_.getRepositoryAs( + metadata.repositoryTableName(senderDatabaseTableName)); + if (!sender) { + qWarning() << "Sender with type" << typeid(sender).name() << "is null"; + } + + QList receiver = + rootObject_->findChildren(receiverEntityFinderName); + if (receiver.isEmpty()) { + qWarning() << "Receivers with type" << typeid(receiver).name() + << "there is not"; + } + + if (!sender || receiver.isEmpty()) { + return QList(); + } + + RFLinkList result; + for (Finder *currentReceiver : receiver) { + result.append(qMakePair(sender, currentReceiver)); + } + + return result; +} + +ApplicationConnector::RFConnectionList +ApplicationConnector::repositoryToFinderConnections() { + using Signal = void (Repository::*)(); + using Slot = void (Finder::*)(); + + RFConnectionList result; + std::initializer_list> initList = { + {&Repository::dataDeleted, &Finder::resetToDefault}, + {&Repository::dataUpdated, &Finder::resetToDefault}}; + + for (const auto &connection : initList) { + result.append(connection); + } + + return result; +} + +QString ApplicationConnector::getAddress(const QObject *object) { + quintptr address = reinterpret_cast(object); + return object ? QString::number(address, 16) : "null"; +}; + +QString ApplicationConnector::getMetaClassName(const QMetaObject *meta) { + return meta ? meta->className() : "Unknown"; +}; + +QString ApplicationConnector::getMethodSignature(const QMetaObject *meta, + const char *methodType, + bool isSignal) { + if (!meta) { + return "Unknown"; + } + + QByteArray normalizedSignature = QMetaObject::normalizedSignature(methodType); + int methodIndex = isSignal ? meta->indexOfSignal(normalizedSignature) + : meta->indexOfSlot(normalizedSignature); + + if (methodIndex < 0) { + return normalizedSignature; + } + + QString result = meta->method(methodIndex).methodSignature(); + return result; +}; diff --git a/core/controllers/application_connector.h b/core/controllers/application_connector.h new file mode 100644 index 0000000..c2c3ceb --- /dev/null +++ b/core/controllers/application_connector.h @@ -0,0 +1,238 @@ +#ifndef APPLICATION_CONNECTOR_H +#define APPLICATION_CONNECTOR_H + +#include +#include +#include + +// WARNING: Not used directly in cpp file +// You can transfer it to the cpp file, it will not be an error, but a +// warning will remain +#include "base_sql_table_model.h" +#include "data_repository_signals.h" +#include "entity_finder_widget.h" + +// Forward declarations +class ModelManager; +class RepositoryManager; + +class ApplicationConnector { +private: + // WARNING: Not use directly in cpp file + + template + using Link = QPair; + + template + using Connection = QPair; + + template + using ConnectionVariant = std::variant< + Connection, + Connection, + Connection, + Connection>; + + template + using ConnectionList = QList>; + + template + using LinkList = QList>; + + // Derivatives + + using Repository = DataRepositorySignals; + using Model = BaseSqlTableModel; + using Finder = EntityFinderWidget; + + // WARNING: Use only producing types in cpp file + + // Producing types of Repository and Model + using RMLink = QPair; + using RMConnection = ConnectionVariant; + using RMConnectionList = QList; + using RMLinkList = QList; + + // Producing types of Repository and Finder + using RFLink = QPair; + using RFConnection = ConnectionVariant; + using RFConnectionList = QList; + using RFLinkList = QList; + +private: + ModelManager &modelManager_; + QObject *rootObject_; + RepositoryManager &repositoryManager_; + +public: + ApplicationConnector(QObject *rootObject); + + bool connect(); + +private: + template + bool accessible(const Link &link); + + template + bool connect(SenderType *sender, ReceiverType *receiver, + const ConnectionList &connections); + + template + bool connect(const LinkList &links, + const ConnectionList &connections); + + template + QString templateString(SignalType signal, SlotType slot, QObject *sender, + QObject *receiver); + +private: + RFConnectionList repositoryToFinderConnections(); + RMConnectionList pairTableConnections(); + RMConnectionList singleTableConnections(); + + RFLinkList flattenLinkList(const QVector &linkLists); + RFLinkList linkRepositoryToFinder(const QString &sender, + const QString &receiver); + RMLink linkRepositoryToModel(const QString &sender, const QString &receiver); + + RFLinkList initializeDeleteCandidates(); + RFLinkList initializeUpdateDeleteCandidates(); + RMLinkList initializeSelfReferenceTableLinks(); + RMLinkList initializeTablePairLinks(); + + bool connectDeleteRFLinks(); + bool connectSelfReferenceTableLinks(); + bool connectTablePairLinks(); + bool connectUpdateDeleteRFLinks(); + +private: + QString getAddress(const QObject *object); + + QString getMetaClassName(const QMetaObject *meta); + + QString getMethodSignature(const QMetaObject *meta, const char *methodType, + bool isSignal); +}; + +template +bool ApplicationConnector::accessible( + const Link &link) { + return bool(link.first && link.second); +} + +template +bool ApplicationConnector::connect( + const LinkList &links, + const ConnectionList &connections) { + for (const Link ¤tLink : links) { + qInfo() << "Connecting link: Index of ConnectionList:" + << links.indexOf(currentLink); + + if (!accessible(currentLink)) { + qWarning() << "Link is not accessible: Index of ConnectionList:" + << links.indexOf(currentLink); + continue; + } + + SenderType *sender = currentLink.first; + ReceiverType *receiver = currentLink.second; + + if (!connect(sender, receiver, connections)) { + return false; + } + } + + return true; +} + +template +bool ApplicationConnector::connect( + SenderType *sender, ReceiverType *receiver, + const ConnectionList &connections) { + + // WARNING: "auto" keyword is necessary + auto handler = [&](const auto ¤tLink) -> bool { + auto &[signal, slot] = currentLink; + + bool connected = QObject::connect(sender, signal, receiver, slot); + if (!connected) { + qWarning().noquote() << "Failed to connect signal to slot:" + << templateString(signal, slot, sender, receiver); + } else { + qInfo().noquote() << "Connected signal to slot:" + << templateString(signal, slot, sender, receiver); + } + + return connected; + }; + + for (const ConnectionVariant ¤tConnection : + connections) { + bool connected = std::visit(handler, currentConnection); + if (!connected) { + return false; + } + } + + return true; +} + +template +QString ApplicationConnector::templateString(SignalType signal, SlotType slot, + QObject *sender, + QObject *receiver) { + const QMetaObject *senderMeta = sender ? sender->metaObject() : nullptr; + const QMetaObject *receiverMeta = receiver ? receiver->metaObject() : nullptr; + + auto width = [](int index) { + switch (index) { + case 0: + return 10; + case 1: + return -30; + default: + return 0; + } + }; + + QString billetTA = QString("\n\t|%0: Type: %1 Address: 0x%2"); + QString billetTAN = billetTA + QString(" Name: \"%3\""); + QString result; + + QString signalT = getMethodSignature(senderMeta, typeid(signal).name(), true); + QString signalA = senderMeta ? getAddress(sender) : "null"; + + result += + billetTA.arg("Signal", width(0)).arg(signalT, width(1)).arg(signalA); + + QString slotT = getMethodSignature(receiverMeta, typeid(slot).name(), false); + QString slotA = receiverMeta ? getAddress(receiver) : "null"; + + result += billetTA.arg("Slot", width(0)).arg(slotT, width(1)).arg(slotA); + + QString senderT = getMetaClassName(senderMeta); + QString senderA = getAddress(sender); + QString senderN = sender->objectName(); + + result += billetTAN.arg("Sender", width(0)) + .arg(senderT, width(1)) + .arg(senderA) + .arg(senderN); + + QString receiverT = getMetaClassName(receiverMeta); + QString receiverA = getAddress(receiver); + QString receiverN = receiver->objectName(); + + result += billetTAN.arg("Receiver", width(0)) + .arg(receiverT, width(1)) + .arg(receiverA) + .arg(receiverN); + + return result; +} + +#endif // APPLICATION_CONNECTOR_H diff --git a/core/controllers/application_controller.cpp b/core/controllers/application_controller.cpp new file mode 100644 index 0000000..b64ae0e --- /dev/null +++ b/core/controllers/application_controller.cpp @@ -0,0 +1,150 @@ +#include "application_controller.h" +#include "config.h" +#include "database_manager.h" + +// Translations +#include +#include +#include + +// Generation of records +#include "refund_generator.h" +#include "session_generator.h" +#include "ticket_generator.h" + +// Auntification +#include "auth_dialog.h" + +qint32 ApplicationController::userId_ = -1; +qint32 ApplicationController::accessLevel_ = 0; + +bool ApplicationController::setupApplication() { + + if (!ensureDatabaseExists(DATABASE_NAME)) { + return false; + } + + if (!connectToDatabase(DATABASE_NAME)) { + return false; + } + + if (!loadTranslations("ru", "app", "_", ":/translations")) { + return false; + } + + AuthDialog authDialog; + + QObject::connect(&authDialog, &AuthDialog::loginSuccessful, + &ApplicationController::onLoginSuccessful); + + QObject::connect(&authDialog, &AuthDialog::loginFailed, + &ApplicationController::onLoginFailed); + + if (authDialog.exec() != QDialog::Accepted) { + return false; // User has not logged in + } + + return true; +} + +bool ApplicationController::ensureDatabaseExists( + const QString &databaseFileName) { + DatabaseManager::CreateDatabaseResult result = + DatabaseManager::createDefaultDatabaseIfMissing(databaseFileName); + + switch (result) { + case DatabaseManager::CreateDatabaseResult::Success: { + +#ifndef NDEBUG + qInfo() << "Generating test data..."; + + DayManager dayManager(QTime(8, 0), QTime(17, 0)); + dayManager.setMode(DayManager::SlotSelectionMode::Quick); + dayManager.setMode(DayManager::StartTimeMode::Random); + + const QDate begin = QDate(2025, 1, 1); // Since 01-01-2025 + const QDate end = begin.addDays(5); + ReservationManager reservationManager(14, begin.daysTo(end), + std::move(dayManager)); + + SessionGenerator sessionGenerator(reservationManager); + + sessionGenerator.generateAll( + sessionGenerator.defaultShouldLog(1 /* percent */, 60 /* seconds */)); + + QPair timeRange(QTime(9, 30), QTime(15, 30)); + + TicketGenerator ticketsGenerator( + {0, 30} /* day range */, timeRange, + {0.0, 1.0} /* fill ratio per session range*/); + GeneratorInterface::ShouldLogSuccess performOtherwise = + ticketsGenerator.shouldLogFirstAndLastPercent(); + ticketsGenerator.generateByFillRatio( + 0.35, + ticketsGenerator.defaultShouldLog(1 /* percent */, 600 /* seconds */)); + + RefundGenerator refundGenerator({0.1, 0.5} /* refund ratio range */, + {0, 7} /* day range */, timeRange); + refundGenerator.generateByFillRatio( + 0.1, + refundGenerator.defaultShouldLog(1 /* percent */, 600 /* seconds + */)); + + qInfo() << "Test data generated successfully"; +#endif + + qInfo() << "Database created and initialized successfully"; + } break; + case DatabaseManager::CreateDatabaseResult::AlreadyExists: + break; + case DatabaseManager::CreateDatabaseResult::Error: + qCritical() << "Failed to create and connect to the database"; + return false; + } + + return true; +} + +void ApplicationController::onLoginFailed() { + userId_ = -1; + accessLevel_ = 0; +} + +void ApplicationController::onLoginSuccessful(qint32 userId, + qint32 accessLevel) { + userId_ = userId; + accessLevel_ = accessLevel; +} + +bool ApplicationController::connectToDatabase(const QString &databaseName) { + if (!DatabaseManager::connectToDefaultDatabase(databaseName)) { + qCritical() << "Failed to connect to the database"; + return false; + } + + qInfo() << "Connected to database" << databaseName << "successfully"; + return true; +} + +bool ApplicationController::loadTranslations(const QString &locale, + const QString &filename, + const QString &prefix, + const QString &directory) { + QCoreApplication *app = QCoreApplication::instance(); + QTranslator *translator = new QTranslator(app); + + bool loaded = translator->load(QLocale(locale), filename, prefix, directory); + if (!loaded) { + qWarning() << "Failed to load translations"; + return false; + } + + bool installed = app->installTranslator(translator); + if (!installed) { + qWarning() << "Failed to install translations"; + return false; + } + + qInfo() << "Translations are loaded successfully"; + return true; +} diff --git a/core/controllers/application_controller.h b/core/controllers/application_controller.h new file mode 100644 index 0000000..b27fbe4 --- /dev/null +++ b/core/controllers/application_controller.h @@ -0,0 +1,37 @@ +#ifndef APPLICATION_CONTROLLER_H +#define APPLICATION_CONTROLLER_H + +#include + +class ApplicationController { +private: + static qint32 userId_; + static qint32 accessLevel_; + +public: + explicit ApplicationController() = default; + + static bool setupApplication(); + + static inline qint32 accessLevel(); + static inline qint32 userId(); + +private slots: + static void onLoginFailed(); + static void onLoginSuccessful(qint32 userId, qint32 accessLevel); + +private: + // Database + static bool connectToDatabase(const QString &databaseFileName); + static bool ensureDatabaseExists(const QString &databaseFileName); + + // Translations + static bool loadTranslations(const QString &locale, const QString &filename, + const QString &prefix, const QString &directory); +}; + +inline qint32 ApplicationController::accessLevel() { return accessLevel_; } + +inline qint32 ApplicationController::userId() { return userId_; } + +#endif // APPLICATION_CONTROLLER_H diff --git a/core/db/database_manager.cpp b/core/db/database_manager.cpp new file mode 100644 index 0000000..68bfc0d --- /dev/null +++ b/core/db/database_manager.cpp @@ -0,0 +1,111 @@ +#include "database_manager.h" + +#include "config.h" +#include "execute_sql_file.h" +#include +#include +#include + +DatabaseManager::~DatabaseManager() { + disconnectDefaultDatabase(); + + QString defaultConnectionName = QSqlDatabase::database().connectionName(); + QSqlDatabase::removeDatabase(QSqlDatabase::database().connectionName()); + + qInfo() << "Database with default connection name:" << defaultConnectionName + << "was removed"; +} + +DatabaseManager::CreateDatabaseResult +DatabaseManager::createDefaultDatabaseIfMissing( + const QString &databaseFileName) { + if (QFile::exists(databaseFileName)) { + qInfo() + << "Database file name already exists and will not be created again:" + << databaseFileName; + return CreateDatabaseResult::AlreadyExists; + } + + if (!connectToDefaultDatabase(databaseFileName)) { + qWarning() << "Failed to create and connect to the database"; + return CreateDatabaseResult::Error; + } + + // Execute SQL files to initialize the database + QStringList sqlFiles = {":/sql/create_tables.sql", ":/sql/create_indexes.sql", + ":/sql/create_views.sql", ":/sql/create_triggers.sql", + ":/sql/insert_role.sql"}; + +#ifndef NDEBUG + QStringList additionalSqlFiles = { + ":/sql/insert_genre.sql", ":/sql/insert_hall.sql", + ":/sql/insert_movie.sql", ":/sql/insert_user.sql"}; + sqlFiles.append(additionalSqlFiles); +#endif + + QSqlDatabase defaultDatabase = QSqlDatabase::database(); + bool success = executeSqlFiles(sqlFiles, defaultDatabase); + disconnectDefaultDatabase(); + + if (success) { + qInfo() << "Database created and initialized successfully"; + return CreateDatabaseResult::Success; + } + + qWarning() << "Failed to execute initialization SQL files"; + + if (QFile::remove(databaseFileName)) { + qInfo() << "Database file deleted due to initialization failure:" + << databaseFileName; + } else { + qWarning() << "Failed to delete database file:" << databaseFileName; + } + + return CreateDatabaseResult::Error; +} + +bool DatabaseManager::connectToDefaultDatabase( + const QString &databaseFileName) { + QSqlDatabase defaultDatabase = QSqlDatabase::database(); + + defaultDatabase.setDatabaseName(databaseFileName); + if (defaultDatabase.isValid() && defaultDatabase.isOpen()) { + qInfo() << "Database is already connected"; + return true; + } + + // Constructor does not open/close the connection + defaultDatabase = QSqlDatabase::addDatabase(DATABASE_DRIVER); + defaultDatabase.setDatabaseName(databaseFileName); + + if (!defaultDatabase.open()) { + qWarning() << "Failed to connect to the database:" << databaseFileName; + return false; + } + + qDebug() << "Database was connected successfully: Connection name:" + << defaultDatabase.connectionName(); + + return true; +} + +void DatabaseManager::disconnectDefaultDatabase() { + QSqlDatabase defaultDatabase = QSqlDatabase::database(); + if (defaultDatabase.isOpen()) { + defaultDatabase.close(); + qInfo() << "Database disconnected"; + } +} + +bool DatabaseManager::executeSqlFiles(const QStringList &filePaths, + QSqlDatabase &database) { + ExecuteSqlFile executor(database); + for (const QString &filePath : filePaths) { + qInfo() << "Executing SQL file:" << filePath; + if (!executor(filePath)) { + qWarning() << "Failed to execute SQL file:" << filePath; + return false; + } + } + return true; +} diff --git a/core/db/database_manager.h b/core/db/database_manager.h new file mode 100644 index 0000000..84fe420 --- /dev/null +++ b/core/db/database_manager.h @@ -0,0 +1,31 @@ +#ifndef DATABASE_MANAGER_H +#define DATABASE_MANAGER_H + +#include +#include +#include + +class DatabaseManager { +public: + enum class CreateDatabaseResult { Success, AlreadyExists, Error }; + +private: + ~DatabaseManager(); + + DatabaseManager(const DatabaseManager &) = delete; + DatabaseManager &operator=(const DatabaseManager &) = delete; + +public: + static CreateDatabaseResult + createDefaultDatabaseIfMissing(const QString &databaseFileName); + + static bool connectToDefaultDatabase(const QString &databaseFileName); + + static void disconnectDefaultDatabase(); + +private: + static bool databaseFileExists(const QString &databaseName, QSqlDatabase &db); + static bool executeSqlFiles(const QStringList &filePaths, QSqlDatabase &db); +}; + +#endif // DATABASE_MANAGER_H diff --git a/core/db/execute_sql_file.cpp b/core/db/execute_sql_file.cpp new file mode 100644 index 0000000..03d90a4 --- /dev/null +++ b/core/db/execute_sql_file.cpp @@ -0,0 +1,108 @@ +#include "execute_sql_file.h" + +#include + +ExecuteSqlFile::ExecuteSqlFile(QSqlDatabase &db) + : db_(db), delimiter_(";") { // Default delimiter is ";" + // Constructor does not open/close the connection +} + +bool ExecuteSqlFile::operator()(const QString &filePath) { + // Ensure the database connection is open + if (!db_.isOpen()) { + qWarning() << "Database connection is not open"; + return false; + } + + QFile file(filePath); + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { + qWarning() << "Failed to open file:" << filePath; + return false; + } + + QTextStream in(&file); + QString sqlContent = in.readAll(); + file.close(); + + QStringList statements = sqlContent.split("\n", Qt::SkipEmptyParts); + + qInfo() << "Executing SQL file:" << filePath; + + return processStatements(statements); +} + +bool ExecuteSqlFile::processStatements(QStringList &statements) { + QString currentStatement; + + for (QString &line : statements) { + qInfo() << "Processing line:" << line; + if (!processLine(line, currentStatement)) { + return false; + } + } + + // Execute any remaining statement + if (!currentStatement.isEmpty() && !executeStatement(currentStatement)) { + return false; + } + + return true; +} + +bool ExecuteSqlFile::processLine(QString &line, QString ¤tStatement) { + if (!filterLine(line)) { + qInfo() << "Line is empty after filtering"; + return true; // Line was empty after filtering + } + + if (processDelimiterChange(line)) { + qInfo() << "Delimiter changed to:" << delimiter_; + return true; + } + + currentStatement += line + " "; + + auto delimiterIndex = currentStatement.lastIndexOf(delimiter_); + if (delimiterIndex == -1) { + qInfo() << "Delimiter not found, current statement is not finished"; + return true; + } + qInfo() << "Statement finished, delimiter found at index:" << delimiterIndex; + + // Execute the current statement + QString completedStatement = + currentStatement.replace(delimiter_, ";").trimmed(); + if (!executeStatement(completedStatement)) { + qWarning() << "Failed to execute statement:" << completedStatement; + return false; // Execution failed + } + qInfo() << "Successfully executed statement:" << completedStatement; + + currentStatement.clear(); + + return true; +} + +bool ExecuteSqlFile::processDelimiterChange(QString &line) { + QRegularExpression regex(R"(^DELIMITER\s+(\S+))"); + QRegularExpressionMatch match = regex.match(line); + if (!match.hasMatch()) { + return false; + } + delimiter_ = match.captured(1); // Update the delimiter_ + return true; +} + +bool ExecuteSqlFile::filterLine(QString &line) { + line = line.section("--", 0, 0).trimmed(); // Remove comments and trim + return !line.isEmpty(); // Return true if line is not empty +} + +bool ExecuteSqlFile::executeStatement(const QString &statement) const { + QSqlQuery query(db_); + if (!query.exec(statement)) { + qWarning() << "Error:" << query.lastError().text(); + return false; + } + return true; +} diff --git a/core/db/execute_sql_file.h b/core/db/execute_sql_file.h new file mode 100644 index 0000000..a8ef9a9 --- /dev/null +++ b/core/db/execute_sql_file.h @@ -0,0 +1,45 @@ +#ifndef EXECUTE_SQL_FILE_H +#define EXECUTE_SQL_FILE_H + +#include +#include +#include +#include +#include +#include + +class ExecuteSqlFile { +private: + QSqlDatabase &db_; // Reference to the database handler + + // Tracks if the parser is inside a trigger block + bool insideTrigger_ = false; + + // Delimiter for SQL statements + QString delimiter_; + +public: + // Constructor to initialize the database handler + explicit ExecuteSqlFile(QSqlDatabase &db); + + // Executes the SQL commands from the given file + bool operator()(const QString &filePath); + +private: + // Executes a single SQL statement + bool executeStatement(const QString &statement) const; + + // Filter out comments and empty lines + bool filterLine(QString &line); + + // Processes the DELIMITER command + bool processDelimiterChange(QString &line); + + // Processes a single line of SQL and updates the current state + bool processLine(QString &line, QString ¤tStatement); + + // Processes a block of SQL statements, handling triggers separately + bool processStatements(QStringList &statements); +}; + +#endif // EXECUTE_SQL_FILE_H diff --git a/core/db/table_info_interface.h b/core/db/table_info_interface.h new file mode 100644 index 0000000..5a0705d --- /dev/null +++ b/core/db/table_info_interface.h @@ -0,0 +1,26 @@ +#ifndef TABLE_INFO_INTERFACE_H +#define TABLE_INFO_INTERFACE_H + +#include +#include + +class TableInfoInterface { +public: + virtual ~TableInfoInterface() {} + + virtual QMetaType::Type + columnMetaType(const QString &columnName) const noexcept = 0; + + virtual QString columnName(qint32 columnIndex) const noexcept = 0; + + virtual QString databaseTableName() const noexcept = 0; + + virtual QStringList columnNames() const noexcept = 0; + + virtual qint32 columnIndex(const QString &columnName) const noexcept = 0; + + virtual void + setDatabaseTableName(const QString &databaseTableName) noexcept = 0; +}; + +#endif diff --git a/core/dto/genre_dto.h b/core/dto/genre_dto.h new file mode 100644 index 0000000..c966b61 --- /dev/null +++ b/core/dto/genre_dto.h @@ -0,0 +1,26 @@ +#ifndef GENRE_DTO_H +#define GENRE_DTO_H + +#include + +class GenreDTO { +private: + QString genreName_; // Genre name + qint32 genreId_; // Unique ID for the genre + +public: + // Constructors + explicit GenreDTO() = default; + explicit GenreDTO(const QString &genreName, qint32 genreId) + : genreId_(genreId), genreName_(genreName) {} + + // Setters (inline methods) + inline void setGenreId(qint32 genreId) { genreId_ = genreId; } + inline void setGenreName(const QString &genreName) { genreName_ = genreName; } + + // Getters (inline methods) + inline qint32 genreId() const { return genreId_; } + inline QString genreName() const { return genreName_; } +}; + +#endif // GENRE_DTO_H diff --git a/core/dto/hall_dto.h b/core/dto/hall_dto.h new file mode 100644 index 0000000..08734d5 --- /dev/null +++ b/core/dto/hall_dto.h @@ -0,0 +1,29 @@ +#ifndef HALL_DTO_H +#define HALL_DTO_H + +#include + +class HallDTO { +private: + QString hallName_; // Hall name + qint32 capacity_; // Hall capacity + qint32 hallId_; // Unique ID for the hall + +public: + // Constructors + explicit HallDTO() = default; + explicit HallDTO(const QString &hallName, qint32 capacity, qint32 hallId) + : hallName_(hallName), capacity_(capacity), hallId_(hallId) {} + + // Setters (inline methods) + inline void setHallName(const QString &hallName) { hallName_ = hallName; } + inline void setCapacity(qint32 capacity) { capacity_ = capacity; } + inline void setHallId(qint32 hallId) { hallId_ = hallId; } + + // Getters (inline methods) + inline QString hallName() const { return hallName_; } + inline qint32 capacity() const { return capacity_; } + inline qint32 hallId() const { return hallId_; } +}; + +#endif // HALL_DTO_H diff --git a/core/dto/movie_dto.h b/core/dto/movie_dto.h new file mode 100644 index 0000000..ce37a4f --- /dev/null +++ b/core/dto/movie_dto.h @@ -0,0 +1,35 @@ +#ifndef MOVIE_DTO_H +#define MOVIE_DTO_H + +#include + +class MovieDTO { +private: + QString title_; // Movie title + qint32 duration_; // Movie duration in minutes + qint32 genreId_; // Genre ID + qint32 movieId_; // Unique ID for the movie + +public: + // Constructors + explicit MovieDTO() = default; + explicit MovieDTO(const QString &title, qint32 duration, qint32 genreId, + qint32 movieId) + : title_(title), duration_(duration), genreId_(genreId), + movieId_(movieId) {} + + // Setters (inline methods) + inline void setTitle(const QString &title) { title_ = title; } + inline void setDuration(qint32 duration) { duration_ = duration; } + inline void setGenreId(qint32 genreId) { genreId_ = genreId; } + inline void setMovieId(qint32 movieId) { movieId_ = movieId; } + + // Getters (inline methods) + inline QString title() const { return title_; } + inline qint32 duration() const { return duration_; } + inline qint32 genreId() const { return genreId_; } + inline qint32 movieId() const { return movieId_; } +}; + +#endif // MOVIE_DTO_H + diff --git a/core/dto/refund_dto.h b/core/dto/refund_dto.h new file mode 100644 index 0000000..4d8f7ef --- /dev/null +++ b/core/dto/refund_dto.h @@ -0,0 +1,37 @@ +#ifndef REFUND_DTO_H +#define REFUND_DTO_H + +#include + +class RefundDTO { +private: + QDateTime refundAt_; // Refund date and time + double refundAmount_; // Refund amount + qint32 refundId_; // Unique ID for the refund + qint32 ticketId_; // Associated ticket ID + +public: + // Constructors + explicit RefundDTO() = default; + explicit RefundDTO(const QDateTime &refundAt, double refundAmount, + qint32 refundId, qint32 ticketId) + : refundAt_(refundAt), refundAmount_(refundAmount), refundId_(refundId), + ticketId_(ticketId) {} + + // Setters (inline methods) + inline void setRefundAt(const QDateTime &refundAt) { refundAt_ = refundAt; } + inline void setRefundAmount(double refundAmount) { + refundAmount_ = refundAmount; + } + inline void setRefundId(qint32 refundId) { refundId_ = refundId; } + inline void setTicketId(qint32 ticketId) { ticketId_ = ticketId; } + + // Getters (inline methods) + inline QDateTime refundAt() const { return refundAt_; } + inline double refundAmount() const { return refundAmount_; } + inline qint32 refundId() const { return refundId_; } + inline qint32 ticketId() const { return ticketId_; } +}; + +#endif // REFUND_DTO_H + diff --git a/core/dto/role_dto.h b/core/dto/role_dto.h new file mode 100644 index 0000000..a9c082d --- /dev/null +++ b/core/dto/role_dto.h @@ -0,0 +1,30 @@ +#ifndef ROLE_DTO_H +#define ROLE_DTO_H + +#include + +class RoleDTO { +private: + QString roleName_; // Name of the role + qint32 accessLevel_; // Access level (permissions) + qint32 roleId_; // Unique ID for the role + +public: + // Constructors + explicit RoleDTO() = default; + explicit RoleDTO(const QString &roleName, qint32 accessLevel, qint32 roleId) + : roleName_(roleName), accessLevel_(accessLevel), roleId_(roleId) {} + + // Setters (inline methods) + inline void setRoleName(const QString &roleName) { roleName_ = roleName; } + inline void setAccessLevel(qint32 accessLevel) { accessLevel_ = accessLevel; } + inline void setRoleId(qint32 roleId) { roleId_ = roleId; } + + // Getters (inline methods) + inline QString roleName() const { return roleName_; } + inline qint32 accessLevel() const { return accessLevel_; } + inline qint32 roleId() const { return roleId_; } +}; + +#endif // ROLE_DTO_H + diff --git a/core/dto/session_dto.h b/core/dto/session_dto.h new file mode 100644 index 0000000..3f14449 --- /dev/null +++ b/core/dto/session_dto.h @@ -0,0 +1,38 @@ +#ifndef SESSION_DTO_H +#define SESSION_DTO_H + +#include + +class SessionDTO { +private: + QDateTime beginAt_; // Session start time + double ticketPrice_; // Ticket price + qint32 hallId_; // Associated hall ID + qint32 movieId_; // Associated movie ID + qint32 sessionId_; // Unique session ID + +public: + // Constructors + explicit SessionDTO() = default; + explicit SessionDTO(const QDateTime &beginAt, double ticketPrice, + qint32 hallId, qint32 movieId, qint32 sessionId) + : beginAt_(beginAt), ticketPrice_(ticketPrice), hallId_(hallId), + movieId_(movieId), sessionId_(sessionId) {} + + // Setters (inline methods) + inline void setBeginAt(const QDateTime &beginAt) { beginAt_ = beginAt; } + inline void setTicketPrice(double ticketPrice) { ticketPrice_ = ticketPrice; } + inline void setHallId(qint32 hallId) { hallId_ = hallId; } + inline void setMovieId(qint32 movieId) { movieId_ = movieId; } + inline void setSessionId(qint32 sessionId) { sessionId_ = sessionId; } + + // Getters (inline methods) + inline QDateTime beginAt() const { return beginAt_; } + inline double ticketPrice() const { return ticketPrice_; } + inline qint32 hallId() const { return hallId_; } + inline qint32 movieId() const { return movieId_; } + inline qint32 sessionId() const { return sessionId_; } +}; + +#endif // SESSION_DTO_H + diff --git a/core/dto/session_statistics_dto.h b/core/dto/session_statistics_dto.h new file mode 100644 index 0000000..1b001ca --- /dev/null +++ b/core/dto/session_statistics_dto.h @@ -0,0 +1,81 @@ +#ifndef SESSION_STATISTICS_DTO_H +#define SESSION_STATISTICS_DTO_H + +#include +#include + +class SessionStatisticsDTO { +private: + qint32 sessionId_; + QDateTime beginAt_; + double ticketPrice_; + qint32 hallId_; + QString hallName_; + qint32 totalSeats_; + qint32 movieId_; + QString movieTitle_; + qint32 duration_; + qint32 genreId_; + QString genreName_; + qint32 soldTickets_; + qint32 refundedTickets_; + double salesRevenue_; + double refundExpenses_; + +public: + SessionStatisticsDTO() = default; + + SessionStatisticsDTO(QDateTime beginAt, QString genreName, QString hallName, + QString movieTitle, double refundExpenses, + double salesRevenue, double ticketPrice, qint32 duration, + qint32 genreId, qint32 hallId, qint32 movieId, + qint32 refundedTickets, qint32 sessionId, + qint32 soldTickets, qint32 totalSeats) + : beginAt_(beginAt), duration_(duration), genreId_(genreId), + genreName_(genreName), hallId_(hallId), hallName_(hallName), + movieId_(movieId), movieTitle_(movieTitle), + refundExpenses_(refundExpenses), refundedTickets_(refundedTickets), + salesRevenue_(salesRevenue), sessionId_(sessionId), + soldTickets_(soldTickets), ticketPrice_(ticketPrice), + totalSeats_(totalSeats) {} + + // clang-format off + + // Getters + inline QDateTime beginAt() const { return beginAt_; } + inline QString genreName() const { return genreName_; } + inline QString hallName() const { return hallName_; } + inline QString movieTitle() const { return movieTitle_; } + inline double refundExpenses() const { return refundExpenses_; } + inline double salesRevenue() const { return salesRevenue_; } + inline double ticketPrice() const { return ticketPrice_; } + inline qint32 duration() const { return duration_; } + inline qint32 genreId() const { return genreId_; } + inline qint32 hallId() const { return hallId_; } + inline qint32 movieId() const { return movieId_; } + inline qint32 refundedTickets() const { return refundedTickets_; } + inline qint32 sessionId() const { return sessionId_; } + inline qint32 soldTickets() const { return soldTickets_; } + inline qint32 totalSeats() const { return totalSeats_; } + + // Setters + inline void setBeginAt(QDateTime beginAt) { beginAt_ = beginAt; } + inline void setDuration(qint32 duration) { duration_ = duration; } + inline void setGenreId(qint32 genreId) { genreId_ = genreId; } + inline void setGenreName(QString genreName) { genreName_ = genreName; } + inline void setHallId(qint32 hallId) { hallId_ = hallId; } + inline void setHallName(QString hallName) { hallName_ = hallName; } + inline void setMovieId(qint32 movieId) { movieId_ = movieId; } + inline void setMovieTitle(QString movieTitle) { movieTitle_ = movieTitle; } + inline void setRefundExpenses(double refundExpenses) { refundExpenses_ = refundExpenses; } + inline void setRefundedTickets(qint32 refundedTickets) { refundedTickets_ = refundedTickets; } + inline void setSalesRevenue(double salesRevenue) { salesRevenue_ = salesRevenue; } + inline void setSessionId(qint32 sessionId) { sessionId_ = sessionId; } + inline void setSoldTickets(qint32 soldTickets) { soldTickets_ = soldTickets; } + inline void setTicketPrice(double ticketPrice) { ticketPrice_ = ticketPrice; } + inline void setTotalSeats(qint32 totalSeats) { totalSeats_ = totalSeats; } + + // clang-format on +}; + +#endif // SESSION_STATISTICS_DTO_H diff --git a/core/dto/ticket_dto.h b/core/dto/ticket_dto.h new file mode 100644 index 0000000..b23c770 --- /dev/null +++ b/core/dto/ticket_dto.h @@ -0,0 +1,35 @@ +#ifndef TICKET_DTO_H +#define TICKET_DTO_H + +#include + +class TicketDTO { +private: + QDateTime soldAt_; // Ticket sold time + qint32 seatNumber_; // Seat number + qint32 sessionId_; // Session ID + qint32 ticketId_; // Unique ticket ID + +public: + // Constructors + explicit TicketDTO() = default; + explicit TicketDTO(const QDateTime &soldAt, qint32 seatNumber, + qint32 sessionId, qint32 ticketId) + : soldAt_(soldAt), seatNumber_(seatNumber), sessionId_(sessionId), + ticketId_(ticketId) {} + + // Setters (inline methods) + inline void setSeatNumber(qint32 seatNumber) { seatNumber_ = seatNumber; } + inline void setSessionId(qint32 sessionId) { sessionId_ = sessionId; } + inline void setSoldAt(const QDateTime &soldAt) { soldAt_ = soldAt; } + inline void setTicketId(qint32 ticketId) { ticketId_ = ticketId; } + + // Getters (inline methods) + inline QDateTime soldAt() const { return soldAt_; } + inline qint32 seatNumber() const { return seatNumber_; } + inline qint32 sessionId() const { return sessionId_; } + inline qint32 ticketId() const { return ticketId_; } +}; + +#endif // TICKET_DTO_H + diff --git a/core/dto/user_dto.h b/core/dto/user_dto.h new file mode 100644 index 0000000..1e96f87 --- /dev/null +++ b/core/dto/user_dto.h @@ -0,0 +1,40 @@ +#ifndef USER_DTO_H +#define USER_DTO_H + +#include + +class UserDTO { +private: + QString passwordHash_; // Hashed password + QString salt_; // Salt for password hashing + QString username_; // Username + qint32 roleId_; // Role ID + qint32 userId_; // Unique user ID + +public: + // Constructors + explicit UserDTO() = default; + explicit UserDTO(const QString &passwordHash, const QString &salt, + const QString &username, qint32 roleId, qint32 userId) + : passwordHash_(passwordHash), roleId_(roleId), salt_(salt), + userId_(userId), username_(username) {} + + // Setters (inline methods) + inline void setPasswordHash(const QString &passwordHash) { + passwordHash_ = passwordHash; + } + inline void setRoleId(qint32 roleId) { roleId_ = roleId; } + inline void setSalt(const QString &salt) { salt_ = salt; } + inline void setUserId(qint32 userId) { userId_ = userId; } + inline void setUsername(const QString &username) { username_ = username; } + + // Getters (inline methods) + inline QString passwordHash() const { return passwordHash_; } + inline QString salt() const { return salt_; } + inline QString username() const { return username_; } + inline qint32 roleId() const { return roleId_; } + inline qint32 userId() const { return userId_; } +}; + +#endif // USER_DTO_H + diff --git a/core/repositories/genres_repository_interface.h b/core/repositories/genres_repository_interface.h new file mode 100644 index 0000000..d026bb2 --- /dev/null +++ b/core/repositories/genres_repository_interface.h @@ -0,0 +1,34 @@ +#ifndef GENRES_REPOSITORY_INTERFACE_H +#define GENRES_REPOSITORY_INTERFACE_H + +#include "repository_interface.h" + +#include + +// Forward declarations +struct CreateGenreRequest; +struct GenreDTO; +struct UpdateGenreRequest; +struct RepositoryResult; + +// Interface for genres repository +class GenresRepositoryInterface : public RepositoryInterface { +public: + // Create a new genre + virtual RepositoryResult createGenre(const CreateGenreRequest &request) = 0; + + // Retrieve a genre by ID + virtual RepositoryResult getGenreById(qint32 genreId, + GenreDTO &genre) const = 0; + + // Retrieve all genres + virtual RepositoryResult getAllGenres(QVector &genres) const = 0; + + // Update an existing genre + virtual RepositoryResult updateGenre(const UpdateGenreRequest &request) = 0; + + // Delete a genre by ID + virtual RepositoryResult deleteGenreById(qint32 genreId) = 0; +}; + +#endif // GENRES_REPOSITORY_INTERFACE_H diff --git a/core/repositories/halls_repository_interface.h b/core/repositories/halls_repository_interface.h new file mode 100644 index 0000000..938f19e --- /dev/null +++ b/core/repositories/halls_repository_interface.h @@ -0,0 +1,33 @@ +#ifndef HALLS_REPOSITORY_INTERFACE_H +#define HALLS_REPOSITORY_INTERFACE_H + +#include "repository_interface.h" + +#include + +// Forward declarations +struct CreateHallRequest; +struct HallDTO; +struct RepositoryResult; +struct UpdateHallRequest; + +// Interface for halls repository +class HallsRepositoryInterface : public RepositoryInterface { +public: + // Create a new hall + virtual RepositoryResult createHall(const CreateHallRequest &request) = 0; + + // Retrieve a hall by ID + virtual RepositoryResult getHallById(qint32 hallId, HallDTO &hall) const = 0; + + // Retrieve all halls + virtual RepositoryResult getAllHalls(QVector &halls) const = 0; + + // Update an existing hall + virtual RepositoryResult updateHall(const UpdateHallRequest &request) = 0; + + // Delete a hall by ID + virtual RepositoryResult deleteHallById(qint32 hallId) = 0; +}; + +#endif // HALLS_REPOSITORY_INTERFACE_H diff --git a/core/repositories/movies_repository_interface.h b/core/repositories/movies_repository_interface.h new file mode 100644 index 0000000..5fef555 --- /dev/null +++ b/core/repositories/movies_repository_interface.h @@ -0,0 +1,34 @@ +#ifndef MOVIES_REPOSITORY_INTERFACE_H +#define MOVIES_REPOSITORY_INTERFACE_H + +#include "repository_interface.h" + +#include + +// Forward declarations +struct CreateMovieRequest; +struct MovieDTO; +struct RepositoryResult; +struct UpdateMovieRequest; + +// Interface for movies repository +class MoviesRepositoryInterface : public RepositoryInterface { +public: + // Create a new movie + virtual RepositoryResult createMovie(const CreateMovieRequest &request) = 0; + + // Retrieve a movie by ID + virtual RepositoryResult getMovieById(qint32 movieId, + MovieDTO &movie) const = 0; + + // Retrieve all movies + virtual RepositoryResult getAllMovies(QVector &movies) const = 0; + + // Update an existing movie + virtual RepositoryResult updateMovie(const UpdateMovieRequest &request) = 0; + + // Delete a movie by ID + virtual RepositoryResult deleteMovieById(qint32 movieId) = 0; +}; + +#endif // MOVIES_REPOSITORY_INTERFACE_H diff --git a/core/repositories/refunds_repository_interface.h b/core/repositories/refunds_repository_interface.h new file mode 100644 index 0000000..bb05f7e --- /dev/null +++ b/core/repositories/refunds_repository_interface.h @@ -0,0 +1,34 @@ +#ifndef REFUNDS_REPOSITORY_INTERFACE_H +#define REFUNDS_REPOSITORY_INTERFACE_H + +#include "repository_interface.h" + +#include + +// Forward declarations +struct CreateRefundRequest; +struct RefundDTO; +struct RepositoryResult; +struct UpdateRefundRequest; + +// Interface for refunds repository +class RefundsRepositoryInterface : public RepositoryInterface { +public: + // Create a new refund + virtual RepositoryResult createRefund(const CreateRefundRequest &request) = 0; + + // Retrieve a refund by ID + virtual RepositoryResult getRefundById(qint32 refundId, + RefundDTO &refund) const = 0; + + // Retrieve all refunds + virtual RepositoryResult getAllRefunds(QVector &refunds) const = 0; + + // Update an existing refund + virtual RepositoryResult updateRefund(const UpdateRefundRequest &request) = 0; + + // Delete a refund by ID + virtual RepositoryResult deleteRefundById(qint32 refundId) = 0; +}; + +#endif // REFUNDS_REPOSITORY_INTERFACE_H diff --git a/core/repositories/repository_interface.h b/core/repositories/repository_interface.h new file mode 100644 index 0000000..049cacf --- /dev/null +++ b/core/repositories/repository_interface.h @@ -0,0 +1,11 @@ +#ifndef REPOSITORY_INTERFACE_H +#define REPOSITORY_INTERFACE_H + +#include + +class RepositoryInterface { +public: + virtual ~RepositoryInterface() = default; +}; + +#endif // REPOSITORY_INTERFACE_H diff --git a/core/repositories/repository_result.cpp b/core/repositories/repository_result.cpp new file mode 100644 index 0000000..7c6eec1 --- /dev/null +++ b/core/repositories/repository_result.cpp @@ -0,0 +1,7 @@ +#include "repository_result.h" + +RepositoryResult RepositoryResult::successResult() { return {"", true}; } + +RepositoryResult RepositoryResult::failureResult(const QString &error) { + return {error, false}; +} diff --git a/core/repositories/repository_result.h b/core/repositories/repository_result.h new file mode 100644 index 0000000..f5f3f74 --- /dev/null +++ b/core/repositories/repository_result.h @@ -0,0 +1,18 @@ +#ifndef REPOSITORY_RESULT_H +#define REPOSITORY_RESULT_H + +#include + +// Represents the result of an operation in a repository +struct RepositoryResult { + QString errorMessage; // Error message if the operation failed + bool success; // Indicates whether the operation was successful + + // Creates a successful result + static RepositoryResult successResult(); + + // Creates a failed result with an error message + static RepositoryResult failureResult(const QString &error); +}; + +#endif // REPOSITORY_RESULT_H diff --git a/core/repositories/roles_repository_interface.h b/core/repositories/roles_repository_interface.h new file mode 100644 index 0000000..2686d4b --- /dev/null +++ b/core/repositories/roles_repository_interface.h @@ -0,0 +1,33 @@ +#ifndef ROLES_REPOSITORY_INTERFACE_H +#define ROLES_REPOSITORY_INTERFACE_H + +#include "create_role_request.h" +#include "repository_interface.h" +#include "update_role_request.h" + +#include + +// Forward declarations +struct RepositoryResult; +struct RoleDTO; + +// Interface for sessions repository +class RolesRepositoryInterface : public RepositoryInterface { +public: + // Create a new role + virtual RepositoryResult createRole(const CreateRoleRequest &request) = 0; + + // Retrieve a role by ID + virtual RepositoryResult getRoleById(qint32 roleId, RoleDTO &role) const = 0; + + // Retrieve all roles + virtual RepositoryResult getAllRoles(QVector &roles) const = 0; + + // Update an existing role + virtual RepositoryResult updateRole(const UpdateRoleRequest &request) = 0; + + // Delete a role by ID + virtual RepositoryResult deleteRoleById(qint32 roleId) = 0; +}; + +#endif // ROLES_REPOSITORY_INTERFACE_H diff --git a/core/repositories/sessions_repository_interface.h b/core/repositories/sessions_repository_interface.h new file mode 100644 index 0000000..dcbbd00 --- /dev/null +++ b/core/repositories/sessions_repository_interface.h @@ -0,0 +1,37 @@ +#ifndef SESSIONS_REPOSITORY_INTERFACE_H +#define SESSIONS_REPOSITORY_INTERFACE_H + +#include "repository_interface.h" + +#include + +// Forward declarations +struct CreateSessionRequest; +struct RepositoryResult; +struct SessionDTO; +struct UpdateSessionRequest; + +// Interface for sessions repository +class SessionsRepositoryInterface : public RepositoryInterface { +public: + // Create a new session + virtual RepositoryResult + createSession(const CreateSessionRequest &request) = 0; + + // Retrieve a session by ID + virtual RepositoryResult getSessionById(qint32 sessionId, + SessionDTO &session) const = 0; + + // Retrieve all sessions + virtual RepositoryResult + getAllSessions(QVector &sessions) const = 0; + + // Update an existing session + virtual RepositoryResult + updateSession(const UpdateSessionRequest &request) = 0; + + // Delete a session by ID + virtual RepositoryResult deleteSessionById(qint32 sessionId) = 0; +}; + +#endif // SESSIONS_REPOSITORY_INTERFACE_H diff --git a/core/repositories/sessions_statistics_repository_interface.h b/core/repositories/sessions_statistics_repository_interface.h new file mode 100644 index 0000000..fa37937 --- /dev/null +++ b/core/repositories/sessions_statistics_repository_interface.h @@ -0,0 +1,38 @@ +#ifndef SESSIONS_STATICTICS_REPOSITORY_INTERFACE_H +#define SESSIONS_STATICTICS_REPOSITORY_INTERFACE_H + +#include "repository_interface.h" +#include +#include + +// Forward declaration +class SessionStatisticsDTO; +class RepositoryResult; + +class SessionsStatisticsRepositoryInterface : public RepositoryInterface { +public: + virtual ~SessionsStatisticsRepositoryInterface() = default; + + virtual RepositoryResult + getSessionById(qint32 sessionid, SessionStatisticsDTO &sessionInfo) const = 0; + + virtual RepositoryResult + getSessionsForGenre(qint32 genreId, std::optional startDate, + std::optional endDate, + QVector &sessions) const = 0; + + virtual RepositoryResult + getSessionsForHall(qint32 hallId, std::optional startDate, + std::optional endDate, + QVector &sessions) const = 0; + + virtual RepositoryResult + getSessionsForMovie(qint32 movieId, std::optional startDate, + std::optional endDate, + QVector &sessions) const = 0; + + virtual RepositoryResult + getAllSessions(QVector &sessions) const = 0; +}; + +#endif // SESSIONS_STATICTICS_REPOSITORY_INTERFACE_H diff --git a/core/repositories/tickets_repository_interface.h b/core/repositories/tickets_repository_interface.h new file mode 100644 index 0000000..6f4829a --- /dev/null +++ b/core/repositories/tickets_repository_interface.h @@ -0,0 +1,34 @@ +#ifndef TICKETS_REPOSITORY_INTERFACE_H +#define TICKETS_REPOSITORY_INTERFACE_H + +#include "repository_interface.h" + +#include + +// Forward declarations +struct CreateTicketRequest; +struct TicketDTO; +struct RepositoryResult; +struct UpdateTicketRequest; + +// Interface for tickets repository +class TicketsRepositoryInterface : public RepositoryInterface { +public: + // Create a new ticket + virtual RepositoryResult createTicket(const CreateTicketRequest &request) = 0; + + // Retrieve a ticket by ID + virtual RepositoryResult getTicketById(qint32 ticketId, + TicketDTO &ticket) const = 0; + + // Retrieve all tickets + virtual RepositoryResult getAllTickets(QVector &tickets) const = 0; + + // Update an existing ticket + virtual RepositoryResult updateTicket(const UpdateTicketRequest &request) = 0; + + // Delete a ticket by ID + virtual RepositoryResult deleteTicketById(qint32 ticketId) = 0; +}; + +#endif // TICKETS_REPOSITORY_INTERFACE_H diff --git a/core/repositories/users_repository_interface.h b/core/repositories/users_repository_interface.h new file mode 100644 index 0000000..abaed40 --- /dev/null +++ b/core/repositories/users_repository_interface.h @@ -0,0 +1,37 @@ +#ifndef USERS_REPOSITORY_INTERFACE_H +#define USERS_REPOSITORY_INTERFACE_H + +#include "create_user_request.h" +#include "repository_interface.h" +#include "update_user_request.h" + +#include + +// Forward declarations +struct RepositoryResult; +struct UserDTO; + +// Interface for sessions repository +class UsersRepositoryInterface : public RepositoryInterface { +public: + // Create a new user + virtual RepositoryResult createUser(const CreateUserRequest &request) = 0; + + // Retrieve a user by ID + virtual RepositoryResult getUserById(qint32 userId, UserDTO &user) const = 0; + + // Retrieve a user by username + virtual RepositoryResult getUserByUsername(const QString &username, + UserDTO &user) const = 0; + + // Retrieve all users + virtual RepositoryResult getAllUsers(QVector &users) const = 0; + + // Update an existing user + virtual RepositoryResult updateUser(const UpdateUserRequest &request) = 0; + + // Delete a user by ID + virtual RepositoryResult deleteUserById(qint32 userId) = 0; +}; + +#endif // USERS_REPOSITORY_INTERFACE_H diff --git a/core/requests/create_genre_request.h b/core/requests/create_genre_request.h new file mode 100644 index 0000000..300497b --- /dev/null +++ b/core/requests/create_genre_request.h @@ -0,0 +1,24 @@ +#ifndef CREATE_GENRE_REQUEST_H +#define CREATE_GENRE_REQUEST_H + +#include + +class CreateGenreRequest { +private: + QString genreName_; // Genre name + +public: + // Constructors + explicit CreateGenreRequest() = default; + explicit CreateGenreRequest(const QString &genreName) + : genreName_(genreName) {} + + // Setters (inline methods) + inline void setGenreName(const QString &genreName) { genreName_ = genreName; } + + // Getters (inline methods) + inline QString genreName() const { return genreName_; } +}; + +#endif // CREATE_GENRE_REQUEST_H + diff --git a/core/requests/create_hall_request.h b/core/requests/create_hall_request.h new file mode 100644 index 0000000..0b9c0fe --- /dev/null +++ b/core/requests/create_hall_request.h @@ -0,0 +1,26 @@ +#ifndef CREATE_HALL_REQUEST_H +#define CREATE_HALL_REQUEST_H + +#include + +class CreateHallRequest { +private: + QString hallName_; // Hall name + qint32 capacity_; // Hall capacity + +public: + // Constructors + explicit CreateHallRequest() = default; + explicit CreateHallRequest(const QString &hallName, qint32 capacity) + : hallName_(hallName), capacity_(capacity) {} + + // Setters (inline methods) + inline void setHallName(const QString &hallName) { hallName_ = hallName; } + inline void setCapacity(qint32 capacity) { capacity_ = capacity; } + + // Getters (inline methods) + inline QString hallName() const { return hallName_; } + inline qint32 capacity() const { return capacity_; } +}; + +#endif // CREATE_HALL_REQUEST_H diff --git a/core/requests/create_movie_request.h b/core/requests/create_movie_request.h new file mode 100644 index 0000000..7d4af94 --- /dev/null +++ b/core/requests/create_movie_request.h @@ -0,0 +1,30 @@ +#ifndef CREATE_MOVIE_REQUEST_H +#define CREATE_MOVIE_REQUEST_H + +#include + +class CreateMovieRequest { +private: + QString title_; // Movie title + qint32 duration_; // Movie duration + qint32 genreId_; // Genre ID + +public: + // Constructors + explicit CreateMovieRequest() = default; + explicit CreateMovieRequest(const QString &title, qint32 duration, + qint32 genreId) + : title_(title), duration_(duration), genreId_(genreId) {} + + // Setters (inline methods) + inline void setTitle(const QString &title) { title_ = title; } + inline void setDuration(qint32 duration) { duration_ = duration; } + inline void setGenreId(qint32 genreId) { genreId_ = genreId; } + + // Getters (inline methods) + inline QString title() const { return title_; } + inline qint32 duration() const { return duration_; } + inline qint32 genreId() const { return genreId_; } +}; + +#endif // CREATE_MOVIE_REQUEST_H diff --git a/core/requests/create_refund_request.h b/core/requests/create_refund_request.h new file mode 100644 index 0000000..a47c929 --- /dev/null +++ b/core/requests/create_refund_request.h @@ -0,0 +1,32 @@ +#ifndef CREATE_REFUND_REQUEST_H +#define CREATE_REFUND_REQUEST_H + +#include + +class CreateRefundRequest { +private: + QDateTime refundAt_; // Refund date and time + double refundAmount_; // Refund amount + qint32 ticketId_; // Ticket ID + +public: + // Constructors + explicit CreateRefundRequest() = default; + explicit CreateRefundRequest(const QDateTime &refundAt, double refundAmount, + qint32 ticketId) + : refundAt_(refundAt), refundAmount_(refundAmount), ticketId_(ticketId) {} + + // Setters (inline methods) + inline void setRefundAt(const QDateTime &refundAt) { refundAt_ = refundAt; } + inline void setRefundAmount(double refundAmount) { + refundAmount_ = refundAmount; + } + inline void setTicketId(qint32 ticketId) { ticketId_ = ticketId; } + + // Getters (inline methods) + inline QDateTime refundAt() const { return refundAt_; } + inline double refundAmount() const { return refundAmount_; } + inline qint32 ticketId() const { return ticketId_; } +}; + +#endif // CREATE_REFUND_REQUEST_H diff --git a/core/requests/create_role_request.h b/core/requests/create_role_request.h new file mode 100644 index 0000000..5ca6e1f --- /dev/null +++ b/core/requests/create_role_request.h @@ -0,0 +1,27 @@ +#ifndef CREATE_ROLE_REQUEST_H +#define CREATE_ROLE_REQUEST_H + +#include + +class CreateRoleRequest { +private: + QString roleName_; // Role name + qint32 accessLevel_; // Access level + +public: + // Constructors + explicit CreateRoleRequest() = default; + explicit CreateRoleRequest(const QString &roleName, qint32 accessLevel) + : roleName_(roleName), accessLevel_(accessLevel) {} + + // Setters (inline methods) + inline void setRoleName(const QString &roleName) { roleName_ = roleName; } + inline void setAccessLevel(qint32 accessLevel) { accessLevel_ = accessLevel; } + + // Getters (inline methods) + inline QString roleName() const { return roleName_; } + inline qint32 accessLevel() const { return accessLevel_; } +}; + +#endif // CREATE_ROLE_REQUEST_H + diff --git a/core/requests/create_session_request.h b/core/requests/create_session_request.h new file mode 100644 index 0000000..b089475 --- /dev/null +++ b/core/requests/create_session_request.h @@ -0,0 +1,34 @@ +#ifndef CREATE_SESSION_REQUEST_H +#define CREATE_SESSION_REQUEST_H + +#include + +class CreateSessionRequest { +private: + QDateTime beginAt_; // Session start time + double ticketPrice_; // Ticket price + qint32 hallId_; // Hall ID + qint32 movieId_; // Movie ID + +public: + // Constructors + explicit CreateSessionRequest() = default; + explicit CreateSessionRequest(const QDateTime &beginAt, double ticketPrice, + qint32 hallId, qint32 movieId) + : beginAt_(beginAt), ticketPrice_(ticketPrice), hallId_(hallId), + movieId_(movieId) {} + + // Setters (inline methods) + inline void setBeginAt(const QDateTime &beginAt) { beginAt_ = beginAt; } + inline void setTicketPrice(double ticketPrice) { ticketPrice_ = ticketPrice; } + inline void setHallId(qint32 hallId) { hallId_ = hallId; } + inline void setMovieId(qint32 movieId) { movieId_ = movieId; } + + // Getters (inline methods) + inline QDateTime beginAt() const { return beginAt_; } + inline double ticketPrice() const { return ticketPrice_; } + inline qint32 hallId() const { return hallId_; } + inline qint32 movieId() const { return movieId_; } +}; + +#endif // CREATE_SESSION_REQUEST_H diff --git a/core/requests/create_ticket_request.h b/core/requests/create_ticket_request.h new file mode 100644 index 0000000..a884071 --- /dev/null +++ b/core/requests/create_ticket_request.h @@ -0,0 +1,30 @@ +#ifndef CREATE_TICKET_REQUEST_H +#define CREATE_TICKET_REQUEST_H + +#include + +class CreateTicketRequest { +private: + QDateTime soldAt_; // Ticket sold date and time + qint32 seatNumber_; // Seat number + qint32 sessionId_; // Session ID + +public: + // Constructors + explicit CreateTicketRequest() = default; + explicit CreateTicketRequest(const QDateTime &soldAt, qint32 seatNumber, + qint32 sessionId) + : soldAt_(soldAt), seatNumber_(seatNumber), sessionId_(sessionId) {} + + // Setters (inline methods) + inline void setSoldAt(const QDateTime &soldAt) { soldAt_ = soldAt; } + inline void setSeatNumber(qint32 seatNumber) { seatNumber_ = seatNumber; } + inline void setSessionId(qint32 sessionId) { sessionId_ = sessionId; } + + // Getters (inline methods) + inline QDateTime soldAt() const { return soldAt_; } + inline qint32 seatNumber() const { return seatNumber_; } + inline qint32 sessionId() const { return sessionId_; } +}; + +#endif // CREATE_TICKET_REQUEST_H diff --git a/core/requests/create_user_request.h b/core/requests/create_user_request.h new file mode 100644 index 0000000..e4f9f05 --- /dev/null +++ b/core/requests/create_user_request.h @@ -0,0 +1,36 @@ +#ifndef CREATE_USER_REQUEST_H +#define CREATE_USER_REQUEST_H + +#include + +class CreateUserRequest { +private: + QString passwordHash_; // Hashed password + QString salt_; // Salt for password hashing + QString username_; // Username + qint32 roleId_; // Role ID + +public: + // Constructors + explicit CreateUserRequest() = default; + explicit CreateUserRequest(const QString &passwordHash, const QString &salt, + const QString &username, qint32 roleId) + : passwordHash_(passwordHash), roleId_(roleId), salt_(salt), + username_(username) {} + + // Setters (inline methods) + inline void setUsername(const QString &username) { username_ = username; } + inline void setPasswordHash(const QString &passwordHash) { + passwordHash_ = passwordHash; + } + inline void setSalt(const QString &salt) { salt_ = salt; } + inline void setRoleId(qint32 roleId) { roleId_ = roleId; } + + // Getters (inline methods) + inline QString username() const { return username_; } + inline QString passwordHash() const { return passwordHash_; } + inline QString salt() const { return salt_; } + inline qint32 roleId() const { return roleId_; } +}; + +#endif // CREATE_USER_REQUEST_H diff --git a/core/requests/update_genre_request.h b/core/requests/update_genre_request.h new file mode 100644 index 0000000..d12cddb --- /dev/null +++ b/core/requests/update_genre_request.h @@ -0,0 +1,26 @@ +#ifndef UPDATE_GENRE_REQUEST_H +#define UPDATE_GENRE_REQUEST_H + +#include + +class UpdateGenreRequest { +private: + QString genreName_; // Genre name + qint32 genreId_; // Genre ID + +public: + // Constructors + explicit UpdateGenreRequest() = default; + explicit UpdateGenreRequest(const QString &genreName, qint32 genreId) + : genreName_(genreName), genreId_(genreId) {} + + // Setters (inline methods) + inline void setGenreId(qint32 genreId) { genreId_ = genreId; } + inline void setGenreName(const QString &genreName) { genreName_ = genreName; } + + // Getters (inline methods) + inline qint32 genreId() const { return genreId_; } + inline QString genreName() const { return genreName_; } +}; + +#endif // UPDATE_GENRE_REQUEST_H diff --git a/core/requests/update_hall_request.h b/core/requests/update_hall_request.h new file mode 100644 index 0000000..e803ba6 --- /dev/null +++ b/core/requests/update_hall_request.h @@ -0,0 +1,30 @@ +#ifndef UPDATE_HALL_REQUEST_H +#define UPDATE_HALL_REQUEST_H + +#include + +class UpdateHallRequest { +private: + QString hallName_; // Hall name + qint32 capacity_; // Hall capacity + qint32 hallId_; // Hall ID + +public: + // Constructors + explicit UpdateHallRequest() = default; + explicit UpdateHallRequest(const QString &hallName, qint32 capacity, + qint32 hallId) + : capacity_(capacity), hallId_(hallId), hallName_(hallName) {} + + // Setters (inline methods) + inline void setHallId(qint32 hallId) { hallId_ = hallId; } + inline void setHallName(const QString &hallName) { hallName_ = hallName; } + inline void setCapacity(qint32 capacity) { capacity_ = capacity; } + + // Getters (inline methods) + inline qint32 hallId() const { return hallId_; } + inline QString hallName() const { return hallName_; } + inline qint32 capacity() const { return capacity_; } +}; + +#endif // UPDATE_HALL_REQUEST_H diff --git a/core/requests/update_movie_request.h b/core/requests/update_movie_request.h new file mode 100644 index 0000000..5754032 --- /dev/null +++ b/core/requests/update_movie_request.h @@ -0,0 +1,35 @@ +#ifndef UPDATE_MOVIE_REQUEST_H +#define UPDATE_MOVIE_REQUEST_H + +#include + +class UpdateMovieRequest { +private: + QString title_; // Movie title + qint32 duration_; // Movie duration + qint32 genreId_; // Genre ID + qint32 movieId_; // Movie ID + +public: + // Constructors + explicit UpdateMovieRequest() = default; + explicit UpdateMovieRequest(qint32 movieId, const QString &title, + qint32 duration, qint32 genreId) + : movieId_(movieId), title_(title), duration_(duration), + genreId_(genreId) {} + + // Setters (inline methods) + inline void setDuration(qint32 duration) { duration_ = duration; } + inline void setGenreId(qint32 genreId) { genreId_ = genreId; } + inline void setMovieId(qint32 movieId) { movieId_ = movieId; } + inline void setTitle(const QString &title) { title_ = title; } + + // Getters (inline methods) + inline QString title() const { return title_; } + inline qint32 duration() const { return duration_; } + inline qint32 genreId() const { return genreId_; } + inline qint32 movieId() const { return movieId_; } +}; + +#endif // UPDATE_MOVIE_REQUEST_H + diff --git a/core/requests/update_refund_request.h b/core/requests/update_refund_request.h new file mode 100644 index 0000000..0a0bb8b --- /dev/null +++ b/core/requests/update_refund_request.h @@ -0,0 +1,37 @@ +#ifndef UPDATE_REFUND_REQUEST_H +#define UPDATE_REFUND_REQUEST_H + +#include + +class UpdateRefundRequest { +private: + QDateTime refundAt_; // Refund date and time + double refundAmount_; // Refund amount + qint32 refundId_; // Refund ID + qint32 ticketId_; // Ticket ID + +public: + // Constructors + explicit UpdateRefundRequest() = default; + explicit UpdateRefundRequest(const QDateTime &refundAt, double refundAmount, + qint32 refundId, qint32 ticketId) + : refundAmount_(refundAmount), refundAt_(refundAt), refundId_(refundId), + ticketId_(ticketId) {} + + // Setters (inline methods) + inline void setRefundAmount(double refundAmount) { + refundAmount_ = refundAmount; + } + inline void setRefundAt(const QDateTime &refundAt) { refundAt_ = refundAt; } + inline void setRefundId(qint32 refundId) { refundId_ = refundId; } + inline void setTicketId(qint32 ticketId) { ticketId_ = ticketId; } + + // Getters (inline methods) + inline QDateTime refundAt() const { return refundAt_; } + inline double refundAmount() const { return refundAmount_; } + inline qint32 refundId() const { return refundId_; } + inline qint32 ticketId() const { return ticketId_; } +}; + +#endif // UPDATE_REFUND_REQUEST_H + diff --git a/core/requests/update_role_request.h b/core/requests/update_role_request.h new file mode 100644 index 0000000..5c297b0 --- /dev/null +++ b/core/requests/update_role_request.h @@ -0,0 +1,30 @@ +#ifndef UPDATE_ROLE_REQUEST_H +#define UPDATE_ROLE_REQUEST_H + +#include + +class UpdateRoleRequest { +private: + QString roleName_; // Role name + qint32 accessLevel_; // Access level + qint32 roleId_; // Role ID + +public: + // Constructors + explicit UpdateRoleRequest() = default; + explicit UpdateRoleRequest(const QString &roleName, qint32 accessLevel, + qint32 roleId) + : accessLevel_(accessLevel), roleId_(roleId), roleName_(roleName) {} + + // Setters (inline methods) + inline void setRoleId(qint32 roleId) { roleId_ = roleId; } + inline void setRoleName(const QString &roleName) { roleName_ = roleName; } + inline void setAccessLevel(qint32 accessLevel) { accessLevel_ = accessLevel; } + + // Getters (inline methods) + inline qint32 roleId() const { return roleId_; } + inline QString roleName() const { return roleName_; } + inline qint32 accessLevel() const { return accessLevel_; } +}; + +#endif // UPDATE_ROLE_REQUEST_H diff --git a/core/requests/update_session_request.h b/core/requests/update_session_request.h new file mode 100644 index 0000000..0e58dff --- /dev/null +++ b/core/requests/update_session_request.h @@ -0,0 +1,38 @@ +#ifndef UPDATE_SESSION_REQUEST_H +#define UPDATE_SESSION_REQUEST_H + +#include + +class UpdateSessionRequest { +private: + QDateTime beginAt_; // Session start time + double ticketPrice_; // Ticket price + qint32 hallId_; // Hall ID + qint32 movieId_; // Movie ID + qint32 sessionId_; // Session ID + +public: + // Constructors + explicit UpdateSessionRequest() = default; + explicit UpdateSessionRequest(const QDateTime &beginAt, double ticketPrice, + qint32 hallId, qint32 movieId, qint32 sessionId) + : beginAt_(beginAt), hallId_(hallId), movieId_(movieId), + sessionId_(sessionId), ticketPrice_(ticketPrice) {} + + // Setters (inline methods) + inline void setBeginAt(const QDateTime &beginAt) { beginAt_ = beginAt; } + inline void setHallId(qint32 hallId) { hallId_ = hallId; } + inline void setMovieId(qint32 movieId) { movieId_ = movieId; } + inline void setSessionId(qint32 sessionId) { sessionId_ = sessionId; } + inline void setTicketPrice(double ticketPrice) { ticketPrice_ = ticketPrice; } + + // Getters (inline methods) + inline QDateTime beginAt() const { return beginAt_; } + inline double ticketPrice() const { return ticketPrice_; } + inline qint32 hallId() const { return hallId_; } + inline qint32 movieId() const { return movieId_; } + inline qint32 sessionId() const { return sessionId_; } +}; + +#endif // UPDATE_SESSION_REQUEST_H + diff --git a/core/requests/update_ticket_request.h b/core/requests/update_ticket_request.h new file mode 100644 index 0000000..e748411 --- /dev/null +++ b/core/requests/update_ticket_request.h @@ -0,0 +1,35 @@ +#ifndef UPDATE_TICKET_REQUEST_H +#define UPDATE_TICKET_REQUEST_H + +#include + +class UpdateTicketRequest { +private: + QDateTime soldAt_; // Ticket sold date and time + qint32 seatNumber_; // Seat number + qint32 sessionId_; // Session ID + qint32 ticketId_; // Ticket ID + +public: + // Constructors + explicit UpdateTicketRequest() = default; + explicit UpdateTicketRequest(const QDateTime &soldAt, qint32 seatNumber, + qint32 sessionId, qint32 ticketId) + : seatNumber_(seatNumber), sessionId_(sessionId), soldAt_(soldAt), + ticketId_(ticketId) {} + + // Setters (inline methods) + inline void setSeatNumber(qint32 seatNumber) { seatNumber_ = seatNumber; } + inline void setSessionId(qint32 sessionId) { sessionId_ = sessionId; } + inline void setSoldAt(const QDateTime &soldAt) { soldAt_ = soldAt; } + inline void setTicketId(qint32 ticketId) { ticketId_ = ticketId; } + + // Getters (inline methods) + inline QDateTime soldAt() const { return soldAt_; } + inline qint32 seatNumber() const { return seatNumber_; } + inline qint32 sessionId() const { return sessionId_; } + inline qint32 ticketId() const { return ticketId_; } +}; + +#endif // UPDATE_TICKET_REQUEST_H + diff --git a/core/requests/update_user_request.h b/core/requests/update_user_request.h new file mode 100644 index 0000000..3d034a5 --- /dev/null +++ b/core/requests/update_user_request.h @@ -0,0 +1,40 @@ +#ifndef UPDATE_USER_REQUEST_H +#define UPDATE_USER_REQUEST_H + +#include + +class UpdateUserRequest { +private: + QString passwordHash_; // Hashed password + QString salt_; // Salt for password hashing + QString username_; // Username + qint32 roleId_; // Role ID + qint32 userId_; // Unique user ID + +public: + // Constructors + explicit UpdateUserRequest() = default; + explicit UpdateUserRequest(const QString &passwordHash, const QString &salt, + const QString &username, qint32 roleId, + qint32 userId) + : passwordHash_(passwordHash), roleId_(roleId), salt_(salt), + userId_(userId), username_(username) {} + + // Setters (inline methods) + inline void setUserId(qint32 userId) { userId_ = userId; } + inline void setUsername(const QString &username) { username_ = username; } + inline void setPasswordHash(const QString &passwordHash) { + passwordHash_ = passwordHash; + } + inline void setSalt(const QString &salt) { salt_ = salt; } + inline void setRoleId(qint32 roleId) { roleId_ = roleId; } + + // Getters (inline methods) + inline qint32 userId() const { return userId_; } + inline QString username() const { return username_; } + inline QString passwordHash() const { return passwordHash_; } + inline QString salt() const { return salt_; } + inline qint32 roleId() const { return roleId_; } +}; + +#endif // UPDATE_USER_REQUEST_H diff --git a/core/services/base_generator.cpp b/core/services/base_generator.cpp new file mode 100644 index 0000000..d30388a --- /dev/null +++ b/core/services/base_generator.cpp @@ -0,0 +1,162 @@ +#include "base_generator.h" + +#include +#include + +BaseGenerator::ShouldLogSuccess +BaseGenerator::shouldLogAllSuccesses() const noexcept { + return [this]() { return true; }; +} + +BaseGenerator::ShouldLogSuccess +BaseGenerator::shouldLogEveryNPercent(int percent) const noexcept { + if (percent <= 0) { + return [this]() { return false; }; + } + + int oldLastPercentage = 0; + return [this, percent, oldLastPercentage]() mutable { + if (oldLastPercentage == lastPercentage_) { + return false; + } + + oldLastPercentage = lastPercentage_; + return !bool(lastPercentage_ % percent); + }; +} + +BaseGenerator::ShouldLogSuccess +BaseGenerator::shouldLogFirstAndLastPercent() const noexcept { + return [this]() { return createdRecords_ == 1 || lastPercentage_ == 100; }; +} + +BaseGenerator::ShouldLogSuccess BaseGenerator::shouldLogEveryNSeconds( + int seconds, const ShouldLogSuccess &performOtherwise) const noexcept { + QElapsedTimer timer; + timer.start(); + + return [this, timer, seconds, performOtherwise]() mutable { + if (timer.elapsed() >= seconds * 1000) { + timer.restart(); + return true; + } + return performOtherwise(); + }; +} + +BaseGenerator::ShouldLogSuccess +BaseGenerator::defaultShouldLog(int percent, int seconds) const noexcept { + ShouldLogSuccess first = + shouldLogEveryNSeconds(seconds, shouldLogFirstAndLastPercent()); + ShouldLogSuccess second = shouldLogEveryNPercent(percent); + + return [first, second]() { return first() || second(); }; +} + +void BaseGenerator::generateAll(const ShouldLogSuccess &shouldLogSuccess) { + auto withoutLimit = []() { return true; }; + + generateImplementation(withoutLimit, shouldLogSuccess); +} + +void BaseGenerator::generateByFillRatio( + double fillRatio, const ShouldLogSuccess &shouldLogSuccess) { + fillRatio >= 1.0 ? fillRatio = 1.0 : fillRatio; + + qInfo() << "Limit fill ratio of records to create: " << fillRatio; + + auto shouldContinue = [this, fillRatio]() -> bool { + double currentFillRatio = lastPercentage_ / 100.0; + bool shouldContinue = currentFillRatio < fillRatio; + if (!shouldContinue) { + qInfo() << "Limit of records to create reached"; + } + return shouldContinue; + }; + + generateImplementation(shouldContinue, shouldLogSuccess); +}; + +void BaseGenerator::generateByRecordCount( + qsizetype totalRecordsToCreate, const ShouldLogSuccess &shouldLogSuccess) { + int limit = std::min(totalRecordsToCreate, calculateRemainingCapacity()); + + qInfo() << "Limit of records to create: " << limit; + + auto shouldContinue = [this, limit]() -> bool { + bool shouldContinue = createdRecords_ < limit; + if (!shouldContinue) { + qInfo() << "Limit of records to create reached"; + } + return shouldContinue; + }; + + generateImplementation(shouldContinue, shouldLogSuccess); +}; + +void BaseGenerator::generateImplementation( + std::function shouldContinue, + std::function shouldLogSuccess) { + maximumRecords_ = calculateRemainingCapacity(); + qInfo() << "The number of records available for creation:" << maximumRecords_; + + qInfo().noquote() << createTemplateMessage() << "Started"; + + while (shouldContinue() && prepareData()) { + bool success; + RepositoryResult result = createRecord(); + + if (!result.success) { + qWarning().noquote() << createTemplateMessage() + << createFailureMessage(result.errorMessage); + continue; + } + ++createdRecords_; + updatePercentage(); + + if (shouldLogSuccess()) { + qInfo().noquote() << createTemplateMessage() << createSuccessMessage(); + } + + clearStaleData(); + } + + qInfo().noquote() << createTemplateMessage() << "Completed"; +} + +void BaseGenerator::updatePercentage() { + int numerator = maximumRecords_ - calculateRemainingCapacity(); + int newPercentage = std::floor(numerator * 100.0 / maximumRecords_); + lastPercentage_ = std::max(newPercentage, lastPercentage_); +} + +QString BaseGenerator::createFailureMessage(const QString &errorMessage) const { + QString failureMessage = "Failure: Error message:\n\t%1"; + return failureMessage.arg(errorMessage); +} + +QString BaseGenerator::createSuccessMessage() const { return "Success"; } + +QString BaseGenerator::createTemplateMessage() const { + auto digitCount = [](int number) { + if (number == 0) { + return 1; + } + return static_cast(std::log10(std::abs(number))) + 1; + }; + + int maximumRecordsValue = calculateRemainingCapacity(); + int newFieldWidth = + std::max(digitCount(createdRecords_), digitCount(maximumRecordsValue)); + fieldWidth_ = std::max(fieldWidth_, newFieldWidth); + + static constexpr int progressBarSize = 25; + static constexpr int progressBarStep = 100 / progressBarSize; + const QString progressBar(lastPercentage_ / progressBarStep, QChar('#')); + + return QString("Creating records of entity %1 [ %2 <~ %3] [%4]:") + .arg(entityName_) + .arg(createdRecords_, fieldWidth_, 10, QChar(' ')) + .arg(maximumRecordsValue, fieldWidth_, 10, QChar(' ')) + .arg(progressBar.leftJustified(progressBarSize, QChar(' '))); +}; diff --git a/core/services/base_generator.h b/core/services/base_generator.h new file mode 100644 index 0000000..dc3ebf5 --- /dev/null +++ b/core/services/base_generator.h @@ -0,0 +1,72 @@ +#ifndef BASE_GENERATOR_H +#define BASE_GENERATOR_H + +#include "generator_interface.h" +#include "range_limiter.h" +#include +#include + +class BaseGenerator : public GeneratorInterface, public virtual RangeLimiter { +private: + QString entityName_; + int lastPercentage_; + mutable int fieldWidth_; + qsizetype createdRecords_; + qsizetype maximumRecords_; + +public: + ShouldLogSuccess defaultShouldLog(int percent, int seconds) const noexcept; + ShouldLogSuccess shouldLogAllSuccesses() const noexcept; + ShouldLogSuccess shouldLogEveryNPercent(int percent) const noexcept; + ShouldLogSuccess shouldLogEveryNSeconds( + int seconds, const ShouldLogSuccess &performOtherwise) const noexcept; + ShouldLogSuccess shouldLogFirstAndLastPercent() const noexcept; + +public: + // Virtual methods + void generateAll(const ShouldLogSuccess &shouldLogSuccess) final; + + void generateByFillRatio(double fillRatio, + const ShouldLogSuccess &shouldLogSuccess) final; + + void generateByRecordCount(qint64 totalRecordsToCreate, + const ShouldLogSuccess &shouldLogSuccess) final; + +protected: + inline BaseGenerator(const QString &entityName) noexcept; + + // General methods + inline QString formatDateTime(const QDateTime &dateTime_) const noexcept; + inline qsizetype createdRecords() const noexcept; + +private: // create* methods depends on clearStaleData and createRecord + QString createFailureMessage(const QString &errorMessage) const override; + QString createSuccessMessage() const override; + QString createTemplateMessage() const override; + + // Non-virtual method + void generateImplementation(std::function shouldContinue, + std::function shouldLogSuccess); + + void updatePercentage(); // Depends on createRecord + +protected: // Non-const methods + virtual RepositoryResult createRecord() = 0; + virtual bool prepareData() = 0; + virtual void clearStaleData() = 0; +}; + +BaseGenerator::BaseGenerator(const QString &entityName) noexcept + : createdRecords_(0), entityName_(entityName), fieldWidth_(0), + lastPercentage_(-1) {} + +inline qsizetype BaseGenerator::createdRecords() const noexcept { + return createdRecords_; +} + +QString +BaseGenerator::formatDateTime(const QDateTime &dateTime_) const noexcept { + return dateTime_.toString("yyyy-MM-dd'T'HH:mm:ss.000"); +} + +#endif diff --git a/core/services/date_time_generator.cpp b/core/services/date_time_generator.cpp new file mode 100644 index 0000000..1115678 --- /dev/null +++ b/core/services/date_time_generator.cpp @@ -0,0 +1,75 @@ +#include "date_time_generator.h" + +DateTimeGenerator::DateTimeGenerator(const QPair &dayRange, + const QPair &timeRange) + : dayRange_(dayRange), timeRange_(timeRange) { + auto &[lowestDate, highestDate] = dayRange_; + if (lowestDate < 0 || highestDate < 0) { + qFatal() << "Lowest or highest date is negative"; + } + + if (lowestDate > highestDate) { + qCritical() << "Lowest date is greater than the highest date, values will " + "be swapped"; + std::swap(lowestDate, highestDate); + } + + auto &[lowestTime, highestTime] = timeRange_; + if (!lowestTime.isValid() || !highestTime.isValid()) { + qFatal() << "Lowest or highest time is not valid"; + } + + if (lowestTime > highestTime) { + qCritical() << "Lowest time is greater than the highest time, values will " + "be swapped"; + std::swap(lowestTime, highestTime); + } +} + +QDateTime DateTimeGenerator::generate(const QDateTime &upperBoundInclusive) { + auto [lowestDate, highestDate] = dayRange_; + auto [lowestTime, highestTime] = timeRange_; + const QDate &maxDateValue = upperBoundInclusive.date(); + const qint64 maxTimeValueMs = + upperBoundInclusive.time().msecsSinceStartOfDay(); + + QDate epochDate = QDateTime::fromMSecsSinceEpoch(0).date(); + qint64 daysFromEpochDateToMaxDateValue = epochDate.daysTo(maxDateValue); + highestDate = std::min(highestDate, daysFromEpochDateToMaxDateValue); + + qint64 minusDeltaDays = -bounded(lowestDate, highestDate); + QDate dateSoldAt = maxDateValue.addDays(minusDeltaDays); + + qint64 lowestTimeMs = lowestTime.msecsSinceStartOfDay(); + qint64 highestTimeMs = highestTime.msecsSinceStartOfDay() + 1; + qint64 msecsSinceStartOfDay = bounded(lowestTimeMs, highestTimeMs); + + if (msecsSinceStartOfDay > maxTimeValueMs) { + msecsSinceStartOfDay = maxTimeValueMs; + } + + QTime timeSoldAt = QTime::fromMSecsSinceStartOfDay(msecsSinceStartOfDay); + + return {std::move(dateSoldAt), std::move(timeSoldAt)}; +} + +QDateTime DateTimeGenerator::generate(const QDateTime &lowerBoundInclusive, + const QDateTime &upperBoundInclusive) { + if (lowerBoundInclusive > upperBoundInclusive) { + qFatal() << "Lower bound date is greater than the upper bound date"; + } + + const QDate &minDateValue = lowerBoundInclusive.date(); + const QTime &minTimeValue = lowerBoundInclusive.time(); + + QDateTime unboundedLower = generate(upperBoundInclusive); + + QDate boundedDate = unboundedLower.date() <= minDateValue + ? minDateValue + : unboundedLower.date(); + QTime boundedTime = unboundedLower.time() <= minTimeValue + ? minTimeValue + : unboundedLower.time(); + + return {std::move(boundedDate), std::move(boundedTime)}; +} diff --git a/core/services/date_time_generator.h b/core/services/date_time_generator.h new file mode 100644 index 0000000..10148af --- /dev/null +++ b/core/services/date_time_generator.h @@ -0,0 +1,35 @@ +#ifndef DATE_TIME_GENERATOR_H +#define DATE_TIME_GENERATOR_H + +#include "range_limiter.h" +#include + +class DateTimeGenerator : public virtual RangeLimiter { +private: + QPair dayRange_; + QPair timeRange_; + +public: + DateTimeGenerator(const QPair &dayRange, + const QPair &timeRange); + + QDateTime generate(const QDateTime &lowerBoundInclusive, + const QDateTime &upperBoundInclusive); + QDateTime generate(const QDateTime &upperBoundInclusive); + + inline void setDayRange(const QPair &dayRange); + inline void setTimeRange(const QPair &timeRange); + inline void setUpperBoundInclusive(const QDateTime &upperBoundInclusive); +}; + +inline void +DateTimeGenerator::setDayRange(const QPair &dayRange) { + dayRange_ = dayRange; +} + +inline void +DateTimeGenerator::setTimeRange(const QPair &timeRange) { + timeRange_ = timeRange; +} + +#endif // DATE_TIME_GENERATOR_H diff --git a/core/services/generator_interface.h b/core/services/generator_interface.h new file mode 100644 index 0000000..72aa7b8 --- /dev/null +++ b/core/services/generator_interface.h @@ -0,0 +1,29 @@ +#ifndef GENERATOR_INTERFACE_H +#define GENERATOR_INTERFACE_H + +#include "repository_result.h" +#include + +class GeneratorInterface { +public: + using ShouldLogSuccess = std::function; + +public: + inline virtual ~GeneratorInterface() noexcept = default; + + virtual void generateAll(const ShouldLogSuccess &shouldLogSuccess) = 0; + virtual void + generateByFillRatio(double fillRatio, + const ShouldLogSuccess &shouldLogSuccess) = 0; + virtual void + generateByRecordCount(qint64 totalRecordsToCreate, + const ShouldLogSuccess &shouldLogSuccess) = 0; + +protected: // Const methods + virtual QString createFailureMessage(const QString &errorMessage) const = 0; + virtual QString createSuccessMessage() const = 0; + virtual QString createTemplateMessage() const = 0; + virtual qsizetype calculateRemainingCapacity() const = 0; +}; + +#endif diff --git a/core/services/model_manager.cpp b/core/services/model_manager.cpp new file mode 100644 index 0000000..55c73bf --- /dev/null +++ b/core/services/model_manager.cpp @@ -0,0 +1,95 @@ +#include "model_manager.h" + +#include "genres_model.h" +#include "halls_model.h" +#include "movies_model.h" +#include "refunds_model.h" +#include "schema_metadata.h" +#include "sessions_model.h" +#include "tickets_model.h" + +ModelManager::ModelManager() { + // Get connection to the database + database_ = QSqlDatabase::database(); + + if (!database_.isOpen()) { + qDebug() << "Database is not open. Cannot initialize models"; + return; + } + + initialize(); +} + +ModelManager::~ModelManager() { + qInfo() << "Models manager is being destroyed"; +} + +ModelManager &ModelManager::instance() { + static ModelManager instance; + return instance; +} + +QStringList ModelManager::registeredModelTableNames() const { + return models_.keys(); +} + +QStringList +ModelManager::registeredModelTableNames(QString databaseTableName) const { + QStringList registeredModelTableNames; + for (const auto &modelTableName : models_.keys()) { + QSqlTableModel *currentModel = getModelAs(modelTableName); + QString currentDatabaseTableName = currentModel->tableName(); + if (currentDatabaseTableName == databaseTableName) { + registeredModelTableNames.append(modelTableName); + } + } + return registeredModelTableNames; +} + +void ModelManager::initialize() { + // clang-format off + + SchemaMetadata metadata = SchemaMetadata::defaultSchema(); + + registerModel( + metadata.modelTableName("genres"), database_); + + registerModel( + metadata.modelTableName("halls"), database_); + + registerModel( + metadata.modelTableName("movies"), database_); + + registerModel( + metadata.modelTableName("refunds"), database_); + + registerModel( + metadata.modelTableName("sessions"), database_); + + registerModel( + metadata.modelTableName("tickets"), database_); + + // clang-format on +} + +QSqlTableModel *ModelManager::getModel(const QString &modelTableName) const { + QSqlTableModel *model = models_.value(modelTableName, nullptr); + if (model == nullptr) { + qDebug() << "Model" << modelTableName << "is not registered"; + return nullptr; + } + qDebug() << "Getting model" << modelTableName << "with value" << model; + + return model; +} + +void ModelManager::resetFilter(const QString &modelTableName) { + BaseSqlTableModel *model = getModelAs(modelTableName); + model->resetFilter(); +} + +void ModelManager::setMultiColumnFilter(const QString &modelTableName, + const QString &filter) { + BaseSqlTableModel *model = getModelAs(modelTableName); + model->setMultiColumnFilter(filter); +} diff --git a/core/services/model_manager.h b/core/services/model_manager.h new file mode 100644 index 0000000..189cb82 --- /dev/null +++ b/core/services/model_manager.h @@ -0,0 +1,113 @@ +#ifndef MODEL_MANAGER_H +#define MODEL_MANAGER_H + +#include +#include +#include +#include + +// The model manager inherits the QObject class to delete child objects +class ModelManager : public QObject { + Q_OBJECT + +private: + QMap models_; + QSqlDatabase database_; + +public: + // Get the singleton instance + static ModelManager &instance(); + + QStringList registeredModelTableNames() const; + + QStringList registeredModelTableNames(QString databaseTableName) const; + + // Get a model + QSqlTableModel *getModel(const QString &modelTableName) const; + + // Get a model with a specific type + template T *getModelAs(const QString &modelTableName) const; + + // Configure filters + void resetFilter(const QString &modelTableName); + + void setMultiColumnFilter(const QString &modelTableName, + const QString &filter); + +private: + // Register a model + template + bool registerModel(const QString &modelTableName, const QSqlDatabase &db); + + // Initialize all models + void initialize(); + + // Initialize a specific model + template void initializeIfExists(T *model); + + // Private constructor for singleton pattern + ModelManager(); + + // Private destructor + ~ModelManager(); + + // Disable copy constructor and assignment operator + ModelManager(const ModelManager &) = delete; + ModelManager &operator=(const ModelManager &) = delete; +}; + +// NOTE: Implementation of template methods + +template void ModelManager::initializeIfExists(T *model) { + if constexpr (std::is_invocable_v) { + model->initialize(); + } else { + qDebug() << "Method initialize() is not available, skipping..."; + } +} + +template +T *ModelManager::getModelAs(const QString &modelTableName) const { + auto *model = dynamic_cast(getModel(modelTableName)); + if (!model) { + qFatal() << "Failed to downcast model for" << modelTableName + << "(typeid name):" << typeid(T).name(); + return nullptr; + } + qInfo() << "Successfully downcast model for" << modelTableName; + + return model; +} + +template +bool ModelManager::registerModel(const QString &modelTableName, + const QSqlDatabase &db) { + static_assert(std::is_base_of_v, + "Registered model must be derived from QSqlTableModel"); + + static_assert( + std::is_constructible::value, + "Model class must have a constructor accepting QObject* and const " + "QSqlDatabase&"); + + qInfo() << "Registering model:" << modelTableName; + + if (models_.contains(modelTableName)) { + qInfo() << "Model" << modelTableName << "is already registered"; + return true; + } + + T *model = new T(this, db); // Qt will delete the model + model->setObjectName(modelTableName); + initializeIfExists(model); + + models_.insert(modelTableName, model); + + qInfo() << "Model" << modelTableName + << "with database table name:" << model->tableName() + << "was registered successfully"; + + return true; +} + +#endif // MODEL_MANAGER_H diff --git a/core/services/range_limiter.h b/core/services/range_limiter.h new file mode 100644 index 0000000..6a45bb4 --- /dev/null +++ b/core/services/range_limiter.h @@ -0,0 +1,34 @@ +#ifndef RANGE_LIMITER_H +#define RANGE_LIMITER_H + +#include +#include + +class RangeLimiter { +private: + mutable QRandomGenerator gen_; + +public: + inline RangeLimiter(); + + template inline T bounded(T highest) const noexcept; + template inline T bounded(T lowest, T highest) const noexcept; +}; + +RangeLimiter::RangeLimiter() : gen_(QRandomGenerator::securelySeeded()) {} + +template T RangeLimiter::bounded(T highest) const noexcept { + return gen_.bounded(highest); +} + +template +T RangeLimiter::bounded(T lowest, T highest) const noexcept { + if (lowest >= highest) { + QString errorMessage = + "Lowest value (%1) is greater than highest value (%2) or equal to it"; + qFatal().noquote() << errorMessage.arg(lowest).arg(highest); + } + return gen_.bounded(lowest, highest); +} + +#endif // RANGE_LIMITER_H diff --git a/core/services/refund_generator.cpp b/core/services/refund_generator.cpp new file mode 100644 index 0000000..6bdaad0 --- /dev/null +++ b/core/services/refund_generator.cpp @@ -0,0 +1,168 @@ +#include "refund_generator.h" + +#include "create_refund_request.h" +#include "refunds_repository.h" +#include "repository_manager.h" +#include "repository_result.h" +#include "schema_metadata.h" +#include "session_dto.h" +#include "sessions_repository.h" +#include "ticket_dto.h" +#include "tickets_repository.h" +#include + +RefundGenerator::RefundGenerator(const QPair &refundRatioRange, + const QPair &dayRange, + const QPair &timeRange) + : BaseGenerator("Refund"), DateTimeGenerator(dayRange, timeRange), + refundRatioRange_(refundRatioRange) { + auto &[lowest, highest] = refundRatioRange_; + if (lowest > highest) { + qCritical() << "Lowest refund ratio is greater than the highest refund, " + "values will be swapped"; + std::swap(lowest, highest); + } + + initializeRepositories(); // First + initializeTicketIdToCacheValueMap(); // After initializing + // repositories + initializeRemainingCapacity(); // After initializing ticketIdToCacheValue +} + +void RefundGenerator::initializeRepositories() { + RepositoryManager &repositoryManager = RepositoryManager::instance(); + SchemaMetadata metadata = SchemaMetadata::defaultSchema(); + + ticketsRepository_ = repositoryManager.getRepositoryAs( + metadata.repositoryTableName("tickets")); + refundsRepository_ = repositoryManager.getRepositoryAs( + metadata.repositoryTableName("refunds")); + sessionsRepository_ = repositoryManager.getRepositoryAs( + metadata.repositoryTableName("sessions")); + + if (!bool(ticketsRepository_ && refundsRepository_ && sessionsRepository_)) { + qFatal() << "Failed to initialize repositories"; + } +} + +void RefundGenerator::initializeTicketIdToCacheValueMap() { + QVector sessions; + RepositoryResult resultGetAllSessions = + sessionsRepository_->getAllSessions(sessions); + if (!resultGetAllSessions.success) { + qFatal() << "Failed to retrieve sessions"; + } + + QMap> + sessionIdToBeginAtAndTicketPrice; + + for (const SessionDTO &session : sessions) { + sessionIdToBeginAtAndTicketPrice[session.sessionId()] = + qMakePair(session.beginAt(), session.ticketPrice()); + } + + QVector tickets; + RepositoryResult resultGetAllTickets = + ticketsRepository_->getAllTickets(tickets); + + if (!resultGetAllTickets.success) { + qFatal() << "Failed to retrieve tickets"; + } + + for (const auto &ticket : tickets) { + const auto &[beginAt, ticketPrice] = + sessionIdToBeginAtAndTicketPrice[ticket.sessionId()]; + CacheValue cacheValue{beginAt, ticket.soldAt(), ticketPrice}; + + if (calculateDurationMs(cacheValue) < 2) { + continue; + } + + ticketIdToCacheValue_[ticket.ticketId()] = cacheValue; + } +} + +QString +RefundGenerator::createFailureMessage(const QString &errorMessage) const { + const QString dateTimeFormat = "yyyy-MM-dd hh:mm:ss.zzz"; + QString additionalInfo = + QString("Additional info: Ticket id: %1 Refund amount: %2 Sold at: %3 " + "Refund at: %4 Begin at: %5") + .arg(reservationContext_.ticketId) + .arg(reservationContext_.refundAmount) + .arg(reservationContext_.soldAt.toString(dateTimeFormat)) + .arg(reservationContext_.refundAt.toString(dateTimeFormat)) + .arg(reservationContext_.beginAt.toString(dateTimeFormat)); + QString failureMessage = "Failure:\n\t%1\n\tError message: %2"; + return failureMessage.arg(additionalInfo).arg(errorMessage); +} + +QString RefundGenerator::createSuccessMessage() const { + return QString("Success: EId: %1 RAm: %2 RAt: %3") + .arg(reservationContext_.ticketId) + .arg(reservationContext_.refundAmount) + .arg(reservationContext_.refundAt.toString("yyyy-MM-dd hh:mm:ss")); +} + +qsizetype RefundGenerator::calculateRemainingCapacity() const { + return remainingCapacity_; +} + +RepositoryResult RefundGenerator::createRecord() { + CreateRefundRequest request; + request.setRefundAmount(reservationContext_.refundAmount); + request.setRefundAt(reservationContext_.refundAt); + request.setTicketId(reservationContext_.ticketId); + + RepositoryResult result = refundsRepository_->createRefund(request); + + if (result.success) { + --remainingCapacity_; + } + + return result; +} + +bool RefundGenerator::prepareData() { + if (ticketIdToCacheValue_.isEmpty()) { + qInfo() << "No tickets to refund"; + return false; + } + + qsizetype ticketIdIndex = bounded(0, ticketIdToCacheValue_.size()); + auto ticketIdIt = ticketIdToCacheValue_.cbegin(); + std::advance(ticketIdIt, ticketIdIndex); + + qint32 ticketId = ticketIdIt.key(); + CacheValue cacheValue = ticketIdIt.value(); + + constexpr qint32 fiveMinutesMs = 5 * 1000 * 60; + qint64 deltaBoundMs = calculateDurationMs(cacheValue) / 2; + if (deltaBoundMs > fiveMinutesMs) { + deltaBoundMs = fiveMinutesMs; + } + + const QDateTime refundAt = + // SoldAt < RefundAt < BeginAt + // SoldAt + n minute <= RefundAt <= BeginAt - n minute + generate(cacheValue.soldAt.addMSecs(+deltaBoundMs), + cacheValue.beginAt.addMSecs(-deltaBoundMs)); + + const auto [refundRatioLowest, refundRatioHighest] = refundRatioRange_; + int lowest = refundRatioLowest * 100; + int highest = refundRatioHighest * 100; + int numerator = bounded(lowest, highest); + double refundAmount = std::floor(numerator * cacheValue.ticketPrice) / 100.0; + + ReservationContext context{cacheValue.beginAt, refundAt, cacheValue.soldAt, + refundAmount, ticketId}; + reservationContext_ = std::move(context); + + return true; +} + +void RefundGenerator::clearStaleData() { + qint32 ticketId = reservationContext_.ticketId; + ticketIdToCacheValue_.remove(ticketId); +} diff --git a/core/services/refund_generator.h b/core/services/refund_generator.h new file mode 100644 index 0000000..ebe21a5 --- /dev/null +++ b/core/services/refund_generator.h @@ -0,0 +1,76 @@ +#ifndef REFUND_GENERATOR_H +#define REFUND_GENERATOR_H + +#include "base_generator.h" +#include "date_time_generator.h" +#include +#include +#include + +// Forward declaration +class RefundsRepository; +class SessionsRepository; +class TicketsRepository; + +class RefundGenerator : public BaseGenerator, public DateTimeGenerator { +private: + struct ReservationContext { + QDateTime beginAt; + QDateTime refundAt; + QDateTime soldAt; + double refundAmount; + qint32 ticketId; + }; + + struct CacheValue { + QDateTime beginAt; + QDateTime soldAt; + double ticketPrice; + }; + +private: + QMap // WARNING: There can be a lot + ticketIdToCacheValue_; // of records, so 1 QPair is used, not 3 QMap + QPair refundRatioRange_; + ReservationContext reservationContext_; + qsizetype remainingCapacity_; + + RefundsRepository *refundsRepository_; + SessionsRepository *sessionsRepository_; + TicketsRepository *ticketsRepository_; + +public: + RefundGenerator(const QPair &refundRatioRange, + const QPair &dayRange, + const QPair &timeRange); + +private: + void initializeRepositories(); + void initializeTicketIdToCacheValueMap(); + inline void initializeRemainingCapacity(); + +private: + inline qint64 calculateDurationMs(const CacheValue &cacheValue) const; + + // Vitual methods +private: // Const methods + QString createFailureMessage(const QString &errorMessage) const override; + QString createSuccessMessage() const override; + qsizetype calculateRemainingCapacity() const override; + +private: // Non-const methods + RepositoryResult createRecord() override; + bool prepareData() override; + void clearStaleData() override; +}; + +void RefundGenerator::initializeRemainingCapacity() { + remainingCapacity_ = ticketIdToCacheValue_.size(); +} + +qint64 +RefundGenerator::calculateDurationMs(const CacheValue &cacheValue) const { + return cacheValue.soldAt.msecsTo(cacheValue.beginAt); +} + +#endif diff --git a/core/services/relation_id_config.cpp b/core/services/relation_id_config.cpp new file mode 100644 index 0000000..3fca056 --- /dev/null +++ b/core/services/relation_id_config.cpp @@ -0,0 +1,9 @@ +#include "relation_id_config.h" + +RelationIdConfig::RelationIdConfig(const QString &translentTableName, + const QString &modelTableName, + const QString &primaryIdColumnName, + const QString &repositoryTableName) noexcept + : translatedTableName_(translentTableName), modelTableName_(modelTableName), + primaryIdColumnName_(primaryIdColumnName), + repositoryTableName_(repositoryTableName) {} diff --git a/core/services/relation_id_config.h b/core/services/relation_id_config.h new file mode 100644 index 0000000..1fc1b97 --- /dev/null +++ b/core/services/relation_id_config.h @@ -0,0 +1,66 @@ +#ifndef RALATION_ID_CONFIG_H +#define RALATION_ID_CONFIG_H + +#include "QString" + +class RelationIdConfig { +private: + QString modelTableName_; + QString primaryIdColumnName_; + QString repositoryTableName_; + QString translatedTableName_; + +public: + RelationIdConfig() = default; + explicit RelationIdConfig(const QString &databaseModelName, + const QString &modelTableName, + const QString &primaryIdColumnName, + const QString &repositoryTableName) noexcept; + + inline const QString &translatedTableName() const; + inline const QString &modelTableName() const; + inline const QString &primaryIdColumnName() const; + inline const QString &repositoryTableName() const; + + inline void setTranslatedTableName(const QString &translatedTableName); + inline void setModelTableName(const QString &modelTableName); + inline void setPrimaryIdColumnName(const QString &primaryIdColumnName); + inline void setRepositoryTableName(const QString &repositoryTableName); +}; + +const QString &RelationIdConfig::translatedTableName() const { + return translatedTableName_; +} + +const QString &RelationIdConfig::modelTableName() const { + return modelTableName_; +} + +const QString &RelationIdConfig::primaryIdColumnName() const { + return primaryIdColumnName_; +} + +const QString &RelationIdConfig::repositoryTableName() const { + return repositoryTableName_; +} + +void RelationIdConfig::setTranslatedTableName( + const QString &translatedTableName) { + translatedTableName_ = translatedTableName; +} + +void RelationIdConfig::setModelTableName(const QString &modelTableName) { + modelTableName_ = modelTableName; +} + +void RelationIdConfig::setPrimaryIdColumnName( + const QString &primaryIdColumnName) { + primaryIdColumnName_ = primaryIdColumnName; +} + +void RelationIdConfig::setRepositoryTableName( + const QString &repositoryTableName) { + repositoryTableName_ = repositoryTableName; +} + +#endif // RALATION_ID_CONFIG_H diff --git a/core/services/repository_manager.cpp b/core/services/repository_manager.cpp new file mode 100644 index 0000000..0ca376e --- /dev/null +++ b/core/services/repository_manager.cpp @@ -0,0 +1,83 @@ +#include "repository_manager.h" + +#include "genres_repository.h" +#include "halls_repository.h" +#include "movies_repository.h" +#include "refunds_repository.h" +#include "roles_repository.h" +#include "schema_metadata.h" +#include "sessions_repository.h" +#include "sessions_statistics_repository.h" +#include "tickets_repository.h" +#include "users_repository.h" + +RepositoryManager::RepositoryManager() { + database_ = QSqlDatabase::database(); + if (!database_.isOpen()) { + qDebug() << "Database is not open. Cannot initialize repositories"; + return; + } + + initialize(); +} + +RepositoryManager::~RepositoryManager() { + qInfo() << "Repositories manager is being destroyed"; +} + +RepositoryManager &RepositoryManager::instance() { + static RepositoryManager instance; + return instance; +} + +void RepositoryManager::initialize() { + // clang-format off + + SchemaMetadata metadata = SchemaMetadata::defaultSchema(); + + // Tables + registerRepository( + metadata.repositoryTableName("genres")); + + registerRepository( + metadata.repositoryTableName("halls")); + + registerRepository( + metadata.repositoryTableName("movies")); + + registerRepository( + metadata.repositoryTableName("refunds")); + + registerRepository( + metadata.repositoryTableName("sessions")); + + registerRepository( + metadata.repositoryTableName("tickets")); + + registerRepository( + metadata.repositoryTableName("users")); + + registerRepository( + metadata.repositoryTableName("roles")); + + // Views + registerRepository( + metadata.repositoryTableName("sessions_statistics")); + + // clang-format on +} + +RepositoryInterface * +RepositoryManager::getRepository(const QString &repositoryTableName) const { + RepositoryInterface *repository = + repositories_.value(repositoryTableName, nullptr); + + if (repository == nullptr) { + qDebug() << "Repository" << repositoryTableName << "is not registered"; + return nullptr; + } + qDebug() << "Getting model" << repositoryTableName << "with value" + << repository; + + return repository; +} diff --git a/core/services/repository_manager.h b/core/services/repository_manager.h new file mode 100644 index 0000000..656fff6 --- /dev/null +++ b/core/services/repository_manager.h @@ -0,0 +1,90 @@ +// repository_manager.h +#ifndef REPOSITORY_MANAGER_H +#define REPOSITORY_MANAGER_H + +#include "repository_interface.h" + +#include +#include + +// The repository manager inherits the QObject class to delete child objects +class RepositoryManager : public QObject { + Q_OBJECT + +private: + // Database connection + QSqlDatabase database_; + + // Map of repository names to instances + QMap repositories_; + +public: + // Singleton instance accessor + static RepositoryManager &instance(); + + // Get a repository by name + RepositoryInterface *getRepository(const QString &repositoryTableName) const; + + // Get a repository by name and type + template + T *getRepositoryAs(const QString &repositoryTableName) const; + +private: + // Register a new repository + template + bool registerRepository(const QString &repositoryTableName); + + // Initialize repositories + void initialize(); + + // Private constructor for singleton + RepositoryManager(); + + // Destructor to clean up resources + ~RepositoryManager(); + + // Delete copy constructor + RepositoryManager(const RepositoryManager &) = delete; + + // Delete assignment operator + RepositoryManager &operator=(const RepositoryManager &) = delete; +}; + +// NOTE: Implementation of template methods + +template +T *RepositoryManager::getRepositoryAs( + const QString &repositoryTableName) const { + auto *repository = dynamic_cast(getRepository(repositoryTableName)); + if (!repository) { + qFatal() << "Failed to downcast repository for" << repositoryTableName + << "(typeid name):" << typeid(T).name(); + return nullptr; + } + qInfo() << "Successfully downcast repository for" << repositoryTableName; + return repository; +} + +template +bool RepositoryManager::registerRepository(const QString &repositoryTableName) { + static_assert( + std::is_constructible::value, + "Repository class must have a constructor accepting QSqlDatabase& and " + "QObject*"); + + if (repositories_.contains(repositoryTableName)) { + qInfo() << "Repository" << repositoryTableName << "is already registered"; + return true; + } + + auto *repository = new T(database_, this); // Qt will delete the model + repository->setObjectName(repositoryTableName); + + repositories_.insert(repositoryTableName, repository); + + qInfo() << "Repository" << repositoryTableName + << "was registered successfully"; + return true; +} + +#endif // REPOSITORY_MANAGER_H diff --git a/core/services/schema_metadata.cpp b/core/services/schema_metadata.cpp new file mode 100644 index 0000000..c86a587 --- /dev/null +++ b/core/services/schema_metadata.cpp @@ -0,0 +1,137 @@ +#include "schema_metadata.h" + +#include + +QMap SchemaMetadata::databaseTableNameToConfigMap_; +std::once_flag SchemaMetadata::initFlag; + +void SchemaMetadata::initialize() { + qInfo() << "Initializing schema metadata..."; + + RelationIdConfig genreConfig; + genreConfig.setPrimaryIdColumnName("genre_id"); + genreConfig.setTranslatedTableName(tr("Genres")); + genreConfig.setModelTableName("GenresModel"); + genreConfig.setRepositoryTableName("GenresRepository"); + databaseTableNameToConfigMap_.insert("genres", genreConfig); + + RelationIdConfig hallConfig; + hallConfig.setPrimaryIdColumnName("hall_id"); + hallConfig.setTranslatedTableName(tr("Halls")); + hallConfig.setModelTableName("HallsModel"); + hallConfig.setRepositoryTableName("HallsRepository"); + databaseTableNameToConfigMap_.insert("halls", hallConfig); + + RelationIdConfig movieConfig; + movieConfig.setPrimaryIdColumnName("movie_id"); + movieConfig.setTranslatedTableName(tr("Movies")); + movieConfig.setModelTableName("MoviesModel"); + movieConfig.setRepositoryTableName("MoviesRepository"); + databaseTableNameToConfigMap_.insert("movies", movieConfig); + + RelationIdConfig refundConfig; + refundConfig.setPrimaryIdColumnName("refund_id"); + refundConfig.setTranslatedTableName(tr("Refunds")); + refundConfig.setModelTableName("RefundsModel"); + refundConfig.setRepositoryTableName("RefundsRepository"); + databaseTableNameToConfigMap_.insert("refunds", refundConfig); + + RelationIdConfig sessionConfig; + sessionConfig.setPrimaryIdColumnName("session_id"); + sessionConfig.setTranslatedTableName(tr("Sessions")); + sessionConfig.setModelTableName("SessionsModel"); + sessionConfig.setRepositoryTableName("SessionsRepository"); + databaseTableNameToConfigMap_.insert("sessions", sessionConfig); + + RelationIdConfig ticketConfig; + ticketConfig.setPrimaryIdColumnName("ticket_id"); + ticketConfig.setTranslatedTableName(tr("Tickets")); + ticketConfig.setModelTableName("TicketsModel"); + ticketConfig.setRepositoryTableName("TicketsRepository"); + databaseTableNameToConfigMap_.insert("tickets", ticketConfig); + + RelationIdConfig userConfig; + userConfig.setPrimaryIdColumnName("user_id"); + userConfig.setTranslatedTableName(tr("Users")); + userConfig.setRepositoryTableName("UsersRepository"); + databaseTableNameToConfigMap_.insert("users", userConfig); + + RelationIdConfig roleConfig; + roleConfig.setPrimaryIdColumnName("role_id"); + roleConfig.setTranslatedTableName(tr("Roles")); + roleConfig.setRepositoryTableName("RolesRepository"); + databaseTableNameToConfigMap_.insert("roles", roleConfig); + + RelationIdConfig tableInfoConfig; + tableInfoConfig.setTranslatedTableName(tr("Sessions statistics")); + tableInfoConfig.setRepositoryTableName("SessionsStatisticsRepository"); + databaseTableNameToConfigMap_.insert("sessions_statistics", tableInfoConfig); + + qInfo() << "Schema metadata initialized successfully"; +} + +SchemaMetadata::SchemaMetadata() noexcept { + std::call_once(initFlag, &SchemaMetadata::initialize); +} + +SchemaMetadata::SchemaMetadata(const SchemaMetadata &) {} + +SchemaMetadata &SchemaMetadata::operator=(const SchemaMetadata &) { + return *this; +} + +SchemaMetadata SchemaMetadata::defaultSchema() { return SchemaMetadata(); } + +QString SchemaMetadata::modelTableName(const QString &databaseTableName) { + QString modelTableName = relationIdConfig(databaseTableName).modelTableName(); + + if (modelTableName.isEmpty()) { + qFatal() << "Model table name is empty: Database table name:" + << databaseTableName; + } + + return modelTableName; +} + +QString SchemaMetadata::primaryIdColumnName(const QString &databaseTableName) { + QString primaryIdColumnName = + relationIdConfig(databaseTableName).primaryIdColumnName(); + + if (primaryIdColumnName.isEmpty()) { + qFatal() << "Primary id column name is empty: Database table name:" + << databaseTableName; + } + + return primaryIdColumnName; +} + +QString SchemaMetadata::repositoryTableName(const QString &databaseTableName) { + QString repositoryTableName = + relationIdConfig(databaseTableName).repositoryTableName(); + + if (repositoryTableName.isEmpty()) { + qFatal() << "Repository table name is empty: Database table name:" + << databaseTableName; + } + + return repositoryTableName; +} + +QString SchemaMetadata::translatedTableName(const QString &databaseTableName) { + QString translatedTableName = + relationIdConfig(databaseTableName).translatedTableName(); + + if (translatedTableName.isEmpty()) { + qFatal() << "Translated table name is empty: Database table name:" + << databaseTableName; + } + + return translatedTableName; +} + +RelationIdConfig +SchemaMetadata::relationIdConfig(const QString &databaseTableName) { + RelationIdConfig config = + databaseTableNameToConfigMap_.value(databaseTableName); + return config; +} diff --git a/core/services/schema_metadata.h b/core/services/schema_metadata.h new file mode 100644 index 0000000..250120c --- /dev/null +++ b/core/services/schema_metadata.h @@ -0,0 +1,40 @@ +#ifndef SCHEMA_METADATA_H +#define SCHEMA_METADATA_H + +#include "relation_id_config.h" +#include +#include +#include + +class SchemaMetadata : QObject { + Q_OBJECT + +private: + static QMap databaseTableNameToConfigMap_; + static std::once_flag initFlag; + +public: + SchemaMetadata &operator=(const SchemaMetadata &); + SchemaMetadata(const SchemaMetadata &); + + QString modelTableName(const QString &databaseTableName); + QString primaryIdColumnName(const QString &databaseTableName); + QString repositoryTableName(const QString &databaseTableName); + QString translatedTableName(const QString &databaseTableName); + RelationIdConfig relationIdConfig(const QString &databaseTableName); + + inline auto asKeyValueRange(); + + static SchemaMetadata defaultSchema(); + +private: + SchemaMetadata() noexcept; + + static void initialize(); +}; + +auto SchemaMetadata::asKeyValueRange() { + return databaseTableNameToConfigMap_.asKeyValueRange(); +} + +#endif // SCHEMA_METADATA_H diff --git a/core/services/session_generator.cpp b/core/services/session_generator.cpp new file mode 100644 index 0000000..83285c4 --- /dev/null +++ b/core/services/session_generator.cpp @@ -0,0 +1,254 @@ +#include "session_generator.h" + +#include "create_session_request.h" +#include "hall_dto.h" +#include "halls_repository.h" +#include "movie_dto.h" +#include "movies_repository.h" +#include "repository_manager.h" +#include "repository_result.h" +#include "schema_metadata.h" +#include "sessions_repository.h" + +SessionGenerator::SessionGenerator( + const ReservationManager &reservationReference) + : BaseGenerator("Session"), reservationReference_(reservationReference) { + initializeRepositories(); // First + + qint32 extraTime = 45; // Extra time for cleaning the room + initializeMovieIdToDurationMap(extraTime); // After initializing repositories + + initializeBounds(); // After initializing movieIdToDuration + initializeDayManager(); // After initializing bounds + initializeHallIdToReservationManagerMap(); // After initializing dayManager +} + +void SessionGenerator::initializeRepositories() { + RepositoryManager &repositoryManager = RepositoryManager::instance(); + SchemaMetadata metadata = SchemaMetadata::defaultSchema(); + + moviesRepository_ = repositoryManager.getRepositoryAs( + metadata.repositoryTableName("movies")); + hallsRepository_ = repositoryManager.getRepositoryAs( + metadata.repositoryTableName("halls")); + sessionsRepository_ = repositoryManager.getRepositoryAs( + metadata.repositoryTableName("sessions")); + + if (!bool(moviesRepository_ && hallsRepository_ && sessionsRepository_)) { + qFatal() << "Failed to initialize repositories"; + } +} + +void SessionGenerator::initializeMovieIdToDurationMap( + qint32 additionalMinutes) { + QVector movies; + RepositoryResult result = moviesRepository_->getAllMovies(movies); + + if (!result.success) { + qFatal() << "Failed to retrieve movies"; + } + + for (const MovieDTO &movie : movies) { + movieIdToDurationMinutes_[movie.movieId()] = + movie.duration() + additionalMinutes; + } + + if (movieIdToDurationMinutes_.isEmpty()) { + qFatal() << "Failed to initialize movieIdToDuration"; + } + + qInfo() << "Number of movies:" << movieIdToDurationMinutes_.size(); +} + +void SessionGenerator::initializeBounds() { + qint32 lowerBoundReservationMin = *std::min_element( + movieIdToDurationMinutes_.cbegin(), movieIdToDurationMinutes_.cend()); + lowerBoundReservationMs_ = lowerBoundReservationMin * 60'000; // 60 * 1000 + + qint32 upperBoundReservationMin = *std::max_element( + movieIdToDurationMinutes_.cbegin(), movieIdToDurationMinutes_.cend()); + upperBoundReservationMs_ = upperBoundReservationMin * 60'000; // 60 * 1000 + + qInfo() << "Lower bound reservation in Ms:" << lowerBoundReservationMs_; + qInfo() << "Upper bound reservation in Ms:" << upperBoundReservationMs_; +} + +void SessionGenerator::initializeDayManager() { + QTime minDuration = QTime::fromMSecsSinceStartOfDay(lowerBoundReservationMs_); + DayManager dayManager(reservationReference_.reference()); + dayManager.setMinDuration(minDuration); + reservationReference_.setReference(dayManager); + + if (!reservationReference_.reference().minDuration().isValid()) { + qFatal() << "Failed to initialize dayManager"; + } + + qInfo() << "Day manager: Min duration:" + << reservationReference_.reference().minDuration(); + qInfo() << "Day manager: Slot count:" + << reservationReference_.reference().slotCount(); +} + +void SessionGenerator::initializeHallIdToReservationManagerMap() { + QVector halls; + RepositoryResult result = hallsRepository_->getAllHalls(halls); + + if (!result.success) { + qFatal() << "Failed to retrieve halls"; + } + + for (const HallDTO &hall : halls) { + hallIdToReservationManager_[hall.hallId()] = reservationReference_; + } + + if (hallIdToReservationManager_.isEmpty()) { + qFatal() << "Failed to initialize hallIdToReservationManager"; + } + + qInfo() << "Number of halls:" << hallIdToReservationManager_.size(); +} + +RepositoryResult SessionGenerator::createRecord() { + CreateSessionRequest request; + request.setBeginAt(reservationContext_.beginAt); + request.setHallId(reservationContext_.hallId); + request.setMovieId(reservationContext_.movieId); + request.setTicketPrice(reservationContext_.ticketPrice); + + RepositoryResult result = sessionsRepository_->createSession(request); + + return result; +} + +QString +SessionGenerator::createFailureMessage(const QString &errorMessage) const { + QString additionalInfo = + QString("Additional info: Hall id: %1 Begin at: %2") + .arg(reservationContext_.hallId) + .arg(reservationContext_.beginAt.toString("yyyy-MM-dd hh:mm:ss")); + QString failureMessage = "Failure:\n\t%1\n\tError message: %2"; + return failureMessage.arg(additionalInfo).arg(errorMessage); +} + +QString SessionGenerator::createSuccessMessage() const { + qint32 hallId = reservationContext_.hallId; + const ReservationManager &manager = hallIdToReservationManager_.value(hallId); + QTime duration = calculateDuration(reservationContext_); + + // return QString("Success: TAD: %1 TAS: %2 EId: %3 AD: %4 AS: %5 CR: %6 B: %7 + // D: %8") + return QString("Success: TAD: %1 TAS: %2 EId: %3 AD: %4 AS: %5 CR: %6") + .arg(calculateAvailableDaysCount()) // Total available days + .arg(calculateAvailableSlotsCount()) // Total available slots + .arg(hallId) // Entity id + .arg(manager.calculateAvailableDaysCount()) // Available days for the + // current hall + .arg(manager.calculateAvailableSlotsCount()) // Available slots for the + // current hall + .arg(manager.createdRecords()); // Created records for the + // current hall + // .arg(reservationContext_.beginAt.toString( // + // "yyyy-MM-dd hh:mm:ss")) // Begin + // // of created record + // .arg(duration.toString("hh:mm:ss")); // Duration of created record +} + +qsizetype SessionGenerator::calculateRemainingCapacity() const { + // Maximum number of sessions that can be created + return std::accumulate(hallIdToReservationManager_.cbegin(), + hallIdToReservationManager_.cend(), 0, + [&](qsizetype sum, const ReservationManager &manager) { + return sum + manager.calculatePossibleReservations( + lowerBoundReservationMs_); + }); +}; + +bool SessionGenerator::prepareData() { + std::random_device rd; + std::mt19937 g{rd()}; + + QList hallIds = hallIdToReservationManager_.keys(); + std::shuffle(hallIds.begin(), hallIds.end(), g); + QList movieIds = movieIdToDurationMinutes_.keys(); + std::shuffle(movieIds.begin(), movieIds.end(), g); + + for (qint32 hallId : hallIds) { + if (prepareData(hallId, movieIds)) { + return true; + } + } + qWarning() << "No available halls"; + + return false; +} + +bool SessionGenerator::prepareData(qint32 hallId, + const QList &movieIds) { + for (qint32 movieId : movieIds) { + ReservationManager &manager = hallIdToReservationManager_[hallId]; + + auto [beginDateTime, endTime] = manager.reserve(duration(movieId)); + if (!beginDateTime.isValid() || !endTime.isValid()) { + continue; + } + + const QDate epochDate = QDateTime::fromMSecsSinceEpoch(0).date(); + const qint64 deltaDays = epochDate.daysTo(QDate(2025, 1, 1)); + const QDate newBeginDate = beginDateTime.date().addDays(deltaDays); + const QTime beginTime = beginDateTime.time(); + + reservationContext_ = ReservationContext{ + QDateTime(std::move(newBeginDate), std::move(beginTime)), + std::move(endTime), + bounded(10'000, 50'000) / 100.0, + hallId, + movieId, + }; + + return true; + } + + qCritical() + << "SessionGenerator::prepareData: No available movies for hall with id" + << hallId; + + return false; +} + +QTime SessionGenerator::duration(qint32 movieId) const { + qint32 durationMin = movieIdToDurationMinutes_[movieId]; + qint64 durationMs = durationMin * 60'000; // 60 * 1000 + QTime durationTime = QTime::fromMSecsSinceStartOfDay(durationMs); + return durationTime; +} + +qsizetype SessionGenerator::calculateAvailableDaysCount() const { + return std::accumulate(hallIdToReservationManager_.cbegin(), + hallIdToReservationManager_.cend(), 0, + [&](int sum, const ReservationManager &manager) { + return sum + manager.calculateAvailableDaysCount(); + }); +} + +qsizetype SessionGenerator::calculateAvailableSlotsCount() const { + return std::accumulate(hallIdToReservationManager_.cbegin(), + hallIdToReservationManager_.cend(), 0, + [&](int sum, const ReservationManager &manager) { + return sum + manager.calculateAvailableSlotsCount(); + }); +} + +QTime SessionGenerator::calculateDuration(ReservationContext context) const { + QTime beginTime = context.beginAt.time(); + QTime endTime = context.endTime; + qint64 durationMs = beginTime.msecsTo(endTime); + return QTime::fromMSecsSinceStartOfDay(durationMs); +} + +void SessionGenerator::clearStaleData() { + qint64 hallId = reservationContext_.hallId; + if (hallIdToReservationManager_[hallId].calculateAvailableDaysCount() == 0) { + qWarning() << "No available days for hall" << hallId; + hallIdToReservationManager_.remove(hallId); + } +} diff --git a/core/services/session_generator.h b/core/services/session_generator.h new file mode 100644 index 0000000..cf7a73a --- /dev/null +++ b/core/services/session_generator.h @@ -0,0 +1,72 @@ +#ifndef SESSION_GENERATOR_H +#define SESSION_GENERATOR_H + +#include "base_generator.h" +#include "reservation_manager.h" +#include +#include +#include +#include +#include + +// Forward declaration +class SessionsRepositoryInterface; +class HallsRepositoryInterface; +class MoviesRepositoryInterface; + +class SessionGenerator : public BaseGenerator { +private: + struct ReservationContext { + QDateTime beginAt; + QTime endTime; + double ticketPrice; + qint32 hallId; + qint32 movieId; + }; + +private: + QMap movieIdToDurationMinutes_; + QMap hallIdToReservationManager_; + ReservationContext reservationContext_; + ReservationManager reservationReference_; + qint64 lowerBoundReservationMs_; + qint64 upperBoundReservationMs_; + + // Repositories + HallsRepositoryInterface *hallsRepository_; + MoviesRepositoryInterface *moviesRepository_; + SessionsRepositoryInterface *sessionsRepository_; + +public: + SessionGenerator(const ReservationManager &reservationReference = {}); + + // Non-virtual methods +private: + QTime calculateDuration(ReservationContext context) const; + QTime duration(qint32 movieId) const; + bool prepareData(qint32 hallId, const QList &movieIds); + qsizetype calculateAvailableDaysCount() const; + qsizetype calculateAvailableSlotsCount() const; + + void initializeBounds(); + void initializeDayManager(); + void initializeHallIdToReservationManagerMap(); + void initializeMovieIdToDurationMap(qint32 additionalMinutes); + void initializeRepositories(); + + // Vitual methods +private: // Const methods + QString createFailureMessage(const QString &errorMessage) const override; + QString createSuccessMessage() const override; + qsizetype calculateRemainingCapacity() const override; + +private: // Non-const methods + RepositoryResult createRecord() override; + bool prepareData() override; + void clearStaleData() override; + +private: + friend class SessionGeneratorTest; +}; + +#endif // SESSION_GENERATOR_H diff --git a/core/services/ticket_generator.cpp b/core/services/ticket_generator.cpp new file mode 100644 index 0000000..37b074a --- /dev/null +++ b/core/services/ticket_generator.cpp @@ -0,0 +1,219 @@ +#include "ticket_generator.h" + +#include "create_ticket_request.h" +#include "hall_dto.h" +#include "halls_repository.h" +#include "repository_manager.h" +#include "repository_result.h" +#include "schema_metadata.h" +#include "session_dto.h" +#include "sessions_repository.h" +#include "tickets_repository.h" +#include +#include +#include + +#include "repository_result.h" + +std::random_device TicketGenerator::rd_; +std::mt19937 TicketGenerator::generator_(rd_()); + +TicketGenerator::TicketGenerator( + const QPair &dayRange, const QPair &timeRange, + const QPair &fillRatioPerSessionRange) + : BaseGenerator("Ticket"), DateTimeGenerator(dayRange, timeRange) { + if (!setFillRatioPerSessionRange(fillRatioPerSessionRange)) { + qFatal() << "Failed to set fill ratio per session range"; + } + + initializeRepositories(); + initializeSessionIdToAvailableSeatMap(); // After initializing repositories + initializeSessionIdToBeginAtMap(); // After initializing repositories + initializeRemainingCapacity(); // After initializing sessionToAvailableSeats + + qInfo() << "Number of sessions:" << sessionIdToAvailableSeatNumbers_.size(); +} + +void TicketGenerator::initializeRepositories() { + RepositoryManager &repositoryManager = RepositoryManager::instance(); + SchemaMetadata metadata = SchemaMetadata::defaultSchema(); + + hallsRepository_ = repositoryManager.getRepositoryAs( + metadata.repositoryTableName("halls")); + sessionsRepository_ = repositoryManager.getRepositoryAs( + metadata.repositoryTableName("sessions")); + ticketsRepository_ = repositoryManager.getRepositoryAs( + metadata.repositoryTableName("tickets")); + + if (!bool(ticketsRepository_ && sessionsRepository_)) { + qFatal() << "Failed to initialize repositories"; + } +} + +void TicketGenerator::initializeSessionIdToAvailableSeatMap() { + QVector halls; + RepositoryResult resultGetAllHalls = hallsRepository_->getAllHalls(halls); + if (!resultGetAllHalls.success) { + qFatal() << "Failed to retrieve halls"; + } + + QVector sessions; + RepositoryResult resultGetAllSessions = + sessionsRepository_->getAllSessions(sessions); + if (!resultGetAllSessions.success) { + qFatal() << "Failed to retrieve sessions"; + } + + QMap /* availableSeatNumbers */> + hallIdToAvailableSeatNumbers; + + for (const HallDTO &hall : halls) { + qint32 targetCapacity = + std::ceil(hall.capacity() * generateFillRatioPerSession()); + + QVector availableSeats(targetCapacity); + std::iota(availableSeats.begin(), availableSeats.end(), 1); + std::shuffle(availableSeats.begin(), availableSeats.end(), generator_); + + QSet buffer; + for (qint32 i = 0; i < targetCapacity; ++i) { + buffer.insert(availableSeats[i]); + } + + hallIdToAvailableSeatNumbers[hall.hallId()] = std::move(buffer); + } + + for (const SessionDTO &session : sessions) { + sessionIdToAvailableSeatNumbers_[session.sessionId()] = + hallIdToAvailableSeatNumbers[session.hallId()]; + } +} + +void TicketGenerator::initializeSessionIdToBeginAtMap() { + QVector sessions; + RepositoryResult resultGetAllSessions = + sessionsRepository_->getAllSessions(sessions); + if (!resultGetAllSessions.success) { + qFatal() << "Failed to retrieve sessions"; + } + + for (const SessionDTO &session : sessions) { + sessionIdToBeginAt_[session.sessionId()] = session.beginAt(); + } +} + +bool TicketGenerator::setFillRatioPerSessionRange( + const QPair &range) { + const auto &[minValue, maxValue] = range; + if (minValue > maxValue) { + return false; + } + + auto &[minFillRatioPerSession, maxFillRatioPerSession] = + fillRatioPerSessionRange_; + minFillRatioPerSession = std::max(minValue, 0.0); + maxFillRatioPerSession = std::min(maxValue, 1.0); + + return true; +} + +double TicketGenerator::generateFillRatioPerSession() const { + const auto &[min, max] = fillRatioPerSessionRange_; + std::uniform_real_distribution distribution(min, max); + return distribution(generator_); +} + +void TicketGenerator::initializeRemainingCapacity() { + remainingCapacity_ = + std::accumulate(sessionIdToAvailableSeatNumbers_.cbegin(), + sessionIdToAvailableSeatNumbers_.cend(), 0, + [&](qsizetype sum, const QSet &availableSeats) { + return sum + availableSeats.size(); + }); +} + +QString +TicketGenerator::createFailureMessage(const QString &errorMessage) const { + QString additionalInfo = + QString("Additional info: Session id: %1 Seat number: %2 Sold at: %3 " + "Begin at: %4") + .arg(reservationContext_.sessionId) + .arg(reservationContext_.seatNumber) + .arg(reservationContext_.soldAt.toString("yyyy-MM-dd hh:mm:ss")) + .arg(reservationContext_.beginAt.toString("yyyy-MM-dd hh:mm:ss")); + QString failureMessage = "Failure:\n\t%1\n\tError message: %2"; + return failureMessage.arg(additionalInfo).arg(errorMessage); +} + +QString TicketGenerator::createSuccessMessage() const { + return QString("Success: EId: %1 SN: %2") + .arg(reservationContext_.sessionId) + .arg(reservationContext_.seatNumber); +} + +qsizetype TicketGenerator::calculateRemainingCapacity() const { + return remainingCapacity_; +} + +RepositoryResult TicketGenerator::createRecord() { + CreateTicketRequest request; + request.setSessionId(reservationContext_.sessionId); + request.setSeatNumber(reservationContext_.seatNumber); + request.setSoldAt(reservationContext_.soldAt); + + RepositoryResult result = ticketsRepository_->createTicket(request); + + if (result.success) { + --remainingCapacity_; + } + + return result; +} + +bool TicketGenerator::prepareData() { + if (remainingCapacity_ <= 0) { + qInfo() << "All tickets have been sold"; + return false; + } + + qsizetype deltaIndex = + bounded(0, sessionIdToAvailableSeatNumbers_.size()); + auto it = sessionIdToAvailableSeatNumbers_.begin(); + std::advance(it, deltaIndex); + + const qint32 sessionId = it.key(); + QSet &availableSeatNumbers = it.value(); // Not empty + + const QDateTime &beginAt = sessionIdToBeginAt_[sessionId]; + constexpr qint32 minus20MinutesMs = -20 * 1000 * 60; + // soldAt < beginAt || soldAt + 20 minute <= beginAt + QDateTime soldAt = generate(beginAt.addMSecs(minus20MinutesMs)); + + qsizetype seatNumberIndex = + bounded(0, availableSeatNumbers.size()); + auto seatNumberIt = availableSeatNumbers.cbegin(); + std::advance(seatNumberIt, seatNumberIndex); + + qint32 seatNumber = *seatNumberIt; + + ReservationContext context{beginAt, soldAt, seatNumber, sessionId}; + reservationContext_ = std::move(context); + + return true; +} + +void TicketGenerator::clearStaleData() { + + qint32 sessionId = reservationContext_.sessionId; + qint32 seatNumber = reservationContext_.seatNumber; + QSet &availableSeatNumbers = + sessionIdToAvailableSeatNumbers_[sessionId]; + + availableSeatNumbers.remove(seatNumber); + if (availableSeatNumbers.empty()) { + qWarning() << "All tickets for session with id" << sessionId + << "have been sold"; + sessionIdToAvailableSeatNumbers_.remove(sessionId); + sessionIdToBeginAt_.remove(sessionId); + } +} diff --git a/core/services/ticket_generator.h b/core/services/ticket_generator.h new file mode 100644 index 0000000..7de9aca --- /dev/null +++ b/core/services/ticket_generator.h @@ -0,0 +1,68 @@ +#ifndef TICKET_GENERATOR_H +#define TICKET_GENERATOR_H + +#include "base_generator.h" +#include "date_time_generator.h" +#include "tickets_repository_interface.h" +#include +#include +#include +#include + +// Forward declaration +class HallsRepositoryInterface; +class SessionsRepositoryInterface; +class TicketsRepositoryInterface; + +class TicketGenerator : public BaseGenerator, public DateTimeGenerator { +private: + struct ReservationContext { + QDateTime beginAt; + QDateTime soldAt; + qint32 seatNumber; + qint32 sessionId; + }; + +private: + static std::random_device rd_; + static std::mt19937 generator_; + +private: + QMap sessionIdToBeginAt_; + QMap /* availableSeatNumbers */> + sessionIdToAvailableSeatNumbers_; + QPair fillRatioPerSessionRange_; + ReservationContext reservationContext_; + qsizetype remainingCapacity_; + + HallsRepositoryInterface *hallsRepository_; + SessionsRepositoryInterface *sessionsRepository_; + TicketsRepositoryInterface *ticketsRepository_; + +public: + TicketGenerator(const QPair &dayRange, + const QPair &timeRange, + const QPair &fillRatioPerSessionRange); + +private: + void initializeRemainingCapacity(); + void initializeRepositories(); + void initializeSessionIdToAvailableSeatMap(); + void initializeSessionIdToBeginAtMap(); + + bool setFillRatioPerSessionRange(const QPair &range); + double generateFillRatioPerSession() const; + + // Vitual methods +private: // Const methods + QString createFailureMessage(const QString &errorMessage) const override; + QString createSuccessMessage() const override; + qsizetype calculateRemainingCapacity() const override; + +private: // Non-const methods + RepositoryResult createRecord() override; + bool prepareData() override; + void clearStaleData() override; +}; + +#endif // TICKET_GENERATOR_H diff --git a/core/sql/cinema_db_create_indexes.sql b/core/sql/cinema_db_create_indexes.sql new file mode 100644 index 0000000..64ef580 --- /dev/null +++ b/core/sql/cinema_db_create_indexes.sql @@ -0,0 +1,32 @@ +-- create indexes + +-- genres +CREATE INDEX idx_genres_genre_name ON genres (genre_name); + +-- movies +CREATE INDEX idx_movies_title ON movies (title); +CREATE INDEX idx_movies_genre_id ON movies (genre_id); + +-- halls +CREATE INDEX idx_halls_hall_name ON halls (hall_name); + +-- sessions +CREATE INDEX idx_sessions_movie_id ON sessions (movie_id); +CREATE INDEX idx_sessions_hall_id ON sessions (hall_id); +CREATE INDEX idx_sessions_begin_at ON sessions (begin_at); +CREATE INDEX idx_sessions_hall_id_begin_at ON sessions (hall_id, begin_at); + +-- tickets +CREATE INDEX idx_tickets_session_id ON tickets (session_id); +CREATE INDEX idx_tickets_seat_number ON tickets (seat_number); + +-- refunds +CREATE INDEX idx_refunds_ticket_id ON refunds (ticket_id); + +-- roles +CREATE INDEX idx_roles_role_name ON roles (role_name); +CREATE INDEX idx_roles_access_level ON roles (access_level); + +-- users +CREATE INDEX idx_users_username ON users (username); +CREATE INDEX idx_users_role_id ON users (role_id); diff --git a/core/sql/cinema_db_create_tables.sql b/core/sql/cinema_db_create_tables.sql new file mode 100644 index 0000000..9c78427 --- /dev/null +++ b/core/sql/cinema_db_create_tables.sql @@ -0,0 +1,83 @@ +-- Create table "Genres" to store movie genres + +CREATE TABLE genres ( + genre_id INTEGER PRIMARY KEY AUTOINCREMENT, + genre_name TEXT NOT NULL UNIQUE CHECK(length(genre_name) > 0), -- Genre name cannot be empty + CONSTRAINT no_double_spaces_in_genre_name CHECK (genre_name NOT LIKE '% %') -- Genre name cannot contain double spaces +); + +-- Create table "Movies" to store movie details + +CREATE TABLE movies ( + movie_id INTEGER PRIMARY KEY AUTOINCREMENT, + title TEXT NOT NULL UNIQUE CHECK(length(title) > 0), -- Movie title cannot be empty + genre_id INTEGER, + duration INTEGER CHECK(duration > 0), -- Movie duration must be greater than 0 + FOREIGN KEY (genre_id) REFERENCES genres (genre_id) ON DELETE CASCADE, + CONSTRAINT no_double_spaces_in_title CHECK (title NOT LIKE '% %') -- Movie title cannot contain double spaces +); + +-- Create table "Halls" to store cinema hall details + +CREATE TABLE halls ( + hall_id INTEGER PRIMARY KEY AUTOINCREMENT, + hall_name TEXT NOT NULL UNIQUE CHECK(length(hall_name) > 0), -- Hall name cannot be empty + capacity INTEGER NOT NULL CHECK(capacity > 0), -- Hall capacity must be positive + CONSTRAINT no_double_spaces_in_hall_name CHECK (hall_name NOT LIKE '% %') -- Hall name cannot contain double spaces +); + +-- Create table "Sessions" to store session details + +CREATE TABLE sessions ( + session_id INTEGER PRIMARY KEY AUTOINCREMENT, + movie_id INTEGER, + hall_id INTEGER, + begin_at TIMESTAMP NOT NULL, -- Date and time of the session + ticket_price REAL NOT NULL CHECK(ticket_price >= 0), -- Ticket price cannot be negative + FOREIGN KEY (movie_id) REFERENCES movies (movie_id) ON DELETE CASCADE, + FOREIGN KEY (hall_id) REFERENCES halls (hall_id) ON DELETE CASCADE, + CONSTRAINT unique_hall_time UNIQUE (hall_id, begin_at) -- Prevent duplicate sessions in the same hall at the same time +); + +-- Create table "Tickets" to store sold tickets + +CREATE TABLE tickets ( + ticket_id INTEGER PRIMARY KEY AUTOINCREMENT, + session_id INTEGER, + seat_number INTEGER NOT NULL CHECK(seat_number > 0), -- Seat number must be positive + sold_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- Sale time defaults to current time + FOREIGN KEY (session_id) REFERENCES sessions (session_id) ON DELETE CASCADE, + CONSTRAINT unique_session_seat UNIQUE(session_id, seat_number) -- Unique combination of session and seat number +); + +-- Create table "Refunds" to store refunded tickets + +CREATE TABLE refunds ( + refund_id INTEGER PRIMARY KEY AUTOINCREMENT, + ticket_id INTEGER NOT NULL UNIQUE, + refund_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + refund_amount REAL NOT NULL CHECK (refund_amount >= 0), -- Refund amount cannot be negative + FOREIGN KEY (ticket_id) REFERENCES tickets(ticket_id) ON DELETE CASCADE +); + +-- Create table "Roles" to store user roles + +CREATE TABLE roles ( + role_id INTEGER PRIMARY KEY AUTOINCREMENT, + role_name TEXT UNIQUE NOT NULL CHECK(length(role_name) > 0), -- Role name cannot be empty + access_level INTEGER UNIQUE NOT NULL CHECK(access_level > 0), -- Access level must be positive + CONSTRAINT no_spaces_in_role_name CHECK (role_name NOT LIKE '% %') -- Role name cannot contain spaces +); + +-- Create table "Users" to store user details + +CREATE TABLE users ( + user_id INTEGER PRIMARY KEY AUTOINCREMENT, + username TEXT UNIQUE NOT NULL CHECK(length(username) > 0), -- Username cannot be empty + password_hash TEXT NOT NULL CHECK(length(password_hash) > 0), -- Password hash cannot be empty + salt TEXT UNIQUE NOT NULL CHECK(length(salt) > 0), -- Salt cannot be empty + role_id INTEGER NOT NULL, + FOREIGN KEY (role_id) REFERENCES roles(role_id) ON DELETE CASCADE, + CONSTRAINT no_spaces_in_username CHECK (username NOT LIKE '% %') -- Username cannot contain spaces +); + diff --git a/core/sql/cinema_db_create_triggers.sql b/core/sql/cinema_db_create_triggers.sql new file mode 100644 index 0000000..722450a --- /dev/null +++ b/core/sql/cinema_db_create_triggers.sql @@ -0,0 +1,212 @@ +-- WARNING: In SQLite DELIMITER doesn't work, so this file is handled in a special way + +DELIMITER $$ + +-- INFO: ----- TICKET ----- + +-- Create trigger to validate seat number before inserting a ticket + +-- INSERT + +CREATE TRIGGER check_seat_number_before_insert +BEFORE INSERT ON tickets +WHEN EXISTS ( + SELECT 1 + FROM sessions s + INNER JOIN halls h ON s.hall_id = h.hall_id + WHERE s.session_id = NEW.session_id + AND NEW.seat_number > h.capacity +) +BEGIN + SELECT RAISE(FAIL, 'Error 1001: Seat number exceeds hall capacity'); +END$$ + +-- UPDATE + +CREATE TRIGGER check_seat_number_before_update +BEFORE UPDATE ON tickets +WHEN EXISTS ( + SELECT 1 + FROM sessions s + INNER JOIN halls h ON s.hall_id = h.hall_id + WHERE s.session_id = NEW.session_id + AND NEW.seat_number > h.capacity +) +BEGIN + SELECT RAISE(FAIL, 'Error 1001: Seat number exceeds hall capacity'); +END$$ + +-- Check if the ticket purchase time is later than the session start time + +-- INSERT + +CREATE TRIGGER prevent_late_ticket_purchase_before_insert +BEFORE INSERT ON tickets +WHEN EXISTS ( + SELECT 1 + FROM sessions + WHERE session_id = NEW.session_id + AND DATETIME(NEW.sold_at) >= DATETIME(begin_at) +) +BEGIN + SELECT RAISE(FAIL, 'Error 1002: Cannot purchase ticket after the session has started'); +END$$ + +-- UPDATE + +CREATE TRIGGER prevent_late_ticket_purchase_before_update +BEFORE UPDATE ON tickets +WHEN EXISTS ( + SELECT 1 + FROM sessions + WHERE session_id = NEW.session_id + AND DATETIME(NEW.sold_at) >= DATETIME(begin_at) +) +BEGIN + SELECT RAISE(FAIL, 'Error 1002: Cannot purchase ticket after the session has started'); +END$$ + + +-- INFO: ----- REFUND ----- + +-- Create trigger to prevent selling a ticket after the session has started + +-- INSERT + +CREATE TRIGGER prevent_late_refunds_before_insert +BEFORE INSERT ON refunds +WHEN EXISTS ( + SELECT 1 + FROM sessions s + JOIN tickets t ON s.session_id = t.session_id + AND t.ticket_id = NEW.ticket_id + WHERE DATETIME(NEW.refund_at) >= DATETIME(s.begin_at) +) +BEGIN + SELECT RAISE(FAIL, 'Error 1003: Refunds cannot be made after the session has started'); +END$$ + +-- UPDATE + +CREATE TRIGGER prevent_late_refunds_before_update +BEFORE UPDATE ON refunds +WHEN EXISTS ( + SELECT 1 + FROM sessions s + JOIN tickets t ON s.session_id = t.session_id + AND t.ticket_id = NEW.ticket_id + WHERE DATETIME(NEW.refund_at) >= DATETIME(s.begin_at) +) +BEGIN + SELECT RAISE(FAIL, 'Error 1003: Refunds cannot be made after the session has started'); +END$$ + + +-- Create a trigger to check if the refund amount is greater than the ticket sale amount + +-- INSERT + +CREATE TRIGGER validate_refund_amount_before_insert +BEFORE INSERT ON refunds +WHEN NEW.refund_amount > ( + SELECT ticket_price + FROM sessions s + JOIN tickets t ON s.session_id = t.session_id + WHERE t.ticket_id = NEW.ticket_id +) +BEGIN + SELECT RAISE(FAIL, 'Error 1004: Refund amount cannot exceed the sale amount'); +END$$ + +-- UPDATE + +CREATE TRIGGER validate_refund_amount_before_update +BEFORE UPDATE ON refunds +WHEN NEW.refund_amount > ( + SELECT ticket_price + FROM sessions s + JOIN tickets t ON s.session_id = t.session_id + WHERE t.ticket_id = NEW.ticket_id +) +BEGIN + SELECT RAISE(FAIL, 'Error 1004: Refund amount cannot exceed the sale amount'); +END$$ + +-- Create a trigger to check if the refund date is earlier than the sale date + +-- INSERT + +CREATE TRIGGER validate_refund_date_before_insert +BEFORE INSERT ON refunds +WHEN EXISTS ( + SELECT 1 + FROM tickets + WHERE ticket_id = NEW.ticket_id + AND DATETIME(NEW.refund_at) <= DATETIME(sold_at) +) +BEGIN + SELECT RAISE(FAIL, 'Error 1005: Refund date cannot be earlier than the sale date or equal to it'); +END$$ + +-- UPDATE + +CREATE TRIGGER validate_refund_date_before_update +BEFORE UPDATE ON refunds +WHEN EXISTS ( + SELECT 1 + FROM tickets + WHERE ticket_id = NEW.ticket_id + AND DATETIME(NEW.refund_at) <= DATETIME(sold_at) +) +BEGIN + SELECT RAISE(FAIL, 'Error 1005: Refund date cannot be earlier than the sale date or equal to it'); +END$$ + +-- INFO: ----- SESSION ----- + +-- Trigger to prevent overlapping sessions + +--INSERT + +CREATE TRIGGER prevent_overlapping_sessions_before_insert +BEFORE INSERT ON sessions +WHEN EXISTS ( + SELECT 1 + FROM sessions s + JOIN movies m_existing ON s.movie_id = m_existing.movie_id + JOIN movies m_new ON NEW.movie_id = m_new.movie_id + WHERE s.hall_id = NEW.hall_id + AND ( + -- The new movie starts within an already occupied time slot + NEW.begin_at < DATETIME(s.begin_at, '+' || m_existing.duration || ' minutes') + -- Or the existing movie starts within the new movie's time slot + AND s.begin_at < DATETIME(NEW.begin_at, '+' || m_new.duration || ' minutes') + ) +) +BEGIN + SELECT RAISE(FAIL, 'Error 1006: The new session overlaps with an ongoing movie in the hall'); +END$$ + +-- UPDATE + +CREATE TRIGGER prevent_overlapping_sessions_before_update +BEFORE UPDATE ON sessions +WHEN EXISTS ( + SELECT 1 + FROM sessions s + JOIN movies m_existing ON s.movie_id = m_existing.movie_id + JOIN movies m_new ON NEW.movie_id = m_new.movie_id + WHERE s.hall_id = NEW.hall_id + AND ( + -- The new movie starts within an already occupied time slot + NEW.begin_at < DATETIME(s.begin_at, '+' || m_existing.duration || ' minutes') + -- Or the existing movie starts within the new movie's time slot + AND s.begin_at < DATETIME(NEW.begin_at, '+' || m_new.duration || ' minutes') + ) +) +BEGIN + SELECT RAISE(FAIL, 'Error 1006: The new session overlaps with an ongoing movie in the hall'); +END$$ + +DELIMITER ; + diff --git a/core/sql/cinema_db_create_views.sql b/core/sql/cinema_db_create_views.sql new file mode 100644 index 0000000..9ff1087 --- /dev/null +++ b/core/sql/cinema_db_create_views.sql @@ -0,0 +1,32 @@ +CREATE VIEW sessions_statistics AS +SELECT + s.session_id, + s.begin_at, + s.ticket_price, + h.hall_id, + h.hall_name, + h.capacity AS total_seats, + m.movie_id, + m.title AS movie_title, + m.duration, + g.genre_id, + g.genre_name, + COUNT(t.ticket_id) AS sold_tickets, + COUNT(r.refund_id) AS refunded_tickets, + SUM(CASE WHEN t.ticket_id IS NOT NULL THEN s.ticket_price ELSE 0 END) AS sales_revenue, + SUM(CASE WHEN r.refund_id IS NOT NULL THEN r.refund_amount ELSE 0 END) AS refund_expenses +FROM halls h +JOIN sessions s + ON s.hall_id = h.hall_id +JOIN movies m + ON s.movie_id = m.movie_id +JOIN genres g + ON m.genre_id = g.genre_id +LEFT JOIN tickets t + ON t.session_id = s.session_id +LEFT JOIN refunds r + ON r.ticket_id = t.ticket_id +GROUP BY + s.session_id; + + diff --git a/core/sql/cinema_db_foreign_key_off.sql b/core/sql/cinema_db_foreign_key_off.sql new file mode 100644 index 0000000..9d3c687 --- /dev/null +++ b/core/sql/cinema_db_foreign_key_off.sql @@ -0,0 +1,3 @@ +-- Disable foreign keys +-- Necessary testing behavior +PRAGMA foreign_keys = OFF; diff --git a/core/sql/cinema_db_foreign_key_on.sql b/core/sql/cinema_db_foreign_key_on.sql new file mode 100644 index 0000000..bf91b32 --- /dev/null +++ b/core/sql/cinema_db_foreign_key_on.sql @@ -0,0 +1,3 @@ +-- Enable foreign keys +-- The necessary behavior for the normal operation of the program +PRAGMA foreign_keys = ON; diff --git a/core/sql/cinema_db_genre_insert.sql b/core/sql/cinema_db_genre_insert.sql new file mode 100644 index 0000000..f957b8e --- /dev/null +++ b/core/sql/cinema_db_genre_insert.sql @@ -0,0 +1,23 @@ +-- Insert data into the genres table + +INSERT INTO genres (genre_id, genre_name) VALUES +(1, 'Боевик'), +(2, 'Комедия'), +(3, 'Драма'), +(4, 'Фантастика'), +(5, 'Ужасы'), +(6, 'Триллер'), +(7, 'Мелодрама'), +(8, 'Приключения'), +(9, 'Анимация'), +(10, 'Детектив'), +(11, 'Фэнтези'), +(12, 'Исторический'), +(13, 'Военный'), +(14, 'Музыкальный'), +(15, 'Семейный'), +(16, 'Спорт'), +(17, 'Документальный'), +(18, 'Криминал'), +(19, 'Биография'), +(20, 'Вестерн'); diff --git a/core/sql/cinema_db_hall_insert.sql b/core/sql/cinema_db_hall_insert.sql new file mode 100644 index 0000000..c4106f7 --- /dev/null +++ b/core/sql/cinema_db_hall_insert.sql @@ -0,0 +1,7 @@ +-- Insert data into the halls table + +INSERT INTO halls (hall_name, capacity) VALUES ('Hall 1', 100); +INSERT INTO halls (hall_name, capacity) VALUES ('Hall 2', 150); +INSERT INTO halls (hall_name, capacity) VALUES ('VIP Hall', 50); +INSERT INTO halls (hall_name, capacity) VALUES ('IMAX Hall', 200); + diff --git a/core/sql/cinema_db_movie_insert.sql b/core/sql/cinema_db_movie_insert.sql new file mode 100644 index 0000000..2ee4a3a --- /dev/null +++ b/core/sql/cinema_db_movie_insert.sql @@ -0,0 +1,100 @@ +-- Insert data into the movies table + +INSERT INTO movies (title, genre_id, duration) VALUES +('Титаник', 3, 195), +('Матрица', 4, 136), +('Крепкий орешек', 1, 132), +('Один дома', 2, 103), +('Пила', 5, 103), +('Начало', 6, 148), +('Титаник 2', 3, 120), +('Звездные войны: Эпизод IV', 4, 121), +('Терминатор', 1, 107), +('Мальчишник в Вегасе', 2, 100), +('Звонок', 5, 115), +('Семь', 6, 127), +('Форрест Гамп', 3, 142), +('Аватар', 4, 162), +('Рокки', 1, 119), +('Маска', 2, 101), +('Оно', 5, 135), +('Молчание ягнят', 6, 118), +('Красота по-американски', 3, 122), +('Интерстеллар', 4, 169), +('Терминатор 2', 1, 137), +('День сурка', 2, 101), +('Пила 2', 5, 93), +('Игра', 6, 129), +('Список Шиндлера', 3, 195), +('Чужой', 4, 117), +('Рэмбо', 1, 93), +('Брюс Всемогущий', 2, 101), +('Заклятие', 5, 112), +('Шестое чувство', 6, 107), +('Гладиатор', 3, 155), +('Звездные войны: Эпизод V', 4, 124), +('Терминатор 3', 1, 109), +('Мальчишник 2', 2, 105), +('Пила 3', 5, 108), +('Остров проклятых', 6, 138), +('Властелин колец: Братство кольца', 11, 178), +('Властелин колец: Две крепости', 11, 179), +('Властелин колец: Возвращение короля', 11, 201), +('Гарри Поттер и философский камень', 11, 152), +('Гарри Поттер и Тайная комната', 11, 161), +('Гарри Поттер и узник Азкабана', 11, 142), +('Гарри Поттер и Кубок огня', 11, 157), +('Гарри Поттер и Орден Феникса', 11, 138), +('Гарри Поттер и Принц-полукровка', 11, 153), +('Гарри Поттер и Дары Смерти: Часть 1', 11, 146), +('Гарри Поттер и Дары Смерти: Часть 2', 11, 130), +('Пираты Карибского моря: Проклятие Черной жемчужины', 8, 143), +('Пираты Карибского моря: Сундук мертвеца', 8, 151), +('Пираты Карибского моря: На краю света', 8, 169), +('Пираты Карибского моря: На странных берегах', 8, 136), +('Пираты Карибского моря: Мертвецы не рассказывают сказки', 8, 129), +('Хоббит: Нежданное путешествие', 11, 169), +('Хоббит: Пустошь Смауга', 11, 161), +('Хоббит: Битва пяти воинств', 11, 144), +('Король Лев', 9, 88), +('Холодное сердце', 9, 102), +('Холодное сердце 2', 9, 103), +('Зверополис', 9, 108), +('История игрушек', 9, 81), +('История игрушек 2', 9, 92), +('История игрушек 3', 9, 103), +('История игрушек 4', 9, 100), +('В поисках Немо', 9, 100), +('В поисках Дори', 9, 97), +('Шрек', 9, 90), +('Шрек 2', 9, 93), +('Шрек Третий', 9, 93), +('Шрек навсегда', 9, 93), +('Кунг-фу Панда', 9, 92), +('Кунг-фу Панда 2', 9, 90), +('Кунг-фу Панда 3', 9, 95), +('Как приручить дракона', 9, 98), +('Как приручить дракона 2', 9, 102), +('Как приручить дракона 3', 9, 104), +('Рататуй', 9, 111), +('Головоломка', 9, 94), +('Суперсемейка', 9, 115), +('Суперсемейка 2', 9, 118), +('Тачки', 9, 117), +('Тачки 2', 9, 106), +('Тачки 3', 9, 102), +('Корпорация монстров', 9, 92), +('Университет монстров', 9, 104), +('Валл-И', 9, 98), +('Вверх', 9, 96), +('Храбрая сердцем', 9, 93), +('Ральф', 9, 101), +('Ральф против интернета', 9, 112), +('Моана', 9, 107), +('Зверопой', 9, 108), +('Зверопой 2', 9, 110), +('Коко', 9, 105), +('Душа', 9, 100), +('Лука', 9, 95), +('Райя и последний дракон', 9, 107), +('Энканто', 9, 102); diff --git a/core/sql/cinema_db_role_insert.sql b/core/sql/cinema_db_role_insert.sql new file mode 100644 index 0000000..ec40343 --- /dev/null +++ b/core/sql/cinema_db_role_insert.sql @@ -0,0 +1,9 @@ +-- Insert data into the roles table + +INSERT INTO roles (role_name, access_level) VALUES ('Cashier', 10); +INSERT INTO roles (role_name, access_level) VALUES ('SalesManager', 28); +INSERT INTO roles (role_name, access_level) VALUES ('DataEditor', 46); +INSERT INTO roles (role_name, access_level) VALUES ('RepertoireManager', 64); +INSERT INTO roles (role_name, access_level) VALUES ('DataAdministrator', 82); +INSERT INTO roles (role_name, access_level) VALUES ('SuperAdministrator', 100); + diff --git a/core/sql/cinema_db_user_insert.sql b/core/sql/cinema_db_user_insert.sql new file mode 100644 index 0000000..264b891 --- /dev/null +++ b/core/sql/cinema_db_user_insert.sql @@ -0,0 +1,40 @@ +-- Insert users with different roles + +-- Cashiers (role_id = 1), password: cashier (cashier1 & cashier2), cashier_alt (cashier3) +INSERT INTO users (username, password_hash, salt, role_id) VALUES +('cashier1', '43f4fded07f17b903867b8293ad429b0c826e5d2c8ac5a66ed58cf3cc511ee60', 'random_salt_1', 1); +INSERT INTO users (username, password_hash, salt, role_id) VALUES +('cashier2', '2a2aebce4cc19cfd384377617e3008d42caeb0172970b64e8d39778995950cfc', 'random_salt_2', 1); +INSERT INTO users (username, password_hash, salt, role_id) VALUES +('cashier3', 'a474eac28b808053cf8fddd7d53412d710c1adeb218c0bd7b91add5760b16885', 'random_salt_3', 1); + +-- Sales Managers (role_id = 2), password: sales_manager1, sales_manager2 +INSERT INTO users (username, password_hash, salt, role_id) VALUES +('sales_manager1', '3ac5657c3cc5b44e291aed9f3dcf4881af3c6c53b49b31ef5ab0e35ef04d32dc', 'random_salt_4', 2); +INSERT INTO users (username, password_hash, salt, role_id) VALUES +('sales_manager2', '40ad3df805e5173265f65206b1a9fa1c04b7f2ebbd30d5c4bc8ae496c01e89c3', 'random_salt_5', 2); + +-- Data Editors (role_id = 3), password: data_editor1, data_editor2 +INSERT INTO users (username, password_hash, salt, role_id) VALUES +('data_editor1', '53a6ad3f69d1ba0f16fab96a295340a70aa6dd4524a06a9e281b458ec1bffdeb', 'random_salt_6', 3); +INSERT INTO users (username, password_hash, salt, role_id) VALUES +('data_editor2', '074423b2b32d87ea875905962f10cabe0623b75532323f7a6d1f29ff51a556e0', 'random_salt_7', 3); + +-- Repertoire Managers (role_id = 4), password: repertoire_manager1, repertoire_manager2 +INSERT INTO users (username, password_hash, salt, role_id) VALUES +('repertoire_manager1', 'd57d697fe8df03559cbd7cb6c15d29fc6584556ba92291400db64a788a788bd5', 'random_salt_8', 4); +INSERT INTO users (username, password_hash, salt, role_id) VALUES +('repertoire_manager2', '74a0a0bceb65454779c8acb2705df36a905355e10b96fa0360a023aaddbac2cf', 'random_salt_9', 4); + +-- Data Administrators (role_id = 5), password: data_admin1, data_admin2 +INSERT INTO users (username, password_hash, salt, role_id) VALUES +('data_admin1', '1b755d9430baa5f6db977e3ed87fc9d2d0b6e89e35c0f04529ec7484ca57ab54', 'random_salt_10', 5); +INSERT INTO users (username, password_hash, salt, role_id) VALUES +('data_admin2', '465a2368e915fc5bbc8f1ff56fec3bb5fda92088cb64285b4419507012677bf3', 'random_salt_11', 5); + +-- Super Administrators (role_id = 6), password: super_admin1, super_admin2 +INSERT INTO users (username, password_hash, salt, role_id) VALUES +('super_admin1', 'b687b754afbbb073178a2b50f10dad03d0ff54019b771b1853c5ee3bfc6d93d2', 'random_salt_12', 6); +INSERT INTO users (username, password_hash, salt, role_id) VALUES +('super_admin2', 'cad48cc6068cfc8f164e16422f1c92e4cd52fa446d1ac2fa2a678406fa60c6b6', 'random_salt_13', 6); + diff --git a/core/utils/day_manager.cpp b/core/utils/day_manager.cpp new file mode 100644 index 0000000..c85277d --- /dev/null +++ b/core/utils/day_manager.cpp @@ -0,0 +1,246 @@ +#include "day_manager.h" + +#include +#include + +DayManager::DayManager(const QTime &begin, const QTime &end) : DayManager() { + addAvailableSlot(begin, end); +} + +void DayManager::addAvailableSlot(const QTime &begin, const QTime &end) { + if (!begin.isValid() || !end.isValid() || begin >= end) { + qWarning() << "DayManager::addAvailableSlot: begin or end is invalid"; + return; + } + if (begin.msecsTo(end) >= minDurationMs_) { + availableSlots_.insert(begin, end); + } +} + +QPair DayManager::reserve(const QTime &duration) { + if (!duration.isValid()) { + qWarning() << "DayManager::reserve: duration is invalid"; + return {}; + } + + const qint64 requiredMs = duration.msecsSinceStartOfDay(); + if (requiredMs <= 0) { + qWarning() << "DayManager::reserve: duration is invalid"; + return {}; + } + + QPair result = reserveImpl(requiredMs); + if (!isAvailable(result.first, result.second)) { + return {}; + } + + ++createdRecords_; + return result; +} + +template +bool DayManager::isAvailable(const QTime &first, const Times &...others) const { + static const auto isAvailable = [](const QTime &time) { + return time.isValid(); + }; + return isAvailable(first) && isAvailable(others...); +} + +QList> +DayManager::availableSlots(qint64 requiredMs) const { + QList> result; + for (auto const &[begin, end] : availableSlots_.asKeyValueRange()) { + if (begin.msecsTo(end) >= requiredMs) { + result.append(begin); + } + } + return result; +} + +QPair DayManager::reserveAvailableSlotLeft(QTime begin, + qint64 requiredMs) { + QTime end = availableSlots_.value(begin); + + QTime reservedEnd = begin.addMSecs(requiredMs); + if (reservedEnd < end) { + addAvailableSlot(reservedEnd, end); + } + availableSlots_.remove(begin); + + return {begin, reservedEnd}; +} + +QPair DayManager::reserveAvailableSlotRight(QTime begin, + qint64 requiredMs) { + QTime end = availableSlots_.value(begin); + availableSlots_.remove(begin); + + QTime reservedBegin = end.addMSecs(-requiredMs); + if (reservedBegin > begin) { + addAvailableSlot(begin, reservedBegin); + } + + return {reservedBegin, end}; +} + +QPair DayManager::reserveAvailableSlotRandom(QTime begin, + qint64 requiredMs) { + QTime end = availableSlots_.value(begin); + if (!end.isValid()) { + qCritical() << "DayManager::reserveAvailableSlotRandom: end is invalid"; + } + + qint64 beginMs = begin.msecsSinceStartOfDay(); + qint64 endMs = end.msecsSinceStartOfDay(); + + // x <= bounded(x, y) < y + qint64 highestMs = endMs - requiredMs; + qint64 startTimeMs = + QRandomGenerator::global()->bounded(beginMs, highestMs + 1); + + if (startTimeMs == beginMs) { + return reserveAvailableSlotLeft(begin, requiredMs); + } + if (startTimeMs == highestMs) { + return reserveAvailableSlotRight(begin, requiredMs); + } + + availableSlots_.remove(begin); + + QTime reservedBegin = QTime::fromMSecsSinceStartOfDay(startTimeMs); + QTime reservedEnd = QTime::fromMSecsSinceStartOfDay(startTimeMs + requiredMs); + + addAvailableSlot(begin, reservedBegin); + addAvailableSlot(reservedEnd, end); + + return {reservedBegin, reservedEnd}; +} + +QPair DayManager::reserveAvailableSlot(QTime begin, + qint64 requiredMs) { + switch (startTimeMode_) { + case StartTimeMode::Left: + return reserveAvailableSlotLeft(begin, requiredMs); + case StartTimeMode::Random: + return reserveAvailableSlotRandom(begin, requiredMs); + case StartTimeMode::Right: + return reserveAvailableSlotRight(begin, requiredMs); + default: + qWarning() << "DayManager::reserve: unknown start time mode"; + return {}; + } +} + +QPair DayManager::reserveImplMaximal(qint64 requiredMs) { + auto keys = availableSlots(requiredMs); + if (keys.isEmpty()) { + return {}; + } + + QTime begin = *std::max_element( + keys.begin(), keys.end(), [this](const auto &largest, const auto &other) { + return duration(largest) < duration(other); + }); + return reserveAvailableSlot(begin, requiredMs); +} + +QPair DayManager::reserveImplMinimal(qint64 requiredMs) { + auto keys = availableSlots(requiredMs); + if (keys.isEmpty()) { + return {}; + } + + QTime begin = + *std::min_element(keys.begin(), keys.end(), + [this](const QTime &smallest, const QTime &other) { + return duration(smallest) < duration(other); + }); + return reserveAvailableSlot(begin, requiredMs); +} + +QPair DayManager::reserveImplQuick(qint64 requiredMs) { + for (auto const &[begin, end] : availableSlots_.asKeyValueRange()) { + if (begin.msecsTo(end) >= requiredMs) { + return reserveAvailableSlot(begin, requiredMs); + } + } + + return {}; +} + +QPair DayManager::reserveImplRandom(qint64 requiredMs) { + auto keys = availableSlots(requiredMs); + if (keys.isEmpty()) { + return {}; + } + + QRandomGenerator *g = QRandomGenerator::global(); + QTime begin = keys.at(g->bounded(keys.size())); + return reserveAvailableSlot(begin, requiredMs); +} + +QPair DayManager::reserveImpl(qint64 requiredMs) { + switch (slotSelectionMode_) { + case SlotSelectionMode::Quick: + return DayManager::reserveImplQuick(requiredMs); + case SlotSelectionMode::Maximal: + return DayManager::reserveImplMaximal(requiredMs); + case SlotSelectionMode::Minimal: + return DayManager::reserveImplMinimal(requiredMs); + case SlotSelectionMode::Random: + return DayManager::reserveImplRandom(requiredMs); + default: + qWarning() << "DayManager::reserve: unknown reserve mode"; + return {}; + } +} + +void DayManager::setMinDuration(const QTime &duration) { + if (!duration.isValid()) { + qWarning() << "DayManager::setMinDuration: duration is invalid"; + return; + } + + minDurationMs_ = duration.msecsSinceStartOfDay(); +} + +qsizetype DayManager::calculatePossibleReservations(qint64 requiredMs) const { + auto keys = availableSlots(requiredMs); + return std::accumulate(keys.begin(), keys.end(), 0, + [this, requiredMs](qsizetype sum, const QTime &key) { + qint64 durationMs = + duration(key).msecsSinceStartOfDay(); + return sum + std::floor(durationMs / requiredMs); + }); +} + +QTime DayManager::duration() const { + if (availableSlots_.isEmpty()) { + // qWarning() << "DayManager::duration: no available slots"; + return {}; + } + + const auto &kvRange = availableSlots_.asKeyValueRange(); + auto f = [this](qint64 sum, const auto &kv) -> qint64 { + auto const &[begin, end] = kv; + return sum + begin.msecsTo(end); + }; + qint64 sum = std::accumulate(kvRange.begin(), kvRange.end(), 0, f); + + return QTime::fromMSecsSinceStartOfDay(sum); +} + +QTime DayManager::duration(const QTime &begin) const { + if (!begin.isValid()) { + qWarning() << "DayManager::duration: begin is invalid"; + return {}; + } + + const QTime &end = availableSlots_.value(begin); + if (!end.isValid()) { + qWarning() << "DayManager::duration: end is invalid"; + return {}; + } + + return end.addMSecs(-begin.msecsSinceStartOfDay()); +} diff --git a/core/utils/day_manager.h b/core/utils/day_manager.h new file mode 100644 index 0000000..4e32395 --- /dev/null +++ b/core/utils/day_manager.h @@ -0,0 +1,75 @@ +#ifndef DAY_MANAGER_H +#define DAY_MANAGER_H + +#include + +class DayManager { +public: + enum class SlotSelectionMode { Maximal, Minimal, Quick, Random }; + enum class StartTimeMode { Left, Random, Right }; + +private: + QMap availableSlots_; + SlotSelectionMode slotSelectionMode_; + StartTimeMode startTimeMode_; + qint64 minDurationMs_; + qsizetype createdRecords_; + +public: + inline DayManager(); + explicit DayManager(const QTime &begin, const QTime &end); + + QPair reserve(const QTime &duration); + QTime duration() const; + QTime duration(const QTime &begin) const; + inline QTime minDuration() const noexcept; + inline qsizetype createdRecords() const noexcept; + inline qsizetype slotCount() const; + inline void setMode(SlotSelectionMode mode); + inline void setMode(StartTimeMode mode); + void addAvailableSlot(const QTime &begin, const QTime &end); + void setMinDuration(const QTime &duration); + + qsizetype calculatePossibleReservations(qint64 requiredMs) const; + +private: + template + bool isAvailable(const QTime &first, const Times &...others) const; + + QList> + availableSlots(qint64 requiredMs) const; + + QPair reserveAvailableSlot(QTime key, qint64 requiredMs); + QPair reserveAvailableSlotLeft(QTime key, qint64 requiredMs); + QPair reserveAvailableSlotRandom(QTime key, qint64 requiredMs); + QPair reserveAvailableSlotRight(QTime key, qint64 requiredMs); + QPair reserveImpl(qint64 requiredMs); + QPair reserveImplMaximal(qint64 requiredMs); + QPair reserveImplMinimal(qint64 requiredMs); + QPair reserveImplQuick(qint64 requiredMs); + QPair reserveImplRandom(qint64 requiredMs); + +private: + friend class DayManagerTest; +}; + +DayManager::DayManager() + : slotSelectionMode_(SlotSelectionMode::Minimal), + startTimeMode_(StartTimeMode::Left), minDurationMs_(1), + createdRecords_(0) {} + +void DayManager::setMode(SlotSelectionMode mode) { slotSelectionMode_ = mode; } + +void DayManager::setMode(StartTimeMode mode) { startTimeMode_ = mode; } + +inline QTime DayManager::minDuration() const noexcept { + return QTime::fromMSecsSinceStartOfDay(minDurationMs_); +} + +qsizetype DayManager::createdRecords() const noexcept { + return createdRecords_; +} + +qsizetype DayManager::slotCount() const { return availableSlots_.size(); } + +#endif // DAY_MANAGER_H diff --git a/core/utils/reservation_manager.cpp b/core/utils/reservation_manager.cpp new file mode 100644 index 0000000..9453ee7 --- /dev/null +++ b/core/utils/reservation_manager.cpp @@ -0,0 +1,131 @@ +#include "reservation_manager.h" + +#include + +ReservationManager::ReservationManager(qsizetype dayRange, qsizetype dayBound, + const DayManager &reference) + : createdRecords_(0), dayBound_(dayBound), dayRange_(dayRange), + excludedDays_(0), lastIndex_(-1), dayReference_(reference) { + prepareDaysRange(); +} + +void ReservationManager::setReference(const DayManager &reference) { + dayReference_ = reference; + days_.clear(); + lastIndex_ = -1; + prepareDaysRange(); +} + +qsizetype ReservationManager::calculateAvailableDaysCount() const { + qsizetype bound = + dayBound_ != -1 ? dayBound_ : std::numeric_limits::max(); + return bound - excludedDays_; +} + +qsizetype +ReservationManager::calculatePossibleReservations(qint64 requiredMs) const { + qsizetype possibleReservations = std::accumulate( + days_.cbegin(), days_.cend(), 0, + [&](qsizetype sum, const DayManager manager) { + return sum + manager.calculatePossibleReservations(requiredMs); + }); + + qsizetype possibleReservationsByReference = + dayReference_.calculatePossibleReservations(requiredMs); + qsizetype futureReservationsCount = + calculateAvailableDaysCount() - days_.size(); + + return possibleReservations + + possibleReservationsByReference * futureReservationsCount; +} + +qsizetype ReservationManager::calculateAvailableSlotsCount() const { + return std::accumulate(days_.cbegin(), days_.cend(), 0, + [&](qsizetype sum, const DayManager manager) { + return sum + manager.slotCount(); + }); +} + +QPair ReservationManager::reserve(const QTime &duration) { + if (!duration.isValid()) { + qWarning() << "ReservationManager::reserve: duration is invalid"; + return {}; + } + + const qint64 requiredMs = duration.msecsSinceStartOfDay(); + if (requiredMs <= 0) { + qWarning() + << "ReservationManager::reserve: duration should be greater than 0"; + return {}; + } + + if (days_.isEmpty()) { + qWarning() << "ReservationManager::reserve: no available days"; + return {}; + } + + std::mt19937 g{std::random_device{}()}; + QList dayIndexes = days_.keys(); + std::shuffle(dayIndexes.begin(), dayIndexes.end(), g); + + for (qsizetype dayIndex : dayIndexes) { + QPair result = reserve(dayIndex, duration); + const auto &[beginDateTime, endTime] = result; + if (beginDateTime.isValid() && endTime.isValid()) { + ++createdRecords_; + return result; + } + } + + // qWarning() << "ReservationManager::reserve: reservation failed"; + return {}; +} + +DayManager &ReservationManager::dayManager(qsizetype dayIndex) { + auto it = days_.find(dayIndex); + if (it != days_.end()) { + return it.value(); + } + qCritical() << "ReservationManager::dayManager: dayIndex is out of range"; + throw std::out_of_range("dayIndex is out of range"); +} + +QPair ReservationManager::reserve(qsizetype dayIndex, + const QTime &duration) { + + QTime beginTime, endTime; + DayManager &dayManagerValue = dayManager(dayIndex); + + std::tie(beginTime, endTime) = dayManagerValue.reserve(duration); + + if (!dayManagerValue.duration().isValid()) { + days_.remove(dayIndex); + ++excludedDays_; + } + prepareDaysRange(); // Add new days after excluded days + + QDate beginDate = QDateTime::fromMSecsSinceEpoch(0).date().addDays(dayIndex); + QDateTime beginDateTime(beginDate, beginTime); + + return {std::move(beginDateTime), std::move(endTime)}; +} + +void ReservationManager::prepareDaysRange() { + if (!dayReference_.duration().isValid()) { + qWarning() << "ReservationManager::prepareDaysRange: reference is invalid"; + return; + } + + auto condition = [this](qsizetype currentSize) { + qsizetype bound = + dayBound_ != -1 ? dayBound_ : std::numeric_limits::max(); + if (lastIndex_ + 1 < bound) { + return currentSize < dayRange_; + } + return false; + }; + + for (qsizetype size = days_.size(); condition(size); ++size) { + days_[++lastIndex_] = DayManager(dayReference_); + } +} diff --git a/core/utils/reservation_manager.h b/core/utils/reservation_manager.h new file mode 100644 index 0000000..a49544d --- /dev/null +++ b/core/utils/reservation_manager.h @@ -0,0 +1,62 @@ +#ifndef RESERVATION_MANAGER_H +#define RESERVATION_MANAGER_H + +#include "day_manager.h" + +class ReservationManager { +private: + DayManager dayReference_; + QMap days_; + qsizetype createdRecords_; + qsizetype dayBound_; + qsizetype dayRange_; + qsizetype excludedDays_; + qsizetype lastIndex_; + +public: + inline ReservationManager() noexcept; + explicit ReservationManager(qsizetype dayRange, qsizetype dayBound, + const DayManager &reference); + + inline DayManager reference() const noexcept; + inline qsizetype createdRecords() const noexcept; + inline void setDayBound(qsizetype dayBound); + inline void setDayRange(qsizetype dayRange); + void setReference(const DayManager &manager); + + qsizetype calculateAvailableDaysCount() const; + qsizetype calculatePossibleReservations(qint64 requiredMs) const; + qsizetype calculateAvailableSlotsCount() const; + + QPair reserve(const QTime &duration); + +private: + DayManager &dayManager(qsizetype dayIndex); + QPair reserve(qsizetype dayIndex, const QTime &duration); + void prepareDaysRange(); + +private: + friend class ReservationManagerTest; +}; + +ReservationManager::ReservationManager() noexcept + : createdRecords_(0), dayBound_(-1), excludedDays_(0), lastIndex_(-1), + dayReference_(DayManager()) {} + +DayManager ReservationManager::reference() const noexcept { + return dayReference_; +} + +inline qsizetype ReservationManager::createdRecords() const noexcept { + return createdRecords_; +} + +void ReservationManager::setDayBound(qsizetype dayBound) { + dayBound_ = dayBound; +} + +void ReservationManager::setDayRange(qsizetype dayRange) { + dayRange_ = dayRange; +} + +#endif // RESERVATION_MANAGER_H diff --git a/data/sql/base_sql_table_repository.cpp b/data/sql/base_sql_table_repository.cpp new file mode 100644 index 0000000..7818e55 --- /dev/null +++ b/data/sql/base_sql_table_repository.cpp @@ -0,0 +1,23 @@ +#include "base_sql_table_repository.h" + +#include +#include + +BaseSqlTableRepository::BaseSqlTableRepository(QSqlDatabase &database, + QObject *parent) + : DataRepositorySignals(parent), database_(database) { + if (!database_.isOpen()) { + qWarning() << "Database is not open: Database name:" + << database_.databaseName() + << "Database connection name:" << database_.connectionName(); + } +} + +QSqlQuery BaseSqlTableRepository::foreignKeysOnQuery() const { + QSqlQuery query(database_); + if (!query.exec("PRAGMA foreign_keys = ON")) { + qFatal() << "Failed to enable foreign keys:" << query.lastError().text(); + } + + return query; +} diff --git a/data/sql/base_sql_table_repository.h b/data/sql/base_sql_table_repository.h new file mode 100644 index 0000000..7d59fbc --- /dev/null +++ b/data/sql/base_sql_table_repository.h @@ -0,0 +1,20 @@ +#ifndef BASE_REPOSITORY_H +#define BASE_REPOSITORY_H + +#include "data_repository_signals.h" +#include + +class BaseSqlTableRepository : public DataRepositorySignals { +protected: + QSqlDatabase database_; + +public: + BaseSqlTableRepository(QSqlDatabase &database, QObject *parent); + + virtual ~BaseSqlTableRepository() = default; + +protected: + QSqlQuery foreignKeysOnQuery() const; +}; + +#endif // BASE_REPOSITORY_H diff --git a/data/sql/data_repository_signals.h b/data/sql/data_repository_signals.h new file mode 100644 index 0000000..43ed09c --- /dev/null +++ b/data/sql/data_repository_signals.h @@ -0,0 +1,32 @@ +#ifndef DATA_REPOSITORY_SIGNALS_H +#define DATA_REPOSITORY_SIGNALS_H + +#include + +// Inherits from QObject fore emitting signals +class DataRepositorySignals : public QObject { + Q_OBJECT + +public: + // Parent is not required + explicit DataRepositorySignals(QObject *parent = nullptr) : QObject(parent) {} + + virtual ~DataRepositorySignals() = default; + +signals: + // Emitted when data is created + void dataCreated(); + + // Emitted when data is updated + void dataUpdated(); + + // Emitted when data is deleted + void dataDeleted(); + + // WARNING: const context is required for emit in const methods + + // Emitted when data is retrieved + void dataRetrieved() const; +}; + +#endif diff --git a/data/sql/genres_repository.cpp b/data/sql/genres_repository.cpp new file mode 100644 index 0000000..df50e11 --- /dev/null +++ b/data/sql/genres_repository.cpp @@ -0,0 +1,99 @@ +#include "genres_repository.h" + +#include "create_genre_request.h" +#include "genre_dto.h" +#include "repository_result.h" +#include "update_genre_request.h" +#include +#include + +GenresRepository::GenresRepository(QSqlDatabase &database, QObject *parent) + : BaseSqlTableRepository(database, parent) {} + +RepositoryResult +GenresRepository::createGenre(const CreateGenreRequest &request) { + QSqlQuery query = foreignKeysOnQuery(); + query.prepare("INSERT INTO genres (genre_name) VALUES (:genre_name)"); + query.bindValue(":genre_name", request.genreName()); + + if (!query.exec()) { + return RepositoryResult::failureResult(query.lastError().text()); + } + + emit dataCreated(); + return RepositoryResult::successResult(); +} + +RepositoryResult GenresRepository::getGenreById(qint32 id, + GenreDTO &genre) const { + QSqlQuery query = foreignKeysOnQuery(); + query.prepare( + "SELECT genre_id, genre_name FROM genres WHERE genre_id = :genre_id"); + query.bindValue(":genre_id", id); + + if (!query.exec()) { + return RepositoryResult::failureResult(query.lastError().text()); + } + if (!query.next()) { + return RepositoryResult::failureResult("Genre not found"); + } + + genre = mapQueryToDTO(query); + + emit dataRetrieved(); + return RepositoryResult::successResult(); +} + +RepositoryResult +GenresRepository::getAllGenres(QVector &genres) const { + QSqlQuery query = foreignKeysOnQuery(); + query.prepare("SELECT genre_id, genre_name FROM genres"); + + if (!query.exec()) { + return RepositoryResult::failureResult(query.lastError().text()); + } + + while (query.next()) { + genres.append(mapQueryToDTO(query)); + } + + emit dataRetrieved(); + return RepositoryResult::successResult(); +} + +RepositoryResult +GenresRepository::updateGenre(const UpdateGenreRequest &request) { + QSqlQuery query = foreignKeysOnQuery(); + query.prepare( + "UPDATE genres SET genre_name = :genre_name WHERE genre_id = :genre_id"); + query.bindValue(":genre_name", request.genreName()); + query.bindValue(":genre_id", request.genreId()); + + if (!query.exec()) { + return RepositoryResult::failureResult(query.lastError().text()); + } + + emit dataUpdated(); + return RepositoryResult::successResult(); +} + +RepositoryResult GenresRepository::deleteGenreById(qint32 genreId) { + QSqlQuery query = foreignKeysOnQuery(); + query.prepare("DELETE FROM genres WHERE genre_id = :genre_id"); + query.bindValue(":genre_id", genreId); + + if (!query.exec()) { + return RepositoryResult::failureResult(query.lastError().text()); + } + + emit dataDeleted(); + return RepositoryResult::successResult(); +} + +GenreDTO GenresRepository::mapQueryToDTO(const QSqlQuery &query) const { + GenreDTO genreDTO; + genreDTO.setGenreId(query.value("genre_id").toInt()); + genreDTO.setGenreName(query.value("genre_name").toString()); + + return genreDTO; +} diff --git a/data/sql/genres_repository.h b/data/sql/genres_repository.h new file mode 100644 index 0000000..48892ff --- /dev/null +++ b/data/sql/genres_repository.h @@ -0,0 +1,38 @@ +#ifndef GENRES_REPOSITORY_H +#define GENRES_REPOSITORY_H + +#include "base_sql_table_repository.h" +#include "genres_repository_interface.h" + +#include + +class GenresRepository : public GenresRepositoryInterface, + public BaseSqlTableRepository { +public: + explicit GenresRepository(QSqlDatabase &database, QObject *parent); + + // CRUD operations + // clang-format off + + RepositoryResult + createGenre(const CreateGenreRequest &request) override; + + RepositoryResult + getGenreById(qint32 genreId, GenreDTO &genre) const override; + + RepositoryResult + getAllGenres(QVector &genres) const override; + + RepositoryResult + updateGenre(const UpdateGenreRequest &request) override; + + RepositoryResult + deleteGenreById(qint32 genreId) override; + + // clang-format on + +private: + GenreDTO mapQueryToDTO(const QSqlQuery &query) const; +}; + +#endif // GENRES_REPOSITORY_H diff --git a/data/sql/halls_repository.cpp b/data/sql/halls_repository.cpp new file mode 100644 index 0000000..a1b966b --- /dev/null +++ b/data/sql/halls_repository.cpp @@ -0,0 +1,99 @@ +#include "halls_repository.h" + +#include "create_hall_request.h" +#include "hall_dto.h" +#include "repository_result.h" +#include "update_hall_request.h" +#include +#include + +HallsRepository::HallsRepository(QSqlDatabase &database, QObject *parent) + : BaseSqlTableRepository(database, parent) {} + +RepositoryResult HallsRepository::createHall(const CreateHallRequest &request) { + QSqlQuery query = foreignKeysOnQuery(); + query.prepare("INSERT INTO halls (hall_name, capacity) VALUES " + "(:hall_name, :capacity)"); + query.bindValue(":hall_name", request.hallName()); + query.bindValue(":capacity", request.capacity()); + + if (!query.exec()) { + return RepositoryResult::failureResult(query.lastError().text()); + } + + emit dataCreated(); + return RepositoryResult::successResult(); +} + +RepositoryResult HallsRepository::getHallById(qint32 id, HallDTO &hall) const { + QSqlQuery query = foreignKeysOnQuery(); + query.prepare( + "SELECT hall_id, hall_name, capacity FROM halls WHERE hall_id = :id"); + query.bindValue(":id", id); + + if (!query.exec()) { + return RepositoryResult::failureResult(query.lastError().text()); + } + if (!query.next()) { + return RepositoryResult::failureResult("Hall not found"); + } + + hall = mapQueryToDTO(query); + + emit dataRetrieved(); + return RepositoryResult::successResult(); +} + +RepositoryResult HallsRepository::getAllHalls(QVector &halls) const { + QSqlQuery query = foreignKeysOnQuery(); + query.prepare("SELECT hall_id, hall_name, capacity FROM halls"); + + if (!query.exec()) { + return RepositoryResult::failureResult(query.lastError().text()); + } + + while (query.next()) { + halls.append(mapQueryToDTO(query)); + } + + emit dataRetrieved(); + return RepositoryResult::successResult(); +} + +RepositoryResult HallsRepository::updateHall(const UpdateHallRequest &request) { + QSqlQuery query = foreignKeysOnQuery(); + query.prepare("UPDATE halls SET hall_name = :hall_name, capacity = :capacity " + "WHERE hall_id = :hall_id"); + query.bindValue(":capacity", request.capacity()); + query.bindValue(":hall_id", request.hallId()); + query.bindValue(":hall_name", request.hallName()); + + if (!query.exec()) { + return RepositoryResult::failureResult(query.lastError().text()); + } + + emit dataUpdated(); + return RepositoryResult::successResult(); +} + +RepositoryResult HallsRepository::deleteHallById(qint32 hallId) { + QSqlQuery query = foreignKeysOnQuery(); + query.prepare("DELETE FROM halls WHERE hall_id = :hall_id"); + query.bindValue(":hall_id", hallId); + + if (!query.exec()) { + return RepositoryResult::failureResult(query.lastError().text()); + } + + emit dataDeleted(); + return RepositoryResult::successResult(); +} + +HallDTO HallsRepository::mapQueryToDTO(const QSqlQuery &query) const { + HallDTO hallDTO; + hallDTO.setCapacity(query.value("capacity").toInt()); + hallDTO.setHallId(query.value("hall_id").toInt()); + hallDTO.setHallName(query.value("hall_name").toString()); + + return hallDTO; +} diff --git a/data/sql/halls_repository.h b/data/sql/halls_repository.h new file mode 100644 index 0000000..617b017 --- /dev/null +++ b/data/sql/halls_repository.h @@ -0,0 +1,39 @@ +#ifndef HALLS_REPOSITORY_H +#define HALLS_REPOSITORY_H + +#include "base_sql_table_repository.h" +#include "halls_repository_interface.h" + +#include +#include + +class HallsRepository : public HallsRepositoryInterface, + public BaseSqlTableRepository { +public: + explicit HallsRepository(QSqlDatabase &database, QObject *parent); + + // CRUD operations + // clang-format off + + RepositoryResult + createHall(const CreateHallRequest &request) override; + + RepositoryResult + getHallById(qint32 hallId, HallDTO &hall) const override; + + RepositoryResult + getAllHalls(QVector &halls) const override; + + RepositoryResult + updateHall(const UpdateHallRequest &request) override; + + RepositoryResult + deleteHallById(qint32 hallId) override; + + // clang-format on + +private: + HallDTO mapQueryToDTO(const QSqlQuery &query) const; +}; + +#endif // HALLS_REPOSITORY_H diff --git a/data/sql/movies_repository.cpp b/data/sql/movies_repository.cpp new file mode 100644 index 0000000..94efe82 --- /dev/null +++ b/data/sql/movies_repository.cpp @@ -0,0 +1,106 @@ +#include "movies_repository.h" + +#include "create_movie_request.h" +#include "movie_dto.h" +#include "repository_result.h" +#include "update_movie_request.h" +#include +#include + +MoviesRepository::MoviesRepository(QSqlDatabase &database, QObject *parent) + : BaseSqlTableRepository(database, parent) {} + +RepositoryResult +MoviesRepository::createMovie(const CreateMovieRequest &request) { + QSqlQuery query = foreignKeysOnQuery(); + query.prepare("INSERT INTO movies (title, genre_id, duration) VALUES " + "(:title, :genre_id, :duration)"); + query.bindValue(":title", request.title()); + query.bindValue(":genre_id", request.genreId()); + query.bindValue(":duration", request.duration()); + + if (!query.exec()) { + return RepositoryResult::failureResult(query.lastError().text()); + } + + emit dataCreated(); + return RepositoryResult::successResult(); +} + +RepositoryResult +MoviesRepository::getAllMovies(QVector &movies) const { + QSqlQuery query = foreignKeysOnQuery(); + query.prepare("SELECT movie_id, title, genre_id, duration FROM movies"); + + if (!query.exec()) { + return RepositoryResult::failureResult(query.lastError().text()); + } + + while (query.next()) { + movies.append(mapQueryToDTO(query)); + } + + emit dataRetrieved(); + return RepositoryResult::successResult(); +} + +RepositoryResult MoviesRepository::getMovieById(qint32 id, + MovieDTO &movie) const { + QSqlQuery query = foreignKeysOnQuery(); + query.prepare("SELECT movie_id, title, genre_id, duration FROM movies WHERE " + "movie_id = :id"); + query.bindValue(":id", id); + + if (!query.exec()) { + return RepositoryResult::failureResult(query.lastError().text()); + } + if (!query.next()) { + return RepositoryResult::failureResult("Movie not found"); + } + + movie = mapQueryToDTO(query); + + emit dataRetrieved(); + return RepositoryResult::successResult(); +} + +RepositoryResult +MoviesRepository::updateMovie(const UpdateMovieRequest &request) { + QSqlQuery query = foreignKeysOnQuery(); + query.prepare("UPDATE movies SET title = :title, genre_id = :genre_id, " + "duration = :duration WHERE movie_id = :id"); + query.bindValue(":duration", request.duration()); + query.bindValue(":genre_id", request.genreId()); + query.bindValue(":id", request.movieId()); + query.bindValue(":title", request.title()); + + if (!query.exec()) { + return RepositoryResult::failureResult(query.lastError().text()); + } + + emit dataUpdated(); + return RepositoryResult::successResult(); +} + +RepositoryResult MoviesRepository::deleteMovieById(qint32 movieId) { + QSqlQuery query = foreignKeysOnQuery(); + query.prepare("DELETE FROM movies WHERE movie_id = :id"); + query.bindValue(":id", movieId); + + if (!query.exec()) { + return RepositoryResult::failureResult(query.lastError().text()); + } + + emit dataDeleted(); + return RepositoryResult::successResult(); +} + +MovieDTO MoviesRepository::mapQueryToDTO(const QSqlQuery &query) const { + MovieDTO movieDTO; + movieDTO.setDuration(query.value("duration").toInt()); + movieDTO.setGenreId(query.value("genre_id").toInt()); + movieDTO.setMovieId(query.value("movie_id").toInt()); + movieDTO.setTitle(query.value("title").toString()); + + return movieDTO; +} diff --git a/data/sql/movies_repository.h b/data/sql/movies_repository.h new file mode 100644 index 0000000..723bbbd --- /dev/null +++ b/data/sql/movies_repository.h @@ -0,0 +1,38 @@ +#ifndef MOVIES_REPOSITORY_H +#define MOVIES_REPOSITORY_H + +#include "base_sql_table_repository.h" +#include "movies_repository_interface.h" + +#include + +class MoviesRepository : public MoviesRepositoryInterface, + public BaseSqlTableRepository { +public: + explicit MoviesRepository(QSqlDatabase &database, QObject *parent); + + // CRUD operations + // clang-format off + + RepositoryResult + createMovie(const CreateMovieRequest &request) override; + + RepositoryResult + getMovieById(qint32 movieId, MovieDTO &movie) const override; + + RepositoryResult + getAllMovies(QVector &movies) const override; + + RepositoryResult + updateMovie(const UpdateMovieRequest &request) override; + + RepositoryResult + deleteMovieById(qint32 movieId) override; + + // clang-format on + +private: + MovieDTO mapQueryToDTO(const QSqlQuery &query) const; +}; + +#endif // MOVIES_REPOSITORY_H diff --git a/data/sql/refunds_repository.cpp b/data/sql/refunds_repository.cpp new file mode 100644 index 0000000..a966ce3 --- /dev/null +++ b/data/sql/refunds_repository.cpp @@ -0,0 +1,114 @@ +#include "refunds_repository.h" + +#include "create_refund_request.h" +#include "refund_dto.h" +#include "repository_result.h" +#include "update_refund_request.h" +#include +#include + +RefundsRepository::RefundsRepository(QSqlDatabase &database, QObject *parent) + : BaseSqlTableRepository(database, parent) {} + +RepositoryResult +RefundsRepository::createRefund(const CreateRefundRequest &request) { + QSqlQuery query = foreignKeysOnQuery(); + query.prepare("INSERT INTO refunds (ticket_id, refund_at, refund_amount) " + "VALUES (:ticket_id, :refund_at, :refund_amount)"); + query.bindValue(":ticket_id", request.ticketId()); + query.bindValue(":refund_at", request.refundAt()); + query.bindValue(":refund_amount", request.refundAmount()); + + if (!query.exec()) { + return RepositoryResult::failureResult(query.lastError().text()); + } + + emit dataCreated(); + return RepositoryResult::successResult(); +} + +RepositoryResult RefundsRepository::getRefundById(qint32 id, + RefundDTO &refund) const { + QSqlQuery query = foreignKeysOnQuery(); + query.prepare("SELECT refund_id, ticket_id, refund_at, refund_amount FROM " + "refunds WHERE refund_id = :id"); + query.bindValue(":id", id); + + if (!query.exec()) { + return RepositoryResult::failureResult(query.lastError().text()); + } + if (!query.next()) { + return RepositoryResult::failureResult("Refund not found"); + } + + RefundDTO refundDTO; + refundDTO.setRefundAmount(query.value("refund_amount").toDouble()); + refundDTO.setRefundAt(query.value("refund_at").toDateTime()); + refundDTO.setRefundId(query.value("refund_id").toInt()); + refundDTO.setTicketId(query.value("ticket_id").toInt()); + + refund = mapQueryToDTO(query); + + emit dataRetrieved(); + return RepositoryResult::successResult(); +} + +RepositoryResult +RefundsRepository::getAllRefunds(QVector &refunds) const { + QSqlQuery query = foreignKeysOnQuery(); + query.prepare( + "SELECT refund_id, ticket_id, refund_at, refund_amount FROM refunds"); + + if (!query.exec()) { + return RepositoryResult::failureResult(query.lastError().text()); + } + + while (query.next()) { + refunds.append(mapQueryToDTO(query)); + } + + emit dataRetrieved(); + return RepositoryResult::successResult(); +} + +RepositoryResult +RefundsRepository::updateRefund(const UpdateRefundRequest &request) { + QSqlQuery query = foreignKeysOnQuery(); + query.prepare( + "UPDATE refunds SET ticket_id = :ticket_id, refund_at = :refund_at, " + "refund_amount = :refund_amount WHERE refund_id = :refund_id"); + query.bindValue(":refund_amount", request.refundAmount()); + query.bindValue(":refund_at", request.refundAt()); + query.bindValue(":refund_id", request.refundId()); + query.bindValue(":ticket_id", request.ticketId()); + + if (!query.exec()) { + return RepositoryResult::failureResult(query.lastError().text()); + } + + emit dataUpdated(); + return RepositoryResult::successResult(); +} + +RepositoryResult RefundsRepository::deleteRefundById(qint32 refundId) { + QSqlQuery query = foreignKeysOnQuery(); + query.prepare("DELETE FROM refunds WHERE refund_id = :refund_id"); + query.bindValue(":refund_id", refundId); + + if (!query.exec()) { + return RepositoryResult::failureResult(query.lastError().text()); + } + + emit dataDeleted(); + return RepositoryResult::successResult(); +} + +RefundDTO RefundsRepository::mapQueryToDTO(const QSqlQuery &query) const { + RefundDTO refundDTO; + refundDTO.setRefundAmount(query.value("refund_amount").toDouble()); + refundDTO.setRefundAt(query.value("refund_at").toDateTime()); + refundDTO.setRefundId(query.value("refund_id").toInt()); + refundDTO.setTicketId(query.value("ticket_id").toInt()); + + return refundDTO; +} diff --git a/data/sql/refunds_repository.h b/data/sql/refunds_repository.h new file mode 100644 index 0000000..dd6521b --- /dev/null +++ b/data/sql/refunds_repository.h @@ -0,0 +1,37 @@ +#ifndef REFUNDS_REPOSITORY_H +#define REFUNDS_REPOSITORY_H + +#include "base_sql_table_repository.h" +#include "refunds_repository_interface.h" + +#include + +class RefundsRepository : public RefundsRepositoryInterface, + public BaseSqlTableRepository { +public: + explicit RefundsRepository(QSqlDatabase &database, QObject *parent); + + // CRUD operations + // clang-format off + + RepositoryResult + createRefund(const CreateRefundRequest &request) override; + + RepositoryResult + getRefundById(qint32 refundId, RefundDTO &refund) const override; + + RepositoryResult + getAllRefunds(QVector &refunds) const override; + + RepositoryResult + updateRefund(const UpdateRefundRequest &request) override; + + RepositoryResult + deleteRefundById(qint32 refundId) override; + + // clang-format on +private: + RefundDTO mapQueryToDTO(const QSqlQuery &query) const; +}; + +#endif // REFUNDS_REPOSITORY_H diff --git a/data/sql/roles_repository.cpp b/data/sql/roles_repository.cpp new file mode 100644 index 0000000..fd24697 --- /dev/null +++ b/data/sql/roles_repository.cpp @@ -0,0 +1,98 @@ +#include "roles_repository.h" + +#include "create_role_request.h" +#include "repository_result.h" +#include "role_dto.h" +#include "update_role_request.h" +#include +#include + +RolesRepository::RolesRepository(QSqlDatabase &database, QObject *parent) + : BaseSqlTableRepository(database, parent) {} + +RepositoryResult RolesRepository::createRole(const CreateRoleRequest &request) { + QSqlQuery query = foreignKeysOnQuery(); + query.prepare("INSERT INTO roles (role_name, access_level) VALUES " + "(:role_name, :access_level)"); + query.bindValue(":role_name", request.roleName()); + query.bindValue(":access_level", request.accessLevel()); + + if (!query.exec()) { + return RepositoryResult::failureResult(query.lastError().text()); + } + + emit dataCreated(); + return RepositoryResult::successResult(); +} + +RepositoryResult RolesRepository::getRoleById(qint32 id, RoleDTO &role) const { + QSqlQuery query = foreignKeysOnQuery(); + query.prepare("SELECT role_id, role_name, access_level FROM roles WHERE " + "role_id = :role_id"); + query.bindValue(":role_id", id); + + if (!query.exec()) { + return RepositoryResult::failureResult(query.lastError().text()); + } + if (!query.next()) { + return RepositoryResult::failureResult("Role not found"); + } + + role = mapQueryToDTO(query); + + emit dataRetrieved(); + return RepositoryResult::successResult(); +} + +RepositoryResult RolesRepository::getAllRoles(QVector &roles) const { + QSqlQuery query = foreignKeysOnQuery(); + query.prepare("SELECT role_id, role_name, access_level FROM roles"); + + if (!query.exec()) { + return RepositoryResult::failureResult(query.lastError().text()); + } + + while (query.next()) { + roles.append(mapQueryToDTO(query)); + } + + emit dataRetrieved(); + return RepositoryResult::successResult(); +} + +RepositoryResult RolesRepository::updateRole(const UpdateRoleRequest &request) { + QSqlQuery query = foreignKeysOnQuery(); + query.prepare( + "UPDATE roles SET role_name = :role_name WHERE role_id = :role_id"); + query.bindValue(":role_name", request.roleName()); + query.bindValue(":role_id", request.roleId()); + + if (!query.exec()) { + return RepositoryResult::failureResult(query.lastError().text()); + } + + emit dataUpdated(); + return RepositoryResult::successResult(); +} + +RepositoryResult RolesRepository::deleteRoleById(qint32 roleId) { + QSqlQuery query = foreignKeysOnQuery(); + query.prepare("DELETE FROM roles WHERE role_id = :role_id"); + query.bindValue(":role_id", roleId); + + if (!query.exec()) { + return RepositoryResult::failureResult(query.lastError().text()); + } + + emit dataDeleted(); + return RepositoryResult::successResult(); +} + +RoleDTO RolesRepository::mapQueryToDTO(const QSqlQuery &query) const { + RoleDTO roleDTO; + roleDTO.setAccessLevel(query.value("access_level").toInt()); + roleDTO.setRoleId(query.value("role_id").toInt()); + roleDTO.setRoleName(query.value("role_name").toString()); + + return roleDTO; +} diff --git a/data/sql/roles_repository.h b/data/sql/roles_repository.h new file mode 100644 index 0000000..3cd6fd3 --- /dev/null +++ b/data/sql/roles_repository.h @@ -0,0 +1,38 @@ +#ifndef ROLES_REPOSITORY_H +#define ROLES_REPOSITORY_H + +#include "base_sql_table_repository.h" +#include "roles_repository_interface.h" + +#include + +class RolesRepository : public RolesRepositoryInterface, + public BaseSqlTableRepository { +public: + explicit RolesRepository(QSqlDatabase &database, QObject *parent); + + // CRUD operations + // clang-format off + + RepositoryResult + createRole(const CreateRoleRequest &request) override; + + RepositoryResult + getRoleById(qint32 roleId, RoleDTO &role) const override; + + RepositoryResult + getAllRoles(QVector &roles) const override; + + RepositoryResult + updateRole(const UpdateRoleRequest &request) override; + + RepositoryResult + deleteRoleById(qint32 roleId) override; + + // clang-format on + +private: + RoleDTO mapQueryToDTO(const QSqlQuery &query) const; +}; + +#endif // ROLES_REPOSITORY_H diff --git a/data/sql/sessions_repository.cpp b/data/sql/sessions_repository.cpp new file mode 100644 index 0000000..4cde3da --- /dev/null +++ b/data/sql/sessions_repository.cpp @@ -0,0 +1,112 @@ +#include "sessions_repository.h" + +#include "create_session_request.h" +#include "repository_result.h" +#include "session_dto.h" +#include "update_session_request.h" +#include +#include + +SessionsRepository::SessionsRepository(QSqlDatabase &database, QObject *parent) + : BaseSqlTableRepository(database, parent) {} + +RepositoryResult +SessionsRepository::createSession(const CreateSessionRequest &request) { + QSqlQuery query = foreignKeysOnQuery(); + query.prepare( + "INSERT INTO sessions (movie_id, hall_id, begin_at, ticket_price) VALUES " + "(:movie_id, :hall_id, :begin_at, :ticket_price)"); + query.bindValue(":begin_at", request.beginAt()); + query.bindValue(":hall_id", request.hallId()); + query.bindValue(":movie_id", request.movieId()); + query.bindValue(":ticket_price", request.ticketPrice()); + + if (!query.exec()) { + return RepositoryResult::failureResult(query.lastError().text()); + } + + emit dataCreated(); + return RepositoryResult::successResult(); +} + +RepositoryResult SessionsRepository::getSessionById(qint32 id, + SessionDTO &session) const { + QSqlQuery query = foreignKeysOnQuery(); + query.prepare("SELECT session_id, movie_id, hall_id, begin_at, ticket_price " + "FROM sessions WHERE session_id = :id"); + query.bindValue(":id", id); + + if (!query.exec()) { + return RepositoryResult::failureResult(query.lastError().text()); + } + if (!query.next()) { + return RepositoryResult::failureResult("Session not found"); + } + + session = mapQueryToDTO(query); + + emit dataRetrieved(); + return RepositoryResult::successResult(); +} + +RepositoryResult +SessionsRepository::getAllSessions(QVector &sessions) const { + QSqlQuery query = foreignKeysOnQuery(); + query.prepare("SELECT session_id, movie_id, hall_id, begin_at, ticket_price " + "FROM sessions"); + + if (!query.exec()) { + return RepositoryResult::failureResult(query.lastError().text()); + } + + while (query.next()) { + sessions.append(mapQueryToDTO(query)); + } + + emit dataRetrieved(); + return RepositoryResult::successResult(); +} + +RepositoryResult +SessionsRepository::updateSession(const UpdateSessionRequest &request) { + QSqlQuery query = foreignKeysOnQuery(); + query.prepare("UPDATE sessions SET movie_id = :movie_id, hall_id = :hall_id, " + "begin_at = :begin_at, ticket_price = :ticket_price WHERE " + "session_id = :session_id"); + query.bindValue(":begin_at", request.beginAt()); + query.bindValue(":hall_id", request.hallId()); + query.bindValue(":movie_id", request.movieId()); + query.bindValue(":session_id", request.sessionId()); + query.bindValue(":ticket_price", request.ticketPrice()); + + if (!query.exec()) { + return RepositoryResult::failureResult(query.lastError().text()); + } + + emit dataUpdated(); + return RepositoryResult::successResult(); +} + +RepositoryResult SessionsRepository::deleteSessionById(qint32 sessionId) { + QSqlQuery query = foreignKeysOnQuery(); + query.prepare("DELETE FROM sessions WHERE session_id = :session_id"); + query.bindValue(":session_id", sessionId); + + if (!query.exec()) { + return RepositoryResult::failureResult(query.lastError().text()); + } + + emit dataDeleted(); + return RepositoryResult::successResult(); +} + +SessionDTO SessionsRepository::mapQueryToDTO(const QSqlQuery &query) const { + SessionDTO sessionDTO; + sessionDTO.setBeginAt(query.value("begin_at").toDateTime()); + sessionDTO.setHallId(query.value("hall_id").toInt()); + sessionDTO.setMovieId(query.value("movie_id").toInt()); + sessionDTO.setSessionId(query.value("session_id").toInt()); + sessionDTO.setTicketPrice(query.value("ticket_price").toDouble()); + + return sessionDTO; +} diff --git a/data/sql/sessions_repository.h b/data/sql/sessions_repository.h new file mode 100644 index 0000000..2cd8e03 --- /dev/null +++ b/data/sql/sessions_repository.h @@ -0,0 +1,38 @@ +#ifndef SESSIONS_REPOSITORY_H +#define SESSIONS_REPOSITORY_H + +#include "base_sql_table_repository.h" +#include "sessions_repository_interface.h" + +#include + +class SessionsRepository : public SessionsRepositoryInterface, + public BaseSqlTableRepository { +public: + explicit SessionsRepository(QSqlDatabase &database, QObject *parent); + + // CRUD operations + // clang-format off + + RepositoryResult + createSession(const CreateSessionRequest &request) override; + + RepositoryResult + getSessionById(qint32 sessionId, SessionDTO &session) const override; + + RepositoryResult + getAllSessions(QVector &sessions) const override; + + RepositoryResult + updateSession(const UpdateSessionRequest &request) override; + + RepositoryResult + deleteSessionById(qint32 sessionId) override; + + // clang-format on + +private: + SessionDTO mapQueryToDTO(const QSqlQuery &query) const; +}; + +#endif // SESSIONS_REPOSITORY_H diff --git a/data/sql/sessions_statistics_repository.cpp b/data/sql/sessions_statistics_repository.cpp new file mode 100644 index 0000000..eacad03 --- /dev/null +++ b/data/sql/sessions_statistics_repository.cpp @@ -0,0 +1,169 @@ +#include "sessions_statistics_repository.h" + +#include "repository_result.h" +#include "session_statistics_dto.h" + +#include +#include +#include +#include + +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 &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 &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 startDate, + std::optional endDate, + QVector &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 startDate, + std::optional endDate, + QVector &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 startDate, + std::optional endDate, + QVector &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 &startDate, + const std::optional &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 &startDate, + const std::optional &endDate) const { + if (startDate) { + query.bindValue(":start_date", *startDate); + } + if (endDate) { + query.bindValue(":end_date", *endDate); + } +} diff --git a/data/sql/sessions_statistics_repository.h b/data/sql/sessions_statistics_repository.h new file mode 100644 index 0000000..1138e62 --- /dev/null +++ b/data/sql/sessions_statistics_repository.h @@ -0,0 +1,65 @@ +#ifndef SESSION_INFO_REPOSITORY_H +#define SESSION_INFO_REPOSITORY_H + +#include "base_sql_table_repository.h" +#include "sessions_statistics_repository_interface.h" + +#include +#include + +class SessionsStatisticsRepository + : public SessionsStatisticsRepositoryInterface, + public BaseSqlTableRepository { +private: + static constexpr const char *SELECT_QUERY = + "SELECT session_id, begin_at, ticket_price, hall_id, hall_name, " + "total_seats, movie_id, movie_title, duration, genre_id, genre_name, " + "sold_tickets, refunded_tickets, sales_revenue, refund_expenses FROM " + "sessions_statistics"; + + // Overrides methods from SessionsStatisticRepositoryInterface +public: + explicit SessionsStatisticsRepository(QSqlDatabase &database, + QObject *parent); + + RepositoryResult + getSessionById(qint32 sessionId, + SessionStatisticsDTO &sessionStatistics) const override; + + RepositoryResult + getAllSessions(QVector &sessions) const override; + + // New methods +public: + RepositoryResult + getSessionsForGenre(qint32 genreName, std::optional startDate, + std::optional endDate, + QVector &sessions) const override; + + RepositoryResult + getSessionsForHall(qint32 hallId, std::optional startDate, + std::optional endDate, + QVector &sessions) const override; + + RepositoryResult + getSessionsForMovie(qint32 movieId, std::optional startDate, + std::optional endDate, + QVector &sessions) const override; + +private: + SessionStatisticsDTO mapQueryToDTO(const QSqlQuery &query) const; + + void bindDateFilters(QString &queryString, + const std::optional &startDate, + const std::optional &endDate) const; + + void bindDateValues(QSqlQuery &query, + const std::optional &startDate, + const std::optional &endDate) const; + + RepositoryResult + executeAndMapQuery(QSqlQuery &query, + QVector &sessions) const; +}; + +#endif // SESSION_INFO_REPOSITORY_H diff --git a/data/sql/table_info_sqlite.cpp b/data/sql/table_info_sqlite.cpp new file mode 100644 index 0000000..791dad8 --- /dev/null +++ b/data/sql/table_info_sqlite.cpp @@ -0,0 +1,138 @@ +#include "table_info_sqlite.h" + +#include +#include +#include + +TableInfoSQLite::TableInfoSQLite() : databaseTableName_("") {} + +TableInfoSQLite::TableInfoSQLite(const QString &databaseTableName) + : databaseTableName_(databaseTableName) { + loadColumnInfo(); +} + +void TableInfoSQLite::loadColumnInfo() { + QSqlDatabase defaultDatabase = QSqlDatabase::database(); + + if (!defaultDatabase.isValid()) { + qCritical() << "TableInfoSQLite::loadColumnInfo: Database is invalid"; + } + + if (!defaultDatabase.isOpen()) { + qCritical() << "TableInfoSQLite::loadColumnInfo: Database is not open"; + + databaseTableName_.clear(); + columnNames_.clear(); + columnTypes_.clear(); + isPrimaryKey_.clear(); + + return; + } + + QSqlQuery query(defaultDatabase); + query.prepare(QString("PRAGMA table_info(%1)").arg(databaseTableName_)); + + if (!query.exec()) { + qWarning() << "Failed to get table info: Error:" << query.lastError().text() + << "Database table name:" << databaseTableName_; + + return; + } + + while (query.next()) { + columnNames_.append(query.value("name").toString()); + columnTypes_.append(query.value("type").toString()); + isPrimaryKey_.append(query.value("pk").toInt() > 0); + } +} + +QString TableInfoSQLite::databaseTableName() const noexcept { + return databaseTableName_; +} + +QString +TableInfoSQLite::foreignKeyTable(const QString &columnName) const noexcept { + if (databaseTableName_.isEmpty()) { + qWarning() << "TableInfoSQLite::foreignKeyTable: No table name set"; + return QString(); + } + + QSqlDatabase defaultDatabase = QSqlDatabase::database(); + if (!defaultDatabase.isOpen()) { + qCritical() << "TableInfoSQLite::foreignKeyTable: Database is not open"; + return QString(); + } + + QSqlQuery query(defaultDatabase); + query.prepare(QString("PRAGMA foreign_key_list(%1)").arg(databaseTableName_)); + + if (!query.exec()) { + qWarning() << "Failed to get foreign key info:" << query.lastError().text(); + return QString(); + } + + while (query.next()) { + QString fkColumn = query.value("from").toString(); + QString referencedTable = query.value("table").toString(); + + if (fkColumn == columnName) { + return referencedTable; + } + } + + return QString(); +} + +QStringList TableInfoSQLite::columnNames() const noexcept { + return QStringList(columnNames_.begin(), columnNames_.end()); +} + +bool TableInfoSQLite::isPrimaryKey(const QString &columnName) const noexcept { + int index = columnIndex(columnName); + if (index == -1) { + return false; + } + return isPrimaryKey_.at(index); +} + +qint32 TableInfoSQLite::columnIndex(const QString &columnName) const noexcept { + return columnNames_.indexOf(columnName); +} + +QString TableInfoSQLite::columnName(qint32 columnIndex) const noexcept { + if (columnIndex < 0 || columnIndex >= columnNames_.size()) { + return QString(); + } + return columnNames_.at(columnIndex); +} + +QMetaType::Type +TableInfoSQLite::columnMetaType(const QString &columnName) const noexcept { + int index = columnIndex(columnName); + if (index == -1) { + return QMetaType::UnknownType; + } + + QString typeName = columnTypes_.at(index).toLower(); + + if (typeName.contains("int")) { + return QMetaType::Int; + } else if (typeName.contains("double") || typeName.contains("real") || + typeName.contains("float")) { + return QMetaType::Double; + } else if (typeName.contains("date") || typeName.contains("time")) { + return QMetaType::QDateTime; + } else if (typeName.contains("bool")) { + return QMetaType::Bool; + } else if (typeName.contains("blob")) { + return QMetaType::QByteArray; + } else { + return QMetaType::QString; + } +} + +void TableInfoSQLite::setDatabaseTableName( + const QString &databaseTableName) noexcept { + databaseTableName_ = databaseTableName; + loadColumnInfo(); +} diff --git a/data/sql/table_info_sqlite.h b/data/sql/table_info_sqlite.h new file mode 100644 index 0000000..3d430d7 --- /dev/null +++ b/data/sql/table_info_sqlite.h @@ -0,0 +1,46 @@ +#ifndef TABLE_INFO_SQLITE_H +#define TABLE_INFO_SQLITE_H + +#include "table_info_interface.h" +#include +#include +#include +#include +#include +#include + +class TableInfoSQLite : public TableInfoInterface { +private: + QString databaseTableName_; + QVector columnNames_; + QVector columnTypes_; + QVector isPrimaryKey_; + +public: + explicit TableInfoSQLite(); + explicit TableInfoSQLite(const QString &databaseTableName); + ~TableInfoSQLite() override = default; + + QMetaType::Type + columnMetaType(const QString &columnName) const noexcept override; + + QString columnName(int columnIndex) const noexcept override; + + QString databaseTableName() const noexcept override; + + QString foreignKeyTable(const QString &columnName) const noexcept; + + QStringList columnNames() const noexcept override; + + bool isPrimaryKey(const QString &columnName) const noexcept; + + int columnIndex(const QString &columnName) const noexcept override; + + void + setDatabaseTableName(const QString &databaseNametableName) noexcept override; + +private: + void loadColumnInfo(); +}; + +#endif // TABLE_INFO_SQLITE_H diff --git a/data/sql/tickets_repository.cpp b/data/sql/tickets_repository.cpp new file mode 100644 index 0000000..ef47a1c --- /dev/null +++ b/data/sql/tickets_repository.cpp @@ -0,0 +1,108 @@ +#include "tickets_repository.h" + +#include "create_ticket_request.h" +#include "repository_result.h" +#include "ticket_dto.h" +#include "update_ticket_request.h" +#include +#include + +TicketsRepository::TicketsRepository(QSqlDatabase &database, QObject *parent) + : BaseSqlTableRepository(database, parent) {} + +RepositoryResult +TicketsRepository::createTicket(const CreateTicketRequest &request) { + QSqlQuery query = foreignKeysOnQuery(); + query.prepare("INSERT INTO tickets (session_id, seat_number, sold_at) VALUES " + "(:session_id, :seat_number, :sold_at)"); + query.bindValue(":seat_number", request.seatNumber()); + query.bindValue(":session_id", request.sessionId()); + query.bindValue(":sold_at", request.soldAt()); + + if (!query.exec()) { + return RepositoryResult::failureResult(query.lastError().text()); + } + + emit dataCreated(); + return RepositoryResult::successResult(); +} + +RepositoryResult TicketsRepository::getTicketById(qint32 id, + TicketDTO &ticket) const { + QSqlQuery query = foreignKeysOnQuery(); + query.prepare("SELECT ticket_id, session_id, seat_number, sold_at FROM " + "tickets WHERE ticket_id = :id"); + query.bindValue(":id", id); + + if (!query.exec()) { + return RepositoryResult::failureResult(query.lastError().text()); + } + if (!query.next()) { + return RepositoryResult::failureResult("Ticket not found"); + } + + ticket = mapQueryToDTO(query); + + emit dataRetrieved(); + return RepositoryResult::successResult(); +} + +RepositoryResult +TicketsRepository::getAllTickets(QVector &tickets) const { + QSqlQuery query = foreignKeysOnQuery(); + query.prepare( + "SELECT ticket_id, session_id, seat_number, sold_at FROM tickets"); + + if (!query.exec()) { + return RepositoryResult::failureResult(query.lastError().text()); + } + + while (query.next()) { + tickets.append(mapQueryToDTO(query)); + } + + emit dataRetrieved(); + return RepositoryResult::successResult(); +} + +RepositoryResult +TicketsRepository::updateTicket(const UpdateTicketRequest &request) { + QSqlQuery query = foreignKeysOnQuery(); + query.prepare( + "UPDATE tickets SET session_id = :session_id, seat_number = " + ":seat_number, sold_at = :sold_at WHERE ticket_id = :ticket_id"); + query.bindValue(":seat_number", request.seatNumber()); + query.bindValue(":session_id", request.sessionId()); + query.bindValue(":sold_at", request.soldAt()); + query.bindValue(":ticket_id", request.ticketId()); + + if (!query.exec()) { + return RepositoryResult::failureResult(query.lastError().text()); + } + + emit dataUpdated(); + return RepositoryResult::successResult(); +} + +RepositoryResult TicketsRepository::deleteTicketById(qint32 ticketId) { + QSqlQuery query = foreignKeysOnQuery(); + query.prepare("DELETE FROM tickets WHERE ticket_id = :ticket_id"); + query.bindValue(":ticket_id", ticketId); + + if (!query.exec()) { + return RepositoryResult::failureResult(query.lastError().text()); + } + + emit dataDeleted(); + return RepositoryResult::successResult(); +} + +TicketDTO TicketsRepository::mapQueryToDTO(const QSqlQuery &query) const { + TicketDTO ticketDTO; + ticketDTO.setSeatNumber(query.value("seat_number").toInt()); + ticketDTO.setSessionId(query.value("session_id").toInt()); + ticketDTO.setSoldAt(query.value("sold_at").toDateTime()); + ticketDTO.setTicketId(query.value("ticket_id").toInt()); + + return ticketDTO; +} diff --git a/data/sql/tickets_repository.h b/data/sql/tickets_repository.h new file mode 100644 index 0000000..22a46fd --- /dev/null +++ b/data/sql/tickets_repository.h @@ -0,0 +1,38 @@ +#ifndef TICKETS_REPOSITORY_H +#define TICKETS_REPOSITORY_H + +#include "base_sql_table_repository.h" +#include "tickets_repository_interface.h" + +#include + +class TicketsRepository : public TicketsRepositoryInterface, + public BaseSqlTableRepository { +public: + explicit TicketsRepository(QSqlDatabase &db, QObject *parent); + + // CRUD operations + // clang-format off + + RepositoryResult + createTicket(const CreateTicketRequest &request) override; + + RepositoryResult + getTicketById(qint32 ticketId, TicketDTO &ticket) const override; + + RepositoryResult + getAllTickets(QVector &tickets) const override; + + RepositoryResult + updateTicket(const UpdateTicketRequest &request) override; + + RepositoryResult + deleteTicketById(qint32 ticketId) override; + + // clang-format on + +private: + TicketDTO mapQueryToDTO(const QSqlQuery &query) const; +}; + +#endif // TICKETS_REPOSITORY_H diff --git a/data/sql/users_repository.cpp b/data/sql/users_repository.cpp new file mode 100644 index 0000000..fcbc8ca --- /dev/null +++ b/data/sql/users_repository.cpp @@ -0,0 +1,130 @@ +#include "users_repository.h" + +#include "create_user_request.h" +#include "repository_result.h" +#include "update_user_request.h" +#include "user_dto.h" +#include +#include + +UsersRepository::UsersRepository(QSqlDatabase &database, QObject *parent) + : BaseSqlTableRepository(database, parent) {} + +RepositoryResult UsersRepository::createUser(const CreateUserRequest &request) { + QSqlQuery query = foreignKeysOnQuery(); + query.prepare("INSERT INTO users (username, password_hash, salt, role_id) " + "VALUES (:username, :password_hash, :salt, :role_id)"); + query.bindValue(":password_hash", request.passwordHash()); + query.bindValue(":role_id", request.roleId()); + query.bindValue(":salt", request.salt()); + query.bindValue(":username", request.username()); + + if (!query.exec()) { + return RepositoryResult::failureResult(query.lastError().text()); + } + + emit dataCreated(); + return RepositoryResult::successResult(); +} + +RepositoryResult UsersRepository::getUserById(qint32 id, UserDTO &user) const { + QSqlQuery query = foreignKeysOnQuery(); + query.prepare("SELECT user_id, username, password_hash, salt, role_id FROM " + "users WHERE " + "user_id = :user_id"); + query.bindValue(":user_id", id); + + if (!query.exec()) { + return RepositoryResult::failureResult(query.lastError().text()); + } + if (!query.next()) { + return RepositoryResult::failureResult("User not found"); + } + + user = mapQueryToDTO(query); + + emit dataRetrieved(); + return RepositoryResult::successResult(); +} + +RepositoryResult UsersRepository::getUserByUsername(const QString &username, + UserDTO &user) const { + QSqlQuery query = foreignKeysOnQuery(); + query.prepare("SELECT user_id, username, password_hash, salt, role_id FROM " + "users WHERE " + "username = :username"); + query.bindValue(":username", username); + + if (!query.exec()) { + return RepositoryResult::failureResult(query.lastError().text()); + } + if (!query.next()) { + return RepositoryResult::failureResult("User not found"); + } + + user = mapQueryToDTO(query); + + emit dataRetrieved(); + return RepositoryResult::successResult(); +} + +RepositoryResult UsersRepository::getAllUsers(QVector &users) const { + QSqlQuery query = foreignKeysOnQuery(); + query.prepare( + "SELECT user_id, username, password_hash, salt, role_id FROM users"); + + if (!query.exec()) { + return RepositoryResult::failureResult(query.lastError().text()); + } + + while (query.next()) { + users.append(mapQueryToDTO(query)); + } + + emit dataRetrieved(); + return RepositoryResult::successResult(); +} + +RepositoryResult UsersRepository::updateUser(const UpdateUserRequest &request) { + QSqlQuery query = foreignKeysOnQuery(); + query.prepare("UPDATE users SET username = :username, password_hash = " + ":password_hash, " + "salt = :salt, role_id = :role_id WHERE user_id = :user_id"); + + query.bindValue(":username", request.username()); + query.bindValue(":password_hash", request.passwordHash()); + query.bindValue(":salt", request.salt()); + query.bindValue(":role_id", request.roleId()); + query.bindValue(":user_id", request.userId()); + + if (!query.exec()) { + return RepositoryResult::failureResult(query.lastError().text()); + } + + emit dataUpdated(); + return RepositoryResult::successResult(); +} + +RepositoryResult UsersRepository::deleteUserById(qint32 userId) { + QSqlQuery query = foreignKeysOnQuery(); + query.prepare("DELETE FROM users WHERE user_id = :user_id"); + query.bindValue(":user_id", userId); + + if (!query.exec()) { + return RepositoryResult::failureResult(query.lastError().text()); + } + + emit dataDeleted(); + return RepositoryResult::successResult(); +} + +UserDTO UsersRepository::mapQueryToDTO(const QSqlQuery &query) const { + UserDTO userDTO; + userDTO.setPasswordHash(query.value("password_hash").toString()); + userDTO.setRoleId(query.value("role_id").toInt()); + userDTO.setSalt(query.value("salt").toString()); + userDTO.setUserId(query.value("user_id").toInt()); + userDTO.setUsername(query.value("username").toString()); + + return userDTO; +} diff --git a/data/sql/users_repository.h b/data/sql/users_repository.h new file mode 100644 index 0000000..03eb99a --- /dev/null +++ b/data/sql/users_repository.h @@ -0,0 +1,41 @@ +#ifndef USERS_REPOSITORY_H +#define USERS_REPOSITORY_H + +#include "base_sql_table_repository.h" +#include "users_repository_interface.h" + +#include + +class UsersRepository : public UsersRepositoryInterface, + public BaseSqlTableRepository { +public: + explicit UsersRepository(QSqlDatabase &db, QObject *parent); + + // CRUD operations + // clang-format off + + RepositoryResult + createUser(const CreateUserRequest &request) override; + + RepositoryResult + getUserById(qint32 userId, UserDTO &user) const override; + + RepositoryResult + getUserByUsername(const QString &username, UserDTO &user) const override; + + RepositoryResult + getAllUsers(QVector &users) const override; + + RepositoryResult + updateUser(const UpdateUserRequest &request) override; + + RepositoryResult + deleteUserById(qint32 userId) override; + + // clang-format on + +private: + UserDTO mapQueryToDTO(const QSqlQuery &query) const; +}; + +#endif // USERS_REPOSITORY_H diff --git a/database.db b/database.db new file mode 100644 index 0000000..6f09ad0 Binary files /dev/null and b/database.db differ diff --git a/deprecated/deprecated.zip b/deprecated/deprecated.zip new file mode 100644 index 0000000..633a810 Binary files /dev/null and b/deprecated/deprecated.zip differ diff --git a/resources.qrc b/resources.qrc new file mode 100644 index 0000000..5a87458 --- /dev/null +++ b/resources.qrc @@ -0,0 +1,19 @@ + + + core/sql/cinema_db_create_indexes.sql + core/sql/cinema_db_create_tables.sql + core/sql/cinema_db_create_triggers.sql + core/sql/cinema_db_create_views.sql + core/sql/cinema_db_foreign_key_off.sql + core/sql/cinema_db_foreign_key_on.sql + core/sql/cinema_db_genre_insert.sql + core/sql/cinema_db_hall_insert.sql + core/sql/cinema_db_movie_insert.sql + core/sql/cinema_db_role_insert.sql + core/sql/cinema_db_user_insert.sql + + + /media/sdb1/projects/coursework-metrology/coursework-metrology-main/build_linux/translations/app_ru.qm + + + diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..2b31a83 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,25 @@ +#include "application_connector.h" +#include "application_controller.h" +#include "main_window.h" +#include + +int main(int argc, char *argv[]) { + + QApplication app(argc, argv); + + ApplicationController controller; + if (!controller.setupApplication()) { + return -1; + } + + MainWindow mainWindow(controller.userId(), controller.accessLevel()); + + ApplicationConnector connector(&mainWindow); + if (!connector.connect()) { + return -1; + } + + mainWindow.show(); + + return app.exec(); +} diff --git a/tests_class/CMakeLists.txt b/tests_class/CMakeLists.txt new file mode 100644 index 0000000..6435756 --- /dev/null +++ b/tests_class/CMakeLists.txt @@ -0,0 +1,29 @@ +include(paths/PathsAndIncludes) + +# Specify paths to test sources +set(TEST_FILES + ${CMAKE_CURRENT_SOURCE_DIR}/day_manager_test.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/reservation_manager_test.cpp +) + +# DayManagerTest +add_executable(day_manager_test + day_manager_test.cpp + ${UTILS_SOURCES} +) +target_link_libraries(day_manager_test PRIVATE Qt6::Test) +add_test(NAME DayManagerTest COMMAND day_manager_test) + +# ReservationManagerTest +add_executable(reservation_manager_test + reservation_manager_test.cpp + ${UTILS_SOURCES} +) +target_link_libraries(reservation_manager_test PRIVATE Qt6::Test) +add_test(NAME ReservationManagerTest COMMAND reservation_manager_test) + +# Include directories for headers +include_directories( + ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_CURRENT_SOURCE_DIR} +) diff --git a/tests_class/day_manager_test.cpp b/tests_class/day_manager_test.cpp new file mode 100644 index 0000000..ac85fcf --- /dev/null +++ b/tests_class/day_manager_test.cpp @@ -0,0 +1,175 @@ +#include "day_manager.h" +#include + +class DayManagerTest : public QObject { + Q_OBJECT + +private slots: + void testAddAvailableSlot(); + void testDuration(); + void testReserveFailure(); + void testReserveImplMaximal(); + void testReserveImplMinimal(); + void testReserveImplQuick(); + void testReserveImplRandom(); + void testReserveSuccess(); +}; + +void DayManagerTest::testAddAvailableSlot() { + DayManager manager(QTime(9, 0), QTime(12, 0)); + + QCOMPARE(manager.minDurationMs_, 0); + QVERIFY(!manager.availableSlots_.isEmpty()); + QCOMPARE(manager.availableSlots_.size(), 1); + QCOMPARE(manager.availableSlots_.value(QTime(9, 0)), QTime(12, 0)); +} + +void DayManagerTest::testDuration() { + DayManager manager(QTime(9, 0), QTime(12, 0)); + + QCOMPARE(manager.duration(QTime(10, 0)), {}); // Print warning + QCOMPARE(manager.duration(QTime(9, 0)), QTime(3, 0)); + + manager.addAvailableSlot(QTime(12, 0), QTime(13, 0)); + QCOMPARE(manager.duration(QTime(12, 0)), QTime(1, 0)); + + QCOMPARE(manager.duration(), QTime(4, 0)); +} + +void DayManagerTest::testReserveImplQuick() { + DayManager manager(QTime(9, 0), QTime(12, 0)); + + for (int i = 0; i < 3; ++i) { + QCOMPARE(manager.slotCount(), 1); + QTime availableHourCount = manager.duration(QTime(9 + i, 0)); + QCOMPARE(manager.duration(QTime(9 + i, 0)), QTime(3 - i, 0)); + + auto [begin, end] = + manager.reserveImplQuick(QTime(1, 0).msecsSinceStartOfDay()); + QVERIFY(begin.isValid()); + QVERIFY(end.isValid()); + } + + QCOMPARE(manager.slotCount(), 0); +} + +void DayManagerTest::testReserveImplMaximal() { + DayManager manager; + + manager.addAvailableSlot(QTime(9, 0), QTime(12, 0)); // 3 hour; first, second + manager.addAvailableSlot(QTime(8, 0), QTime(9, 0)); // 1 hour + manager.addAvailableSlot(QTime(12, 0), QTime(14, 0)); // 2 hour; third + + auto [begin1, end1] = + manager.reserveImplMaximal(QTime(1, 0).msecsSinceStartOfDay()); + QVERIFY(begin1.isValid()); + QVERIFY(end1.isValid()); + QCOMPARE(begin1, QTime(9, 0)); + + auto [begin2, end2] = + manager.reserveImplMaximal(QTime(1, 0).msecsSinceStartOfDay()); + QVERIFY(begin2.isValid()); + QVERIFY(end2.isValid()); + QCOMPARE(begin2, QTime(10, 0)); + + auto [begin3, end3] = + manager.reserveImplMaximal(QTime(1, 0).msecsSinceStartOfDay()); + QVERIFY(begin3.isValid()); + QVERIFY(end3.isValid()); + QCOMPARE(begin3, QTime(12, 0)); + + QCOMPARE(manager.slotCount(), 3); +} + +void DayManagerTest::testReserveImplMinimal() { + DayManager manager; + + manager.addAvailableSlot(QTime(9, 0), QTime(12, 0)); // 3 hour + manager.addAvailableSlot(QTime(8, 0), QTime(9, 0)); // 1 hour; first + manager.addAvailableSlot(QTime(12, 0), QTime(14, 0)); // 2 hour; second, third + + auto [begin1, end1] = + manager.reserveImplMinimal(QTime(1, 0).msecsSinceStartOfDay()); + QVERIFY(begin1.isValid()); + QVERIFY(end1.isValid()); + QCOMPARE(begin1, QTime(8, 0)); + + auto [begin2, end2] = + manager.reserveImplMinimal(QTime(1, 0).msecsSinceStartOfDay()); + QVERIFY(begin2.isValid()); + QVERIFY(end2.isValid()); + QCOMPARE(begin2, QTime(12, 0)); + + auto [begin3, end3] = + manager.reserveImplMinimal(QTime(1, 0).msecsSinceStartOfDay()); + QVERIFY(begin3.isValid()); + QVERIFY(end3.isValid()); + QCOMPARE(begin3, QTime(13, 0)); + + QCOMPARE(manager.slotCount(), 1); +} + +void DayManagerTest::testReserveImplRandom() { + DayManager manager(QTime(9, 0), QTime(12, 0)); + + for (int i = 0; i < 3; ++i) { + QCOMPARE(manager.slotCount(), 1); + auto [begin, end] = + manager.reserveImplRandom(QTime(1, 0).msecsSinceStartOfDay()); + QVERIFY(begin.isValid()); + QVERIFY(end.isValid()); + } + + QCOMPARE(manager.slotCount(), 0); +} + +void DayManagerTest::testReserveSuccess() { + DayManager manager(QTime(9, 0), QTime(12, 0)); + manager.setMinDuration(QTime(0, 30)); + + auto [begin, end] = manager.reserve(QTime(1, 0)); + QVERIFY(begin.isValid()); + QVERIFY(end.isValid()); + QCOMPARE(begin.hour(), 9); + QCOMPARE(end.hour(), 10); + QCOMPARE(end.minute(), 0); + + std::tie(begin, end) = manager.reserve(QTime(1, 30)); + QVERIFY(begin.isValid()); + QVERIFY(end.isValid()); + QCOMPARE(begin.hour(), 10); + QCOMPARE(end.hour(), 11); + QCOMPARE(end.minute(), 30); +} + +void DayManagerTest::testReserveFailure() { + DayManager manager(QTime(9, 0), QTime(12, 0)); + manager.setMinDuration(QTime(0, 30)); + + QCOMPARE(manager.duration(QTime(9, 0)), QTime(3, 0)); + + QTime begin, end; + + std::tie(begin, end) = manager.reserve(QTime(4, 0)); + QVERIFY(!begin.isValid()); + QVERIFY(!end.isValid()); + + std::tie(begin, end) = manager.reserve(QTime(3, 0, 1)); + QVERIFY(!begin.isValid()); + QVERIFY(!end.isValid()); + + std::tie(begin, end) = manager.reserve(QTime(2, 30)); + QVERIFY(begin.isValid()); + QVERIFY(end.isValid()); + QVERIFY(!manager.availableSlots_.isEmpty()); + QCOMPARE(manager.duration(end), QTime(0, 30)); + + std::tie(begin, end) = manager.reserve(QTime(0, 0, 1)); + QVERIFY(begin.isValid()); + QVERIFY(end.isValid()); + QCOMPARE(begin.msecsTo(end), QTime(0, 0, 1).msecsSinceStartOfDay()); + QVERIFY(manager.availableSlots_.isEmpty()); +} + +QTEST_MAIN(DayManagerTest) +#include "day_manager_test.moc" diff --git a/tests_class/reservation_manager_test.cpp b/tests_class/reservation_manager_test.cpp new file mode 100644 index 0000000..731f6d9 --- /dev/null +++ b/tests_class/reservation_manager_test.cpp @@ -0,0 +1,68 @@ +#include "reservation_manager.h" +#include + +class ReservationManagerTest : public QObject { + Q_OBJECT + +private slots: + void testReserveFailure(); + void testReserveSuccess(); + void testReserveBound(); +}; + +void ReservationManagerTest::testReserveFailure() { + DayManager dayManager(QTime(8, 0), QTime(9, 0)); + ReservationManager manager(3, 3, dayManager); + + QDateTime begin; + QTime end; + + std::tie(begin, end) = manager.reserve(QTime(2, 0)); + QVERIFY(!begin.isValid()); + QVERIFY(!end.isValid()); +} + +void ReservationManagerTest::testReserveSuccess() { + DayManager dayManager(QTime(8, 0), QTime(9, 0)); + ReservationManager manager(3, 4, dayManager); + + QDateTime begin; + QTime end; + + for (int i = 0; i < 3; ++i) { + std::tie(begin, end) = manager.reserve(QTime(1, 0)); + QVERIFY(begin.isValid()); + QVERIFY(end.isValid()); + } + QCOMPARE(manager.days_.size(), 1); + + const auto &keys = manager.days_.keys(); + auto it = std::find_if(keys.cbegin(), keys.cend(), [](const auto &key) { + for (auto expected : {1, 2, 3, 4}) { + if (key == expected) { + return true; + } + } + return false; + }); + + QVERIFY(it != keys.cend()); +} + +void ReservationManagerTest::testReserveBound() { + DayManager dayManager(QTime(8, 0), QTime(9, 0)); + ReservationManager manager(3, 4, dayManager); + + QDateTime begin; + QTime end; + + for (int i = 0; i < 4; ++i) { + std::tie(begin, end) = manager.reserve(QTime(1, 0)); + QVERIFY(begin.isValid()); + QVERIFY(end.isValid()); + } + QVERIFY(manager.days_.isEmpty()); +} + +QTEST_MAIN(ReservationManagerTest) +#include "reservation_manager_test.moc" diff --git a/tests_schema/CMakeLists.txt b/tests_schema/CMakeLists.txt new file mode 100644 index 0000000..47bf3de --- /dev/null +++ b/tests_schema/CMakeLists.txt @@ -0,0 +1,72 @@ +# NOTE: VARIABLES + +# Define the path to the directory with SQL scripts +set(SQL_SCRIPTS_DIR "${CMAKE_SOURCE_DIR}/core/sql") +set(SQL_DEST_DIR "${CMAKE_CURRENT_BINARY_DIR}/core/sql") + +# Define directories for tests +set(TESTS_DIR "${CMAKE_CURRENT_SOURCE_DIR}/tests") +set(TESTS_SOURCES_DIR "${CMAKE_CURRENT_SOURCE_DIR}/tests_sources") + +# Specify paths to test files +set(TEST_FILES + ${TESTS_DIR}/main_test.cpp + ${TESTS_DIR}/sqlite_database_crud_test.cpp + ${TESTS_DIR}/sqlite_database_foreign_key_test.cpp + ${TESTS_DIR}/sqlite_database_trigger_test.cpp +) + +# Specify paths to test sources +set(TEST_SOURCES + ${TESTS_SOURCES_DIR}/sqlite_database.cpp + ${TESTS_SOURCES_DIR}/sqlite_file_executor.cpp + ${TESTS_SOURCES_DIR}/sqlite_statement.cpp + ${TESTS_SOURCES_DIR}/file_reader.cpp +) + +# NOTE: OUTPUT + +# Output test file paths to console +message(STATUS "Test files: ${TEST_FILES}") +message(STATUS "Test sources: ${TEST_SOURCES}") + +# Output variable values to console +message(STATUS "Tests directory: ${TESTS_DIR}") +message(STATUS "Test sources directory: ${TESTS_SOURCES_DIR}") +message(STATUS "SQL scripts source directory: ${SQL_SCRIPTS_DIR}") +message(STATUS "SQL scripts destination directory: ${SQL_DEST_DIR}") + +# NOTE: BUILD + +# Create the test executable +add_executable(tests_schema ${TEST_FILES} ${TEST_SOURCES}) + +# Include directories for headers +include_directories(${TESTS_SOURCES_DIR}) + +# Link the test executable with required libraries +target_link_libraries(tests_schema PRIVATE + GTest::GTest + GTest::Main + SQLite::SQLite3 +) + +# NOTE: BUILD END + +# Copy SQL scripts to the build directory +add_custom_target(copy_sql_files ALL + COMMAND ${CMAKE_COMMAND} -E make_directory ${SQL_DEST_DIR} + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${SQL_SCRIPTS_DIR}/*.sql ${SQL_DEST_DIR} + COMMENT "Copying SQL scripts to ${SQL_DEST_DIR}" +) + +# Ensure SQL scripts are copied before running tests +add_dependencies(tests_schema copy_sql_files) + +# Pass the SQL scripts path to the tests via a macro +target_compile_definitions(tests_schema PRIVATE SQL_SCRIPTS_PATH="${SQL_DEST_DIR}") + +# Register the tests +include(GoogleTest) +gtest_discover_tests(tests_schema) + diff --git a/tests_schema/tests/main_test.cpp b/tests_schema/tests/main_test.cpp new file mode 100644 index 0000000..4d820af --- /dev/null +++ b/tests_schema/tests/main_test.cpp @@ -0,0 +1,6 @@ +#include + +int main(int argc, char **argv) { + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/tests_schema/tests/sqlite_database_crud_test.cpp b/tests_schema/tests/sqlite_database_crud_test.cpp new file mode 100644 index 0000000..f6b4e32 --- /dev/null +++ b/tests_schema/tests/sqlite_database_crud_test.cpp @@ -0,0 +1,380 @@ +#include "sqlite_database.h" +#include "sqlite_file_executor.h" +#include "gtest/gtest.h" + +// WARNING: Foreign keys are off +// WARNING: Triggers are off + +const std::string TEST_DB = "test.db"; + +// Test fixture for SQLiteDatabase +class SQLiteDatabaseCRUDTest : public ::testing::Test { +protected: + SQLiteDatabase *db_; + + void SetUp() override { + db_ = new SQLiteDatabase(TEST_DB); + SQLiteFileExecutor executor(TEST_DB); + executor.executeSQLFile("sql/cinema_db_drop_table.sql"); + executor.executeSQLFile("sql/cinema_db_create_table.sql"); + + // Not necessarily, since the default setting + std::string sql; + FileReaderInterface *reader = &executor; + reader->read("sql/cinema_db_foreign_key_off.sql", sql); + db_->executeNonQuery(sql); + } + + void TearDown() override { + delete db_; + remove(TEST_DB.c_str()); + } +}; + +// INFO: ----- GENERAL ----- + +// Check that the test fixture is working +class SimpleClass : public ::testing::Test { +protected: + void SetUp() override {} + void TearDown() override {} +}; +// Simle test +TEST_F(SimpleClass, SimpleTest) { EXPECT_EQ(1, 1); } + +// INFO: ----- GENERAL ----- + +// Test checking if the database is available +TEST_F(SQLiteDatabaseCRUDTest, IsDatabaseAvailable) { + EXPECT_TRUE(db_->isDatabaseAvailable()); +} + +// INFO: ----- GENRE ----- + +// Test adding a genre +TEST_F(SQLiteDatabaseCRUDTest, AddGenre) { + NewGenre genre{"Action"}; + EXPECT_TRUE(db_->addGenre(genre)); + + auto genres = db_->getAllGenres(); + ASSERT_EQ(genres.size(), 1); + EXPECT_EQ(genres[0].genre_name, "Action"); +} + +// Test getting a genre by ID +TEST_F(SQLiteDatabaseCRUDTest, GetGenreById) { + NewGenre genre{"Drama"}; + db_->addGenre(genre); + + Genre retrieved_genre = db_->getGenre(1); + EXPECT_EQ(retrieved_genre.genre_id, 1); + EXPECT_EQ(retrieved_genre.genre_name, "Drama"); +} + +// Test updating a genre +TEST_F(SQLiteDatabaseCRUDTest, UpdateGenre) { + NewGenre genre{"Drama"}; + db_->addGenre(genre); + + Genre updated_genre = db_->getGenre(1); + updated_genre.genre_name = "Horror"; + EXPECT_TRUE(db_->updateGenre(updated_genre)); + + Genre retrieved_genre = db_->getGenre(1); + EXPECT_EQ(retrieved_genre.genre_id, 1); + EXPECT_EQ(retrieved_genre.genre_name, "Horror"); +} + +// Test removing a genre +TEST_F(SQLiteDatabaseCRUDTest, RemoveGenre) { + NewGenre genre{"Horror"}; + db_->addGenre(genre); + EXPECT_TRUE(db_->removeGenre(1)); + + auto genres = db_->getAllGenres(); + EXPECT_TRUE(genres.empty()); +} + +// Test getting all genres +TEST_F(SQLiteDatabaseCRUDTest, GetAllGenres) { + db_->addGenre({"Comedy"}); + db_->addGenre({"Thriller"}); + + auto genres = db_->getAllGenres(); + ASSERT_EQ(genres.size(), 2); + EXPECT_EQ(genres[0].genre_name, "Comedy"); + EXPECT_EQ(genres[1].genre_name, "Thriller"); +} + +// INFO: ----- MOVIE ----- + +// Test adding a movie +TEST_F(SQLiteDatabaseCRUDTest, AddMovie) { + NewMovie movie{"The Shawshank Redemption", 1, 142}; + EXPECT_TRUE(db_->addMovie(movie)); + + auto movies = db_->getAllMovies(); + ASSERT_EQ(movies.size(), 1); + EXPECT_EQ(movies[0].title, "The Shawshank Redemption"); + EXPECT_EQ(movies[0].genre_id, 1); + EXPECT_EQ(movies[0].duration, 142); +} + +// Test getting a movie by ID +TEST_F(SQLiteDatabaseCRUDTest, GetMovieById) { + NewMovie movie{"The Godfather", 2, 175}; + db_->addMovie(movie); + + Movie retrieved_movie = db_->getMovie(1); + EXPECT_EQ(retrieved_movie.movie_id, 1); + EXPECT_EQ(retrieved_movie.title, "The Godfather"); + EXPECT_EQ(retrieved_movie.genre_id, 2); + EXPECT_EQ(retrieved_movie.duration, 175); +} + +// Test removing a movie +TEST_F(SQLiteDatabaseCRUDTest, RemoveMovie) { + NewMovie movie{"The Dark Knight", 3, 152}; + db_->addMovie(movie); + EXPECT_TRUE(db_->removeMovie(1)); + + auto movies = db_->getAllMovies(); + EXPECT_TRUE(movies.empty()); +} + +// Test updating a movie +TEST_F(SQLiteDatabaseCRUDTest, UpdateMovie) { + NewMovie movie{"The Shawshank Redemption", 1, 142}; + db_->addMovie(movie); + + Movie updated_movie = db_->getMovie(1); + updated_movie.title = "The Godfather"; + updated_movie.duration = 155; + EXPECT_TRUE(db_->updateMovie(updated_movie)); + + Movie retrieved_movie = db_->getMovie(1); + EXPECT_EQ(retrieved_movie.movie_id, 1); + EXPECT_EQ(retrieved_movie.title, "The Godfather"); + EXPECT_EQ(retrieved_movie.genre_id, 1); + EXPECT_EQ(retrieved_movie.duration, 155); +} + +// Test getting all movies +TEST_F(SQLiteDatabaseCRUDTest, GetAllMovies) { + db_->addMovie({"The Shawshank Redemption", 1, 142}); + db_->addMovie({"The Godfather", 2, 175}); + + auto movies = db_->getAllMovies(); + ASSERT_EQ(movies.size(), 2); + EXPECT_EQ(movies[0].title, "The Shawshank Redemption"); + EXPECT_EQ(movies[0].genre_id, 1); + EXPECT_EQ(movies[0].duration, 142); + EXPECT_EQ(movies[1].title, "The Godfather"); + EXPECT_EQ(movies[1].genre_id, 2); + EXPECT_EQ(movies[1].duration, 175); +} + +// INFO: ----- HALL ----- + +// Test adding a hall +TEST_F(SQLiteDatabaseCRUDTest, AddHall) { + NewHall hall{"Hall 1", 132}; + EXPECT_TRUE(db_->addHall(hall)); + + auto halls = db_->getAllHalls(); + ASSERT_EQ(halls.size(), 1); + EXPECT_EQ(halls[0].hall_id, 1); + EXPECT_EQ(halls[0].hall_name, "Hall 1"); + EXPECT_EQ(halls[0].capacity, 132); +} + +// Test getting a hall by ID +TEST_F(SQLiteDatabaseCRUDTest, GetHallById) { + NewHall hall{"Hall 2", 142}; + db_->addHall(hall); + + Hall retrieved_hall = db_->getHall(1); + EXPECT_EQ(retrieved_hall.hall_id, 1); + EXPECT_EQ(retrieved_hall.hall_name, "Hall 2"); + EXPECT_EQ(retrieved_hall.capacity, 142); +} + +// Test removing a hall +TEST_F(SQLiteDatabaseCRUDTest, RemoveHall) { + NewHall hall{"Hall 3", 152}; + db_->addHall(hall); + EXPECT_TRUE(db_->removeHall(1)); + + auto halls = db_->getAllHalls(); + EXPECT_TRUE(halls.empty()); +} + +// Test updating a hall +TEST_F(SQLiteDatabaseCRUDTest, UpdateHall) { + NewHall hall{"Hall 4", 162}; + db_->addHall(hall); + + Hall updated_hall = db_->getHall(1); + updated_hall.hall_name = "Hall 5"; + updated_hall.capacity = 172; + EXPECT_TRUE(db_->updateHall(updated_hall)); + + Hall retrieved_hall = db_->getHall(1); + EXPECT_EQ(retrieved_hall.hall_id, 1); + EXPECT_EQ(retrieved_hall.hall_name, "Hall 5"); + EXPECT_EQ(retrieved_hall.capacity, 172); +} + +// Test getting all halls +TEST_F(SQLiteDatabaseCRUDTest, GetAllHalls) { + db_->addHall({"Hall 6", 172}); + db_->addHall({"Hall 7", 182}); + + auto halls = db_->getAllHalls(); + ASSERT_EQ(halls.size(), 2); + EXPECT_EQ(halls[0].hall_id, 1); + EXPECT_EQ(halls[0].hall_name, "Hall 6"); + EXPECT_EQ(halls[0].capacity, 172); + EXPECT_EQ(halls[1].hall_id, 2); + EXPECT_EQ(halls[1].hall_name, "Hall 7"); + EXPECT_EQ(halls[1].capacity, 182); +} + +// INFO: ----- SESSION ----- + +// Test adding a session +TEST_F(SQLiteDatabaseCRUDTest, AddSession) { + NewSession session{1, 1, "2025-01-01 12:00:00", 10}; + EXPECT_TRUE(db_->addSession(session)); + + auto sessions = db_->getAllSessions(); + ASSERT_EQ(sessions.size(), 1); + EXPECT_EQ(sessions[0].movie_id, 1); + EXPECT_EQ(sessions[0].hall_id, 1); + EXPECT_EQ(sessions[0].begin_at, "2025-01-01 12:00:00"); + EXPECT_EQ(sessions[0].ticket_price, 10); +} + +// Test getting a session by ID +TEST_F(SQLiteDatabaseCRUDTest, GetSessionById) { + NewSession session{2, 2, "2025-01-01 12:00:00", 10}; + db_->addSession(session); + + Session retrieved_session = db_->getSession(1); + EXPECT_EQ(retrieved_session.session_id, 1); + EXPECT_EQ(retrieved_session.movie_id, 2); + EXPECT_EQ(retrieved_session.hall_id, 2); + EXPECT_EQ(retrieved_session.begin_at, "2025-01-01 12:00:00"); + EXPECT_EQ(retrieved_session.ticket_price, 10); +} + +// Test removing a session +TEST_F(SQLiteDatabaseCRUDTest, RemoveSession) { + NewSession session{3, 3, "2025-01-01 12:00:00", 10}; + db_->addSession(session); + EXPECT_TRUE(db_->removeSession(1)); + + auto sessions = db_->getAllSessions(); + EXPECT_TRUE(sessions.empty()); +} + +// Test updating a session +TEST_F(SQLiteDatabaseCRUDTest, UpdateSession) { + NewSession session{4, 4, "2025-01-01 12:00:00", 10}; + db_->addSession(session); + + Session updated_session = db_->getSession(1); + updated_session.begin_at = "2025-01-01 13:00:00"; + EXPECT_TRUE(db_->updateSession(updated_session)); + + Session retrieved_session = db_->getSession(1); + EXPECT_EQ(retrieved_session.session_id, 1); + EXPECT_EQ(retrieved_session.movie_id, 4); + EXPECT_EQ(retrieved_session.hall_id, 4); + EXPECT_EQ(retrieved_session.begin_at, "2025-01-01 13:00:00"); + EXPECT_EQ(retrieved_session.ticket_price, 10); +} + +// Test getting all sessions +TEST_F(SQLiteDatabaseCRUDTest, GetAllSessions) { + db_->addSession({5, 5, "2025-01-01 12:00:00", 10}); + db_->addSession({6, 6, "2025-01-01 13:00:00", 10}); + + auto sessions = db_->getAllSessions(); + ASSERT_EQ(sessions.size(), 2); + EXPECT_EQ(sessions[0].movie_id, 5); + EXPECT_EQ(sessions[0].hall_id, 5); + EXPECT_EQ(sessions[0].begin_at, "2025-01-01 12:00:00"); + EXPECT_EQ(sessions[0].ticket_price, 10); + EXPECT_EQ(sessions[1].movie_id, 6); + EXPECT_EQ(sessions[1].hall_id, 6); + EXPECT_EQ(sessions[1].begin_at, "2025-01-01 13:00:00"); + EXPECT_EQ(sessions[1].ticket_price, 10); +} + +// INFO: ----- TICKET ----- + +// Test adding a ticket +TEST_F(SQLiteDatabaseCRUDTest, AddTicket) { + NewTicket ticket{1, 1, "2025-01-01 12:00:00"}; + EXPECT_TRUE(db_->addTicket(ticket)); + + auto tickets = db_->getAllTickets(); + ASSERT_EQ(tickets.size(), 1); + EXPECT_EQ(tickets[0].session_id, 1); + EXPECT_EQ(tickets[0].seat_number, 1); + EXPECT_EQ(tickets[0].sold_at, "2025-01-01 12:00:00"); +} + +// Test getting a ticket by ID +TEST_F(SQLiteDatabaseCRUDTest, GetTicketById) { + NewTicket ticket{2, 2, "2025-01-01 12:00:00"}; + db_->addTicket(ticket); + + Ticket retrieved_ticket = db_->getTicket(1); + EXPECT_EQ(retrieved_ticket.ticket_id, 1); + EXPECT_EQ(retrieved_ticket.session_id, 2); + EXPECT_EQ(retrieved_ticket.seat_number, 2); + EXPECT_EQ(retrieved_ticket.sold_at, "2025-01-01 12:00:00"); +} + +// Test removing a ticket +TEST_F(SQLiteDatabaseCRUDTest, RemoveTicket) { + NewTicket ticket{3, 3, "2025-01-01 12:00:00"}; + db_->addTicket(ticket); + EXPECT_TRUE(db_->removeTicket(1)); + + auto tickets = db_->getAllTickets(); + EXPECT_TRUE(tickets.empty()); +} + +// Test updating a ticket +TEST_F(SQLiteDatabaseCRUDTest, UpdateTicket) { + NewTicket ticket{4, 4, "2025-01-01 12:00:00"}; + db_->addTicket(ticket); + + Ticket updated_ticket = db_->getTicket(1); + updated_ticket.seat_number = 5; + EXPECT_TRUE(db_->updateTicket(updated_ticket)); + + Ticket retrieved_ticket = db_->getTicket(1); + EXPECT_EQ(retrieved_ticket.ticket_id, 1); + EXPECT_EQ(retrieved_ticket.session_id, 4); + EXPECT_EQ(retrieved_ticket.seat_number, 5); + EXPECT_EQ(retrieved_ticket.sold_at, "2025-01-01 12:00:00"); +} + +// Test getting all tickets +TEST_F(SQLiteDatabaseCRUDTest, GetAllTickets) { + db_->addTicket({5, 5, "2025-01-01 12:00:00"}); + db_->addTicket({6, 6, "2025-01-01 13:00:00"}); + + auto tickets = db_->getAllTickets(); + ASSERT_EQ(tickets.size(), 2); + EXPECT_EQ(tickets[0].session_id, 5); + EXPECT_EQ(tickets[0].seat_number, 5); + EXPECT_EQ(tickets[0].sold_at, "2025-01-01 12:00:00"); + EXPECT_EQ(tickets[1].session_id, 6); + EXPECT_EQ(tickets[1].seat_number, 6); + EXPECT_EQ(tickets[1].sold_at, "2025-01-01 13:00:00"); +} diff --git a/tests_schema/tests/sqlite_database_foreign_key_test.cpp b/tests_schema/tests/sqlite_database_foreign_key_test.cpp new file mode 100644 index 0000000..d694b98 --- /dev/null +++ b/tests_schema/tests/sqlite_database_foreign_key_test.cpp @@ -0,0 +1,103 @@ +#include "sqlite_database.h" +#include "sqlite_file_executor.h" +#include "gtest/gtest.h" + +// WARNING: Triggers are off + +const std::string TEST_DB = "test.db"; + +// Test fixture for SQLiteDatabase +class SQLiteDatabaseForeignKeyTest : public ::testing::Test { + +protected: + SQLiteDatabase *db_; + +public: + // void pragmaForeignKeysOn() { + // const std::string query = "PRAGMA foreign_keys = ON;"; + // db_->executeNonQuery(query); + // } + + std::vector> pragmaForeignKeys() { + const std::string query = "PRAGMA foreign_keys;"; + auto results = db_->executeSelectQuery(query); + return results; + } + +protected: + void SetUp() override { + db_ = new SQLiteDatabase(TEST_DB); + SQLiteFileExecutor executor(TEST_DB); + executor.executeSQLFile("sql/cinema_db_drop_table.sql"); + executor.executeSQLFile("sql/cinema_db_create_table.sql"); + + // pragmaForeignKeysOn(); + + std::string sql; + FileReaderInterface *reader = &executor; + reader->read("sql/cinema_db_foreign_key_on.sql", sql); + db_->executeNonQuery(sql); + } + + void TearDown() override { + delete db_; + remove(TEST_DB.c_str()); + } +}; + +// INFO: ----- GENERAL ----- + +// Check pragma foreign_keys is true +TEST_F(SQLiteDatabaseForeignKeyTest, PragmaForeignKeys) { + auto results = pragmaForeignKeys(); + ASSERT_FALSE(results.empty()); + ASSERT_EQ(results[0][0], "1"); +} + +// Test adding a movie +TEST_F(SQLiteDatabaseForeignKeyTest, AddMovie) { + NewMovie movie{"The Shawshank Redemption", 1, 142}; + EXPECT_FALSE(db_->addMovie(movie)); + + auto movies = db_->getAllMovies(); + ASSERT_TRUE(movies.empty()); + + NewGenre genre{"Drama"}; + EXPECT_TRUE(db_->addGenre(genre)); + EXPECT_TRUE(db_->addMovie(movie)); + movies = db_->getAllMovies(); + ASSERT_FALSE(movies.empty()); +} + +// Test adding session +TEST_F(SQLiteDatabaseForeignKeyTest, AddSession) { + NewSession session{1, 1, "2025-01-01 12:00:00", 10}; + EXPECT_FALSE(db_->addSession(session)); + + NewHall hall{"Hall 1", 100}; + db_->addHall(hall); + EXPECT_FALSE(db_->addSession(session)); + + NewGenre genre{"Drama"}; + db_->addGenre(genre); + NewMovie movie{"The Shawshank Redemption", 1, 142}; + db_->addMovie(movie); + EXPECT_TRUE(db_->addSession(session)); +} + +// Test adding ticket +TEST_F(SQLiteDatabaseForeignKeyTest, AddTicket) { + NewTicket ticket{1, 1, "2025-01-01 12:00:00"}; + EXPECT_FALSE(db_->addTicket(ticket)); + + NewHall hall{"Hall 1", 100}; + db_->addHall(hall); + NewGenre genre{"Drama"}; + db_->addGenre(genre); + NewMovie movie{"The Shawshank Redemption", 1, 142}; + db_->addMovie(movie); + NewSession session{1, 1, "2025-01-01 12:00:00", 10}; + db_->addSession(session); + + EXPECT_TRUE(db_->addTicket(ticket)); +} diff --git a/tests_schema/tests/sqlite_database_trigger_test.cpp b/tests_schema/tests/sqlite_database_trigger_test.cpp new file mode 100644 index 0000000..862782a --- /dev/null +++ b/tests_schema/tests/sqlite_database_trigger_test.cpp @@ -0,0 +1,144 @@ +#include "sqlite_database.h" +#include "sqlite_file_executor.h" +#include "gtest/gtest.h" + +// WARNING: Foreign keys are off + +const std::string TEST_DB = "test.db"; + +// Test fixture for SQLiteDatabase +class SQLiteDatabaseTriggerTest : public ::testing::Test { +protected: + SQLiteDatabase *db_; + + void SetUp() override { + db_ = new SQLiteDatabase(TEST_DB); + SQLiteFileExecutor executor(TEST_DB); + executor.executeSQLFile("sql/cinema_db_drop_table.sql"); + executor.executeSQLFile("sql/cinema_db_create_table.sql"); + executor.executeSQLFile("sql/cinema_db_drop_trigger.sql"); + executor.executeSQLFile("sql/cinema_db_create_trigger.sql"); + + // Not necessarily, since the default setting + std::string sql; + FileReaderInterface *reader = &executor; + reader->read("sql/cinema_db_foreign_key_off.sql", sql); + db_->executeNonQuery(sql); + } + + void TearDown() override { + delete db_; + remove(TEST_DB.c_str()); + } +}; + +// INFO: ----- TICKET ----- + +// Test trigger check_seat_number +TEST_F(SQLiteDatabaseTriggerTest, CheckSeatNumber) { + db_->addHall({"Hall 1", 100}); + db_->addSession({1, 1, "2025-01-01 12:00:00", 10}); + + NewTicket ticket; + ticket.session_id = 1; + ticket.sold_at = "2025-01-01 12:00:00"; + + ticket.seat_number = 101; + EXPECT_FALSE(db_->addTicket(ticket)); + + ticket.seat_number = 100; + EXPECT_TRUE(db_->addTicket(ticket)); + + ticket.seat_number = 1; + EXPECT_TRUE(db_->addTicket(ticket)); +} + +// Test trigger check_session_not_started +TEST_F(SQLiteDatabaseTriggerTest, CheckSessionNotStarted) { + db_->addSession({1, 1, "2025-01-01 12:00:00", 10}); + + NewTicket ticket; + ticket.session_id = 1; + ticket.seat_number = 1; + + ticket.sold_at = "2025-01-01 13:00:00"; + EXPECT_FALSE(db_->addTicket(ticket)); + + ticket.sold_at = "2025-01-01 11:00:00"; + EXPECT_TRUE(db_->addTicket(ticket)); + + ticket.seat_number = 2; + ticket.sold_at = "2025-01-01 12:00:00"; + EXPECT_TRUE(db_->addTicket(ticket)); +} + +// Test trigger prevent_late_ticket_purchase +TEST_F(SQLiteDatabaseTriggerTest, PreventLateTicketPurchase) { + db_->addHall({"Hall 1", 100}); + db_->addSession({1, 1, "2025-01-01 12:00:00", 10}); + + NewTicket ticket; + ticket.session_id = 1; + ticket.seat_number = 1; + + ticket.sold_at = "2025-01-01 13:00:00"; + EXPECT_FALSE(db_->addTicket(ticket)); + + ticket.sold_at = "2025-01-01 12:00:00"; + EXPECT_TRUE(db_->addTicket(ticket)); + + ticket.seat_number = 2; + ticket.sold_at = "2025-01-01 11:00:00"; + EXPECT_TRUE(db_->addTicket(ticket)); +} + +// INFO: ----- REFUND ----- + +// Test trigger validate_refund_amount +TEST_F(SQLiteDatabaseTriggerTest, ValidateRefundAmount) { + db_->addHall({"Hall 1", 100}); + db_->addSession({1, 1, "2025-01-01 12:00:00", 10}); + + // ID 1 + db_->addTicket({1, 1, "2025-01-01 10:00:00"}); + // ID 2 + db_->addTicket({1, 2, "2025-01-01 10:00:00"}); + + NewRefund refund; + refund.ticket_id = 1; + refund.refund_at = "2025-01-01 11:00:00"; + + refund.refund_amount = 11; + EXPECT_FALSE(db_->addRefund(refund)); + + refund.refund_amount = 10; + EXPECT_TRUE(db_->addRefund(refund)); + + refund.ticket_id = 2; + refund.refund_amount = 9; + EXPECT_TRUE(db_->addRefund(refund)); +} + +// Test trigger validate_refund_date +TEST_F(SQLiteDatabaseTriggerTest, ValidateRefundDate) { + db_->addHall({"Hall 1", 100}); + db_->addSession({1, 1, "2025-01-01 12:00:00", 10}); + + // ID 1 + db_->addTicket({1, 1, "2025-01-01 10:00:00"}); + // ID 2 + db_->addTicket({1, 2, "2025-01-01 10:00:00"}); + + NewRefund refund; + refund.ticket_id = 1; + refund.refund_amount = 10; + + refund.refund_at = "2025-01-01 09:00:00"; + EXPECT_FALSE(db_->addRefund(refund)); + + refund.refund_at = "2025-01-01 11:00:00"; + EXPECT_TRUE(db_->addRefund(refund)); + + refund.refund_at = "2025-01-01 12:00:00"; + EXPECT_FALSE(db_->addRefund(refund)); +} diff --git a/tests_schema/tests_sources/database_interface.h b/tests_schema/tests_sources/database_interface.h new file mode 100644 index 0000000..0c70741 --- /dev/null +++ b/tests_schema/tests_sources/database_interface.h @@ -0,0 +1,188 @@ +#ifndef DATABASE_INTERFACE_H +#define DATABASE_INTERFACE_H + +#include +#include + +// Data structures representing the entities + +struct Genre { + int genre_id; + std::string genre_name; + + Genre() = default; + Genre(int id, const std::string &name) : genre_id(id), genre_name(name) {} +}; + +struct Movie { + int movie_id; + std::string title; + int genre_id; + int duration; // Duration in minutes + + Movie() = default; + Movie(int id, const std::string &title, int genre_id, int duration) + : movie_id(id), title(title), genre_id(genre_id), duration(duration) {} +}; + +struct Hall { + int hall_id; + std::string hall_name; + int capacity; + + Hall() = default; + Hall(int id, const std::string &name, int capacity) + : hall_id(id), hall_name(name), capacity(capacity) {} +}; + +struct Session { + int session_id; + int movie_id; + int hall_id; + std::string begin_at; // Use appropriate date-time type if needed + double ticket_price; + + Session() = default; + Session(int id, int movie_id, int hall_id, const std::string &begin_at, + double price) + : session_id(id), movie_id(movie_id), hall_id(hall_id), + begin_at(begin_at), ticket_price(price) {} +}; + +struct Ticket { + int ticket_id; + int session_id; + int seat_number; + std::string sold_at; // Use appropriate date-time type if needed + + Ticket() = default; + Ticket(int id, int session_id, int seat_number, const std::string &time) + : ticket_id(id), session_id(session_id), seat_number(seat_number), + sold_at(time) {} +}; + +struct Refund { + int refund_id; + int ticket_id; + std::string refund_at; // Use appropriate date-time type if needed + double refund_amount; + + Refund() = default; + Refund(int id, int ticket_id, const std::string &time, double amount) + : refund_id(id), ticket_id(ticket_id), refund_at(time), + refund_amount(amount) {} +}; + +// Structures for adding new records (without IDs) + +struct NewGenre { + std::string genre_name; + + NewGenre() = default; + NewGenre(const std::string &name) : genre_name(name) {} +}; + +struct NewMovie { + std::string title; + int genre_id; + int duration; // Duration in minutes + + NewMovie() = default; + NewMovie(const std::string &title, int genre_id, int duration) + : title(title), genre_id(genre_id), duration(duration) {} +}; + +struct NewHall { + std::string hall_name; + int capacity; + + NewHall() = default; + NewHall(const std::string &name, int capacity) + : hall_name(name), capacity(capacity) {} +}; + +struct NewSession { + int movie_id; + int hall_id; + std::string begin_at; // Use appropriate date-time type if needed + double ticket_price; + + NewSession() = default; + NewSession(int movie_id, int hall_id, const std::string &begin_at, + double price) + : movie_id(movie_id), hall_id(hall_id), begin_at(begin_at), + ticket_price(price) {} +}; + +struct NewTicket { + int session_id; + int seat_number; + std::string sold_at; // Optional, can default to CURRENT_TIMESTAMP + + NewTicket() = default; + NewTicket(int session_id, int seat_number, const std::string &time) + : session_id(session_id), seat_number(seat_number), sold_at(time) {} +}; + +struct NewRefund { + int ticket_id; + std::string refund_at; // Optional, can default to CURRENT_TIMESTAMP + double refund_amount; + + NewRefund() = default; + NewRefund(int ticket_id, const std::string &time, double amount) + : ticket_id(ticket_id), refund_at(time), refund_amount(amount) {} +}; + +// Abstract interface for database operations +class DatabaseInterface { +public: + virtual ~DatabaseInterface() {} + + // Verification of the database availability + virtual bool isDatabaseAvailable() = 0; + + // Genre operations + virtual bool addGenre(const NewGenre &genre) = 0; + virtual bool removeGenre(int genre_id) = 0; + virtual bool updateGenre(const Genre &genre) = 0; + virtual Genre getGenre(int genre_id) = 0; + virtual std::vector getAllGenres() = 0; + + // Movie operations + virtual bool addMovie(const NewMovie &movie) = 0; + virtual bool removeMovie(int movie_id) = 0; + virtual bool updateMovie(const Movie &movie) = 0; + virtual Movie getMovie(int movie_id) = 0; + virtual std::vector getAllMovies() = 0; + + // Hall operations + virtual bool addHall(const NewHall &hall) = 0; + virtual bool removeHall(int hall_id) = 0; + virtual bool updateHall(const Hall &hall) = 0; + virtual Hall getHall(int hall_id) = 0; + virtual std::vector getAllHalls() = 0; + + // Session operations + virtual bool addSession(const NewSession &session) = 0; + virtual bool removeSession(int session_id) = 0; + virtual bool updateSession(const Session &session) = 0; + virtual Session getSession(int session_id) = 0; + virtual std::vector getAllSessions() = 0; + + // Ticket operations + virtual bool addTicket(const NewTicket &ticket) = 0; + virtual bool removeTicket(int ticket_id) = 0; + virtual bool updateTicket(const Ticket &ticket) = 0; + virtual Ticket getTicket(int ticket_id) = 0; + virtual std::vector getAllTickets() = 0; + + // Refund operations + virtual bool addRefund(const NewRefund &refund) = 0; + virtual bool removeRefund(int refund_id) = 0; + virtual bool updateRefund(const Refund &refund) = 0; + virtual Refund getRefund(int refund_id) = 0; + virtual std::vector getAllRefunds() = 0; +}; + +#endif // DATABASE_INTERFACE_H diff --git a/tests_schema/tests_sources/file_reader.cpp b/tests_schema/tests_sources/file_reader.cpp new file mode 100644 index 0000000..4b62e1c --- /dev/null +++ b/tests_schema/tests_sources/file_reader.cpp @@ -0,0 +1,23 @@ +#include "file_reader.h" + +#include +#include +#include + +// Read a SQL file +bool FileReader::read(const std::string &sqlFilePath, std::string &sql) { + // Try read the SQL file + std::ifstream file(sqlFilePath); + if (!file.is_open()) { + std::cerr << "Error opening file:" << sqlFilePath << std::endl; + return false; + } + + std::stringstream buffer; + buffer << file.rdbuf(); + + sql = buffer.str(); + file.close(); + + return true; +} diff --git a/tests_schema/tests_sources/file_reader.h b/tests_schema/tests_sources/file_reader.h new file mode 100644 index 0000000..7d0b168 --- /dev/null +++ b/tests_schema/tests_sources/file_reader.h @@ -0,0 +1,12 @@ +#ifndef FILE_READER_H +#define FILE_READER_H + +#include "file_reader_interface.h" +#include + +class FileReader : virtual public FileReaderInterface { +public: + bool read(const std::string &sqlFilePath, std::string &sql) override; +}; + +#endif // FILE_READER_H diff --git a/tests_schema/tests_sources/file_reader_interface.h b/tests_schema/tests_sources/file_reader_interface.h new file mode 100644 index 0000000..74bba84 --- /dev/null +++ b/tests_schema/tests_sources/file_reader_interface.h @@ -0,0 +1,12 @@ +#ifndef FILE_READER_INTERFACE_H +#define FILE_READER_INTERFACE_H + +#include + +class FileReaderInterface { +public: + virtual ~FileReaderInterface() = default; + virtual bool read(const std::string &sqlFilePath, std::string &data) = 0; +}; + +#endif // !FILE_READER_INTERFACE diff --git a/tests_schema/tests_sources/sql_file_executor_interfase.h b/tests_schema/tests_sources/sql_file_executor_interfase.h new file mode 100644 index 0000000..f3ded38 --- /dev/null +++ b/tests_schema/tests_sources/sql_file_executor_interfase.h @@ -0,0 +1,13 @@ +#ifndef SQL_FILE_EXECUTOR_INTERFASE_H +#define SQL_FILE_EXECUTOR_INTERFASE_H + +#include "file_reader_interface.h" +#include + +class SQLFileExecutorInterface : virtual public FileReaderInterface { +public: + virtual ~SQLFileExecutorInterface() {} + virtual void executeSQLFile(const std::string &sqlFilePath) = 0; +}; + +#endif // !SQL_FILE_EXECUTOR_INTERF diff --git a/tests_schema/tests_sources/sqlite_database.cpp b/tests_schema/tests_sources/sqlite_database.cpp new file mode 100644 index 0000000..61aa68f --- /dev/null +++ b/tests_schema/tests_sources/sqlite_database.cpp @@ -0,0 +1,487 @@ +#include "sqlite_database.h" + +#include "sqlite_statement.h" +#include +#include // std::exchange + +// Constructor: Opens the SQLite database +SQLiteDatabase::SQLiteDatabase(const std::string &db_file) { + // WARNING: The database is not blocked + if (sqlite3_open(db_file.c_str(), &db_) != SQLITE_OK) { + std::cerr << "Failed to open database:" << sqlite3_errmsg(db_) << std::endl; + db_ = nullptr; + } +} + +// Destructor: Closes the database connection +SQLiteDatabase::~SQLiteDatabase() { + if (db_) { + sqlite3_close(db_); + } +} + +SQLiteDatabase::SQLiteDatabase(SQLiteDatabase &&other) noexcept + : db_(std::exchange(other.db_, nullptr)) {} + +SQLiteDatabase &SQLiteDatabase::operator=(SQLiteDatabase &&other) noexcept { + if (this != &other) { + if (db_) { + sqlite3_close(db_); + } + db_ = std::exchange(other.db_, nullptr); + } + return *this; +} + +// Helper function for executing non-SELECT queries +int SQLiteDatabase::executeNonQuery( + const std::string &query, + const std::function &bindFunc) { + SQLiteStatement stmt(db_, query); + + if (db_ == nullptr) { + throw std::runtime_error("Database is not open"); + } + + if (bindFunc) { + bindFunc(stmt); + } + + if (!stmt.execute()) { + std::cerr << "Failed to execute query:" << sqlite3_errmsg(db_); + } + + return stmt.changes(); +} + +// Helper function for executing SELECT queries +std::vector> SQLiteDatabase::executeSelectQuery( + const std::string &query, + const std::function &bindFunc) { + std::vector> results; + SQLiteStatement stmt(db_, query); + + if (db_ == nullptr) { + throw std::runtime_error("Database is not open"); + } + + if (bindFunc) { + bindFunc(stmt); + } + + while (stmt.step()) { + std::vector row; + for (int i = 0, count = stmt.getColumnCount(); i < count; ++i) { + row.emplace_back(stmt.getColumnText(i)); + } + results.push_back(row); + } + + return results; +} + +// INFO: ----- GENRE ----- + +// Add a new genre +bool SQLiteDatabase::addGenre(const NewGenre &genre) { + const std::string query = "INSERT INTO genres (genre_name) VALUES (?);"; + int changes = executeNonQuery(query, [&genre](SQLiteStatement &stmt) { + stmt.bind(1, genre.genre_name); + }); + + return changes > 0; +} + +// Remove a genre by ID +bool SQLiteDatabase::removeGenre(int genre_id) { + const std::string query = "DELETE FROM genres WHERE genre_id = ?;"; + int changes = executeNonQuery( + query, [&genre_id](SQLiteStatement &stmt) { stmt.bind(1, genre_id); }); + + return changes > 0; +} + +// Update an existing genre +bool SQLiteDatabase::updateGenre(const Genre &genre) { + const std::string query = + "UPDATE genres SET genre_name = ? WHERE genre_id = ?;"; + int changes = executeNonQuery(query, [&genre](SQLiteStatement &stmt) { + stmt.bind(1, genre.genre_name); + stmt.bind(2, genre.genre_id); + }); + + return changes > 0; +} + +// Get a genre by ID +Genre SQLiteDatabase::getGenre(int genre_id) { + const std::string query = "SELECT * FROM genres WHERE genre_id = ?;"; + auto result = executeSelectQuery( + query, [&genre_id](SQLiteStatement &stmt) { stmt.bind(1, genre_id); }); + + if (!result.empty()) { + auto genre_id = std::stoi(result[0][0]); + auto genre_name = result[0][1]; + Genre genre(genre_id, genre_name); + return genre; + } + return {}; +} + +// Get all genres +std::vector SQLiteDatabase::getAllGenres() { + const std::string query = "SELECT * FROM genres;"; + auto result = executeSelectQuery(query); + + std::vector genres; + for (const auto &row : result) { + genres.push_back({std::stoi(row[0]), row[1]}); + } + + return genres; +} + +// INFO: ----- MOVIE ----- + +// Add a new movie +bool SQLiteDatabase::addMovie(const NewMovie &movie) { + const std::string query = + "INSERT INTO movies (title, genre_id, duration) VALUES (?, ?, ?);"; + int changes = executeNonQuery(query, [&movie](SQLiteStatement &stmt) { + stmt.bind(1, movie.title); + stmt.bind(2, movie.genre_id); + stmt.bind(3, movie.duration); + }); + + return changes > 0; +} + +// Remove a movie by ID +bool SQLiteDatabase::removeMovie(int movie_id) { + const std::string query = "DELETE FROM movies WHERE movie_id = ?;"; + int changes = executeNonQuery( + query, [&movie_id](SQLiteStatement &stmt) { stmt.bind(1, movie_id); }); + + return changes > 0; +} + +// Update an existing movie +bool SQLiteDatabase::updateMovie(const Movie &movie) { + const std::string query = + "UPDATE movies SET title = ?, genre_id = ?, duration = ? WHERE movie_id " + "= ?;"; + int changes = executeNonQuery(query, [&movie](SQLiteStatement &stmt) { + stmt.bind(1, movie.title); + stmt.bind(2, movie.genre_id); + stmt.bind(3, movie.duration); + stmt.bind(4, movie.movie_id); + }); + + return changes > 0; +} + +// Get a movie by ID +Movie SQLiteDatabase::getMovie(int movie_id) { + const std::string query = "SELECT * FROM movies WHERE movie_id = ?;"; + auto result = executeSelectQuery( + query, [&movie_id](SQLiteStatement &stmt) { stmt.bind(1, movie_id); }); + + if (!result.empty()) { + auto movie_id = std::stoi(result[0][0]); + auto title = result[0][1]; + auto genre_id = std::stoi(result[0][2]); + auto duration = std::stoi(result[0][3]); + Movie movie(movie_id, title, genre_id, duration); + return movie; + } + return {}; +} + +// Get all movies +std::vector SQLiteDatabase::getAllMovies() { + const std::string query = "SELECT * FROM movies;"; + auto result = executeSelectQuery(query); + std::vector movies; + + for (const auto &row : result) { + movies.push_back( + {std::stoi(row[0]), row[1], std::stoi(row[2]), std::stoi(row[3])}); + } + return movies; +} + +// INFO: ----- HALL ----- + +// Add a new hall +bool SQLiteDatabase::addHall(const NewHall &hall) { + const std::string query = + "INSERT INTO halls (hall_name, capacity) VALUES (?, ?);"; + int changes = executeNonQuery(query, [&hall](SQLiteStatement &stmt) { + stmt.bind(1, hall.hall_name); + stmt.bind(2, hall.capacity); + }); + + return changes > 0; +} + +// Remove a hall by ID +bool SQLiteDatabase::removeHall(int hall_id) { + const std::string query = "DELETE FROM halls WHERE hall_id = ?;"; + int changes = executeNonQuery( + query, [&hall_id](SQLiteStatement &stmt) { stmt.bind(1, hall_id); }); + + return changes > 0; +} + +// Update an existing hall +bool SQLiteDatabase::updateHall(const Hall &hall) { + const std::string query = + "UPDATE halls SET hall_name = ?, capacity = ? WHERE hall_id = ?;"; + int changes = executeNonQuery(query, [&hall](SQLiteStatement &stmt) { + stmt.bind(1, hall.hall_name); + stmt.bind(2, hall.capacity); + stmt.bind(3, hall.hall_id); + }); + + return changes > 0; +} + +// Get a hall by ID +Hall SQLiteDatabase::getHall(int hall_id) { + const std::string query = "SELECT * FROM halls WHERE hall_id = ?;"; + auto result = executeSelectQuery( + query, [&hall_id](SQLiteStatement &stmt) { stmt.bind(1, hall_id); }); + + if (!result.empty()) { + auto hall_id = std::stoi(result[0][0]); + auto hall_name = result[0][1]; + auto capacity = std::stoi(result[0][2]); + Hall hall(hall_id, hall_name, capacity); + return hall; + } + return {}; +} + +// Get all halls +std::vector SQLiteDatabase::getAllHalls() { + const std::string query = "SELECT * FROM halls;"; + auto result = executeSelectQuery(query); + std::vector halls; + + for (const auto &row : result) { + halls.push_back({std::stoi(row[0]), row[1], std::stoi(row[2])}); + } + return halls; +} + +// INFO: ----- SESSION ----- + +// Add a new session +bool SQLiteDatabase::addSession(const NewSession &session) { + const std::string query = "INSERT INTO sessions (movie_id, hall_id, " + "begin_at, ticket_price) VALUES (?, ?, ?, ?);"; + int changes = executeNonQuery(query, [&session](SQLiteStatement &stmt) { + stmt.bind(1, session.movie_id); + stmt.bind(2, session.hall_id); + stmt.bind(3, session.begin_at); + stmt.bind(4, session.ticket_price); + }); + + return changes > 0; +} + +// Remove a session by ID +bool SQLiteDatabase::removeSession(int session_id) { + const std::string query = "DELETE FROM sessions WHERE session_id = ?;"; + int changes = executeNonQuery(query, [&session_id](SQLiteStatement &stmt) { + stmt.bind(1, session_id); + }); + + return changes > 0; +} + +// Update an existing session +bool SQLiteDatabase::updateSession(const Session &session) { + const std::string query = "UPDATE sessions SET movie_id = ?, hall_id = ?, " + "begin_at = ?, ticket_price = ? WHERE " + "session_id = ?;"; + int changes = executeNonQuery(query, [&session](SQLiteStatement &stmt) { + stmt.bind(1, session.movie_id); + stmt.bind(2, session.hall_id); + stmt.bind(3, session.begin_at); + stmt.bind(4, session.ticket_price); + stmt.bind(5, session.session_id); + }); + + return changes > 0; +} + +// Get a session by ID +Session SQLiteDatabase::getSession(int session_id) { + const std::string query = "SELECT * FROM sessions WHERE session_id = ?;"; + auto result = executeSelectQuery(query, [&session_id](SQLiteStatement &stmt) { + stmt.bind(1, session_id); + }); + + if (!result.empty()) { + auto session_id = std::stoi(result[0][0]); + auto movie_id = std::stoi(result[0][1]); + auto hall_id = std::stoi(result[0][2]); + auto begin_at = result[0][3]; + auto ticket_price = std::stod(result[0][4]); + Session session(session_id, movie_id, hall_id, begin_at, ticket_price); + return session; + } + return {}; +} + +// Get all sessions +std::vector SQLiteDatabase::getAllSessions() { + const std::string query = "SELECT * FROM sessions;"; + auto result = executeSelectQuery(query); + std::vector sessions; + + for (const auto &row : result) { + sessions.push_back({std::stoi(row[0]), std::stoi(row[1]), std::stoi(row[2]), + row[3], std::stod(row[4])}); + } + return sessions; +} + +// INFO: ----- TICKET ----- + +// Add a new ticket +bool SQLiteDatabase::addTicket(const NewTicket &ticket) { + const std::string query = "INSERT INTO tickets (session_id, seat_number, " + "sold_at) VALUES (?, ?, ?);"; + int changes = executeNonQuery(query, [&ticket](SQLiteStatement &stmt) { + stmt.bind(1, ticket.session_id); + stmt.bind(2, ticket.seat_number); + stmt.bind(3, ticket.sold_at); + }); + + return changes > 0; +} + +// Remove a ticket by ID +bool SQLiteDatabase::removeTicket(int ticket_id) { + const std::string query = "DELETE FROM tickets WHERE ticket_id = ?;"; + int changes = executeNonQuery( + query, [&ticket_id](SQLiteStatement &stmt) { stmt.bind(1, ticket_id); }); + + return changes > 0; +} + +// Update an existing ticket +bool SQLiteDatabase::updateTicket(const Ticket &ticket) { + const std::string query = "UPDATE tickets SET session_id = ?, seat_number = " + "?, sold_at = ? WHERE ticket_id = ?;"; + int changes = executeNonQuery(query, [&ticket](SQLiteStatement &stmt) { + stmt.bind(1, ticket.session_id); + stmt.bind(2, ticket.seat_number); + stmt.bind(3, ticket.sold_at); + stmt.bind(4, ticket.ticket_id); + }); + + return changes > 0; +} + +// Get a ticket by ID +Ticket SQLiteDatabase::getTicket(int ticket_id) { + const std::string query = "SELECT * FROM tickets WHERE ticket_id = ?;"; + auto result = executeSelectQuery( + query, [&ticket_id](SQLiteStatement &stmt) { stmt.bind(1, ticket_id); }); + + if (!result.empty()) { + auto ticket_id = std::stoi(result[0][0]); + auto session_id = std::stoi(result[0][1]); + auto seat_number = std::stoi(result[0][2]); + auto sold_at = result[0][3]; + Ticket ticket(ticket_id, session_id, seat_number, sold_at); + return ticket; + } + return {}; +} + +// Get all tickets +std::vector SQLiteDatabase::getAllTickets() { + const std::string query = "SELECT * FROM tickets;"; + auto result = executeSelectQuery(query); + std::vector tickets; + + for (const auto &row : result) { + tickets.push_back( + {std::stoi(row[0]), std::stoi(row[1]), std::stoi(row[2]), row[3]}); + } + return tickets; +} + +// INFO: ----- REFUND ----- + +// Add a new refund +bool SQLiteDatabase::addRefund(const NewRefund &refund) { + const std::string query = + "INSERT INTO refunds (ticket_id, refund_at, refund_amount) " + "VALUES (?, ?, ?);"; + int changes = executeNonQuery(query, [&refund](SQLiteStatement &stmt) { + stmt.bind(1, refund.ticket_id); + stmt.bind(2, refund.refund_at); + stmt.bind(3, refund.refund_amount); + }); + + return changes > 0; +} + +// Remove a refund by ID +bool SQLiteDatabase::removeRefund(int refund_id) { + const std::string query = "DELETE FROM refunds WHERE refund_id = ?;"; + int changes = executeNonQuery( + query, [&refund_id](SQLiteStatement &stmt) { stmt.bind(1, refund_id); }); + + return changes > 0; +} + +// Update an existing refund +bool SQLiteDatabase::updateRefund(const Refund &refund) { + const std::string query = + "UPDATE refunds SET ticket_id = ?, refund_at = ?, refund_amount = ? " + "WHERE refund_id = ?;"; + int changes = executeNonQuery(query, [&refund](SQLiteStatement &stmt) { + stmt.bind(1, refund.ticket_id); + stmt.bind(2, refund.refund_at); + stmt.bind(3, refund.refund_amount); + stmt.bind(4, refund.refund_id); + }); + + return changes > 0; +} + +// Get a refund by ID +Refund SQLiteDatabase::getRefund(int refund_id) { + const std::string query = "SELECT * FROM refunds WHERE refund_id = ?;"; + auto result = executeSelectQuery( + query, [&refund_id](SQLiteStatement &stmt) { stmt.bind(1, refund_id); }); + + if (!result.empty()) { + auto refund_id = std::stoi(result[0][0]); + auto ticket_id = std::stoi(result[0][1]); + auto refund_at = result[0][2]; + auto refund_amount = std::stod(result[0][3]); + Refund refund(refund_id, ticket_id, refund_at, refund_amount); + return refund; + } + return {}; +} + +// Get all refunds +std::vector SQLiteDatabase::getAllRefunds() { + const std::string query = "SELECT * FROM refunds;"; + auto result = executeSelectQuery(query); + std::vector refunds; + + for (const auto &row : result) { + refunds.push_back( + {std::stoi(row[0]), std::stoi(row[1]), row[2], std::stod(row[3])}); + } + return refunds; +} diff --git a/tests_schema/tests_sources/sqlite_database.h b/tests_schema/tests_sources/sqlite_database.h new file mode 100644 index 0000000..1e444d7 --- /dev/null +++ b/tests_schema/tests_sources/sqlite_database.h @@ -0,0 +1,85 @@ +#ifndef SQLITE_DATABASE_H +#define SQLITE_DATABASE_H + +#include "database_interface.h" +#include +#include + +// Forward declaration +class SQLiteStatement; + +// SQLite implementation of the DatabaseInterface +class SQLiteDatabase : public DatabaseInterface { +private: + sqlite3 *db_; // Pointer to SQLite database connection + + // Helper functions + int executeNonQuery( + const std::string &query, + const std::function &bindFunc = nullptr); + std::vector> executeSelectQuery( + const std::string &query, + const std::function &bindFunc = nullptr); + + friend class SQLiteDatabaseForeignKeyTest; + friend class SQLiteDatabaseCRUDTest; + friend class SQLiteDatabaseTriggerTest; + +public: + // Verification of the database availability + bool isDatabaseAvailable() override { return db_ != nullptr; } + +public: + SQLiteDatabase(const std::string &db_file); + ~SQLiteDatabase(); + + SQLiteDatabase(const SQLiteDatabase &) = delete; + SQLiteDatabase &operator=(const SQLiteDatabase &) = delete; + + SQLiteDatabase(SQLiteDatabase &&) noexcept; + SQLiteDatabase &operator=(SQLiteDatabase &&) noexcept; + + // Genre operations + bool addGenre(const NewGenre &genre) override; + bool removeGenre(int genre_id) override; + bool updateGenre(const Genre &genre) override; + Genre getGenre(int genre_id) override; + std::vector getAllGenres() override; + + // Movie operations + bool addMovie(const NewMovie &movie) override; + bool removeMovie(int movie_id) override; + bool updateMovie(const Movie &movie) override; + Movie getMovie(int movie_id) override; + std::vector getAllMovies() override; + + // Hall operations + bool addHall(const NewHall &hall) override; + bool removeHall(int hall_id) override; + bool updateHall(const Hall &hall) override; + Hall getHall(int hall_id) override; + std::vector getAllHalls() override; + + // Session operations + bool addSession(const NewSession &session) override; + bool removeSession(int session_id) override; + bool updateSession(const Session &session) override; + Session getSession(int session_id) override; + std::vector getAllSessions() override; + + // Ticket operations + bool addTicket(const NewTicket &ticket) override; + bool removeTicket(int ticket_id) override; + bool updateTicket(const Ticket &ticket) override; + Ticket getTicket(int ticket_id) override; + std::vector getAllTickets() override; + + // Refund operations + bool addRefund(const NewRefund &refund) override; + bool removeRefund(int refund_id) override; + bool updateRefund(const Refund &refund) override; + Refund getRefund(int refund_id) override; + std::vector getAllRefunds() override; +}; + +#endif // SQLITE_DATABASE_H diff --git a/tests_schema/tests_sources/sqlite_file_executor.cpp b/tests_schema/tests_sources/sqlite_file_executor.cpp new file mode 100644 index 0000000..4df3667 --- /dev/null +++ b/tests_schema/tests_sources/sqlite_file_executor.cpp @@ -0,0 +1,37 @@ +#include "sqlite_file_executor.h" + +#include "sqlite_statement.h" +#include + +SQLiteFileExecutor::SQLiteFileExecutor(const std::string &dbPath) { + // WARNING: The database is not blocked + if (sqlite3_open(dbPath.c_str(), &db_) != SQLITE_OK) { + std::cerr << "Failed to open database:" << sqlite3_errmsg(db_) << std::endl; + db_ = nullptr; + } +} + +SQLiteFileExecutor::~SQLiteFileExecutor() { + if (db_) { + sqlite3_close(db_); + } +} + +// Execute a SQL file +void SQLiteFileExecutor::executeSQLFile(const std::string &sqlFilePath) { + if (db_ == nullptr) { + throw std::runtime_error("Database is not open"); + } + + std::string sqlContent; + if (!read(sqlFilePath, sqlContent)) { + throw std::runtime_error("Failed to read SQL file: " + sqlFilePath); + } + + char *errorMessage = nullptr; + if (sqlite3_exec(db_, sqlContent.c_str(), nullptr, nullptr, &errorMessage) != + SQLITE_OK) { + std::cerr << "Error executing SQL:" << errorMessage << std::endl; + sqlite3_free(errorMessage); + } +} diff --git a/tests_schema/tests_sources/sqlite_file_executor.h b/tests_schema/tests_sources/sqlite_file_executor.h new file mode 100644 index 0000000..c2f5088 --- /dev/null +++ b/tests_schema/tests_sources/sqlite_file_executor.h @@ -0,0 +1,22 @@ +#ifndef SQLITE_FILE_EXECUTOR_INTERFASE_H +#define SQLITE_FILE_EXECUTOR_INTERFASE_H + +#include "sql_file_executor_interfase.h" + +#include "file_reader.h" +#include "sqlite_statement.h" +#include + +class SQLiteFileExecutor : public SQLFileExecutorInterface, public FileReader { +private: + sqlite3 *db_; + +public: + SQLiteFileExecutor(const std::string &dbPath); + ~SQLiteFileExecutor() override; + +public: + void executeSQLFile(const std::string &sqlFilePath) override; +}; + +#endif // !SQLITE_FILE_EXECUTOR_INTERFASE_H diff --git a/tests_schema/tests_sources/sqlite_statement.cpp b/tests_schema/tests_sources/sqlite_statement.cpp new file mode 100644 index 0000000..b956ea6 --- /dev/null +++ b/tests_schema/tests_sources/sqlite_statement.cpp @@ -0,0 +1,90 @@ +#include "sqlite_statement.h" +#include + +// Constructor: Prepares the SQL statement +SQLiteStatement::SQLiteStatement(sqlite3 *db, const std::string &query) + : db_(db), stmt_(nullptr) { + if (db == nullptr) { + throw std::invalid_argument("Database connection is null"); + } + + if (sqlite3_prepare_v2(db, query.c_str(), -1, &stmt_, nullptr) != SQLITE_OK) { + std::cerr << "Error preparing SQL statement:" << "\"" + query + "\"" + << std::endl; + std::cerr << "Error message:" << sqlite3_errmsg(db) << std::endl; + + if (stmt_) { + sqlite3_finalize(stmt_); + } + + throw std::runtime_error("Failed to prepare SQLite statement: " + query); + } +} + +// Destructor: Finalizes the statement +SQLiteStatement::~SQLiteStatement() { finalize(); } + +// Bind integer value +bool SQLiteStatement::bind(int index, int value) { + return sqlite3_bind_int(stmt_, index, value) == SQLITE_OK; +} + +// Bind double value +bool SQLiteStatement::bind(int index, double value) { + return sqlite3_bind_double(stmt_, index, value) == SQLITE_OK; +} + +// Bind text value +bool SQLiteStatement::bind(int index, const std::string &value) { + return sqlite3_bind_text(stmt_, index, value.c_str(), -1, SQLITE_TRANSIENT) == + SQLITE_OK; +} + +// Bind NULL value +bool SQLiteStatement::bindNull(int index) { + return sqlite3_bind_null(stmt_, index) == SQLITE_OK; +} + +// Run the statement +// step() returns true if there are more rows +bool SQLiteStatement::execute() { return step() == false; } + +// Execute the statement +bool SQLiteStatement::step() { + int rc = sqlite3_step(stmt_); + + if (rc == SQLITE_ROW) { + return true; + } + if (rc == SQLITE_DONE) { + return false; + } + + std::cerr << "Failed to step:" << sqlite3_errmsg(db_) << std::endl; + return false; +} + +// Get the number of rows affected +int SQLiteStatement::changes() { return sqlite3_changes(db_); } + +// Reset the statement for re-use +void SQLiteStatement::reset() { sqlite3_reset(stmt_); } + +// Finalize and clean up the statement +void SQLiteStatement::finalize() { + if (stmt_) { + sqlite3_finalize(stmt_); + stmt_ = nullptr; + } +} + +// Adapter for sqlite3_column_count +int SQLiteStatement::getColumnCount() const { + return sqlite3_column_count(stmt_); +} + +// Adapter for sqlite3_column_text +std::string SQLiteStatement::getColumnText(int column_index) const { + const unsigned char *text = sqlite3_column_text(stmt_, column_index); + return text ? reinterpret_cast(text) : ""; +} diff --git a/tests_schema/tests_sources/sqlite_statement.h b/tests_schema/tests_sources/sqlite_statement.h new file mode 100644 index 0000000..6d8ff28 --- /dev/null +++ b/tests_schema/tests_sources/sqlite_statement.h @@ -0,0 +1,33 @@ +#ifndef SQLITE_STATEMENT_H +#define SQLITE_STATEMENT_H + +#include +#include + +class SQLiteStatement { +private: + sqlite3 *db_; + sqlite3_stmt *stmt_; // Prepared statement + +public: + SQLiteStatement(sqlite3 *db, const std::string &query); + ~SQLiteStatement(); + + bool bind(int index, int value); + bool bind(int index, double value); + bool bind(int index, const std::string &value); + bool bindNull(int index); + + bool execute(); + bool step(); + + int changes(); + + void finalize(); + void reset(); + + int getColumnCount() const; + std::string getColumnText(int column_index) const; +}; + +#endif // SQLITE_STATEMENT_H diff --git a/translations/app_ru.ts b/translations/app_ru.ts new file mode 100755 index 0000000..aab84f1 --- /dev/null +++ b/translations/app_ru.ts @@ -0,0 +1,1315 @@ + + + + + AuthDialog + + + + Аuthorization + Авторизация + + + + + Login: + Логин: + + + + + Password: + Пароль: + + + + + Enter + Войти + + + + + Cancel + Отмена + + + Error + Ошибка + + + Wrong user name or password + Неправильное имя пользователя или пароль + + + Role of user not found + Роль пользователя не определена или не найдена + + + + DirectoriesManagementWidget + + + + Directory management + Название заголовка виджета DirectoriesManagementWidget. + Управление справочниками + + + + + Halls + Название раздела справочника таблицы halls. + Залы + + + + + Enter hall name: + Поясняющая надпись, указывающая, какой тип данных вводится в связанный с ней виджет. + Введите название зала: + + + + + Enter the number of seats in the hall: + Поясняющая надпись, указывающая, какой тип данных вводится в связанный с ней виджет. + Введите количество мест в зале: + + + + + Enter the name of the movie: + Поясняющая надпись, указывающая, какой тип данных вводится в связанный с ней виджет. + Введите название фильма: + + + + + Enter the duration of the movie: + Поясняющая надпись, указывающая, какой тип данных вводится в связанный с ней виджет. + Введите продолжительность фильма: + + + + + minute(s) + Суффикс, отображающийся после ввода минут. + минут(ы) + + + + + Enter the name of the genre: + Введите название жанра: + + + + + Add hall + Название текста кнопки, которая инициирует добавление записи о новом зале. + Добавить зал + + + + + Movies + Название раздела справочника таблицы movies. + Фильмы + + + + + Add movie + Название текста кнопки, которая инициирует добавление записи о новом фильме. + Добавить фильм + + + + + Genres + Название раздела справочника таблицы genres. + Жанры + + + + + Add genre + Название текста кнопки, которая инициирует добавление записи о новом жанре. + Добавить жанр + + + + EntityDeleterWidget + + + + Database recording deletion + Удаление записи из базы данных + + + + + Current table: + Текущая таблица: + + + + + Delete + Удалить + + + + Select record of current table to delete + Выберите запись из текущей таблицы для удаления + + + + Genre deleted successfully + Жанр успешно удалён + + + + Hall deleted successfully + Зал успешно удалён + + + + Movie deleted successfully + Фильм успешно удалён + + + + Refund deleted successfully + Возврат успешно удалён + + + + Session deleted successfully + Сеанс успешно удалён + + + + Ticket deleted successfully + Билет успешно удалён + + + + EntityFinderWidget + + + + Find... + Найти... + + + + + Select genre + Выберите жанр + + + + + Here will be information about selected genre + Здесь будет информация о выбранном жанре + + + + + Select hall + Выберите зал + + + + + Here will be information about selected hall + Здесь будет информация о выбранном зале + + + + + Select movie + Выберите фильм + + + + + Here will be information about selected movie + Здесь будет информация о выбранном фильме + + + + Select ticket + Выберите билет + + + + Here will be information about selected ticket + Здесь будет информация о выбранном билете + + + + Select session + Выберите сеанс + + + + Here will be information about selected session + Здесь будет информация о выбранном сеансе + + + + Select entity for replacement + Выберите объект для замены + + + + Select entity for updating + Выберите запись для обновления + + + + Here will be information about selected entry + Здесь будет отображена информация выбранной записи базы данных + + + + Here will be information about selected entity + Здесь будет отображена информация выбранной записи + + + + EntityUpdaterWidget + + + + Database records update + Обновление записи в базе данных + + + + + Current table: + Текущая таблица: + + + + + Current column: + Текущая колонка: + + + + + Enter text data: + Укажите текстовое значение: + + + + + Enter the date and time: + Укажите дату и время: + + + + + Enter a value with a floating point: + Укажите вещественное значение: + + + + + Form + + + + + + Enter integer value: + Укажите целочисленное значение: + + + + + Update + Обновить + + + Genre deleted successfully + Жанр успешно удалён + + + Hall deleted successfully + Зал успешно удалён + + + Movie deleted successfully + Фильм успешно удалён + + + Refund deleted successfully + Возврат успешно удалён + + + Session deleted successfully + Сеанс успешно удалён + + + Ticket deleted successfully + Билет успешно удалён + + + + Genre updated successfully + Жанр успешно обновлён + + + + Hall updated successfully + Зал успешно обновлён + + + + Movie updated successfully + Фильм успешно обновлён + + + + Refund updated successfully + Возврат успешно обновлён + + + + Session updated successfully + Сеанс успешно обновлён + + + + Ticket updated successfully + Билет успешно обновлён + + + + ErrorDialog + + + A required field is missing. Please fill all required fields. + Перевод строки для отображения сообщения об ошибке в пользовательском интерфейсе. + Отсутствует обязательное поле. Пожалуйста, заполните все обязательные поля. + + + + An SQL constraint violation occurred, but at the moment it has not been described in detail yet. + Перевод строки для отображения сообщения об ошибке в пользовательском интерфейсе. + Произошло нарушение правил работы с данными в базе, но подробности пока недоступны. + + + + A genre with the same name already exists. + Перевод строки для отображения сообщения об ошибке в пользовательском интерфейсе. + Жанр с таким именем уже существует. + + + + A movie with the same title already exists. + Перевод строки для отображения сообщения об ошибке в пользовательском интерфейсе. + Фильм с таким названием уже существует. + + + + A hall with the same name already exists. + Перевод строки для отображения сообщения об ошибке в пользовательском интерфейсе. + Зал с таким именем уже существует. + + + + A ticket with the same session and seat number already exists. + Перевод строки для отображения сообщения об ошибке в пользовательском интерфейсе. + Билет с таким сеансом и номером места уже существует. + + + + A refund for the same ticket already exists. + Перевод строки для отображения сообщения об ошибке в пользовательском интерфейсе. + Возврат для этого билета уже существует. + + + + A session is already scheduled in this hall at the same time. + Сеанс уже запланирован в этом зале на это же время. + + + + A unique constraint violation occurred, but at the moment it has not been described in detail yet. + Перевод строки для отображения сообщения об ошибке в пользовательском интерфейсе. + Произошло нарушение уникальности данных, но подробности пока недоступны. + + + + The movie ID for the session does not exist. + Перевод строки для отображения сообщения об ошибке в пользовательском интерфейсе. + ID фильма для сеанса не существует. + + + + The hall ID for the session does not exist. + Перевод строки для отображения сообщения об ошибке в пользовательском интерфейсе. + ID зала для сеанса не существует. + + + + The genre ID for the movie does not exist. + Перевод строки для отображения сообщения об ошибке в пользовательском интерфейсе. + ID жанра для фильма не существует. + + + + The session ID for the ticket does not exist. + Перевод строки для отображения сообщения об ошибке в пользовательском интерфейсе. + ID сеанса для билета не существует. + + + + The ticket ID for the refund does not exist. + Перевод строки для отображения сообщения об ошибке в пользовательском интерфейсе. + ID билета для возврата не существует. + + + + Operation violates a foreign key constraint, but at the moment it has not been described in detail yet. + Перевод строки для отображения сообщения об ошибке в пользовательском интерфейсе. + Операция нарушает связь между данными, но подробности пока недоступны. + + + + Duplicate primary key value. Ensure the primary key is unique. + Перевод строки для отображения сообщения об ошибке в пользовательском интерфейсе. + Дублирующееся значение первичного ключа. Убедитесь, что первичный ключ уникален. + + + + Genre name must not be empty. + Название жанра не должно быть пустым. + + + + Movie title must not be empty. + Перевод строки для отображения сообщения об ошибке в пользовательском интерфейсе. + Название фильма не должно быть пустым. + + + + Movie duration must be a positive value. + Перевод строки для отображения сообщения об ошибке в пользовательском интерфейсе. + Продолжительность фильма должна быть положительным числом. + + + + Hall name must not be empty. + Перевод строки для отображения сообщения об ошибке в пользовательском интерфейсе. + Имя зала не должно быть пустым. + + + + Hall capacity must be a positive number. + Перевод строки для отображения сообщения об ошибке в пользовательском интерфейсе. + Вместимость зала должна быть положительным числом. + + + + Ticket price must be a non-negative value. + Цена билета должна быть неотрицательной. + + + + Seat number must be a positive value. + Перевод строки для отображения сообщения об ошибке в пользовательском интерфейсе. + Номер места должен быть положительным числом. + + + + Refund amount must be a non-negative value. + Перевод строки для отображения сообщения об ошибке в пользовательском интерфейсе. + Сумма возврата должна быть неотрицательной. + + + + A value violates a CHECK constraint, but at the moment it has not been described in detail yet. + Перевод строки для отображения сообщения об ошибке в пользовательском интерфейсе. + Указанное значение не соответствует установленным правилам, но подробности пока недоступны. + + + + Seat number exceeds hall capacity. + Перевод строки для отображения сообщения об ошибке в пользовательском интерфейсе. + Номер места превышает вместимость зала. + + + + Refunds cannot be made after the session has started. + Перевод строки для отображения сообщения об ошибке в пользовательском интерфейсе. + Возвраты невозможны после начала сеанса. + + + + Cannot purchase ticket after the session has started. + Перевод строки для отображения сообщения об ошибке в пользовательском интерфейсе. + Невозможно купить билет после начала сеанса. + + + + Refund amount cannot exceed the sale amount. + Перевод строки для отображения сообщения об ошибке в пользовательском интерфейсе. + Сумма возврата не может превышать сумму продажи. + + + + Refund date cannot be earlier than the sale date. + Перевод строки для отображения сообщения об ошибке в пользовательском интерфейсе. + Дата возврата не может быть раньше даты продажи. + + + + The new session overlaps with an ongoing movie in the hall. + Новый сеанс пересекается с текущим фильмом в зале. + + + + A known error has occurred, but at the moment it has not been described in detail yet. + Перевод строки для отображения сообщения об ошибке в пользовательском интерфейсе. + Возникла известная ошибка, но подробности пока недоступны. + + + + GenresModel + + + ID + Идентификатор записи таблицы genres. + Идентификатор + + + + Name + Название жанра таблицы genres. + Название + + + + HallsModel + + + ID + Идентификатор записи таблицы halls. + Идентификатор + + + + Name + Название зала таблицы halls. + Название + + + + Capacity + Количество мест зала таблицы halls. + Количество мест + + + + MainWindow + + + + Cinema ticket accounting system + Название заголовка главного окна. + Система учета билетов в кинотеатре + + + + + Ticket sales + Название раздела, в котором осуществляется логика работы продажи билетов. + Продажа билетов + + + + + Ticket refund + Название раздела, в котором осуществляется логика работы возврата билетов. + Возврат билетов + + + + + Session management + Название раздела, в котором осуществляется логика работы управления сеансами показа фильмов. + Управление сеансами + + + + + Reference books + Название раздела, в котором осществляется логика работы над оставшимися таблицыми базы данных. + Справочники + + + + + Reports + Название раздела, в котором осуществляется логика работы генерации отчётов. + Отчёты + + + + + Danger zone + Опасная зона + + + + MoviesModel + + + ID + Идентификатор записи таблицы movies. + Идентификатор + + + + Title + Название фильма таблицы movies. + Название + + + + Genre + Название жанра таблицы genres, которое использует запись таблицы movies. + Жанр + + + + Duration + Продолжительность фильма в минутах. + Продолжительность (мин.) + + + + QMessageBox + + + + + + + + + + Error + Ошибка + + + + Wrong user name or password + Неправильное имя пользователя или пароль + + + + Role of user not found + Роль пользователя не определена или не найдена + + + + No genre selected + Жанр не выбран + + + + + + Success + Успех + + + + No ticket selected + Билет не выбран + + + + Ticket with number %1 has been successfully refunded. + Билет с номером %1 был успешно возвращён. + + + + No session selected + Сеанс не выбран + + + No data available to build the chart "%1". + Нет данных для постоения графика "%1". + + + + Invalid date range + Неверный диапазон дат + + + Error retrieving sessions + Ошибка получения сеансов + + + + No sessions found between %1 and %2. + Сеансов не обнаружено между %1 и %2. + + + + No row selected + Строка не выбрана + + + + QObject + + + Information messages + Название диалогового окна + Информационные сообщения + + + + An error occurred from an unknown source of the problem. + Перевод строки для отображения сообщения об ошибке в пользовательском интерфейсе. + Произошла ошибка из неизвестного источника проблемы. + + + + The specified genre was not found. + Перевод строки для отображения сообщения об ошибке в пользовательском интерфейсе. + Указанный жанр не найден. + + + + The specified hall was not found. + Перевод строки для отображения сообщения об ошибке в пользовательском интерфейсе. + Указанный зал не найден. + + + + The specified movie was not found. + Перевод строки для отображения сообщения об ошибке в пользовательском интерфейсе. + Указанный фильм не найден. + + + + The specified refund was not found. + Перевод строки для отображения сообщения об ошибке в пользовательском интерфейсе. + Указанный возврат не найден. + + + + The specified session was not found. + Перевод строки для отображения сообщения об ошибке в пользовательском интерфейсе. + Указанный сеанс не найден. + + + + The specified ticket was not found. + Перевод строки для отображения сообщения об ошибке в пользовательском интерфейсе. + Указанный билет не найден. + + + + The requested object was not found in the database. + Перевод строки для отображения сообщения об ошибке в пользовательском интерфейсе. + Запрошенный объект не найден в базе данных. + + + Genre + Жанр + + + Hall + Зал + + + Movie + Фильм + + + Refund + Возврат + + + Session + Сеанс + + + Ticket + Билет + + + + RefundsModel + + + ID + Идентификатор таблицы refund. + Идентификатор + + + + Ticket ID + Идентификатор таблицы tickets, на который ссылается таблицы refunds; так же является номером билета. + Номер билета + + + + Refund At + Запись даты и времени, по которой возможно узнать, когда было осуществлён возврат проданного билета. + Когда возвращён + + + + Refund Amount + Значение возвращённая суммы, отданная за возращённый билет. + Возвращённая сумма + + + + ReportsWidget + + + + Reports + Название заголовка виджета ReportsWidget. + Отчёты + + + + + Attendance + Название раздела, в котором осуществляется логика работы управления генерации отчётов о посещаемости залов. + Посещаемость + + + + + The popularity of movies + Название раздела, в котором осуществляется логика работы управления генерации отчётов о популярности фильмов. + Популярность фильмов + + + + + Popularity of genres + Название раздела, в котором осуществляется логика работы управления генерации отчётов о популярности жанров. + Популярность жанров + + + + SchemaMetadata + + Genre + Жанр + + + Hall + Зал + + + Movie + Фильм + + + Session + Сеанс + + + Ticket + Билет + + + + Genres + Жанры + + + + Halls + Залы + + + + Movies + Фильмы + + + + Refunds + История возврата билетов + + + + Sessions + Сеансы + + + + Tickets + Билеты + + + + Users + Пользователи + + + + Roles + Роли + + + + Sessions statistics + Статистика сеансов + + + + SearchDialog + + + + Finding a database entry + Поиск записи базы данных + + + + + Enter text to search... + Введите текст для поиска... + + + + + Choose + Выбрать + + + + + Cancel + Отмена + + + Error + Ошибка + + + No row selected + Строка не выбрана + + + + SessionManagementWidget + + + + Session management + Название заголовка виджета SessionManagementWidget. + Управление сеансами + + + + + Specify the date and time of the session start: + Поясняющая надпись, указывающая, какой тип данных вводится в связанный с ней виджет. + Укажите дату и время начала показа: + + + + + Specify the cost of watching the session: + Поясняющая надпись, указывающая, какой тип данных вводится в связанный с ней виджет. + Укажите цену за билет на сеанс: + + + + + Add session + Название текста кнопки, которая инициирует создание нового сеанса. + Добавить сеанс + + + + SessionsModel + + + ID + Идентификатор таблицы sessions, так же является номером сеанса. + Номер сеанса + + + + Movie Title + Название фильма, на которое ссылается запись таблицы sessions. + Название фильма + + + + Hall Name + Название зала, на которое ссылается запись таблицы sessions. + Название зала + + + + Start Time + Дата и время хранит запись таблицы sessions о начале просмотра фильма. + Начало просмотра + + + + Ticket Price + Стоимость билета хранит запись таблицы sessions. + Стоимость билета + + + + SingleRecordTimeRangeWidget + + + + Reports + Отчёты + + + + + Start of the period: + Начало периода: + + + + + End of the period: + Конец периода: + + + + TicketReturnWidget + + + + Ticket refund + Название заголовка виджета TicketReturnWidget. + Возврат билетов + + + + + Enter the refund amount: + Поясняющая надпись, указывающая, какой тип данных вводится в связанный с ней виджет. + Введите сумму для возврата: + + + + + Date and time of ticket refund (debugging): + Дата и время возврата билета (отладка): + + + + + Refund + Название текста кнопки, которая инициирует возврат принимаего обратно билета. + Вернуть билет + + + + TicketSaleWidget + + + + Ticket sales + Название заголовка виджета TicketSaleWidget. + Продажа билетов + + + + + Seat number: + Номер места гостя, выделенный для просмотра фильма. + Номер места: + + + + + Seat number № + Префикс, дописываемый для номера определённого места в зале. + Номер места № + + + + + Date and time of ticket sale (debugging): + Информирование о предназанчении виджета, к которому относится текст. + Дата и время продажи билета (отладка): + + + + + Sell this ticket + Название текста кнопки, которая инициирует продажу билета. + Продать билет + + + + TicketSalesReportWidget + + + + Start of the period: + Начало периода: + + + + + End of the period: + Конец периода: + + + + + Generate + Создать отчёт + + + Popularity of Genre: %1 + Популярность жанра: %1 + + + + Popularity of Genre: Name: "%1" + Популярность жанра: Название: "%1" + + + + + Tickets Sold + Продажа билетов + + + + + Number of Tickets Sold + Количество проданных билетов + + + + Attendance for Hall: Name: "%1" + Посещаемость зала: Название: "%1" + + + + Tickets Sold for Movie: Title: "%1" + Продажи билетов на фильм: Название: "%1" + + + + Maximum Tickets + Максимальное количество билетов + + + + Sold Tickets + Продано билетов + + + + Refunded Tickets + Возвращено билетов + + + + Sales Revenue + Выручка от продаж + + + + Refund Expenses + Расходы от возвратов + + + + Money + Вылюта не выбрана, значения приводятся в попугаях + Деньги (кол. попугаев) + + + + Tickets + Билеты + + + Attendance for Hall: %1 + Популярность зала: %1 + + + + Visitors + Посетители + + + + Number of Visitors + Количество посетителей + + + Tickets Sold for Movie: %1 + Популярность фильма: %1 + + + + Date + Дата + + + Ticket sales report + Отчёт по проданным билетам + + + Tickets sold + Продано билетов + + + + TicketsModel + + + ID + Идентификатор записи таблицы tickets, так же является номером билета. + Номер билета + + + + Session ID + Идентификатор существующего сеанса, на который ссылается запись таблицы tickets; так же является номером сеанса. + Номер сеанса + + + + Seat Number + Номер места, который использует запись таблицы tickets для хранения зарезервированного места. + Номер места + + + + Sold At + Дата и время, которую использует запись таблицы sessions для хранении информации, когда был продан билет. + Когда продан + + + diff --git a/ui/delegates/date_time_delegate.cpp b/ui/delegates/date_time_delegate.cpp new file mode 100644 index 0000000..eb66001 --- /dev/null +++ b/ui/delegates/date_time_delegate.cpp @@ -0,0 +1,19 @@ +#include "date_time_delegate.h" + +DateTimeDelegate::DateTimeDelegate(QObject *parent) + : QStyledItemDelegate(parent) {} + +QString DateTimeDelegate::displayText(const QVariant &value, + const QLocale &locale) const { + QDateTime datetime = QDateTime::fromString(value.toString(), Qt::ISODate); + if (!datetime.isValid()) { + return value.toString(); // Return raw value if parsing fails + } + + QString formattedDateTime = locale.toString(datetime, QLocale::LongFormat); + if (!formattedDateTime.isEmpty()) { + // Capitalize the first letter of the formatted date string + formattedDateTime[0] = formattedDateTime[0].toUpper(); + } + return formattedDateTime; +} diff --git a/ui/delegates/date_time_delegate.h b/ui/delegates/date_time_delegate.h new file mode 100644 index 0000000..1b07dc1 --- /dev/null +++ b/ui/delegates/date_time_delegate.h @@ -0,0 +1,17 @@ +#ifndef DATE_TIME_DELEGATE_H +#define DATE_TIME_DELEGATE_H + +#include +#include + +class DateTimeDelegate : public QStyledItemDelegate { + Q_OBJECT + +public: + explicit DateTimeDelegate(QObject *parent = nullptr); + + QString displayText(const QVariant &value, + const QLocale &locale) const override; +}; + +#endif // DATE_TIME_DELEGATE_H diff --git a/ui/dialogs/auth_dialog.cpp b/ui/dialogs/auth_dialog.cpp new file mode 100644 index 0000000..f6499dd --- /dev/null +++ b/ui/dialogs/auth_dialog.cpp @@ -0,0 +1,95 @@ +#include "auth_dialog.h" + +#include "repository_manager.h" +#include "repository_result.h" +#include "role_dto.h" +#include "roles_repository.h" +#include "schema_metadata.h" +#include "user_dto.h" +#include "users_repository.h" +#include +#include +#include + +AuthDialog::AuthDialog(QWidget *parent) : QDialog(parent) { + setupUi(this); + + // WARNING: Models must be initialized before setting up table view + if (initializeRepositories()) { + setupConnections(); + } else { + qWarning() << "Initialization failed"; + } +} + +bool AuthDialog::initializeRepositories() { + RepositoryManager &repositoryManager = RepositoryManager::instance(); + SchemaMetadata metadata = SchemaMetadata::defaultSchema(); + + rolesRepository_ = repositoryManager.getRepositoryAs( + metadata.repositoryTableName("roles")); + + usersRepository_ = repositoryManager.getRepositoryAs( + metadata.repositoryTableName("users")); + + return rolesRepository_ && usersRepository_; +} + +void AuthDialog::setupConnections() { + connect(btnLogin, &QPushButton::clicked, this, &AuthDialog::onLoginClicked); + connect(btnCancel, &QPushButton::clicked, this, &AuthDialog::onCancelClicked); +} + +void AuthDialog::onCancelClicked() { + emit loginFailed(); + reject(); +} + +void AuthDialog::onLoginClicked() { + QString username = txtUsername->text().trimmed(); + QString password = txtPassword->text(); + + UserDTO userDTO; + RepositoryResult result = + usersRepository_->getUserByUsername(username, userDTO); + + bool userExists = result.success; + bool passwordMatch = !userExists ? false : verifyPassword(password, userDTO); + + if (!userExists || !passwordMatch) { + QMessageBox::warning(this, QMessageBox::tr("Error"), + QMessageBox::tr("Wrong user name or password")); + return; + } + + RoleDTO roleDTO; + result = rolesRepository_->getRoleById(userDTO.roleId(), roleDTO); + + if (!result.success) { + QMessageBox::warning(this, QMessageBox::tr("Error"), + QMessageBox::tr("Role of user not found")); + return; + } + + qint32 userId = userDTO.userId(); + qint32 accessLevel_ = roleDTO.accessLevel(); + + emit loginSuccessful(userId, accessLevel_); + + accept(); +} + +QString AuthDialog::hashPassword(const QString &password, const QString &salt) { + QByteArray data = (password + salt).toUtf8(); + + QByteArray hash = QCryptographicHash::hash(data, QCryptographicHash::Sha256); + + return QString(hash.toHex()); +} + +bool AuthDialog::verifyPassword(const QString &password, + const UserDTO &userDTO) { + QString inputHash = hashPassword(password, userDTO.salt()); + + return (inputHash == userDTO.passwordHash()); +} diff --git a/ui/dialogs/auth_dialog.h b/ui/dialogs/auth_dialog.h new file mode 100644 index 0000000..9d69121 --- /dev/null +++ b/ui/dialogs/auth_dialog.h @@ -0,0 +1,39 @@ +#ifndef AUTH_DIALOG_H +#define AUTH_DIALOG_H + +#include "ui_auth_dialog.h" +#include +#include + +// Forward declaration +class RolesRepositoryInterface; +class UserDTO; +class UsersRepositoryInterface; + +class AuthDialog : public QDialog, private Ui::AuthDialog { + Q_OBJECT + +private: + RolesRepositoryInterface *rolesRepository_; + UsersRepositoryInterface *usersRepository_; + +public: + explicit AuthDialog(QWidget *parent = nullptr); + +signals: + void loginSuccessful(qint32 userId, qint32 accessLevel); + void loginFailed(); + +private slots: + void onCancelClicked(); + void onLoginClicked(); + +private: + bool initializeRepositories(); + void setupConnections(); + + QString hashPassword(const QString &password, const QString &salt); + bool verifyPassword(const QString &password, const UserDTO &userDTO); +}; + +#endif // AUTH_DIALOG_H diff --git a/ui/dialogs/auth_dialog.ui b/ui/dialogs/auth_dialog.ui new file mode 100644 index 0000000..d373b3a --- /dev/null +++ b/ui/dialogs/auth_dialog.ui @@ -0,0 +1,96 @@ + + + AuthDialog + + + + 0 + 0 + 500 + 120 + + + + + 500 + 120 + + + + + 16777215 + 120 + + + + Аuthorization + + + + + + + + Login: + + + + + + + + + + Password: + + + + + + + QLineEdit::EchoMode::Password + + + + + + + + + + + Enter + + + + + + + Cancel + + + + + + + + + + + btnCancel + clicked() + AuthDialog + reject() + + + 248 + 118 + + + 150 + 100 + + + + + diff --git a/ui/dialogs/error_dialog.cpp b/ui/dialogs/error_dialog.cpp new file mode 100644 index 0000000..4e6e4d8 --- /dev/null +++ b/ui/dialogs/error_dialog.cpp @@ -0,0 +1,217 @@ +#include "error_dialog.h" + +#include +#include +#include +#include +#include + +QErrorMessage *ErrorDialog::getDialog(QWidget *parent, + const QString &errorMsg) { + // Initialize the error dialog + QErrorMessage *dialog = + new QErrorMessage(parent); // parent is needed for the correct location + dialog->setAttribute(Qt::WA_DeleteOnClose); // delete the dialog when closed + + // Hide the "don't show again" checkbox +#define ERROR_DIALOG_NEW_VERSION 0 +#if (ERROR_DIALOG_NEW_VERSION == 1 && QT_VERSION >= QT_VERSION_CHECK(6, 3, 0)) + // You need to set DontShowAgainVisible to true in Qt 6.3 + errorDialog->setDontShowAgainVisible(false); +#else + QCheckBox *cb = dialog->findChild(); + if (cb) { + cb->setEnabled(false); + cb->hide(); + } +#endif +#undef ERROR_DIALOG_NEW_VERSION + + // Set the window title + dialog->setWindowTitle(QObject::tr("Information messages")); + + // Set minimum width size + dialog->setMinimumWidth(600); + + return dialog; +} + +void ErrorDialog::displayError(QWidget *parent, const QString &errorMsg) { + qDebug() << "Displaying error message:" << errorMsg; + + QErrorMessage *dialog = getDialog(parent, errorMsg); + + if (errorMsg.contains("constraint failed")) { + QString detailedMessage = handleSqlConstraints(errorMsg); + dialog->showMessage(detailedMessage); + dialog->exec(); + return; + } + + if (errorMsg.contains("not found")) { + QString detailedMessage = handleNotFoundErrors(errorMsg); + dialog->showMessage(detailedMessage); + dialog->exec(); + return; + } + + QRegularExpression regex("Error (\\d+):"); + QRegularExpressionMatch match = regex.match(errorMsg); + + if (!match.hasMatch()) { + dialog->showMessage(QObject::tr( + "An error occurred from an unknown source of the problem.")); + dialog->exec(); + return; + } + + int errorCode = match.captured(1).toInt(); + QString detailedMessage = getDetailedMessage(errorCode); + + dialog->showMessage(detailedMessage); + dialog->exec(); +} + +QString ErrorDialog::handleNotFoundErrors(const QString &errorMsg) { + if (errorMsg.contains("Genre", Qt::CaseInsensitive)) { + return QObject::tr("The specified genre was not found."); + } + if (errorMsg.contains("Hall", Qt::CaseInsensitive)) { + return QObject::tr("The specified hall was not found."); + } + if (errorMsg.contains("Movie", Qt::CaseInsensitive)) { + return QObject::tr("The specified movie was not found."); + } + if (errorMsg.contains("Refund", Qt::CaseInsensitive)) { + return QObject::tr("The specified refund was not found."); + } + if (errorMsg.contains("Session", Qt::CaseInsensitive)) { + return QObject::tr("The specified session was not found."); + } + if (errorMsg.contains("Ticket", Qt::CaseInsensitive)) { + return QObject::tr("The specified ticket was not found."); + } + + // If the specific error is not recognized, return a general message + return QObject::tr("The requested object was not found in the database."); +} + +QString ErrorDialog::handleSqlConstraints(const QString &errorMsg) { + if (errorMsg.contains("UNIQUE constraint failed")) { + return handleUniqueConstraint(errorMsg); + } + if (errorMsg.contains("FOREIGN KEY constraint failed")) { + return handleForeignKeyConstraint(errorMsg); + } + if (errorMsg.contains("PRIMARY KEY constraint failed")) { + return handlePrimaryKeyConstraint(); + } + if (errorMsg.contains("CHECK constraint failed")) { + return handleCheckConstraint(errorMsg); + } + if (errorMsg.contains("NOT NULL constraint failed")) { + return tr("A required field is missing. Please fill all required fields."); + } + + return tr("An SQL constraint violation occurred, but at the moment it has " + "not been described in detail yet."); +} + +QString ErrorDialog::handleUniqueConstraint(const QString &errorMsg) { + if (errorMsg.contains("genres.genre_name")) { + return tr("A genre with the same name already exists."); + } + if (errorMsg.contains("movies.title")) { + return tr("A movie with the same title already exists."); + } + if (errorMsg.contains("halls.hall_name")) { + return tr("A hall with the same name already exists."); + } + if (errorMsg.contains("tickets.session_id, tickets.seat_number")) { + return tr("A ticket with the same session and seat number already exists."); + } + if (errorMsg.contains("refunds.ticket_id")) { + return tr("A refund for the same ticket already exists."); + } + if (errorMsg.contains("sessions.hall_id, sessions.begin_at")) { + return tr("A session is already scheduled in this hall at the same time."); + } + + return tr("A unique constraint violation occurred, but at the moment it has " + "not been described in detail yet."); +} + +QString ErrorDialog::handleForeignKeyConstraint(const QString &errorMsg) { + if (errorMsg.contains("sessions.movie_id")) { + return tr("The movie ID for the session does not exist."); + } + if (errorMsg.contains("sessions.hall_id")) { + return tr("The hall ID for the session does not exist."); + } + if (errorMsg.contains("movies.genre_id")) { + return tr("The genre ID for the movie does not exist."); + } + if (errorMsg.contains("tickets.session_id")) { + return tr("The session ID for the ticket does not exist."); + } + if (errorMsg.contains("refunds.ticket_id")) { + return tr("The ticket ID for the refund does not exist."); + } + + return tr("Operation violates a foreign key constraint, but at the moment it " + "has not been described in detail yet."); +} + +QString ErrorDialog::handlePrimaryKeyConstraint() { + return tr("Duplicate primary key value. Ensure the primary key is unique."); +} + +QString ErrorDialog::handleCheckConstraint(const QString &errorMsg) { + if (errorMsg.contains("length(genre_name) > 0")) { + return tr("Genre name must not be empty."); + } + if (errorMsg.contains("length(title) > 0")) { + return tr("Movie title must not be empty."); + } + if (errorMsg.contains("duration > 0")) { + return tr("Movie duration must be a positive value."); + } + if (errorMsg.contains("length(hall_name) > 0")) { + return tr("Hall name must not be empty."); + } + if (errorMsg.contains("capacity > 0")) { + return tr("Hall capacity must be a positive number."); + } + if (errorMsg.contains("ticket_price >= 0")) { + return tr("Ticket price must be a non-negative value."); + } + if (errorMsg.contains("seat_number > 0")) { + return tr("Seat number must be a positive value."); + } + if (errorMsg.contains("refund_amount >= 0")) { + return tr("Refund amount must be a non-negative value."); + } + + return tr("A value violates a CHECK constraint, but at the moment it has not " + "been described in detail yet."); +} + +QString ErrorDialog::getDetailedMessage(int errorCode) { + switch (errorCode) { + case 1001: + return tr("Seat number exceeds hall capacity."); + case 1002: + return tr("Cannot purchase ticket after the session has started."); + case 1003: + return tr("Refunds cannot be made after the session has started."); + case 1004: + return tr("Refund amount cannot exceed the sale amount."); + case 1005: + return tr("Refund date cannot be earlier than the sale date."); + case 1006: + return tr("The new session overlaps with an ongoing movie in the hall."); + default: + return tr("A known error has occurred, but at the moment it has not been " + "described in detail yet."); + } +} diff --git a/ui/dialogs/error_dialog.h b/ui/dialogs/error_dialog.h new file mode 100644 index 0000000..c0850e2 --- /dev/null +++ b/ui/dialogs/error_dialog.h @@ -0,0 +1,34 @@ +#ifndef ERROR_DIALOG_H +#define ERROR_DIALOG_H + +#include +#include +#include + +class ErrorDialog : private QObject { + // For translation + Q_OBJECT + +public: + // Method to dispose the error dialog + static void displayError(QWidget *parent, const QString &errorMsg); + + ErrorDialog() = delete; + +private: + // A method for initializing the error dialog + static QErrorMessage *getDialog(QWidget *parent, const QString &errorMsg); + + // A method for obtaining a "human-readable" text based on an error code + static QString getDetailedMessage(int errorCode); + + // Methods for handling various SQL constraints + static QString handleNotFoundErrors(const QString &errorMsg); + static QString handleCheckConstraint(const QString &errorMsg); + static QString handleForeignKeyConstraint(const QString &errorMsg); + static QString handlePrimaryKeyConstraint(); + static QString handleSqlConstraints(const QString &errorMsg); + static QString handleUniqueConstraint(const QString &errorMsg); +}; + +#endif // ERROR_DIALOG_H diff --git a/ui/dialogs/search_dialog.cpp b/ui/dialogs/search_dialog.cpp new file mode 100644 index 0000000..06baecc --- /dev/null +++ b/ui/dialogs/search_dialog.cpp @@ -0,0 +1,154 @@ +#include "search_dialog.h" + +#include "base_sql_table_model.h" +#include "model_manager.h" +#include "multi_column_filter_proxy_model.h" +#include + +SearchDialog::SearchDialog(QWidget *parent) + : QDialog(parent), originalModel_(nullptr) { + setupUi(this); + + initializeProxyModel(); + setupTableView(); // After initializing proxy model + setupConnections(); +} + +SearchDialog::SearchDialog(const QString &modelTableName, + const QString &fieldName, QWidget *parent) + : SearchDialog(parent) { + if (!setTableName(modelTableName)) { + qFatal("SearchDialog::SearchDialog: Failed to set table name"); + } + if (!setFieldName(fieldName)) { + qFatal("SearchDialog::SearchDialog: Failed to set field name"); + } +} + +SearchDialog::~SearchDialog() { + if (originalModel_ != nullptr) { + originalModel_->resetFilter(); + } +} + +bool SearchDialog::setFieldName(const QString &fieldName) { + int columnIndex = originalModel_->columnIndex(fieldName); + if (columnIndex == -1) { + return false; + } + columnIndex_ = columnIndex; + return true; +} + +bool SearchDialog::setTableName(const QString &modelTableName) { + ModelManager &modelManger = ModelManager::instance(); + + if (originalModel_ != nullptr) { + originalModel_->resetFilter(); + } + + modelTableName_ = modelTableName; + + originalModel_ = modelManger.getModelAs(modelTableName); + + proxyModel_->setSourceModel(originalModel_); + + tableView->clearSelection(); + + columnIndex_ = -1; + + if (originalModel_->isCompleteDatabaseFiltering()) { + return true; + } + +#ifdef NOPTIMIZATION + while (originalModel_->canFetchMore()) { + originalModel_->fetchMore(); + } +#endif + + return true; +} + +void SearchDialog::initializeProxyModel() { + proxyModel_ = new MultiColumnSortFilterProxyModel(this); +} + +void SearchDialog::setupConnections() { + connect(lineEditSearch, &QLineEdit::textChanged, this, + &SearchDialog::onLineEditSearchTextChanged); + + connect(pushButtonSelect, &QPushButton::clicked, this, + &SearchDialog::onPushButtonSelectClicked); +} + +void SearchDialog::setupTableView() { + QHeaderView *horizontalHeader = tableView->horizontalHeader(); + horizontalHeader->setHighlightSections(false); + horizontalHeader->setSectionResizeMode(QHeaderView::ResizeToContents); + + tableView->setAlternatingRowColors(true); + + tableView->setEditTriggers(QAbstractItemView::NoEditTriggers); + + tableView->setFocusPolicy(Qt::NoFocus); + + tableView->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel); + + tableView->setSelectionBehavior(QAbstractItemView::SelectRows); + + tableView->setSelectionMode(QAbstractItemView::SingleSelection); + + tableView->setSortingEnabled(true); + + tableView->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); + + tableView->sortByColumn(0, Qt::AscendingOrder); + + tableView->setModel(proxyModel_); +} + +void SearchDialog::onLineEditSearchTextChanged(const QString &text) { + ModelManager &modelManger = ModelManager::instance(); + +#ifdef NOPTIMIZATION + if (originalModel_->isCompleteDatabaseFiltering()) { + originalModel_->setMultiColumnFilter(text); + return; + } + + // Model filtering + QRegularExpression regex(text, QRegularExpression::CaseInsensitiveOption); + proxyModel_->setFilterRegularExpression(regex); +#else + // Database filtering + originalModel_->setMultiColumnFilter(text); +#endif +} + +void SearchDialog::onPushButtonSelectClicked() { + if (columnIndex_ == -1) { + qFatal("SearchDialog::onPushButtonSelectClicked: Column index not set"); + } + + QModelIndexList selectedIndexes = tableView->selectionModel()->selectedRows(); + if (selectedIndexes.isEmpty()) { + QMessageBox::warning(this, QMessageBox::tr("Error"), + QMessageBox::tr("No row selected")); + return; + } + + QModelIndex selectedRowIndex = selectedIndexes.first(); + emit rowSelected(selectedRowIndex.row()); + + QSqlRecord record = originalModel_->record(selectedRowIndex.row()); + emit recordRetrieved(record); + + if (columnIndex_ != -1) { + QSqlRecord record = originalModel_->record(selectedRowIndex.row()); + QSqlField field = record.field(columnIndex_); + emit fieldRetrieved(field); + } + + accept(); +} diff --git a/ui/dialogs/search_dialog.h b/ui/dialogs/search_dialog.h new file mode 100644 index 0000000..e2e2a3b --- /dev/null +++ b/ui/dialogs/search_dialog.h @@ -0,0 +1,48 @@ +#ifndef SEARCH_DIALOG_H +#define SEARCH_DIALOG_H + +#include "ui_search_dialog.h" +#include +#include + +#include +#include +#include + +// Forward declaration +class BaseSqlTableModel; + +class SearchDialog : public QDialog, private Ui::SearchDialog { + Q_OBJECT + +private: + BaseSqlTableModel *originalModel_; + QSortFilterProxyModel *proxyModel_; + QString modelTableName_; + int columnIndex_; + +public: + explicit SearchDialog(const QString &modelTableName, const QString &fieldName, + QWidget *parent = nullptr); + explicit SearchDialog(QWidget *parent = nullptr); + ~SearchDialog(); + + bool setFieldName(const QString &fieldName); + bool setTableName(const QString &tableName); + +signals: + void rowSelected(int rowIndex); + void recordRetrieved(QSqlRecord rowValues); + void fieldRetrieved(QSqlField field); + +private slots: + void onLineEditSearchTextChanged(const QString &text); + void onPushButtonSelectClicked(); + +private: + void initializeProxyModel(); + void setupConnections(); + void setupTableView(); +}; + +#endif // SEARCH_DIALOG_H diff --git a/ui/dialogs/search_dialog.ui b/ui/dialogs/search_dialog.ui new file mode 100644 index 0000000..c0179fb --- /dev/null +++ b/ui/dialogs/search_dialog.ui @@ -0,0 +1,70 @@ + + + SearchDialog + + + + 0 + 0 + 460 + 346 + + + + Finding a database entry + + + + + + Enter text to search... + + + + + + + true + + + + + + + + + Choose + + + + + + + Cancel + + + + + + + + + + + pushButtonCancel + clicked() + SearchDialog + reject() + + + 248 + 258 + + + 200 + 250 + + + + + diff --git a/ui/main_window/main_window.cpp b/ui/main_window/main_window.cpp new file mode 100644 index 0000000..bc4a9a3 --- /dev/null +++ b/ui/main_window/main_window.cpp @@ -0,0 +1,145 @@ +#include "main_window.h" + +#include "date_time_delegate.h" + +// Set up the table view +// #define ENABLE_SELECTION // Uncomment to enable highlighting +#define DISABLE_SELECTION // Uncomment to disable highlighting + +MainWindow::MainWindow(qint32 userId, qint32 accessLevel, QWidget *parent) + : QMainWindow(parent), userId_(userId), accessLevel_(accessLevel) { + qInfo() << "Initializing main window..."; + + setupUi(this); + configureAllTableViews(); + configureAccessLevel(); + + qInfo() << "Main window initialized successfully"; +}; + +void MainWindow::configureAccessLevel() { + qInfo() << "Configuring access level..."; + + if (accessLevel_ < 1) { + qCritical() << "Access level is less than 1"; + QCoreApplication::quit(); + } + + qInfo() << "Access level is" << accessLevel_; + + // Full access to all system functionalities + // Manage system settings and user permissions + // Can perform all actions of lower roles + if (accessLevel_ < 100) { // Lower than Super Administrator + } + // Delete records (sessions, tickets, halls, movies, genres) + // Modify system-critical data + // Has all permissions of lower roles + if (accessLevel_ < 82) { // Lower than Data Administrator + findChild("DangerZonePage")->setDisabled(true); + } + // Add new sessions, movies, halls, and genres + // Manage show schedules + // Has all permissions of lower roles + if (accessLevel_ < 64) { // Lower than Repertoire Manager + findChild("DirectoriesManagementPage")->setDisabled(true); + findChild("SessionManagementPage")->setDisabled(true); + } + // Edit session, movie, hall, and genre information + // Adjust ticket prices + // Has all permissions of lower roles + if (accessLevel_ < 46) { // Lower than Data Editor + } + // View ticket sales + // View attendance statistics + // Has all permissions of lower roles + if (accessLevel_ < 28) { // Lower than Sales Manager + findChild("ReportsPage")->setDisabled(true); + } + // Sell tickets + // Ticket refunds + if (accessLevel_ < 10) { // Lower than Cashier + findChild("MainWindow")->setDisabled(true); + } + // Nothing + + qInfo() << "Access level configured successfully"; +} + +void MainWindow::configureAllTableViews() { + qInfo() << "Configuring all QAbstractItemViews..."; + + // Find all QAbstractItemView children + auto tableViews = findChildren(); + + for (QAbstractItemView *abstractItemView : tableViews) { + + // Check if the view is a QTableView + if (auto *tableView = qobject_cast(abstractItemView)) { + loadDefaultConfiguration(tableView); + } + } + + qInfo() << "All QAbstractItemViews configured successfully"; +} + +void MainWindow::MainWindow::disableSelection(QTableView *tableView) { + qInfo() << "Disabling selection for QAbstractItemView:" + << tableView->objectName(); + + // Disable selection + tableView->setSelectionMode(QAbstractItemView::NoSelection); + + // Clear the selection + tableView->clearSelection(); + + // Disable focus + tableView->setFocusPolicy(Qt::NoFocus); +} + +void enableSelection(QTableView *tableView) { + qInfo() << "Enabling selection for QAbstractItemView:" + << tableView->objectName(); + + // Set the selection behavior + tableView->setSelectionBehavior(QAbstractItemView::SelectRows); + + // Set the selection mode + tableView->setSelectionMode(QAbstractItemView::SingleSelection); +} + +void MainWindow::loadDefaultConfiguration(QTableView *tableView) { + qInfo() << "Loading default configuration for QAbstractItemView:" + << tableView->objectName(); + + DateTimeDelegate *dateTimeDelegate = new DateTimeDelegate(this); + + tableView->setItemDelegate(dateTimeDelegate); + + QHeaderView *horizontalHeader = tableView->horizontalHeader(); + // Disable horizontal header highlight + horizontalHeader->setHighlightSections(false); + // Set the horizontal header to resize to contents + horizontalHeader->setSectionResizeMode(QHeaderView::ResizeToContents); + + tableView->setSortingEnabled(true); // Enable sorting + tableView->sortByColumn(0, Qt::AscendingOrder); + + // Disable editing + tableView->setEditTriggers(QAbstractItemView::NoEditTriggers); + + // Set the scroll mode + tableView->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); + tableView->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel); + + // Enable alternating row colors + tableView->setAlternatingRowColors(true); + +#ifdef ENABLE_SELECTION + enableSelection(view); +#elif defined(DISABLE_SELECTION) + disableSelection(tableView); +#else +#error "Define ENABLE_SELECTION or DISABLE_SELECTION" +#endif +} diff --git a/ui/main_window/main_window.h b/ui/main_window/main_window.h new file mode 100644 index 0000000..19e3b6e --- /dev/null +++ b/ui/main_window/main_window.h @@ -0,0 +1,27 @@ +#ifndef MAIN_WINDOW_H +#define MAIN_WINDOW_H + +#include "ui_main_window.h" +#include + +class MainWindow : public QMainWindow, private Ui::MainWindow { + Q_OBJECT + +private: + qint32 userId_; + qint32 accessLevel_; + +public: + explicit MainWindow(qint32 userId, qint32 accessLevel, + QWidget *parent = nullptr); + +private: + void configureAccessLevel(); + void configureAllTableViews(); + + void disableSelection(QTableView *view); + void enableSelection(QTableView *view); + void loadDefaultConfiguration(QTableView *view); +}; + +#endif // MAIN_WINDOW_H diff --git a/ui/main_window/main_window.ui b/ui/main_window/main_window.ui new file mode 100644 index 0000000..86ea711 --- /dev/null +++ b/ui/main_window/main_window.ui @@ -0,0 +1,148 @@ + + + MainWindow + + + + 0 + 0 + 900 + 600 + + + + Cinema ticket accounting system + + + + + 0 + 0 + + + + + + + + 0 + 0 + + + + 0 + + + + Ticket sales + + + + + Ticket refund + + + + + Session management + + + + + Reference books + + + + + Reports + + + + + Danger zone + + + + + + + + + Qt::Orientation::Vertical + + + + 20 + 40 + + + + + + + + + + + + + + + + + 0 + 0 + 900 + 23 + + + + + + + + TicketSaleWidget + QWidget +
ticket_sale_widget.h
+ 1 +
+ + TicketReturnWidget + QWidget +
ticket_return_widget.h
+ 1 +
+ + SessionManagementWidget + QWidget +
session_management_widget.h
+ 1 +
+ + DirectoriesManagementWidget + QWidget +
directories_management_widget.h
+ 1 +
+ + ReportsWidget + QWidget +
reports_widget.h
+ 1 +
+ + EntityDeleterWidget + QWidget +
entity_deleter_widget.h
+ 1 +
+ + EntityUpdaterWidget + QWidget +
entity_updater_widget.h
+ 1 +
+
+ + +
diff --git a/ui/models/base_sql_table_model.cpp b/ui/models/base_sql_table_model.cpp new file mode 100644 index 0000000..3746e15 --- /dev/null +++ b/ui/models/base_sql_table_model.cpp @@ -0,0 +1,96 @@ +#include "base_sql_table_model.h" + +#include "QSqlError" +#include "table_info_sqlite.h" +#include +#include + +BaseSqlTableModel::BaseSqlTableModel(QObject *parent, QSqlDatabase database) + : QSqlRelationalTableModel(parent, database) {} + +bool BaseSqlTableModel::refreshAll() { + beginResetModel(); + bool result = select(); + endResetModel(); + + result ? qInfo() << "Model of table with database name" << tableName() + << "was refreshed successfully" + : qWarning() << "Failed to refresh model: Database name of table:" + << tableName() << "Error:" << lastError().text(); + return result; +} + +QVariant BaseSqlTableModel::data(const QModelIndex &index, int role) const { + // if (role != Qt::DisplayRole) { + return QSqlRelationalTableModel::data(index, role); + // } + // + // QVariant value = QSqlRelationalTableModel::data(index, role); + // + // QDateTime datetime = QDateTime::fromString(value.toString(), Qt::ISODate); + // + // if (!datetime.isValid()) { + // return value; + // } + // + // QLocale locale; + // QString formattedDateTime = locale.toString(datetime, QLocale::LongFormat); + // + // formattedDateTime[0] = formattedDateTime[0].toUpper(); + // + // return formattedDateTime; +} + +void BaseSqlTableModel::setTable(const QString &databaseTableName) { + tableInfo_.setDatabaseTableName(databaseTableName); + QSqlRelationalTableModel::setTable(databaseTableName); +} + +void BaseSqlTableModel::resetFilter() { + qInfo().noquote() << createUpdateFilterMessage(""); + setFilter(""); +} + +void BaseSqlTableModel::setMultiColumnFilter(const QString &filter) { + if (filter.isEmpty()) { + resetFilter(); + return; + } + + const QString filterQuery = createMultiColumnFilter(filter); + + qInfo().noquote() << createUpdateFilterMessage(filter); + + setFilter(filterQuery); +} + +QString +BaseSqlTableModel::createMultiColumnFilter(const QString &filter) const { + + QStringList conditions; + for (const QString &column : columnNames()) { + conditions.append(QString("%1 LIKE '%%2%'").arg(column).arg(filter)); + } + + return conditions.join(" OR "); +} + +QString +BaseSqlTableModel::createUpdateFilterMessage(const QString &filter) const { + QString classInfoMessage = + QString("Model manager class name: %1").arg(metaObject()->className()); + + QString tableInfoMessage = + QString("Database table name: %1").arg(tableName()); + + QString filterInfoMessage = filter.isEmpty() + ? "The filter was reset" + : QString("Filter: \"%1\"").arg(filter); + + QString message = QString("The model was updated: %1: %2: %3") + .arg(classInfoMessage) + .arg(tableInfoMessage) + .arg(filterInfoMessage); + + return message; +} diff --git a/ui/models/base_sql_table_model.h b/ui/models/base_sql_table_model.h new file mode 100644 index 0000000..39a07eb --- /dev/null +++ b/ui/models/base_sql_table_model.h @@ -0,0 +1,67 @@ +#ifndef BASE_SQL_TABLE_MODEL_H +#define BASE_SQL_TABLE_MODEL_H + +#include "table_info_sqlite.h" +#include + +class BaseSqlTableModel : public QSqlRelationalTableModel { + Q_OBJECT + +private: + TableInfoSQLite tableInfo_; + +public: + explicit BaseSqlTableModel(QObject *parent = nullptr, + QSqlDatabase database = QSqlDatabase()); + + virtual ~BaseSqlTableModel() = default; + + virtual QVariant data(const QModelIndex &index, + int role = Qt::DisplayRole) const override; + + virtual void setTable(const QString &databaseTableName) override; + + virtual inline QString columnName(int index) const; + + virtual inline QStringList columnNames() const; + + virtual inline bool isCompleteDatabaseFiltering() const = 0; + + virtual inline int columnIndex(const QString &columnName) const; + + void resetFilter(); + + void setMultiColumnFilter(const QString &filter); + +protected: + virtual QString createMultiColumnFilter(const QString &filter) const; + +public slots: + // WARNING: I was too lazy and decided that I could do with one slot + + // Refreshes the whole table + bool refreshAll(); + + // Here can be additional slots + // refreshByRowNumber(int row) = 0; + // refreshRange(int from, int to) = 0; + // refreshByFilter(QString filter) = 0; + // etc + +private: + QString createUpdateFilterMessage(const QString &filter) const; +}; + +QString BaseSqlTableModel::columnName(int index) const { + return tableInfo_.columnName(index); +} + +QStringList BaseSqlTableModel::columnNames() const { + return tableInfo_.columnNames(); +} + +int BaseSqlTableModel::columnIndex(const QString &columnName) const { + return tableInfo_.columnIndex(columnName); +} + +#endif // BASE_SQL_TABLE_MODEL_H diff --git a/ui/models/genres_model.cpp b/ui/models/genres_model.cpp new file mode 100644 index 0000000..d10ec5f --- /dev/null +++ b/ui/models/genres_model.cpp @@ -0,0 +1,32 @@ +#include "genres_model.h" + +#include + +GenresModel::GenresModel(QObject *parent, const QSqlDatabase &database) + : BaseSqlTableModel(parent, database) {} + +void GenresModel::initialize() { + setTable("genres"); + + setEditStrategy(QSqlTableModel::OnFieldChange); + + bool success = select(); + if (!success) { + qWarning() << "Error:" << lastError().text(); + } +} + +QVariant GenresModel::headerData(int section, Qt::Orientation orientation, + int role) const { + if (role == Qt::DisplayRole && orientation == Qt::Horizontal) { + switch (section) { + case GenresColumns::Id: + return tr("ID"); + case GenresColumns::Name: + return tr("Name"); + default: + return QVariant(); + } + } + return QSqlTableModel::headerData(section, orientation, role); +} diff --git a/ui/models/genres_model.h b/ui/models/genres_model.h new file mode 100644 index 0000000..e90c45f --- /dev/null +++ b/ui/models/genres_model.h @@ -0,0 +1,27 @@ +#ifndef GENRES_MODEL_H +#define GENRES_MODEL_H + +#include "base_sql_table_model.h" + +class GenresModel : public BaseSqlTableModel { + Q_OBJECT + +public: + // Enum for columns + enum GenresColumns { Id, Name }; + +public: + explicit GenresModel(QObject *parent, const QSqlDatabase &database); + + // Initialize the model + void initialize(); + + // Overlooking class BaseSqlTableModel methods + + QVariant headerData(int section, Qt::Orientation orientation, + int role = Qt::DisplayRole) const override; + + inline bool isCompleteDatabaseFiltering() const final { return true; }; +}; + +#endif // GENRES_MODEL_H diff --git a/ui/models/halls_model.cpp b/ui/models/halls_model.cpp new file mode 100644 index 0000000..4605928 --- /dev/null +++ b/ui/models/halls_model.cpp @@ -0,0 +1,35 @@ +#include "halls_model.h" + +#include + +HallsModel::HallsModel(QObject *parent, const QSqlDatabase &database) + : BaseSqlTableModel(parent, database) {} + +void HallsModel::initialize() { + + setTable("halls"); + + setEditStrategy(QSqlTableModel::OnFieldChange); + + bool success = select(); + if (!success) { + qWarning() << "Error:" << lastError().text(); + } +} + +QVariant HallsModel::headerData(int section, Qt::Orientation orientation, + int role) const { + if (role == Qt::DisplayRole && orientation == Qt::Horizontal) { + switch (section) { + case HallsColumns::Id: + return tr("ID"); + case HallsColumns::Name: + return tr("Name"); + case HallsColumns::Capacity: + return tr("Capacity"); + default: + return QVariant(); + } + } + return QSqlTableModel::headerData(section, orientation, role); +} diff --git a/ui/models/halls_model.h b/ui/models/halls_model.h new file mode 100644 index 0000000..b6506bc --- /dev/null +++ b/ui/models/halls_model.h @@ -0,0 +1,27 @@ +#ifndef HALLS_MODEL_H +#define HALLS_MODEL_H + +#include "base_sql_table_model.h" + +class HallsModel : public BaseSqlTableModel { + Q_OBJECT + +public: + // Enum for columns + enum HallsColumns { Id, Name, Capacity }; + +public: + explicit HallsModel(QObject *parent, const QSqlDatabase &database); + + // Initealize the model + void initialize(); + + // Overlooking class BaseSqlTableModel methods + + QVariant headerData(int section, Qt::Orientation orientation, + int role = Qt::DisplayRole) const override; + + inline bool isCompleteDatabaseFiltering() const final { return true; }; +}; + +#endif // HALLS_MODEL_H diff --git a/ui/models/movies_model.cpp b/ui/models/movies_model.cpp new file mode 100644 index 0000000..e912697 --- /dev/null +++ b/ui/models/movies_model.cpp @@ -0,0 +1,77 @@ +#include "movies_model.h" + +#include +#include + +MoviesModel::MoviesModel(QObject *parent, const QSqlDatabase &database) + : BaseSqlTableModel(parent, database) {} + +void MoviesModel::initialize() { + setTable("movies"); + + // Set up the relationship with the genres table + setRelation(fieldIndex("genre_id"), + QSqlRelation("genres", "genre_id", "genre_name")); + + setEditStrategy(QSqlTableModel::OnFieldChange); + + bool success = select(); + if (!success) { + qWarning() << "Error:" << lastError().text(); + } +} + +QVariant MoviesModel::headerData(int section, Qt::Orientation orientation, + int role) const { + if (role == Qt::DisplayRole && orientation == Qt::Horizontal) { + switch (section) { + case MoviesColumns::Id: + return tr("ID"); + case MoviesColumns::Title: + return tr("Title"); + case MoviesColumns::GenreId: + return tr("Genre"); + case MoviesColumns::Duration: + return tr("Duration"); + default: + return QVariant(); + } + } + return QSqlRelationalTableModel::headerData(section, orientation, role); +} + +bool MoviesModel::buildGenreIdFilterCondition(const QString &inFilter, + QString &outFilter) const { + QSqlQuery query; + query.prepare("SELECT genre_id FROM genres WHERE genre_name LIKE ?"); + query.addBindValue("%" + inFilter + "%"); + query.exec(); + + QStringList genreIds; + while (query.next()) { + genreIds << query.value(0).toString(); + } + + outFilter = QString("movies.genre_id IN (%1)").arg(genreIds.join(", ")); + + return true; +} + +QString MoviesModel::createMultiColumnFilter(const QString &filter) const { + QStringList conditions; + + QString buffer; // MoviesColumns::GenreId + if (buildGenreIdFilterCondition(filter, buffer)) { + conditions.append(buffer); + } + + using Columns = MoviesColumns; + QStringList columns = {columnName(Columns::Id), columnName(Columns::Title), + columnName(Columns::Duration)}; + + for (const QString &column : columns) { + conditions.append(QString("%1 LIKE '%%2%'").arg(column).arg(filter)); + } + + return conditions.join(" OR "); +} diff --git a/ui/models/movies_model.h b/ui/models/movies_model.h new file mode 100644 index 0000000..39141ac --- /dev/null +++ b/ui/models/movies_model.h @@ -0,0 +1,34 @@ +#ifndef MOVIES_MODEL_H +#define MOVIES_MODEL_H + +#include "base_sql_table_model.h" + +class MoviesModel : public BaseSqlTableModel { + Q_OBJECT + +public: + // Enum for columns + enum MoviesColumns { Id, Title, GenreId, Duration }; + +public: + explicit MoviesModel(QObject *parent, const QSqlDatabase &database); + + // Initialize the model + void initialize(); + + // Overlooking class BaseSqlTableModel methods + + QVariant headerData(int section, Qt::Orientation orientation, + int role = Qt::DisplayRole) const override; + + inline bool isCompleteDatabaseFiltering() const final { return true; }; + +protected: + QString createMultiColumnFilter(const QString &filter) const final; + +private: + bool buildGenreIdFilterCondition(const QString &inFilter, + QString &outFilter) const; +}; + +#endif // MOVIES_MODEL_H diff --git a/ui/models/multi_column_filter_proxy_model.cpp b/ui/models/multi_column_filter_proxy_model.cpp new file mode 100644 index 0000000..495a5df --- /dev/null +++ b/ui/models/multi_column_filter_proxy_model.cpp @@ -0,0 +1,32 @@ +#include "multi_column_filter_proxy_model.h" + +#include + +MultiColumnSortFilterProxyModel::MultiColumnSortFilterProxyModel( + QObject *parent) + : QSortFilterProxyModel(parent) {} + +bool MultiColumnSortFilterProxyModel::filterAcceptsRow( + int sourceRow, const QModelIndex &sourceParent) const { + + QRegularExpression regex = filterRegularExpression(); + if (!regex.isValid() || regex.pattern().isEmpty()) { + return true; + } + + int columnCount = sourceModel()->columnCount(sourceParent); + for (int column = 0; column < columnCount; ++column) { + QModelIndex sourceIndex = + sourceModel()->index(sourceRow, column, sourceParent); + QString dataValue = + sourceModel()->data(sourceIndex, Qt::DisplayRole).toString(); + + dataValue.replace(QRegularExpression("\\s+"), " "); + + if (regex.match(dataValue).hasMatch()) { + return true; + } + } + + return false; +} diff --git a/ui/models/multi_column_filter_proxy_model.h b/ui/models/multi_column_filter_proxy_model.h new file mode 100644 index 0000000..cc906c6 --- /dev/null +++ b/ui/models/multi_column_filter_proxy_model.h @@ -0,0 +1,15 @@ +#ifndef MULTI_COLUMN_FILTER_PROXY_MODEL +#define MULTI_COLUMN_FILTER_PROXY_MODEL + +#include + +class MultiColumnSortFilterProxyModel : public QSortFilterProxyModel { +public: + explicit MultiColumnSortFilterProxyModel(QObject *parent = nullptr); + +protected: + bool filterAcceptsRow(int sourceRow, + const QModelIndex &sourceParent) const override; +}; + +#endif // MULTI_COLUMN_FILTER_PROXY_MODEL diff --git a/ui/models/refunds_model.cpp b/ui/models/refunds_model.cpp new file mode 100644 index 0000000..995c34f --- /dev/null +++ b/ui/models/refunds_model.cpp @@ -0,0 +1,57 @@ +#include "refunds_model.h" + +#include + +RefundsModel::RefundsModel(QObject *parent, const QSqlDatabase &database) + : BaseSqlTableModel(parent, database) {} + +void RefundsModel::initialize() { + setTable("refunds"); + + setEditStrategy(QSqlTableModel::OnFieldChange); + + bool success = select(); + if (!success) { + qWarning() << "Error:" << lastError().text(); + } +} + +QVariant RefundsModel::headerData(int section, Qt::Orientation orientation, + int role) const { + if (role == Qt::DisplayRole && orientation == Qt::Horizontal) { + switch (section) { + case RefundsColumns::Id: + return tr("ID"); + case RefundsColumns::TicketId: + return tr("Ticket ID"); + case RefundsColumns::RefundAt: + return tr("Refund At"); + case RefundsColumns::RefundAmount: + return tr("Refund Amount"); + default: + return QVariant(); + } + } + return QSqlTableModel::headerData(section, orientation, role); +} + +QString RefundsModel::createMultiColumnFilter(const QString &filter) const { + QStringList conditions; + + // WARNING: Does not filter these models transmitted through the data method, + // such as QDatetime + + using Columns = RefundsModel; + QStringList columns = {columnName(Columns::Id), columnName(Columns::TicketId), + columnName(Columns::RefundAmount)}; + +#ifndef NO_DATE_TIME_SEARCH + columns.append(columnName(Columns::RefundAt)); +#endif + + for (const QString &column : columns) { + conditions.append(QString("%1 LIKE '%%2%'").arg(column).arg(filter)); + } + + return conditions.join(" OR "); +} diff --git a/ui/models/refunds_model.h b/ui/models/refunds_model.h new file mode 100644 index 0000000..da3cacf --- /dev/null +++ b/ui/models/refunds_model.h @@ -0,0 +1,35 @@ +#ifndef REFUNDS_MODEL_H +#define REFUNDS_MODEL_H + +#include "base_sql_table_model.h" + +class RefundsModel : public BaseSqlTableModel { + Q_OBJECT + +public: + enum RefundsColumns { Id, TicketId, RefundAt, RefundAmount }; + +public: + explicit RefundsModel(QObject *parent, const QSqlDatabase &database); + + // Initialize the model + void initialize(); + + // Overlooking class BaseSqlTableModel methods + + QVariant headerData(int section, Qt::Orientation orientation, + int role = Qt::DisplayRole) const override; + + inline bool isCompleteDatabaseFiltering() const final { +#ifdef NO_DATE_TIME_SEARCH + return false; +#else + return true; +#endif + }; + +protected: + QString createMultiColumnFilter(const QString &filter) const final; +}; + +#endif // REFUNDS_MODEL_H diff --git a/ui/models/sessions_model.cpp b/ui/models/sessions_model.cpp new file mode 100644 index 0000000..6ca2916 --- /dev/null +++ b/ui/models/sessions_model.cpp @@ -0,0 +1,116 @@ +#include "sessions_model.h" + +#include +#include + +SessionsModel::SessionsModel(QObject *parent, const QSqlDatabase &database) + : BaseSqlTableModel(parent, database) {} + +void SessionsModel::initialize() { + setTable("sessions"); + + // Set up the relationship with the movies and halls tables + setRelation(fieldIndex("movie_id"), + QSqlRelation("movies", "movie_id", "title")); + setRelation(fieldIndex("hall_id"), + QSqlRelation("halls", "hall_id", "hall_name")); + + setEditStrategy(QSqlTableModel::OnFieldChange); + + bool success = select(); + if (!success) { + qWarning() << "Error:" << lastError().text(); + } +} + +bool SessionsModel::buildHallIdFilterCondition(const QString &inFilter, + QString &outFilter) const { + QSqlQuery query; + query.prepare("SELECT hall_id FROM halls WHERE hall_name LIKE ?"); + query.addBindValue("%" + inFilter + "%"); + query.exec(); + + QStringList hallIds; + while (query.next()) { + hallIds << query.value(0).toString(); + } + + if (hallIds.isEmpty()) { + return false; + } + + outFilter = QString("sessions.hall_id IN (%1)").arg(hallIds.join(", ")); + + return true; +} + +bool SessionsModel::buildMovieIdFilterCondition(const QString &inFilter, + QString &outFilter) const { + QSqlQuery query; + query.prepare("SELECT movie_id FROM movies WHERE title LIKE ?"); + query.addBindValue("%" + inFilter + "%"); + query.exec(); + + QStringList movieIds; + while (query.next()) { + movieIds << query.value(0).toString(); + } + + if (movieIds.isEmpty()) { + return false; + } + + outFilter = QString("sessions.movie_id IN (%1)").arg(movieIds.join(", ")); + + return true; +} + +QVariant SessionsModel::headerData(int section, Qt::Orientation orientation, + int role) const { + if (role == Qt::DisplayRole && orientation == Qt::Horizontal) { + switch (section) { + case SessionsColumns::Id: + return tr("ID"); + case SessionsColumns::MovieId: + return tr("Movie Title"); + case SessionsColumns::HallId: + return tr("Hall Name"); + case SessionsColumns::BeginAt: + return tr("Start Time"); + case SessionsColumns::TicketPrice: + return tr("Ticket Price"); + default: + return QVariant(); + } + } + return QSqlRelationalTableModel::headerData(section, orientation, role); +} + +QString SessionsModel::createMultiColumnFilter(const QString &filter) const { + QStringList conditions; + + QString buffer; // SessionsColumns::HallId And SessionsColumns::MovieId + if (buildHallIdFilterCondition(filter, buffer)) { + conditions.append(buffer); + } + if (buildMovieIdFilterCondition(filter, buffer)) { + conditions.append(buffer); + } + + // WARNING: Does not filter these models transmitted through the data method, + // such as QDatetime + + using Columns = SessionsColumns; + QStringList columns = {columnName(Columns::Id), + columnName(Columns::TicketPrice)}; + +#ifndef NO_DATE_TIME_SEARCH + columns.append(columnName(Columns::BeginAt)); +#endif + + for (const QString &column : columns) { + conditions.append(QString("%1 LIKE '%%2%'").arg(column).arg(filter)); + } + + return conditions.join(" OR "); +} diff --git a/ui/models/sessions_model.h b/ui/models/sessions_model.h new file mode 100644 index 0000000..3412a96 --- /dev/null +++ b/ui/models/sessions_model.h @@ -0,0 +1,43 @@ +#ifndef SESSIONS_MODEL_H +#define SESSIONS_MODEL_H + +#include "base_sql_table_model.h" + +class SessionsModel : public BaseSqlTableModel { + Q_OBJECT + +public: + // Enum for columns + enum SessionsColumns { Id, MovieId, HallId, BeginAt, TicketPrice }; + +public: + explicit SessionsModel(QObject *parent, const QSqlDatabase &database); + + // Initialize the model + void initialize(); + + // Overlooking class BaseSqlTableModel methods + + QVariant headerData(int section, Qt::Orientation orientation, + int role = Qt::DisplayRole) const override; + + inline bool isCompleteDatabaseFiltering() const final { +#ifdef NO_DATE_TIME_SEARCH + return false; +#else + return true; +#endif + }; + +protected: + QString createMultiColumnFilter(const QString &filter) const final; + +private: + bool buildHallIdFilterCondition(const QString &inFilter, + QString &outFilter) const; + + bool buildMovieIdFilterCondition(const QString &inFilter, + QString &outFilter) const; +}; + +#endif // SESSIONS_MODEL_H diff --git a/ui/models/tickets_model.cpp b/ui/models/tickets_model.cpp new file mode 100644 index 0000000..94239d9 --- /dev/null +++ b/ui/models/tickets_model.cpp @@ -0,0 +1,59 @@ +#include "tickets_model.h" + +#include +#include + +TicketsModel::TicketsModel(QObject *parent, const QSqlDatabase &database) + : BaseSqlTableModel(parent, database) {} + +void TicketsModel::initialize() { + setTable("tickets"); + + setEditStrategy(QSqlTableModel::OnFieldChange); + + bool success = select(); + if (!success) { + qWarning() << "Error:" << lastError().text(); + } +} + +QVariant TicketsModel::headerData(int section, Qt::Orientation orientation, + int role) const { + if (role == Qt::DisplayRole && orientation == Qt::Horizontal) { + switch (section) { + case TicketsColumns::Id: + return tr("ID"); + case TicketsColumns::SessionId: + return tr("Session ID"); + case TicketsColumns::SeatNumber: + return tr("Seat Number"); + case TicketsColumns::SoldAt: + return tr("Sold At"); + default: + return QVariant(); + } + } + return QSqlTableModel::headerData(section, orientation, role); +} + +QString TicketsModel::createMultiColumnFilter(const QString &filter) const { + QStringList conditions; + + // WARNING: Does not filter these models transmitted through the data method, + // such as QDatetime + + using Columns = TicketsColumns; + QStringList columns = {columnName(Columns::Id), + columnName(Columns::SessionId), + columnName(Columns::SeatNumber)}; + +#ifndef NO_DATE_TIME_SEARCH + columns.append(columnName(Columns::SoldAt)); +#endif + + for (const QString &column : columns) { + conditions.append(QString("%1 LIKE '%%2%'").arg(column).arg(filter)); + } + + return conditions.join(" OR "); +} diff --git a/ui/models/tickets_model.h b/ui/models/tickets_model.h new file mode 100644 index 0000000..36688ec --- /dev/null +++ b/ui/models/tickets_model.h @@ -0,0 +1,35 @@ +#ifndef TICKETS_MODEL_H +#define TICKETS_MODEL_H + +#include "base_sql_table_model.h" + +class TicketsModel : public BaseSqlTableModel { + Q_OBJECT + +public: + enum TicketsColumns { Id, SessionId, SeatNumber, SoldAt }; + +public: + explicit TicketsModel(QObject *parent, const QSqlDatabase &database); + + // Initialize the model + void initialize(); + + // Overlooking class BaseSqlTableModel methods + + QVariant headerData(int section, Qt::Orientation orientation, + int role = Qt::DisplayRole) const override; + + inline bool isCompleteDatabaseFiltering() const final { +#ifdef NO_DATE_TIME_SEARCH + return false; +#else + return true; +#endif + }; + +protected: + QString createMultiColumnFilter(const QString &filter) const final; +}; + +#endif // TICKETS_MODEL_H diff --git a/ui/widgets/directories_management_widget.cpp b/ui/widgets/directories_management_widget.cpp new file mode 100644 index 0000000..c377f87 --- /dev/null +++ b/ui/widgets/directories_management_widget.cpp @@ -0,0 +1,160 @@ +#include "directories_management_widget.h" + +// Genre +#include "create_genre_request.h" +#include "genres_model.h" +#include "genres_repository.h" + +// Hall +#include "create_hall_request.h" +#include "halls_model.h" +#include "halls_repository.h" + +// Movie +#include "create_movie_request.h" +#include "movies_model.h" +#include "movies_repository.h" + +// Common +#include "error_dialog.h" +#include "model_manager.h" +#include "repository_manager.h" +#include "repository_result.h" +#include "schema_metadata.h" +#include + +DirectoriesManagementWidget::DirectoriesManagementWidget(QWidget *parent) + : QWidget(parent), selectedGenreId_(-1), selectedHallId_(-1), + selectedMovieId_(-1) { + setupUi(this); + + initializeRepositories(); // First of second + initializeModels(); // First of second + setupTableViews(); // After initialization of models + setupGenreFinder(); + setupConnections(); +} + +void DirectoriesManagementWidget::initializeRepositories() { + RepositoryManager &repositoryManager = RepositoryManager::instance(); + SchemaMetadata metadata = SchemaMetadata::defaultSchema(); + + genresRepository_ = repositoryManager.getRepositoryAs( + metadata.repositoryTableName("genres")); + + hallsRepository_ = repositoryManager.getRepositoryAs( + metadata.repositoryTableName("halls")); + + moviesRepository_ = repositoryManager.getRepositoryAs( + metadata.repositoryTableName("movies")); + + if (!bool(genresRepository_ && hallsRepository_ && moviesRepository_)) { + qFatal() + << "DirectoriesManagementWidget::initializeRepositories: Failed to " + "initialize repositories"; + } +} + +void DirectoriesManagementWidget::initializeModels() { + ModelManager &modelManager = ModelManager::instance(); + SchemaMetadata metadata = SchemaMetadata::defaultSchema(); + + genresModel_ = + modelManager.getModelAs(metadata.modelTableName("genres")); + + hallsModel_ = + modelManager.getModelAs(metadata.modelTableName("halls")); + + moviesModel_ = + modelManager.getModelAs(metadata.modelTableName("movies")); + + if (!bool(genresModel_ && hallsModel_ && moviesModel_)) { + qFatal() << "DirectoriesManagementWidget::initializeModels: Failed to " + "initialize models"; + } +} + +void DirectoriesManagementWidget::setupGenreFinder() { + SchemaMetadata metadata = SchemaMetadata::defaultSchema(); + + genreFinder->setDefaultRelation("genres"); + genreFinder->setLabelText(EntityFinderWidget::tr("Select genre")); + genreFinder->setLineEditPlaceholder( + EntityFinderWidget::tr("Here will be information about selected genre")); +} + +void DirectoriesManagementWidget::setupTableViews() { + tableHalls->setModel(hallsModel_); + + tableMovies->setModel(moviesModel_); + + tableGenres->setModel(genresModel_); +} + +void DirectoriesManagementWidget::setupConnections() { + connect(btnAddHall, &QPushButton::clicked, this, + &DirectoriesManagementWidget::onPushButtonAddHallClicked); + + connect(btnAddMovie, &QPushButton::clicked, this, + &DirectoriesManagementWidget::onPushButtonAddMovieClicked); + + connect(btnAddGenre, &QPushButton::clicked, this, + &DirectoriesManagementWidget::onPushButtonAddGenreClicked); + + connect(genreFinder, &EntityFinderWidget::fieldRetrieved, this, + &DirectoriesManagementWidget::onGenreFieldRetrieved); +} + +void DirectoriesManagementWidget::onPushButtonAddMovieClicked() { + if (selectedGenreId_ == -1) { + QMessageBox::warning(this, QMessageBox::tr("Error"), + QMessageBox::tr("No genre selected")); + } + + QString title = lineEditMovieName->text(); + int duration = spinBoxMovieDuration->value(); + + CreateMovieRequest request; + request.setTitle(title); + request.setDuration(duration); + request.setGenreId(selectedGenreId_); + + RepositoryResult result = moviesRepository_->createMovie(request); + if (!result.success) { + qWarning() << "Failed to create movie:" << result.errorMessage; + ErrorDialog::displayError(this, result.errorMessage); + } +} + +void DirectoriesManagementWidget::onPushButtonAddHallClicked() { + QString name = lineEditHallName->text(); + int capacity = spinBoxNumberOfSeats->value(); + + CreateHallRequest request; + request.setHallName(name); + request.setCapacity(capacity); + + RepositoryResult result = hallsRepository_->createHall(request); + if (!result.success) { + qWarning() << "Failed to create hall:" << result.errorMessage; + ErrorDialog::displayError(this, result.errorMessage); + } +} + +void DirectoriesManagementWidget::onGenreFieldRetrieved( + const QSqlField &field) { + selectedGenreId_ = field.value().toInt(); +} + +void DirectoriesManagementWidget::onPushButtonAddGenreClicked() { + QString name = lineEditGenreName->text(); + + CreateGenreRequest request; + request.setGenreName(name); + + RepositoryResult result = genresRepository_->createGenre(request); + if (!result.success) { + qWarning() << "Failed to create genre:" << result.errorMessage; + ErrorDialog::displayError(this, result.errorMessage); + } +} diff --git a/ui/widgets/directories_management_widget.h b/ui/widgets/directories_management_widget.h new file mode 100644 index 0000000..bc82b52 --- /dev/null +++ b/ui/widgets/directories_management_widget.h @@ -0,0 +1,47 @@ +#ifndef DIRECTORIES_MANAGEMENT_WIDGET_H +#define DIRECTORIES_MANAGEMENT_WIDGET_H + +#include "ui_directories_management_widget.h" +#include + +// Forward declaration +class HallsModel; +class MoviesModel; +class GenresModel; +class HallsRepositoryInterface; +class MoviesRepositoryInterface; +class GenresRepositoryInterface; + +class DirectoriesManagementWidget : public QWidget, + private Ui::DirectoriesManagementWidget { + Q_OBJECT + +private: + GenresModel *genresModel_; + GenresRepositoryInterface *genresRepository_; + HallsModel *hallsModel_; + HallsRepositoryInterface *hallsRepository_; + MoviesModel *moviesModel_; + MoviesRepositoryInterface *moviesRepository_; + qint32 selectedGenreId_; + qint32 selectedHallId_; + qint32 selectedMovieId_; + +public: + explicit DirectoriesManagementWidget(QWidget *parent = nullptr); + +private: + void initializeModels(); + void initializeRepositories(); + void setupConnections(); + void setupGenreFinder(); + void setupTableViews(); + +private slots: + void onGenreFieldRetrieved(const QSqlField &field); + void onPushButtonAddGenreClicked(); + void onPushButtonAddHallClicked(); + void onPushButtonAddMovieClicked(); +}; + +#endif // DIRECTORIES_MANAGEMENT_WIDGET_H diff --git a/ui/widgets/directories_management_widget.ui b/ui/widgets/directories_management_widget.ui new file mode 100644 index 0000000..88645d6 --- /dev/null +++ b/ui/widgets/directories_management_widget.ui @@ -0,0 +1,169 @@ + + + DirectoriesManagementWidget + + + + 0 + 0 + 484 + 410 + + + + Directory management + + + + + + 0 + + + + Genres + + + + + + true + + + + + + + Enter the name of the genre: + + + + + + + + + + Add genre + + + + + + + + Halls + + + + + + true + + + + + + + Enter hall name: + + + + + + + + + + Enter the number of seats in the hall: + + + + + + + 1 + + + 9999 + + + + + + + Add hall + + + + + + + + Movies + + + + + + true + + + + + + + + + + Enter the name of the movie: + + + + + + + + + + Enter the duration of the movie: + + + + + + + minute(s) + + + 1 + + + 1440 + + + + + + + Add movie + + + + + + + + + + + + EntityFinderWidget + QWidget +
entity_finder_widget.h
+ 1 +
+
+ + +
diff --git a/ui/widgets/entity_deleter_widget.cpp b/ui/widgets/entity_deleter_widget.cpp new file mode 100644 index 0000000..7952aa2 --- /dev/null +++ b/ui/widgets/entity_deleter_widget.cpp @@ -0,0 +1,179 @@ +#include "entity_deleter_widget.h" + +#include "error_dialog.h" +#include "genres_repository_interface.h" +#include "halls_repository_interface.h" +#include "movies_repository_interface.h" +#include "refunds_repository_interface.h" +#include "repository_result.h" +#include "sessions_repository_interface.h" +#include "tickets_repository_interface.h" + +#include +#include + +EntityDeleterWidget::EntityDeleterWidget(QWidget *parent) : QWidget(parent) { + setupUi(this); + + setupComboBoxCurrentTable(); + setupEntityFinder(); + setupConnections(); +} + +void EntityDeleterWidget::setupComboBoxCurrentTable() { + SchemaMetadata metadata = SchemaMetadata::defaultSchema(); + + QStringList databaseTableNames = {"genres", "halls", "movies", + "refunds", "sessions", "tickets"}; + + for (const QString currentDTN : databaseTableNames) { + comboBoxCurrentTable->addItem(metadata.translatedTableName(currentDTN), + currentDTN); + } +} + +void EntityDeleterWidget::setupConnections() { + connect(comboBoxCurrentTable, &QComboBox::currentIndexChanged, this, + &EntityDeleterWidget::onComboBoxCurrentTableCurrentIndexChanged); + + connect(entityFinder, &EntityFinderWidget::fieldRetrieved, this, + &EntityDeleterWidget::onFieldRetrieved); + + connect(entityFinder, &EntityFinderWidget::recordRetrieved, this, + &EntityDeleterWidget::onRecordRetrieved); + + connect(pushButtonDeleteEntity, &QPushButton::clicked, this, + &EntityDeleterWidget::onPushButtonDeleteEntityClicked); +} + +void EntityDeleterWidget::setupEntityFinder() { + entityFinder->setLabelText(tr("Select record of current table to delete")); + refreshEntityFinder(); +} + +void EntityDeleterWidget::refreshEntityFinder() { + const QString &databaseTableName = + comboBoxCurrentTable->currentData().toString(); + + entityFinder->setDefaultRelation(databaseTableName); +} + +void EntityDeleterWidget::onComboBoxCurrentTableCurrentIndexChanged(int index) { + refreshEntityFinder(); + + const QString &databaseTableName = + comboBoxCurrentTable->currentData().toString(); + + qInfo() << "Current table was changed:" << "CurrentComboBoxIndex:" << index + << "databaseTableName:" << databaseTableName; +} + +void EntityDeleterWidget::onFieldRetrieved(const QSqlField &field) { + retrievedField_ = field; +} + +void EntityDeleterWidget::onRecordRetrieved(const QSqlRecord &record) { + // NOTE: It is possible to reduce the behavior of each of the tables if the + // removal is in different ways with other data + selectedRecord_ = record; +} + +template <> +RepositoryResult +EntityDeleterWidget::deleteEntityById() { + return currentRepository()->deleteGenreById( + retrievedField_.value().toInt()); +} + +template <> +RepositoryResult +EntityDeleterWidget::deleteEntityById() { + return currentRepository()->deleteHallById( + retrievedField_.value().toInt()); +} + +template <> +RepositoryResult +EntityDeleterWidget::deleteEntityById() { + return currentRepository()->deleteMovieById( + retrievedField_.value().toInt()); +} + +template <> +RepositoryResult +EntityDeleterWidget::deleteEntityById() { + return currentRepository()->deleteRefundById( + retrievedField_.value().toInt()); +} + +template <> +RepositoryResult +EntityDeleterWidget::deleteEntityById() { + return currentRepository()->deleteSessionById( + retrievedField_.value().toInt()); +} + +template <> +RepositoryResult +EntityDeleterWidget::deleteEntityById() { + return currentRepository()->deleteTicketById( + retrievedField_.value().toInt()); +} + +void EntityDeleterWidget::onPushButtonDeleteEntityClicked() { + const QString &databaseTableName = + comboBoxCurrentTable->currentData().toString(); + + RepositoryResult result; + + if (databaseTableName == "genres") { + + result = deleteEntityById(); + showMessageDialog(result, tr("Genre deleted successfully")); + + } else if (databaseTableName == "halls") { + + result = deleteEntityById(); + showMessageDialog(result, tr("Hall deleted successfully")); + + } else if (databaseTableName == "movies") { + + result = deleteEntityById(); + showMessageDialog(result, tr("Movie deleted successfully")); + + } else if (databaseTableName == "refunds") { + + result = deleteEntityById(); + showMessageDialog(result, tr("Refund deleted successfully")); + + } else if (databaseTableName == "sessions") { + + result = deleteEntityById(); + showMessageDialog(result, tr("Session deleted successfully")); + + } else if (databaseTableName == "tickets") { + + result = deleteEntityById(); + showMessageDialog(result, tr("Ticket deleted successfully")); + + } else { + qCritical() << "EntityDeleterWidget::onPressPushButtonDeleteEntity: " + "Unknown database table name:" + << databaseTableName; + } + + // NOTE: Application connector will reset entity finder + + // if (result.success) { + // entityFinder->resetToDefault(); + // } +} + +void EntityDeleterWidget::showMessageDialog(const RepositoryResult &result, + const QString &successMessage) { + if (!result.success) { + ErrorDialog::displayError(this, result.errorMessage); + } else { + QMessageBox::information(this, QMessageBox::tr("Success"), successMessage); + } +} diff --git a/ui/widgets/entity_deleter_widget.h b/ui/widgets/entity_deleter_widget.h new file mode 100644 index 0000000..3b3b970 --- /dev/null +++ b/ui/widgets/entity_deleter_widget.h @@ -0,0 +1,53 @@ +#ifndef ENTITY_DELETER_WIDGET_H +#define ENTITY_DELETER_WIDGET_H + +#include "repository_manager.h" +#include "schema_metadata.h" +#include "ui_entity_deleter_widget.h" + +// Forward declaration +class RepositoryResult; + +class EntityDeleterWidget : public QWidget, private Ui::EntityDeleterWidget { + Q_OBJECT + +private: + QSqlRecord selectedRecord_; + QSqlField retrievedField_; + +public: + explicit EntityDeleterWidget(QWidget *parent = nullptr); + +private: + void setupComboBoxCurrentTable(); + void setupConnections(); + void setupEntityFinder(); + +private slots: + void onComboBoxCurrentTableCurrentIndexChanged(int index); + void onFieldRetrieved(const QSqlField &field); + void onPushButtonDeleteEntityClicked(); + void onRecordRetrieved(const QSqlRecord &rowValues); + +private: + void refreshEntityFinder(); + + void showMessageDialog(const RepositoryResult &result, + const QString &successMessage); + + template Repository *currentRepository(); + template RepositoryResult deleteEntityById(); +}; + +template +Repository *EntityDeleterWidget::currentRepository() { + SchemaMetadata metadata = SchemaMetadata::defaultSchema(); + + const QString &databaseTableName = + comboBoxCurrentTable->currentData().toString(); + + return RepositoryManager::instance().getRepositoryAs( + metadata.repositoryTableName(databaseTableName)); +} + +#endif // ENTITY_DELETER_WIDGET_H diff --git a/ui/widgets/entity_deleter_widget.ui b/ui/widgets/entity_deleter_widget.ui new file mode 100644 index 0000000..53c95fa --- /dev/null +++ b/ui/widgets/entity_deleter_widget.ui @@ -0,0 +1,93 @@ + + + EntityDeleterWidget + + + + 0 + 0 + 208 + 143 + + + + + + + QGroupBox#groupBox { + border: 2px solid #C00000; + border-radius: 10px; + padding: 5px; + padding-top: 10px; +} +QGroupBox#groupBox::title { + background: transparent; + subcontrol-origin: margin; + subcontrol-position: top center; + padding: 5px; +} + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + + Database recording deletion + + + Qt::AlignmentFlag::AlignCenter + + + true + + + + + + Current table: + + + + + + + + + + + + + Delete + + + + + + + + + + + EntityFinderWidget + QWidget +
entity_finder_widget.h
+ 1 +
+
+ + +
diff --git a/ui/widgets/entity_finder_widget.cpp b/ui/widgets/entity_finder_widget.cpp new file mode 100644 index 0000000..f704d90 --- /dev/null +++ b/ui/widgets/entity_finder_widget.cpp @@ -0,0 +1,113 @@ +#include "entity_finder_widget.h" + +#include "base_sql_table_model.h" +#include "model_manager.h" +#include "schema_metadata.h" +#include "search_dialog.h" + +EntityFinderWidget::EntityFinderWidget(QWidget *parent) : QWidget(parent) { + setupUi(this); + + setupConnections(); + setupFrameStyle(); +} + +EntityFinderWidget::EntityFinderWidget(const QString &tableName, + const QString &fieldName, + QWidget *parent) + : EntityFinderWidget(parent) { + setModelTableName(tableName); + setFieldName(fieldName); +} + +void EntityFinderWidget::setHiddenFrame(bool hidden) { + QLayout *frameLayout = frame->layout(); + bool isHidden = frame->frameStyle() == QFrame::NoFrame; + + if (isHidden == hidden) { + return; + } + + if (hidden) { + frame->setFrameStyle(QFrame::NoFrame); + frameLayout->setContentsMargins(0, 0, 0, 0); + } else { + frame->setFrameStyle(originalFrameStyle_); + frameLayout->setContentsMargins(9, 9, 9, 9); + } + + parentWidget()->adjustSize(); +} + +void EntityFinderWidget::refreshLineEditText(const QSqlRecord &record) { + ModelManager &modelManager = ModelManager::instance(); + + BaseSqlTableModel *model = + modelManager.getModelAs(modelTableName_); + + QStringList columnDataList; + + for (int i = 0; i < record.count(); ++i) { + QString columnName = model->headerData(i, Qt::Horizontal).toString(); + QString columnValue = record.value(i).toString(); + columnDataList.append(QString("%1: %2").arg(columnName, columnValue)); + } + + lineEditEntityInformation->setText(columnDataList.join(" | ")); +} + +void EntityFinderWidget::setDefaultRelation( + const QString &databaseRelationName) { + SchemaMetadata metadata = SchemaMetadata::defaultSchema(); + setModelTableName(metadata.modelTableName(databaseRelationName)); + setFieldName(metadata.primaryIdColumnName(databaseRelationName)); + + qInfo() << "Default relation name set to:" << databaseRelationName; +} + +void EntityFinderWidget::setupConnections() { + connect(pushButtonFindEntity, &QPushButton::clicked, this, + &EntityFinderWidget::onPushButtonFindEntityClicked); +} + +void EntityFinderWidget::setupFrameStyle() { + originalFrameStyle_ = frame->frameStyle(); +} + +void EntityFinderWidget::resetToDefault() { + qInfo() << "Resetting entity finder to default:" + << "Name of EntityFinderWidget:" << objectName(); + lineEditEntityInformation->setText(""); + + emit reseted(); +} + +void EntityFinderWidget::onPushButtonFindEntityClicked() { + SearchDialog searchDialog(modelTableName_, fieldName_, this); + + // All its signals are automatically disconnected from the slots + + connect(&searchDialog, &SearchDialog::rowSelected, this, + &EntityFinderWidget::onRowSelected); + + connect(&searchDialog, &SearchDialog::fieldRetrieved, this, + &EntityFinderWidget::onFieldRetrieved); + + connect(&searchDialog, &SearchDialog::recordRetrieved, this, + &EntityFinderWidget::onRecordRetrieved); + + searchDialog.exec(); +} + +void EntityFinderWidget::onRowSelected(int rowIndex) { + emit rowSelected(rowIndex); +} + +void EntityFinderWidget::onRecordRetrieved(const QSqlRecord &rowValues) { + refreshLineEditText(rowValues); + emit recordRetrieved(rowValues); +} + +void EntityFinderWidget::onFieldRetrieved(const QSqlField &field) { + emit fieldRetrieved(field); +} diff --git a/ui/widgets/entity_finder_widget.h b/ui/widgets/entity_finder_widget.h new file mode 100644 index 0000000..e9521fd --- /dev/null +++ b/ui/widgets/entity_finder_widget.h @@ -0,0 +1,85 @@ +#ifndef ENTITY_FINDER_WIDGET_H +#define ENTITY_FINDER_WIDGET_H + +#include "ui_entity_finder_widget.h" +#include +#include + +// Forward declaration +class SearchDialog; + +class EntityFinderWidget : public QWidget, private Ui::EntityFinderWidget { + Q_OBJECT + +private: + QString fieldName_; + QString modelTableName_; + int originalFrameStyle_; + +public: + EntityFinderWidget(QWidget *parent = nullptr); + EntityFinderWidget(const QString &modelTableName, const QString &fieldName, + QWidget *parent = nullptr); + +private: + void setupConnections(); + void setupFrameStyle(); + +public: + void setHiddenFrame(bool hidden); + + void refreshLineEditText(const QSqlRecord &fieldValue); + void setDefaultRelation(const QString &databaseRelationName); + + inline void resetLineEditText(); + inline void setLabelText(const QString &text); + inline void setLineEditPlaceholder(const QString &placeholder); + + inline QString fieldName() const; + inline QString modelTableName() const; + +signals: + void rowSelected(int rowIndex); + void recordRetrieved(QSqlRecord rowValues); + void fieldRetrieved(QSqlField fieldValue); + void reseted(); + +public slots: + void resetToDefault(); + +private slots: + void onPushButtonFindEntityClicked(); + void onRowSelected(int rowIndex); + void onRecordRetrieved(const QSqlRecord &rowValues); + void onFieldRetrieved(const QSqlField &field); + +private: + inline void setFieldName(const QString &fieldName); + inline void setModelTableName(const QString &modelTableName); +}; + +void EntityFinderWidget::resetLineEditText() { + lineEditEntityInformation->clear(); +} + +void EntityFinderWidget::setModelTableName(const QString &modelTableName) { + modelTableName_ = modelTableName; +} + +void EntityFinderWidget::setFieldName(const QString &fieldName) { + fieldName_ = fieldName; +} + +void EntityFinderWidget::setLabelText(const QString &text) { + labelEntityInformation->setText(text + ":"); +} + +void EntityFinderWidget::setLineEditPlaceholder(const QString &placeholder) { + lineEditEntityInformation->setPlaceholderText(placeholder); +} + +QString EntityFinderWidget::fieldName() const { return fieldName_; } + +QString EntityFinderWidget::modelTableName() const { return modelTableName_; } + +#endif // ENTITY_FINDER_WIDGET_H diff --git a/ui/widgets/entity_finder_widget.ui b/ui/widgets/entity_finder_widget.ui new file mode 100644 index 0000000..4f1d671 --- /dev/null +++ b/ui/widgets/entity_finder_widget.ui @@ -0,0 +1,59 @@ + + + EntityFinderWidget + + + + 0 + 0 + 160 + 102 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + QFrame::Shape::StyledPanel + + + + + + + + + Qt::FocusPolicy::NoFocus + + + true + + + + + + + Find... + + + + + + + + + + + diff --git a/ui/widgets/entity_updater_widget.cpp b/ui/widgets/entity_updater_widget.cpp new file mode 100644 index 0000000..fba1677 --- /dev/null +++ b/ui/widgets/entity_updater_widget.cpp @@ -0,0 +1,491 @@ +#include "entity_updater_widget.h" + +#include "genres_repository_interface.h" +#include "halls_repository_interface.h" +#include "movies_repository_interface.h" +#include "refunds_repository_interface.h" +#include "sessions_repository_interface.h" +#include "tickets_repository_interface.h" + +#include "update_genre_request.h" +#include "update_hall_request.h" +#include "update_movie_request.h" +#include "update_refund_request.h" +#include "update_session_request.h" +#include "update_ticket_request.h" + +#include "error_dialog.h" +#include "model_manager.h" + +#include "base_sql_table_model.h" +#include +#include + +namespace DatabaseTableNames { +static constexpr char Genres[] = "genres"; +static constexpr char Halls[] = "halls"; +static constexpr char Movies[] = "movies"; +static constexpr char Refunds[] = "refunds"; +static constexpr char Sessions[] = "sessions"; +static constexpr char Tickets[] = "tickets"; +} // namespace DatabaseTableNames + +EntityUpdaterWidget::EntityUpdaterWidget(QWidget *parent) + : QWidget(parent), primaryKey_(-1) { + setupUi(this); + + setupConnections(); + setupComboBoxCurrentTable(); // After setup connections + setupParentEntityFinderWidget(); + setupChildEntityFinderWidget(); +} + +void EntityUpdaterWidget::setupComboBoxCurrentTable() { + SchemaMetadata metadata = SchemaMetadata::defaultSchema(); + + QList databaseTableNames = { + DatabaseTableNames::Genres, DatabaseTableNames::Halls, + DatabaseTableNames::Movies, DatabaseTableNames::Refunds, + DatabaseTableNames::Sessions, DatabaseTableNames::Tickets}; + + for (const QString &tableName : databaseTableNames) { + comboBoxCurrentTable->addItem(metadata.translatedTableName(tableName), + tableName); + } +} + +void EntityUpdaterWidget::setupConnections() { + connect(foreignKeyFinder, &EntityFinderWidget::fieldRetrieved, this, + &EntityUpdaterWidget::onForeignFieldRetrieved); + + connect(primaryKeyFinder, &EntityFinderWidget::fieldRetrieved, this, + &EntityUpdaterWidget::onPrimaryFieldRetrieved); + + connect(primaryKeyFinder, &EntityFinderWidget::recordRetrieved, this, + &EntityUpdaterWidget::onPrimaryEntityRetrieved); + + connect(comboBoxCurrentTable, &QComboBox::currentIndexChanged, this, + &EntityUpdaterWidget::onTableSelected); + + connect(comboBoxCurrentColumn, &QComboBox::currentIndexChanged, this, + &EntityUpdaterWidget::onColumnSelected); + + connect(pushButtonUpdate, &QPushButton::clicked, this, + &EntityUpdaterWidget::onPushButtonUpdateClicked); +} + +void EntityUpdaterWidget::setupChildEntityFinderWidget() { + foreignKeyFinder->setLabelText( + EntityFinderWidget::tr("Select entity for replacement")); + foreignKeyFinder->setLineEditPlaceholder( + EntityFinderWidget::tr("Here will be information about selected entity")); + foreignKeyFinder->setHiddenFrame(true); +} + +void EntityUpdaterWidget::setupParentEntityFinderWidget() { + primaryKeyFinder->setLabelText( + EntityFinderWidget::tr("Select entity for updating")); + primaryKeyFinder->setLineEditPlaceholder( + EntityFinderWidget::tr("Here will be information about selected entry")); +} + +void EntityUpdaterWidget::configureForeignKeyFinder( + const QString &columnName, const QString &databaseTableName) { + TableInfoSQLite tableInfo(databaseTableName); + + if (tableInfo.isPrimaryKey(columnName)) { + // NOTE: Change Primary Key is prohibited + + // configurePrimaryKeyFinder(databaseTableName); + return; + } + + QString foreignKeyDatabaseTableName = tableInfo.foreignKeyTable(columnName); + if (foreignKeyDatabaseTableName.isEmpty()) { + qCritical() + << "Could not find the database table name for the key column, which " + "contains \"_id\":" + << columnName; + return; + } + + configureForeignKeyFinder(foreignKeyDatabaseTableName); +} + +void EntityUpdaterWidget::configureForeignKeyFinder( + const QString &databaseTableName) { + foreignKeyFinder->resetToDefault(); + foreignKeyFinder->setDefaultRelation(databaseTableName); +} + +void EntityUpdaterWidget::configurePrimaryKeyFinder( + const QString &databaseTableName) { + primaryKeyFinder->resetToDefault(); + primaryKeyFinder->setDefaultRelation(databaseTableName); +} + +void EntityUpdaterWidget::onPrimaryFieldRetrieved(const QSqlField &field) { + qInfo() << "Selected primary field: Name:" << field.name() + << "Value:" << field.value(); + primaryKey_ = field.value().toInt(); +} + +void EntityUpdaterWidget::onForeignFieldRetrieved(const QSqlField &field) { + qInfo() << "Selected foreign field: Name:" << field.name() + << "Value:" << field.value(); + selectedForeignField_ = field; +} + +void EntityUpdaterWidget::onPrimaryEntityRetrieved(const QSqlRecord &entity) { + qInfo() << "Retrieved foreign entity:" << entity; + selectedPrimaryEntity_ = entity; +} + +template <> +QString EntityUpdaterWidget::actualColumnValue(const QString &columnName) { + QString value = isColumnsEqual(columnName) + ? lineEdit->text() + : selectedPrimaryEntity_.value(columnName).toString(); + + qInfo() << "Actual column QString value:" << value; + return value; +} + +template <> +QDateTime EntityUpdaterWidget::actualColumnValue(const QString &columnName) { + QDateTime value = isColumnsEqual(columnName) + ? dateTimeEdit->dateTime() + : selectedPrimaryEntity_.value(columnName).toDateTime(); + + qInfo() << "Actual column QDateTime value:" << value; + return value; +} + +template <> +int EntityUpdaterWidget::actualColumnValue(const QString &columnName) { + int value = isColumnsEqual(columnName) + ? spinBox->value() + : selectedPrimaryEntity_.value(columnName).toInt(); + + qInfo() << "Actual column int value:" << value; + return value; +} + +template <> +double EntityUpdaterWidget::actualColumnValue(const QString &columnName) { + double value = isColumnsEqual(columnName) + ? doubleSpinBox->value() + : selectedPrimaryEntity_.value(columnName).toDouble(); + + qInfo() << "Actual column double value:" << value; + return value; +} + +qint32 EntityUpdaterWidget::actualForeignKey(const QString &columnName) { + qint32 value = isColumnsEqual(columnName) + ? selectedForeignField_.value().toInt() + : selectedPrimaryEntity_.value(columnName).toInt(); + + qInfo() << "Actual foreign key:" << value; + return value; +} + +template <> +RepositoryResult +EntityUpdaterWidget::updateEntity() { + UpdateGenreRequest request; + request.setGenreId(primaryKey_); + request.setGenreName(actualColumnValue("genre_name")); + + return currentRepository()->updateGenre(request); +} + +template <> +RepositoryResult EntityUpdaterWidget::updateEntity() { + UpdateHallRequest request; + request.setHallId(primaryKey_); + request.setCapacity(actualColumnValue("capacity")); + request.setHallName(actualColumnValue("hall_name")); + + return currentRepository()->updateHall(request); +} + +template <> +RepositoryResult +EntityUpdaterWidget::updateEntity() { + UpdateMovieRequest request; + request.setMovieId(primaryKey_); + request.setDuration(actualColumnValue("duration")); + request.setGenreId(actualForeignKey("genre_id")); + request.setTitle(actualColumnValue("title")); + + return currentRepository()->updateMovie(request); +} + +template <> +RepositoryResult +EntityUpdaterWidget::updateEntity() { + UpdateRefundRequest request; + request.setRefundId(primaryKey_); + request.setRefundAmount(actualColumnValue("refund_amount")); + request.setRefundAt(actualColumnValue("refund_at")); + request.setTicketId(actualForeignKey("ticket_id")); + + return currentRepository()->updateRefund(request); +} + +template <> +RepositoryResult +EntityUpdaterWidget::updateEntity() { + UpdateSessionRequest request; + request.setSessionId(primaryKey_); + request.setHallId(actualForeignKey("hall_id")); + request.setMovieId(actualForeignKey("movie_id")); + request.setBeginAt(actualColumnValue("begin_at")); + request.setTicketPrice(actualColumnValue("ticket_price")); + + return currentRepository()->updateSession( + request); +} + +template <> +RepositoryResult +EntityUpdaterWidget::updateEntity() { + UpdateTicketRequest request; + request.setTicketId(primaryKey_); + request.setSeatNumber(actualColumnValue("seat_number")); + request.setSessionId(actualForeignKey("session_id")); + request.setSoldAt(actualColumnValue("sold_at")); + + return currentRepository()->updateTicket(request); +} + +template <> +void EntityUpdaterWidget::processEntityUpdate( + RepositoryResult &resultOut) { + resultOut = updateEntity(); + if (!resultOut.success) { + ErrorDialog::displayError(this, resultOut.errorMessage); + return; + } + showMessageDialog(resultOut, + EntityUpdaterWidget::tr("Genre updated successfully")); +} + +template <> +void EntityUpdaterWidget::processEntityUpdate( + RepositoryResult &resultOut) { + resultOut = updateEntity(); + if (!resultOut.success) { + ErrorDialog::displayError(this, resultOut.errorMessage); + return; + } + showMessageDialog(resultOut, + EntityUpdaterWidget::tr("Hall updated successfully")); +} + +template <> +void EntityUpdaterWidget::processEntityUpdate( + RepositoryResult &resultOut) { + resultOut = updateEntity(); + if (!resultOut.success) { + ErrorDialog::displayError(this, resultOut.errorMessage); + return; + } + showMessageDialog(resultOut, + EntityUpdaterWidget::tr("Movie updated successfully")); +} + +template <> +void EntityUpdaterWidget::processEntityUpdate( + RepositoryResult &resultOut) { + resultOut = updateEntity(); + if (!resultOut.success) { + ErrorDialog::displayError(this, resultOut.errorMessage); + return; + } + showMessageDialog(resultOut, + EntityUpdaterWidget::tr("Refund updated successfully")); +} + +template <> +void EntityUpdaterWidget::processEntityUpdate( + RepositoryResult &resultOut) { + resultOut = updateEntity(); + if (!resultOut.success) { + ErrorDialog::displayError(this, resultOut.errorMessage); + return; + } + showMessageDialog(resultOut, + EntityUpdaterWidget::tr("Session updated successfully")); +} + +template <> +void EntityUpdaterWidget::processEntityUpdate( + RepositoryResult &resultOut) { + resultOut = updateEntity(); + if (!resultOut.success) { + ErrorDialog::displayError(this, resultOut.errorMessage); + return; + } + showMessageDialog(resultOut, + EntityUpdaterWidget::tr("Ticket updated successfully")); +} + +void EntityUpdaterWidget::onPushButtonUpdateClicked() { + const QString &databaseTableName = + comboBoxCurrentTable->currentData().toString(); + + RepositoryResult result; + + if (databaseTableName == DatabaseTableNames::Genres) { + processEntityUpdate(result); + + } else if (databaseTableName == DatabaseTableNames::Halls) { + processEntityUpdate(result); + + } else if (databaseTableName == DatabaseTableNames::Movies) { + processEntityUpdate(result); + + } else if (databaseTableName == DatabaseTableNames::Refunds) { + processEntityUpdate(result); + + } else if (databaseTableName == DatabaseTableNames::Sessions) { + processEntityUpdate(result); + + } else if (databaseTableName == DatabaseTableNames::Tickets) { + processEntityUpdate(result); + + } else { + qFatal() << "EntityDeleterWidget::onPressPushButtonDeleteEntity: " + "Unknown database table name:" + << databaseTableName; + } + + processUpdateResult(result); +} + +void EntityUpdaterWidget::onTableSelected(int tableIndex) { + SchemaMetadata metadata = SchemaMetadata::defaultSchema(); + + const QString &databaseTableName = + comboBoxCurrentTable->itemData(tableIndex).toString(); + + ModelManager &modelManager = ModelManager::instance(); + BaseSqlTableModel *model = modelManager.getModelAs( + metadata.modelTableName(databaseTableName)); + + comboBoxCurrentColumn->clear(); + for (const auto &columnName : model->columnNames()) { + if (metadata.primaryIdColumnName(databaseTableName) == columnName) { + // NOTE: Change Primary Key is prohibited + continue; + } + + int headerIndex = model->columnIndex(columnName); + QString displayName = + model->headerData(headerIndex, Qt::Horizontal).toString(); + comboBoxCurrentColumn->addItem(displayName, columnName); + } + + configurePrimaryKeyFinder(databaseTableName); +} + +void EntityUpdaterWidget::onColumnSelected(int columnIndex) { + Q_UNUSED(columnIndex); + + const QString &databaseTableName = + comboBoxCurrentTable->currentData().toString(); + TableInfoSQLite tableInfoSQLite(databaseTableName); + + QString columnName = comboBoxCurrentColumn->currentData().toString(); + bool isKey = columnName.contains("_id", Qt::CaseInsensitive); + + QWidget *page; + switch (tableInfoSQLite.columnMetaType(columnName)) { + case QMetaType::Int: { + page = + findChild(isKey ? "pageChildFinderWidget" : "pageSpinBox"); + } break; + case QMetaType::Double: + page = findChild("pageDoubleSpinBox"); + break; + case QMetaType::QString: + page = findChild("pageLineEdit"); + break; + case QMetaType::QDateTime: + page = findChild("pageDateTimeEdit"); + break; + default: + qCritical() << "Unknown column selected"; + return; + } + stackedWidget->setCurrentWidget(page); + + if (isKey) { + configureForeignKeyFinder(columnName, databaseTableName); + } +} + +QModelIndex EntityUpdaterWidget::findIndexByColumn(QAbstractItemModel *model, + int column, + const QVariant &value) { + if (!model || column < 0 || column >= model->columnCount()) + return QModelIndex(); + + for (int row = 0; row < model->rowCount(); ++row) { + QModelIndex index = model->index(row, column); + if (model->data(index) == value) { + return index; + } + } + + return QModelIndex(); +} + +bool EntityUpdaterWidget::isColumnsEqual(const QString &other) { + TableInfoSQLite tableInfo(comboBoxCurrentTable->currentData().toString()); + QString current = comboBoxCurrentColumn->currentData().toString(); + + bool isEqual = tableInfo.columnIndex(current) == tableInfo.columnIndex(other); + + const static QString billet("Column \"%1\" and column \"%2\": %3"); + qInfo().noquote() << billet.arg(current).arg(other).arg( + isEqual ? "Equal" : "Not equal"); + + return isEqual; +}; + +void EntityUpdaterWidget::processUpdateResult(const RepositoryResult &result) { + if (!result.success) { + return; + } + + const QString &databaseTableName = + comboBoxCurrentTable->currentData().toString(); + + SchemaMetadata metadata = SchemaMetadata::defaultSchema(); + ModelManager &modelManager = ModelManager::instance(); + + QSqlTableModel *model = + modelManager.getModel(metadata.modelTableName(databaseTableName)); + + QString primaryKeyColumnName = + metadata.primaryIdColumnName(databaseTableName); + + int columnIndex = selectedPrimaryEntity_.indexOf(primaryKeyColumnName); + QModelIndex rowIndex = findIndexByColumn(model, columnIndex, primaryKey_); + selectedPrimaryEntity_ = model->record(rowIndex.row()); + + primaryKeyFinder->refreshLineEditText(selectedPrimaryEntity_); + foreignKeyFinder->resetToDefault(); +} + +void EntityUpdaterWidget::showMessageDialog(const RepositoryResult &result, + const QString &successMessage) { + if (!result.success) { + ErrorDialog::displayError(this, result.errorMessage); + } else { + QMessageBox::information(this, QMessageBox::tr("Success"), successMessage); + } +} diff --git a/ui/widgets/entity_updater_widget.h b/ui/widgets/entity_updater_widget.h new file mode 100644 index 0000000..41ae0de --- /dev/null +++ b/ui/widgets/entity_updater_widget.h @@ -0,0 +1,76 @@ +#ifndef ENTITY_UPDATER_WIDGET_H +#define ENTITY_UPDATER_WIDGET_H + +#include "repository_manager.h" +#include "repository_result.h" +#include "schema_metadata.h" +#include "ui_entity_updater_widget.h" +#include + +// Forward declaration +class RepositoryResult; +class TableInfo; + +class EntityUpdaterWidget : public QWidget, public Ui::EntityUpdaterWidget { + Q_OBJECT + +private: + QSqlField selectedForeignField_; + QSqlRecord selectedPrimaryEntity_; + qint32 primaryKey_; + +public: + EntityUpdaterWidget(QWidget *parent = nullptr); + + void setupChildEntityFinderWidget(); + void setupComboBoxCurrentTable(); + void setupConnections(); + void setupLabels(); + void setupParentEntityFinderWidget(); + + void configureForeignKeyFinder(const QString &columnName, + const QString &databaseTableName); + void configureForeignKeyFinder(const QString &databaseTableName); + void configurePrimaryKeyFinder(const QString &databaseTableName); + +private slots: + void onColumnSelected(int columnIndex); + void onForeignFieldRetrieved(const QSqlField &field); + void onPrimaryEntityRetrieved(const QSqlRecord &entity); + void onPrimaryFieldRetrieved(const QSqlField &field); + void onPushButtonUpdateClicked(); + void onTableSelected(int tableIndex); + +private: + QModelIndex findIndexByColumn(QAbstractItemModel *model, int column, + const QVariant &value); + bool isColumnsEqual(const QString &column); + qint32 actualForeignKey(const QString &columnName); + void processUpdateResult(const RepositoryResult &result); + void showMessageDialog(const RepositoryResult &result, + const QString &successMessage); + +private: + template + void processEntityUpdate(RepositoryResult &resultOut); + + template Repository *currentRepository(); + + template RepositoryResult updateEntity(); + + template + ValueType actualColumnValue(const QString &columnName); +}; + +template +Repository *EntityUpdaterWidget::currentRepository() { + SchemaMetadata metadata = SchemaMetadata::defaultSchema(); + + const QString &databaseTableName = + comboBoxCurrentTable->currentData().toString(); + + return RepositoryManager::instance().getRepositoryAs( + metadata.repositoryTableName(databaseTableName)); +} + +#endif // ENTITY_UPDATER_WIDGET_H diff --git a/ui/widgets/entity_updater_widget.ui b/ui/widgets/entity_updater_widget.ui new file mode 100644 index 0000000..9182a03 --- /dev/null +++ b/ui/widgets/entity_updater_widget.ui @@ -0,0 +1,228 @@ + + + EntityUpdaterWidget + + + + 0 + 0 + 275 + 322 + + + + Form + + + QGroupBox#groupBox { + border: 2px solid #FF6400; + border-radius: 10px; + padding: 5px; + padding-top: 10px; +} +QGroupBox#groupBox::title { + background: transparent; + subcontrol-origin: margin; + subcontrol-position: top center; + padding: 5px; +} + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Database records update + + + Qt::AlignmentFlag::AlignCenter + + + true + + + + 6 + + + + + Current table: + + + + + + + + + + + + + Current column: + + + + + + + + + + QFrame::Shape::StyledPanel + + + 4 + + + + + + + Enter integer value: + + + + + + + + + + Qt::Orientation::Vertical + + + + 20 + 40 + + + + + + + + + + + + Enter a value with a floating point: + + + + + + + + + + Qt::Orientation::Vertical + + + + 20 + 40 + + + + + + + + + + + + Enter text data: + + + + + + + + + + Qt::Orientation::Vertical + + + + 20 + 40 + + + + + + + + + + + + Enter the date and time: + + + + + + + + + + Qt::Orientation::Vertical + + + + 20 + 40 + + + + + + + + + + + + + + + + + + + Update + + + + + + + + + + + EntityFinderWidget + QWidget +
entity_finder_widget.h
+ 1 +
+
+ + +
diff --git a/ui/widgets/reports_widget.cpp b/ui/widgets/reports_widget.cpp new file mode 100644 index 0000000..53d8f2e --- /dev/null +++ b/ui/widgets/reports_widget.cpp @@ -0,0 +1,19 @@ +#include "reports_widget.h" + +#include +#include +#include +#include +#include + +ReportsWidget::ReportsWidget(QWidget *parent) : QWidget(parent) { + setupUi(this); + + setupTicketSalesReportWidgets(); +} + +void ReportsWidget::setupTicketSalesReportWidgets() { + genreReportWidget->configureReportForGenre(); + hallReportWidget->configureReportForHall(); + movieReportWidget->configureReportForMovie(); +} diff --git a/ui/widgets/reports_widget.h b/ui/widgets/reports_widget.h new file mode 100644 index 0000000..e0c624a --- /dev/null +++ b/ui/widgets/reports_widget.h @@ -0,0 +1,28 @@ +#ifndef REPORTS_WIDGET_H +#define REPORTS_WIDGET_H + +#include "ui_reports_widget.h" +#include +#include + +// Forward declaration +class GenresModel; +class GenresRepositoryInterface; +class HallsModel; +class HallsRepositoryInterface; +class MoviesModel; +class MoviesRepositoryInterface; +class SessionInfoDTO; +class SessionsInfoRepositoryInterface; + +class ReportsWidget : public QWidget, Ui::ReportsWidget { + Q_OBJECT + +public: + explicit ReportsWidget(QWidget *parent = nullptr); + +private: + void setupTicketSalesReportWidgets(); +}; + +#endif // REPORTS_WIDGET_H diff --git a/ui/widgets/reports_widget.ui b/ui/widgets/reports_widget.ui new file mode 100644 index 0000000..e9478ec --- /dev/null +++ b/ui/widgets/reports_widget.ui @@ -0,0 +1,66 @@ + + + ReportsWidget + + + + 0 + 0 + 222 + 80 + + + + Reports + + + + + + 0 + + + + Popularity of genres + + + + + + + + + + Attendance + + + + + + + + + + The popularity of movies + + + + + + + + + + + + + + TicketSalesReportWidget + QWidget +
ticket_sales_report_widget.h
+ 1 +
+
+ + +
diff --git a/ui/widgets/session_management_widget.cpp b/ui/widgets/session_management_widget.cpp new file mode 100644 index 0000000..800a216 --- /dev/null +++ b/ui/widgets/session_management_widget.cpp @@ -0,0 +1,103 @@ +#include "session_management_widget.h" + +#include "create_session_request.h" +#include "error_dialog.h" +#include "model_manager.h" +#include "repository_manager.h" +#include "repository_result.h" +#include "schema_metadata.h" +#include "sessions_model.h" +#include "sessions_repository.h" +#include + +SessionManagementWidget::SessionManagementWidget(QWidget *parent) + : QWidget(parent) { + setupUi(this); + + initializeRepositories(); // First of second + initializeModels(); // First of second + setupTableView(); // After initialization of repositories + setupHallFinder(); + setupMovieFinder(); + setupConnections(); +} + +void SessionManagementWidget::initializeRepositories() { + RepositoryManager &repositoryManager = RepositoryManager::instance(); + SchemaMetadata metadata = SchemaMetadata::defaultSchema(); + + sessionsRepository_ = repositoryManager.getRepositoryAs( + metadata.repositoryTableName("sessions")); + + if (!sessionsRepository_) { + qFatal() << "SessionManagementWidget::initializeRepositories: Failed to " + "initialize repositories"; + } +} + +void SessionManagementWidget::initializeModels() { + ModelManager &modelManager = ModelManager::instance(); + SchemaMetadata metadata = SchemaMetadata::defaultSchema(); + + sessionsModel_ = modelManager.getModelAs( + metadata.modelTableName("sessions")); + + if (!bool(sessionsModel_)) { + qFatal() << "SessionManagementWidget::initializeModels: Failed to " + "initialize models"; + } +} + +void SessionManagementWidget::setupTableView() { + tableSessions->setModel(sessionsModel_); +} + +void SessionManagementWidget::setupConnections() { + connect(btnAddSession, &QPushButton::clicked, this, + &SessionManagementWidget::onPushButtonAddSessionClicked); + + connect(hallFinder, &EntityFinderWidget::fieldRetrieved, this, + &SessionManagementWidget::onHallFieldRetrieved); + + connect(movieFinder, &EntityFinderWidget::fieldRetrieved, this, + &SessionManagementWidget::onMovieFieldRetrieved); +} + +void SessionManagementWidget::setupHallFinder() { + hallFinder->setDefaultRelation("halls"); + hallFinder->setLabelText(EntityFinderWidget::tr("Select hall")); + hallFinder->setLineEditPlaceholder( + EntityFinderWidget::tr("Here will be information about selected hall")); +} + +void SessionManagementWidget::setupMovieFinder() { + movieFinder->setDefaultRelation("movies"); + movieFinder->setLabelText(EntityFinderWidget::tr("Select movie")); + movieFinder->setLineEditPlaceholder( + EntityFinderWidget::tr("Here will be information about selected movie")); +} + +void SessionManagementWidget::onPushButtonAddSessionClicked() { + QDateTime beginAt = dateTimeEditBeginAt->dateTime(); + double ticketPrice = spinBoxTicketPrice->value(); + + CreateSessionRequest request; + request.setBeginAt(beginAt); + request.setHallId(selectedHallId_); + request.setMovieId(selectedMovieId_); + request.setTicketPrice(ticketPrice); + + RepositoryResult result = sessionsRepository_->createSession(request); + if (!result.success) { + qWarning() << "Failed to create session:" << result.errorMessage; + ErrorDialog::displayError(this, result.errorMessage); + } +}; + +void SessionManagementWidget::onHallFieldRetrieved(const QSqlField &field) { + selectedHallId_ = field.value().toInt(); +} + +void SessionManagementWidget::onMovieFieldRetrieved(const QSqlField &field) { + selectedMovieId_ = field.value().toInt(); +} diff --git a/ui/widgets/session_management_widget.h b/ui/widgets/session_management_widget.h new file mode 100644 index 0000000..74a75d6 --- /dev/null +++ b/ui/widgets/session_management_widget.h @@ -0,0 +1,38 @@ +#ifndef SESSION_MANAGEMENT_WIDGET_H +#define SESSION_MANAGEMENT_WIDGET_H + +#include "ui_session_management_widget.h" +#include + +// Forward declaration +class SessionsModel; +class SessionsRepositoryInterface; + +class SessionManagementWidget : public QWidget, + private Ui::SessionManagementWidget { + Q_OBJECT + +private: + SessionsModel *sessionsModel_; + SessionsRepositoryInterface *sessionsRepository_; + qint32 selectedHallId_; + qint32 selectedMovieId_; + +public: + explicit SessionManagementWidget(QWidget *parent = nullptr); + +private: + void initializeRepositories(); + void initializeModels(); + void setupConnections(); + void setupHallFinder(); + void setupMovieFinder(); + void setupTableView(); + +private slots: + void onPushButtonAddSessionClicked(); + void onHallFieldRetrieved(const QSqlField &field); + void onMovieFieldRetrieved(const QSqlField &field); +}; + +#endif // SESSION_MANAGEMENT_WIDGET_H diff --git a/ui/widgets/session_management_widget.ui b/ui/widgets/session_management_widget.ui new file mode 100644 index 0000000..67946e5 --- /dev/null +++ b/ui/widgets/session_management_widget.ui @@ -0,0 +1,69 @@ + + + SessionManagementWidget + + + + 0 + 0 + 325 + 388 + + + + Session management + + + + + + true + + + + + + + + + + + + + Specify the date and time of the session start: + + + + + + + + + + Specify the cost of watching the session: + + + + + + + + + + Add session + + + + + + + + EntityFinderWidget + QWidget +
entity_finder_widget.h
+ 1 +
+
+ + +
diff --git a/ui/widgets/single_record_time_range_widget.cpp b/ui/widgets/single_record_time_range_widget.cpp new file mode 100644 index 0000000..926f74f --- /dev/null +++ b/ui/widgets/single_record_time_range_widget.cpp @@ -0,0 +1,6 @@ +#include "single_record_time_range_widget.h" + +SingleRecordTimeRangeWidget::SingleRecordTimeRangeWidget(QWidget *parent) + : QWidget(parent) { + setupUi(this); +} diff --git a/ui/widgets/single_record_time_range_widget.h b/ui/widgets/single_record_time_range_widget.h new file mode 100644 index 0000000..cc2206c --- /dev/null +++ b/ui/widgets/single_record_time_range_widget.h @@ -0,0 +1,14 @@ +#ifndef SINGLE_RECORD_TIME_RANGE_WIDGET_H +#define SINGLE_RECORD_TIME_RANGE_WIDGET_H + +#include "ui_single_record_time_range_widget.h" + +class SingleRecordTimeRangeWidget : public QWidget, + private Ui::SingleRecordTimeRangeWidget { + Q_OBJECT + +public: + SingleRecordTimeRangeWidget(QWidget *parent = nullptr); +}; + +#endif // SINGLE_RECORD_TIME_RANGE_WIDGET_H diff --git a/ui/widgets/single_record_time_range_widget.ui b/ui/widgets/single_record_time_range_widget.ui new file mode 100644 index 0000000..8a6153f --- /dev/null +++ b/ui/widgets/single_record_time_range_widget.ui @@ -0,0 +1,52 @@ + + + SingleRecordTimeRangeWidget + + + + 0 + 0 + 316 + 85 + + + + Reports + + + + + + + + + Start of the period: + + + + + + + End of the period: + + + + + + + + + + + + + + EntityFinderWidget + QWidget +
entity_finder_widget.h
+ 1 +
+
+ + +
diff --git a/ui/widgets/ticket_return_widget.cpp b/ui/widgets/ticket_return_widget.cpp new file mode 100644 index 0000000..0d8533f --- /dev/null +++ b/ui/widgets/ticket_return_widget.cpp @@ -0,0 +1,109 @@ +#include "ticket_return_widget.h" + +#include "create_refund_request.h" +#include "error_dialog.h" +#include "model_manager.h" +#include "refunds_model.h" +#include "refunds_repository.h" +#include "repository_manager.h" +#include "repository_result.h" +#include "schema_metadata.h" +#include + +TicketReturnWidget::TicketReturnWidget(QWidget *parent) + : QWidget(parent), retrievedTicketField_(-1) { + setupUi(this); + + initializeRepositories(); + initializeModels(); + setupTableView(); // After initialization of models + setupTicketFinder(); + setupConnections(); +} + +// Setup widgets +void TicketReturnWidget::setupTableView() { + tableRefunds->setModel(refundsModel_); +} + +void TicketReturnWidget::setupTicketFinder() { + ticketFinder->setDefaultRelation("tickets"); + ticketFinder->setLabelText(EntityFinderWidget::tr("Select ticket")); + ticketFinder->setLineEditPlaceholder( + EntityFinderWidget::tr("Here will be information about selected ticket")); +} + +void TicketReturnWidget::initializeRepositories() { + RepositoryManager &repositoryManager = RepositoryManager::instance(); + SchemaMetadata metadata = SchemaMetadata::defaultSchema(); + + refundsRepository_ = repositoryManager.getRepositoryAs( + metadata.repositoryTableName("refunds")); + + if (!bool(refundsRepository_)) { + qFatal() << "TicketReturnWidget::initializeRepositories: Failed to " + "initialize repositories"; + } +} + +void TicketReturnWidget::initializeModels() { + ModelManager &modelManager = ModelManager::instance(); + SchemaMetadata metadata = SchemaMetadata::defaultSchema(); + + refundsModel_ = + modelManager.getModelAs(metadata.modelTableName("refunds")); + + if (!bool(refundsModel_)) { + qFatal() << "TicketReturnWidget::initializeModels: Failed to initialize " + "models"; + } +} + +void TicketReturnWidget::setupConnections() { + connect(pushButtonRefundTicket, &QPushButton::clicked, this, + &TicketReturnWidget::onPushButtonRefundTicketClicked); + + connect(ticketFinder, &EntityFinderWidget::fieldRetrieved, this, + &TicketReturnWidget::onTicketFieldRetrieved); +} + +void TicketReturnWidget::onPushButtonRefundTicketClicked() { + if (retrievedTicketField_ == -1) { + QMessageBox::warning(this, QMessageBox::tr("Error"), + QMessageBox::tr("No ticket selected")); + return; + } + + QDateTime refundAt; + if (dateTimeEditRefund->isEnabled()) { + refundAt = dateTimeEditRefund->dateTime(); + } else { + refundAt = QDateTime::currentDateTime(); + } + + double refundAmount = spinBoxRefundAmount->value(); + + CreateRefundRequest request; + request.setTicketId(retrievedTicketField_); + request.setRefundAt(refundAt); + request.setRefundAmount(refundAmount); + + RepositoryResult refundResult = refundsRepository_->createRefund(request); + + if (!refundResult.success) { + qInfo() << "Failed to refund ticket by id:" << retrievedTicketField_; + ErrorDialog::displayError(this, refundResult.errorMessage); + return; + } + + QString successMessage = + QMessageBox::tr("Ticket with number %1 has been successfully refunded.") + .arg(retrievedTicketField_); + QMessageBox::information(this, QMessageBox::tr("Success"), successMessage); + + ticketFinder->resetLineEditText(); +} + +void TicketReturnWidget::onTicketFieldRetrieved(const QSqlField &field) { + retrievedTicketField_ = field.value().toInt(); +} diff --git a/ui/widgets/ticket_return_widget.h b/ui/widgets/ticket_return_widget.h new file mode 100644 index 0000000..83bacf9 --- /dev/null +++ b/ui/widgets/ticket_return_widget.h @@ -0,0 +1,34 @@ +#ifndef TICKET_RETURN_WIDGET_H +#define TICKET_RETURN_WIDGET_H + +#include "ui_ticket_return_widget.h" +#include + +// Forward declaration +class RefundsModel; +class RefundsRepositoryInterface; + +class TicketReturnWidget : public QWidget, Ui::TicketReturnWidget { + Q_OBJECT + +private: + RefundsModel *refundsModel_; + RefundsRepositoryInterface *refundsRepository_; + qint32 retrievedTicketField_; + +public: + explicit TicketReturnWidget(QWidget *parent = nullptr); + +private: + void initializeRepositories(); + void initializeModels(); + void setupConnections(); + void setupTableView(); + void setupTicketFinder(); + +private slots: + void onPushButtonRefundTicketClicked(); + void onTicketFieldRetrieved(const QSqlField &field); +}; + +#endif // TICKET_RETURN_WIDGET_H diff --git a/ui/widgets/ticket_return_widget.ui b/ui/widgets/ticket_return_widget.ui new file mode 100644 index 0000000..e292921 --- /dev/null +++ b/ui/widgets/ticket_return_widget.ui @@ -0,0 +1,70 @@ + + + TicketReturnWidget + + + + 0 + 0 + 311 + 375 + + + + Ticket refund + + + + + + true + + + + + + + + + + Enter the refund amount: + + + + + + + + + + Date and time of ticket refund (debugging): + + + + + + + true + + + + + + + Refund + + + + + + + + EntityFinderWidget + QWidget +
entity_finder_widget.h
+ 1 +
+
+ + +
diff --git a/ui/widgets/ticket_sale_widget.cpp b/ui/widgets/ticket_sale_widget.cpp new file mode 100644 index 0000000..478a0d5 --- /dev/null +++ b/ui/widgets/ticket_sale_widget.cpp @@ -0,0 +1,109 @@ +#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 +#include +#include + +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( + 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(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 &valuesList) { + for (const auto &value : valuesList) { + if (!value.isValid()) { + return; + } + } +} diff --git a/ui/widgets/ticket_sale_widget.h b/ui/widgets/ticket_sale_widget.h new file mode 100644 index 0000000..120e606 --- /dev/null +++ b/ui/widgets/ticket_sale_widget.h @@ -0,0 +1,37 @@ +#ifndef TICKET_SALE_WIDGET_H +#define TICKET_SALE_WIDGET_H + +#include "ui_ticket_sale_widget.h" +#include +#include + +// Forward declaration +class TicketsModel; +class TicketsRepositoryInterface; + +class TicketSaleWidget : public QWidget, Ui::TicketSaleWidget { + Q_OBJECT + +private: + TicketsModel *ticketsModel_; + TicketsRepositoryInterface *ticketsRepository_; + qint32 selectedSessionId_; + +public: + explicit TicketSaleWidget(QWidget *parent = nullptr); + +private: + void initializeRepositories(); + void initializeModels(); + void setupConnections(); + void setupSessionFinder(); + void setupTableView(); + + void validateSessionValues(const std::initializer_list &valuesList); + +private slots: + void onPushButtonSellTicketClicked(); + void onFieldRetrieved(const QSqlField &field); +}; + +#endif // TICKET_SALE_WIDGET_H diff --git a/ui/widgets/ticket_sale_widget.ui b/ui/widgets/ticket_sale_widget.ui new file mode 100644 index 0000000..57c2396 --- /dev/null +++ b/ui/widgets/ticket_sale_widget.ui @@ -0,0 +1,83 @@ + + + TicketSaleWidget + + + + 0 + 0 + 292 + 375 + + + + Ticket sales + + + + + + true + + + + + + + + + + Seat number: + + + spinBoxSeatNumber + + + + + + + Seat number № + + + 1 + + + 9999 + + + + + + + Date and time of ticket sale (debugging): + + + + + + + true + + + + + + + Sell this ticket + + + + + + + + EntityFinderWidget + QWidget +
entity_finder_widget.h
+ 1 +
+
+ + +
diff --git a/ui/widgets/ticket_sales_report_widget.cpp b/ui/widgets/ticket_sales_report_widget.cpp new file mode 100644 index 0000000..82612b5 --- /dev/null +++ b/ui/widgets/ticket_sales_report_widget.cpp @@ -0,0 +1,362 @@ +#include "ticket_sales_report_widget.h" + +#include "error_dialog.h" +#include "repository_manager.h" +#include "repository_result.h" +#include "schema_metadata.h" +#include "session_statistics_dto.h" +#include "sessions_statistics_repository.h" +#include "table_info_sqlite.h" +#include +#include +#include +#include + +TicketSalesReportWidget::SalesData::SalesData() + : refundExpenses_(0), refundedTickets_(0), salesRevenue_(0), + soldTickets_(0), maximumTickets_(0) {} + +TicketSalesReportWidget::SalesData::SalesData(double refundExpenses, + double salesRevenue, + qint32 refundedTickets, + qint32 soldTickets, + qint32 maxTickets) + : refundExpenses_(refundExpenses), refundedTickets_(refundedTickets), + salesRevenue_(salesRevenue), soldTickets_(soldTickets), + maximumTickets_(maxTickets) {} + +TicketSalesReportWidget::SalesData +TicketSalesReportWidget::SalesData::operator+(const SalesData &other) const { + SalesData result; + result.setMaximumTickets(maximumTickets() + other.maximumTickets()); + result.setSoldTickets(soldTickets() + other.soldTickets()); + result.setRefundedTickets(refundedTickets() + other.refundedTickets()); + result.setSalesRevenue(salesRevenue() + other.salesRevenue()); + result.setRefundExpenses(refundExpenses() + other.refundExpenses()); + return result; +} + +TicketSalesReportWidget::SalesData & +TicketSalesReportWidget::SalesData::operator+=(const SalesData &other) { + *this = std::move(*this + other); + return *this; +} + +TicketSalesReportWidget::TicketSalesReportWidget(QWidget *parent) + : QWidget(parent) { + setupUi(this); + + initializeRepositories(); + initializeChart(); + setupChart(); // After initialize chart + setupConnections(); +} + +void TicketSalesReportWidget::configureReportForGenre() { + TableInfoSQLite tableInfo("genres"); + columnInfoIndex_ = tableInfo.columnIndex("genre_name"); + + configureEntityFinder( + "genres", EntityFinderWidget::tr("Select genre"), + EntityFinderWidget::tr("Here will be information about selected genre")); + + sessionsStatisticsMethod_ = + std::bind(&SessionsStatisticsRepository::getSessionsForGenre, + sessionsStatisticsRepository, + std::placeholders::_1, // entityId + std::placeholders::_2, // startDate + std::placeholders::_3, // endDate + std::placeholders::_4 // sessions + ); + + billetChartTitle_ = tr("Popularity of Genre: Name: \"%1\""); + seriesName_ = tr("Tickets Sold"); + yAxisTitle_ = tr("Number of Tickets Sold"); +} + +void TicketSalesReportWidget::configureReportForHall() { + TableInfoSQLite tableInfo("halls"); + columnInfoIndex_ = tableInfo.columnIndex("hall_name"); + + configureEntityFinder( + "halls", EntityFinderWidget::tr("Select hall"), + EntityFinderWidget::tr("Here will be information about selected hall")); + + sessionsStatisticsMethod_ = + std::bind(&SessionsStatisticsRepository::getSessionsForHall, + sessionsStatisticsRepository, + std::placeholders::_1, // entityId + std::placeholders::_2, // startDate + std::placeholders::_3, // endDate + std::placeholders::_4 // sessions + ); + + billetChartTitle_ = tr("Attendance for Hall: Name: \"%1\""); + seriesName_ = tr("Visitors"); + yAxisTitle_ = tr("Number of Visitors"); +} + +void TicketSalesReportWidget::configureReportForMovie() { + TableInfoSQLite tableInfo("movies"); + columnInfoIndex_ = tableInfo.columnIndex("title"); + + configureEntityFinder( + "movies", EntityFinderWidget::tr("Select movie"), + EntityFinderWidget::tr("Here will be information about selected movie")); + + sessionsStatisticsMethod_ = + std::bind(&SessionsStatisticsRepository::getSessionsForMovie, + sessionsStatisticsRepository, + std::placeholders::_1, // entityId + std::placeholders::_2, // startDate + std::placeholders::_3, // endDate + std::placeholders::_4 // sessions + ); + + billetChartTitle_ = tr("Tickets Sold for Movie: Title: \"%1\""); + seriesName_ = tr("Tickets Sold"); + yAxisTitle_ = tr("Number of Tickets Sold"); +} + +void TicketSalesReportWidget::initializeRepositories() { + RepositoryManager &repositoryManager = RepositoryManager::instance(); + SchemaMetadata metadata = SchemaMetadata::defaultSchema(); + + sessionsStatisticsRepository = + repositoryManager.getRepositoryAs( + metadata.repositoryTableName("sessions_statistics")); + + if (!bool(sessionsStatisticsRepository)) { + qFatal() << "TicketSalesReportWidget::initializeRepositories: Failed to " + "initialize repositories"; + } +} + +void TicketSalesReportWidget::initializeChart() { + chartView_ = new QChartView(this); + chartView_->setRenderHint(QPainter::Antialiasing); +} + +void TicketSalesReportWidget::setupChart() { + frameChart->layout()->addWidget(chartView_); +} + +void TicketSalesReportWidget::setupConnections() { + connect(btnGenerate, &QPushButton::clicked, this, + &TicketSalesReportWidget::onPushButtonGenerateClicked); + + connect(entityFinder, &EntityFinderWidget::fieldRetrieved, this, + &TicketSalesReportWidget::onFieldRetrieved); + + connect(entityFinder, &EntityFinderWidget::reseted, this, + &TicketSalesReportWidget::onEntityFinderReseted); + + connect(entityFinder, &EntityFinderWidget::recordRetrieved, this, + &TicketSalesReportWidget::onRecordRetrieved); +} + +void TicketSalesReportWidget::configureEntityFinder( + const QString &databaseTableName, const QString &labelText, + const QString &placeholder) { + entityFinder->setDefaultRelation(databaseTableName); + entityFinder->setLabelText(labelText); + entityFinder->setLineEditPlaceholder(placeholder); +} + +void TicketSalesReportWidget::onEntityFinderReseted() { + selectedEntityId_ = -1; + chartView_->setChart(new QChart()); +} + +void TicketSalesReportWidget::onPushButtonGenerateClicked() { + if (!dateRange(startRange_, endRange_)) { + QMessageBox::QMessageBox::warning(this, QMessageBox::tr("Error"), + QMessageBox::tr("Invalid date range")); + return; + } + + QVector sessions; + RepositoryResult result = retrieveSessions(sessions); + if (!result.success) { + ErrorDialog::displayError(this, result.errorMessage); + return; + } + + if (sessions.isEmpty()) { + QMessageBox::warning(this, QMessageBox::tr("Error"), + QMessageBox::tr("No sessions found between %1 and %2.") + .arg(startRange_.toString("dd.MM.yyyy")) + .arg(endRange_.toString("dd.MM.yyyy"))); + return; + } + + createChart(aggregateByDateTime(sessions)); +} + +void TicketSalesReportWidget::onFieldRetrieved(const QSqlField &field) { + selectedEntityId_ = field.value().toInt(); + chartView_->setChart(new QChart()); +} + +void TicketSalesReportWidget::onRecordRetrieved(const QSqlRecord &rowValues) { + QString columnInfoValue = rowValues.value(columnInfoIndex_).toString(); + chartTitle_ = billetChartTitle_.arg(columnInfoValue); +} + +QMap +TicketSalesReportWidget::aggregateByDateTime( + const QVector &sessions, + std::function filter) { + + QMap accamulatedSalesData; + + for (const SessionStatisticsDTO &session : sessions) { + if (!filter || filter(session)) { + QDateTime dateTime = session.beginAt(); + + SalesData buffer; + buffer.setRefundExpenses(session.refundExpenses()); + buffer.setRefundedTickets(session.refundedTickets()); + buffer.setSalesRevenue(session.salesRevenue()); + buffer.setSoldTickets(session.soldTickets()); + buffer.setMaximumTickets(session.totalSeats()); + + accamulatedSalesData[dateTime] += buffer; + } + } + + return accamulatedSalesData; +}; + +QAbstractAxis *TicketSalesReportWidget::createDateTimeAxis( + int tickCount, const QString &axisTitle, const QDateTime &minDate, + const QDateTime &maxDate) const { + QDateTimeAxis *axisX = new QDateTimeAxis(); + axisX->setTitleText(axisTitle); + axisX->setFormat("dd.MM.yyyy"); + axisX->setTickCount(tickCount); + axisX->setRange(minDate, maxDate); + return axisX; +} + +QAbstractAxis * +TicketSalesReportWidget::createValueAxis(int maxValue, + const QString &axisTitle) const { + QValueAxis *axisY = new QValueAxis(); + axisY->setTitleText(axisTitle); + axisY->setLabelFormat("%d"); + axisY->setRange(0, maxValue); + return axisY; +} + +bool TicketSalesReportWidget::validateData( + const QMap &data) const { + if (!data.isEmpty()) { + return true; + } + + qWarning() << "No data for chart:" << chartTitle_; + + // QMessageBox::warning(this, QMessageBox::tr("Error"), + // QMessageBox::tr("No data for chart")); + + return false; +} + +RepositoryResult TicketSalesReportWidget::retrieveSessions( + QVector &sessions) { + RepositoryResult result = + sessionsStatisticsMethod_(selectedEntityId_, std::cref(startRange_), + std::cref(endRange_), std::ref(sessions)); + return result; +} + +bool TicketSalesReportWidget::dateRange(QDateTime &startOut, + QDateTime &endOut) { + startOut = dateTimeEditStartOfPeriod->dateTime(); + endOut = dateTimeEditEndOfPeriod->dateTime(); + return endOut > startOut; +} + +void TicketSalesReportWidget::createChart( + const QMap &data) { + if (!validateData(data)) { + return; + } + + QDateTime minDate, maxDate; + int tickCount = data.size(); + if (tickCount > 10) { + tickCount = 10; + } + + QChart *chart = new QChart(); + chart->setTitle(chartTitle_); + + QAbstractSeries *maximumTicketsSeries = + createScatterSeries(data, minDate, maxDate, &SalesData::maximumTickets, + tr("Maximum Tickets")); + QAbstractSeries *soldTicketsSeries = createScatterSeries( + data, minDate, maxDate, &SalesData::soldTickets, tr("Sold Tickets")); + QAbstractSeries *refundedTicketsSeries = + createScatterSeries(data, minDate, maxDate, &SalesData::refundedTickets, + tr("Refunded Tickets")); + QAbstractSeries *salesRevenueSeries = createScatterSeries( + data, minDate, maxDate, &SalesData::salesRevenue, tr("Sales Revenue")); + QAbstractSeries *refundExpensesSeries = + createScatterSeries(data, minDate, maxDate, &SalesData::refundExpenses, + tr("Refund Expenses")); + + chart->addSeries(maximumTicketsSeries); + chart->addSeries(soldTicketsSeries); + chart->addSeries(refundedTicketsSeries); + chart->addSeries(salesRevenueSeries); + chart->addSeries(refundExpensesSeries); + + QAbstractAxis *axisX = + createDateTimeAxis(tickCount, tr("Date"), minDate, maxDate); + chart->addAxis(axisX, Qt::AlignBottom); + + double maxMoneyValue = std::max({maxValue(data, &SalesData::refundExpenses), + maxValue(data, &SalesData::salesRevenue)}); + QAbstractAxis *axisYMoney = createValueAxis(maxMoneyValue, tr("Money")); + chart->addAxis(axisYMoney, Qt::AlignLeft); + + int maxTickets = maxValue(data, &SalesData::maximumTickets); + + QAbstractAxis *axisYTickets = createValueAxis(maxTickets, tr("Tickets")); + chart->addAxis(axisYTickets, Qt::AlignRight); + + qDebug() << "Maximum movey Value" << maxMoneyValue << "maxTickets" + << maxTickets; + + maximumTicketsSeries->attachAxis(axisYTickets); + refundedTicketsSeries->attachAxis(axisYTickets); + soldTicketsSeries->attachAxis(axisYTickets); + + refundExpensesSeries->attachAxis(axisYMoney); + salesRevenueSeries->attachAxis(axisYMoney); + + maximumTicketsSeries->attachAxis(axisX); + refundExpensesSeries->attachAxis(axisX); + refundedTicketsSeries->attachAxis(axisX); + salesRevenueSeries->attachAxis(axisX); + soldTicketsSeries->attachAxis(axisX); + + updateChartView(chart); +} + +void TicketSalesReportWidget::setupChart(QChart *chart, QAbstractSeries *series, + QAbstractAxis *axisX, + QAbstractAxis *axisY) const { + chart->addSeries(series); + chart->addAxis(axisX, Qt::AlignBottom); + chart->addAxis(axisY, Qt::AlignLeft); + series->attachAxis(axisX); + series->attachAxis(axisY); +} + +void TicketSalesReportWidget::updateChartView(QChart *chart) const { + chartView_->setChart(chart); + chartView_->setRenderHint(QPainter::Antialiasing); +} diff --git a/ui/widgets/ticket_sales_report_widget.h b/ui/widgets/ticket_sales_report_widget.h new file mode 100644 index 0000000..b047f4f --- /dev/null +++ b/ui/widgets/ticket_sales_report_widget.h @@ -0,0 +1,209 @@ +#ifndef TICKET_SALES_REPORT_WIDGET_H +#define TICKET_SALES_REPORT_WIDGET_H + +#include "ui_ticket_sales_report_widget.h" + +#include +#include +#include +#include + +// Forward declaration +class RepositoryResult; +class SessionStatisticsDTO; +class RepositoriesInterface; +class SessionsStatisticsRepository; + +class TicketSalesReportWidget : public QWidget, + private Ui::TicketSalesReportWidget { + Q_OBJECT + +private: + class SalesData { + private: + double refundExpenses_; + double salesRevenue_; + qint32 refundedTickets_; + qint32 soldTickets_; + qint32 maximumTickets_; + + public: + SalesData(); + explicit SalesData(double refundExpenses, double salesRevenue, + qint32 refundedTickets, qint32 soldTickets, + qint32 maximumTickets); + + SalesData &operator+=(const SalesData &other); + SalesData operator+(const SalesData &other) const; + + // clang-format off + inline double refundExpenses() const { return refundExpenses_; }; + inline double salesRevenue() const { return salesRevenue_; }; + inline qint32 refundedTickets() const { return refundedTickets_; }; + inline qint32 soldTickets() const { return soldTickets_; }; + inline qint32 maximumTickets() const { return maximumTickets_; }; + inline void setRefundExpenses(double refundExpenses) { refundExpenses_ = refundExpenses; }; + inline void setRefundedTickets(qint32 refundedTickets) { refundedTickets_ = refundedTickets; }; + inline void setSalesRevenue(double salesRevenue) { salesRevenue_ = salesRevenue; }; + inline void setSoldTickets(qint32 soldTickets) { soldTickets_ = soldTickets; }; + inline void setMaximumTickets(qint32 maximumTickets) { maximumTickets_ = maximumTickets; }; + // clang-format on + }; + +private: + using GetSessionsForEntityByIdMethod = std::function startDate, + std::optional endDate, + QVector &sessions)>; + +private: + GetSessionsForEntityByIdMethod sessionsStatisticsMethod_; + QChartView *chartView_; + QDateTime startRange_, endRange_; + QString billetChartTitle_, chartTitle_, seriesName_, yAxisTitle_; + SessionsStatisticsRepository *sessionsStatisticsRepository; + int columnInfoIndex_; + qint32 selectedEntityId_; + +public: + explicit TicketSalesReportWidget(QWidget *parent = nullptr); + + void configureReportForGenre(); + void configureReportForHall(); + void configureReportForMovie(); + +private: + void initializeChart(); + void initializeRepositories(); + void setupChart(); + void setupConnections(); + + void configureEntityFinder(const QString &databaseTableName, + const QString &labelText, + const QString &placeholder); + +private slots: + void onEntityFinderReseted(); + void onPushButtonGenerateClicked(); + void onFieldRetrieved(const QSqlField &field); + void onRecordRetrieved(const QSqlRecord &rowValues); + +private: + template + SeriesType * + createSeriesTemplate(const QMap &accumulatedSalesData, + QDateTime &minDate, QDateTime &maxDate, + T (SalesData::*getter)() const, + const QString &seriesName); + + template + QAbstractSeries * + createLineSeries(const QMap &accumulatedSalesData, + QDateTime &minDate, QDateTime &maxDate, + T (SalesData::*getter)() const, const QString &seriesName); + + template + QAbstractSeries * + createScatterSeries(const QMap &accumulatedSalesData, + QDateTime &minDate, QDateTime &maxDate, + T (SalesData::*getter)() const, + const QString &seriesName); + + template + T maxValue(const QMap &data, + T (SalesData::*getter)() const); + +private: + QMap aggregateByDateTime( + const QVector &sessions, + std::function filter = {}); + + QAbstractAxis *createDateTimeAxis(int tickCount, const QString &axisTitle, + const QDateTime &minDate, + const QDateTime &maxDate) const; + + QAbstractAxis *createValueAxis(int maxValue, const QString &axisTitle) const; + + RepositoryResult retrieveSessions(QVector &sessions); + + bool dateRange(QDateTime &startOut, QDateTime &endOut); + + bool validateData(const QMap &data) const; + + void createChart(const QMap &data); + + void setupChart(QChart *chart, QAbstractSeries *series, QAbstractAxis *axisX, + QAbstractAxis *axisY) const; + + void updateChartView(QChart *chart) const; +}; + +template +SeriesType *TicketSalesReportWidget::createSeriesTemplate( + const QMap &accumulatedSalesData, QDateTime &minDate, + QDateTime &maxDate, T (SalesData::*getter)() const, + const QString &seriesName) { + + auto *series = new SeriesType(); + series->setName(seriesName); + + bool first = true; + + for (auto it = accumulatedSalesData.cbegin(); + it != accumulatedSalesData.cend(); ++it) { + const QDateTime &dateTime = it.key(); + + series->append(dateTime.toMSecsSinceEpoch(), (it.value().*getter)()); + + if (first) { + minDate = dateTime; + maxDate = dateTime; + first = false; + } else { + if (dateTime < minDate) + minDate = dateTime; + if (dateTime > maxDate) + maxDate = dateTime; + } + } + + return series; +} + +template +QAbstractSeries *TicketSalesReportWidget::createScatterSeries( + const QMap &accumulatedSalesData, QDateTime &minDate, + QDateTime &maxDate, T (SalesData::*getter)() const, + const QString &seriesName) { + + return createSeriesTemplate(accumulatedSalesData, minDate, + maxDate, getter, seriesName); +} + +template +QAbstractSeries *TicketSalesReportWidget::createLineSeries( + const QMap &accumulatedSalesData, QDateTime &minDate, + QDateTime &maxDate, T (SalesData::*getter)() const, + const QString &seriesName) { + + return createSeriesTemplate(accumulatedSalesData, minDate, + maxDate, getter, seriesName); +} + +template +T TicketSalesReportWidget::maxValue(const QMap &data, + T (SalesData::*getter)() const) { + if (data.isEmpty()) { + return T{}; + } + + T maxValue = (data.cbegin().value().*getter)(); + + for (auto it = data.cbegin(); it != data.cend(); ++it) { + maxValue = std::max(maxValue, (it.value().*getter)()); + } + + return maxValue; +} + +#endif // TICKET_SALES_REPORT_WIDGET_H diff --git a/ui/widgets/ticket_sales_report_widget.ui b/ui/widgets/ticket_sales_report_widget.ui new file mode 100644 index 0000000..d7246b3 --- /dev/null +++ b/ui/widgets/ticket_sales_report_widget.ui @@ -0,0 +1,80 @@ + + + TicketSalesReportWidget + + + + 0 + 0 + 316 + 125 + + + + + + + QFrame::Shape::StyledPanel + + + QFrame::Shadow::Raised + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + + + + + Start of the period: + + + + + + + End of the period: + + + + + + + + + + + + + Generate + + + + + + + + EntityFinderWidget + QWidget +
entity_finder_widget.h
+ 1 +
+
+ + +