From fa34975beedf20abd401bc846f178c99646e1d8a Mon Sep 17 00:00:00 2001 From: krivoshein Date: Tue, 22 Jul 2025 11:20:20 +0300 Subject: [PATCH 1/4] =?UTF-8?q?tasksAMM.xml=20=D0=B7=D0=B0=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=BB=20=D0=BD=D0=B0=20docs.xml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../connectorToServer/Core/recognizesystem.cpp | 4 ++-- InstructorsAndTrainees/tasks/tasktreepreparation.cpp | 6 +++++- ServerLMS/Systems/tools.h | 2 +- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp b/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp index de36320..0fbb331 100644 --- a/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp +++ b/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp @@ -371,7 +371,7 @@ void RecognizeSystem::recognize(QTcpSocket *socket) break; }; - //xml-ответы на запросы AdditionalFiles + //xml-ответы на запросы AdditionalFiles (сигнал о чтении ранее принятого) if(packetType == PacketType::TYPE_XMLANSWER_QUERY_TASKS_XML_FIM || packetType == PacketType::TYPE_XMLANSWER_QUERY_TASKS_XML_AMM) { @@ -381,7 +381,7 @@ void RecognizeSystem::recognize(QTcpSocket *socket) if(packetType == PacketType::TYPE_XMLANSWER_QUERY_TASKS_XML_FIM) xmlFileName = "./" + additionalFilesFolderName + "/tasksFIM.xml"; else - xmlFileName = "./" + additionalFilesFolderName + "/tasksAMM.xml"; + xmlFileName = "./" + additionalFilesFolderName + "/docs.xml"; //"/tasksAMM.xml"; QFile xmlInFile(xmlFileName); if (!xmlInFile.open(QFile::ReadOnly | QFile::Text)) diff --git a/InstructorsAndTrainees/tasks/tasktreepreparation.cpp b/InstructorsAndTrainees/tasks/tasktreepreparation.cpp index e86f688..aaed516 100644 --- a/InstructorsAndTrainees/tasks/tasktreepreparation.cpp +++ b/InstructorsAndTrainees/tasks/tasktreepreparation.cpp @@ -233,7 +233,11 @@ void TaskAMMFIMTreePreparation::domElementParserAMM(QDomElement element, Module* QDomNamedNodeMap nodeMap = childElement.attributes(); - if(name == "pm") + if(name == "doc") + { + module = new PM(); + } + else if(name == "pm") { module = new PM(); PM* PMmodul = static_cast(module); diff --git a/ServerLMS/Systems/tools.h b/ServerLMS/Systems/tools.h index 8d86925..327f37a 100644 --- a/ServerLMS/Systems/tools.h +++ b/ServerLMS/Systems/tools.h @@ -25,7 +25,7 @@ static const QString versionListFile = staticDataFolderName + "/versionList.xml" static const QString hashFileName = staticDataFolderName + "/serverHash.xml"; static const QString buildHashName = staticDataFolderName + "/buildHash.xml"; static const QString buildDataPath = "/Application/" + projectFolderName + "/RRJ_Data/"; -static const QString tasksAMMfileName = "/tasksAmm.xml"; +static const QString tasksAMMfileName = "/docs.xml"; //"/tasksAmm.xml"; static const QString tasksFIMfileName = "/tasksFIM.xml"; static const QString clientHash = staticDataFolderName + "/clientHash.xml"; From fb80ef3de5602550c89c75c2df18c63fe5797278 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Tue, 22 Jul 2025 12:40:16 +0300 Subject: [PATCH 2/4] canplay --- InstructorsAndTrainees/tasks/ammtaskswidget.cpp | 1 + InstructorsAndTrainees/tasks/tasktreepreparation.cpp | 12 +++++++----- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp index 306df53..c07ebd7 100644 --- a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp @@ -64,6 +64,7 @@ AMMtasksWidget::AMMtasksWidget(ConnectorToServer* connectorToServer, TypeListTre ui->horizontalLayout_3->setAlignment(Qt::AlignmentFlag::AlignLeft); ui->btnDelete->setVisible(false); + ui->btnCheck->setVisible(false); } else { diff --git a/InstructorsAndTrainees/tasks/tasktreepreparation.cpp b/InstructorsAndTrainees/tasks/tasktreepreparation.cpp index aaed516..91ebe25 100644 --- a/InstructorsAndTrainees/tasks/tasktreepreparation.cpp +++ b/InstructorsAndTrainees/tasks/tasktreepreparation.cpp @@ -278,11 +278,7 @@ void TaskAMMFIMTreePreparation::domElementParserAMM(QDomElement element, Module* PM* PMmodulParent = static_cast(moduleParent); PMmodulParent->addChildModule(module); - } - - //Активность - if(nodeMap.namedItem("active").nodeValue() == "true") - module->setIsActiveTrue(); + } } else if(name == "rus" || name == "eng") { @@ -302,11 +298,17 @@ void TaskAMMFIMTreePreparation::domElementParserAMM(QDomElement element, Module* DM* DMmodulParent = static_cast(moduleParent); if(name == "rus") + { DMmodulParent->setLangStructRus(nodeMap.namedItem("techName").nodeValue(), nodeMap.namedItem("infoName").nodeValue(), nodeMap.namedItem("pdf").nodeValue(), nodeMap.namedItem("bookmark").nodeValue(), nodeMap.namedItem("xml").nodeValue()); + + //Активность + if(nodeMap.namedItem("canplay").nodeValue() == "1") + DMmodulParent->setIsActiveTrue(); + } else DMmodulParent->setLangStructEng(nodeMap.namedItem("techName").nodeValue(), nodeMap.namedItem("infoName").nodeValue(), From 93d68d8a070ea79529383d335e8716e3d4c2300e Mon Sep 17 00:00:00 2001 From: krivoshein Date: Wed, 23 Jul 2025 12:06:30 +0300 Subject: [PATCH 3/4] =?UTF-8?q?=D0=A7=D0=B0=D1=81=D1=82=D0=B8=D1=87=D0=BD?= =?UTF-8?q?=D0=B0=D1=8F=20=D0=BE=D1=82=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B0?= =?UTF-8?q?=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87=20=D0=B2=20=D0=AE=D0=BD=D0=B8?= =?UTF-8?q?=D1=82=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DOCS/Андрей/Board.md | 2 +- ServerLMS/Systems/Parsers/dbanswerparser.cpp | 12 ++- ServerLMS/Systems/Parsers/dbanswerparser.h | 4 +- ServerLMS/Systems/processingsystem.cpp | 102 +++++++++++++++---- ServerLMS/Systems/processingsystem.h | 4 + 5 files changed, 101 insertions(+), 23 deletions(-) diff --git a/DOCS/Андрей/Board.md b/DOCS/Андрей/Board.md index 6c17ec7..ed06a12 100644 --- a/DOCS/Андрей/Board.md +++ b/DOCS/Андрей/Board.md @@ -14,7 +14,6 @@ kanban-plugin: board ## feature -- [ ] /RRJ-95NEW-100/tasksAMM.xml заменить получение на docs - [ ] отправка таски поштучно, при обновления статуса (проверка и тд) - [ ] регистрация времени включения и выключения тренажера (по приходу уходу пакета is unity) с регистрацие БД - [ ] Подсчет учебного времени - дельта между включением и выключением @@ -32,6 +31,7 @@ kanban-plugin: board (от 18 фимов) или при кривом назначении задачи(назначить 2-3 подряд гуи перестает обновлятся) - [ ] Убрать ошибки QObject::moveToThread: Cannot move objects with a parent +- [ ] /RRJ-95NEW-100/tasksAMM.xml заменить получение на docs ## backlog diff --git a/ServerLMS/Systems/Parsers/dbanswerparser.cpp b/ServerLMS/Systems/Parsers/dbanswerparser.cpp index 078b253..707720e 100644 --- a/ServerLMS/Systems/Parsers/dbanswerparser.cpp +++ b/ServerLMS/Systems/Parsers/dbanswerparser.cpp @@ -102,7 +102,7 @@ QByteArray DBAnswerParser::listClassrooms(bool result, QList *listCla return QByteArray(); } -QByteArray DBAnswerParser::listTasksAMMofTrainee(bool result, QList *listTasks, int trainee_id) +QByteArray DBAnswerParser::listTasksAMMofTrainee(bool result, QList *listTasks, int trainee_id, bool full_list) { QDomDocument commonDOM; if(! dataParser->loadBlankXML(":/resources/blankXML/ListTasksAMM.xml", &commonDOM)) @@ -110,6 +110,10 @@ QByteArray DBAnswerParser::listTasksAMMofTrainee(bool result, QList QDomNode listNode = commonDOM.namedItem("ListTasksAMM"); listNode.toElement().setAttribute("trainee_id", QString::number(trainee_id)); + if(full_list) + listNode.toElement().setAttribute("full_list", "true"); + else + listNode.toElement().setAttribute("full_list", "false"); for(TaskAmmFim task : *listTasks) { @@ -127,7 +131,7 @@ QByteArray DBAnswerParser::listTasksAMMofTrainee(bool result, QList return commonDOM.toByteArray(); } -QByteArray DBAnswerParser::listTasksFIMofTrainee(bool result, QList *listTasks, int trainee_id) +QByteArray DBAnswerParser::listTasksFIMofTrainee(bool result, QList *listTasks, int trainee_id, bool full_list) { QDomDocument commonDOM; if(! dataParser->loadBlankXML(":/resources/blankXML/ListTasksFIM.xml", &commonDOM)) @@ -135,6 +139,10 @@ QByteArray DBAnswerParser::listTasksFIMofTrainee(bool result, QList QDomNode listNode = commonDOM.namedItem("ListTasksFIM"); listNode.toElement().setAttribute("trainee_id", QString::number(trainee_id)); + if(full_list) + listNode.toElement().setAttribute("full_list", "true"); + else + listNode.toElement().setAttribute("full_list", "false"); for(TaskAmmFim task : *listTasks) { diff --git a/ServerLMS/Systems/Parsers/dbanswerparser.h b/ServerLMS/Systems/Parsers/dbanswerparser.h index 64c53e5..8f8e5b0 100644 --- a/ServerLMS/Systems/Parsers/dbanswerparser.h +++ b/ServerLMS/Systems/Parsers/dbanswerparser.h @@ -19,8 +19,8 @@ public: QByteArray listComputers(bool result, QList *listComputers); QByteArray listClassrooms(bool result, QList *listClassrooms); - QByteArray listTasksAMMofTrainee(bool result, QList *listTasks, int trainee_id); - QByteArray listTasksFIMofTrainee(bool result, QList *listTasks, int trainee_id); + QByteArray listTasksAMMofTrainee(bool result, QList *listTasks, int trainee_id, bool full_list); + QByteArray listTasksFIMofTrainee(bool result, QList *listTasks, int trainee_id, bool full_list); signals: private: diff --git a/ServerLMS/Systems/processingsystem.cpp b/ServerLMS/Systems/processingsystem.cpp index d0003f2..aa1f397 100644 --- a/ServerLMS/Systems/processingsystem.cpp +++ b/ServerLMS/Systems/processingsystem.cpp @@ -246,32 +246,40 @@ void ProcessingSystem::processingClientQueryToDB(ClientHandler *client, ClientQu case TypeQueryToDB::TYPE_QUERY_ASSIGN_TASK_AMM_TO_TRAINEE: { - if(int id_new = providerDBLMS->newTaskAMM(*(TaskAmmFim*)data, id)) + int id_trainee = id; + if(int id_new = providerDBLMS->newTaskAMM(*(TaskAmmFim*)data, id_trainee)) { //Отправка списка задач AMM всем клиентам GUI - //sendListTasksAMMofTraineetoClient(client, id); - emit sigStatusTasksAMMofTraineeChanged(id); + //sendListTasksAMMofTraineetoClient(client, id_trainee); + emit sigStatusTasksAMMofTraineeChanged(id_trainee); //Отправка списка задач AMM клиенту Юнити - if(ClientHandler* clientUnity = getUnityClientById(id)) + if(ClientHandler* clientUnity = getUnityClientById(id_trainee)) {//Есть такой - sendListTasksAMMofTraineetoClient(clientUnity, id); + //sendListTasksAMMofTraineetoClient(clientUnity, id_trainee); + QList listID; + listID.append(id_new); + sendListTasksAMMofTraineeByIDtoClient(clientUnity, id_trainee, listID); } } break; } case TypeQueryToDB::TYPE_QUERY_ASSIGN_TASK_FIM_TO_TRAINEE: { - if(int id_new = providerDBLMS->newTaskFIM(*(TaskAmmFim*)data, id)) + int id_trainee = id; + if(int id_new = providerDBLMS->newTaskFIM(*(TaskAmmFim*)data, id_trainee)) { //Отправка списка задач FIM всем клиентам GUI - //sendListTasksFIMofTraineetoClient(client, id); - emit sigStatusTasksFIMofTraineeChanged(id); + //sendListTasksFIMofTraineetoClient(client, id_trainee); + emit sigStatusTasksFIMofTraineeChanged(id_trainee); //Отправка списка задач FIM клиенту Юнити - if(ClientHandler* clientUnity = getUnityClientById(id)) + if(ClientHandler* clientUnity = getUnityClientById(id_trainee)) {//Есть такой - sendListTasksFIMofTraineetoClient(clientUnity, id); + //sendListTasksFIMofTraineetoClient(clientUnity, id_trainee); + QList listID; + listID.append(id_new); + sendListTasksFIMofTraineeByIDtoClient(clientUnity, id_trainee, listID); } } break; @@ -279,14 +287,16 @@ void ProcessingSystem::processingClientQueryToDB(ClientHandler *client, ClientQu case TypeQueryToDB::TYPE_QUERY_GET_TASKS_AMM_FOR_TRAINEE: { + int id_trainee = id; //Отправка списка задач AMM клиенту GUI - sendListTasksAMMofTraineetoClient(client, id); + sendListTasksAMMofTraineetoClient(client, id_trainee); break; } case TypeQueryToDB::TYPE_QUERY_GET_TASKS_FIM_FOR_TRAINEE: { + int id_trainee = id; //Отправка списка задач FIM клиенту GUI - sendListTasksFIMofTraineetoClient(client, id); + sendListTasksFIMofTraineetoClient(client, id_trainee); break; } @@ -356,7 +366,10 @@ void ProcessingSystem::processingClientQueryToDB(ClientHandler *client, ClientQu //Отправка списка задач AMM клиенту Юнити if(ClientHandler* clientUnity = getUnityClientById(id_trainee)) {//Есть такой - sendListTasksAMMofTraineetoClient(clientUnity, id_trainee); + //sendListTasksAMMofTraineetoClient(clientUnity, id_trainee); + QList listID; + listID.append(id); + sendListTasksAMMofTraineeByIDtoClient(clientUnity, id_trainee, listID); } } break; @@ -374,7 +387,10 @@ void ProcessingSystem::processingClientQueryToDB(ClientHandler *client, ClientQu //Отправка списка задач FIM клиенту Юнити if(ClientHandler* clientUnity = getUnityClientById(id_trainee)) {//Есть такой - sendListTasksFIMofTraineetoClient(clientUnity, id_trainee); + //sendListTasksFIMofTraineetoClient(clientUnity, id_trainee); + QList listID; + listID.append(id); + sendListTasksFIMofTraineeByIDtoClient(clientUnity, id_trainee, listID); } } break; @@ -469,7 +485,7 @@ void ProcessingSystem::setCurrentDataInfo(DataInfo *dataInfo) void ProcessingSystem::sendListTasksAMMofTraineetoClient(ClientHandler *client, int id_trainee) { QList listTasks = providerDBLMS->GetListTasksAMMofTrainee(id_trainee); - QByteArray arrayAnswer = dataParser->DbAnswer()->listTasksAMMofTrainee(true, &listTasks, id_trainee); + QByteArray arrayAnswer = dataParser->DbAnswer()->listTasksAMMofTrainee(true, &listTasks, id_trainee, true); //client->sendXmlAnswer(arrayAnswer, PacketType::TYPE_XMLANSWER_QUERY_TASKS_AMM_OF_TRAINEE); client->sendFileBlockByteArray(arrayAnswer, PacketType::TYPE_XMLANSWER_QUERY_TASKS_AMM_OF_TRAINEE); } @@ -477,7 +493,57 @@ void ProcessingSystem::sendListTasksAMMofTraineetoClient(ClientHandler *client, void ProcessingSystem::sendListTasksFIMofTraineetoClient(ClientHandler *client, int id_trainee) { QList listTasks = providerDBLMS->GetListTasksFIMofTrainee(id_trainee); - QByteArray arrayAnswer = dataParser->DbAnswer()->listTasksFIMofTrainee(true, &listTasks, id_trainee); + QByteArray arrayAnswer = dataParser->DbAnswer()->listTasksFIMofTrainee(true, &listTasks, id_trainee, true); + //client->sendXmlAnswer(arrayAnswer, PacketType::TYPE_XMLANSWER_QUERY_TASKS_FIM_OF_TRAINEE); + client->sendFileBlockByteArray(arrayAnswer, PacketType::TYPE_XMLANSWER_QUERY_TASKS_FIM_OF_TRAINEE); +} + +void ProcessingSystem::sendListTasksAMMofTraineeByIDtoClient(ClientHandler *client, int id_trainee, QList listID) +{ + QList listTasks = providerDBLMS->GetListTasksAMMofTrainee(id_trainee); + + for(int i = 0; i < listTasks.count(); i++) + { + TaskAmmFim task = listTasks.at(i); + bool flNeed = false; + for(int id : listID) + { + if(id == task.getID()) + { + flNeed = true; + break; + } + } + if(!flNeed) + listTasks.removeAt(i); + } + + QByteArray arrayAnswer = dataParser->DbAnswer()->listTasksAMMofTrainee(true, &listTasks, id_trainee, false); + //client->sendXmlAnswer(arrayAnswer, PacketType::TYPE_XMLANSWER_QUERY_TASKS_AMM_OF_TRAINEE); + client->sendFileBlockByteArray(arrayAnswer, PacketType::TYPE_XMLANSWER_QUERY_TASKS_AMM_OF_TRAINEE); +} + +void ProcessingSystem::sendListTasksFIMofTraineeByIDtoClient(ClientHandler *client, int id_trainee, QList listID) +{ + QList listTasks = providerDBLMS->GetListTasksFIMofTrainee(id_trainee); + + for(int i = 0; i < listTasks.count(); i++) + { + TaskAmmFim task = listTasks.at(i); + bool flNeed = false; + for(int id : listID) + { + if(id == task.getID()) + { + flNeed = true; + break; + } + } + if(!flNeed) + listTasks.removeAt(i); + } + + QByteArray arrayAnswer = dataParser->DbAnswer()->listTasksFIMofTrainee(true, &listTasks, id_trainee, false); //client->sendXmlAnswer(arrayAnswer, PacketType::TYPE_XMLANSWER_QUERY_TASKS_FIM_OF_TRAINEE); client->sendFileBlockByteArray(arrayAnswer, PacketType::TYPE_XMLANSWER_QUERY_TASKS_FIM_OF_TRAINEE); } @@ -492,12 +558,12 @@ void ProcessingSystem::sendTaskListToUnity(ClientHandler *client) //AMM QList listTasksAMM = providerDBLMS->GetListTasksAMMofTrainee(id_trainee); - QByteArray arrayAnswerTasksAMM = dataParser->DbAnswer()->listTasksAMMofTrainee(true, &listTasksAMM, id_trainee); + QByteArray arrayAnswerTasksAMM = dataParser->DbAnswer()->listTasksAMMofTrainee(true, &listTasksAMM, id_trainee, true); client->sendFileBlockByteArray(arrayAnswerTasksAMM, PacketType::TYPE_XMLANSWER_QUERY_TASKS_AMM_OF_TRAINEE); //FIM QList listTasksFIM = providerDBLMS->GetListTasksFIMofTrainee(id_trainee); - QByteArray arrayAnswerFIM = dataParser->DbAnswer()->listTasksFIMofTrainee(true, &listTasksFIM, id_trainee); + QByteArray arrayAnswerFIM = dataParser->DbAnswer()->listTasksFIMofTrainee(true, &listTasksFIM, id_trainee, true); client->sendFileBlockByteArray(arrayAnswerFIM, PacketType::TYPE_XMLANSWER_QUERY_TASKS_FIM_OF_TRAINEE); } } diff --git a/ServerLMS/Systems/processingsystem.h b/ServerLMS/Systems/processingsystem.h index a09ecdd..0666987 100644 --- a/ServerLMS/Systems/processingsystem.h +++ b/ServerLMS/Systems/processingsystem.h @@ -42,6 +42,10 @@ public: void sendListTasksAMMofTraineetoClient(ClientHandler* client, int id_trainee); void sendListTasksFIMofTraineetoClient(ClientHandler* client, int id_trainee); + + void sendListTasksAMMofTraineeByIDtoClient(ClientHandler* client, int id_trainee, QList listID); + void sendListTasksFIMofTraineeByIDtoClient(ClientHandler* client, int id_trainee, QList listID); + ClientHandler* getUnityClientById(int id); signals: void sigUpdateListClients(); From 18a28dec1c181e50a489ee58026cb69d83d0b83d Mon Sep 17 00:00:00 2001 From: krivoshein Date: Wed, 23 Jul 2025 14:31:54 +0300 Subject: [PATCH 4/4] ref --- DataBaseLMS/databaselms.cpp | 35 +++++++++++++++++++++++++++++++++++ DataBaseLMS/databaselms.h | 2 ++ 2 files changed, 37 insertions(+) diff --git a/DataBaseLMS/databaselms.cpp b/DataBaseLMS/databaselms.cpp index 4ff9bbe..8352676 100644 --- a/DataBaseLMS/databaselms.cpp +++ b/DataBaseLMS/databaselms.cpp @@ -665,6 +665,34 @@ QList DataBaseLMS::selectTasksAMMofTrainee(int id_trainee) return listTasks; } +TaskAmmFim DataBaseLMS::selectTaskAMMbyID(int id_task) +{ + TaskAmmFim task; +/* + QString queryStr = QString("SELECT tasks_amm.task_id, tasks_amm.title, tasks_amm.dm_code, tasks_amm.status, " + "trainees.trainee_id " + "FROM public.tasks_amm JOIN public.trainees ON trainees.trainee_id = tasks_amm.trainee_task " + "WHERE tasks_amm.trainee_task = %1 " + "ORDER BY tasks_amm.task_id ASC").arg( + id_trainee); + + QSqlQuery query = QSqlQuery(*db); + + if(queryExec(queryStr, &query)) + { + if (query.first()) + {//Задача + task.setID(query.value(0).toInt()); + task.ammProcedure.title = query.value(1).toString(); + task.ammProcedure.dmCode = query.value(2).toString(); + task.status = query.value(3).toString(); + } + } + */ + + return task; +} + int DataBaseLMS::insertTaskFIM(TaskAmmFim task, int id_trainee) { QString queryStr; @@ -1035,6 +1063,13 @@ QList DataBaseLMS::selectTasksFIMofTrainee(int id_trainee) return listTasks; } +TaskAmmFim DataBaseLMS::selectTaskFIMbyID(int id_task) +{ + TaskAmmFim task; + + return task; +} + int DataBaseLMS::deleteReportFIM(int task_id) { QString queryStr; diff --git a/DataBaseLMS/databaselms.h b/DataBaseLMS/databaselms.h index 108d92a..b431be4 100644 --- a/DataBaseLMS/databaselms.h +++ b/DataBaseLMS/databaselms.h @@ -71,12 +71,14 @@ protected: int updateStatusTaskAMM(int task_id, QString status); int deleteTaskAMM(int id_task); QList selectTasksAMMofTrainee(int id_trainee); + TaskAmmFim selectTaskAMMbyID(int id_task); //Задача FIM int insertTaskFIM(TaskAmmFim task, int id_trainee); int updateTaskFIM(TaskAmmFim task); int updateStatusTaskFIM(int task_id, QString status); int deleteTaskFIM(int id_task); QList selectTasksFIMofTrainee(int id_trainee); + TaskAmmFim selectTaskFIMbyID(int id_task); int deleteReportFIM(int task_id); int insertReportFIM(TaskAmmFim task);