From 9d23abe7c98a3c1ffa54eeec2f1fea6b9b2602f6 Mon Sep 17 00:00:00 2001 From: evarisk-kilyan Date: Tue, 29 Jul 2025 10:26:52 +0200 Subject: [PATCH] #2219 [ActionDigiquali] fix: used question used in mass action --- class/actions_digiquali.class.php | 20 ++++- langs/fr_FR/digiquali.lang | 133 +++++++++++++++--------------- view/question/question_list.php | 16 ++++ 3 files changed, 102 insertions(+), 67 deletions(-) diff --git a/class/actions_digiquali.class.php b/class/actions_digiquali.class.php index ea62dc23..d1384b99 100644 --- a/class/actions_digiquali.class.php +++ b/class/actions_digiquali.class.php @@ -743,7 +743,25 @@ public function doPreMassActions(array $parameters): int $formQuestion = [ ['type' => 'select', 'name' => 'sheet', 'label' => $langs->trans('Sheet'), 'values' => $sheetArray, 'morecss' => 'maxwidth300 maxwidth200onsmartphone'] ]; - $this->resprints = $form->formconfirm($_SERVER['PHP_SELF'], $langs->trans('ConfirmMassAddQuestion'), $langs->trans('ConfirmMassAddingQuestion', count($parameters['toselect'])), 'add_questions', $formQuestion, '', 0, 200, 500, 1); + + $numberOfQuestions = count($parameters['toselect']); + + $elementElements = []; + $sql = "SELECT fk_target FROM llx_element_element WHERE targettype = 'digiquali_question'"; + $resql = $this->db->query($sql); + if ($resql) { + $num_prods = $this->db->num_rows($resql); + $i = 0; + while ($i < $num_prods) { + $i++; + + $row = $this->db->fetch_row($resql); + $elementElements[] = $row[0]; + } + } + $parameters['toselect'] = array_diff($parameters['toselect'], $elementElements); + $newNumberOfQuestions = count($parameters['toselect']); + $this->resprints = $form->formconfirm($_SERVER['PHP_SELF'], $langs->trans('ConfirmMassAddQuestion'), $numberOfQuestions - $newNumberOfQuestions > 0 ? $langs->trans('ConfirmMassAddingQuestionAlreadyAffected', $newNumberOfQuestions, $numberOfQuestions - $newNumberOfQuestions) : $langs->trans('ConfirmMassAddingQuestion', $newNumberOfQuestions) , 'add_questions', $formQuestion, '', 0, 200, 500, 1); } else { setEventMessages('' . $langs->transnoentities('ObjectNotFound', img_picto('', $sheet->picto, 'class="paddingrightonly"') . $langs->transnoentities(ucfirst($sheet->element))) . '', [], 'warnings'); } diff --git a/langs/fr_FR/digiquali.lang b/langs/fr_FR/digiquali.lang index 581b4af1..b9fed73b 100644 --- a/langs/fr_FR/digiquali.lang +++ b/langs/fr_FR/digiquali.lang @@ -81,72 +81,73 @@ AnswerPublicInterfaceShowTitleDescription = Permet d'afficher le titre du con # # Data - Donnée -Question = Question -Questions = questions -TheQuestion = la question -QuestionList = Liste des questions -SelectMultipleQuestion = Sélectionnez une ou plusieurs questions -NewQuestion = Nouvelle question -ModifyQuestion = Modifier une question -LinkedQuestionsList = Liste des questions liées (%s) -AddQuestionLink = %d Question(s) ajoutée(s) au modèle : -WarningQuestionLink = %d Question(s) déjà dans le modèle : -ConfirmMassAddQuestion = Confirmation d'ajout en masse de questions au modèle -ConfirmMassAddingQuestion = Êtes-vous sur de vouloir ajouter les %d question(s) sélectionnée(s) ? -removeQuestionLink = Question retirée du modèle : -LockQuestion = La question %s est passée au statut verrouillé -LockQuestions = Toutes les questions sélectionnées sont passées au statut verrouillé -ThereAre = Il y a -YouAnswered = Vous avez répondu à -On = sur -BewareQuestionsAnswered = Attention il manque %s réponse(s) -QuestionsCategoriesArea = Espace des tags/catégories des questions -ExtrafieldsQuestionManagement = Gestion des attributs supplémentaires des questions -PhotoOk = Exemple de photo correcte -PhotoKo = Exemple de photo incorrecte -ShowPhoto = Afficher les photos -AuthorizeAnswerPhoto = Autoriser l'envoi de photos sur les réponses -ShowPhotoTooltip = Affiche les photos et la bibliothèque de médias sur la question -AuthorizeAnswerPhotoTooltip = Autorise l'envoi de photos sur les réponses de question -NoteControl = Note publique -EnterComment = Saisir les commentaires -EnterCommentTooltip = Saisit le commentaire sur les réponses de question -ErrorQuestionUsedInSheet = La question %s ne peut pas être supprimée, elle est utilisée dans un ou plusieurs modèles. -ErrorNoQuestionSelected = Aucune question sélectionnée -AddQuestionIntoCategory = Assigner cette catégorie à la question -QuestionType = Type de question -AnswersList = Liste des réponses possibles -MultipleChoices = Choix multiples -Text = Texte -UniqueChoice = Choix unique -Range = Valeur numérique -OkKo = Sélecteur OK/KO -OkKoToFixNonApplicable = Sélecteur OK/KO/NA/A réparer -ToFix = A réparer -NonApplicable = NA -Answer = Réponse -EmptyValue = La valeur de la réponse est vide -ErrorCreateAnswer = Une erreur est survenue lors de la création de la réponse -ErrorUpdateAnswer = Une erreur est survenue lors de l'édition de la réponse -ErrorDeleteAnswer = Une erreur est survenue lors de la suppression de la réponse -AnswerCreated = La réponse a été créée avec succès -AnswerUpdated = La réponse a été mise à jour avec succès -AnswerDeleted = La réponse a été supprimée avec succès -AnswerMustBeCreated = La question %s doit avoir au moins une réponse pour passer au statut verrouillé -ShowOnlyQuestionsWithNoAnswer = Afficher uniquement les questions qui n'ont pas de réponse -AveragePercentageQuestions = Moyenne des questions -AddToSheet = Ajouter au modèle -PercentageQuestionStep = Nombre d'étapes du curseur -NumberOfPoints = Nombre de points -Point = Point -Points = Points -AnswerCorrectness = Validité de la réponse -ExpectedAnswer = Réponse correcte -QuestionWithOneCorrectAnswer = Ce type de question n'accepte qu'une seule réponse correcte -AnswerCorrectnessMinBound = Valeur minimale de réponse correcte -AnswerCorrectnessMaxBound = Valeur maximale de réponse correcte -QuestionMinBoundExceeded = La valeur minimale de réponse correcte d'un pourcentage ne peut pas être inférieure à 0 -QuestionMaxBoundExceeded = La valeur minimale de réponse correcte d'un pourcentage ne peut pas être supérieure à 100 +Question = Question +Questions = questions +TheQuestion = la question +QuestionList = Liste des questions +SelectMultipleQuestion = Sélectionnez une ou plusieurs questions +NewQuestion = Nouvelle question +ModifyQuestion = Modifier une question +LinkedQuestionsList = Liste des questions liées (%s) +AddQuestionLink = %d Question(s) ajoutée(s) au modèle : +WarningQuestionLink = %d Question(s) déjà dans le modèle : +ConfirmMassAddQuestion = Confirmation d'ajout en masse de questions au modèle +ConfirmMassAddingQuestion = Êtes-vous sur de vouloir ajouter les %d question(s) sélectionnée(s) ? +ConfirmMassAddingQuestionAlreadyAffected = Êtes-vous sur de vouloir ajouter les %d question(s) sélectionnée(s) ? %d question(s) non comprises car déjà affectés ! +removeQuestionLink = Question retirée du modèle : +LockQuestion = La question %s est passée au statut verrouillé +LockQuestions = Toutes les questions sélectionnées sont passées au statut verrouillé +ThereAre = Il y a +YouAnswered = Vous avez répondu à +On = sur +BewareQuestionsAnswered = Attention il manque %s réponse(s) +QuestionsCategoriesArea = Espace des tags/catégories des questions +ExtrafieldsQuestionManagement = Gestion des attributs supplémentaires des questions +PhotoOk = Exemple de photo correcte +PhotoKo = Exemple de photo incorrecte +ShowPhoto = Afficher les photos +AuthorizeAnswerPhoto = Autoriser l'envoi de photos sur les réponses +ShowPhotoTooltip = Affiche les photos et la bibliothèque de médias sur la question +AuthorizeAnswerPhotoTooltip = Autorise l'envoi de photos sur les réponses de question +NoteControl = Note publique +EnterComment = Saisir les commentaires +EnterCommentTooltip = Saisit le commentaire sur les réponses de question +ErrorQuestionUsedInSheet = La question %s ne peut pas être supprimée, elle est utilisée dans un ou plusieurs modèles. +ErrorNoQuestionSelected = Aucune question sélectionnée +AddQuestionIntoCategory = Assigner cette catégorie à la question +QuestionType = Type de question +AnswersList = Liste des réponses possibles +MultipleChoices = Choix multiples +Text = Texte +UniqueChoice = Choix unique +Range = Valeur numérique +OkKo = Sélecteur OK/KO +OkKoToFixNonApplicable = Sélecteur OK/KO/NA/A réparer +ToFix = A réparer +NonApplicable = NA +Answer = Réponse +EmptyValue = La valeur de la réponse est vide +ErrorCreateAnswer = Une erreur est survenue lors de la création de la réponse +ErrorUpdateAnswer = Une erreur est survenue lors de l'édition de la réponse +ErrorDeleteAnswer = Une erreur est survenue lors de la suppression de la réponse +AnswerCreated = La réponse a été créée avec succès +AnswerUpdated = La réponse a été mise à jour avec succès +AnswerDeleted = La réponse a été supprimée avec succès +AnswerMustBeCreated = La question %s doit avoir au moins une réponse pour passer au statut verrouillé +ShowOnlyQuestionsWithNoAnswer = Afficher uniquement les questions qui n'ont pas de réponse +AveragePercentageQuestions = Moyenne des questions +AddToSheet = Ajouter au modèle +PercentageQuestionStep = Nombre d'étapes du curseur +NumberOfPoints = Nombre de points +Point = Point +Points = Points +AnswerCorrectness = Validité de la réponse +ExpectedAnswer = Réponse correcte +QuestionWithOneCorrectAnswer = Ce type de question n'accepte qu'une seule réponse correcte +AnswerCorrectnessMinBound = Valeur minimale de réponse correcte +AnswerCorrectnessMaxBound = Valeur maximale de réponse correcte +QuestionMinBoundExceeded = La valeur minimale de réponse correcte d'un pourcentage ne peut pas être inférieure à 0 +QuestionMaxBoundExceeded = La valeur minimale de réponse correcte d'un pourcentage ne peut pas être supérieure à 100 # diff --git a/view/question/question_list.php b/view/question/question_list.php index 86ca6ecf..714b0432 100644 --- a/view/question/question_list.php +++ b/view/question/question_list.php @@ -212,6 +212,22 @@ } if (($massaction == 'add_questions' || ($action == 'add_questions' && $confirm == 'yes')) && $permissiontoadd) { + + $elementElements = []; + $sql = "SELECT fk_target FROM llx_element_element WHERE targettype = 'digiquali_question'"; + $resql = $db->query($sql); + if ($resql) { + $num_prods = $db->num_rows($resql); + $i = 0; + while ($i < $num_prods) { + $i++; + + $row = $db->fetch_row($resql); + $elementElements[] = $row[0]; + } + } + $toselect = array_diff($toselect, $elementElements); + if (!empty($toselect)) { $totalQuestions = 0; $questionInArray = [];