[openads-Commits] r22866 - in branches/v6.20.0-develop: . obj tests

0 views
Skip to first unread message

san...@users.adullact.net

unread,
Apr 7, 2026, 8:42:20 AMApr 7
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.


Reply all
Reply to author
Forward
0 new messages