From b75b07ac49e0bd6ffbc2ff80607652b7e33ba4b4 Mon Sep 17 00:00:00 2001
From: Alexandre Morin <alexandre.morin@maarch.org>
Date: Mon, 6 Mar 2017 12:36:21 +0100
Subject: [PATCH] Enjoy commit

---
 modules/export_seda/Ajax_seda_zip.php         |  72 +++++++
 modules/export_seda/ArchiveTransfer.php       | 196 +++++++++++++-----
 modules/export_seda/Zip.php                   | 103 +++++++++
 modules/export_seda/export_seda.php           | 124 ++++++++++-
 modules/export_seda/js/functions.js           |  19 ++
 modules/export_seda/lang/fr.php               |  31 +++
 modules/export_seda/resources/ArchiveUnit.xml |  14 +-
 .../resources/ArchiveUnitChildren.xml         | 137 ++++++++++++
 8 files changed, 633 insertions(+), 63 deletions(-)
 create mode 100644 modules/export_seda/Ajax_seda_zip.php
 create mode 100644 modules/export_seda/Zip.php
 create mode 100644 modules/export_seda/js/functions.js
 create mode 100644 modules/export_seda/resources/ArchiveUnitChildren.xml

diff --git a/modules/export_seda/Ajax_seda_zip.php b/modules/export_seda/Ajax_seda_zip.php
new file mode 100644
index 00000000000..040f6c0239c
--- /dev/null
+++ b/modules/export_seda/Ajax_seda_zip.php
@@ -0,0 +1,72 @@
+<?php
+/*
+*   Copyright 2008-2017 Maarch
+*
+*   This file is part of Maarch Framework.
+*
+*   Maarch Framework is free software: you can redistribute it and/or modify
+*   it under the terms of the GNU General Public License as published by
+*   the Free Software Foundation, either version 3 of the License, or
+*   (at your option) any later version.
+*
+*   Maarch Framework is distributed in the hope that it will be useful,
+*   but WITHOUT ANY WARRANTY; without even the implied warranty of
+*   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*   GNU General Public License for more details.
+*
+*   You should have received a copy of the GNU General Public License
+*   along with Maarch Framework.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+	require_once __DIR__.'/Zip.php';
+
+	$status = 0;
+	$error = $content = '';
+	if ($_REQUEST['reference']) {
+		$extract = new Extract();
+		$zipfile = $extract->exportZip($_REQUEST['reference']);
+		$status = $extract->download($zipfile);
+	} else {
+		$status = 1;
+	}
+
+	
+	echo "{status : " . $status . ", content : '" . addslashes($content) . "', error : '" . addslashes($error) . "'}";
+	exit ();
+
+class Extract
+{
+	protected $zip;
+
+	public function __construct() 
+	{
+		$this->zip = new Zip();
+	}
+
+	public function exportZip($reference)
+	{
+		$messageDirectory = __DIR__.DIRECTORY_SEPARATOR.'seda2'.DIRECTORY_SEPARATOR.$reference;
+		$zipfile = __DIR__.DIRECTORY_SEPARATOR.'seda2'.DIRECTORY_SEPARATOR.$reference. ".zip";
+
+		if (!is_file($zipfile)) {
+            if (is_dir($messageDirectory)) {
+                $this->zip->add($zipfile, $messageDirectory.DIRECTORY_SEPARATOR."*");
+            }
+        }
+
+        $zipContents = file_get_contents($zipfile);
+
+        return $zipfile;
+	}
+
+	public function download($full_path) {
+		$file_name = basename($full_path);
+		 
+		header('Content-Tranfer-Encoding: fichier');
+		header('Content-Length: '.filesize($full_path));
+		header('Content-Type: application/force-download');
+		header('Content-Disposition: attachment; filename="'.$file_name.'"');
+
+		readfile($full_path);
+	}
+}
\ No newline at end of file
diff --git a/modules/export_seda/ArchiveTransfer.php b/modules/export_seda/ArchiveTransfer.php
index f8b52d8c8be..4416c2b01ff 100644
--- a/modules/export_seda/ArchiveTransfer.php
+++ b/modules/export_seda/ArchiveTransfer.php
@@ -44,12 +44,26 @@ class ArchiveTransfer {
 			$result .= $resId.'#';
 
 			$letterbox = $this->getCourrier($resId);
+			$attachments = $this->getAttachments($letterbox->res_id);
 
+			$archiveUnitId = uniqid();
 			if ($letterbox->filename) {
-				$messageObject->dataObjectPackage->descriptiveMetadata->archiveUnit[] = $this->getArchiveUnit($letterbox);
+				$messageObject->dataObjectPackage->descriptiveMetadata->archiveUnit[] = $this->getArchiveUnit($letterbox, "File", $attachments,$archiveUnitId, $letterbox->res_id, null);
 				$messageObject->dataObjectPackage->binaryDataObject[] = $this->getBinaryDataObject($letterbox);
 			} else {
-				$messageObject->dataObjectPackage->descriptiveMetadata->archiveUnit[] = $this->getArchiveUnit($letterbox);
+				$messageObject->dataObjectPackage->descriptiveMetadata->archiveUnit[] = $this->getArchiveUnit($letterbox, "File");
+			}
+
+			if ($attachments) {
+				foreach ($attachments as $attachment) {
+					if ($attachment->attachment_type == "simple_attachment" || $attachment->attachment_type == "signed_response") {
+						if ($attachment->attachment_type == "signed_response" && $attachment->res_id_master == $letterbox->res_id) {
+							$messageObject->dataObjectPackage->descriptiveMetadata->archiveUnit[] = $this->getArchiveUnit($attachment, "Response", null, null,"attachment_".$attachment->res_id, $archiveUnitId);
+						}
+
+						$messageObject->dataObjectPackage->binaryDataObject[] = $this->getBinaryDataObject($attachment,true);
+					}
+				}
 			}
 		}
 
@@ -137,73 +151,122 @@ class ArchiveTransfer {
 
 	
 
-	private function getArchiveUnit($letterbox)
+	private function getArchiveUnit($object, $type, $attachments =null, $archiveUnitId = null, $dataObjectReferenceId = null, $relatedObjectReference =null)
 	{
 		$messageArchiveUnit = new stdClass();
 
-		$messageArchiveUnit->content = $this->getContent($letterbox);
+		if ($archiveUnitId) {
+			$messageArchiveUnit->id = $archiveUnitId;
+		} else {
+			$messageArchiveUnit->id = uniqid();
+		}
 		
-		$messageArchiveUnit->management = $this->getManagement($letterbox);
+		if ($relatedObjectReference) {
+			$messageArchiveUnit->content = $this->getContent($object, $type, $relatedObjectReference);
+		} else {
+			$messageArchiveUnit->content = $this->getContent($object, $type);
+		}
+
+		if ($object->type_id != 0) {
+			$messageArchiveUnit->management = $this->getManagement($object);
+		}
 
 		if ($dataObjectReferenceId) {
 			$messageArchiveUnit->dataObjectReference = new stdClass();
-			$messageArchiveUnit->dataObjectReference->dataObjectReferenceId = $letterbox->res_id;
+			$messageArchiveUnit->dataObjectReference->dataObjectReferenceId = $dataObjectReferenceId;
+		}
+
+		
+		if ($attachments) {
+			$messageArchiveUnit->archiveUnit = [];
+			foreach ($attachments as $attachment) {
+				if ($attachment->res_id_master == $object->res_id) {
+					if ($attachment->attachment_type == "simple_attachment") {
+						$messageArchiveUnit->archiveUnit[] = $this->getArchiveUnit($attachment, "Item", null, null, "attachment_".$attachment->res_id);
+					}
+				}
+			}
 		}
 
+		if (count($messageArchiveUnit->archiveUnit) == 0) {
+			unset($messageArchiveUnit->archiveUnit);
+		}
+		
 		return $messageArchiveUnit;
 	}
 
-	private function getContent($letterbox)
+	private function getContent($object, $type, $relatedObjectReference = null)
 	{
 		$content = new stdClass();
-		$content->receivedDate = $letterbox->admission_date;
-		$content->sentDate = $letterbox->doc_date;
-		$content->receivedDate = $letterbox->admission_date;
-		$content->receivedDate = $letterbox->admission_date;
 
-		$content->addressee = [];
-		$content->keyword = [];
-
-		if ($letterbox->exp_contact_id) {
+		if ($type == "File") {
+			$content->descriptionLevel = $type;
+			$content->receivedDate = $object->admission_date;
+			$content->sentDate = $object->doc_date;
+			$content->receivedDate = $object->admission_date;
+			$content->receivedDate = $object->admission_date;
+
+			$content->addressee = [];
+			$content->keyword = [];
+
+			if ($object->exp_contact_id) {
+				
+				$contact = $this->getContact($object->exp_contact_id);
+				$entitie = $this->getEntitie($object->destination);
+
+				$content->keyword[] = $this->getKeyword($contact);
+				$content->addressee[] = $this->getAddresse($entitie,"entitie");
+			} else if ($object->dest_contact_id) {
+				$contact = $this->getContact($object->dest_contact_id);
+				$entitie = $this->getEntitie($object->destination);
+
+				$content->addressee[] = $this->getAddresse($contact);
+				$content->keyword[] = $this->getKeyword($entitie,"entitie");
+			} else if ($object->exp_user_id) {
+				$user = $this->getUserInformation($object->exp_user_id);
+				$entitie = $this->getEntitie($object->initiator);
+				//$entitie = $this->getEntitie($letterbox->destination);
+
+				$content->keyword[] = $this->getKeyword($user);
+				$content->addressee[] = $this->getAddresse($entitie,"entitie");
+			}
 			
-			$contact = $this->getContact($letterbox->exp_contact_id);
-			$entitie = $this->getEntitie($letterbox->destination);
-
-			$content->keyword[] = $this->getKeyword($contact);
-			$content->addressee[] = $this->getAddresse($entitie,"entitie");
-		} else if ($letterbox->dest_contact_id) {
-			$contact = $this->getContact($letterbox->dest_contact_id);
-			$entitie = $this->getEntitie($letterbox->destination);
-
-			$content->addressee[] = $this->getAddresse($contact);
-			$content->keyword[] = $this->getKeyword($entitie,"entitie");
-		} else if ($letterbox->exp_user_id) {
-			$user = $this->getUserInformation($letterbox->exp_user_id);
-			$entitie = $this->getEntitie($letterbox->initiator);
-			//$entitie = $this->getEntitie($letterbox->destination);
-
-			$content->keyword[] = $this->getKeyword($user);
-			$content->addressee[] = $this->getAddresse($entitie,"entitie");
+			$content->source = $_SESSION['mail_nature'][$object->nature_id];
+
+			$content->documentType = $object->type_label;
+			$content->originatingAgencyArchiveIdentifier = $object->alt_identifier;
+			$content->originatingSystemId = $object->res_id;
+			$content->title = [];
+			$content->title[] = $object->subject;
+			$content->endDate = $object->process_limit_date;
+
+		} else {
+			$content->descriptionLevel = "Item";
+			$content->title = [];
+			$content->title[] = $object->title;
+			$content->originatingSystemId = $object->res_id;
+			$content->documentType = "Attachment";
+
+			if ($type == "Response") {
+				$reference = new stdClass();
+				$reference->repositoryArchiveUnitPID = $relatedObjectReference;
+
+				$content->relatedObjectReference = new stdClass();
+				$content->relatedObjectReference->references = [];
+
+				$repositoryArchiveUnitPID = new stdClass();
+				$repositoryArchiveUnitPID = $reference;
+				$content->relatedObjectReference->references[] = $repositoryArchiveUnitPID;
+			}
 		}
-		
-		$content->source = $_SESSION['mail_nature'][$letterbox->nature_id];
-
-		$content->documentType = $letterbox->type_label;
-		$content->originatingAgencyArchiveIdentifier = $letterbox->alt_identifier;
-		$content->originatingSystemId = $letterbox->res_id;
-		$content->title = [];
-		$content->title[] = $letterbox->subject;
-		$content->description = [];
-		$content->description[] = " ";
-		$content->endDate = $letterbox->process_limit_date;
-
-		$notes = $this->getNotes($letterbox->res_id);
+
+		/*$notes = $this->getNotes($letterbox->res_id);
 		$content->custodialHistory = new stdClass();
 		$content->custodialHistory->custodialHistoryItem = [];
 
 		foreach ($notes as $note) {
 			$content->custodialHistory->custodialHistoryItem[] = $this->getCustodialHistoryItem($note);
-		}
+		}*/
 
 		return $content;
 	}
@@ -221,21 +284,27 @@ class ArchiveTransfer {
 		return $management;
 	}
 
-	private function getBinaryDataObject($letterbox)
+	private function getBinaryDataObject($object, $isAttachment = false)
 	{
-		$docServers = $this->getDocServer($letterbox->docserver_id);
+		$docServers = $this->getDocServer($object->docserver_id);
 
 		$binaryDataObject = new stdClass();
-		$binaryDataObject->id = $letterbox->res_id;
+
+		if ($isAttachment) {
+			$binaryDataObject->id = "attachment_".$object->res_id;
+		} else {
+			$binaryDataObject->id = $object->res_id;
+		}
+		
 		$binaryDataObject->messageDigest = new stdClass();
-		$binaryDataObject->messageDigest->value = $letterbox->fingerprint;
+		$binaryDataObject->messageDigest->value = $object->fingerprint;
 
 		$binaryDataObject->size = new stdClass();
-		$binaryDataObject->size->value = $letterbox->filesize;
+		$binaryDataObject->size->value = $object->filesize;
 
-		$uri = str_replace("##", DIRECTORY_SEPARATOR, $letterbox->path);
+		$uri = str_replace("##", DIRECTORY_SEPARATOR, $object->path);
 		$uri =  str_replace("#", DIRECTORY_SEPARATOR, $uri);
-		$uri .= $letterbox->filename;
+		$uri .= $object->filename;
 		$binaryDataObject->uri = $docServers->path_template.$uri;
 
 		return $binaryDataObject;
@@ -396,6 +465,23 @@ class ArchiveTransfer {
 		return $docServers;
 	}
 
+	private function getAttachments($resIdMaster)
+	{
+		$queryParams = [];
+
+		$queryParams[] = $resIdMaster;
+
+		$query = "SELECT * FROM res_attachments WHERE res_id_master = ?";
+
+		$smtp = $this->db->query($query,$queryParams);
+		
+		while ($res = $smtp->fetchObject()) {
+			$attachments[] = $res;
+		}
+
+		return $attachments;
+	}
+
 	private function insertMessage($messageObject) 
 	{
 		$queryParams = [];
@@ -436,7 +522,7 @@ class ArchiveTransfer {
 			$queryParams[] = $messageObject->archivalAgreement->value; // Archival agreement reference
 			$queryParams[] = ""; //ReplyCode
 			$queryParams[] = 0; // size
-			$queryParams[] = ""; // Data
+			$queryParams[] = json_encode($messageObject);//$messageObject; // Data
 			$queryParams[] = 1; // active
 			$queryParams[] = 0; // archived
 
diff --git a/modules/export_seda/Zip.php b/modules/export_seda/Zip.php
new file mode 100644
index 00000000000..e7a86a4273c
--- /dev/null
+++ b/modules/export_seda/Zip.php
@@ -0,0 +1,103 @@
+<?php
+/*
+*   Copyright 2008-2017 Maarch
+*
+*   This file is part of Maarch Framework.
+*
+*   Maarch Framework is free software: you can redistribute it and/or modify
+*   it under the terms of the GNU General Public License as published by
+*   the Free Software Foundation, either version 3 of the License, or
+*   (at your option) any later version.
+*
+*   Maarch Framework is distributed in the hope that it will be useful,
+*   but WITHOUT ANY WARRANTY; without even the implied warranty of
+*   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*   GNU General Public License for more details.
+*
+*   You should have received a copy of the GNU General Public License
+*   along with Maarch Framework.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+class Zip
+{
+    
+    protected $executable;
+
+    public function __construct($zipExecutable=false)
+    {
+        if (!$zipExecutable) {
+            switch (DIRECTORY_SEPARATOR) {
+                // Windows installation
+                case '\\':
+                    $this->executable = 'C:\Program Files (x86)\7-Zip\7z.exe';
+                    break;
+
+                case "/":
+                default:
+                    $this->executable = "7z";
+            }
+        } else {
+            $this->executable = $zipExecutable;
+        }
+    }
+
+    
+    public function add($archive, $filename, array $options=null)
+    {
+        $tokens = array('"' . $this->executable . '"');
+        $tokens[] = "a";
+        $tokens[] = '"' . $archive . '"';
+        $tokens[] = '"' . $filename . '"';
+        //$tokens[] = '-scsUTF-8';
+        if ($options) {
+            foreach ($options as $option) {
+                $tokens[] = $option;
+            }
+        }
+
+        $command = implode(' ', $tokens);
+
+        $output = array();
+        $return = null;
+        $this->errors = array();
+
+        exec($command, $output, $return);
+
+        // var_dump($command);
+        // var_dump($output);
+        // var_dump($return);
+
+        if ($return === 0) {
+            return true;
+        } else {
+            $message = $this->handleError($return);
+
+            throw new \dependency\fileSystem\Exception($message, $return, null, $output);
+        }
+    }
+    
+    protected function handleError($return)
+    {       
+        switch ($return) {
+            case 1 :
+                return "Warning: Some files could not be processed. See output for more informations.";
+
+            case 2 : 
+                return "Error: Unable to process the command. See output for more informations.";
+ 
+            case 7 : 
+                return "Command line error.";
+
+            case 8 :
+                return "Not enough memory for operation.";
+
+            case 255 :
+                return "User stopped the process.";
+
+            default:
+                return "Unknown error.";
+
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/modules/export_seda/export_seda.php b/modules/export_seda/export_seda.php
index 00d08cceac9..7aa23949ed3 100644
--- a/modules/export_seda/export_seda.php
+++ b/modules/export_seda/export_seda.php
@@ -18,19 +18,89 @@
 * $confirm  bool true
 */
 $confirm = true;
-
+$frm_width='100%';
+$frm_height = 'auto';
 /**
 * $etapes  array Contains only one etap, the status modification
 */
  
-$etapes = array('export');
+$etapes = array('form');
+require_once __DIR__.'/ArchiveTransfer.php';
+//require_once __DIR__.'/StreamClient.php';
+
+function get_form_txt($values, $path_manage_action,  $id_action, $table, $module, $coll_id, $mode) {
+    $archiveTransfer = new ArchiveTransfer();
+
+    $result = $archiveTransfer->receive($values);
+    
+    $db = new Database();
+    $stmt = $db->query("select message_id from unit_identifier where res_id = ?",array($values[0]));
+    $unitIdentifier = $stmt->fetchObject();
+    $stmt = $db->query("select data from seda where message_id = ?",array($unitIdentifier->message_id));
+
+    $messageData = $stmt->fetchObject();
+
+    $messageObject = json_decode($messageData->data);
+
+    /*$test = new StreamClient();
+    var_dump($test->send($messageObject->messageIdentifier->value));
+    exit();*/
+    $frm_str = '<div id="frm_error_'.$id_action.'" class="error"></div>';
+    $frm_str .= '<h2 class="title">'._MESSAGE.' '. $messageObject->messageIdentifier->value;
+    $frm_str .= '</h2><br/>';
+    $frm_str .= '<div class="block forms details" >';
+
+    // Information Message
+    $frm_str .= '<h3 class="title">'._INFORMATION_MESSAGE.'</h3>';
+    $frm_str .= '<table width="100%" cellspacing="2" cellpading="2" border="0"><tbody><tr class="col"><br/>';
+    $frm_str .='<td><b>'._MESSAGE_IDENTIFIER.':</b></td>';
+    $frm_str .= '<td><input type="text" id="messageIdentifier" name="messageIdentifier" value="'.$messageObject->messageIdentifier->value. '" disabled></td>';
+    $frm_str .='<td><b>'._DATE.':</b></td>';
+    $frm_str .= '<td><input type="text" id="date" name="date" value="'.$messageObject->date. '" disabled></td></tr><tr class="col">';
+    $frm_str .='<td><b>'._ARCHIVAL_AGREEMENT.':</b></td>';
+    $frm_str .= '<td><input type="text" id="archivalAgreement" name="archivalAgreement" value="'.$messageObject->archivalAgreement->value. '" disabled></td>';
+    $frm_str .='<td><b>'._ARCHIVAL_AGENCY_SIREN.':</b></td>';
+    $frm_str .= '<td><input type="text" id="archivalAgency" name="archivalAgency" value="'.$messageObject->archivalAgency->identifier->value. '" disabled></td></tr><tr class="col">';
+    $frm_str .='<td><b>'.TRANSFERRING_AGENCY_SIREN.':</b></td>';
+    $frm_str .= '<td><input type="text" id="transferringAgency" name="transferringAgency" value="'.$messageObject->transferringAgency->identifier->value. '" disabled></td>';
+    $frm_str .= '</tr></tbody></table><hr />';
+
+    //Information n Archive
+    
+    foreach ($messageObject->dataObjectPackage->descriptiveMetadata->archiveUnit as $archiveUnit) {
+        $frm_str .= viewArchiveUnit($archiveUnit);
+    }
+
+
+    /*
+*/
+
+    $path_to_script = $_SESSION['config']['businessappurl']."index.php?display=true&module=export_seda";
+
+    $frm_str .= '</div>';
+    $frm_str .='<div align="center">';
+    $frm_str .='<input type="button" name="zip" id="zip" class="button"  value="'._ZIP.'" onclick="actionSeda(\''.$path_to_script.'&page=Ajax_seda_zip&reference='.$messageObject->messageIdentifier->value.'\');"/>&nbsp&nbsp&nbsp';
+    $frm_str .='<input type="button" name="sendMessage" id="sendMessage" class="button"  value="'._SEND_MESSAGE.'" onclick="actionSeda(\''.$path_to_script.'&page=Ajax_seda_send&reference='.$messageObject->messageIdentifier->value.'\');"/>';
+    $frm_str .='</div>';
+    $frm_str .='<div align="center" id="validSeda"></div>';
+    $frm_str .='<hr />';
+
+    $frm_str .='<div align="center">';
+            $frm_str .='<input type="button" name="cancel" id="cancel" class="button"  value="'._CANCEL.'" onclick="pile_actions.action_pop();destroyModal(\'modal_'.$id_action.'\');"/>';
+    $frm_str .='</div>';
+    //$frm_str .='<script type="text/javascript">'. require_once __DIR__.'/js/function.js'.'</script>';
 
+    /*$extract = new Extract();
+    $extract->exportZip($messageObject->messageIdentifier->value));*/
 
-function manage_export($arr_id, $history, $id_action, $label_action, $status)
+    return addslashes($frm_str);
+}
+
+function manage_form($arr_id, $history, $id_action, $label_action, $status)
 {
-    require_once('modules/export_seda/ArchiveTransfer.php');
+    
 
-    $archiveTransfer = new ArchiveTransfer();
+    
 
     
     // récupérer l'entité racine du courrier *
@@ -40,7 +110,7 @@ function manage_export($arr_id, $history, $id_action, $label_action, $status)
 
     // appel fonction de transfert et génération bdx *
 
-    $result = $archiveTransfer->receive($arr_id);
+    
 
     // historisation du transfert
 
@@ -51,3 +121,45 @@ function manage_export($arr_id, $history, $id_action, $label_action, $status)
     return array('result' => $result, 'history_msg' => '');
 }
 
+function viewArchiveUnit($archiveUnit, $archiveUnitChildren = false) 
+{
+    if (!$archiveUnitChildren) {
+        $frm_str .= '<h3 class="title">'._INFORMATION_ARCHIVE. ' "'. $archiveUnit->content->title[0].'"</h3>';
+    } else {
+        $frm_str .= '<h4 class="title">'._INFORMATION_ARCHIVE_CHILDREN. ' "'. $archiveUnit->content->title[0].'"</h4>';
+    }
+    
+    $frm_str .= '<table width="100%" cellspacing="2" cellpading="2" border="0"><tbody><tr class="col"><br/>';
+    $frm_str .='<td><b>'._ARCHIVE_IDENTIFIER.':</b></td>';
+    $frm_str .= '<td><input type="text" id="archiveIdentifier" name="archiveIdentifier" value="'.$archiveUnit->id. '" disabled></td></tr>';
+
+    if ($archiveUnit->management) {
+        $frm_str .='<tr class="col"><td><b>'._RETENTION_RULE.':</b></td>';
+        $frm_str .= '<td><input type="text" id="rule" name="rule" value="'.$archiveUnit->management->appraisalRule->rule->value. '" disabled></td>';
+        $frm_str .='<td><b>'._RETENTION_FINAL_DISPOSITION.':</b></td>';
+        $frm_str .= '<td><input type="text" id="finalAction" name="finalAction" value="'.$archiveUnit->management->appraisalRule->finalAction. '" disabled></td>';
+        $frm_str .= '</tr>';
+    }
+
+    $frm_str .= '<tr class="col"><td><b>'._DESCRIPTION_LEVEL.':</b></td>';
+    $frm_str .= '<td><input type="text" id="descriptionLevel" name="descriptionLevel" value="'.$archiveUnit->content->descriptionLevel. '" disabled></td>';
+    $frm_str .= '<td><b>'._DOCUMENT_TYPE.':</b></td>';
+    $frm_str .= '<td><input type="text" id="documentType" name="documentType" value="'.$archiveUnit->content->documentType. '" disabled></td></tr>';
+    $frm_str .= '<tr class="col"><td><b>'._RECEIVED_DATE.':</b></td>';
+    $frm_str .= '<td><input type="text" id="receivedDate" name="receivedDate" value="'.$archiveUnit->content->receivedDate. '" disabled></td>';
+    $frm_str .= '<td><b>'._SENT_DATE.':</b></td>';
+    $frm_str .= '<td><input type="text" id="sentDate" name="sentDate" value="'.$archiveUnit->content->sentDate. '" disabled></td></tr>';
+    $frm_str .= '<tr class="col"><td><b>'._END_DATE.':</b></td>';
+    $frm_str .= '<td><input type="text" id="endDate" name="endDate" value="'.$archiveUnit->content->endDate. '" disabled></td></tr>';
+    $frm_str .= '</tr></tbody></table>';
+
+    if ($archiveUnit->archiveUnit) {
+        foreach ($archiveUnit->archiveUnit as $archiveUnitChildren) {
+            $frm_str .= viewArchiveUnit($archiveUnitChildren,true);
+        }
+    }
+
+    
+
+    return $frm_str;
+}
\ No newline at end of file
diff --git a/modules/export_seda/js/functions.js b/modules/export_seda/js/functions.js
new file mode 100644
index 00000000000..ad6e8997f4e
--- /dev/null
+++ b/modules/export_seda/js/functions.js
@@ -0,0 +1,19 @@
+function actionSeda($path) {
+	new Ajax.Request($path,
+        {
+            method:'post',
+            parameters: { url : $path,
+                        },
+            onSuccess: function(answer) {
+                eval("response = "+answer.responseText);
+                if(response.status == 0){
+                    var btn = $('<input type="button" value="_VALIDATE"/>');
+                    $("validSeda").append(btn);
+                } else {
+                    alert(response.error);
+                    eval(response.exec_js);
+                }
+                // $('loading_' + target).style.display='none';
+            }
+        });
+}
\ No newline at end of file
diff --git a/modules/export_seda/lang/fr.php b/modules/export_seda/lang/fr.php
index 94a64d96ef7..3015b0fc69e 100644
--- a/modules/export_seda/lang/fr.php
+++ b/modules/export_seda/lang/fr.php
@@ -10,5 +10,36 @@ if (!defined("_EXPORT_SEDA"))
 if (!defined("_EXPORT_SEDA_VIEW"))
     define("_EXPORT_SEDA_VIEW", "Voir le bordereau SEDA");
 
+if (!defined("_INFORMATION_MESSAGE"))
+    define("_INFORMATION_MESSAGE", "Information bordereau");
 
+if (!defined("_MESSAGE_IDENTIFIER"))
+    define("_MESSAGE_IDENTIFIER", "Identifiant bordereau");
+if (!defined("_ARCHIVAL_AGENCY_SIREN"))
+    define("_ARCHIVAL_AGENCY_SIREN", "Numéro SIREN service d'archive");
+if (!defined("_TRANSFERRING_AGENCY_SIREN"))
+    define("_TRANSFERRING_AGENCY_SIREN", "Numéro SIREN service de transfert");
 
+if (!defined("_INFORMATION_ARCHIVE"))
+    define("_INFORMATION_ARCHIVE", "Information archive");
+if (!defined("_ARCHIVE_IDENTIFIER"))
+    define("_ARCHIVE_IDENTIFIER", "Identifiant archive");
+
+if (!defined("_DESCRIPTION_LEVEL"))
+    define("_DESCRIPTION_LEVEL", "Service de description");
+if (!defined("_RECEIVED_DATE"))
+    define("_RECEIVED_DATE", "Date de reception");
+if (!defined("_RETENTION_FINAL_DISPOSITION"))
+    define("_RETENTION_FINAL_DISPOSITION", "Sort final");
+if (!defined("_DOCUMENT_TYPE"))
+    define("_DOCUMENT_TYPE", "Type de document");
+if (!defined("_SENT_DATE"))
+    define("_SENT_DATE", "Date d'envoie");
+
+if (!defined("_INFORMATION_ARCHIVE_CHILDREN"))
+    define("_INFORMATION_ARCHIVE_CHILDREN", "Information archive enfant");
+
+if (!defined("_ZIP"))
+    define("_ZIP", "Télécharger Zip");
+if (!defined("_SEND_MESSAGE"))
+    define("_SEND_MESSAGE", "Archiver bordereau");
\ No newline at end of file
diff --git a/modules/export_seda/resources/ArchiveUnit.xml b/modules/export_seda/resources/ArchiveUnit.xml
index 8d2ea8d3d5a..7656d6725fd 100644
--- a/modules/export_seda/resources/ArchiveUnit.xml
+++ b/modules/export_seda/resources/ArchiveUnit.xml
@@ -1,5 +1,5 @@
 <?merge $archiveUnit ?>
-<ArchiveUnit>
+<ArchiveUnit id="[?merge .id ?]">
     <ArchiveUnitRefId><?merge .archiveUnitRefId ?></ArchiveUnitRefId>
     <ArchiveUnitProfile schemeID="[?merge .archiveUnitProfile.schemeID ?]" schemeName="[?merge .archiveUnitProfile.schemeName ?]" schemeAgencyID="[?merge .archiveUnitProfile.schemeAgencyID ?]" schemeAgencyName="[?merge .archiveUnitProfile.schemeAgencyName ?]" schemeVersionID="[?merge .archiveUnitProfile.schemeVersionID ?]" schemeDataURI="[?merge .archiveUnitProfile.schemeDataURI ?]" schemeURI="[?merge .archiveUnitProfile.schemeURI ?]"><?merge .archiveUnitProfile ?></ArchiveUnitProfile>
     <?merge .management.bool() ?>
@@ -54,6 +54,7 @@
         <DescriptionLevel listVersionID="[?merge .descriptionLevel ?]"><?merge .content.descriptionLevel ?></DescriptionLevel>
         <?merge .content.title ?><Title><?merge . ?></Title>
         <?merge .content.filePlanPosition ?><FilePlanPosition schemeID="[?merge .schemeID @schemeID ?]" schemeName="[?merge .schemeName @schemeName ?]" schemeAgencyID="[?merge .schemeAgencyID @schemeAgencyID ?]" schemeAgencyName="[?merge .schemeAgencyName @schemeAgencyName ?]" schemeVersionID="[?merge .schemeVersionID @schemeVersionID ?]" schemeDataURI="[?merge .schemeDataURI @schemeDataURI ?]" schemeURI="[?merge .schemeURI @schemeURI ?]"><?merge .value ?></FilePlanPosition>
+        <?merge .originatingSystemId ?><OriginatingSystemId><?merge .content.originatingSystemId ?></OriginatingSystemId>
         <OriginatingAgencyArchiveIdentifier><?merge .content.originatingAgencyArchiveIdentifier ?></OriginatingAgencyArchiveIdentifier>
         <?merge .content.description.bool() ?><Description><?merge .content.description ?></Description>
         <?merge .content.custodialHistory.bool() ?>
@@ -109,6 +110,13 @@
             <?xinclude /resources/Agent.xml ?>
         </Recipient>
         <Source><?merge .content.source ?></Source>
+        <?merge .content.relatedObjectReference.bool() ?>
+        <RelatedObjectReference>
+            <?merge .content.relatedObjectReference.references ?>
+            <Reference>
+                <RepositoryArchiveUnitPID><?merge .repositoryArchiveUnitPID ?></RepositoryArchiveUnitPID>
+            </Reference>
+        </RelatedObjectReference>
         <CreatedDate><?merge .content.createdDate ?></CreatedDate>
         <TransactedDate><?merge .content.transactedDate ?></TransactedDate>
         <AcquiredDate><?merge .content.acquiredDate ?></AcquiredDate>
@@ -125,7 +133,9 @@
             <EventDetail><?merge .eventDetail ?></EventDetail>
         </Event> 
     </Content>
-    <?merge .content.archiveUnit /resources/ArchiveUnit.xml?>
+    <?merge .archiveUnit $archiveUnitChildren?>
+    <?merge .archiveUnit.bool() ?>
+    <?xinclude /resources/ArchiveUnitChildren.xml ?>
     <?merge .dataObjectReference.bool() ?>
     <DataObjectReference>
         <?merge .dataObjectReference.dataObjectReferenceId.bool() ?>
diff --git a/modules/export_seda/resources/ArchiveUnitChildren.xml b/modules/export_seda/resources/ArchiveUnitChildren.xml
new file mode 100644
index 00000000000..df2e655b404
--- /dev/null
+++ b/modules/export_seda/resources/ArchiveUnitChildren.xml
@@ -0,0 +1,137 @@
+<?merge $archiveUnitChildren ?>
+<ArchiveUnit id="[?merge .id ?]">
+    <ArchiveUnitRefId><?merge .archiveUnitRefId ?></ArchiveUnitRefId>
+    <ArchiveUnitProfile schemeID="[?merge .archiveUnitProfile.schemeID ?]" schemeName="[?merge .archiveUnitProfile.schemeName ?]" schemeAgencyID="[?merge .archiveUnitProfile.schemeAgencyID ?]" schemeAgencyName="[?merge .archiveUnitProfile.schemeAgencyName ?]" schemeVersionID="[?merge .archiveUnitProfile.schemeVersionID ?]" schemeDataURI="[?merge .archiveUnitProfile.schemeDataURI ?]" schemeURI="[?merge .archiveUnitProfile.schemeURI ?]"><?merge .archiveUnitProfile ?></ArchiveUnitProfile>
+    <?merge .management.bool() ?>
+    <Management>
+        <?merge .management.storageRule.bool() ?>
+        <StorageRule>
+            <?merge .management.storageRule $abstractRule ?>
+            <?xinclude /resources/AbstractRule.xml ?>
+            <FinalAction><?merge .management.storageRule.finalAction ?></FinalAction>
+        </StorageRule>
+        <?merge .management.appraisalRule.bool() ?>
+        <AppraisalRule>
+            <?merge .management.appraisalRule $abstractRule ?>
+            <?xinclude /resources/AbstractRule.xml ?>
+            <FinalAction><?merge .management.appraisalRule.finalAction ?></FinalAction>
+        </AppraisalRule>
+        <?merge .management.accessRule.bool() ?>
+        <AccessRule>
+            <?merge .management.accessRule $abstractRule ?>
+            <?xinclude /resources/AbstractRule.xml ?>
+        </AccessRule>
+        <?merge .management.disseminationRule.bool() ?>
+        <DisseminationRule>
+            <?merge .management.disseminationRule $abstractRule ?>
+            <?xinclude /resources/AbstractRule.xml ?>
+        </DisseminationRule>
+        <?merge .management.reuseRule.bool() ?>
+        <ReuseRule>
+            <?merge .management.reuseRule $abstractRule ?>
+            <?xinclude /resources/AbstractRule.xml ?>
+        </ReuseRule>
+        <?merge .management.classificationRule.bool() ?>
+        <ClassificationRule>
+            <?merge .management.classificationRule $abstractRule ?>
+            <?xinclude /resources/AbstractRule.xml ?>
+            <ClassificationLevel><?merge .management.classificationRule.classificationLevel ?></ClassificationLevel>
+            <ClassificationOwner><?merge .management.classificationRule.classificationOwner ?></ClassificationOwner>
+            <ClassificationReassessingDate><?merge .management.classificationRule.classificationReassessingDate ?></ClassificationReassessingDate>
+            <NeedReassessingAuthorization><?merge .management.classificationRule.needReassessingAuthorization ?></NeedReassessingAuthorization>
+        </ClassificationRule>
+        <?merge .management.needAuthorization.bool() ?>
+        <NeedAuthorization>
+            <?merge .management.needAuthorization ?>
+        </NeedAuthorization>
+        <?merge .management.otherManagementAbstract.bool() ?>
+        <OtherManagementAbstract>
+            <?merge .management.otherManagementAbstract ?>
+        </OtherManagementAbstract>
+    </Management>
+    <?merge .content.bool() ?>
+    <Content>
+        <DescriptionLevel listVersionID="[?merge .descriptionLevel ?]"><?merge .content.descriptionLevel ?></DescriptionLevel>
+        <?merge .content.title ?><Title><?merge . ?></Title>
+        <?merge .content.filePlanPosition ?><FilePlanPosition schemeID="[?merge .schemeID @schemeID ?]" schemeName="[?merge .schemeName @schemeName ?]" schemeAgencyID="[?merge .schemeAgencyID @schemeAgencyID ?]" schemeAgencyName="[?merge .schemeAgencyName @schemeAgencyName ?]" schemeVersionID="[?merge .schemeVersionID @schemeVersionID ?]" schemeDataURI="[?merge .schemeDataURI @schemeDataURI ?]" schemeURI="[?merge .schemeURI @schemeURI ?]"><?merge .value ?></FilePlanPosition>
+        <?merge .originatingSystemId ?><OriginatingSystemId><?merge .content.originatingSystemId ?></OriginatingSystemId>
+        <OriginatingAgencyArchiveIdentifier><?merge .content.originatingAgencyArchiveIdentifier ?></OriginatingAgencyArchiveIdentifier>
+        <?merge .content.description.bool() ?><Description><?merge .content.description ?></Description>
+        <?merge .content.custodialHistory.bool() ?>
+        <CustodialHistory>
+            <?merge .content.custodialHistory.custodialHistoryItem ?>
+            <CustodialHistoryItem when="[?merge .when ?]"><?merge .value ?></CustodialHistoryItem>
+        </CustodialHistory>
+        <Type><?merge .content.type ?></Type>
+        <DocumentType><?merge .content.documentType ?></DocumentType>
+        <Language><?merge .content.language ?></Language>
+        <DescriptionLanguage><?merge .content.descriptionLanguage ?></DescriptionLanguage>
+        <Status><?merge .content.status ?></Status>
+        <Version><?merge .content.version ?></Version>
+        <?merge .content.tag ?><Tag><?merge .value ?></Tag>
+        <?merge .content.keyword ?><Keyword>
+            <KeywordContent role="[?merge .keywordContent.role @role ?]"><?merge .keywordContent.value ?></KeywordContent>
+            <KeywordReference schemeID="[?merge .keywordReference.schemeID @schemeID ?]" schemeName="[?merge .keywordReference.schemeName @schemeName ?]" schemeAgencyID="[?merge .keywordReference.schemeAgencyID @schemeAgencyID ?]" schemeAgencyName="[?merge .keywordReference.schemeAgencyName @schemeAgencyName ?]" schemeVersionID="[?merge .keywordReference.schemeVersionID @schemeVersionID ?]" schemeDataURI="[?merge .keywordReference.schemeDataURI @schemeDataURI ?]" schemeURI="[?merge .keywordReference.schemeURI @schemeURI ?]"><?merge .keywordReference.value ?></KeywordReference>
+            <KeywordType listVersionID="[?merge .keywordType.listVersionID @listVersionID ?]"><?merge .keywordType ?></KeywordType>
+        </Keyword>
+        <Coverage>
+            <SpatialCoverage><?merge .content.spatialCoverage ?></SpatialCoverage>
+            <TemporalCoverage><?merge .content.temporalCoverage ?></TemporalCoverage>
+            <JuridicationalCoverage><?merge .content.juridictionalCoverage ?></JuridicationalCoverage>
+        </Coverage>
+        <?merge .content.originatingAgency.bool() ?>
+        <OriginatingAgency>
+            <?merge .content.originatingAgency $organization ?>
+            <?xinclude /resources/Organization.xml ?>
+        </OriginatingAgency>
+        <?merge .content.submissionAgency.bool() ?>
+        <SubmissionAgency>
+            <?merge .content.submissionAgency $organization ?>
+            <?xinclude /resources/Organization.xml ?>
+        </SubmissionAgency>
+        <?merge .content.authorizedAgend.bool() ?>
+        <AuthorizedAgent>
+            <?merge .authorizedAgent $agent ?>
+            <?xinclude /resources/Agent.xml ?>
+        </AuthorizedAgent>
+        <?merge .content.writter.array() ?>
+        <Writter>
+            <?merge . $agent ?>
+            <?xinclude /resources/Agent.xml ?>
+        </Writter>
+        <?merge .content.addressee.array()?>
+        <Addressee>
+            <?merge . $agent ?>
+            <?xinclude /resources/Agent.xml ?>
+        </Addressee>
+        <?merge .content.recipient.array() ?>
+        <Recipient>
+            <?merge . $agent ?>
+            <?xinclude /resources/Agent.xml ?>
+        </Recipient>
+        <Source><?merge .content.source ?></Source>
+        <CreatedDate><?merge .content.createdDate ?></CreatedDate>
+        <TransactedDate><?merge .content.transactedDate ?></TransactedDate>
+        <AcquiredDate><?merge .content.acquiredDate ?></AcquiredDate>
+        <SentDate><?merge .content.sentDate ?></SentDate>
+        <ReceivedDate><?merge .content.receivedDate ?></ReceivedDate>
+        <RegisteredDate><?merge .content.registeredDate ?></RegisteredDate>
+        <StartDate><?merge .content.startDate ?></StartDate>
+        <EndDate><?merge .content.endDate ?></EndDate>
+        <?merge .content.event ?>
+        <Event>
+            <EventIdentifier><?merge .eventIdentifier ?></EventIdentifier>
+            <EventType><?merge .eventType ?></EventType>
+            <EventDateTime><?merge .eventDateTime ?></EventDateTime>
+            <EventDetail><?merge .eventDetail ?></EventDetail>
+        </Event> 
+    </Content>
+    
+    <?merge .dataObjectReference.bool() ?>
+    <DataObjectReference>
+        <?merge .dataObjectReference.dataObjectReferenceId.bool() ?>
+        <DataObjectReferenceId><?merge .dataObjectReference.dataObjectReferenceId ?></DataObjectReferenceId>
+        <?merge .dataObjectReference.dataObjectGroupReferenceId.bool() ?>
+        <DataObjectGroupReferenceId><?merge .dataObjectReference.dataObjectGroupReferenceId ?></DataObjectGroupReferenceId>
+    </DataObjectReference>
+</ArchiveUnit>
\ No newline at end of file
-- 
GitLab