diff --git a/plugins/tasks/Archive.php b/plugins/tasks/Archive.php
index 2ef3e2f08d4c90222b5bb9b3d42882d13ed8199a..a5d32b5578f673a3be8e37fba44ad58a28ea1aed 100644
--- a/plugins/tasks/Archive.php
+++ b/plugins/tasks/Archive.php
@@ -4,134 +4,150 @@ use FusionDirectory\Rest\WebServiceCall;
 
 class Archive implements EndpointInterface
 {
-  private TaskGateway $gateway;
-
-  public function __construct (TaskGateway $gateway)
-  {
-    $this->gateway = $gateway;
-  }
-
-  /**
-   * @return array
-   * Part of the interface of orchestrator plugin to treat GET method
-   */
-  public function processEndPointGet (): array
-  {
-    // Retrieve tasks of type 'archive'
-    return $this->gateway->getObjectTypeTask('archive');
-  }
-
-  /**
-   * @param array|null $data
-   * @return array
-   * @throws Exception
-   * Note: Part of the interface of orchestrator plugin to treat PATCH method
-   */
-  public function processEndPointPatch (array $data = NULL): array
-  {
-    $result = [];
-    $archiveTasks = $this->gateway->getObjectTypeTask('archive');
-
-    // Initialize the WebServiceCall object for login
-    $webServiceCall = new WebServiceCall($_ENV['FUSION_DIRECTORY_API_URL'] . '/login', 'POST');
-    $webServiceCall->setCurlSettings(); // Perform login and set the token
-
-    foreach ($archiveTasks as $task) {
-      try {
-        if (!$this->gateway->statusAndScheduleCheck($task)) {
-            // Skip this task if it does not meet the status and schedule criteria
-            continue;
-        }
+    private TaskGateway $gateway;
 
-          // Receive null or 'toBeArchived'
-          $supannState = $this->getUserSupannAccountStatus($task['fdtasksgranulardn'][0]);
+    public function __construct(TaskGateway $gateway)
+    {
+        $this->gateway = $gateway;
+    }
 
-        if ($supannState !== 'toBeArchived') {
-            // The task does not meet the criteria for archiving and can therefore be suppressed
-            $result[$task['dn']]['result'] = "User does not meet the criteria for archiving.";
-            $this->gateway->removeSubTask($task['dn']);
-            continue;
-        }
+    /**
+     * @return array
+     * Part of the interface of orchestrator plugin to treat GET method
+     */
+    public function processEndPointGet(): array
+    {
+        // Retrieve tasks of type 'archive'
+        return $this->gateway->getObjectTypeTask('archive');
+    }
 
-          // Set the archive endpoint and method using the same WebServiceCall object
-          $archiveUrl = $_ENV['FUSION_DIRECTORY_API_URL'] . '/archive/user/' . rawurlencode($task['fdtasksgranulardn'][0]);
-          $webServiceCall->setCurlSettings($archiveUrl, NULL, 'POST'); // Update settings for the archive request
-          $response = $webServiceCall->execute();
-
-          // Check if the HTTP status code is 204
-        if ($webServiceCall->getHttpStatusCode() === 204) {
-            $result[$task['dn']]['result'] = "User successfully archived.";
-            $this->gateway->updateTaskStatus($task['dn'], $task['cn'][0], '2');
-        } else {
-            throw new Exception("Unexpected HTTP status code: " . $webServiceCall->getHttpStatusCode());
+    /**
+     * @param array|null $data
+     * @return array
+     * @throws Exception
+     * Note: Part of the interface of orchestrator plugin to treat PATCH method
+     */
+    public function processEndPointPatch(array $data = null): array
+    {
+        $result = [];
+        $archiveTasks = $this->gateway->getObjectTypeTask('archive');
+
+        // Initialize the WebServiceCall object for login
+        $webServiceCall = new WebServiceCall($_ENV['FUSION_DIRECTORY_API_URL'] . '/login', 'POST');
+        $webServiceCall->setCurlSettings(); // Perform login and set the token
+
+        foreach ($archiveTasks as $task) {
+            try {
+                if (!$this->gateway->statusAndScheduleCheck($task)) {
+                    // Skip this task if it does not meet the status and schedule criteria
+                    continue;
+                }
+
+                // Retrieve the desired supann status from the main task
+                $desiredSupannStatus = $this->getArchiveTaskBehaviorFromMainTask($task['fdtasksgranularmaster'][0]);
+
+                // Retrieve the current supann status of the user
+                $currentSupannStatus = $this->getUserSupannAccountStatus($task['fdtasksgranulardn'][0]);
+
+                // Check if the current supann status matches the desired status
+                if (!$this->isSupannStatusMatching($desiredSupannStatus, $currentSupannStatus)) {
+                    // The task does not meet the criteria for archiving and can therefore be suppressed
+                    $result[$task['dn']]['result'] = "User does not meet the criteria for archiving.";
+                    $this->gateway->removeSubTask($task['dn']);
+                    continue;
+                }
+
+                // Set the archive endpoint and method using the same WebServiceCall object
+                $archiveUrl = $_ENV['FUSION_DIRECTORY_API_URL'] . '/archive/user/' . rawurlencode($task['fdtasksgranulardn'][0]);
+                $webServiceCall->setCurlSettings($archiveUrl, null, 'POST'); // Update settings for the archive request
+                $response = $webServiceCall->execute();
+
+                // Check if the HTTP status code is 204
+                if ($webServiceCall->getHttpStatusCode() === 204) {
+                    $result[$task['dn']]['result'] = "User successfully archived.";
+                    $this->gateway->updateTaskStatus($task['dn'], $task['cn'][0], '2');
+                } else {
+                    throw new Exception("Unexpected HTTP status code: " . $webServiceCall->getHttpStatusCode());
+                }
+            } catch (Exception $e) {
+                $result[$task['dn']]['result'] = "Error archiving user: " . $e->getMessage();
+                $this->gateway->updateTaskStatus($task['dn'], $task['cn'][0], $e->getMessage());
+            }
         }
-      } catch (Exception $e) {
-          $result[$task['dn']]['result'] = "Error archiving user: " . $e->getMessage();
-          $this->gateway->updateTaskStatus($task['dn'], $task['cn'][0], $e->getMessage());
-      }
-    }
 
-    return $result;
-  }
-
-  /**
-   * @param array|null $data
-   * @return array
-   * Note: Part of the interface of orchestrator plugin to treat POST method
-   */
-  public function processEndPointPost (array $data = NULL): array
-  {
-    return [];
-  }
-
-  /**
-   * @param array|null $data
-   * @return array
-   * Note: Part of the interface of orchestrator plugin to treat DELETE method
-   */
-  public function processEndPointDelete (array $data = NULL): array
-  {
-    return [];
-  }
-
-  /**
-   * Retrieve the supannAccountStatus of a user
-   * @param string $userDn
-   * @return string|null
-   */
-  private function getUserSupannAccountStatus (string $userDn): ?string
-  {
-      $supannState = $this->gateway->getLdapTasks(
-          '(objectClass=supannPerson)',
-          ['supannRessourceEtatDate'],
-          '',
-          $userDn
-      );
-
-    if ($this->hasToBeArchived($supannState)) {
-        return 'toBeArchived';
+        return $result;
     }
 
-      return NULL;
-  }
+    /**
+     * @param array|null $data
+     * @return array
+     * Note: Part of the interface of orchestrator plugin to treat POST method
+     */
+    public function processEndPointPost(array $data = null): array
+    {
+        return [];
+    }
 
-  private function hasToBeArchived (array $supannState): bool
-  {
-    if (!isset($supannState[0]['supannressourceetatdate']) || !is_array($supannState[0]['supannressourceetatdate'])) {
-        return FALSE;
+    /**
+     * @param array|null $data
+     * @return array
+     * Note: Part of the interface of orchestrator plugin to treat DELETE method
+     */
+    public function processEndPointDelete(array $data = null): array
+    {
+        return [];
     }
 
-    foreach ($supannState[0]['supannressourceetatdate'] as $key => $value) {
-        // Skip non-numeric keys (e.g., 'count')
-      if (!is_numeric($key)) {
-          continue;
-      }
+    /**
+     * Retrieve the supannAccountStatus of a user
+     * @param string $userDn
+     * @return array|null
+     */
+    private function getUserSupannAccountStatus(string $userDn): ?array
+    {
+        return $this->gateway->getLdapTasks(
+            '(objectClass=supannPerson)',
+            ['supannRessourceEtatDate'],
+            '',
+            $userDn
+        );
+    }
 
-      if (strpos($value, '{COMPTE}I:toBeArchived') !== FALSE) {
-          return TRUE;
-      }
+    /**
+     * @param string $taskDN
+     * @return array
+     * Note: Retrieve the desired supann status from the main task attributes.
+     */
+    private function getArchiveTaskBehaviorFromMainTask(string $taskDN): array
+    {
+        return $this->gateway->getLdapTasks(
+            '(objectClass=*)',
+            ['fdArchiveTaskResource', 'fdArchiveTaskState', 'fdArchiveTaskSubState'],
+            '',
+            $taskDN
+        );
     }
 
-      return FALSE;
-  }
+    /**
+     * @param array $desiredStatus
+     * @param array $currentStatus
+     * @return bool
+     * Note: Compare the desired supann status with the current status to determine if they match.
+     */
+    private function isSupannStatusMatching(array $desiredStatus, array $currentStatus): bool
+    {
+        if (empty($currentStatus[0]['supannressourceetatdate'])) {
+            return false;
+        }
+
+        foreach ($currentStatus[0]['supannressourceetatdate'] as $resource) {
+            if (strpos($resource, '{' . $desiredStatus[0]['fdarchivetaskresource'][0] . '}') !== false &&
+                strpos($resource, ':' . $desiredStatus[0]['fdarchivetaskstate'][0]) !== false &&
+                (empty($desiredStatus[0]['fdarchivetasksubstate'][0]) || strpos($resource, ':' . $desiredStatus[0]['fdarchivetasksubstate'][0]) !== false)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
 }
\ No newline at end of file