diff --git a/DataBaseLMS/databaselms.cpp b/DataBaseLMS/databaselms.cpp index 257886f..719c1f3 100644 --- a/DataBaseLMS/databaselms.cpp +++ b/DataBaseLMS/databaselms.cpp @@ -481,12 +481,46 @@ int DataBaseLMS::updateTaskAMM(TaskAmmFim task) int DataBaseLMS::deleteTaskAMM(int id_task) { - QString queryStr = QString("DELETE FROM public.tasks_amm " + QString queryStr; + bool resBool = false; + int id_trainee = 0; + + resBool = db->transaction(); + + queryStr = QString("SELECT trainees.trainee_id " + "FROM public.trainees JOIN public.tasks_amm ON trainees.trainee_id = tasks_amm.trainee_task " + "WHERE tasks_amm.task_id = %1 " + "ORDER BY trainees.trainee_id ASC").arg( + QString::number(id_task)); + + QSqlQuery query = QSqlQuery(*db); + + if(queryExec(queryStr, &query)) + { + if (query.first()) + {//Обучаемый + id_trainee = query.value(0).toInt(); + } + } + if(!id_trainee) + { + resBool = db->rollback(); + return 0; + } + + queryStr = QString("DELETE FROM public.tasks_amm " "WHERE task_id = %1 " "RETURNING tasks_amm.task_id").arg( QString::number(id_task)); - return queryExecInt(queryStr); + if(!queryExecInt(queryStr)) + { + resBool = db->rollback(); + return 0; + } + + resBool = db->commit(); + return id_trainee; } QList DataBaseLMS::selectTasksAMMofTrainee(int id_trainee) @@ -577,13 +611,57 @@ int DataBaseLMS::updateTaskFIM(TaskAmmFim task) int DataBaseLMS::deleteTaskFIM(int id_task) { - //TODO доделать удаление malfunction - QString queryStr = QString("DELETE FROM public.tasks_fim " + QString queryStr; + bool resBool = false; + int id_trainee = 0; + + resBool = db->transaction(); + + queryStr = QString("SELECT trainees.trainee_id " + "FROM public.trainees JOIN public.tasks_fim ON trainees.trainee_id = tasks_fim.trainee_task " + "WHERE tasks_fim.task_id = %1 " + "ORDER BY trainees.trainee_id ASC").arg( + QString::number(id_task)); + + QSqlQuery query = QSqlQuery(*db); + + if(queryExec(queryStr, &query)) + { + if (query.first()) + {//Обучаемый + id_trainee = query.value(0).toInt(); + } + } + if(!id_trainee) + { + resBool = db->rollback(); + return 0; + } + + queryStr = QString("DELETE FROM public.malfunctions " + "WHERE task_fim_malf = %1 ").arg( + QString::number(id_task)); + + QSqlQuery query1 = QSqlQuery(*db); + if(!queryExec(queryStr, &query1)) + { + resBool = db->rollback(); + return 0; + } + + queryStr = QString("DELETE FROM public.tasks_fim " "WHERE task_id = %1 " "RETURNING tasks_fim.task_id").arg( QString::number(id_task)); - return queryExecInt(queryStr); + if(!queryExecInt(queryStr)) + { + resBool = db->rollback(); + return 0; + } + + resBool = db->commit(); + return id_trainee; } QList DataBaseLMS::selectTasksFIMofTrainee(int id_trainee) diff --git a/DataBaseLMS/typeQueryToDB.h b/DataBaseLMS/typeQueryToDB.h index d534b0c..215a523 100644 --- a/DataBaseLMS/typeQueryToDB.h +++ b/DataBaseLMS/typeQueryToDB.h @@ -17,7 +17,10 @@ enum TypeQueryToDB{ TYPE_QUERY_ASSIGN_TASK_AMM_TO_TRAINEE, TYPE_QUERY_ASSIGN_TASK_FIM_TO_TRAINEE, TYPE_QUERY_GET_TASKS_AMM_FOR_TRAINEE, - TYPE_QUERY_GET_TASKS_FIM_FOR_TRAINEE + TYPE_QUERY_GET_TASKS_FIM_FOR_TRAINEE, + + TYPE_QUERY_DELETE_TASK_AMM_TO_TRAINEE, + TYPE_QUERY_DELETE_TASK_FIM_TO_TRAINEE }; #endif // TYPEQUERYTODB_H diff --git a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp index 35ee461..dd74f12 100644 --- a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp @@ -50,6 +50,10 @@ AMMtasksWidget::AMMtasksWidget(ConnectorToServer* connectorToServer, TypeList ty waitAnimationWidget->initialize(movie,this); waitAnimationWidget->moveToThread(threadAnimation); threadAnimation->start(); + + ui->btnDelete->setEnabled(false); + if(type == TypeList::listCommon) + ui->btnDelete->setVisible(false); } AMMtasksWidget::~AMMtasksWidget() @@ -107,7 +111,14 @@ void AMMtasksWidget::changeEvent(QEvent *event) void AMMtasksWidget::on_treeWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous) { if(current == nullptr) + { + ui->btnDelete->setEnabled(false); return; + } + else + { + ui->btnDelete->setEnabled(true); + } int id = current->text(ColumnsTree::clmn_ID).toInt(); @@ -274,3 +285,23 @@ void AMMtasksWidget::slot_AssignTaskAMMtoTrainee() } } } + +void AMMtasksWidget::on_btnDelete_clicked() +{ + QTreeWidgetItem *treeItemCurrent = treeWidget->currentItem(); + + if(treeItemCurrent != nullptr) + { + QTreeWidgetItem *treeItemParent = treeItemCurrent->parent(); + if(treeItemParent == nullptr) + {//Выбрана задача + + int id = treeItemCurrent->text(ColumnsTree::clmn_ID).toInt(); + + if(QMessageBox::warning(this, tr("Attention!"), tr("The deletion will be irrevocable.\nDelete it anyway?"), QMessageBox::Ok, QMessageBox::Cancel) == QMessageBox::Ok) + { + connectorToServer->sendQueryToDB(TypeQueryToDB::TYPE_QUERY_DELETE_TASK_AMM_TO_TRAINEE, id); + } + } + } +} diff --git a/InstructorsAndTrainees/tasks/ammtaskswidget.h b/InstructorsAndTrainees/tasks/ammtaskswidget.h index c4f60d8..ede4bf9 100644 --- a/InstructorsAndTrainees/tasks/ammtaskswidget.h +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.h @@ -48,6 +48,8 @@ private Q_SLOTS: void on_treeWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous); void on_btnUpdateTasks_clicked(); + void on_btnDelete_clicked(); + public Q_SLOTS: void slot_AssignTaskAMMtoTrainee(); diff --git a/InstructorsAndTrainees/tasks/ammtaskswidget.ui b/InstructorsAndTrainees/tasks/ammtaskswidget.ui index 655045c..fe61646 100644 --- a/InstructorsAndTrainees/tasks/ammtaskswidget.ui +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.ui @@ -21,7 +21,18 @@ - + + + + + + + + Delete + + + + diff --git a/InstructorsAndTrainees/tasks/fimtaskswidget.cpp b/InstructorsAndTrainees/tasks/fimtaskswidget.cpp index 62a25fa..35e05e2 100644 --- a/InstructorsAndTrainees/tasks/fimtaskswidget.cpp +++ b/InstructorsAndTrainees/tasks/fimtaskswidget.cpp @@ -41,6 +41,10 @@ FIMtasksWidget::FIMtasksWidget(ConnectorToServer* connectorToServer, TypeList ty waitAnimationWidget->initialize(movie,this); waitAnimationWidget->moveToThread(threadAnimation); threadAnimation->start(); + + ui->btnDelete->setEnabled(false); + if(type == TypeList::listCommon) + ui->btnDelete->setVisible(false); } FIMtasksWidget::~FIMtasksWidget() @@ -94,7 +98,10 @@ void FIMtasksWidget::changeEvent(QEvent *event) void FIMtasksWidget::on_treeWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous) { if(current == nullptr) + { + ui->btnDelete->setEnabled(false); return; + } QString code = ""; @@ -108,10 +115,14 @@ void FIMtasksWidget::on_treeWidget_currentItemChanged(QTreeWidgetItem *current, code = task->title; accessAssignTask = true; + + ui->btnDelete->setEnabled(true); } else { accessAssignTask = false; + + ui->btnDelete->setEnabled(false); } Q_EMIT signal_currentItemChanged(); @@ -412,3 +423,23 @@ void FIMtasksWidget::slot_AssignTaskFIMtoTrainee() updateTaskItem(current); } } + +void FIMtasksWidget::on_btnDelete_clicked() +{ + QTreeWidgetItem *treeItemCurrent = treeWidget->currentItem(); + + if(treeItemCurrent != nullptr) + { + QTreeWidgetItem *treeItemParent = treeItemCurrent->parent(); + if(treeItemParent == nullptr) + {//Выбрана задача + + int id = treeItemCurrent->text(ColumnsTree::clmn_ID).toInt(); + + if(QMessageBox::warning(this, tr("Attention!"), tr("The deletion will be irrevocable.\nDelete it anyway?"), QMessageBox::Ok, QMessageBox::Cancel) == QMessageBox::Ok) + { + connectorToServer->sendQueryToDB(TypeQueryToDB::TYPE_QUERY_DELETE_TASK_FIM_TO_TRAINEE, id); + } + } + } +} diff --git a/InstructorsAndTrainees/tasks/fimtaskswidget.h b/InstructorsAndTrainees/tasks/fimtaskswidget.h index aae604d..1c36d65 100644 --- a/InstructorsAndTrainees/tasks/fimtaskswidget.h +++ b/InstructorsAndTrainees/tasks/fimtaskswidget.h @@ -51,6 +51,8 @@ private Q_SLOTS: void on_treeWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous); void on_btnUpdateTasks_clicked(); + void on_btnDelete_clicked(); + public Q_SLOTS: void slot_AssignTaskFIMtoTrainee(); diff --git a/InstructorsAndTrainees/tasks/fimtaskswidget.ui b/InstructorsAndTrainees/tasks/fimtaskswidget.ui index fd932dc..c5d9089 100644 --- a/InstructorsAndTrainees/tasks/fimtaskswidget.ui +++ b/InstructorsAndTrainees/tasks/fimtaskswidget.ui @@ -15,7 +15,18 @@ - + + + + + + + + Delete + + + + diff --git a/ServerLMS/Systems/processingsystem.cpp b/ServerLMS/Systems/processingsystem.cpp index 09d7415..b30998a 100644 --- a/ServerLMS/Systems/processingsystem.cpp +++ b/ServerLMS/Systems/processingsystem.cpp @@ -343,6 +343,66 @@ void ProcessingSystem::processingClientQueryToDB(ClientHandler *client, ClientQu break; } + + case TypeQueryToDB::TYPE_QUERY_DELETE_TASK_AMM_TO_TRAINEE: + { + int id_trainee = providerDBLMS->delTaskAMM(id); + if(id_trainee) + { + QList listTasks = providerDBLMS->GetListTasksAMMofTrainee(id_trainee); + arrayAnswer = dataParser->DbAnswer()->listTasksAMMofTrainee(true, &listTasks, id_trainee); + client->sendXmlAnswer(arrayAnswer, PacketType::TYPE_XMLANSWER_QUERY_TASKS_AMM_FOR_TRAINEE); + + //Отправка списка задач AMM клиенту Юнити + QString login = providerDBLMS->getLoginTraineeById(id_trainee); + //Проходим все открытые сокеты, ищем нужный + foreach(int idSocket, server->getClientsMap().keys()) + { + ClientHandler *handler = server->getClientsMap().value(idSocket); + if(handler->getClient()->getLogin() == login) + { + if(handler->getClient()->getIsUnity()) + {//Отправляем ему + //AMM + QList listTasksAMM = providerDBLMS->GetListTasksAMMofTrainee(id_trainee); + QByteArray arrayAnswerTasksAMM = dataParser->DbAnswer()->listTasksAMMofTrainee(true, &listTasksAMM, id_trainee); + handler->sendXmlAnswer(arrayAnswerTasksAMM, PacketType::TYPE_XMLANSWER_QUERY_TASKS_AMM_FOR_TRAINEE); + } + } + } + } + break; + } + + case TypeQueryToDB::TYPE_QUERY_DELETE_TASK_FIM_TO_TRAINEE: + { + int id_trainee = providerDBLMS->delTaskFIM(id); + if(id_trainee) + { + QList listTasks = providerDBLMS->GetListTasksFIMofTrainee(id_trainee); + arrayAnswer = dataParser->DbAnswer()->listTasksFIMofTrainee(true, &listTasks, id_trainee); + client->sendXmlAnswer(arrayAnswer, PacketType::TYPE_XMLANSWER_QUERY_TASKS_FIM_FOR_TRAINEE); + + //Отправка списка задач FIM клиенту Юнити + QString login = providerDBLMS->getLoginTraineeById(id_trainee); + //Проходим все открытые сокеты, ищем нужный + foreach(int idSocket, server->getClientsMap().keys()) + { + ClientHandler *handler = server->getClientsMap().value(idSocket); + if(handler->getClient()->getLogin() == login) + { + if(handler->getClient()->getIsUnity()) + {//Отправляем ему + //FIM + QList listTasksFIM = providerDBLMS->GetListTasksFIMofTrainee(id_trainee); + QByteArray arrayAnswerTasksFIM = dataParser->DbAnswer()->listTasksFIMofTrainee(true, &listTasksFIM, id_trainee); + handler->sendXmlAnswer(arrayAnswerTasksFIM, PacketType::TYPE_XMLANSWER_QUERY_TASKS_FIM_FOR_TRAINEE); + } + } + } + } + break; + } } //client->sendXmlAnswer(arrayAnswer, PacketType::TYPE_XMLANSWER_QUERY_DB_LIST_INSTRUCTORS); @@ -402,15 +462,11 @@ void ProcessingSystem::processingClientNotify(ClientHandler *client, ClientNotif client->getSocket()->flush(); - QStringList listTasks; - //TODO KAV redact - //listTasks = pInstructorsAndTrainees->getDbLMS()->getWhatItDoes(client->getClient()->getLogin()); - - QByteArray arrayAnswer = dataParser->ClientAnswer()->tasks(listTasks); - client->sendXmlAnswer(arrayAnswer); - - QString str = QString(arrayAnswer); - emit sigLogMessage("To Client: " + str); + //QStringList listTasks; + //QByteArray arrayAnswer = dataParser->ClientAnswer()->tasks(listTasks); + //client->sendXmlAnswer(arrayAnswer); + //QString str = QString(arrayAnswer); + //emit sigLogMessage("To Client: " + str); } else if(clientNotify.Code == commandDisableClient) {