san...@users.adullact.net
unread,Apr 7, 2026, 8:42:20 AMApr 7Sign in to reply to author
Sign in to forward
You do not have permission to delete messages in this group
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
to openmairi...@googlegroups.com
Author: sangles
Date: 2026-04-07 14:42:17 +0200 (Tue, 07 Apr 2026)
New Revision: 22866
Modified:
branches/v6.20.0-develop/
branches/v6.20.0-develop/HISTORY.txt
branches/v6.20.0-develop/obj/
branches/v6.20.0-develop/obj/task.class.php
branches/v6.20.0-develop/tests/
branches/v6.20.0-develop/tests/302_03_task_piece_supprimer.robot
Log:
merge: Fusion de la branche de developpement 10915_BUG_error_task_no_payload_transfert_platau_output dans la branche d'integration v6.20.0-develop
Index: branches/v6.20.0-develop
===================================================================
--- branches/v6.20.0-develop 2026-04-07 12:32:32 UTC (rev 22865)
+++ branches/v6.20.0-develop 2026-04-07 12:42:17 UTC (rev 22866)
Property changes on: branches/v6.20.0-develop
___________________________________________________________________
Modified: svn:mergeinfo
## -262,6 +262,7 ##
/branches/10908_EVO_TASK_ADD_UIDPLATAU:22703-22724
/branches/10910_EVO_DocumentSpecifique:22736-22858
/branches/10913_BUG_double_fire_get_modules:22818-22845
+/branches/10915_BUG_error_task_no_payload_transfert_paltau_output:22827-22865
/branches/10916_EVO_suivi_tache_titre:22837-22848
/branches/1800_BUG_replication_geo_ssdossier:21901-21931
/branches/3.33.X:4845-4901
Modified: branches/v6.20.0-develop/HISTORY.txt
===================================================================
--- branches/v6.20.0-develop/HISTORY.txt 2026-04-07 12:32:32 UTC (rev 22865)
+++ branches/v6.20.0-develop/HISTORY.txt 2026-04-07 12:42:17 UTC (rev 22866)
@@ -10,6 +10,8 @@
Ticket #10905.
* Évolution - DIA Phase 5c : Ajout du flux ARE
Ticket #10886
+* Correction - Anomalie task sans payload sur les transferts Plat'AU sortant
+ Ticket #10915.
* Correction - Application de la mise en exergue sur les champs de recherche
non appliqués sur la recherche simple, comme ça l'était déjà sur la recherche
avancée.
Index: branches/v6.20.0-develop/obj
===================================================================
--- branches/v6.20.0-develop/obj 2026-04-07 12:32:32 UTC (rev 22865)
+++ branches/v6.20.0-develop/obj 2026-04-07 12:42:17 UTC (rev 22866)
Property changes on: branches/v6.20.0-develop/obj
___________________________________________________________________
Modified: svn:mergeinfo
## -238,6 +238,7 ##
/branches/10908_EVO_TASK_ADD_UIDPLATAU/obj:22703-22724
/branches/10910_EVO_DocumentSpecifique/obj:22736-22858
/branches/10913_BUG_double_fire_get_modules/obj:22818-22845
+/branches/10915_BUG_error_task_no_payload_transfert_paltau_output/obj:22827-22865
/branches/10916_EVO_suivi_tache_titre/obj:22837-22848
/branches/1800_BUG_replication_geo_ssdossier/obj:21901-21931
/branches/3.33.X/obj:4845-4901
Modified: branches/v6.20.0-develop/obj/task.class.php
===================================================================
--- branches/v6.20.0-develop/obj/task.class.php 2026-04-07 12:32:32 UTC (rev 22865)
+++ branches/v6.20.0-develop/obj/task.class.php 2026-04-07 12:42:17 UTC (rev 22866)
@@ -617,7 +617,8 @@
// parent::setVal($form, $maj, $validation);
//
if ($this->getVal('stream') == "output"
- && $this->getVal('type') !== 'suppression_piece'
+ && ($this->getVal('type') !== 'suppression_piece'
+ || $this->getVal('json_payload') === '{}')
&& ($this->getVal('state') !== self::STATUS_DONE
|| $this->getVal('json_payload') === "{}")) {
//
@@ -1133,6 +1134,18 @@
// Si le type de la tache est suppression alors il faut gerer le state dans la payload figée.
if (in_array($val['type'], array('suppression_piece'))) {
$json_payload = json_decode($this->valF['json_payload']);
+ if ($json_payload === null
+ || ! isset($json_payload->task)
+ || ! isset($json_payload->task->state)
+ ) {
+ $this->addToLog(
+ __METHOD__."(): la payload de la tâche suppression_piece "
+ .$val['task']." est vide ou invalide, "
+ ."impossible de mettre à jour le state dans la payload",
+ DEBUG_MODE
+ );
+ return false;
+ }
// Si le state de la payload est différent du nouveau state de la tache.
if ($json_payload->task->state !== $this->valF['state']) {
$json_payload->task->state = $this->valF['state'];
@@ -1536,7 +1549,7 @@
$add = $this->ajouter($valF);
$this->addToLog(__METHOD__."(): retour de l'ajout de tâche: ".var_export($add, true), VERBOSE_MODE);
- // Création de la payload JSON dans le cas ou nous avons un suppression d'objet
+ // Création de la payload JSON figée pour les tâches de suppression de pièce.
if ($stream === 'output'
&& $add === true
&& isset($valF['type']) === true
@@ -1546,8 +1559,14 @@
"obj" => "task",
"idx" => 0,
));
- // Vérification de l'éxistence d'une tache de suppression de pièce
$task_exists = $inst_task_empty->task_exists('suppression_piece', $valF['object_id']);
+ if ($task_exists === false) {
+ $this->addToLog(
+ __METHOD__."(): tâche suppression_piece introuvable après insertion (object_id: ".$valF['object_id'].")",
+ DEBUG_MODE
+ );
+ return $this->end_treatment(__METHOD__, false);
+ }
$valF['task'] = $task_exists;
$inst_task = $this->f->get_inst__om_dbform(array(
"obj" => "task",
@@ -1554,6 +1573,31 @@
"idx" => $task_exists,
));
$valF['json_payload'] = $inst_task->view_form_json(true);
+ // Validation : la payload doit être un JSON structuré avec task.type
+ $decoded_payload = json_decode($valF['json_payload'], true);
+ if ($valF['json_payload'] === null
+ || $decoded_payload === null
+ || ! is_array($decoded_payload)
+ || ! isset($decoded_payload['task']['type'])
+ ) {
+ $this->addToLog(
+ __METHOD__."(): impossible de générer une payload valide pour "
+ ."la tâche suppression_piece ".$task_exists
+ ." (object_id: ".$valF['object_id']."), annulation",
+ DEBUG_MODE
+ );
+ $this->f->execute_auto_db_query(
+ 'update',
+ sprintf('%s%s', DB_PREFIXE, "task"),
+ array('state' => self::STATUS_CANCELED),
+ sprintf("task = '%s'", $task_exists),
+ array(
+ 'origin' => __METHOD__,
+ 'force_return' => true,
+ )
+ );
+ return $this->end_treatment(__METHOD__, false);
+ }
$update = $this->modifier($valF);
if ($update === false) {
$this->addToLog(__METHOD__."(): ".$this->msg, DEBUG_MODE);
@@ -2780,7 +2824,10 @@
// Si l'objet de référence n'existe pas log le numéro de la tâche concerné et
// renvoie une payload contenant le message d'erreur.
// Sinon constitue la payload du json.
- if (! $objectRefExist) {
+ // Cas particulier : pour les tâches suppression_piece dont le
+ // document_numerise a été supprimé (par ex. via un GED externe), on
+ // construit une payload partielle avec les données encore disponibles.
+ if (! $objectRefExist && $val_task['type'] !== 'suppression_piece') {
$this->f->addToLog(
sprintf(
__('Impossible de récupérer la payload car l\'objet de réference n\'existe pas pour la tâche : %s'),
@@ -2867,6 +2914,21 @@
// Récupération des données du document numérisé
$val['document_numerise'] = $this->get_document_numerise_data($this->getVal('object_id'));
+ // Si le document n'existe plus (supprimé via un GED externe par
+ // exemple), on l'indique dans la payload pour que le
+ // consommateur puisse gérer l'exception.
+ // On vérifie la présence de la clé 'document_numerise' dans le
+ // tableau car get_document_numerise_data() retourne toujours au
+ // minimum array('path' => ...) donc empty() serait toujours faux.
+ if (! isset($val['document_numerise']['document_numerise'])
+ && $this->getVal('type') === 'suppression_piece') {
+ $val['document_numerise'] = array(
+ 'document_numerise' => $this->getVal('object_id'),
+ 'document_numerise_supprime' => true,
+ 'message' => __("Le document numerise a ete supprime en dehors d'OpenADS."),
+ );
+ }
+
// Détermination de l'identifiant du dossier
if (isset($val['document_numerise']['dossier']) === true) {
$tmp_dossier_idx = $val['document_numerise']['dossier'];
Index: branches/v6.20.0-develop/tests
===================================================================
--- branches/v6.20.0-develop/tests 2026-04-07 12:32:32 UTC (rev 22865)
+++ branches/v6.20.0-develop/tests 2026-04-07 12:42:17 UTC (rev 22866)
Property changes on: branches/v6.20.0-develop/tests
___________________________________________________________________
Modified: svn:mergeinfo
## -234,6 +234,7 ##
/branches/10908_EVO_TASK_ADD_UIDPLATAU/tests:22703-22724
/branches/10910_EVO_DocumentSpecifique/tests:22736-22858
/branches/10913_BUG_double_fire_get_modules/tests:22818-22845
+/branches/10915_BUG_error_task_no_payload_transfert_paltau_output/tests:22827-22865
/branches/10916_EVO_suivi_tache_titre/tests:22837-22848
/branches/1800_BUG_replication_geo_ssdossier/tests:21901-21931
/branches/3.33.X/tests:4845-4901
Modified: branches/v6.20.0-develop/tests/302_03_task_piece_supprimer.robot
===================================================================
--- branches/v6.20.0-develop/tests/302_03_task_piece_supprimer.robot 2026-04-07 12:32:32 UTC (rev 22865)
+++ branches/v6.20.0-develop/tests/302_03_task_piece_supprimer.robot 2026-04-07 12:42:17 UTC (rev 22866)
@@ -149,7 +149,77 @@
${id_next_task} = Evaluate ${id_suppression_piece} + 1
Vérifier qu'il n'y a pas de création d'autre tâche non concerné id_next_task=${id_next_task} id_dossier=${di1_da}
+ Set Suite Variable ${id_suppression_piece_di1} ${id_suppression_piece}
+
+Vérification du comportement de la task suppression_piece avec document_numerise supprimé en externe
+ [Documentation] Simule le cas où un document_numerise a été supprimé en dehors
+ ... d'OpenADS (GED externe) et la payload de la tâche suppression_piece est
+ ... restée vide. Vérifie que l'API retourne une payload partielle exploitable
+ ... contenant l'UID Plat'AU de la pièce et que le formulaire ne crash pas.
+
+ Depuis la page d'accueil admin admin
+
+ # On simule l'existence d'un lien Plat'AU pour la pièce, comme si le
+ # connecteur avait traité l'ajout_piece et enregistré l'UID Plat'AU.
+ # En production ce lien persiste même après la suppression du document.
+ Execute SQL INSERT INTO openads.lien_id_interne_uid_externe (lien_id_interne_uid_externe, object, object_id, external_uid, dossier, category) SELECT nextval('openads.lien_id_interne_uid_externe_seq'), 'piece', t.object_id, 'FAKE-PLATAU-PIECE-UID-10915', t.dossier, 'platau' FROM openads.task t WHERE t.task = '${id_suppression_piece_di1}'
+
+ # On corrompt la payload pour simuler le scénario historique
+ Execute SQL UPDATE openads.task SET json_payload = '{}' WHERE task = '${id_suppression_piece_di1}'
+
+ # Vérification via l'API REST (action=998) : le connecteur Python doit
+ # recevoir une payload structurée avec le type, l'indicateur de suppression
+ # et l'UID Plat'AU de la pièce pour pouvoir identifier quoi supprimer
+ Go To ${PROJECT_URL}/app/index.php?module=form&obj=task&action=998&idx=${id_suppression_piece_di1}&category=platau&state=new&type=suppression_piece&stream=output
+ ${api_response} = Get Text css=#form-container
+ Should Contain ${api_response} "type":"suppression_piece"
+ Should Contain ${api_response} "document_numerise_supprime":true
+ Should Contain ${api_response} "piece":"FAKE-PLATAU-PIECE-UID-10915"
+ Should Not Contain ${api_response} Impossible de recuperer la payload
+
+ # Vérification via le formulaire (action=3) : pas de crash PHP
+ Go To ${PROJECT_URL}/app/index.php?module=form&obj=task&action=3&idx=${id_suppression_piece_di1}
+ La page ne doit pas contenir d'erreur
+
+ # Nettoyage
+ Execute SQL UPDATE openads.task SET state = 'canceled' WHERE task = '${id_suppression_piece_di1}'
+ Execute SQL DELETE FROM openads.lien_id_interne_uid_externe WHERE external_uid = 'FAKE-PLATAU-PIECE-UID-10915'
+
+
+Vérification que triggermodifierapres ne crash pas avec payload vide
+ [Documentation] Vérifie que triggermodifierapres() gère proprement le cas où
+ ... la payload en base est vide lors d'un changement de state.
+ ... Le champ json_payload est de type jsonprettyprint (balise pre, pas d'input)
+ ... en mode modifier, il n'est donc pas soumis. triggermofidier() récupère
+ ... la payload depuis la base ('{}') et triggermodifierapres() doit refuser
+ ... la modification sans provoquer de crash PHP.
+
+ Depuis la page d'accueil admin admin
+
+ # On remet la tâche en état new avec payload vide
+ Execute SQL UPDATE openads.task SET json_payload = '{}', state = 'new' WHERE task = '${id_suppression_piece_di1}'
+
+ # On tente de modifier le state via le formulaire
+ &{task_values_modif} = Create Dictionary
+ ... state=terminé
+ Modifier la task ${id_suppression_piece_di1} ${task_values_modif}
+
+ # Pas de crash PHP (pas d'erreur de base de données, pas d'erreur xdebug).
+ # triggermodifierapres() détecte la payload invalide, log l'erreur et
+ # retourne false, ce qui fait échouer modifier() proprement.
+ La page ne doit pas contenir d'erreur
+
+ # Vérification que le state n'a PAS changé (modifier() a échoué)
+ Go To ${PROJECT_URL}/app/index.php?module=form&obj=task&action=3&idx=${id_suppression_piece_di1}
+ La page ne doit pas contenir d'erreur
+ ${state_value} = Get Element Attribute css=#state value
+ Should Be Equal ${state_value} new
+
+ # Nettoyage
+ Execute SQL UPDATE openads.task SET state = 'canceled' WHERE task = '${id_suppression_piece_di1}'
+
+
Vérification de la desactivation des tasks de Création pièce lors de la suppression d'une piece de catégorie Plat'AU du dossier d'instruction
[Documentation] Permet de vérifier que la tâche Création pièce est bien annulée lors de la suppression d'une pièce du dossier d'instruction.