diff --git a/docs-sources/assets/database/camino-db.uml b/docs-sources/assets/database/camino-db.uml
index 5852750ec7389efdce9f61526931dd59257b127a..90975e14c8b23ae557fdee7093adc18d78792990 100644
--- a/docs-sources/assets/database/camino-db.uml
+++ b/docs-sources/assets/database/camino-db.uml
@@ -31,19 +31,6 @@ entity "**communes_postgis**" {
   ""geometry"": //geometry(MultiPolygon,4326) //
 }
 
-entity "**documents**" {
-  + ""id"": //character varying(255) [PK]//
-  --
-  *""type_id"": //character varying(3) //
-  *""date"": //character varying(10) //
-  ""titre_etape_id"": //character varying(128) [FK]//
-  *""description"": //character varying(1024) //
-  ""fichier"": //boolean //
-  ""fichier_type_id"": //character varying(3) //
-  *""public_lecture"": //boolean //
-  *""entreprises_lecture"": //boolean //
-}
-
 entity "**entreprises**" {
   + ""id"": //character varying(64) [PK]//
   --
@@ -84,6 +71,17 @@ entity "**entreprises_etablissements**" {
   ""date_fin"": //character varying(10) //
 }
 
+entity "**etapes_documents**" {
+  + ""id"": //character varying(255) [PK]//
+  --
+  *""etape_document_type_id"": //character varying(3) //
+  *""etape_id"": //character varying(255) [FK]//
+  ""description"": //character varying(1024) //
+  *""public_lecture"": //boolean //
+  *""entreprises_lecture"": //boolean //
+  ""largeobject_id"": //oid //
+}
+
 entity "**forets_postgis**" {
   + ""id"": //character varying(30) [PK]//
   --
@@ -220,8 +218,6 @@ entity "**titres_etapes**" {
   ""heritage_props"": //jsonb //
   ""heritage_contenu"": //jsonb //
   ""slug"": //character varying(255) //
-  ""decisions_annexes_sections"": //jsonb[] //
-  ""decisions_annexes_contenu"": //json //
   *""archive"": //boolean //
   *""substances"": //jsonb //
   *""secteurs_maritime"": //jsonb //
@@ -232,8 +228,11 @@ entity "**titres_etapes**" {
   ""notes"": //text //
   ""geojson4326_perimetre"": //geometry(MultiPolygon,4326) //
   ""geojson4326_points"": //jsonb //
-  ""bbox"": //geometry(Geometry,4326) //
-  ""bbox2"": //geometry(Polygon,4326) //
+  ""geojson_origine_points"": //jsonb //
+  ""geojson_origine_perimetre"": //jsonb //
+  ""geojson_origine_geo_systeme_id"": //character varying //
+  ""geojson4326_forages"": //jsonb //
+  ""geojson_origine_forages"": //jsonb //
 }
 
 entity "**titres_etapes_entreprises_documents**" {
@@ -278,12 +277,12 @@ entity "**utilisateurs__titres**" {
 
 "**activites_documents**"   }--  "**titres_activites**"
 
-"**documents**"   }--  "**titres_etapes**"
-
 "**entreprises_documents**"   }--  "**entreprises**"
 
 "**entreprises_etablissements**"   }--  "**entreprises**"
 
+"**etapes_documents**"   }--  "**titres_etapes**"
+
 "**journaux**"   }--  "**titres**"
 
 "**perimetre_reference**"   }--  "**titres_etapes**"
diff --git a/docs-sources/docs/img/camino-db.svg b/docs-sources/docs/img/camino-db.svg
index cfc866c9a47638ea17251b4edfec69cbad827d25..089c5587b24cda5ea6d8666654cb72108c3fb80c 100644
--- a/docs-sources/docs/img/camino-db.svg
+++ b/docs-sources/docs/img/camino-db.svg
@@ -1,61 +1,61 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" height="1508px" preserveAspectRatio="none" style="width:3678px;height:1508px;background:#FFFFFF;" version="1.1" viewBox="0 0 3678 1508" width="3678px" zoomAndPan="magnify"><defs/><g><!--MD5=[3727eb9c1bdb60251e9189fc6af3e2a6]
-class **activites_documents**--><g id="elem_**activites_documents**"><rect codeLine="4" fill="#F1F1F1" height="140.0781" id="**activites_documents**" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="377" x="1351" y="586.5"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="161" x="1459" y="604.4951">activites_documents</text><line style="stroke:#181818;stroke-width:0.5;" x1="1352" x2="1727" y1="612.7969" y2="612.7969"/><ellipse cx="1362" cy="623.7969" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="16" x="1371" y="629.792">id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1387" y="629.792">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="187" x="1396" y="629.792">character varying(255) [PK]</text><line style="stroke:#181818;stroke-width:1.0;" x1="1352" x2="1727" y1="637.0938" y2="637.0938"/><ellipse cx="1362" cy="648.0938" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="200" x="1371" y="654.0889">activite_document_type_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1571" y="654.0889">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="138" x="1580" y="654.0889">character varying(3)</text><ellipse cx="1362" cy="664.3906" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="32" x="1371" y="670.3857">date</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1403" y="670.3857">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="147" x="1412" y="670.3857">character varying(10)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="88" x="1371" y="686.6826">activite_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1459" y="686.6826">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="187" x="1468" y="686.6826">character varying(255) [FK]</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="88" x="1371" y="702.9795">description</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1459" y="702.9795">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="165" x="1468" y="702.9795">character varying(1024)</text><ellipse cx="1362" cy="713.2813" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="112" x="1371" y="719.2764">largeobject_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1483" y="719.2764">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="21" x="1492" y="719.2764">oid</text></g><!--MD5=[98c21b909acfdc5b43b5384997a6a13d]
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" height="1491px" preserveAspectRatio="none" style="width:3697px;height:1491px;background:#FFFFFF;" version="1.1" viewBox="0 0 3697 1491" width="3697px" zoomAndPan="magnify"><defs/><g><!--MD5=[3727eb9c1bdb60251e9189fc6af3e2a6]
+class **activites_documents**--><g id="elem_**activites_documents**"><rect codeLine="4" fill="#F1F1F1" height="140.0781" id="**activites_documents**" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="377" x="1370" y="561.5"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="161" x="1478" y="579.4951">activites_documents</text><line style="stroke:#181818;stroke-width:0.5;" x1="1371" x2="1746" y1="587.7969" y2="587.7969"/><ellipse cx="1381" cy="598.7969" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="16" x="1390" y="604.792">id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1406" y="604.792">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="187" x="1415" y="604.792">character varying(255) [PK]</text><line style="stroke:#181818;stroke-width:1.0;" x1="1371" x2="1746" y1="612.0938" y2="612.0938"/><ellipse cx="1381" cy="623.0938" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="200" x="1390" y="629.0889">activite_document_type_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1590" y="629.0889">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="138" x="1599" y="629.0889">character varying(3)</text><ellipse cx="1381" cy="639.3906" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="32" x="1390" y="645.3857">date</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1422" y="645.3857">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="147" x="1431" y="645.3857">character varying(10)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="88" x="1390" y="661.6826">activite_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1478" y="661.6826">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="187" x="1487" y="661.6826">character varying(255) [FK]</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="88" x="1390" y="677.9795">description</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1478" y="677.9795">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="165" x="1487" y="677.9795">character varying(1024)</text><ellipse cx="1381" cy="688.2813" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="112" x="1390" y="694.2764">largeobject_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1502" y="694.2764">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="21" x="1511" y="694.2764">oid</text></g><!--MD5=[98c21b909acfdc5b43b5384997a6a13d]
 class **administrations__activites_types__emails**--><g id="elem_**administrations__activites_types__emails**"><rect codeLine="14" fill="#F1F1F1" height="91.1875" id="**administrations__activites_types__emails**" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="349" x="7" y="7"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="316" x="23.5" y="24.9951">administrations__activites_types__emails</text><line style="stroke:#181818;stroke-width:0.5;" x1="8" x2="355" y1="33.2969" y2="33.2969"/><ellipse cx="18" cy="44.2969" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="128" x="27" y="50.292">activite_type_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="155" y="50.292">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="169" x="164" y="50.292">character varying(3) [PK]</text><ellipse cx="18" cy="60.5938" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="136" x="27" y="66.5889">administration_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="163" y="66.5889">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="178" x="172" y="66.5889">character varying(64) [PK]</text><ellipse cx="18" cy="76.8906" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="40" x="27" y="82.8857">email</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="67" y="82.8857">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="187" x="76" y="82.8857">character varying(255) [PK]</text><line style="stroke:#181818;stroke-width:1.0;" x1="8" x2="355" y1="90.1875" y2="90.1875"/></g><!--MD5=[22e247a918323b06df6f72f599b329ee]
 class **communes**--><g id="elem_**communes**"><rect codeLine="21" fill="#F1F1F1" height="74.8906" id="**communes**" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="220" x="391.5" y="15"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="86" x="458.5" y="32.9951">communes</text><line style="stroke:#181818;stroke-width:0.5;" x1="392.5" x2="610.5" y1="41.2969" y2="41.2969"/><ellipse cx="402.5" cy="52.2969" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="16" x="411.5" y="58.292">id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="427.5" y="58.292">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="169" x="436.5" y="58.292">character varying(5) [PK]</text><line style="stroke:#181818;stroke-width:1.0;" x1="392.5" x2="610.5" y1="65.5938" y2="65.5938"/><ellipse cx="402.5" cy="76.5938" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="24" x="411.5" y="82.5889">nom</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="435.5" y="82.5889">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="444.5" y="82.5889">character varying(255)</text></g><!--MD5=[6455b257e01dfe034fe39fa2939d4b56]
-class **communes_postgis**--><g id="elem_**communes_postgis**"><rect codeLine="27" fill="#F1F1F1" height="74.8906" id="**communes_postgis**" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="293" x="647" y="15"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="151" x="718" y="32.9951">communes_postgis</text><line style="stroke:#181818;stroke-width:0.5;" x1="648" x2="939" y1="41.2969" y2="41.2969"/><ellipse cx="658" cy="52.2969" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="16" x="667" y="58.292">id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="683" y="58.292">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="169" x="692" y="58.292">character varying(5) [PK]</text><line style="stroke:#181818;stroke-width:1.0;" x1="648" x2="939" y1="65.5938" y2="65.5938"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="64" x="653" y="82.5889">geometry</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="717" y="82.5889">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="204" x="726" y="82.5889">geometry(MultiPolygon,4326)</text></g><!--MD5=[c0e48d80bbceed15ca971e8c0e4f5159]
-class **documents**--><g id="elem_**documents**"><rect codeLine="33" fill="#F1F1F1" height="188.9688" id="**documents**" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="334" x="919.5" y="158"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="88" x="1042.5" y="175.9951">documents</text><line style="stroke:#181818;stroke-width:0.5;" x1="920.5" x2="1252.5" y1="184.2969" y2="184.2969"/><ellipse cx="930.5" cy="195.2969" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="16" x="939.5" y="201.292">id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="955.5" y="201.292">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="187" x="964.5" y="201.292">character varying(255) [PK]</text><line style="stroke:#181818;stroke-width:1.0;" x1="920.5" x2="1252.5" y1="208.5938" y2="208.5938"/><ellipse cx="930.5" cy="219.5938" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="56" x="939.5" y="225.5889">type_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="995.5" y="225.5889">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="138" x="1004.5" y="225.5889">character varying(3)</text><ellipse cx="930.5" cy="235.8906" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="32" x="939.5" y="241.8857">date</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="971.5" y="241.8857">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="147" x="980.5" y="241.8857">character varying(10)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="112" x="939.5" y="258.1826">titre_etape_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1051.5" y="258.1826">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="187" x="1060.5" y="258.1826">character varying(128) [FK]</text><ellipse cx="930.5" cy="268.4844" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="88" x="939.5" y="274.4795">description</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1027.5" y="274.4795">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="165" x="1036.5" y="274.4795">character varying(1024)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="56" x="939.5" y="290.7764">fichier</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="995.5" y="290.7764">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="56" x="1004.5" y="290.7764">boolean</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="120" x="939.5" y="307.0732">fichier_type_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1059.5" y="307.0732">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="138" x="1068.5" y="307.0732">character varying(3)</text><ellipse cx="930.5" cy="317.375" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="112" x="939.5" y="323.3701">public_lecture</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1051.5" y="323.3701">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="56" x="1060.5" y="323.3701">boolean</text><ellipse cx="930.5" cy="333.6719" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="152" x="939.5" y="339.667">entreprises_lecture</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1091.5" y="339.667">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="56" x="1100.5" y="339.667">boolean</text></g><!--MD5=[2ba55ab09da773b96a0ac87d3c3048ca]
-class **entreprises**--><g id="elem_**entreprises**"><rect codeLine="46" fill="#F1F1F1" height="303.0469" id="**entreprises**" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="307" x="2211" y="505"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="92" x="2318.5" y="522.9951">entreprises</text><line style="stroke:#181818;stroke-width:0.5;" x1="2212" x2="2517" y1="531.2969" y2="531.2969"/><ellipse cx="2222" cy="542.2969" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="16" x="2231" y="548.292">id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2247" y="548.292">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="178" x="2256" y="548.292">character varying(64) [PK]</text><line style="stroke:#181818;stroke-width:1.0;" x1="2212" x2="2517" y1="555.5938" y2="555.5938"/><ellipse cx="2222" cy="566.5938" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="24" x="2231" y="572.5889">nom</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2255" y="572.5889">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="2264" y="572.5889">character varying(255)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="56" x="2231" y="588.8857">pays_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2287" y="588.8857">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="2296" y="588.8857">character varying(255)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="88" x="2231" y="605.1826">legal_siren</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2319" y="605.1826">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="2328" y="605.1826">character varying(255)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="112" x="2231" y="621.4795">legal_etranger</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2343" y="621.4795">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="2352" y="621.4795">character varying(255)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="88" x="2231" y="637.7764">legal_forme</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2319" y="637.7764">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="2328" y="637.7764">character varying(255)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="72" x="2231" y="654.0732">categorie</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2303" y="654.0732">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="2312" y="654.0732">character varying(255)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="104" x="2231" y="670.3701">date_creation</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2335" y="670.3701">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="147" x="2344" y="670.3701">character varying(10)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="56" x="2231" y="686.667">adresse</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2287" y="686.667">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="2296" y="686.667">character varying(255)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="88" x="2231" y="702.9639">code_postal</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2319" y="702.9639">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="2328" y="702.9639">character varying(255)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="56" x="2231" y="719.2607">commune</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2287" y="719.2607">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="2296" y="719.2607">character varying(255)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="40" x="2231" y="735.5576">cedex</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2271" y="735.5576">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="2280" y="735.5576">character varying(255)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="24" x="2231" y="751.8545">url</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2255" y="751.8545">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="165" x="2264" y="751.8545">character varying(1024)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="40" x="2231" y="768.1514">email</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2271" y="768.1514">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="2280" y="768.1514">character varying(255)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="72" x="2231" y="784.4482">telephone</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2303" y="784.4482">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="2312" y="784.4482">character varying(255)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="56" x="2231" y="800.7451">archive</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2287" y="800.7451">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="56" x="2296" y="800.7451">boolean</text></g><!--MD5=[375227ba392393c97fb98039413a079e]
-class **entreprises_documents**--><g id="elem_**entreprises_documents**"><rect codeLine="66" fill="#F1F1F1" height="140.0781" id="**entreprises_documents**" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="393" x="2580" y="182.5"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="187" x="2683" y="200.4951">entreprises_documents</text><line style="stroke:#181818;stroke-width:0.5;" x1="2581" x2="2972" y1="208.7969" y2="208.7969"/><ellipse cx="2591" cy="219.7969" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="16" x="2600" y="225.792">id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2616" y="225.792">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="187" x="2625" y="225.792">character varying(255) [PK]</text><line style="stroke:#181818;stroke-width:1.0;" x1="2581" x2="2972" y1="233.0938" y2="233.0938"/><ellipse cx="2591" cy="244.0938" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="216" x="2600" y="250.0889">entreprise_document_type_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2816" y="250.0889">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="138" x="2825" y="250.0889">character varying(3)</text><ellipse cx="2591" cy="260.3906" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="32" x="2600" y="266.3857">date</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2632" y="266.3857">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="147" x="2641" y="266.3857">character varying(10)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="104" x="2600" y="282.6826">entreprise_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2704" y="282.6826">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="178" x="2713" y="282.6826">character varying(64) [FK]</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="88" x="2600" y="298.9795">description</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2688" y="298.9795">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="165" x="2697" y="298.9795">character varying(1024)</text><ellipse cx="2591" cy="309.2813" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="112" x="2600" y="315.2764">largeobject_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2712" y="315.2764">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="21" x="2721" y="315.2764">oid</text></g><!--MD5=[9b2d88c35f5efdfa950390ca359aaa80]
-class **entreprises_etablissements**--><g id="elem_**entreprises_etablissements**"><rect codeLine="76" fill="#F1F1F1" height="140.0781" id="**entreprises_etablissements**" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="317" x="3008" y="182.5"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="219" x="3057" y="200.4951">entreprises_etablissements</text><line style="stroke:#181818;stroke-width:0.5;" x1="3009" x2="3324" y1="208.7969" y2="208.7969"/><ellipse cx="3019" cy="219.7969" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="16" x="3028" y="225.792">id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="3044" y="225.792">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="178" x="3053" y="225.792">character varying(64) [PK]</text><line style="stroke:#181818;stroke-width:1.0;" x1="3009" x2="3324" y1="233.0938" y2="233.0938"/><ellipse cx="3019" cy="244.0938" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="104" x="3028" y="250.0889">entreprise_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="3132" y="250.0889">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="178" x="3141" y="250.0889">character varying(64) [FK]</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="24" x="3028" y="266.3857">nom</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="3052" y="266.3857">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="3061" y="266.3857">character varying(255)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="88" x="3028" y="282.6826">legal_siret</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="3116" y="282.6826">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="3125" y="282.6826">character varying(255)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="80" x="3028" y="298.9795">date_debut</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="3108" y="298.9795">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="147" x="3117" y="298.9795">character varying(10)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="64" x="3028" y="315.2764">date_fin</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="3092" y="315.2764">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="147" x="3101" y="315.2764">character varying(10)</text></g><!--MD5=[ba1548a72ebb734d80c164ad6b3ace5d]
-class **forets_postgis**--><g id="elem_**forets_postgis**"><rect codeLine="86" fill="#F1F1F1" height="74.8906" id="**forets_postgis**" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="293" x="35" y="215"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="113" x="125" y="232.9951">forets_postgis</text><line style="stroke:#181818;stroke-width:0.5;" x1="36" x2="327" y1="241.2969" y2="241.2969"/><ellipse cx="46" cy="252.2969" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="16" x="55" y="258.292">id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="71" y="258.292">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="178" x="80" y="258.292">character varying(30) [PK]</text><line style="stroke:#181818;stroke-width:1.0;" x1="36" x2="327" y1="265.5938" y2="265.5938"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="64" x="41" y="282.5889">geometry</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="105" y="282.5889">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="204" x="114" y="282.5889">geometry(MultiPolygon,4326)</text></g><!--MD5=[f8502021969469c2e2606089cfb35cf2]
-class **journaux**--><g id="elem_**journaux**"><rect codeLine="92" fill="#F1F1F1" height="156.375" id="**journaux**" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="307" x="1089" y="1015"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="69" x="1208" y="1032.9951">journaux</text><line style="stroke:#181818;stroke-width:0.5;" x1="1090" x2="1395" y1="1041.2969" y2="1041.2969"/><ellipse cx="1100" cy="1052.2969" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="16" x="1109" y="1058.292">id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1125" y="1058.292">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="187" x="1134" y="1058.292">character varying(255) [PK]</text><line style="stroke:#181818;stroke-width:1.0;" x1="1090" x2="1395" y1="1065.5938" y2="1065.5938"/><ellipse cx="1100" cy="1076.5938" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="112" x="1109" y="1082.5889">utilisateur_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1221" y="1082.5889">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="1230" y="1082.5889">character varying(255)</text><ellipse cx="1100" cy="1092.8906" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="32" x="1109" y="1098.8857">date</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1141" y="1098.8857">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="176" x="1150" y="1098.8857">timestamp with time zone</text><ellipse cx="1100" cy="1109.1875" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="80" x="1109" y="1115.1826">element_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1189" y="1115.1826">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="1198" y="1115.1826">character varying(255)</text><ellipse cx="1100" cy="1125.4844" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="72" x="1109" y="1131.4795">operation</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1181" y="1131.4795">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="27" x="1190" y="1131.4795">text</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="88" x="1109" y="1147.7764">differences</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1197" y="1147.7764">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="37" x="1206" y="1147.7764">jsonb</text><ellipse cx="1100" cy="1158.0781" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="64" x="1109" y="1164.0732">titre_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1173" y="1164.0732">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="187" x="1182" y="1164.0732">character varying(128) [FK]</text></g><!--MD5=[8c8732e953ec6f00fbf5efa1803573aa]
-class **knex_migrations**--><g id="elem_**knex_migrations**"><rect codeLine="103" fill="#F1F1F1" height="107.4844" id="**knex_migrations**" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="313" x="363" y="199"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="128" x="455.5" y="216.9951">knex_migrations</text><line style="stroke:#181818;stroke-width:0.5;" x1="364" x2="675" y1="225.2969" y2="225.2969"/><ellipse cx="374" cy="236.2969" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="16" x="383" y="242.292">id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="399" y="242.292">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="66" x="408" y="242.292">serial [PK]</text><line style="stroke:#181818;stroke-width:1.0;" x1="364" x2="675" y1="249.5938" y2="249.5938"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="32" x="369" y="266.5889">name</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="401" y="266.5889">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="410" y="266.5889">character varying(255)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="40" x="369" y="282.8857">batch</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="409" y="282.8857">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="49" x="418" y="282.8857">integer</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="112" x="369" y="299.1826">migration_time</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="481" y="299.1826">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="176" x="490" y="299.1826">timestamp with time zone</text></g><!--MD5=[e285313659388471fd77d27c8838eebf]
-class **knex_migrations_lock**--><g id="elem_**knex_migrations_lock**"><rect codeLine="111" fill="#F1F1F1" height="74.8906" id="**knex_migrations_lock**" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="173" x="711" y="215"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="167" x="714" y="232.9951">knex_migrations_lock</text><line style="stroke:#181818;stroke-width:0.5;" x1="712" x2="883" y1="241.2969" y2="241.2969"/><ellipse cx="722" cy="252.2969" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="40" x="731" y="258.292">index</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="771" y="258.292">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="66" x="780" y="258.292">serial [PK]</text><line style="stroke:#181818;stroke-width:1.0;" x1="712" x2="883" y1="265.5938" y2="265.5938"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="72" x="717" y="282.5889">is_locked</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="789" y="282.5889">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="49" x="798" y="282.5889">integer</text></g><!--MD5=[49c0fd81dd385a66e5ecaac04d75aab3]
-class **perimetre_reference**--><g id="elem_**perimetre_reference**"><rect codeLine="117" fill="#F1F1F1" height="107.4844" id="**perimetre_reference**" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="361" x="1288" y="199"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="164" x="1386.5" y="216.9951">perimetre_reference</text><line style="stroke:#181818;stroke-width:0.5;" x1="1289" x2="1648" y1="225.2969" y2="225.2969"/><ellipse cx="1299" cy="236.2969" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="112" x="1308" y="242.292">titre_etape_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1420" y="242.292">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="214" x="1429" y="242.292">character varying(255) [PK][FK]</text><ellipse cx="1299" cy="252.5938" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="88" x="1308" y="258.5889">geo_systeme</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1396" y="258.5889">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="187" x="1405" y="258.5889">character varying(255) [PK]</text><line style="stroke:#181818;stroke-width:1.0;" x1="1289" x2="1648" y1="265.8906" y2="265.8906"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="72" x="1294" y="282.8857">opposable</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1366" y="282.8857">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="56" x="1375" y="282.8857">boolean</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="136" x="1294" y="299.1826">geojson_perimetre</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1430" y="299.1826">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="37" x="1439" y="299.1826">jsonb</text></g><!--MD5=[cf317b8f35ef6caa7c0cc8e48e619152]
-class **sdom_zones_postgis**--><g id="elem_**sdom_zones_postgis**"><rect codeLine="125" fill="#F1F1F1" height="74.8906" id="**sdom_zones_postgis**" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="293" x="35" y="619"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="163" x="100" y="636.9951">sdom_zones_postgis</text><line style="stroke:#181818;stroke-width:0.5;" x1="36" x2="327" y1="645.2969" y2="645.2969"/><ellipse cx="46" cy="656.2969" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="16" x="55" y="662.292">id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="71" y="662.292">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="178" x="80" y="662.292">character varying(30) [PK]</text><line style="stroke:#181818;stroke-width:1.0;" x1="36" x2="327" y1="669.5938" y2="669.5938"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="64" x="41" y="686.5889">geometry</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="105" y="686.5889">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="204" x="114" y="686.5889">geometry(MultiPolygon,4326)</text></g><!--MD5=[334142c1e77c30d5f5c7acc29c1e50bc]
-class **secteurs_maritime_postgis**--><g id="elem_**secteurs_maritime_postgis**"><rect codeLine="131" fill="#F1F1F1" height="74.8906" id="**secteurs_maritime_postgis**" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="293" x="363" y="619"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="210" x="404.5" y="636.9951">secteurs_maritime_postgis</text><line style="stroke:#181818;stroke-width:0.5;" x1="364" x2="655" y1="645.2969" y2="645.2969"/><ellipse cx="374" cy="656.2969" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="16" x="383" y="662.292">id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="399" y="662.292">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="80" x="408" y="662.292">integer [PK]</text><line style="stroke:#181818;stroke-width:1.0;" x1="364" x2="655" y1="669.5938" y2="669.5938"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="64" x="369" y="686.5889">geometry</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="433" y="686.5889">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="204" x="442" y="686.5889">geometry(MultiPolygon,4326)</text></g><!--MD5=[000bdc8fca937d4114719a6aff4ea039]
-class **spatial_ref_sys**--><g id="elem_**spatial_ref_sys**"><rect codeLine="137" fill="#F1F1F1" height="123.7813" id="**spatial_ref_sys**" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="262" x="691.5" y="594.5"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="115" x="765" y="612.4951">spatial_ref_sys</text><line style="stroke:#181818;stroke-width:0.5;" x1="692.5" x2="952.5" y1="620.7969" y2="620.7969"/><ellipse cx="702.5" cy="631.7969" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="32" x="711.5" y="637.792">srid</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="743.5" y="637.792">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="80" x="752.5" y="637.792">integer [PK]</text><line style="stroke:#181818;stroke-width:1.0;" x1="692.5" x2="952.5" y1="645.0938" y2="645.0938"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="72" x="697.5" y="662.0889">auth_name</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="769.5" y="662.0889">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="778.5" y="662.0889">character varying(256)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="72" x="697.5" y="678.3857">auth_srid</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="769.5" y="678.3857">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="49" x="778.5" y="678.3857">integer</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="48" x="697.5" y="694.6826">srtext</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="745.5" y="694.6826">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="165" x="754.5" y="694.6826">character varying(2048)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="72" x="697.5" y="710.9795">proj4text</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="769.5" y="710.9795">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="165" x="778.5" y="710.9795">character varying(2048)</text></g><!--MD5=[737231e93f89167ae129923b20117fe6]
-class **titres**--><g id="elem_**titres**"><rect codeLine="146" fill="#F1F1F1" height="205.2656" id="**titres**" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="323" x="1081" y="1288.5"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="42" x="1221.5" y="1306.4951">titres</text><line style="stroke:#181818;stroke-width:0.5;" x1="1082" x2="1403" y1="1314.7969" y2="1314.7969"/><ellipse cx="1092" cy="1325.7969" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="16" x="1101" y="1331.792">id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1117" y="1331.792">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="187" x="1126" y="1331.792">character varying(128) [PK]</text><line style="stroke:#181818;stroke-width:1.0;" x1="1082" x2="1403" y1="1339.0938" y2="1339.0938"/><ellipse cx="1092" cy="1350.0938" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="24" x="1101" y="1356.0889">nom</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1125" y="1356.0889">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="1134" y="1356.0889">character varying(255)</text><ellipse cx="1092" cy="1366.3906" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="56" x="1101" y="1372.3857">type_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1157" y="1372.3857">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="138" x="1166" y="1372.3857">character varying(3)</text><ellipse cx="1092" cy="1382.6875" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="120" x="1101" y="1388.6826">titre_statut_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1221" y="1388.6826">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="138" x="1230" y="1388.6826">character varying(3)</text><ellipse cx="1092" cy="1398.9844" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="112" x="1101" y="1404.9795">public_lecture</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1213" y="1404.9795">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="56" x="1222" y="1404.9795">boolean</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="128" x="1101" y="1421.2764">doublon_titre_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1229" y="1421.2764">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="1238" y="1421.2764">character varying(128)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="176" x="1101" y="1437.5732">props_titre_etapes_ids</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1277" y="1437.5732">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="37" x="1286" y="1437.5732">jsonb</text><ellipse cx="1092" cy="1447.875" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="32" x="1101" y="1453.8701">slug</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1133" y="1453.8701">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="1142" y="1453.8701">character varying(255)</text><ellipse cx="1092" cy="1464.1719" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="56" x="1101" y="1470.167">archive</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1157" y="1470.167">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="56" x="1166" y="1470.167">boolean</text><ellipse cx="1092" cy="1480.4688" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="80" x="1101" y="1486.4639">references</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1181" y="1486.4639">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="37" x="1190" y="1486.4639">jsonb</text></g><!--MD5=[a297b16a76b58c01aa4b71caf064a7fa]
-class **titres__titres**--><g id="elem_**titres__titres**"><rect codeLine="160" fill="#F1F1F1" height="74.8906" id="**titres__titres**" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="353" x="701" y="1055.5"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="98" x="828.5" y="1073.4951">titres__titres</text><line style="stroke:#181818;stroke-width:0.5;" x1="702" x2="1053" y1="1081.7969" y2="1081.7969"/><ellipse cx="712" cy="1092.7969" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="104" x="721" y="1098.792">titre_from_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="825" y="1098.792">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="214" x="834" y="1098.792">character varying(255) [PK][FK]</text><ellipse cx="712" cy="1109.0938" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="88" x="721" y="1115.0889">titre_to_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="809" y="1115.0889">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="214" x="818" y="1115.0889">character varying(255) [PK][FK]</text><line style="stroke:#181818;stroke-width:1.0;" x1="702" x2="1053" y1="1122.3906" y2="1122.3906"/></g><!--MD5=[40f6ce71af2e61863eb513e8561b13cd]
-class **titres_activites**--><g id="elem_**titres_activites**"><rect codeLine="166" fill="#F1F1F1" height="254.1563" id="**titres_activites**" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="334" x="1430.5" y="966"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="115" x="1540" y="983.9951">titres_activites</text><line style="stroke:#181818;stroke-width:0.5;" x1="1431.5" x2="1763.5" y1="992.2969" y2="992.2969"/><ellipse cx="1441.5" cy="1003.2969" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="16" x="1450.5" y="1009.292">id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1466.5" y="1009.292">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="187" x="1475.5" y="1009.292">character varying(255) [PK]</text><line style="stroke:#181818;stroke-width:1.0;" x1="1431.5" x2="1763.5" y1="1016.5938" y2="1016.5938"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="64" x="1450.5" y="1033.5889">titre_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1514.5" y="1033.5889">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="187" x="1523.5" y="1033.5889">character varying(128) [FK]</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="112" x="1450.5" y="1049.8857">utilisateur_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1562.5" y="1049.8857">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="187" x="1571.5" y="1049.8857">character varying(128) [FK]</text><ellipse cx="1441.5" cy="1060.1875" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="32" x="1450.5" y="1066.1826">date</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1482.5" y="1066.1826">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="147" x="1491.5" y="1066.1826">character varying(10)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="88" x="1450.5" y="1082.4795">date_saisie</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1538.5" y="1082.4795">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="147" x="1547.5" y="1082.4795">character varying(10)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="56" x="1450.5" y="1098.7764">contenu</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1506.5" y="1098.7764">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="37" x="1515.5" y="1098.7764">jsonb</text><ellipse cx="1441.5" cy="1109.0781" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="56" x="1450.5" y="1115.0732">type_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1506.5" y="1115.0732">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="138" x="1515.5" y="1115.0732">character varying(3)</text><ellipse cx="1441.5" cy="1125.375" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="144" x="1450.5" y="1131.3701">activite_statut_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1594.5" y="1131.3701">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="138" x="1603.5" y="1131.3701">character varying(3)</text><ellipse cx="1441.5" cy="1141.6719" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="40" x="1450.5" y="1147.667">annee</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1490.5" y="1147.667">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="49" x="1499.5" y="1147.667">integer</text><ellipse cx="1441.5" cy="1157.9688" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="80" x="1450.5" y="1163.9639">periode_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1530.5" y="1163.9639">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="49" x="1539.5" y="1163.9639">integer</text><ellipse cx="1441.5" cy="1174.2656" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="64" x="1450.5" y="1180.2607">sections</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1514.5" y="1180.2607">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="47" x="1523.5" y="1180.2607">jsonb[]</text><ellipse cx="1441.5" cy="1190.5625" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="88" x="1450.5" y="1196.5576">suppression</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1538.5" y="1196.5576">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="56" x="1547.5" y="1196.5576">boolean</text><ellipse cx="1441.5" cy="1206.8594" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="32" x="1450.5" y="1212.8545">slug</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1482.5" y="1212.8545">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="1491.5" y="1212.8545">character varying(255)</text></g><!--MD5=[42972415c740e3b09b6ff41a0d57d815]
-class **titres_amodiataires**--><g id="elem_**titres_amodiataires**"><rect codeLine="183" fill="#F1F1F1" height="91.1875" id="**titres_amodiataires**" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="361" x="2184" y="207"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="150" x="2289.5" y="224.9951">titres_amodiataires</text><line style="stroke:#181818;stroke-width:0.5;" x1="2185" x2="2544" y1="233.2969" y2="233.2969"/><ellipse cx="2195" cy="244.2969" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="112" x="2204" y="250.292">titre_etape_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2316" y="250.292">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="214" x="2325" y="250.292">character varying(128) [PK][FK]</text><ellipse cx="2195" cy="260.5938" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="104" x="2204" y="266.5889">entreprise_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2308" y="266.5889">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="205" x="2317" y="266.5889">character varying(64) [PK][FK]</text><line style="stroke:#181818;stroke-width:1.0;" x1="2185" x2="2544" y1="273.8906" y2="273.8906"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="72" x="2190" y="290.8857">operateur</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2262" y="290.8857">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="56" x="2271" y="290.8857">boolean</text></g><!--MD5=[2604fd8a31308cb82a14687ac7a1a229]
-class **titres_demarches**--><g id="elem_**titres_demarches**"><rect codeLine="190" fill="#F1F1F1" height="237.8594" id="**titres_demarches**" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="338" x="1799.5" y="974"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="137" x="1900" y="991.9951">titres_demarches</text><line style="stroke:#181818;stroke-width:0.5;" x1="1800.5" x2="2136.5" y1="1000.2969" y2="1000.2969"/><ellipse cx="1810.5" cy="1011.2969" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="16" x="1819.5" y="1017.292">id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1835.5" y="1017.292">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="187" x="1844.5" y="1017.292">character varying(128) [PK]</text><line style="stroke:#181818;stroke-width:1.0;" x1="1800.5" x2="2136.5" y1="1024.5938" y2="1024.5938"/><ellipse cx="1810.5" cy="1035.5938" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="64" x="1819.5" y="1041.5889">titre_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1883.5" y="1041.5889">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="187" x="1892.5" y="1041.5889">character varying(128) [FK]</text><ellipse cx="1810.5" cy="1051.8906" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="56" x="1819.5" y="1057.8857">type_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1875.5" y="1057.8857">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="138" x="1884.5" y="1057.8857">character varying(3)</text><ellipse cx="1810.5" cy="1068.1875" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="72" x="1819.5" y="1074.1826">statut_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1891.5" y="1074.1826">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="138" x="1900.5" y="1074.1826">character varying(3)</text><ellipse cx="1810.5" cy="1084.4844" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="112" x="1819.5" y="1090.4795">public_lecture</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1931.5" y="1090.4795">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="56" x="1940.5" y="1090.4795">boolean</text><ellipse cx="1810.5" cy="1100.7813" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="152" x="1819.5" y="1106.7764">entreprises_lecture</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1971.5" y="1106.7764">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="56" x="1980.5" y="1106.7764">boolean</text><ellipse cx="1810.5" cy="1117.0781" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="40" x="1819.5" y="1123.0732">ordre</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1859.5" y="1123.0732">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="49" x="1868.5" y="1123.0732">integer</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="32" x="1819.5" y="1139.3701">slug</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1851.5" y="1139.3701">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="1860.5" y="1139.3701">character varying(255)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="88" x="1819.5" y="1155.667">description</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1907.5" y="1155.667">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="1916.5" y="1155.667">character varying(255)</text><ellipse cx="1810.5" cy="1165.9688" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="56" x="1819.5" y="1171.9639">archive</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1875.5" y="1171.9639">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="56" x="1884.5" y="1171.9639">boolean</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="152" x="1819.5" y="1188.2607">demarche_date_debut</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1971.5" y="1188.2607">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="147" x="1980.5" y="1188.2607">character varying(10)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="136" x="1819.5" y="1204.5576">demarche_date_fin</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1955.5" y="1204.5576">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="147" x="1964.5" y="1204.5576">character varying(10)</text></g><!--MD5=[4319517b19d071d8401fcc94ca04af3d]
-class **titres_etapes**--><g id="elem_**titres_etapes**"><rect codeLine="206" fill="#F1F1F1" height="498.6094" id="**titres_etapes**" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="411" x="1763" y="407"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="103" x="1917" y="424.9951">titres_etapes</text><line style="stroke:#181818;stroke-width:0.5;" x1="1764" x2="2173" y1="433.2969" y2="433.2969"/><ellipse cx="1774" cy="444.2969" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="16" x="1783" y="450.292">id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1799" y="450.292">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="187" x="1808" y="450.292">character varying(128) [PK]</text><line style="stroke:#181818;stroke-width:1.0;" x1="1764" x2="2173" y1="457.5938" y2="457.5938"/><ellipse cx="1774" cy="468.5938" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="136" x="1783" y="474.5889">titre_demarche_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1919" y="474.5889">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="187" x="1928" y="474.5889">character varying(128) [FK]</text><ellipse cx="1774" cy="484.8906" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="56" x="1783" y="490.8857">type_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1839" y="490.8857">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="138" x="1848" y="490.8857">character varying(3)</text><ellipse cx="1774" cy="501.1875" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="72" x="1783" y="507.1826">statut_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1855" y="507.1826">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="138" x="1864" y="507.1826">character varying(3)</text><ellipse cx="1774" cy="517.4844" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="40" x="1783" y="523.4795">ordre</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1823" y="523.4795">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="49" x="1832" y="523.4795">integer</text><ellipse cx="1774" cy="533.7813" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="32" x="1783" y="539.7764">date</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1815" y="539.7764">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="147" x="1824" y="539.7764">character varying(10)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="80" x="1783" y="556.0732">date_debut</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1863" y="556.0732">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="147" x="1872" y="556.0732">character varying(10)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="64" x="1783" y="572.3701">date_fin</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1847" y="572.3701">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="147" x="1856" y="572.3701">character varying(10)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="40" x="1783" y="588.667">duree</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1823" y="588.667">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="49" x="1832" y="588.667">integer</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="56" x="1783" y="604.9639">surface</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1839" y="604.9639">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="25" x="1848" y="604.9639">real</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="56" x="1783" y="621.2607">contenu</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1839" y="621.2607">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="37" x="1848" y="621.2607">jsonb</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="112" x="1783" y="637.5576">heritage_props</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1895" y="637.5576">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="37" x="1904" y="637.5576">jsonb</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="128" x="1783" y="653.8545">heritage_contenu</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1911" y="653.8545">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="37" x="1920" y="653.8545">jsonb</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="32" x="1783" y="670.1514">slug</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1815" y="670.1514">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="1824" y="670.1514">character varying(255)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="208" x="1783" y="686.4482">decisions_annexes_sections</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1991" y="686.4482">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="47" x="2000" y="686.4482">jsonb[]</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="200" x="1783" y="702.7451">decisions_annexes_contenu</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1983" y="702.7451">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="28" x="1992" y="702.7451">json</text><ellipse cx="1774" cy="713.0469" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="56" x="1783" y="719.042">archive</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1839" y="719.042">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="56" x="1848" y="719.042">boolean</text><ellipse cx="1774" cy="729.3438" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="80" x="1783" y="735.3389">substances</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1863" y="735.3389">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="37" x="1872" y="735.3389">jsonb</text><ellipse cx="1774" cy="745.6406" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="136" x="1783" y="751.6357">secteurs_maritime</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1919" y="751.6357">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="37" x="1928" y="751.6357">jsonb</text><ellipse cx="1774" cy="761.9375" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="184" x="1783" y="767.9326">administrations_locales</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1967" y="767.9326">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="37" x="1976" y="767.9326">jsonb</text><ellipse cx="1774" cy="778.2344" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="80" x="1783" y="784.2295">sdom_zones</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1863" y="784.2295">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="37" x="1872" y="784.2295">jsonb</text><ellipse cx="1774" cy="794.5313" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="48" x="1783" y="800.5264">forets</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1831" y="800.5264">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="37" x="1840" y="800.5264">jsonb</text><ellipse cx="1774" cy="810.8281" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="64" x="1783" y="816.8232">communes</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1847" y="816.8232">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="37" x="1856" y="816.8232">jsonb</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="40" x="1783" y="833.1201">notes</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1823" y="833.1201">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="27" x="1832" y="833.1201">text</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="168" x="1783" y="849.417">geojson4326_perimetre</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1951" y="849.417">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="204" x="1960" y="849.417">geometry(MultiPolygon,4326)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="144" x="1783" y="865.7139">geojson4326_points</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1927" y="865.7139">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="37" x="1936" y="865.7139">jsonb</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="32" x="1783" y="882.0107">bbox</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1815" y="882.0107">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="186" x="1824" y="882.0107">geometry(Geometry,4326)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="40" x="1783" y="898.3076">bbox2</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1823" y="898.3076">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="172" x="1832" y="898.3076">geometry(Polygon,4326)</text></g><!--MD5=[8ad9f766679bda46a9a557fa539d4780]
-class **titres_etapes_entreprises_documents**--><g id="elem_**titres_etapes_entreprises_documents**"><rect codeLine="238" fill="#F1F1F1" height="74.8906" id="**titres_etapes_entreprises_documents**" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="425" x="2035" y="15"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="297" x="2099" y="32.9951">titres_etapes_entreprises_documents</text><line style="stroke:#181818;stroke-width:0.5;" x1="2036" x2="2459" y1="41.2969" y2="41.2969"/><ellipse cx="2046" cy="52.2969" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="112" x="2055" y="58.292">titre_etape_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2167" y="58.292">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="214" x="2176" y="58.292">character varying(128) [PK][FK]</text><ellipse cx="2046" cy="68.5938" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="176" x="2055" y="74.5889">entreprise_document_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2231" y="74.5889">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="214" x="2240" y="74.5889">character varying(255) [PK][FK]</text><line style="stroke:#181818;stroke-width:1.0;" x1="2036" x2="2459" y1="81.8906" y2="81.8906"/></g><!--MD5=[0caad3fb92d45f9453328b20dd20e574]
-class **titres_titulaires**--><g id="elem_**titres_titulaires**"><rect codeLine="244" fill="#F1F1F1" height="91.1875" id="**titres_titulaires**" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="361" x="1788" y="207"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="118" x="1909.5" y="224.9951">titres_titulaires</text><line style="stroke:#181818;stroke-width:0.5;" x1="1789" x2="2148" y1="233.2969" y2="233.2969"/><ellipse cx="1799" cy="244.2969" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="112" x="1808" y="250.292">titre_etape_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1920" y="250.292">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="214" x="1929" y="250.292">character varying(128) [PK][FK]</text><ellipse cx="1799" cy="260.5938" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="104" x="1808" y="266.5889">entreprise_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1912" y="266.5889">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="205" x="1921" y="266.5889">character varying(64) [PK][FK]</text><line style="stroke:#181818;stroke-width:1.0;" x1="1789" x2="2148" y1="273.8906" y2="273.8906"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="72" x="1794" y="290.8857">operateur</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1866" y="290.8857">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="56" x="1875" y="290.8857">boolean</text></g><!--MD5=[bb4894758e5c56d39e342e991b469faa]
-class **utilisateurs**--><g id="elem_**utilisateurs**"><rect codeLine="251" fill="#F1F1F1" height="221.5625" id="**utilisateurs**" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="331" x="2187" y="1280"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="88" x="2308.5" y="1297.9951">utilisateurs</text><line style="stroke:#181818;stroke-width:0.5;" x1="2188" x2="2517" y1="1306.2969" y2="1306.2969"/><ellipse cx="2198" cy="1317.2969" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="16" x="2207" y="1323.292">id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2223" y="1323.292">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="187" x="2232" y="1323.292">character varying(255) [PK]</text><line style="stroke:#181818;stroke-width:1.0;" x1="2188" x2="2517" y1="1330.5938" y2="1330.5938"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="40" x="2207" y="1347.5889">email</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2247" y="1347.5889">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="2256" y="1347.5889">character varying(255)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="24" x="2207" y="1363.8857">nom</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2231" y="1363.8857">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="2240" y="1363.8857">character varying(255)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="48" x="2207" y="1380.1826">prenom</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2255" y="1380.1826">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="2264" y="1380.1826">character varying(255)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="112" x="2207" y="1396.4795">telephone_fixe</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2319" y="1396.4795">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="2328" y="1396.4795">character varying(255)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="128" x="2207" y="1412.7764">telephone_mobile</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2335" y="1412.7764">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="2344" y="1412.7764">character varying(255)</text><ellipse cx="2198" cy="1423.0781" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="32" x="2207" y="1429.0732">role</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2239" y="1429.0732">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="2248" y="1429.0732">character varying(255)</text><ellipse cx="2198" cy="1439.375" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="104" x="2207" y="1445.3701">date_creation</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2311" y="1445.3701">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="2320" y="1445.3701">character varying(255)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="136" x="2207" y="1461.667">administration_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2343" y="1461.667">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="2352" y="1461.667">character varying(255)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="80" x="2207" y="1477.9639">qgis_token</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2287" y="1477.9639">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="2296" y="1477.9639">character varying(255)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="88" x="2207" y="1494.2607">keycloak_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2295" y="1494.2607">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="2304" y="1494.2607">character varying(255)</text></g><!--MD5=[d3168609e77bb21165f416225b8eb07d]
-class **utilisateurs__entreprises**--><g id="elem_**utilisateurs__entreprises**"><rect codeLine="266" fill="#F1F1F1" height="74.8906" id="**utilisateurs__entreprises**" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="311" x="3360" y="215"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="194" x="3418.5" y="232.9951">utilisateurs__entreprises</text><line style="stroke:#181818;stroke-width:0.5;" x1="3361" x2="3670" y1="241.2969" y2="241.2969"/><line style="stroke:#181818;stroke-width:1.0;" x1="3361" x2="3670" y1="249.2969" y2="249.2969"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="112" x="3366" y="266.292">utilisateur_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="3478" y="266.292">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="178" x="3487" y="266.292">character varying(64) [FK]</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="104" x="3366" y="282.5889">entreprise_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="3470" y="282.5889">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="178" x="3479" y="282.5889">character varying(64) [FK]</text></g><!--MD5=[9d27d9fcc6b6982070ce8832a6b94dd0]
-class **utilisateurs__titres**--><g id="elem_**utilisateurs__titres**"><rect codeLine="272" fill="#F1F1F1" height="74.8906" id="**utilisateurs__titres**" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="361" x="2172" y="1055.5"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="144" x="2280.5" y="1073.4951">utilisateurs__titres</text><line style="stroke:#181818;stroke-width:0.5;" x1="2173" x2="2532" y1="1081.7969" y2="1081.7969"/><ellipse cx="2183" cy="1092.7969" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="112" x="2192" y="1098.792">utilisateur_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2304" y="1098.792">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="214" x="2313" y="1098.792">character varying(255) [PK][FK]</text><ellipse cx="2183" cy="1109.0938" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="64" x="2192" y="1115.0889">titre_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2256" y="1115.0889">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="214" x="2265" y="1115.0889">character varying(255) [PK][FK]</text><line style="stroke:#181818;stroke-width:1.0;" x1="2173" x2="2532" y1="1122.3906" y2="1122.3906"/></g><!--MD5=[c8519d2510d151072fb67158a2d819bf]
-reverse link **activites_documents** to **titres_activites**--><g id="link_**activites_documents**_**titres_activites**"><path codeLine="278" d="M1579.25,734.6313 C1579.25,734.6313 1579.25,965.8159 1579.25,965.8159 " fill="none" id="**activites_documents**-backto-**titres_activites**" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="1579.25" x2="1571.25" y1="734.6313" y2="726.6313"/><line style="stroke:#181818;stroke-width:1.0;" x1="1579.25" x2="1587.25" y1="734.6313" y2="726.6313"/><line style="stroke:#181818;stroke-width:1.0;" x1="1579.25" x2="1579.25" y1="734.6313" y2="726.6313"/></g><!--MD5=[545e49810632fe127976840a11506069]
-reverse link **documents** to **titres_etapes**--><g id="link_**documents**_**titres_etapes**"><path codeLine="280" d="M1261.591,335 C1261.591,335 1771.3333,335 1771.3333,335 C1771.3333,335 1771.3333,365.0379 1771.3333,406.7507 " fill="none" id="**documents**-backto-**titres_etapes**" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="1261.591" x2="1253.591" y1="335" y2="343"/><line style="stroke:#181818;stroke-width:1.0;" x1="1261.591" x2="1253.591" y1="335" y2="327"/><line style="stroke:#181818;stroke-width:1.0;" x1="1261.591" x2="1253.591" y1="335" y2="335"/></g><!--MD5=[04d44480ca2d124fc6f6fad57b7a66d2]
-reverse link **entreprises_documents** to **entreprises**--><g id="link_**entreprises_documents**_**entreprises**"><path codeLine="282" d="M2571.5445,315 C2571.5445,315 2441.25,315 2441.25,315 C2441.25,315 2441.25,413.5181 2441.25,504.7244 " fill="none" id="**entreprises_documents**-backto-**entreprises**" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="2571.5445" x2="2579.5445" y1="315" y2="307"/><line style="stroke:#181818;stroke-width:1.0;" x1="2571.5445" x2="2579.5445" y1="315" y2="323"/><line style="stroke:#181818;stroke-width:1.0;" x1="2571.5445" x2="2579.5445" y1="315" y2="315"/></g><!--MD5=[8ac700e74e3f5e198f9a2f6efe827f55]
-reverse link **entreprises_etablissements** to **entreprises**--><g id="link_**entreprises_etablissements**_**entreprises**"><path codeLine="284" d="M3166.5,330.7629 C3166.5,330.7629 3166.5,606 3166.5,606 C3166.5,606 2751.0589,606 2518.1847,606 " fill="none" id="**entreprises_etablissements**-backto-**entreprises**" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="3166.5" x2="3158.5" y1="330.7629" y2="322.7629"/><line style="stroke:#181818;stroke-width:1.0;" x1="3166.5" x2="3174.5" y1="330.7629" y2="322.7629"/><line style="stroke:#181818;stroke-width:1.0;" x1="3166.5" x2="3166.5" y1="330.7629" y2="322.7629"/></g><!--MD5=[30325fd5a01508112ac852c48e8fab8f]
-reverse link **journaux** to **titres**--><g id="link_**journaux**_**titres**"><path codeLine="286" d="M1242.5,1179.296 C1242.5,1179.296 1242.5,1288.2726 1242.5,1288.2726 " fill="none" id="**journaux**-backto-**titres**" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="1242.5" x2="1234.5" y1="1179.296" y2="1171.296"/><line style="stroke:#181818;stroke-width:1.0;" x1="1242.5" x2="1250.5" y1="1179.296" y2="1171.296"/><line style="stroke:#181818;stroke-width:1.0;" x1="1242.5" x2="1242.5" y1="1179.296" y2="1171.296"/></g><!--MD5=[31efc28f6a78e2cd649c0b5763e4e384]
-reverse link **perimetre_reference** to **titres_etapes**--><g id="link_**perimetre_reference**_**titres_etapes**"><path codeLine="288" d="M1657.0565,302 C1657.0565,302 1779.6667,302 1779.6667,302 C1779.6667,302 1779.6667,348.033 1779.6667,406.9228 " fill="none" id="**perimetre_reference**-backto-**titres_etapes**" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="1657.0565" x2="1649.0565" y1="302" y2="310"/><line style="stroke:#181818;stroke-width:1.0;" x1="1657.0565" x2="1649.0565" y1="302" y2="294"/><line style="stroke:#181818;stroke-width:1.0;" x1="1657.0565" x2="1649.0565" y1="302" y2="302"/></g><!--MD5=[6885186701c20f2eb8284cfc4b03f71c]
-reverse link **titres__titres** to **titres**--><g id="link_**titres__titres**_**titres**"><path codeLine="290" d="M1062.2656,1075 C1062.2656,1075 1087,1075 1087,1075 C1087,1075 1087,1196.1339 1087,1288.4039 " fill="none" id="**titres__titres**-backto-**titres**" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="1062.2656" x2="1054.2656" y1="1075" y2="1083"/><line style="stroke:#181818;stroke-width:1.0;" x1="1062.2656" x2="1054.2656" y1="1075" y2="1067"/><line style="stroke:#181818;stroke-width:1.0;" x1="1062.2656" x2="1054.2656" y1="1075" y2="1075"/></g><!--MD5=[6885186701c20f2eb8284cfc4b03f71c]
-reverse link **titres__titres** to **titres**--><g id="link_**titres__titres**_**titres**"><path codeLine="292" d="M1062.3827,1093 C1062.3827,1093 1085,1093 1085,1093 C1085,1093 1085,1202.2445 1085,1288.4453 " fill="none" id="**titres__titres**-backto-**titres**-1" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="1062.3827" x2="1054.3827" y1="1093" y2="1101"/><line style="stroke:#181818;stroke-width:1.0;" x1="1062.3827" x2="1054.3827" y1="1093" y2="1085"/><line style="stroke:#181818;stroke-width:1.0;" x1="1062.3827" x2="1054.3827" y1="1093" y2="1093"/></g><!--MD5=[6885186701c20f2eb8284cfc4b03f71c]
-reverse link **titres__titres** to **titres**--><g id="link_**titres__titres**_**titres**"><path codeLine="294" d="M1062.4261,1112 C1062.4261,1112 1083,1112 1083,1112 C1083,1112 1083,1208.7473 1083,1288.2993 " fill="none" id="**titres__titres**-backto-**titres**-2" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="1062.4261" x2="1054.4261" y1="1112" y2="1120"/><line style="stroke:#181818;stroke-width:1.0;" x1="1062.4261" x2="1054.4261" y1="1112" y2="1104"/><line style="stroke:#181818;stroke-width:1.0;" x1="1062.4261" x2="1054.4261" y1="1112" y2="1112"/></g><!--MD5=[6885186701c20f2eb8284cfc4b03f71c]
-reverse link **titres__titres** to **titres**--><g id="link_**titres__titres**_**titres**"><path codeLine="296" d="M877.5,1138.5658 C877.5,1138.5658 877.5,1392 877.5,1392 C877.5,1392 983.1808,1392 1080.8117,1392 " fill="none" id="**titres__titres**-backto-**titres**-3" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="877.5" x2="869.5" y1="1138.5658" y2="1130.5658"/><line style="stroke:#181818;stroke-width:1.0;" x1="877.5" x2="885.5" y1="1138.5658" y2="1130.5658"/><line style="stroke:#181818;stroke-width:1.0;" x1="877.5" x2="877.5" y1="1138.5658" y2="1130.5658"/></g><!--MD5=[f12e7196916c24138737d39df71d942b]
-reverse link **titres_activites** to **titres**--><g id="link_**titres_activites**_**titres**"><path codeLine="298" d="M1422.4265,1196 C1422.4265,1196 1400,1196 1400,1196 C1400,1196 1400,1241.3825 1400,1288.3605 " fill="none" id="**titres_activites**-backto-**titres**" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="1422.4265" x2="1430.4265" y1="1196" y2="1188"/><line style="stroke:#181818;stroke-width:1.0;" x1="1422.4265" x2="1430.4265" y1="1196" y2="1204"/><line style="stroke:#181818;stroke-width:1.0;" x1="1422.4265" x2="1430.4265" y1="1196" y2="1196"/></g><!--MD5=[5a758235c6f0faf17ad2f3404c604d82]
-reverse link **titres_activites** to **utilisateurs**--><g id="link_**titres_activites**_**utilisateurs**"><path codeLine="300" d="M1597.5,1228.2652 C1597.5,1228.2652 1597.5,1285 1597.5,1285 C1597.5,1285 1964.5654,1285 2186.812,1285 " fill="none" id="**titres_activites**-backto-**utilisateurs**" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="1597.5" x2="1589.5" y1="1228.2652" y2="1220.2652"/><line style="stroke:#181818;stroke-width:1.0;" x1="1597.5" x2="1605.5" y1="1228.2652" y2="1220.2652"/><line style="stroke:#181818;stroke-width:1.0;" x1="1597.5" x2="1597.5" y1="1228.2652" y2="1220.2652"/></g><!--MD5=[3bc886a617e09c124042eedc6d62a7e6]
-reverse link **titres_amodiataires** to **entreprises**--><g id="link_**titres_amodiataires**_**entreprises**"><path codeLine="302" d="M2287.75,306.0586 C2287.75,306.0586 2287.75,504.7103 2287.75,504.7103 " fill="none" id="**titres_amodiataires**-backto-**entreprises**" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="2287.75" x2="2279.75" y1="306.0586" y2="298.0586"/><line style="stroke:#181818;stroke-width:1.0;" x1="2287.75" x2="2295.75" y1="306.0586" y2="298.0586"/><line style="stroke:#181818;stroke-width:1.0;" x1="2287.75" x2="2287.75" y1="306.0586" y2="298.0586"/></g><!--MD5=[3bc886a617e09c124042eedc6d62a7e6]
-reverse link **titres_amodiataires** to **entreprises**--><g id="link_**titres_amodiataires**_**entreprises**"><path codeLine="304" d="M2364.5,306.0586 C2364.5,306.0586 2364.5,504.7103 2364.5,504.7103 " fill="none" id="**titres_amodiataires**-backto-**entreprises**-1" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="2364.5" x2="2356.5" y1="306.0586" y2="298.0586"/><line style="stroke:#181818;stroke-width:1.0;" x1="2364.5" x2="2372.5" y1="306.0586" y2="298.0586"/><line style="stroke:#181818;stroke-width:1.0;" x1="2364.5" x2="2364.5" y1="306.0586" y2="298.0586"/></g><!--MD5=[d0babee4d1e3b9320c239424fffbbfc1]
-reverse link **titres_amodiataires** to **titres_etapes**--><g id="link_**titres_amodiataires**_**titres_etapes**"><path codeLine="306" d="M2175.9577,262 C2175.9577,262 2164,262 2164,262 C2164,262 2164,328.5241 2164,406.9368 " fill="none" id="**titres_amodiataires**-backto-**titres_etapes**" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="2175.9577" x2="2183.9577" y1="262" y2="254"/><line style="stroke:#181818;stroke-width:1.0;" x1="2175.9577" x2="2183.9577" y1="262" y2="270"/><line style="stroke:#181818;stroke-width:1.0;" x1="2175.9577" x2="2183.9577" y1="262" y2="262"/></g><!--MD5=[d0babee4d1e3b9320c239424fffbbfc1]
-reverse link **titres_amodiataires** to **titres_etapes**--><g id="link_**titres_amodiataires**_**titres_etapes**"><path codeLine="308" d="M2175.6943,280 C2175.6943,280 2169,280 2169,280 C2169,280 2169,337.1625 2169,406.9408 " fill="none" id="**titres_amodiataires**-backto-**titres_etapes**-1" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="2175.6943" x2="2183.6943" y1="280" y2="272"/><line style="stroke:#181818;stroke-width:1.0;" x1="2175.6943" x2="2183.6943" y1="280" y2="288"/><line style="stroke:#181818;stroke-width:1.0;" x1="2175.6943" x2="2183.6943" y1="280" y2="280"/></g><!--MD5=[a03f2fe253375a9d759740d67333e799]
-reverse link **titres_demarches** to **titres**--><g id="link_**titres_demarches**_**titres**"><path codeLine="310" d="M1968.5,1220.159 C1968.5,1220.159 1968.5,1340 1968.5,1340 C1968.5,1340 1618.0012,1340 1404.0737,1340 " fill="none" id="**titres_demarches**-backto-**titres**" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="1968.5" x2="1960.5" y1="1220.159" y2="1212.159"/><line style="stroke:#181818;stroke-width:1.0;" x1="1968.5" x2="1976.5" y1="1220.159" y2="1212.159"/><line style="stroke:#181818;stroke-width:1.0;" x1="1968.5" x2="1968.5" y1="1220.159" y2="1212.159"/></g><!--MD5=[20662f1ae6d45bee1d6e245019e8a904]
-reverse link **titres_etapes** to **titres_demarches**--><g id="link_**titres_etapes**_**titres_demarches**"><path codeLine="312" d="M1968.5,914.3019 C1968.5,914.3019 1968.5,973.8149 1968.5,973.8149 " fill="none" id="**titres_etapes**-backto-**titres_demarches**" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="1968.5" x2="1960.5" y1="914.3019" y2="906.3019"/><line style="stroke:#181818;stroke-width:1.0;" x1="1968.5" x2="1976.5" y1="914.3019" y2="906.3019"/><line style="stroke:#181818;stroke-width:1.0;" x1="1968.5" x2="1968.5" y1="914.3019" y2="906.3019"/></g><!--MD5=[7e0ebd9cff6f52c9115584a3ded24570]
-reverse link **titres_etapes_entreprises_documents** to **entreprises_documents**--><g id="link_**titres_etapes_entreprises_documents**_**entreprises_documents**"><path codeLine="314" d="M2368,98.2443 C2368,98.2443 2368,188 2368,188 C2368,188 2475.1724,188 2579.7284,188 " fill="none" id="**titres_etapes_entreprises_documents**-backto-**entreprises_documents**" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="2368" x2="2360" y1="98.2443" y2="90.2443"/><line style="stroke:#181818;stroke-width:1.0;" x1="2368" x2="2376" y1="98.2443" y2="90.2443"/><line style="stroke:#181818;stroke-width:1.0;" x1="2368" x2="2368" y1="98.2443" y2="90.2443"/></g><!--MD5=[7e0ebd9cff6f52c9115584a3ded24570]
-reverse link **titres_etapes_entreprises_documents** to **entreprises_documents**--><g id="link_**titres_etapes_entreprises_documents**_**entreprises_documents**"><path codeLine="316" d="M2276,98.0479 C2276,98.0479 2276,194 2276,194 C2276,194 2439.6281,194 2579.7667,194 " fill="none" id="**titres_etapes_entreprises_documents**-backto-**entreprises_documents**-1" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="2276" x2="2268" y1="98.0479" y2="90.0479"/><line style="stroke:#181818;stroke-width:1.0;" x1="2276" x2="2284" y1="98.0479" y2="90.0479"/><line style="stroke:#181818;stroke-width:1.0;" x1="2276" x2="2276" y1="98.0479" y2="90.0479"/></g><!--MD5=[b555cbd6a92fa5ef63b44eb53d1d0fd0]
-reverse link **titres_etapes_entreprises_documents** to **titres_etapes**--><g id="link_**titres_etapes_entreprises_documents**_**titres_etapes**"><path codeLine="318" d="M2154,98.2829 C2154,98.2829 2154,406.777 2154,406.777 " fill="none" id="**titres_etapes_entreprises_documents**-backto-**titres_etapes**" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="2154" x2="2146" y1="98.2829" y2="90.2829"/><line style="stroke:#181818;stroke-width:1.0;" x1="2154" x2="2162" y1="98.2829" y2="90.2829"/><line style="stroke:#181818;stroke-width:1.0;" x1="2154" x2="2154" y1="98.2829" y2="90.2829"/></g><!--MD5=[b555cbd6a92fa5ef63b44eb53d1d0fd0]
-reverse link **titres_etapes_entreprises_documents** to **titres_etapes**--><g id="link_**titres_etapes_entreprises_documents**_**titres_etapes**"><path codeLine="320" d="M2159,98.2829 C2159,98.2829 2159,406.777 2159,406.777 " fill="none" id="**titres_etapes_entreprises_documents**-backto-**titres_etapes**-1" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="2159" x2="2151" y1="98.2829" y2="90.2829"/><line style="stroke:#181818;stroke-width:1.0;" x1="2159" x2="2167" y1="98.2829" y2="90.2829"/><line style="stroke:#181818;stroke-width:1.0;" x1="2159" x2="2159" y1="98.2829" y2="90.2829"/></g><!--MD5=[8eb44e23b22a65eb3aec0fd44a6d21b7]
-reverse link **titres_titulaires** to **entreprises**--><g id="link_**titres_titulaires**_**entreprises**"><path codeLine="322" d="M2157.3607,226 C2157.3607,226 2180.6667,226 2180.6667,226 C2180.6667,226 2180.6667,606 2180.6667,606 C2180.6667,606 2192.7011,606 2210.6118,606 " fill="none" id="**titres_titulaires**-backto-**entreprises**" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="2157.3607" x2="2149.3607" y1="226" y2="234"/><line style="stroke:#181818;stroke-width:1.0;" x1="2157.3607" x2="2149.3607" y1="226" y2="218"/><line style="stroke:#181818;stroke-width:1.0;" x1="2157.3607" x2="2149.3607" y1="226" y2="226"/></g><!--MD5=[8eb44e23b22a65eb3aec0fd44a6d21b7]
-reverse link **titres_titulaires** to **entreprises**--><g id="link_**titres_titulaires**_**entreprises**"><path codeLine="324" d="M2157.1691,244 C2157.1691,244 2177.3333,244 2177.3333,244 C2177.3333,244 2177.3333,707 2177.3333,707 C2177.3333,707 2190.9304,707 2210.795,707 " fill="none" id="**titres_titulaires**-backto-**entreprises**-1" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="2157.1691" x2="2149.1691" y1="244" y2="252"/><line style="stroke:#181818;stroke-width:1.0;" x1="2157.1691" x2="2149.1691" y1="244" y2="236"/><line style="stroke:#181818;stroke-width:1.0;" x1="2157.1691" x2="2149.1691" y1="244" y2="244"/></g><!--MD5=[31c3bc600c901d1b2c33bfea8fc135ac]
-reverse link **titres_titulaires** to **titres_etapes**--><g id="link_**titres_titulaires**_**titres_etapes**"><path codeLine="326" d="M1908.3333,306.0586 C1908.3333,306.0586 1908.3333,406.8134 1908.3333,406.8134 " fill="none" id="**titres_titulaires**-backto-**titres_etapes**" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="1908.3333" x2="1900.3333" y1="306.0586" y2="298.0586"/><line style="stroke:#181818;stroke-width:1.0;" x1="1908.3333" x2="1916.3333" y1="306.0586" y2="298.0586"/><line style="stroke:#181818;stroke-width:1.0;" x1="1908.3333" x2="1908.3333" y1="306.0586" y2="298.0586"/></g><!--MD5=[31c3bc600c901d1b2c33bfea8fc135ac]
-reverse link **titres_titulaires** to **titres_etapes**--><g id="link_**titres_titulaires**_**titres_etapes**"><path codeLine="328" d="M2028.6667,306.0586 C2028.6667,306.0586 2028.6667,406.8134 2028.6667,406.8134 " fill="none" id="**titres_titulaires**-backto-**titres_etapes**-1" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="2028.6667" x2="2020.6667" y1="306.0586" y2="298.0586"/><line style="stroke:#181818;stroke-width:1.0;" x1="2028.6667" x2="2036.6667" y1="306.0586" y2="298.0586"/><line style="stroke:#181818;stroke-width:1.0;" x1="2028.6667" x2="2028.6667" y1="306.0586" y2="298.0586"/></g><!--MD5=[f28ed266483423ffe50277f9cba4244d]
-reverse link **utilisateurs__entreprises** to **entreprises**--><g id="link_**utilisateurs__entreprises**_**entreprises**"><path codeLine="330" d="M3463.6667,298.0803 C3463.6667,298.0803 3463.6667,707 3463.6667,707 C3463.6667,707 2820.5875,707 2518.2021,707 " fill="none" id="**utilisateurs__entreprises**-backto-**entreprises**" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="3463.6667" x2="3455.6667" y1="298.0803" y2="290.0803"/><line style="stroke:#181818;stroke-width:1.0;" x1="3463.6667" x2="3471.6667" y1="298.0803" y2="290.0803"/><line style="stroke:#181818;stroke-width:1.0;" x1="3463.6667" x2="3463.6667" y1="298.0803" y2="290.0803"/></g><!--MD5=[15561590a5374a355d05a7abef5df509]
-reverse link **utilisateurs__entreprises** to **utilisateurs**--><g id="link_**utilisateurs__entreprises**_**utilisateurs**"><path codeLine="332" d="M3567.3333,298.0886 C3567.3333,298.0886 3567.3333,1392 3567.3333,1392 C3567.3333,1392 2850.6716,1392 2518.2357,1392 " fill="none" id="**utilisateurs__entreprises**-backto-**utilisateurs**" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="3567.3333" x2="3559.3333" y1="298.0886" y2="290.0886"/><line style="stroke:#181818;stroke-width:1.0;" x1="3567.3333" x2="3575.3333" y1="298.0886" y2="290.0886"/><line style="stroke:#181818;stroke-width:1.0;" x1="3567.3333" x2="3567.3333" y1="298.0886" y2="290.0886"/></g><!--MD5=[554cd1a2dbcb03010d4bf5244d6ab8cb]
-reverse link **utilisateurs__titres** to **titres**--><g id="link_**utilisateurs__titres**_**titres**"><path codeLine="334" d="M2177,1138.5658 C2177,1138.5658 2177,1392 2177,1392 C2177,1392 1671.6767,1392 1404.2106,1392 " fill="none" id="**utilisateurs__titres**-backto-**titres**" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="2177" x2="2169" y1="1138.5658" y2="1130.5658"/><line style="stroke:#181818;stroke-width:1.0;" x1="2177" x2="2185" y1="1138.5658" y2="1130.5658"/><line style="stroke:#181818;stroke-width:1.0;" x1="2177" x2="2177" y1="1138.5658" y2="1130.5658"/></g><!--MD5=[554cd1a2dbcb03010d4bf5244d6ab8cb]
-reverse link **utilisateurs__titres** to **titres**--><g id="link_**utilisateurs__titres**_**titres**"><path codeLine="336" d="M2182,1138.7887 C2182,1138.7887 2182,1443 2182,1443 C2182,1443 1672.6227,1443 1404.0058,1443 " fill="none" id="**utilisateurs__titres**-backto-**titres**-1" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="2182" x2="2174" y1="1138.7887" y2="1130.7887"/><line style="stroke:#181818;stroke-width:1.0;" x1="2182" x2="2190" y1="1138.7887" y2="1130.7887"/><line style="stroke:#181818;stroke-width:1.0;" x1="2182" x2="2182" y1="1138.7887" y2="1130.7887"/></g><!--MD5=[26aba9329e960314c6eed3e229e91b1b]
-reverse link **utilisateurs__titres** to **utilisateurs**--><g id="link_**utilisateurs__titres**_**utilisateurs**"><path codeLine="338" d="M2297.3333,1138.7419 C2297.3333,1138.7419 2297.3333,1279.8537 2297.3333,1279.8537 " fill="none" id="**utilisateurs__titres**-backto-**utilisateurs**" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="2297.3333" x2="2289.3333" y1="1138.7419" y2="1130.7419"/><line style="stroke:#181818;stroke-width:1.0;" x1="2297.3333" x2="2305.3333" y1="1138.7419" y2="1130.7419"/><line style="stroke:#181818;stroke-width:1.0;" x1="2297.3333" x2="2297.3333" y1="1138.7419" y2="1130.7419"/></g><!--MD5=[26aba9329e960314c6eed3e229e91b1b]
-reverse link **utilisateurs__titres** to **utilisateurs**--><g id="link_**utilisateurs__titres**_**utilisateurs**"><path codeLine="340" d="M2407.6667,1138.7419 C2407.6667,1138.7419 2407.6667,1279.8537 2407.6667,1279.8537 " fill="none" id="**utilisateurs__titres**-backto-**utilisateurs**-1" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="2407.6667" x2="2399.6667" y1="1138.7419" y2="1130.7419"/><line style="stroke:#181818;stroke-width:1.0;" x1="2407.6667" x2="2415.6667" y1="1138.7419" y2="1130.7419"/><line style="stroke:#181818;stroke-width:1.0;" x1="2407.6667" x2="2407.6667" y1="1138.7419" y2="1130.7419"/></g><!--MD5=[920beaf1a6d1b7749a50a221f8e46a5b]
+class **communes_postgis**--><g id="elem_**communes_postgis**"><rect codeLine="27" fill="#F1F1F1" height="74.8906" id="**communes_postgis**" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="293" x="647" y="15"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="151" x="718" y="32.9951">communes_postgis</text><line style="stroke:#181818;stroke-width:0.5;" x1="648" x2="939" y1="41.2969" y2="41.2969"/><ellipse cx="658" cy="52.2969" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="16" x="667" y="58.292">id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="683" y="58.292">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="169" x="692" y="58.292">character varying(5) [PK]</text><line style="stroke:#181818;stroke-width:1.0;" x1="648" x2="939" y1="65.5938" y2="65.5938"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="64" x="653" y="82.5889">geometry</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="717" y="82.5889">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="204" x="726" y="82.5889">geometry(MultiPolygon,4326)</text></g><!--MD5=[2ba55ab09da773b96a0ac87d3c3048ca]
+class **entreprises**--><g id="elem_**entreprises**"><rect codeLine="33" fill="#F1F1F1" height="303.0469" id="**entreprises**" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="307" x="2230" y="480"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="92" x="2337.5" y="497.9951">entreprises</text><line style="stroke:#181818;stroke-width:0.5;" x1="2231" x2="2536" y1="506.2969" y2="506.2969"/><ellipse cx="2241" cy="517.2969" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="16" x="2250" y="523.292">id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2266" y="523.292">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="178" x="2275" y="523.292">character varying(64) [PK]</text><line style="stroke:#181818;stroke-width:1.0;" x1="2231" x2="2536" y1="530.5938" y2="530.5938"/><ellipse cx="2241" cy="541.5938" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="24" x="2250" y="547.5889">nom</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2274" y="547.5889">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="2283" y="547.5889">character varying(255)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="56" x="2250" y="563.8857">pays_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2306" y="563.8857">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="2315" y="563.8857">character varying(255)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="88" x="2250" y="580.1826">legal_siren</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2338" y="580.1826">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="2347" y="580.1826">character varying(255)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="112" x="2250" y="596.4795">legal_etranger</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2362" y="596.4795">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="2371" y="596.4795">character varying(255)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="88" x="2250" y="612.7764">legal_forme</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2338" y="612.7764">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="2347" y="612.7764">character varying(255)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="72" x="2250" y="629.0732">categorie</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2322" y="629.0732">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="2331" y="629.0732">character varying(255)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="104" x="2250" y="645.3701">date_creation</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2354" y="645.3701">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="147" x="2363" y="645.3701">character varying(10)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="56" x="2250" y="661.667">adresse</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2306" y="661.667">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="2315" y="661.667">character varying(255)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="88" x="2250" y="677.9639">code_postal</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2338" y="677.9639">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="2347" y="677.9639">character varying(255)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="56" x="2250" y="694.2607">commune</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2306" y="694.2607">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="2315" y="694.2607">character varying(255)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="40" x="2250" y="710.5576">cedex</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2290" y="710.5576">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="2299" y="710.5576">character varying(255)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="24" x="2250" y="726.8545">url</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2274" y="726.8545">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="165" x="2283" y="726.8545">character varying(1024)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="40" x="2250" y="743.1514">email</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2290" y="743.1514">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="2299" y="743.1514">character varying(255)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="72" x="2250" y="759.4482">telephone</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2322" y="759.4482">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="2331" y="759.4482">character varying(255)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="56" x="2250" y="775.7451">archive</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2306" y="775.7451">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="56" x="2315" y="775.7451">boolean</text></g><!--MD5=[375227ba392393c97fb98039413a079e]
+class **entreprises_documents**--><g id="elem_**entreprises_documents**"><rect codeLine="53" fill="#F1F1F1" height="140.0781" id="**entreprises_documents**" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="393" x="2599" y="166"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="187" x="2702" y="183.9951">entreprises_documents</text><line style="stroke:#181818;stroke-width:0.5;" x1="2600" x2="2991" y1="192.2969" y2="192.2969"/><ellipse cx="2610" cy="203.2969" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="16" x="2619" y="209.292">id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2635" y="209.292">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="187" x="2644" y="209.292">character varying(255) [PK]</text><line style="stroke:#181818;stroke-width:1.0;" x1="2600" x2="2991" y1="216.5938" y2="216.5938"/><ellipse cx="2610" cy="227.5938" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="216" x="2619" y="233.5889">entreprise_document_type_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2835" y="233.5889">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="138" x="2844" y="233.5889">character varying(3)</text><ellipse cx="2610" cy="243.8906" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="32" x="2619" y="249.8857">date</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2651" y="249.8857">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="147" x="2660" y="249.8857">character varying(10)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="104" x="2619" y="266.1826">entreprise_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2723" y="266.1826">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="178" x="2732" y="266.1826">character varying(64) [FK]</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="88" x="2619" y="282.4795">description</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2707" y="282.4795">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="165" x="2716" y="282.4795">character varying(1024)</text><ellipse cx="2610" cy="292.7813" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="112" x="2619" y="298.7764">largeobject_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2731" y="298.7764">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="21" x="2740" y="298.7764">oid</text></g><!--MD5=[9b2d88c35f5efdfa950390ca359aaa80]
+class **entreprises_etablissements**--><g id="elem_**entreprises_etablissements**"><rect codeLine="63" fill="#F1F1F1" height="140.0781" id="**entreprises_etablissements**" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="317" x="3027" y="166"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="219" x="3076" y="183.9951">entreprises_etablissements</text><line style="stroke:#181818;stroke-width:0.5;" x1="3028" x2="3343" y1="192.2969" y2="192.2969"/><ellipse cx="3038" cy="203.2969" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="16" x="3047" y="209.292">id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="3063" y="209.292">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="178" x="3072" y="209.292">character varying(64) [PK]</text><line style="stroke:#181818;stroke-width:1.0;" x1="3028" x2="3343" y1="216.5938" y2="216.5938"/><ellipse cx="3038" cy="227.5938" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="104" x="3047" y="233.5889">entreprise_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="3151" y="233.5889">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="178" x="3160" y="233.5889">character varying(64) [FK]</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="24" x="3047" y="249.8857">nom</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="3071" y="249.8857">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="3080" y="249.8857">character varying(255)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="88" x="3047" y="266.1826">legal_siret</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="3135" y="266.1826">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="3144" y="266.1826">character varying(255)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="80" x="3047" y="282.4795">date_debut</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="3127" y="282.4795">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="147" x="3136" y="282.4795">character varying(10)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="64" x="3047" y="298.7764">date_fin</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="3111" y="298.7764">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="147" x="3120" y="298.7764">character varying(10)</text></g><!--MD5=[f57e8bffc9eb8db89a87840efac511a8]
+class **etapes_documents**--><g id="elem_**etapes_documents**"><rect codeLine="73" fill="#F1F1F1" height="156.375" id="**etapes_documents**" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="353" x="919" y="158"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="149" x="1021" y="175.9951">etapes_documents</text><line style="stroke:#181818;stroke-width:0.5;" x1="920" x2="1271" y1="184.2969" y2="184.2969"/><ellipse cx="930" cy="195.2969" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="16" x="939" y="201.292">id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="955" y="201.292">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="187" x="964" y="201.292">character varying(255) [PK]</text><line style="stroke:#181818;stroke-width:1.0;" x1="920" x2="1271" y1="208.5938" y2="208.5938"/><ellipse cx="930" cy="219.5938" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="176" x="939" y="225.5889">etape_document_type_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1115" y="225.5889">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="138" x="1124" y="225.5889">character varying(3)</text><ellipse cx="930" cy="235.8906" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="64" x="939" y="241.8857">etape_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1003" y="241.8857">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="187" x="1012" y="241.8857">character varying(255) [FK]</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="88" x="939" y="258.1826">description</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1027" y="258.1826">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="165" x="1036" y="258.1826">character varying(1024)</text><ellipse cx="930" cy="268.4844" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="112" x="939" y="274.4795">public_lecture</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1051" y="274.4795">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="56" x="1060" y="274.4795">boolean</text><ellipse cx="930" cy="284.7813" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="152" x="939" y="290.7764">entreprises_lecture</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1091" y="290.7764">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="56" x="1100" y="290.7764">boolean</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="112" x="939" y="307.0732">largeobject_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1051" y="307.0732">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="21" x="1060" y="307.0732">oid</text></g><!--MD5=[ba1548a72ebb734d80c164ad6b3ace5d]
+class **forets_postgis**--><g id="elem_**forets_postgis**"><rect codeLine="84" fill="#F1F1F1" height="74.8906" id="**forets_postgis**" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="293" x="35" y="198.5"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="113" x="125" y="216.4951">forets_postgis</text><line style="stroke:#181818;stroke-width:0.5;" x1="36" x2="327" y1="224.7969" y2="224.7969"/><ellipse cx="46" cy="235.7969" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="16" x="55" y="241.792">id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="71" y="241.792">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="178" x="80" y="241.792">character varying(30) [PK]</text><line style="stroke:#181818;stroke-width:1.0;" x1="36" x2="327" y1="249.0938" y2="249.0938"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="64" x="41" y="266.0889">geometry</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="105" y="266.0889">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="204" x="114" y="266.0889">geometry(MultiPolygon,4326)</text></g><!--MD5=[f8502021969469c2e2606089cfb35cf2]
+class **journaux**--><g id="elem_**journaux**"><rect codeLine="90" fill="#F1F1F1" height="156.375" id="**journaux**" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="307" x="1108" y="998"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="69" x="1227" y="1015.9951">journaux</text><line style="stroke:#181818;stroke-width:0.5;" x1="1109" x2="1414" y1="1024.2969" y2="1024.2969"/><ellipse cx="1119" cy="1035.2969" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="16" x="1128" y="1041.292">id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1144" y="1041.292">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="187" x="1153" y="1041.292">character varying(255) [PK]</text><line style="stroke:#181818;stroke-width:1.0;" x1="1109" x2="1414" y1="1048.5938" y2="1048.5938"/><ellipse cx="1119" cy="1059.5938" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="112" x="1128" y="1065.5889">utilisateur_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1240" y="1065.5889">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="1249" y="1065.5889">character varying(255)</text><ellipse cx="1119" cy="1075.8906" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="32" x="1128" y="1081.8857">date</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1160" y="1081.8857">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="176" x="1169" y="1081.8857">timestamp with time zone</text><ellipse cx="1119" cy="1092.1875" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="80" x="1128" y="1098.1826">element_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1208" y="1098.1826">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="1217" y="1098.1826">character varying(255)</text><ellipse cx="1119" cy="1108.4844" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="72" x="1128" y="1114.4795">operation</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1200" y="1114.4795">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="27" x="1209" y="1114.4795">text</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="88" x="1128" y="1130.7764">differences</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1216" y="1130.7764">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="37" x="1225" y="1130.7764">jsonb</text><ellipse cx="1119" cy="1141.0781" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="64" x="1128" y="1147.0732">titre_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1192" y="1147.0732">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="187" x="1201" y="1147.0732">character varying(128) [FK]</text></g><!--MD5=[8c8732e953ec6f00fbf5efa1803573aa]
+class **knex_migrations**--><g id="elem_**knex_migrations**"><rect codeLine="101" fill="#F1F1F1" height="107.4844" id="**knex_migrations**" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="313" x="363" y="182.5"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="128" x="455.5" y="200.4951">knex_migrations</text><line style="stroke:#181818;stroke-width:0.5;" x1="364" x2="675" y1="208.7969" y2="208.7969"/><ellipse cx="374" cy="219.7969" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="16" x="383" y="225.792">id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="399" y="225.792">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="66" x="408" y="225.792">serial [PK]</text><line style="stroke:#181818;stroke-width:1.0;" x1="364" x2="675" y1="233.0938" y2="233.0938"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="32" x="369" y="250.0889">name</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="401" y="250.0889">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="410" y="250.0889">character varying(255)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="40" x="369" y="266.3857">batch</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="409" y="266.3857">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="49" x="418" y="266.3857">integer</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="112" x="369" y="282.6826">migration_time</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="481" y="282.6826">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="176" x="490" y="282.6826">timestamp with time zone</text></g><!--MD5=[e285313659388471fd77d27c8838eebf]
+class **knex_migrations_lock**--><g id="elem_**knex_migrations_lock**"><rect codeLine="109" fill="#F1F1F1" height="74.8906" id="**knex_migrations_lock**" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="173" x="711" y="198.5"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="167" x="714" y="216.4951">knex_migrations_lock</text><line style="stroke:#181818;stroke-width:0.5;" x1="712" x2="883" y1="224.7969" y2="224.7969"/><ellipse cx="722" cy="235.7969" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="40" x="731" y="241.792">index</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="771" y="241.792">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="66" x="780" y="241.792">serial [PK]</text><line style="stroke:#181818;stroke-width:1.0;" x1="712" x2="883" y1="249.0938" y2="249.0938"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="72" x="717" y="266.0889">is_locked</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="789" y="266.0889">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="49" x="798" y="266.0889">integer</text></g><!--MD5=[49c0fd81dd385a66e5ecaac04d75aab3]
+class **perimetre_reference**--><g id="elem_**perimetre_reference**"><rect codeLine="115" fill="#F1F1F1" height="107.4844" id="**perimetre_reference**" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="361" x="1307" y="182.5"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="164" x="1405.5" y="200.4951">perimetre_reference</text><line style="stroke:#181818;stroke-width:0.5;" x1="1308" x2="1667" y1="208.7969" y2="208.7969"/><ellipse cx="1318" cy="219.7969" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="112" x="1327" y="225.792">titre_etape_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1439" y="225.792">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="214" x="1448" y="225.792">character varying(255) [PK][FK]</text><ellipse cx="1318" cy="236.0938" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="88" x="1327" y="242.0889">geo_systeme</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1415" y="242.0889">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="187" x="1424" y="242.0889">character varying(255) [PK]</text><line style="stroke:#181818;stroke-width:1.0;" x1="1308" x2="1667" y1="249.3906" y2="249.3906"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="72" x="1313" y="266.3857">opposable</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1385" y="266.3857">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="56" x="1394" y="266.3857">boolean</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="136" x="1313" y="282.6826">geojson_perimetre</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1449" y="282.6826">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="37" x="1458" y="282.6826">jsonb</text></g><!--MD5=[cf317b8f35ef6caa7c0cc8e48e619152]
+class **sdom_zones_postgis**--><g id="elem_**sdom_zones_postgis**"><rect codeLine="123" fill="#F1F1F1" height="74.8906" id="**sdom_zones_postgis**" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="293" x="35" y="594"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="163" x="100" y="611.9951">sdom_zones_postgis</text><line style="stroke:#181818;stroke-width:0.5;" x1="36" x2="327" y1="620.2969" y2="620.2969"/><ellipse cx="46" cy="631.2969" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="16" x="55" y="637.292">id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="71" y="637.292">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="178" x="80" y="637.292">character varying(30) [PK]</text><line style="stroke:#181818;stroke-width:1.0;" x1="36" x2="327" y1="644.5938" y2="644.5938"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="64" x="41" y="661.5889">geometry</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="105" y="661.5889">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="204" x="114" y="661.5889">geometry(MultiPolygon,4326)</text></g><!--MD5=[334142c1e77c30d5f5c7acc29c1e50bc]
+class **secteurs_maritime_postgis**--><g id="elem_**secteurs_maritime_postgis**"><rect codeLine="129" fill="#F1F1F1" height="74.8906" id="**secteurs_maritime_postgis**" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="293" x="363" y="594"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="210" x="404.5" y="611.9951">secteurs_maritime_postgis</text><line style="stroke:#181818;stroke-width:0.5;" x1="364" x2="655" y1="620.2969" y2="620.2969"/><ellipse cx="374" cy="631.2969" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="16" x="383" y="637.292">id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="399" y="637.292">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="80" x="408" y="637.292">integer [PK]</text><line style="stroke:#181818;stroke-width:1.0;" x1="364" x2="655" y1="644.5938" y2="644.5938"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="64" x="369" y="661.5889">geometry</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="433" y="661.5889">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="204" x="442" y="661.5889">geometry(MultiPolygon,4326)</text></g><!--MD5=[000bdc8fca937d4114719a6aff4ea039]
+class **spatial_ref_sys**--><g id="elem_**spatial_ref_sys**"><rect codeLine="135" fill="#F1F1F1" height="123.7813" id="**spatial_ref_sys**" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="262" x="691.5" y="569.5"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="115" x="765" y="587.4951">spatial_ref_sys</text><line style="stroke:#181818;stroke-width:0.5;" x1="692.5" x2="952.5" y1="595.7969" y2="595.7969"/><ellipse cx="702.5" cy="606.7969" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="32" x="711.5" y="612.792">srid</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="743.5" y="612.792">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="80" x="752.5" y="612.792">integer [PK]</text><line style="stroke:#181818;stroke-width:1.0;" x1="692.5" x2="952.5" y1="620.0938" y2="620.0938"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="72" x="697.5" y="637.0889">auth_name</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="769.5" y="637.0889">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="778.5" y="637.0889">character varying(256)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="72" x="697.5" y="653.3857">auth_srid</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="769.5" y="653.3857">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="49" x="778.5" y="653.3857">integer</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="48" x="697.5" y="669.6826">srtext</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="745.5" y="669.6826">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="165" x="754.5" y="669.6826">character varying(2048)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="72" x="697.5" y="685.9795">proj4text</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="769.5" y="685.9795">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="165" x="778.5" y="685.9795">character varying(2048)</text></g><!--MD5=[737231e93f89167ae129923b20117fe6]
+class **titres**--><g id="elem_**titres**"><rect codeLine="144" fill="#F1F1F1" height="205.2656" id="**titres**" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="323" x="1100" y="1271.5"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="42" x="1240.5" y="1289.4951">titres</text><line style="stroke:#181818;stroke-width:0.5;" x1="1101" x2="1422" y1="1297.7969" y2="1297.7969"/><ellipse cx="1111" cy="1308.7969" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="16" x="1120" y="1314.792">id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1136" y="1314.792">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="187" x="1145" y="1314.792">character varying(128) [PK]</text><line style="stroke:#181818;stroke-width:1.0;" x1="1101" x2="1422" y1="1322.0938" y2="1322.0938"/><ellipse cx="1111" cy="1333.0938" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="24" x="1120" y="1339.0889">nom</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1144" y="1339.0889">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="1153" y="1339.0889">character varying(255)</text><ellipse cx="1111" cy="1349.3906" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="56" x="1120" y="1355.3857">type_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1176" y="1355.3857">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="138" x="1185" y="1355.3857">character varying(3)</text><ellipse cx="1111" cy="1365.6875" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="120" x="1120" y="1371.6826">titre_statut_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1240" y="1371.6826">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="138" x="1249" y="1371.6826">character varying(3)</text><ellipse cx="1111" cy="1381.9844" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="112" x="1120" y="1387.9795">public_lecture</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1232" y="1387.9795">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="56" x="1241" y="1387.9795">boolean</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="128" x="1120" y="1404.2764">doublon_titre_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1248" y="1404.2764">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="1257" y="1404.2764">character varying(128)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="176" x="1120" y="1420.5732">props_titre_etapes_ids</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1296" y="1420.5732">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="37" x="1305" y="1420.5732">jsonb</text><ellipse cx="1111" cy="1430.875" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="32" x="1120" y="1436.8701">slug</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1152" y="1436.8701">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="1161" y="1436.8701">character varying(255)</text><ellipse cx="1111" cy="1447.1719" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="56" x="1120" y="1453.167">archive</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1176" y="1453.167">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="56" x="1185" y="1453.167">boolean</text><ellipse cx="1111" cy="1463.4688" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="80" x="1120" y="1469.4639">references</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1200" y="1469.4639">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="37" x="1209" y="1469.4639">jsonb</text></g><!--MD5=[a297b16a76b58c01aa4b71caf064a7fa]
+class **titres__titres**--><g id="elem_**titres__titres**"><rect codeLine="158" fill="#F1F1F1" height="74.8906" id="**titres__titres**" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="353" x="720" y="1038.5"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="98" x="847.5" y="1056.4951">titres__titres</text><line style="stroke:#181818;stroke-width:0.5;" x1="721" x2="1072" y1="1064.7969" y2="1064.7969"/><ellipse cx="731" cy="1075.7969" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="104" x="740" y="1081.792">titre_from_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="844" y="1081.792">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="214" x="853" y="1081.792">character varying(255) [PK][FK]</text><ellipse cx="731" cy="1092.0938" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="88" x="740" y="1098.0889">titre_to_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="828" y="1098.0889">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="214" x="837" y="1098.0889">character varying(255) [PK][FK]</text><line style="stroke:#181818;stroke-width:1.0;" x1="721" x2="1072" y1="1105.3906" y2="1105.3906"/></g><!--MD5=[40f6ce71af2e61863eb513e8561b13cd]
+class **titres_activites**--><g id="elem_**titres_activites**"><rect codeLine="164" fill="#F1F1F1" height="254.1563" id="**titres_activites**" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="334" x="1449.5" y="949"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="115" x="1559" y="966.9951">titres_activites</text><line style="stroke:#181818;stroke-width:0.5;" x1="1450.5" x2="1782.5" y1="975.2969" y2="975.2969"/><ellipse cx="1460.5" cy="986.2969" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="16" x="1469.5" y="992.292">id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1485.5" y="992.292">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="187" x="1494.5" y="992.292">character varying(255) [PK]</text><line style="stroke:#181818;stroke-width:1.0;" x1="1450.5" x2="1782.5" y1="999.5938" y2="999.5938"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="64" x="1469.5" y="1016.5889">titre_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1533.5" y="1016.5889">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="187" x="1542.5" y="1016.5889">character varying(128) [FK]</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="112" x="1469.5" y="1032.8857">utilisateur_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1581.5" y="1032.8857">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="187" x="1590.5" y="1032.8857">character varying(128) [FK]</text><ellipse cx="1460.5" cy="1043.1875" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="32" x="1469.5" y="1049.1826">date</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1501.5" y="1049.1826">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="147" x="1510.5" y="1049.1826">character varying(10)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="88" x="1469.5" y="1065.4795">date_saisie</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1557.5" y="1065.4795">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="147" x="1566.5" y="1065.4795">character varying(10)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="56" x="1469.5" y="1081.7764">contenu</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1525.5" y="1081.7764">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="37" x="1534.5" y="1081.7764">jsonb</text><ellipse cx="1460.5" cy="1092.0781" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="56" x="1469.5" y="1098.0732">type_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1525.5" y="1098.0732">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="138" x="1534.5" y="1098.0732">character varying(3)</text><ellipse cx="1460.5" cy="1108.375" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="144" x="1469.5" y="1114.3701">activite_statut_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1613.5" y="1114.3701">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="138" x="1622.5" y="1114.3701">character varying(3)</text><ellipse cx="1460.5" cy="1124.6719" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="40" x="1469.5" y="1130.667">annee</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1509.5" y="1130.667">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="49" x="1518.5" y="1130.667">integer</text><ellipse cx="1460.5" cy="1140.9688" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="80" x="1469.5" y="1146.9639">periode_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1549.5" y="1146.9639">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="49" x="1558.5" y="1146.9639">integer</text><ellipse cx="1460.5" cy="1157.2656" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="64" x="1469.5" y="1163.2607">sections</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1533.5" y="1163.2607">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="47" x="1542.5" y="1163.2607">jsonb[]</text><ellipse cx="1460.5" cy="1173.5625" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="88" x="1469.5" y="1179.5576">suppression</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1557.5" y="1179.5576">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="56" x="1566.5" y="1179.5576">boolean</text><ellipse cx="1460.5" cy="1189.8594" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="32" x="1469.5" y="1195.8545">slug</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1501.5" y="1195.8545">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="1510.5" y="1195.8545">character varying(255)</text></g><!--MD5=[42972415c740e3b09b6ff41a0d57d815]
+class **titres_amodiataires**--><g id="elem_**titres_amodiataires**"><rect codeLine="181" fill="#F1F1F1" height="91.1875" id="**titres_amodiataires**" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="361" x="2203" y="190.5"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="150" x="2308.5" y="208.4951">titres_amodiataires</text><line style="stroke:#181818;stroke-width:0.5;" x1="2204" x2="2563" y1="216.7969" y2="216.7969"/><ellipse cx="2214" cy="227.7969" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="112" x="2223" y="233.792">titre_etape_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2335" y="233.792">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="214" x="2344" y="233.792">character varying(128) [PK][FK]</text><ellipse cx="2214" cy="244.0938" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="104" x="2223" y="250.0889">entreprise_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2327" y="250.0889">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="205" x="2336" y="250.0889">character varying(64) [PK][FK]</text><line style="stroke:#181818;stroke-width:1.0;" x1="2204" x2="2563" y1="257.3906" y2="257.3906"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="72" x="2209" y="274.3857">operateur</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2281" y="274.3857">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="56" x="2290" y="274.3857">boolean</text></g><!--MD5=[2604fd8a31308cb82a14687ac7a1a229]
+class **titres_demarches**--><g id="elem_**titres_demarches**"><rect codeLine="188" fill="#F1F1F1" height="237.8594" id="**titres_demarches**" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="338" x="1818.5" y="957"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="137" x="1919" y="974.9951">titres_demarches</text><line style="stroke:#181818;stroke-width:0.5;" x1="1819.5" x2="2155.5" y1="983.2969" y2="983.2969"/><ellipse cx="1829.5" cy="994.2969" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="16" x="1838.5" y="1000.292">id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1854.5" y="1000.292">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="187" x="1863.5" y="1000.292">character varying(128) [PK]</text><line style="stroke:#181818;stroke-width:1.0;" x1="1819.5" x2="2155.5" y1="1007.5938" y2="1007.5938"/><ellipse cx="1829.5" cy="1018.5938" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="64" x="1838.5" y="1024.5889">titre_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1902.5" y="1024.5889">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="187" x="1911.5" y="1024.5889">character varying(128) [FK]</text><ellipse cx="1829.5" cy="1034.8906" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="56" x="1838.5" y="1040.8857">type_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1894.5" y="1040.8857">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="138" x="1903.5" y="1040.8857">character varying(3)</text><ellipse cx="1829.5" cy="1051.1875" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="72" x="1838.5" y="1057.1826">statut_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1910.5" y="1057.1826">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="138" x="1919.5" y="1057.1826">character varying(3)</text><ellipse cx="1829.5" cy="1067.4844" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="112" x="1838.5" y="1073.4795">public_lecture</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1950.5" y="1073.4795">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="56" x="1959.5" y="1073.4795">boolean</text><ellipse cx="1829.5" cy="1083.7813" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="152" x="1838.5" y="1089.7764">entreprises_lecture</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1990.5" y="1089.7764">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="56" x="1999.5" y="1089.7764">boolean</text><ellipse cx="1829.5" cy="1100.0781" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="40" x="1838.5" y="1106.0732">ordre</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1878.5" y="1106.0732">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="49" x="1887.5" y="1106.0732">integer</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="32" x="1838.5" y="1122.3701">slug</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1870.5" y="1122.3701">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="1879.5" y="1122.3701">character varying(255)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="88" x="1838.5" y="1138.667">description</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1926.5" y="1138.667">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="1935.5" y="1138.667">character varying(255)</text><ellipse cx="1829.5" cy="1148.9688" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="56" x="1838.5" y="1154.9639">archive</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1894.5" y="1154.9639">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="56" x="1903.5" y="1154.9639">boolean</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="152" x="1838.5" y="1171.2607">demarche_date_debut</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1990.5" y="1171.2607">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="147" x="1999.5" y="1171.2607">character varying(10)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="136" x="1838.5" y="1187.5576">demarche_date_fin</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1974.5" y="1187.5576">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="147" x="1983.5" y="1187.5576">character varying(10)</text></g><!--MD5=[4319517b19d071d8401fcc94ca04af3d]
+class **titres_etapes**--><g id="elem_**titres_etapes**"><rect codeLine="204" fill="#F1F1F1" height="514.9063" id="**titres_etapes**" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="411" x="1782" y="374"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="103" x="1936" y="391.9951">titres_etapes</text><line style="stroke:#181818;stroke-width:0.5;" x1="1783" x2="2192" y1="400.2969" y2="400.2969"/><ellipse cx="1793" cy="411.2969" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="16" x="1802" y="417.292">id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1818" y="417.292">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="187" x="1827" y="417.292">character varying(128) [PK]</text><line style="stroke:#181818;stroke-width:1.0;" x1="1783" x2="2192" y1="424.5938" y2="424.5938"/><ellipse cx="1793" cy="435.5938" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="136" x="1802" y="441.5889">titre_demarche_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1938" y="441.5889">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="187" x="1947" y="441.5889">character varying(128) [FK]</text><ellipse cx="1793" cy="451.8906" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="56" x="1802" y="457.8857">type_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1858" y="457.8857">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="138" x="1867" y="457.8857">character varying(3)</text><ellipse cx="1793" cy="468.1875" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="72" x="1802" y="474.1826">statut_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1874" y="474.1826">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="138" x="1883" y="474.1826">character varying(3)</text><ellipse cx="1793" cy="484.4844" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="40" x="1802" y="490.4795">ordre</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1842" y="490.4795">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="49" x="1851" y="490.4795">integer</text><ellipse cx="1793" cy="500.7813" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="32" x="1802" y="506.7764">date</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1834" y="506.7764">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="147" x="1843" y="506.7764">character varying(10)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="80" x="1802" y="523.0732">date_debut</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1882" y="523.0732">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="147" x="1891" y="523.0732">character varying(10)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="64" x="1802" y="539.3701">date_fin</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1866" y="539.3701">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="147" x="1875" y="539.3701">character varying(10)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="40" x="1802" y="555.667">duree</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1842" y="555.667">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="49" x="1851" y="555.667">integer</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="56" x="1802" y="571.9639">surface</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1858" y="571.9639">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="25" x="1867" y="571.9639">real</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="56" x="1802" y="588.2607">contenu</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1858" y="588.2607">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="37" x="1867" y="588.2607">jsonb</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="112" x="1802" y="604.5576">heritage_props</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1914" y="604.5576">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="37" x="1923" y="604.5576">jsonb</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="128" x="1802" y="620.8545">heritage_contenu</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1930" y="620.8545">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="37" x="1939" y="620.8545">jsonb</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="32" x="1802" y="637.1514">slug</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1834" y="637.1514">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="1843" y="637.1514">character varying(255)</text><ellipse cx="1793" cy="647.4531" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="56" x="1802" y="653.4482">archive</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1858" y="653.4482">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="56" x="1867" y="653.4482">boolean</text><ellipse cx="1793" cy="663.75" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="80" x="1802" y="669.7451">substances</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1882" y="669.7451">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="37" x="1891" y="669.7451">jsonb</text><ellipse cx="1793" cy="680.0469" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="136" x="1802" y="686.042">secteurs_maritime</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1938" y="686.042">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="37" x="1947" y="686.042">jsonb</text><ellipse cx="1793" cy="696.3438" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="184" x="1802" y="702.3389">administrations_locales</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1986" y="702.3389">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="37" x="1995" y="702.3389">jsonb</text><ellipse cx="1793" cy="712.6406" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="80" x="1802" y="718.6357">sdom_zones</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1882" y="718.6357">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="37" x="1891" y="718.6357">jsonb</text><ellipse cx="1793" cy="728.9375" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="48" x="1802" y="734.9326">forets</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1850" y="734.9326">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="37" x="1859" y="734.9326">jsonb</text><ellipse cx="1793" cy="745.2344" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="64" x="1802" y="751.2295">communes</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1866" y="751.2295">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="37" x="1875" y="751.2295">jsonb</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="40" x="1802" y="767.5264">notes</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1842" y="767.5264">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="27" x="1851" y="767.5264">text</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="168" x="1802" y="783.8232">geojson4326_perimetre</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1970" y="783.8232">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="204" x="1979" y="783.8232">geometry(MultiPolygon,4326)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="144" x="1802" y="800.1201">geojson4326_points</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1946" y="800.1201">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="37" x="1955" y="800.1201">jsonb</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="176" x="1802" y="816.417">geojson_origine_points</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1978" y="816.417">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="37" x="1987" y="816.417">jsonb</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="200" x="1802" y="832.7139">geojson_origine_perimetre</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2002" y="832.7139">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="37" x="2011" y="832.7139">jsonb</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="240" x="1802" y="849.0107">geojson_origine_geo_systeme_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2042" y="849.0107">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="119" x="2051" y="849.0107">character varying</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="152" x="1802" y="865.3076">geojson4326_forages</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1954" y="865.3076">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="37" x="1963" y="865.3076">jsonb</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="184" x="1802" y="881.6045">geojson_origine_forages</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1986" y="881.6045">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="37" x="1995" y="881.6045">jsonb</text></g><!--MD5=[8ad9f766679bda46a9a557fa539d4780]
+class **titres_etapes_entreprises_documents**--><g id="elem_**titres_etapes_entreprises_documents**"><rect codeLine="237" fill="#F1F1F1" height="74.8906" id="**titres_etapes_entreprises_documents**" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="425" x="2054" y="15"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="297" x="2118" y="32.9951">titres_etapes_entreprises_documents</text><line style="stroke:#181818;stroke-width:0.5;" x1="2055" x2="2478" y1="41.2969" y2="41.2969"/><ellipse cx="2065" cy="52.2969" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="112" x="2074" y="58.292">titre_etape_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2186" y="58.292">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="214" x="2195" y="58.292">character varying(128) [PK][FK]</text><ellipse cx="2065" cy="68.5938" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="176" x="2074" y="74.5889">entreprise_document_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2250" y="74.5889">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="214" x="2259" y="74.5889">character varying(255) [PK][FK]</text><line style="stroke:#181818;stroke-width:1.0;" x1="2055" x2="2478" y1="81.8906" y2="81.8906"/></g><!--MD5=[0caad3fb92d45f9453328b20dd20e574]
+class **titres_titulaires**--><g id="elem_**titres_titulaires**"><rect codeLine="243" fill="#F1F1F1" height="91.1875" id="**titres_titulaires**" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="361" x="1807" y="190.5"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="118" x="1928.5" y="208.4951">titres_titulaires</text><line style="stroke:#181818;stroke-width:0.5;" x1="1808" x2="2167" y1="216.7969" y2="216.7969"/><ellipse cx="1818" cy="227.7969" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="112" x="1827" y="233.792">titre_etape_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1939" y="233.792">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="214" x="1948" y="233.792">character varying(128) [PK][FK]</text><ellipse cx="1818" cy="244.0938" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="104" x="1827" y="250.0889">entreprise_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1931" y="250.0889">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="205" x="1940" y="250.0889">character varying(64) [PK][FK]</text><line style="stroke:#181818;stroke-width:1.0;" x1="1808" x2="2167" y1="257.3906" y2="257.3906"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="72" x="1813" y="274.3857">operateur</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="1885" y="274.3857">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="56" x="1894" y="274.3857">boolean</text></g><!--MD5=[bb4894758e5c56d39e342e991b469faa]
+class **utilisateurs**--><g id="elem_**utilisateurs**"><rect codeLine="250" fill="#F1F1F1" height="221.5625" id="**utilisateurs**" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="331" x="2206" y="1263"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="88" x="2327.5" y="1280.9951">utilisateurs</text><line style="stroke:#181818;stroke-width:0.5;" x1="2207" x2="2536" y1="1289.2969" y2="1289.2969"/><ellipse cx="2217" cy="1300.2969" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="16" x="2226" y="1306.292">id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2242" y="1306.292">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="187" x="2251" y="1306.292">character varying(255) [PK]</text><line style="stroke:#181818;stroke-width:1.0;" x1="2207" x2="2536" y1="1313.5938" y2="1313.5938"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="40" x="2226" y="1330.5889">email</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2266" y="1330.5889">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="2275" y="1330.5889">character varying(255)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="24" x="2226" y="1346.8857">nom</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2250" y="1346.8857">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="2259" y="1346.8857">character varying(255)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="48" x="2226" y="1363.1826">prenom</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2274" y="1363.1826">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="2283" y="1363.1826">character varying(255)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="112" x="2226" y="1379.4795">telephone_fixe</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2338" y="1379.4795">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="2347" y="1379.4795">character varying(255)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="128" x="2226" y="1395.7764">telephone_mobile</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2354" y="1395.7764">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="2363" y="1395.7764">character varying(255)</text><ellipse cx="2217" cy="1406.0781" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="32" x="2226" y="1412.0732">role</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2258" y="1412.0732">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="2267" y="1412.0732">character varying(255)</text><ellipse cx="2217" cy="1422.375" fill="#000000" rx="3" ry="3" style="stroke:#000000;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="104" x="2226" y="1428.3701">date_creation</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2330" y="1428.3701">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="2339" y="1428.3701">character varying(255)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="136" x="2226" y="1444.667">administration_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2362" y="1444.667">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="2371" y="1444.667">character varying(255)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="80" x="2226" y="1460.9639">qgis_token</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2306" y="1460.9639">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="2315" y="1460.9639">character varying(255)</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="88" x="2226" y="1477.2607">keycloak_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2314" y="1477.2607">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="156" x="2323" y="1477.2607">character varying(255)</text></g><!--MD5=[d3168609e77bb21165f416225b8eb07d]
+class **utilisateurs__entreprises**--><g id="elem_**utilisateurs__entreprises**"><rect codeLine="265" fill="#F1F1F1" height="74.8906" id="**utilisateurs__entreprises**" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="311" x="3379" y="198.5"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="194" x="3437.5" y="216.4951">utilisateurs__entreprises</text><line style="stroke:#181818;stroke-width:0.5;" x1="3380" x2="3689" y1="224.7969" y2="224.7969"/><line style="stroke:#181818;stroke-width:1.0;" x1="3380" x2="3689" y1="232.7969" y2="232.7969"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="112" x="3385" y="249.792">utilisateur_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="3497" y="249.792">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="178" x="3506" y="249.792">character varying(64) [FK]</text><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="104" x="3385" y="266.0889">entreprise_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="3489" y="266.0889">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="178" x="3498" y="266.0889">character varying(64) [FK]</text></g><!--MD5=[9d27d9fcc6b6982070ce8832a6b94dd0]
+class **utilisateurs__titres**--><g id="elem_**utilisateurs__titres**"><rect codeLine="271" fill="#F1F1F1" height="74.8906" id="**utilisateurs__titres**" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="361" x="2191" y="1038.5"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="144" x="2299.5" y="1056.4951">utilisateurs__titres</text><line style="stroke:#181818;stroke-width:0.5;" x1="2192" x2="2551" y1="1064.7969" y2="1064.7969"/><ellipse cx="2202" cy="1075.7969" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="112" x="2211" y="1081.792">utilisateur_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2323" y="1081.792">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="214" x="2332" y="1081.792">character varying(255) [PK][FK]</text><ellipse cx="2202" cy="1092.0938" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="monospace" font-size="14" lengthAdjust="spacing" textLength="64" x="2211" y="1098.0889">titre_id</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="5" x="2275" y="1098.0889">:</text><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="214" x="2284" y="1098.0889">character varying(255) [PK][FK]</text><line style="stroke:#181818;stroke-width:1.0;" x1="2192" x2="2551" y1="1105.3906" y2="1105.3906"/></g><!--MD5=[c8519d2510d151072fb67158a2d819bf]
+reverse link **activites_documents** to **titres_activites**--><g id="link_**activites_documents**_**titres_activites**"><path codeLine="277" d="M1598.25,709.9323 C1598.25,709.9323 1598.25,948.5916 1598.25,948.5916 " fill="none" id="**activites_documents**-backto-**titres_activites**" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="1598.25" x2="1590.25" y1="709.9323" y2="701.9323"/><line style="stroke:#181818;stroke-width:1.0;" x1="1598.25" x2="1606.25" y1="709.9323" y2="701.9323"/><line style="stroke:#181818;stroke-width:1.0;" x1="1598.25" x2="1598.25" y1="709.9323" y2="701.9323"/></g><!--MD5=[04d44480ca2d124fc6f6fad57b7a66d2]
+reverse link **entreprises_documents** to **entreprises**--><g id="link_**entreprises_documents**_**entreprises**"><path codeLine="279" d="M2590.5445,298 C2590.5445,298 2460.25,298 2460.25,298 C2460.25,298 2460.25,391.7768 2460.25,479.8758 " fill="none" id="**entreprises_documents**-backto-**entreprises**" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="2590.5445" x2="2598.5445" y1="298" y2="290"/><line style="stroke:#181818;stroke-width:1.0;" x1="2590.5445" x2="2598.5445" y1="298" y2="306"/><line style="stroke:#181818;stroke-width:1.0;" x1="2590.5445" x2="2598.5445" y1="298" y2="298"/></g><!--MD5=[8ac700e74e3f5e198f9a2f6efe827f55]
+reverse link **entreprises_etablissements** to **entreprises**--><g id="link_**entreprises_etablissements**_**entreprises**"><path codeLine="281" d="M3185.5,314.2317 C3185.5,314.2317 3185.5,581 3185.5,581 C3185.5,581 2770.0589,581 2537.1847,581 " fill="none" id="**entreprises_etablissements**-backto-**entreprises**" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="3185.5" x2="3177.5" y1="314.2317" y2="306.2317"/><line style="stroke:#181818;stroke-width:1.0;" x1="3185.5" x2="3193.5" y1="314.2317" y2="306.2317"/><line style="stroke:#181818;stroke-width:1.0;" x1="3185.5" x2="3185.5" y1="314.2317" y2="306.2317"/></g><!--MD5=[95d24a749924cb5eb46f19ca9b48a86f]
+reverse link **etapes_documents** to **titres_etapes**--><g id="link_**etapes_documents**_**titres_etapes**"><path codeLine="283" d="M1280.1837,310 C1280.1837,310 1790.3333,310 1790.3333,310 C1790.3333,310 1790.3333,336.3218 1790.3333,373.9024 " fill="none" id="**etapes_documents**-backto-**titres_etapes**" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="1280.1837" x2="1272.1837" y1="310" y2="318"/><line style="stroke:#181818;stroke-width:1.0;" x1="1280.1837" x2="1272.1837" y1="310" y2="302"/><line style="stroke:#181818;stroke-width:1.0;" x1="1280.1837" x2="1272.1837" y1="310" y2="310"/></g><!--MD5=[30325fd5a01508112ac852c48e8fab8f]
+reverse link **journaux** to **titres**--><g id="link_**journaux**_**titres**"><path codeLine="285" d="M1261.5,1162.296 C1261.5,1162.296 1261.5,1271.2726 1261.5,1271.2726 " fill="none" id="**journaux**-backto-**titres**" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="1261.5" x2="1253.5" y1="1162.296" y2="1154.296"/><line style="stroke:#181818;stroke-width:1.0;" x1="1261.5" x2="1269.5" y1="1162.296" y2="1154.296"/><line style="stroke:#181818;stroke-width:1.0;" x1="1261.5" x2="1261.5" y1="1162.296" y2="1154.296"/></g><!--MD5=[31efc28f6a78e2cd649c0b5763e4e384]
+reverse link **perimetre_reference** to **titres_etapes**--><g id="link_**perimetre_reference**_**titres_etapes**"><path codeLine="287" d="M1676.0565,286 C1676.0565,286 1798.6667,286 1798.6667,286 C1798.6667,286 1798.6667,323.4204 1798.6667,373.6309 " fill="none" id="**perimetre_reference**-backto-**titres_etapes**" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="1676.0565" x2="1668.0565" y1="286" y2="294"/><line style="stroke:#181818;stroke-width:1.0;" x1="1676.0565" x2="1668.0565" y1="286" y2="278"/><line style="stroke:#181818;stroke-width:1.0;" x1="1676.0565" x2="1668.0565" y1="286" y2="286"/></g><!--MD5=[6885186701c20f2eb8284cfc4b03f71c]
+reverse link **titres__titres** to **titres**--><g id="link_**titres__titres**_**titres**"><path codeLine="289" d="M1081.2656,1058 C1081.2656,1058 1106,1058 1106,1058 C1106,1058 1106,1179.1339 1106,1271.4039 " fill="none" id="**titres__titres**-backto-**titres**" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="1081.2656" x2="1073.2656" y1="1058" y2="1066"/><line style="stroke:#181818;stroke-width:1.0;" x1="1081.2656" x2="1073.2656" y1="1058" y2="1050"/><line style="stroke:#181818;stroke-width:1.0;" x1="1081.2656" x2="1073.2656" y1="1058" y2="1058"/></g><!--MD5=[6885186701c20f2eb8284cfc4b03f71c]
+reverse link **titres__titres** to **titres**--><g id="link_**titres__titres**_**titres**"><path codeLine="291" d="M1081.3827,1076 C1081.3827,1076 1104,1076 1104,1076 C1104,1076 1104,1185.2445 1104,1271.4453 " fill="none" id="**titres__titres**-backto-**titres**-1" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="1081.3827" x2="1073.3827" y1="1076" y2="1084"/><line style="stroke:#181818;stroke-width:1.0;" x1="1081.3827" x2="1073.3827" y1="1076" y2="1068"/><line style="stroke:#181818;stroke-width:1.0;" x1="1081.3827" x2="1073.3827" y1="1076" y2="1076"/></g><!--MD5=[6885186701c20f2eb8284cfc4b03f71c]
+reverse link **titres__titres** to **titres**--><g id="link_**titres__titres**_**titres**"><path codeLine="293" d="M1081.4261,1095 C1081.4261,1095 1102,1095 1102,1095 C1102,1095 1102,1191.7473 1102,1271.2993 " fill="none" id="**titres__titres**-backto-**titres**-2" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="1081.4261" x2="1073.4261" y1="1095" y2="1103"/><line style="stroke:#181818;stroke-width:1.0;" x1="1081.4261" x2="1073.4261" y1="1095" y2="1087"/><line style="stroke:#181818;stroke-width:1.0;" x1="1081.4261" x2="1073.4261" y1="1095" y2="1095"/></g><!--MD5=[6885186701c20f2eb8284cfc4b03f71c]
+reverse link **titres__titres** to **titres**--><g id="link_**titres__titres**_**titres**"><path codeLine="295" d="M896.5,1121.5658 C896.5,1121.5658 896.5,1375 896.5,1375 C896.5,1375 1002.1808,1375 1099.8117,1375 " fill="none" id="**titres__titres**-backto-**titres**-3" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="896.5" x2="888.5" y1="1121.5658" y2="1113.5658"/><line style="stroke:#181818;stroke-width:1.0;" x1="896.5" x2="904.5" y1="1121.5658" y2="1113.5658"/><line style="stroke:#181818;stroke-width:1.0;" x1="896.5" x2="896.5" y1="1121.5658" y2="1113.5658"/></g><!--MD5=[f12e7196916c24138737d39df71d942b]
+reverse link **titres_activites** to **titres**--><g id="link_**titres_activites**_**titres**"><path codeLine="297" d="M1441.4265,1179 C1441.4265,1179 1419,1179 1419,1179 C1419,1179 1419,1224.3825 1419,1271.3605 " fill="none" id="**titres_activites**-backto-**titres**" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="1441.4265" x2="1449.4265" y1="1179" y2="1171"/><line style="stroke:#181818;stroke-width:1.0;" x1="1441.4265" x2="1449.4265" y1="1179" y2="1187"/><line style="stroke:#181818;stroke-width:1.0;" x1="1441.4265" x2="1449.4265" y1="1179" y2="1179"/></g><!--MD5=[5a758235c6f0faf17ad2f3404c604d82]
+reverse link **titres_activites** to **utilisateurs**--><g id="link_**titres_activites**_**utilisateurs**"><path codeLine="299" d="M1616.5,1211.2652 C1616.5,1211.2652 1616.5,1268 1616.5,1268 C1616.5,1268 1983.5654,1268 2205.812,1268 " fill="none" id="**titres_activites**-backto-**utilisateurs**" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="1616.5" x2="1608.5" y1="1211.2652" y2="1203.2652"/><line style="stroke:#181818;stroke-width:1.0;" x1="1616.5" x2="1624.5" y1="1211.2652" y2="1203.2652"/><line style="stroke:#181818;stroke-width:1.0;" x1="1616.5" x2="1616.5" y1="1211.2652" y2="1203.2652"/></g><!--MD5=[3bc886a617e09c124042eedc6d62a7e6]
+reverse link **titres_amodiataires** to **entreprises**--><g id="link_**titres_amodiataires**_**entreprises**"><path codeLine="301" d="M2306.75,289.7552 C2306.75,289.7552 2306.75,479.7933 2306.75,479.7933 " fill="none" id="**titres_amodiataires**-backto-**entreprises**" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="2306.75" x2="2298.75" y1="289.7552" y2="281.7552"/><line style="stroke:#181818;stroke-width:1.0;" x1="2306.75" x2="2314.75" y1="289.7552" y2="281.7552"/><line style="stroke:#181818;stroke-width:1.0;" x1="2306.75" x2="2306.75" y1="289.7552" y2="281.7552"/></g><!--MD5=[3bc886a617e09c124042eedc6d62a7e6]
+reverse link **titres_amodiataires** to **entreprises**--><g id="link_**titres_amodiataires**_**entreprises**"><path codeLine="303" d="M2383.5,289.7552 C2383.5,289.7552 2383.5,479.7933 2383.5,479.7933 " fill="none" id="**titres_amodiataires**-backto-**entreprises**-1" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="2383.5" x2="2375.5" y1="289.7552" y2="281.7552"/><line style="stroke:#181818;stroke-width:1.0;" x1="2383.5" x2="2391.5" y1="289.7552" y2="281.7552"/><line style="stroke:#181818;stroke-width:1.0;" x1="2383.5" x2="2383.5" y1="289.7552" y2="281.7552"/></g><!--MD5=[d0babee4d1e3b9320c239424fffbbfc1]
+reverse link **titres_amodiataires** to **titres_etapes**--><g id="link_**titres_amodiataires**_**titres_etapes**"><path codeLine="305" d="M2194.9577,246 C2194.9577,246 2183,246 2183,246 C2183,246 2183,303.3613 2183,373.8305 " fill="none" id="**titres_amodiataires**-backto-**titres_etapes**" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="2194.9577" x2="2202.9577" y1="246" y2="238"/><line style="stroke:#181818;stroke-width:1.0;" x1="2194.9577" x2="2202.9577" y1="246" y2="254"/><line style="stroke:#181818;stroke-width:1.0;" x1="2194.9577" x2="2202.9577" y1="246" y2="246"/></g><!--MD5=[d0babee4d1e3b9320c239424fffbbfc1]
+reverse link **titres_amodiataires** to **titres_etapes**--><g id="link_**titres_amodiataires**_**titres_etapes**"><path codeLine="307" d="M2194.6943,264 C2194.6943,264 2188,264 2188,264 C2188,264 2188,312.2398 2188,373.7643 " fill="none" id="**titres_amodiataires**-backto-**titres_etapes**-1" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="2194.6943" x2="2202.6943" y1="264" y2="256"/><line style="stroke:#181818;stroke-width:1.0;" x1="2194.6943" x2="2202.6943" y1="264" y2="272"/><line style="stroke:#181818;stroke-width:1.0;" x1="2194.6943" x2="2202.6943" y1="264" y2="264"/></g><!--MD5=[a03f2fe253375a9d759740d67333e799]
+reverse link **titres_demarches** to **titres**--><g id="link_**titres_demarches**_**titres**"><path codeLine="309" d="M1987.5,1203.159 C1987.5,1203.159 1987.5,1323 1987.5,1323 C1987.5,1323 1637.0012,1323 1423.0737,1323 " fill="none" id="**titres_demarches**-backto-**titres**" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="1987.5" x2="1979.5" y1="1203.159" y2="1195.159"/><line style="stroke:#181818;stroke-width:1.0;" x1="1987.5" x2="1995.5" y1="1203.159" y2="1195.159"/><line style="stroke:#181818;stroke-width:1.0;" x1="1987.5" x2="1987.5" y1="1203.159" y2="1195.159"/></g><!--MD5=[20662f1ae6d45bee1d6e245019e8a904]
+reverse link **titres_etapes** to **titres_demarches**--><g id="link_**titres_etapes**_**titres_demarches**"><path codeLine="311" d="M1987.5,897.1022 C1987.5,897.1022 1987.5,956.859 1987.5,956.859 " fill="none" id="**titres_etapes**-backto-**titres_demarches**" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="1987.5" x2="1979.5" y1="897.1022" y2="889.1022"/><line style="stroke:#181818;stroke-width:1.0;" x1="1987.5" x2="1995.5" y1="897.1022" y2="889.1022"/><line style="stroke:#181818;stroke-width:1.0;" x1="1987.5" x2="1987.5" y1="897.1022" y2="889.1022"/></g><!--MD5=[7e0ebd9cff6f52c9115584a3ded24570]
+reverse link **titres_etapes_entreprises_documents** to **entreprises_documents**--><g id="link_**titres_etapes_entreprises_documents**_**entreprises_documents**"><path codeLine="313" d="M2387,98.3105 C2387,98.3105 2387,172 2387,172 C2387,172 2494.1724,172 2598.7284,172 " fill="none" id="**titres_etapes_entreprises_documents**-backto-**entreprises_documents**" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="2387" x2="2379" y1="98.3105" y2="90.3105"/><line style="stroke:#181818;stroke-width:1.0;" x1="2387" x2="2395" y1="98.3105" y2="90.3105"/><line style="stroke:#181818;stroke-width:1.0;" x1="2387" x2="2387" y1="98.3105" y2="90.3105"/></g><!--MD5=[7e0ebd9cff6f52c9115584a3ded24570]
+reverse link **titres_etapes_entreprises_documents** to **entreprises_documents**--><g id="link_**titres_etapes_entreprises_documents**_**entreprises_documents**"><path codeLine="315" d="M2295,98.192 C2295,98.192 2295,177 2295,177 C2295,177 2458.6281,177 2598.7667,177 " fill="none" id="**titres_etapes_entreprises_documents**-backto-**entreprises_documents**-1" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="2295" x2="2287" y1="98.192" y2="90.192"/><line style="stroke:#181818;stroke-width:1.0;" x1="2295" x2="2303" y1="98.192" y2="90.192"/><line style="stroke:#181818;stroke-width:1.0;" x1="2295" x2="2295" y1="98.192" y2="90.192"/></g><!--MD5=[b555cbd6a92fa5ef63b44eb53d1d0fd0]
+reverse link **titres_etapes_entreprises_documents** to **titres_etapes**--><g id="link_**titres_etapes_entreprises_documents**_**titres_etapes**"><path codeLine="317" d="M2173,98.0437 C2173,98.0437 2173,373.9055 2173,373.9055 " fill="none" id="**titres_etapes_entreprises_documents**-backto-**titres_etapes**" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="2173" x2="2165" y1="98.0437" y2="90.0437"/><line style="stroke:#181818;stroke-width:1.0;" x1="2173" x2="2181" y1="98.0437" y2="90.0437"/><line style="stroke:#181818;stroke-width:1.0;" x1="2173" x2="2173" y1="98.0437" y2="90.0437"/></g><!--MD5=[b555cbd6a92fa5ef63b44eb53d1d0fd0]
+reverse link **titres_etapes_entreprises_documents** to **titres_etapes**--><g id="link_**titres_etapes_entreprises_documents**_**titres_etapes**"><path codeLine="319" d="M2178,98.0437 C2178,98.0437 2178,373.9055 2178,373.9055 " fill="none" id="**titres_etapes_entreprises_documents**-backto-**titres_etapes**-1" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="2178" x2="2170" y1="98.0437" y2="90.0437"/><line style="stroke:#181818;stroke-width:1.0;" x1="2178" x2="2186" y1="98.0437" y2="90.0437"/><line style="stroke:#181818;stroke-width:1.0;" x1="2178" x2="2178" y1="98.0437" y2="90.0437"/></g><!--MD5=[8eb44e23b22a65eb3aec0fd44a6d21b7]
+reverse link **titres_titulaires** to **entreprises**--><g id="link_**titres_titulaires**_**entreprises**"><path codeLine="321" d="M2176.3607,209 C2176.3607,209 2199.6667,209 2199.6667,209 C2199.6667,209 2199.6667,581 2199.6667,581 C2199.6667,581 2211.7011,581 2229.6118,581 " fill="none" id="**titres_titulaires**-backto-**entreprises**" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="2176.3607" x2="2168.3607" y1="209" y2="217"/><line style="stroke:#181818;stroke-width:1.0;" x1="2176.3607" x2="2168.3607" y1="209" y2="201"/><line style="stroke:#181818;stroke-width:1.0;" x1="2176.3607" x2="2168.3607" y1="209" y2="209"/></g><!--MD5=[8eb44e23b22a65eb3aec0fd44a6d21b7]
+reverse link **titres_titulaires** to **entreprises**--><g id="link_**titres_titulaires**_**entreprises**"><path codeLine="323" d="M2176.1691,227 C2176.1691,227 2196.3333,227 2196.3333,227 C2196.3333,227 2196.3333,682 2196.3333,682 C2196.3333,682 2209.9304,682 2229.795,682 " fill="none" id="**titres_titulaires**-backto-**entreprises**-1" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="2176.1691" x2="2168.1691" y1="227" y2="235"/><line style="stroke:#181818;stroke-width:1.0;" x1="2176.1691" x2="2168.1691" y1="227" y2="219"/><line style="stroke:#181818;stroke-width:1.0;" x1="2176.1691" x2="2168.1691" y1="227" y2="227"/></g><!--MD5=[31c3bc600c901d1b2c33bfea8fc135ac]
+reverse link **titres_titulaires** to **titres_etapes**--><g id="link_**titres_titulaires**_**titres_etapes**"><path codeLine="325" d="M1927.3333,289.7552 C1927.3333,289.7552 1927.3333,373.7319 1927.3333,373.7319 " fill="none" id="**titres_titulaires**-backto-**titres_etapes**" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="1927.3333" x2="1919.3333" y1="289.7552" y2="281.7552"/><line style="stroke:#181818;stroke-width:1.0;" x1="1927.3333" x2="1935.3333" y1="289.7552" y2="281.7552"/><line style="stroke:#181818;stroke-width:1.0;" x1="1927.3333" x2="1927.3333" y1="289.7552" y2="281.7552"/></g><!--MD5=[31c3bc600c901d1b2c33bfea8fc135ac]
+reverse link **titres_titulaires** to **titres_etapes**--><g id="link_**titres_titulaires**_**titres_etapes**"><path codeLine="327" d="M2047.6667,289.7552 C2047.6667,289.7552 2047.6667,373.7319 2047.6667,373.7319 " fill="none" id="**titres_titulaires**-backto-**titres_etapes**-1" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="2047.6667" x2="2039.6667" y1="289.7552" y2="281.7552"/><line style="stroke:#181818;stroke-width:1.0;" x1="2047.6667" x2="2055.6667" y1="289.7552" y2="281.7552"/><line style="stroke:#181818;stroke-width:1.0;" x1="2047.6667" x2="2047.6667" y1="289.7552" y2="281.7552"/></g><!--MD5=[f28ed266483423ffe50277f9cba4244d]
+reverse link **utilisateurs__entreprises** to **entreprises**--><g id="link_**utilisateurs__entreprises**_**entreprises**"><path codeLine="329" d="M3482.6667,281.6413 C3482.6667,281.6413 3482.6667,682 3482.6667,682 C3482.6667,682 2839.5875,682 2537.2021,682 " fill="none" id="**utilisateurs__entreprises**-backto-**entreprises**" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="3482.6667" x2="3474.6667" y1="281.6413" y2="273.6413"/><line style="stroke:#181818;stroke-width:1.0;" x1="3482.6667" x2="3490.6667" y1="281.6413" y2="273.6413"/><line style="stroke:#181818;stroke-width:1.0;" x1="3482.6667" x2="3482.6667" y1="281.6413" y2="273.6413"/></g><!--MD5=[15561590a5374a355d05a7abef5df509]
+reverse link **utilisateurs__entreprises** to **utilisateurs**--><g id="link_**utilisateurs__entreprises**_**utilisateurs**"><path codeLine="331" d="M3586.3333,281.5721 C3586.3333,281.5721 3586.3333,1375 3586.3333,1375 C3586.3333,1375 2869.6716,1375 2537.2357,1375 " fill="none" id="**utilisateurs__entreprises**-backto-**utilisateurs**" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="3586.3333" x2="3578.3333" y1="281.5721" y2="273.5721"/><line style="stroke:#181818;stroke-width:1.0;" x1="3586.3333" x2="3594.3333" y1="281.5721" y2="273.5721"/><line style="stroke:#181818;stroke-width:1.0;" x1="3586.3333" x2="3586.3333" y1="281.5721" y2="273.5721"/></g><!--MD5=[554cd1a2dbcb03010d4bf5244d6ab8cb]
+reverse link **utilisateurs__titres** to **titres**--><g id="link_**utilisateurs__titres**_**titres**"><path codeLine="333" d="M2196,1121.5658 C2196,1121.5658 2196,1375 2196,1375 C2196,1375 1690.6767,1375 1423.2106,1375 " fill="none" id="**utilisateurs__titres**-backto-**titres**" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="2196" x2="2188" y1="1121.5658" y2="1113.5658"/><line style="stroke:#181818;stroke-width:1.0;" x1="2196" x2="2204" y1="1121.5658" y2="1113.5658"/><line style="stroke:#181818;stroke-width:1.0;" x1="2196" x2="2196" y1="1121.5658" y2="1113.5658"/></g><!--MD5=[554cd1a2dbcb03010d4bf5244d6ab8cb]
+reverse link **utilisateurs__titres** to **titres**--><g id="link_**utilisateurs__titres**_**titres**"><path codeLine="335" d="M2201,1121.7887 C2201,1121.7887 2201,1426 2201,1426 C2201,1426 1691.6227,1426 1423.0058,1426 " fill="none" id="**utilisateurs__titres**-backto-**titres**-1" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="2201" x2="2193" y1="1121.7887" y2="1113.7887"/><line style="stroke:#181818;stroke-width:1.0;" x1="2201" x2="2209" y1="1121.7887" y2="1113.7887"/><line style="stroke:#181818;stroke-width:1.0;" x1="2201" x2="2201" y1="1121.7887" y2="1113.7887"/></g><!--MD5=[26aba9329e960314c6eed3e229e91b1b]
+reverse link **utilisateurs__titres** to **utilisateurs**--><g id="link_**utilisateurs__titres**_**utilisateurs**"><path codeLine="337" d="M2316.3333,1121.7419 C2316.3333,1121.7419 2316.3333,1262.8537 2316.3333,1262.8537 " fill="none" id="**utilisateurs__titres**-backto-**utilisateurs**" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="2316.3333" x2="2308.3333" y1="1121.7419" y2="1113.7419"/><line style="stroke:#181818;stroke-width:1.0;" x1="2316.3333" x2="2324.3333" y1="1121.7419" y2="1113.7419"/><line style="stroke:#181818;stroke-width:1.0;" x1="2316.3333" x2="2316.3333" y1="1121.7419" y2="1113.7419"/></g><!--MD5=[26aba9329e960314c6eed3e229e91b1b]
+reverse link **utilisateurs__titres** to **utilisateurs**--><g id="link_**utilisateurs__titres**_**utilisateurs**"><path codeLine="339" d="M2426.6667,1121.7419 C2426.6667,1121.7419 2426.6667,1262.8537 2426.6667,1262.8537 " fill="none" id="**utilisateurs__titres**-backto-**utilisateurs**-1" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="2426.6667" x2="2418.6667" y1="1121.7419" y2="1113.7419"/><line style="stroke:#181818;stroke-width:1.0;" x1="2426.6667" x2="2434.6667" y1="1121.7419" y2="1113.7419"/><line style="stroke:#181818;stroke-width:1.0;" x1="2426.6667" x2="2426.6667" y1="1121.7419" y2="1113.7419"/></g><!--MD5=[920beaf1a6d1b7749a50a221f8e46a5b]
 link **administrations__activites_types__emails** to **communes**--></g></svg>
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index bb07041c24662babf4812825d63c8655c7750067..9d88308eac67405a61caebbf805a8e55a3ca4b5d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -29168,16 +29168,6 @@
         "vue": "^3.2.0"
       }
     },
-    "node_modules/vuex-router-sync": {
-      "version": "6.0.0-rc.1",
-      "resolved": "https://registry.npmjs.org/vuex-router-sync/-/vuex-router-sync-6.0.0-rc.1.tgz",
-      "integrity": "sha512-pzVrX/rmQsDjJiKPAjgKxpkxWdiBBQmxATFA6eFyS2Tmo6jauq8iDk9BWxkw41/OA+pbq4wkONRC0aeErDw8GQ==",
-      "dev": true,
-      "peerDependencies": {
-        "vue-router": "^4.0.0",
-        "vuex": "^4.0.0"
-      }
-    },
     "node_modules/w3c-xmlserializer": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz",
@@ -30805,6 +30795,7 @@
         "@storybook/addon-controls": "^7.0.22",
         "@storybook/addon-styling": "^1.3.0",
         "@storybook/builder-vite": "^7.0.22",
+        "@storybook/preview-api": "^7.0.22",
         "@storybook/testing-library": "^0.2.0",
         "@storybook/testing-vue3": "^1.0.0",
         "@storybook/vue3": "^7.0.22",
@@ -30867,8 +30858,7 @@
         "vue": "^3.3.4",
         "vue-router": "^4.2.2",
         "vue-tsc": "^1.8.1",
-        "vuex": "^4.1.0",
-        "vuex-router-sync": "^6.0.0-rc.1"
+        "vuex": "^4.1.0"
       }
     },
     "packages/ui/node_modules/@babel/code-frame": {
@@ -43231,6 +43221,7 @@
         "@storybook/addon-controls": "^7.0.22",
         "@storybook/addon-styling": "^1.3.0",
         "@storybook/builder-vite": "^7.0.22",
+        "@storybook/preview-api": "^7.0.22",
         "@storybook/testing-library": "^0.2.0",
         "@storybook/testing-vue3": "^1.0.0",
         "@storybook/vue3": "^7.0.22",
@@ -43294,7 +43285,6 @@
         "vue-router": "^4.2.2",
         "vue-tsc": "^1.8.1",
         "vuex": "^4.1.0",
-        "vuex-router-sync": "^6.0.0-rc.1",
         "zod": "^3.22.4"
       },
       "dependencies": {
@@ -57126,13 +57116,6 @@
         "@vue/devtools-api": "^6.0.0-beta.11"
       }
     },
-    "vuex-router-sync": {
-      "version": "6.0.0-rc.1",
-      "resolved": "https://registry.npmjs.org/vuex-router-sync/-/vuex-router-sync-6.0.0-rc.1.tgz",
-      "integrity": "sha512-pzVrX/rmQsDjJiKPAjgKxpkxWdiBBQmxATFA6eFyS2Tmo6jauq8iDk9BWxkw41/OA+pbq4wkONRC0aeErDw8GQ==",
-      "dev": true,
-      "requires": {}
-    },
     "w3c-xmlserializer": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz",
diff --git a/packages/api/.gitignore b/packages/api/.gitignore
index f7a8edd88424e1de0cb199294a23542f79070e93..0b57daf9d1531e2f7120abb3d1bd75fea8b30446 100644
--- a/packages/api/.gitignore
+++ b/packages/api/.gitignore
@@ -9,19 +9,6 @@ node_modules
 /backups
 backup_without_files.sql
 /dist
-/sources/titres.json
-/sources/titres-*.json
-!/sources/titres-types--demarches-types--etapes-types.json
-!/sources/titres-types--demarches-types--etapes-types--documents-types.json
-!/sources/titres-types--demarches-types.json
-!/sources/titres-types--titres-statuts.json
-!/sources/titres-types-types.json
-!/sources/titres-types.json
-/sources/utilisateurs*.json
-/sources/entreprises*.json
-/sources/documents.json
-/sources/communes.json
-/sources/forets.json
 /coverage
 /api-cache
 /files
diff --git a/packages/api/package.json b/packages/api/package.json
index 282e9580e0063d4873f83dafc6f0ca818b8102d2..e73e32e709da98348b5a697a15299ec921d9ff01 100644
--- a/packages/api/package.json
+++ b/packages/api/package.json
@@ -11,7 +11,6 @@
     "daily": "node --loader ts-node/esm/transpile-only ./src/scripts/daily.ts",
     "monthly": "node --loader ts-node/esm/transpile-only ./src/scripts/monthly.ts",
     "db:dump": "rm -rf ./backups/* && pg_dump --host=localhost --username=postgres --clean --if-exists --format=d --no-owner --no-privileges --dbname=camino --file=./backups/",
-    "db:export": "rm -rf sources && node --loader ts-node/esm/transpile-only src/scripts/database-to-json-export.ts",
     "db:import": "pg_restore --host=localhost --username=postgres --clean --if-exists --no-owner --no-privileges --dbname=camino ./backups",
     "db:import-without-files": "pg_restore --host=localhost --username=postgres --clean --if-exists --no-owner --no-privileges --dbname=camino ./backup_without_files.sql",
     "db:prod-fetch": "rm -rf ./backups/* && ssh camino.beta.gouv.fr 'rm -f ~/backup.tgz && cd  /srv/backups/dump/ && tar cvzf ~/backup.tgz .' && scp camino.beta.gouv.fr:~/backup.tgz backups/ && tar xvf backups/backup.tgz --directory ./backups",
diff --git a/packages/api/src/api/graphql/administrations-permissions-etapes.test.integration.ts b/packages/api/src/api/graphql/administrations-permissions-etapes.test.integration.ts
index 2c47836d16e7e2f07c7151871097a995d739ab16..de2207c057eaf51e978c40f30d9583feea6745ca 100644
--- a/packages/api/src/api/graphql/administrations-permissions-etapes.test.integration.ts
+++ b/packages/api/src/api/graphql/administrations-permissions-etapes.test.integration.ts
@@ -10,14 +10,6 @@ vi.mock('../../tools/dir-create', () => ({
   default: vi.fn(),
 }))
 
-vi.mock('../../tools/file-stream-create', () => ({
-  __esModule: true,
-  default: vi.fn(),
-}))
-vi.mock('../../tools/file-delete', () => ({
-  __esModule: true,
-  default: vi.fn(),
-}))
 console.info = vi.fn()
 console.error = vi.fn()
 
diff --git a/packages/api/src/api/graphql/documents.test.integration.ts b/packages/api/src/api/graphql/documents.test.integration.ts
deleted file mode 100644
index f8620d484f4750658a2a560a59c105b5f4a62daa..0000000000000000000000000000000000000000
--- a/packages/api/src/api/graphql/documents.test.integration.ts
+++ /dev/null
@@ -1,90 +0,0 @@
-import { graphQLCall, queryImport } from '../../../tests/_utils/index.js'
-import { documentCreate, documentGet } from '../../database/queries/documents.js'
-import { titreCreate } from '../../database/queries/titres.js'
-import { titreEtapeCreate } from '../../database/queries/titres-etapes.js'
-import { userSuper } from '../../database/user-super.js'
-import { dbManager } from '../../../tests/db-manager.js'
-import { titreDemarcheCreate } from '../../database/queries/titres-demarches.js'
-import { getCurrent, toCaminoDate } from 'camino-common/src/date.js'
-
-import { afterAll, afterEach, beforeAll, describe, test, expect, vi } from 'vitest'
-import type { Pool } from 'pg'
-import { newDocumentId } from '../../database/models/_format/id-create.js'
-import { titreSlugValidator } from 'camino-common/src/validators/titres.js'
-
-console.info = vi.fn()
-console.error = vi.fn()
-
-let dbPool: Pool
-beforeAll(async () => {
-  const { pool } = await dbManager.populateDb()
-  dbPool = pool
-})
-
-afterEach(async () => {
-  await dbManager.truncateSchema()
-})
-
-afterAll(async () => {
-  await dbManager.closeKnex()
-})
-
-describe('documentSupprimer', () => {
-  const documentSupprimerQuery = queryImport('documents-supprimer')
-
-  test('ne peut pas supprimer un document (utilisateur anonyme)', async () => {
-    const res = await graphQLCall(dbPool, documentSupprimerQuery, { id: 'toto' }, undefined)
-
-    expect(res.body.errors[0].message).toBe('droits insuffisants')
-  })
-
-  test('ne peut pas supprimer un document inexistant (utilisateur super)', async () => {
-    const res = await graphQLCall(dbPool, documentSupprimerQuery, { id: 'toto' }, { role: 'super' })
-
-    expect(res.body.errors[0].message).toBe('aucun document avec cette id')
-  })
-
-  test('peut supprimer un document d’étape (utilisateur super)', async () => {
-    const titre = await titreCreate(
-      {
-        nom: '',
-        slug: titreSlugValidator.parse('slug-arm-2'),
-        typeId: 'arm',
-        titreStatutId: 'ind',
-        propsTitreEtapesIds: {},
-      },
-      {}
-    )
-
-    const titreDemarche = await titreDemarcheCreate({
-      titreId: titre.id,
-      typeId: 'oct',
-    })
-
-    const titreEtape = await titreEtapeCreate(
-      {
-        typeId: 'mfr',
-        statutId: 'aco',
-        ordre: 1,
-        titreDemarcheId: titreDemarche.id,
-        date: toCaminoDate('2021-01-01'),
-      },
-      userSuper,
-      titre.id
-    )
-
-    const documentId = newDocumentId(getCurrent(), 'fac')
-    await documentCreate({
-      id: documentId,
-      typeId: 'fac',
-      date: toCaminoDate('2023-01-12'),
-      titreEtapeId: titreEtape.id,
-    })
-
-    const res = await graphQLCall(dbPool, documentSupprimerQuery, { id: documentId }, { role: 'super' })
-
-    expect(res.body.errors).toBe(undefined)
-    expect(res.body.data.documentSupprimer).toBeTruthy()
-    expect(await documentGet(documentId, {}, userSuper)).toBe(undefined)
-  })
-})
diff --git a/packages/api/src/api/graphql/resolvers.ts b/packages/api/src/api/graphql/resolvers.ts
index a26c048d195ad14afe2034a09c086062ccc81885..c7e429c2f84cd952a29c4b3c6c5ed3acd35752b4 100644
--- a/packages/api/src/api/graphql/resolvers.ts
+++ b/packages/api/src/api/graphql/resolvers.ts
@@ -3,11 +3,9 @@ import { GraphQLUpload } from 'graphql-upload'
 
 import { titres, titreCreer, titre } from './resolvers/titres.js'
 
-import { etape, etapeHeritage, etapeCreer, etapeModifier, etapeSupprimer, etapeDeposer } from './resolvers/titres-etapes.js'
+import { etape, etapeHeritage, etapeCreer, etapeModifier, etapeSupprimer } from './resolvers/titres-etapes.js'
 
-import { documentCreer, documentModifier, documentSupprimer } from './resolvers/documents.js'
-
-import { demarche, demarches, demarcheCreer, demarcheModifier, demarcheSupprimer } from './resolvers/titres-demarches.js'
+import { demarches, demarcheCreer, demarcheModifier, demarcheSupprimer } from './resolvers/titres-demarches.js'
 
 import { utilisateur, utilisateurs, newsletterInscrire } from './resolvers/utilisateurs.js'
 
@@ -51,7 +49,6 @@ export default {
   //  queries
   etape,
   etapeHeritage,
-  demarche,
   demarches,
   demarchesTypes,
   demarchesStatuts,
@@ -92,10 +89,6 @@ export default {
   etapeCreer,
   etapeModifier,
   etapeSupprimer,
-  etapeDeposer,
-  documentCreer,
-  documentModifier,
-  documentSupprimer,
   activiteDeposer,
   newsletterInscrire,
   titreDemandeCreer,
diff --git a/packages/api/src/api/graphql/resolvers/_titre-etape.ts b/packages/api/src/api/graphql/resolvers/_titre-etape.ts
index f768e1e9140eca28d8cdbe56b9be478eaaa15d10..cc1987be0897269eb87e82a916d7250a10241684 100644
--- a/packages/api/src/api/graphql/resolvers/_titre-etape.ts
+++ b/packages/api/src/api/graphql/resolvers/_titre-etape.ts
@@ -9,9 +9,22 @@ import { DeepReadonly, getKeys } from 'camino-common/src/typescript-tools.js'
 import { getSections, Section } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sections.js'
 import { ETAPE_HERITAGE_PROPS, isHeritageProps } from 'camino-common/src/heritage.js'
 import { EtapeTypeId, EtapesTypes } from 'camino-common/src/static/etapesTypes.js'
+import { CaminoDate } from 'camino-common/src/date.js'
+import { EtapeId } from 'camino-common/src/etape.js'
+
+const titreEtapeHeritagePropsBuild = (date: CaminoDate, titreEtapes: ITitreEtape[] | null, etapeId: EtapeId | null) => {
+  const titreEtapesFiltered = titreEtapesSortAscByOrdre(
+    titreEtapes?.filter(e => {
+      if (e.id === etapeId) {
+        return false
+      }
+      if (EtapesTypes[e.typeId].fondamentale && e.date <= date) {
+        return true
+      }
 
-const titreEtapeHeritagePropsBuild = (date: string, titreEtapes?: ITitreEtape[] | null) => {
-  const titreEtapesFiltered = titreEtapesSortAscByOrdre(titreEtapes?.filter(e => EtapesTypes[e.typeId].fondamentale && e.date <= date) ?? [])
+      return false
+    }) ?? []
+  )
 
   const heritageProps = ETAPE_HERITAGE_PROPS.reduce((acc: IHeritageProps, id) => {
     acc[id] = { actif: !!titreEtapesFiltered.length }
@@ -46,7 +59,14 @@ const titreEtapeHeritagePropsBuild = (date: string, titreEtapes?: ITitreEtape[]
   return newTitreEtape
 }
 
-const titreEtapeHeritageContenuBuild = (date: string, etapeTypeId: EtapeTypeId, titreTypeId: TitreTypeId, demarcheTypeId: DemarcheTypeId, titreEtapes?: ITitreEtape[] | null) => {
+const titreEtapeHeritageContenuBuild = (
+  date: CaminoDate,
+  etapeTypeId: EtapeTypeId,
+  titreTypeId: TitreTypeId,
+  demarcheTypeId: DemarcheTypeId,
+  titreEtapes: ITitreEtape[] | null,
+  etapeId: EtapeId | null
+) => {
   if (!titreEtapes) {
     titreEtapes = []
   }
@@ -58,7 +78,7 @@ const titreEtapeHeritageContenuBuild = (date: string, etapeTypeId: EtapeTypeId,
     typeId: etapeTypeId,
   } as ITitreEtape
 
-  let titreEtapesFiltered = titreEtapesSortDescByOrdre(titreEtapes.filter(te => te.date < date))
+  let titreEtapesFiltered = titreEtapesSortDescByOrdre(titreEtapes.filter(te => te.date < date && te.id !== etapeId))
 
   titreEtapesFiltered.splice(0, 0, titreEtape)
 
@@ -105,18 +125,25 @@ const titreEtapeHeritageContenuBuild = (date: string, etapeTypeId: EtapeTypeId,
   return { contenu, heritageContenu }
 }
 
-export const titreEtapeHeritageBuild = (date: string, etapeTypeId: EtapeTypeId, titreDemarche: ITitreDemarche, titreTypeId: TitreTypeId, demarcheTypeId: DemarcheTypeId) => {
+export const titreEtapeHeritageBuild = (
+  date: CaminoDate,
+  etapeTypeId: EtapeTypeId,
+  titreDemarche: ITitreDemarche,
+  titreTypeId: TitreTypeId,
+  demarcheTypeId: DemarcheTypeId,
+  etapeId: EtapeId | null
+) => {
   let titreEtape = {} as ITitreEtape
 
   const etapeType = EtapesTypes[etapeTypeId]
 
   if (etapeType.fondamentale) {
-    titreEtape = titreEtapeHeritagePropsBuild(date, titreDemarche.etapes)
+    titreEtape = titreEtapeHeritagePropsBuild(date, titreDemarche.etapes ?? [], etapeId)
   }
 
   const sections = getSections(titreTypeId, demarcheTypeId, etapeType.id)
   if (sections?.length) {
-    const { contenu, heritageContenu } = titreEtapeHeritageContenuBuild(date, etapeTypeId, titreTypeId, demarcheTypeId, titreDemarche.etapes)
+    const { contenu, heritageContenu } = titreEtapeHeritageContenuBuild(date, etapeTypeId, titreTypeId, demarcheTypeId, titreDemarche.etapes ?? [], etapeId)
 
     titreEtape.contenu = contenu
     titreEtape.heritageContenu = heritageContenu
diff --git a/packages/api/src/api/graphql/resolvers/documents.ts b/packages/api/src/api/graphql/resolvers/documents.ts
deleted file mode 100644
index ef6f9966be86325afeae1af6dd2bba08a3296c3b..0000000000000000000000000000000000000000
--- a/packages/api/src/api/graphql/resolvers/documents.ts
+++ /dev/null
@@ -1,258 +0,0 @@
-import { GraphQLResolveInfo } from 'graphql'
-import { FileUpload } from 'graphql-upload'
-import { join } from 'path'
-import { Context, IDocument } from '../../../types.js'
-
-import fileDelete from '../../../tools/file-delete.js'
-import fileStreamCreate from '../../../tools/file-stream-create.js'
-
-import { documentGet, documentCreate, documentUpdate, documentDelete } from '../../../database/queries/documents.js'
-
-import { fieldsBuild } from './_fields-build.js'
-import fileRename from '../../../tools/file-rename.js'
-import { titreEtapeGet } from '../../../database/queries/titres-etapes.js'
-
-import { documentInputValidate } from '../../../business/validations/document-input-validate.js'
-import { documentUpdationValidate } from '../../../business/validations/document-updation-validate.js'
-import { userSuper } from '../../../database/user-super.js'
-import { documentFilePathFind } from '../../../tools/documents/document-path-find.js'
-import { isBureauDEtudes, isEntreprise, User } from 'camino-common/src/roles.js'
-import { canEditEtape } from 'camino-common/src/permissions/titres-etapes.js'
-import { newDocumentId } from '../../../database/models/_format/id-create.js'
-import { EtapeId } from 'camino-common/src/etape.js'
-import { isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty, isNullOrUndefined } from 'camino-common/src/typescript-tools.js'
-import { documentTypeIdValidator } from 'camino-common/src/static/documentsTypes.js'
-
-const documentFileCreate = async (document: IDocument, fileUpload: FileUpload) => {
-  const documentFilePath = documentFilePathFind(document, true)
-  const { createReadStream } = await fileUpload
-
-  await fileStreamCreate(createReadStream(), join(process.cwd(), documentFilePath))
-}
-
-const documentPermissionsCheck = async (document: IDocument, user: User) => {
-  if (!user) throw new Error('droits insuffisants')
-
-  if (document.titreEtapeId) {
-    const titreEtape = await titreEtapeGet(
-      document.titreEtapeId,
-      {
-        fields: {
-          titulaires: { id: {} },
-          demarche: { titre: { pointsEtape: { id: {} } } },
-        },
-      },
-      user
-    )
-
-    if (isNullOrUndefined(titreEtape)) throw new Error("l’étape n'existe pas")
-
-    if (!titreEtape.titulaires) {
-      throw new Error('Les titulaires de l’étape ne sont pas chargés')
-    }
-    if (!titreEtape.demarche || !titreEtape.demarche.titre || titreEtape.demarche.titre.administrationsLocales === undefined || !titreEtape.demarche.titre.titreStatutId) {
-      throw new Error('la démarche n’est pas chargée complètement')
-    }
-
-    if (
-      !canEditEtape(user, titreEtape.typeId, titreEtape.statutId, titreEtape.titulaires, titreEtape.demarche.titre.administrationsLocales ?? [], titreEtape.demarche.typeId, {
-        typeId: titreEtape.demarche.titre.typeId,
-        titreStatutId: titreEtape.demarche.titre.titreStatutId,
-      })
-    ) {
-      throw new Error('droits insuffisants')
-    }
-  }
-}
-
-export const documentCreer = async ({ document }: { document: IDocument }, { user }: Context, info: GraphQLResolveInfo) => {
-  try {
-    const fields = fieldsBuild(info)
-
-    if (!user) {
-      throw new Error('droit insuffisants')
-    }
-
-    await documentPermissionsCheck(document, user)
-
-    if (!documentTypeIdValidator.safeParse(document.typeId).success) {
-      throw new Error('type de document manquant')
-    }
-
-    const errors = documentInputValidate(document)
-
-    const rulesErrors = documentUpdationValidate(document)
-
-    if (errors.length || rulesErrors.length) {
-      throw new Error(errors.concat(rulesErrors).join(', '))
-    }
-
-    document.id = newDocumentId(document.date, document.typeId)
-
-    // Enregistre le nouveau fichier
-    // - arrivé via API (requêtes libres)
-    if (document.fichierNouveau) {
-      document.fichier = true
-      await documentFileCreate(document, document.fichierNouveau.file)
-    } else if (isNotNullNorUndefined(document.nomTemporaire)) {
-      // - arrivé via UI
-      const pathFrom = `/files/tmp/${document.nomTemporaire}`
-      const pathTo = await documentFilePathFind(document, true)
-
-      await fileRename(pathFrom, pathTo)
-    }
-
-    if ((document.publicLecture ?? false) || isEntreprise(user) || isBureauDEtudes(user)) {
-      document.entreprisesLecture = true
-    }
-
-    const { id } = await documentCreate(document)
-
-    const documentUpdated = await documentGet(id, { fields }, user)
-
-    return documentUpdated
-  } catch (e) {
-    console.error(e)
-
-    throw e
-  }
-}
-
-export const documentModifier = async ({ document }: { document: IDocument }, { user }: Context, info: GraphQLResolveInfo) => {
-  try {
-    const fields = fieldsBuild(info)
-
-    if (!user) {
-      throw new Error('droit insuffisants')
-    }
-
-    const documentOld = await documentGet(document.id, {}, user)
-    if (!documentOld) throw new Error("le document n'existe pas")
-
-    await documentPermissionsCheck(document, user)
-
-    const errors = documentInputValidate(document)
-    const rulesErrors = documentUpdationValidate(document)
-
-    if (errors.length || rulesErrors.length) {
-      const e = errors.concat(rulesErrors)
-      throw new Error(e.join(', '))
-    }
-
-    if ((document.publicLecture ?? false) || isEntreprise(user) || isBureauDEtudes(user)) {
-      document.entreprisesLecture = true
-    }
-
-    const documentFichierNouveau = document.fichierNouveau
-
-    document.fichier = !!document.fichierNouveau || document.fichier
-
-    const documentUpdated = await documentUpdate(document.id, document)
-
-    // supprime de l'ancien fichier
-    if ((isNotNullNorUndefined(documentFichierNouveau) || !(documentUpdated.fichier ?? false)) && (documentOld.fichier ?? false)) {
-      const documentOldFilePath = documentFilePathFind(documentOld)
-
-      try {
-        await fileDelete(join(process.cwd(), documentOldFilePath))
-      } catch (e) {
-        console.info(`impossible de supprimer le fichier: ${documentOldFilePath}`)
-      }
-    }
-
-    // Enregistre le nouveau fichier
-    // - arrivé via API (requêtes libres)
-    if (documentFichierNouveau) {
-      await documentFileCreate(documentUpdated, documentFichierNouveau.file)
-    } else {
-      // - arrivé via UI
-      if (isNotNullNorUndefined(document.nomTemporaire)) {
-        const pathFrom = `/files/tmp/${document.nomTemporaire}`
-        const pathTo = documentFilePathFind(document, true)
-
-        await fileRename(pathFrom, pathTo)
-      }
-    }
-
-    return await documentGet(documentUpdated.id, { fields }, user)
-  } catch (e) {
-    console.error(e)
-
-    throw e
-  }
-}
-
-export const documentSupprimer = async ({ id }: { id: string }, { user }: Context) => {
-  try {
-    if (!user) throw new Error('droits insuffisants')
-
-    const documentOld = await documentGet(
-      id,
-      {
-        fields: { id: {} },
-      },
-      user
-    )
-
-    if (!documentOld) {
-      throw new Error('aucun document avec cette id')
-    }
-
-    if (!(documentOld.suppression ?? false)) {
-      throw new Error('droits insuffisants')
-    }
-
-    await documentPermissionsCheck(documentOld, user)
-
-    if (documentOld.fichier ?? false) {
-      const documentOldFilePath = documentFilePathFind(documentOld)
-
-      try {
-        await fileDelete(join(process.cwd(), documentOldFilePath))
-      } catch (e) {
-        console.info(`impossible de supprimer le fichier: ${documentOldFilePath}`)
-      }
-    }
-
-    await documentDelete(id)
-
-    return true
-  } catch (e) {
-    console.error(e)
-
-    throw e
-  }
-}
-
-export const documentsLier = async (context: Context, documentIds: string[], etapeId: EtapeId, oldParent?: { documents?: IDocument[] | null }) => {
-  if (isNotNullNorUndefined(oldParent) && isNotNullNorUndefinedNorEmpty(oldParent.documents)) {
-    // supprime les anciens documents ou ceux qui n'ont pas de fichier
-    const oldDocumentsIds = oldParent.documents.map(d => d.id)
-    for (const oldDocumentId of oldDocumentsIds) {
-      const documentId = documentIds.find(id => id === oldDocumentId)
-
-      if (isNullOrUndefined(documentId)) {
-        await documentSupprimer({ id: oldDocumentId }, context)
-      }
-    }
-  }
-
-  // lie des documents
-  for (const documentId of documentIds) {
-    const document = await documentGet(documentId, { fields: {} }, userSuper)
-
-    if (document) {
-      if (!document.titreEtapeId) {
-        await documentUpdate(document.id, { titreEtapeId: etapeId })
-
-        if (document.fichier ?? false) {
-          const documentPath = documentFilePathFind(document)
-          document.titreEtapeId = etapeId
-          const newDocumentPath = documentFilePathFind(document, true)
-
-          await fileRename(documentPath, newDocumentPath)
-        }
-      }
-    }
-  }
-}
diff --git a/packages/api/src/api/graphql/resolvers/titres-demarches.ts b/packages/api/src/api/graphql/resolvers/titres-demarches.ts
index 65c33df0e5cf07c0bbadd54b1aacf00f2b220367..998bc2be1fa398fff0b1150e08514786c608ced9 100644
--- a/packages/api/src/api/graphql/resolvers/titres-demarches.ts
+++ b/packages/api/src/api/graphql/resolvers/titres-demarches.ts
@@ -17,24 +17,6 @@ import { canCreateTravaux, canCreateOrEditDemarche, canDeleteDemarche } from 'ca
 import { isNullOrUndefined } from 'camino-common/src/typescript-tools.js'
 import { userSuper } from '../../../database/user-super.js'
 
-export const demarche = async ({ id }: { id: string }, { user }: Context, info: GraphQLResolveInfo) => {
-  try {
-    const fields = fieldsBuild(info)
-
-    const titreDemarche = await titreDemarcheGet(id, { fields }, user)
-
-    if (!titreDemarche) {
-      throw new Error("la démarche n'existe pas")
-    }
-
-    return titreDemarcheFormat(titreDemarche, fields.elements)
-  } catch (e) {
-    console.error(e)
-
-    throw e
-  }
-}
-
 export const demarches = async (
   {
     page,
diff --git a/packages/api/src/api/graphql/resolvers/titres-etapes.ts b/packages/api/src/api/graphql/resolvers/titres-etapes.ts
index 7077ddd26de6044bf471a9383eb73334c20e473f..a491a77d68ebef0078f8bed86f2342551072f070 100644
--- a/packages/api/src/api/graphql/resolvers/titres-etapes.ts
+++ b/packages/api/src/api/graphql/resolvers/titres-etapes.ts
@@ -1,12 +1,12 @@
 import { GraphQLResolveInfo } from 'graphql'
 
-import { Context, IContenu, IDecisionAnnexeContenu, IDocument, ITitre, ITitreEtape } from '../../../types.js'
+import { Context, ITitre, ITitreEtape } from '../../../types.js'
 
-import { titreEtapeCreate, titreEtapeGet, titreEtapeUpdate, titreEtapeUpsert } from '../../../database/queries/titres-etapes.js'
+import { titreEtapeGet, titreEtapeUpdate, titreEtapeUpsert } from '../../../database/queries/titres-etapes.js'
 import { titreDemarcheGet } from '../../../database/queries/titres-demarches.js'
 import { titreGet } from '../../../database/queries/titres.js'
 
-import titreEtapeUpdateTask from '../../../business/titre-etape-update.js'
+import { titreEtapeUpdateTask } from '../../../business/titre-etape-update.js'
 import { titreEtapeHeritageBuild } from './_titre-etape.js'
 import { titreEtapeUpdationValidate } from '../../../business/validations/titre-etape-updation-validate.js'
 
@@ -14,27 +14,25 @@ import { fieldsBuild } from './_fields-build.js'
 import { titreDemarcheUpdatedEtatValidate } from '../../../business/validations/titre-demarche-etat-validate.js'
 import { titreEtapeFormat } from '../../_format/titres-etapes.js'
 import { userSuper } from '../../../database/user-super.js'
-import { documentsLier } from './documents.js'
-import { contenuElementFilesCreate, contenuElementFilesDelete, contenuFilesPathGet, sectionsContenuAndFilesGet } from '../../../business/utils/contenu-element-file-process.js'
-import { documentCreate, documentsGet } from '../../../database/queries/documents.js'
 import { titreEtapeAdministrationsEmailsSend, titreEtapeUtilisateursEmailsSend } from './_titre-etape-email.js'
-import { objectClone } from '../../../tools/index.js'
-import { newDocumentId } from '../../../database/models/_format/id-create.js'
-import fileRename from '../../../tools/file-rename.js'
-import { documentFilePathFind } from '../../../tools/documents/document-path-find.js'
 import { EtapeStatutId } from 'camino-common/src/static/etapesStatuts.js'
-import { EtapeTypeId, isEtapeTypeId } from 'camino-common/src/static/etapesTypes.js'
+import { EtapeTypeId } from 'camino-common/src/static/etapesTypes.js'
 import { isNonEmptyArray, isNotNullNorUndefined, isNullOrUndefined, onlyUnique } from 'camino-common/src/typescript-tools.js'
 import { isBureauDEtudes, isEntreprise, User } from 'camino-common/src/roles.js'
 import { CaminoDate, toCaminoDate } from 'camino-common/src/date.js'
 import { titreEtapeFormatFields } from '../../_format/_fields.js'
-import { canCreateEtape, canEditDates, canEditDuree, canEditEtape, isEtapeDeposable } from 'camino-common/src/permissions/titres-etapes.js'
+import { canCreateEtape, canEditDates, canEditDuree, canEditEtape } from 'camino-common/src/permissions/titres-etapes.js'
 import { TitresStatutIds } from 'camino-common/src/static/titresStatuts.js'
-import { getSections, SectionElement } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sections.js'
-import { isDocumentTypeId } from 'camino-common/src/static/documentsTypes.js'
-import { EtapeId } from 'camino-common/src/etape.js'
+import {
+  EtapeId,
+  documentComplementaireAslEtapeDocumentModificationValidator,
+  documentComplementaireDaeEtapeDocumentModificationValidator,
+  etapeDocumentModificationValidator,
+  needAslAndDae,
+  tempEtapeDocumentValidator,
+} from 'camino-common/src/etape.js'
 import { getEntrepriseDocuments } from '../../rest/entreprises.queries.js'
-import { deleteTitreEtapeEntrepriseDocument, getEntrepriseDocumentIdsByEtapeId, insertTitreEtapeEntrepriseDocument } from '../../../database/queries/titres-etapes.queries.js'
+import { deleteTitreEtapeEntrepriseDocument, insertEtapeDocuments, insertTitreEtapeEntrepriseDocument, updateEtapeDocuments } from '../../../database/queries/titres-etapes.queries.js'
 import { EntrepriseDocument, EntrepriseId } from 'camino-common/src/entreprise.js'
 import { Pool } from 'pg'
 import { convertPoints, getGeojsonInformation } from '../../rest/perimetre.queries.js'
@@ -45,8 +43,11 @@ import { FieldsEtape } from '../../../database/queries/_options'
 import { canHaveForages } from 'camino-common/src/permissions/titres.js'
 import { GEO_SYSTEME_IDS } from 'camino-common/src/static/geoSystemes.js'
 import { TitreTypeId } from 'camino-common/src/static/titresTypes.js'
+import { getEtapeByDemarcheIdAndEtapeTypeId } from '../../rest/etapes.queries.js'
+import { DemarcheId } from 'camino-common/src/demarche.js'
+import { z } from 'zod'
 
-const statutIdAndDateGet = (etape: ITitreEtape, user: User, depose = false): { date: CaminoDate; statutId: EtapeStatutId } => {
+export const statutIdAndDateGet = (etape: ITitreEtape, user: User, depose = false): { date: CaminoDate; statutId: EtapeStatutId } => {
   const result = { date: etape.date, statutId: etape.statutId }
 
   if (depose) {
@@ -69,9 +70,6 @@ const etape = async ({ id }: { id: EtapeId }, { user }: Context, info: GraphQLRe
   try {
     const fields: FieldsEtape = fieldsBuild(info)
 
-    if (isNullOrUndefined(fields.documents)) {
-      fields.documents = { id: {} }
-    }
     if (isNullOrUndefined(fields.titulaires)) {
       fields.titulaires = { id: {} }
     }
@@ -126,7 +124,7 @@ const etape = async ({ id }: { id: EtapeId }, { user }: Context, info: GraphQLRe
   }
 }
 
-const etapeHeritage = async ({ date, titreDemarcheId, typeId }: { date: string; titreDemarcheId: string; typeId: EtapeTypeId }, { user }: Context) => {
+const etapeHeritage = async ({ date, titreDemarcheId, typeId, etapeId }: { date: CaminoDate; titreDemarcheId: DemarcheId; typeId: EtapeTypeId; etapeId: EtapeId | null }, { user }: Context) => {
   try {
     let titreDemarche = await titreDemarcheGet(titreDemarcheId, { fields: {} }, user)
 
@@ -146,7 +144,7 @@ const etapeHeritage = async ({ date, titreDemarcheId, typeId }: { date: string;
       userSuper
     )
 
-    const titreEtape = titreEtapeHeritageBuild(date, typeId, titreDemarche!, titreDemarche!.titre!.typeId, titreDemarche!.typeId)
+    const titreEtape = titreEtapeHeritageBuild(date, typeId, titreDemarche!, titreDemarche!.titre!.typeId, titreDemarche!.typeId, etapeId)
     const titreTypeId = titreDemarche?.titre?.typeId
     if (!titreTypeId) {
       throw new Error(`le type du titre de l'étape ${titreEtape.id} n'est pas chargé`)
@@ -189,7 +187,7 @@ const getForagesProperties = async (
   }
 }
 
-const etapeCreer = async ({ etape }: { etape: ITitreEtape }, context: Context, info: GraphQLResolveInfo) => {
+const etapeCreer = async ({ etape }: { etape: ITitreEtape & { etapeDocuments: unknown } }, context: Context, info: GraphQLResolveInfo) => {
   try {
     const user = context.user
     if (!user) {
@@ -223,9 +221,15 @@ const etapeCreer = async ({ etape }: { etape: ITitreEtape }, context: Context, i
     const entrepriseDocuments: EntrepriseDocument[] = await validateAndGetEntrepriseDocuments(context.pool, etape, titreDemarche.titre, user)
     delete etape.entrepriseDocumentIds
 
-    const documentIds = etape.documentIds || []
-    const documents = documentIds.length ? await documentsGet({ ids: documentIds }, { fields: { id: {} } }, userSuper) : null
-    delete etape.documentIds
+    const etapeDocumentsParsed = z.array(tempEtapeDocumentValidator).safeParse(etape.etapeDocuments)
+
+    if (!etapeDocumentsParsed.success) {
+      console.warn(etapeDocumentsParsed.error)
+      throw new Error('Les documents envoyés ne sont pas conformes')
+    }
+
+    const etapeDocuments = etapeDocumentsParsed.data
+    delete etape.etapeDocuments
 
     const sdomZones: SDOMZoneId[] = []
     if (isNotNullNorUndefined(etape.geojson4326Perimetre)) {
@@ -258,7 +262,7 @@ const etapeCreer = async ({ etape }: { etape: ITitreEtape }, context: Context, i
 
     etape = { ...etape, ...(await getForagesProperties(titreTypeId, etape.geojsonOrigineGeoSystemeId, etape.geojsonOrigineForages, context.pool)) }
 
-    const rulesErrors = titreEtapeUpdationValidate(etape, titreDemarche, titreDemarche.titre, documents, entrepriseDocuments, sdomZones, user)
+    const rulesErrors = titreEtapeUpdationValidate(etape, titreDemarche, titreDemarche.titre, etapeDocuments, entrepriseDocuments, sdomZones, user, null, null)
     if (rulesErrors.length) {
       throw new Error(rulesErrors.join(', '))
     }
@@ -271,11 +275,6 @@ const etapeCreer = async ({ etape }: { etape: ITitreEtape }, context: Context, i
       throw new Error('droits insuffisants pour créer cette étape')
     }
 
-    const sections = getSections(titreTypeId, titreDemarche.typeId, etape.typeId)
-
-    const { contenu, newFiles } = sectionsContenuAndFilesGet(etape.contenu, sections)
-    etape.contenu = contenu
-
     if (!canEditDuree(titreTypeId, titreDemarche.typeId)) {
       etape.duree = null
     }
@@ -287,14 +286,11 @@ const etapeCreer = async ({ etape }: { etape: ITitreEtape }, context: Context, i
 
     let etapeUpdated: ITitreEtape = await titreEtapeUpsert(etape, user!, titreDemarche.titreId)
 
+    await insertEtapeDocuments(context.pool, etapeUpdated.id, etapeDocuments)
     for (const document of entrepriseDocuments) {
       await insertTitreEtapeEntrepriseDocument(context.pool, { titre_etape_id: etapeUpdated.id, entreprise_document_id: document.id })
     }
 
-    await contenuElementFilesCreate(newFiles, 'demarches', etapeUpdated.id)
-
-    await documentsLier(context, documentIds, etapeUpdated.id)
-
     try {
       await titreEtapeUpdateTask(context.pool, etapeUpdated.id, etapeUpdated.titreDemarcheId, user)
     } catch (e) {
@@ -349,7 +345,7 @@ const validateAndGetEntrepriseDocuments = async (
   return entrepriseDocuments
 }
 
-const etapeModifier = async ({ etape }: { etape: ITitreEtape }, context: Context, info: GraphQLResolveInfo) => {
+const etapeModifier = async ({ etape }: { etape: ITitreEtape & { etapeDocuments: unknown; daeDocument: unknown; aslDocument: unknown } }, context: Context, info: GraphQLResolveInfo) => {
   try {
     const user = context.user
     if (!user) {
@@ -360,7 +356,6 @@ const etapeModifier = async ({ etape }: { etape: ITitreEtape }, context: Context
       etape.id,
       {
         fields: {
-          documents: { id: {} },
           titulaires: { id: {} },
           amodiataires: { id: {} },
           demarche: { titre: { pointsEtape: { id: {} } } },
@@ -413,9 +408,38 @@ const etapeModifier = async ({ etape }: { etape: ITitreEtape }, context: Context
     const entrepriseDocuments: EntrepriseDocument[] = await validateAndGetEntrepriseDocuments(context.pool, etape, titreDemarche.titre, user)
     delete etape.entrepriseDocumentIds
 
-    const documentIds = etape.documentIds || []
-    const documents = documentIds.length ? await documentsGet({ ids: documentIds }, { fields: { id: {} } }, userSuper) : null
-    delete etape.documentIds
+    const etapeDocumentsParsed = z.array(etapeDocumentModificationValidator).safeParse(etape.etapeDocuments)
+
+    if (!etapeDocumentsParsed.success) {
+      console.warn(etapeDocumentsParsed.error)
+      throw new Error('Les documents envoyés ne sont pas conformes')
+    }
+
+    const etapeDocuments = etapeDocumentsParsed.data
+    delete etape.etapeDocuments
+
+    const needToCreateAslAndDae = needAslAndDae({ etapeTypeId: etape.typeId, demarcheTypeId: titreDemarche.typeId, titreTypeId: titreDemarche.titre.typeId }, etape.statutId, user)
+    let daeDocument = null
+    let aslDocument = null
+    if (needToCreateAslAndDae) {
+      const daeDocumentParsed = documentComplementaireDaeEtapeDocumentModificationValidator.nullable().safeParse(etape.daeDocument)
+      if (!daeDocumentParsed.success) {
+        console.warn(daeDocumentParsed.error)
+        throw new Error('L’arrêté préfectoral n’est pas conforme')
+      }
+
+      daeDocument = daeDocumentParsed.data
+
+      const aslDocumentParsed = documentComplementaireAslEtapeDocumentModificationValidator.nullable().safeParse(etape.aslDocument)
+      if (!aslDocumentParsed.success) {
+        console.warn(aslDocumentParsed.error)
+        throw new Error('La lettre du propriétaire du sol n’est pas conforme')
+      }
+
+      aslDocument = aslDocumentParsed.data
+    }
+    delete etape.daeDocument
+    delete etape.aslDocument
 
     const sdomZones: SDOMZoneId[] = []
     if (isNotNullNorUndefined(etape.geojson4326Perimetre)) {
@@ -454,25 +478,12 @@ const etapeModifier = async ({ etape }: { etape: ITitreEtape }, context: Context
 
     etape = { ...etape, ...(await getForagesProperties(titreTypeId, etape.geojsonOrigineGeoSystemeId, etape.geojsonOrigineForages, context.pool)) }
 
-    const rulesErrors = titreEtapeUpdationValidate(etape, titreDemarche, titreDemarche.titre, documents, entrepriseDocuments, sdomZones, user, titreEtapeOld)
+    const rulesErrors = titreEtapeUpdationValidate(etape, titreDemarche, titreDemarche.titre, etapeDocuments, entrepriseDocuments, sdomZones, user, daeDocument, aslDocument, titreEtapeOld)
 
     if (rulesErrors.length) {
       throw new Error(rulesErrors.join(', '))
     }
 
-    await documentsLier(context, documentIds, etape.id, titreEtapeOld)
-
-    const sections = getSections(titreTypeId, titreDemarche.typeId, etape.typeId)
-
-    const { contenu, newFiles } = sectionsContenuAndFilesGet(etape.contenu, sections)
-    etape.contenu = contenu
-
-    if (titreEtapeOld.decisionsAnnexesSections) {
-      const { contenu: decisionsAnnexesContenu, newFiles: decisionsAnnexesNewFiles } = sectionsContenuAndFilesGet(etape.decisionsAnnexesContenu, titreEtapeOld.decisionsAnnexesSections)
-      etape.decisionsAnnexesContenu = decisionsAnnexesContenu as IDecisionAnnexeContenu
-      await contenuElementFilesCreate(decisionsAnnexesNewFiles, 'demarches', etape.id)
-    }
-
     if (!canEditDuree(titreTypeId, titreDemarche.typeId)) {
       etape.duree = titreEtapeOld.duree
     }
@@ -484,27 +495,51 @@ const etapeModifier = async ({ etape }: { etape: ITitreEtape }, context: Context
 
     let etapeUpdated: ITitreEtape = await titreEtapeUpsert(etape, user!, titreDemarche.titreId)
 
+    await updateEtapeDocuments(context.pool, user, etapeUpdated.id, etapeUpdated.statutId, etapeDocuments)
     await deleteTitreEtapeEntrepriseDocument(context.pool, { titre_etape_id: etapeUpdated.id })
     for (const document of entrepriseDocuments) {
       await insertTitreEtapeEntrepriseDocument(context.pool, { titre_etape_id: etapeUpdated.id, entreprise_document_id: document.id })
     }
 
-    await contenuElementFilesCreate(newFiles, 'demarches', etapeUpdated.id)
+    if (needToCreateAslAndDae) {
+      if (daeDocument !== null) {
+        const daeEtapeInDb = await getEtapeByDemarcheIdAndEtapeTypeId(context.pool, 'dae', titreDemarche.id)
+
+        const daeEtape = await titreEtapeUpsert(
+          {
+            id: daeEtapeInDb?.etape_id ?? undefined,
+            typeId: 'dae',
+            statutId: daeDocument.etape_statut_id,
+            titreDemarcheId: titreDemarche.id,
+            date: daeDocument.date,
+            contenu: {
+              mea: { arrete: daeDocument.arrete_prefectoral },
+            },
+          },
+          user!,
+          titreDemarche.titreId
+        )
+
+        await updateEtapeDocuments(context.pool, user, daeEtape.id, etape.statutId, [daeDocument])
+      }
+
+      if (aslDocument !== null) {
+        const aslEtapeInDb = await getEtapeByDemarcheIdAndEtapeTypeId(context.pool, 'asl', titreDemarche.id)
 
-    // après le recalcule de l’héritage, on recharge toutes les étapes de la démarche pour pouvoir récuperer
-    // tous les fichiers tjrs présents dans le contenu de chaque étape
-    const demarche = await titreDemarcheGet(etapeUpdated.titreDemarcheId, { fields: { etapes: { id: {} } } }, userSuper)
-    await contenuElementFilesDelete('demarches', etapeUpdated.id, sections, etape => etape.contenu, demarche!.etapes, titreEtapeOld.contenu)
+        const aslEtape = await titreEtapeUpsert(
+          {
+            id: aslEtapeInDb?.etape_id ?? undefined,
+            typeId: 'asl',
+            statutId: aslDocument.etape_statut_id,
+            titreDemarcheId: titreDemarche.id,
+            date: aslDocument.date,
+          },
+          user!,
+          titreDemarche.titreId
+        )
 
-    if (titreEtapeOld.decisionsAnnexesSections) {
-      await contenuElementFilesDelete(
-        'demarches',
-        etapeUpdated.id,
-        titreEtapeOld.decisionsAnnexesSections,
-        etape => etape.decisionsAnnexesContenu,
-        demarche!.etapes,
-        titreEtapeOld.decisionsAnnexesContenu
-      )
+        await updateEtapeDocuments(context.pool, user, aslEtape.id, etape.statutId, [aslDocument])
+      }
     }
 
     await titreEtapeUpdateTask(context.pool, etapeUpdated.id, etapeUpdated.titreDemarcheId, user)
@@ -522,155 +557,6 @@ const etapeModifier = async ({ etape }: { etape: ITitreEtape }, context: Context
   }
 }
 
-const etapeDeposer = async ({ id }: { id: EtapeId }, { user, pool }: Context) => {
-  try {
-    if (!user) {
-      throw new Error("l'étape n'existe pas")
-    }
-
-    const titreEtape = await titreEtapeGet(id, { fields: { id: {} } }, user)
-
-    if (isNullOrUndefined(titreEtape)) throw new Error("l'étape n'existe pas")
-    const titreEtapeOld = objectClone(titreEtape)
-
-    const titreDemarche = await titreDemarcheGet(
-      titreEtape.titreDemarcheId,
-      {
-        fields: {
-          titre: { pointsEtape: { id: {} }, titulaires: { id: {} } },
-        },
-      },
-      userSuper
-    )
-
-    if (!titreDemarche) throw new Error("la démarche n'existe pas")
-    if (!titreDemarche.titre) throw new Error("le titre n'est pas chargé")
-    if (titreDemarche.titre.administrationsLocales === undefined) throw new Error('les administrations locales du titre ne sont pas chargées')
-    if (titreDemarche.titre.titulaires === undefined) throw new Error('les titulaires du titre ne sont pas chargés')
-
-    const sdomZones: SDOMZoneId[] = []
-    if (isNotNullNorUndefined(titreEtape.geojson4326Perimetre)) {
-      const { sdom } = await getGeojsonInformation(pool, titreEtape.geojson4326Perimetre.geometry)
-
-      sdomZones.push(...sdom)
-    }
-
-    const entrepriseDocuments = await getEntrepriseDocumentIdsByEtapeId({ titre_etape_id: titreEtape.id }, pool, userSuper)
-    // TODO 2023-06-14 TS 5.1 n’arrive pas réduire le type de titreDemarche.titre
-    const deposable = isEtapeDeposable(
-      user,
-      { ...titreDemarche.titre, titulaires: titreDemarche.titre.titulaires ?? [], administrationsLocales: titreDemarche.titre.administrationsLocales ?? [] },
-      titreDemarche.typeId,
-      titreEtape,
-      titreEtape.documents,
-      entrepriseDocuments,
-      sdomZones
-    )
-    if (!deposable) throw new Error('droits insuffisants')
-
-    const statutIdAndDate = statutIdAndDateGet(titreEtape, user, true)
-
-    let decisionsAnnexesContenu: IDecisionAnnexeContenu | null = null
-    if (titreEtape.decisionsAnnexesSections && titreEtape.decisionsAnnexesContenu) {
-      decisionsAnnexesContenu = titreEtape.decisionsAnnexesContenu
-    }
-
-    await titreEtapeUpdate(
-      titreEtape.id,
-      {
-        ...statutIdAndDate,
-        decisionsAnnexesSections: null,
-        decisionsAnnexesContenu: null,
-      },
-      user,
-      titreDemarche.titreId
-    )
-    const etapeUpdated = await titreEtapeGet(
-      titreEtape.id,
-      {
-        fields: { id: {} },
-      },
-      user
-    )
-
-    // Si il y a des décisions annexes, il faut générer une étape par décision
-    if (decisionsAnnexesContenu) {
-      for (const etapeTypeId of Object.keys(decisionsAnnexesContenu!)) {
-        if (!isEtapeTypeId(etapeTypeId)) {
-          throw new Error(`l'étapeTypeId ${etapeTypeId} n'existe pas`)
-        }
-        const decisionAnnexesElements =
-          titreEtape.decisionsAnnexesSections
-            ?.filter(({ id }) => id === etapeTypeId)
-            .flatMap(({ elements }) => elements)
-            ?.filter(isNotNullNorUndefined) ?? []
-
-        const decisionContenu = decisionsAnnexesContenu![etapeTypeId]
-        let etapeDecisionAnnexe: Partial<ITitreEtape> = {
-          typeId: etapeTypeId,
-          titreDemarcheId: titreDemarche.id,
-          date: toCaminoDate(decisionContenu.date),
-          statutId: decisionContenu.statutId,
-        }
-
-        const contenu =
-          decisionAnnexesElements.filter((element): element is Required<SectionElement & { sectionId: string }> => element.type !== 'file' && isNotNullNorUndefined(element.sectionId)) ?? []
-
-        if (isNotNullNorUndefined(contenu)) {
-          etapeDecisionAnnexe.contenu = contenu.reduce<IContenu>((acc, e) => {
-            if (isNullOrUndefined(acc[e.sectionId])) {
-              acc[e.sectionId] = {}
-            }
-            acc[e.sectionId][e.id] = decisionContenu[e.id]
-
-            return acc
-          }, {})
-        }
-
-        etapeDecisionAnnexe = await titreEtapeCreate(etapeDecisionAnnexe as ITitreEtape, userSuper, titreDemarche.titreId)
-
-        const documentTypeIds = decisionAnnexesElements.filter(({ type }) => type === 'file').map(({ id }) => id) ?? []
-        for (const documentTypeId of documentTypeIds) {
-          const fileName = decisionContenu[documentTypeId]
-
-          if (isDocumentTypeId(documentTypeId)) {
-            const id = newDocumentId(decisionContenu.date, documentTypeId)
-            const document: IDocument = {
-              id,
-              typeId: documentTypeId,
-              date: decisionContenu.date,
-              fichier: true,
-              entreprisesLecture: true,
-              titreEtapeId: etapeDecisionAnnexe.id,
-              fichierTypeId: 'pdf',
-            }
-
-            const filePath = `${contenuFilesPathGet('demarches', titreEtape.id)}/${fileName}`
-
-            const newDocumentPath = documentFilePathFind(document, true)
-
-            await fileRename(filePath, newDocumentPath)
-
-            await documentCreate(document)
-          }
-        }
-      }
-    }
-
-    await titreEtapeUpdateTask(pool, etapeUpdated.id, etapeUpdated.titreDemarcheId, user)
-
-    await titreEtapeAdministrationsEmailsSend(etapeUpdated, titreDemarche.typeId, titreDemarche.titreId, titreDemarche.titre!.typeId, user!, titreEtapeOld)
-
-    const titreUpdated = await titreGet(titreDemarche.titreId, { fields: { id: {} } }, user)
-
-    return { slug: titreUpdated?.slug }
-  } catch (e) {
-    console.error(e)
-
-    throw e
-  }
-}
-
 const etapeSupprimer = async ({ id }: { id: EtapeId }, { user, pool }: Context) => {
   try {
     if (!user) {
@@ -740,4 +626,4 @@ const etapeSupprimer = async ({ id }: { id: EtapeId }, { user, pool }: Context)
   }
 }
 
-export { etape, etapeHeritage, etapeCreer, etapeModifier, etapeSupprimer, etapeDeposer }
+export { etape, etapeHeritage, etapeCreer, etapeModifier, etapeSupprimer }
diff --git a/packages/api/src/api/graphql/schemas/documents.graphql b/packages/api/src/api/graphql/schemas/documents.graphql
deleted file mode 100644
index b286934906ac3adf839e1b2b3055f5e5ddbb38a4..0000000000000000000000000000000000000000
--- a/packages/api/src/api/graphql/schemas/documents.graphql
+++ /dev/null
@@ -1,80 +0,0 @@
-# import * from 'entreprises.graphql'
-# import * from 'metas.graphql'
-# import * from 'titres-etapes.graphql'
-# import * from 'scalars.graphql'
-
-"Document attaché à une étape de démarche"
-type Document {
-  """
-  __Id__ composée de la concaténation:
-  - de l'id de l'étape
-  - du type du document
-  """
-  id: ID!
-
-  typeId: String!
-
-  "Date du document"
-  date: String!
-
-  "Description du document"
-  description: String
-
-  "Fichier enregistré sur le serveur"
-  fichier: Boolean
-
-  "Extension du fichier"
-  fichierTypeId: ID
-
-  titreEtapeId: String
-
-  publicLecture: Boolean
-  entreprisesLecture: Boolean
-  suppression: Boolean
-}
-
-input InputDocumentCreation {
-  typeId: ID!
-  date: String!
-  titreEtapeId: ID
-  titreActiviteId: ID
-  description: String
-  fichier: Boolean
-  fichierTypeId: ID
-  fichierNouveau: FileUpload
-  nomTemporaire: String
-  publicLecture: Boolean
-  entreprisesLecture: Boolean
-}
-
-input InputDocumentModification {
-  id: ID!
-  date: String!
-  titreActiviteId: ID
-  titreEtapeId: ID
-  description: String
-  fichier: Boolean
-  fichierTypeId: ID
-  fichierNouveau: FileUpload
-  nomTemporaire: String
-  url: String
-  uri: String
-  jorf: String
-  nor: String
-  publicLecture: Boolean
-  entreprisesLecture: Boolean
-}
-
-input InputDocument {
-  id: ID
-  typeId: ID!
-  date: String!
-  titreActiviteId: ID
-  titreEtapeId: ID
-  description: String
-  fichier: Boolean
-  fichierTypeId: ID
-  fichierNouveau: FileUpload
-  publicLecture: Boolean
-  entreprisesLecture: Boolean
-}
diff --git a/packages/api/src/api/graphql/schemas/entreprises.graphql b/packages/api/src/api/graphql/schemas/entreprises.graphql
index 8bee3dbd0efe3a2ef763468e3d2308c62cb2d8e4..72576ffc365d05a881f72a4569555bd974bcdcd8 100644
--- a/packages/api/src/api/graphql/schemas/entreprises.graphql
+++ b/packages/api/src/api/graphql/schemas/entreprises.graphql
@@ -1,6 +1,5 @@
 # import * from 'utilisateurs.graphql'
 # import * from 'titres.graphql'
-# import * from 'documents.graphql'
 # import * from 'metas.graphql'
 
 type Entreprise {
diff --git a/packages/api/src/api/graphql/schemas/index.graphql b/packages/api/src/api/graphql/schemas/index.graphql
index cc14b7180e58d9825075912ae87672fbca7e0a2c..dbe041a47b3d293081263bcbfcd42d79847a5ee7 100644
--- a/packages/api/src/api/graphql/schemas/index.graphql
+++ b/packages/api/src/api/graphql/schemas/index.graphql
@@ -1,6 +1,5 @@
 # import * from 'scalars.graphql'
 # import * from 'administrations.graphql'
-# import * from 'documents.graphql'
 # import * from 'entreprises.graphql'
 # import * from 'geojsons.graphql'
 # import * from 'metas-activites.graphql'
@@ -79,13 +78,10 @@ type Query {
     travaux: Boolean
   ): Demarches
 
-  "Démarche en fonction de son id"
-  demarche(id: ID!): Demarche
-
   "Étape d’une démarche en fonction de son id"
   etape(id: ID!): Etape
 
-  etapeHeritage(date: String!, titreDemarcheId: ID!, typeId: ID!): EtapeHeritage
+  etapeHeritage(date: String!, titreDemarcheId: ID!, typeId: ID!, etapeId: ID): EtapeHeritage
 
   "Liste des activités"
   activites(
@@ -152,9 +148,6 @@ type Query {
   "Statistiques"
   statistiquesGlobales: StatistiquesGlobales
 
-  "Définitions et descriptions"
-  definitions: [Definition]
-
   pays: [Pays]
 
   journaux(page: Int!, recherche: String, titresIds: [String]): Journaux
@@ -193,18 +186,6 @@ type Mutation {
   "Supprime une étape et met à jour le titre minier"
   etapeSupprimer(id: ID!): TitreSlug
 
-  "Dépose une demande et met à jour le titre minier"
-  etapeDeposer(id: ID!): TitreSlug
-
-  "Crée un document et met à jour le titre minier"
-  documentCreer(document: InputDocumentCreation!): Document
-
-  "Modifie un document et met à jour le titre minier"
-  documentModifier(document: InputDocumentModification!): Document
-
-  "Supprime un document et met à jour le titre minier"
-  documentSupprimer(id: ID!): Boolean
-
   "Dépose une activité"
   activiteDeposer(id: ID!): Activite
 }
diff --git a/packages/api/src/api/graphql/schemas/metas.graphql b/packages/api/src/api/graphql/schemas/metas.graphql
index 0c057ea098f660a41f0f1097ab976ccbfd185f6d..c5411166ec120122ab69447470787f28273c08f8 100644
--- a/packages/api/src/api/graphql/schemas/metas.graphql
+++ b/packages/api/src/api/graphql/schemas/metas.graphql
@@ -200,23 +200,6 @@ type DocumentType {
   description: String
 }
 
-type DocumentVisibilite {
-  id: ID!
-
-  nom: String!
-}
-
-"Définitions et descriptions"
-type Definition {
-  id: ID!
-  nom: String!
-  slug: String!
-  description: String
-  couleur: Couleur
-  ordre: Int
-  elements: [Definition]
-}
-
 type TitreTypeTitreStatut {
   titreTypeId: ID!
   titreStatutId: ID!
diff --git a/packages/api/src/api/graphql/schemas/titres-etapes.graphql b/packages/api/src/api/graphql/schemas/titres-etapes.graphql
index e35e1a00195c76800fc7b0a3f5c1363f6cfe6a5b..b7d6b0d51fdf33e829011bef1803cc1f1f2eccc4 100644
--- a/packages/api/src/api/graphql/schemas/titres-etapes.graphql
+++ b/packages/api/src/api/graphql/schemas/titres-etapes.graphql
@@ -4,7 +4,6 @@
 # import * from 'geojsons.graphql'
 # import * from 'metas.graphql'
 # import * from 'territoires.graphql'
-# import * from 'documents.graphql'
 # import * from 'titres-demarches.graphql'
 
 "Étape d'une démarche effectuée sur un titre minier"
@@ -66,20 +65,12 @@ type Etape {
   "Zones du SDOM"
   sdomZones: [String]
 
-  "Documents relatifs à l'étape"
-  documents: [Document]
-
   heritageProps: HeritageProps
 
   heritageContenu: Json
 
   contenu: Json
 
-  "Les sections des décisions annexes nécessaires à la demande"
-  decisionsAnnexesSections: Json
-  "Le contenu des décisions annexes nécessaires à la demande"
-  decisionsAnnexesContenu: Json
-
   notes: String
 
   "Périmètre géographique du titre"
@@ -176,11 +167,42 @@ input InputEtapeCreation {
   heritageProps: InputHeritageProps
   heritageContenu: Json
   contenu: Json
-  documentIds: [ID]
+  etapeDocuments: [InputEtapeDocumentCreation]
   entrepriseDocumentIds: [ID]
   notes: String
 }
 
+input DaeDocument {
+  id: String
+  temp_document_name: String
+  etape_document_type_id: String!
+  description: String
+  public_lecture: Boolean!
+  entreprises_lecture: Boolean!
+  etape_statut_id: String!
+  date: String!
+  arrete_prefectoral: String
+}
+
+input AslDocument {
+  id: String
+  temp_document_name: String
+  etape_document_type_id: String!
+  description: String
+  public_lecture: Boolean!
+  entreprises_lecture: Boolean!
+  etape_statut_id: String!
+  date: String!
+}
+
+input InputEtapeDocumentCreation {
+  temp_document_name: String!
+  etape_document_type_id: String!
+  description: String
+  public_lecture: Boolean!
+  entreprises_lecture: Boolean!
+}
+
 input InputEtapeModification {
   id: ID!
   typeId: ID!
@@ -197,9 +219,8 @@ input InputEtapeModification {
   heritageProps: InputHeritageProps
   heritageContenu: Json
   contenu: Json
-  documentIds: [ID]
+  etapeDocuments: [InputEtapeDocumentModification]
   entrepriseDocumentIds: [ID]
-  decisionsAnnexesContenu: Json
   notes: String
   geojson4326Perimetre: Json
   geojson4326Points: Json
@@ -207,6 +228,17 @@ input InputEtapeModification {
   geojsonOriginePerimetre: Json
   geojsonOrigineForages: Json
   geojsonOrigineGeoSystemeId: String
+  daeDocument: DaeDocument
+  aslDocument: AslDocument
+}
+
+input InputEtapeDocumentModification {
+  id: ID
+  temp_document_name: String
+  etape_document_type_id: String!
+  description: String
+  public_lecture: Boolean!
+  entreprises_lecture: Boolean!
 }
 
 input InputEtapeFiltre {
diff --git a/packages/api/src/api/graphql/titres-etapes-creer.test.integration.ts b/packages/api/src/api/graphql/titres-etapes-creer.test.integration.ts
index 4fc76dc9dd22f37643e6e8990a5427eb727b38e4..8dfd27b00d3716ec1b4210d82828a247767a5f8e 100644
--- a/packages/api/src/api/graphql/titres-etapes-creer.test.integration.ts
+++ b/packages/api/src/api/graphql/titres-etapes-creer.test.integration.ts
@@ -3,29 +3,20 @@ import { graphQLCall, queryImport } from '../../../tests/_utils/index.js'
 import { titreDemarcheCreate } from '../../database/queries/titres-demarches.js'
 import { titreCreate } from '../../database/queries/titres.js'
 import Titres from '../../database/models/titres.js'
-import { documentCreate } from '../../database/queries/documents.js'
 import { ADMINISTRATION_IDS } from 'camino-common/src/static/administrations.js'
 import { isAdministrationRole, Role } from 'camino-common/src/roles.js'
 import { userSuper } from '../../database/user-super'
 
 import { afterAll, beforeEach, beforeAll, describe, test, expect, vi } from 'vitest'
-import { toCaminoDate } from 'camino-common/src/date.js'
 import type { Pool } from 'pg'
-import { newDocumentId } from '../../database/models/_format/id-create.js'
 import { ETAPE_HERITAGE_PROPS } from 'camino-common/src/heritage.js'
+import { testDocumentCreateTemp } from '../../../tests/_utils/administrations-permissions.js'
 
 vi.mock('../../tools/dir-create', () => ({
   __esModule: true,
   default: vi.fn(),
 }))
-vi.mock('../../tools/file-stream-create', () => ({
-  __esModule: true,
-  default: vi.fn(),
-}))
-vi.mock('../../tools/file-delete', () => ({
-  __esModule: true,
-  default: vi.fn(),
-}))
+
 console.info = vi.fn()
 console.error = vi.fn()
 let dbPool: Pool
@@ -94,6 +85,7 @@ describe('etapeCreer', () => {
           statutId: 'fai',
           titreDemarcheId,
           date: '2018-01-01',
+          etapeDocuments: [],
         },
       },
       {
@@ -116,6 +108,7 @@ describe('etapeCreer', () => {
           statutId: 'fav',
           titreDemarcheId,
           date: '2018-01-01',
+          etapeDocuments: [],
         },
       },
       {
@@ -139,6 +132,7 @@ describe('etapeCreer', () => {
           statutId: 'fai',
           titreDemarcheId,
           date: '2018-01-01',
+          etapeDocuments: [],
         },
       },
       userSuper
@@ -158,6 +152,7 @@ describe('etapeCreer', () => {
           statutId: 'fai',
           titreDemarcheId,
           date: '2018-01-01',
+          etapeDocuments: [],
         },
       },
       {
@@ -187,6 +182,7 @@ describe('etapeCreer', () => {
           contenu: {
             deal: { motifs: 'motif', agent: 'agent' },
           },
+          etapeDocuments: [],
         },
       },
       {
@@ -200,34 +196,11 @@ describe('etapeCreer', () => {
 
   test('ne peut pas créer une étape mfr avec un statut fai avec un champ obligatoire manquant (utilisateur super)', async () => {
     const titreDemarcheId = await demarcheCreate()
-    const idDom = newDocumentId(toCaminoDate('2020-01-01'), 'dom')
-    const idFor = newDocumentId(toCaminoDate('2020-01-01'), 'for')
-    const idJpa = newDocumentId(toCaminoDate('2020-01-01'), 'jpa')
-    const idCar = newDocumentId(toCaminoDate('2020-01-01'), 'car')
-    await documentCreate({
-      id: idDom,
-      typeId: 'dom',
-      date: toCaminoDate('2020-01-01'),
-      fichier: true,
-    })
-    await documentCreate({
-      id: idFor,
-      typeId: 'for',
-      date: toCaminoDate('2020-01-01'),
-      fichier: true,
-    })
-    await documentCreate({
-      id: idJpa,
-      typeId: 'jpa',
-      date: toCaminoDate('2020-01-01'),
-      fichier: true,
-    })
-    await documentCreate({
-      id: idCar,
-      typeId: 'car',
-      date: toCaminoDate('2020-01-01'),
-      fichier: true,
-    })
+    const dom = testDocumentCreateTemp('dom')
+    const forDoc = testDocumentCreateTemp('for')
+    const jpa = testDocumentCreateTemp('jpa')
+    const car = testDocumentCreateTemp('car')
+
     const res = await graphQLCall(
       dbPool,
       etapeCreerQuery,
@@ -255,7 +228,7 @@ describe('etapeCreer', () => {
             },
           },
           substances: ['auru'],
-          documentIds: [idDom, idFor, idJpa, idCar],
+          etapeDocuments: [dom, forDoc, jpa, car],
           geojson4326Perimetre: {
             type: 'Feature',
             properties: {},
@@ -308,6 +281,7 @@ describe('etapeCreer', () => {
               franchissements: { actif: true },
             },
           },
+          etapeDocuments: [],
         },
       },
       userSuper
diff --git a/packages/api/src/api/graphql/titres-etapes-modifier.test.integration.ts b/packages/api/src/api/graphql/titres-etapes-modifier.test.integration.ts
index 6356a92cc43136c2ea31a810655d455da34d0d11..87ebc6bdcc6911e5e8315af1928181a746dec286 100644
--- a/packages/api/src/api/graphql/titres-etapes-modifier.test.integration.ts
+++ b/packages/api/src/api/graphql/titres-etapes-modifier.test.integration.ts
@@ -1,5 +1,5 @@
 import { dbManager } from '../../../tests/db-manager.js'
-import { graphQLCall, queryImport } from '../../../tests/_utils/index.js'
+import { graphQLCall, queryImport, restCall } from '../../../tests/_utils/index.js'
 import { titreDemarcheCreate } from '../../database/queries/titres-demarches.js'
 import { titreCreate } from '../../database/queries/titres.js'
 import { titreEtapeCreate } from '../../database/queries/titres-etapes.js'
@@ -14,31 +14,31 @@ import type { Pool } from 'pg'
 import { ETAPE_HERITAGE_PROPS } from 'camino-common/src/heritage.js'
 import { EtapeTypeId } from 'camino-common/src/static/etapesTypes.js'
 import { isNotNullNorUndefined } from 'camino-common/src/typescript-tools.js'
+import { idGenerate } from '../../database/models/_format/id-create.js'
+import { copyFileSync, mkdirSync } from 'fs'
+import { TempEtapeDocument } from 'camino-common/src/etape.js'
+import { tempDocumentNameValidator } from 'camino-common/src/document.js'
+import { HTTP_STATUS } from 'camino-common/src/http.js'
+import { Knex } from 'knex'
+import { testDocumentCreateTemp } from '../../../tests/_utils/administrations-permissions.js'
 
 vi.mock('../../tools/dir-create', () => ({
   __esModule: true,
   default: vi.fn(),
 }))
 
-vi.mock('../../tools/file-stream-create', () => ({
-  __esModule: true,
-  default: vi.fn(),
-}))
-
-vi.mock('../../tools/file-delete', () => ({
-  __esModule: true,
-  default: vi.fn(),
-}))
-
 console.info = vi.fn()
 console.error = vi.fn()
 let dbPool: Pool
+let knexInstance: Knex
 beforeAll(async () => {
-  const { pool } = await dbManager.populateDb()
+  const { pool, knex } = await dbManager.populateDb()
   dbPool = pool
+  knexInstance = knex
 })
 
 beforeEach(async () => {
+  await knexInstance.raw('delete from etapes_documents')
   await Titres.query().delete()
 })
 
@@ -148,6 +148,7 @@ describe('etapeModifier', () => {
           contenu: {
             arm: { mecanise: true, franchissements: 3 },
           },
+          etapeDocuments: [],
         },
       },
       userSuper
@@ -156,6 +157,114 @@ describe('etapeModifier', () => {
     expect(res.body.errors).toBe(undefined)
   })
 
+  test("peut supprimer un document d'une demande en construction (utilisateur super)", async () => {
+    const { titreDemarcheId, titreEtapeId } = await etapeCreate()
+
+    const documentToInsert = testDocumentCreateTemp('aac')
+
+    const etape = {
+      id: titreEtapeId,
+      typeId: 'mfr',
+      statutId: 'aco',
+      titreDemarcheId,
+      date: '2018-01-01',
+      heritageProps: ETAPE_HERITAGE_PROPS.reduce(
+        (acc, prop) => {
+          acc[prop] = { actif: false }
+
+          return acc
+        },
+        {} as {
+          [key: string]: { actif: boolean }
+        }
+      ),
+      heritageContenu: {
+        arm: {
+          mecanise: { actif: false },
+          franchissements: { actif: false },
+        },
+      },
+      contenu: {
+        arm: { mecanise: true, franchissements: 3 },
+      },
+      etapeDocuments: [documentToInsert],
+    }
+
+    let res = await graphQLCall(dbPool, etapeModifierQuery, { etape }, userSuper)
+
+    expect(res.body.errors).toBe(undefined)
+
+    const documents = await restCall(dbPool, '/rest/etapes/:etapeId/etapeDocuments', { etapeId: titreEtapeId }, userSuper)
+    expect(documents.statusCode).toBe(HTTP_STATUS.HTTP_STATUS_OK)
+    expect(documents.body.etapeDocuments).toHaveLength(1)
+    expect(documents.body.etapeDocuments[0]).toMatchInlineSnapshot(
+      { id: expect.any(String) },
+      `
+      {
+        "description": "desc",
+        "entreprises_lecture": true,
+        "etape_document_type_id": "aac",
+        "id": Any<String>,
+        "public_lecture": true,
+      }
+    `
+    )
+    res = await graphQLCall(dbPool, etapeModifierQuery, { etape: { ...etape, etapeDocuments: [] } }, userSuper)
+
+    expect(res.body.errors).toBe(undefined)
+  })
+
+  test("ne peut pas supprimer un document obligatoire d'une étape qui n'est pas en construction (utilisateur super)", async () => {
+    const { titreDemarcheId, titreEtapeId } = await etapeCreate('dae')
+    const dir = `${process.cwd()}/files/tmp/`
+
+    const fileName = `existing_temp_file_${idGenerate()}`
+    mkdirSync(dir, { recursive: true })
+    copyFileSync(`./src/tools/small.pdf`, `${dir}/${fileName}`)
+    const documentToInsert: TempEtapeDocument = {
+      etape_document_type_id: 'aac',
+      entreprises_lecture: true,
+      public_lecture: true,
+      description: 'desc',
+      temp_document_name: tempDocumentNameValidator.parse(fileName),
+    }
+
+    const etape = {
+      id: titreEtapeId,
+      typeId: 'dae',
+      statutId: 'exe',
+      titreDemarcheId,
+      date: '2018-01-01',
+      heritageProps: ETAPE_HERITAGE_PROPS.reduce(
+        (acc, prop) => {
+          acc[prop] = { actif: false }
+
+          return acc
+        },
+        {} as {
+          [key: string]: { actif: boolean }
+        }
+      ),
+      heritageContenu: {
+        mea: {
+          arrete: { actif: false },
+        },
+      },
+      contenu: {
+        mea: { arrete: 'arrete' },
+      },
+      etapeDocuments: [documentToInsert],
+    }
+
+    let res = await graphQLCall(dbPool, etapeModifierQuery, { etape }, userSuper)
+
+    expect(res.body.errors).toBe(undefined)
+
+    res = await graphQLCall(dbPool, etapeModifierQuery, { etape: { ...etape, etapeDocuments: [] } }, userSuper)
+
+    expect(res.body.errors[0].message).toBe('Impossible de supprimer les documents')
+  })
+
   test('peut modifier une étape mia avec un statut fai (utilisateur super)', async () => {
     const { titreDemarcheId, titreEtapeId } = await etapeCreate('mia')
 
@@ -169,6 +278,7 @@ describe('etapeModifier', () => {
           statutId: 'fai',
           titreDemarcheId,
           date: '2018-01-01',
+          etapeDocuments: [],
         },
       },
       userSuper
@@ -213,6 +323,7 @@ describe('etapeModifier', () => {
           statutId: 'fai',
           titreDemarcheId,
           date: '2016-01-01',
+          etapeDocuments: [],
         },
       },
       {
diff --git a/packages/api/src/api/rest/activites.queries.ts b/packages/api/src/api/rest/activites.queries.ts
index d9a980b0fedb97e8b44f2e229c3a4745c0b2b447..6280abd271d17482352c692796877008e0150e12 100644
--- a/packages/api/src/api/rest/activites.queries.ts
+++ b/packages/api/src/api/rest/activites.queries.ts
@@ -38,12 +38,6 @@ import { SimplePromiseFn } from 'camino-common/src/typescript-tools.js'
 import { ActiviteDocumentTypeId } from 'camino-common/src/static/documentsTypes.js'
 import { sectionValidator } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sections.js'
 
-export const entreprisesTitulairesOuAmoditairesByActiviteId = async (activiteId: ActiviteIdOrSlug, pool: Pool) => {
-  const entreprises = await dbQueryAndValidate(getTitulairesAmodiatairesTitreActivite, { activiteId }, pool, entrepriseIdObjectValidator)
-
-  return entreprises.map(({ id }) => id)
-}
-
 export const titreTypeIdByActiviteId = async (activiteId: ActiviteIdOrSlug, pool: Pool) => {
   const typeIds = await dbQueryAndValidate(getTitreTypeIdByActiviteId, { activiteId }, pool, titreTypeIdObjectValidator)
   if (typeIds.length === 0) {
@@ -167,6 +161,17 @@ delete from activites_documents
 where activite_id = $ activiteId !
 `
 
+export const getActiviteDocumentsByActiviteId = async (activiteId: ActiviteId, pool: Pool): Promise<ActiviteDocument[]> => {
+  return dbQueryAndValidate(
+    getActiviteDocumentsInternal,
+    {
+      activiteId,
+    },
+    pool,
+    activiteDocumentValidator
+  )
+}
+
 export const administrationsLocalesByActiviteId = async (activiteId: ActiviteIdOrSlug, pool: Pool) => {
   const admins = await dbQueryAndValidate(getAdministrationsLocalesByActiviteId, { activiteId }, pool, administrationsLocalesValidator)
   if (admins.length > 1) {
@@ -179,17 +184,6 @@ export const administrationsLocalesByActiviteId = async (activiteId: ActiviteIdO
   return admins[0].administrations_locales
 }
 
-export const getActiviteDocumentsByActiviteId = async (activiteId: ActiviteId, pool: Pool): Promise<ActiviteDocument[]> => {
-  return dbQueryAndValidate(
-    getActiviteDocumentsInternal,
-    {
-      activiteId,
-    },
-    pool,
-    activiteDocumentValidator
-  )
-}
-
 const administrationsLocalesValidator = z.object({ administrations_locales: z.array(administrationIdValidator) })
 const getAdministrationsLocalesByActiviteId = sql<Redefine<IGetAdministrationsLocalesByActiviteIdQuery, { activiteId: ActiviteIdOrSlug }, z.infer<typeof administrationsLocalesValidator>>>`
 select
@@ -215,6 +209,12 @@ where
     or ta.slug = $ activiteId !
 `
 
+export const entreprisesTitulairesOuAmoditairesByActiviteId = async (activiteId: ActiviteIdOrSlug, pool: Pool) => {
+  const entreprises = await dbQueryAndValidate(getTitulairesAmodiatairesTitreActivite, { activiteId }, pool, entrepriseIdObjectValidator)
+
+  return entreprises.map(({ id }) => id)
+}
+
 const entrepriseIdObjectValidator = z.object({ id: entrepriseIdValidator })
 const getTitulairesAmodiatairesTitreActivite = sql<Redefine<IGetTitulairesAmodiatairesTitreActiviteQuery, { activiteId: ActiviteIdOrSlug }, z.infer<typeof entrepriseIdObjectValidator>>>`
 select distinct
diff --git a/packages/api/src/api/rest/activites.ts b/packages/api/src/api/rest/activites.ts
index 8cf251f9110d14ab7862c677cdcc2a8a61e05b64..e2a37e50442c41d80a3d555221d92137711a99f0 100644
--- a/packages/api/src/api/rest/activites.ts
+++ b/packages/api/src/api/rest/activites.ts
@@ -21,7 +21,6 @@ import { DeepReadonly, SimplePromiseFn, isNonEmptyArray, isNullOrUndefined, memo
 import { canEditActivite, isActiviteDeposable } from 'camino-common/src/permissions/activites.js'
 import { SectionWithValue } from 'camino-common/src/sections.js'
 import { Section, getSectionsWithValue } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sections.js'
-import { createLargeObject } from './entreprises.js'
 import { newActiviteDocumentId } from '../../database/models/_format/id-create.js'
 import { ACTIVITES_STATUTS_IDS } from 'camino-common/src/static/activitesStatuts.js'
 import { Unites } from 'camino-common/src/static/unites.js'
@@ -30,6 +29,7 @@ import { TitreTypeId } from 'camino-common/src/static/titresTypes.js'
 import { AdministrationId } from 'camino-common/src/static/administrations.js'
 import { EntrepriseId } from 'camino-common/src/entreprise.js'
 import { getCurrent } from 'camino-common/src/date.js'
+import { createLargeObject } from '../../database/largeobjects.js'
 
 const extractContenuFromSectionWithValue = (sections: DeepReadonly<Section[]>, sectionsWithValue: SectionWithValue[]): Contenu => {
   const contenu: Contenu = {}
diff --git a/packages/api/src/api/rest/demarches.queries.ts b/packages/api/src/api/rest/demarches.queries.ts
index 9195446b9b2b84984145c77abbd95b789ee74244..6ef598f1d4db674307a2023d212a46e518ea4bf1 100644
--- a/packages/api/src/api/rest/demarches.queries.ts
+++ b/packages/api/src/api/rest/demarches.queries.ts
@@ -1,6 +1,6 @@
 /* eslint-disable no-restricted-syntax */
 import { sql } from '@pgtyped/runtime'
-import { DemarcheId, DemarcheIdOrSlug, demarcheIdValidator, demarcheSlugValidator } from 'camino-common/src/demarche.js'
+import { DemarcheId, DemarcheIdOrSlug } from 'camino-common/src/demarche.js'
 import { Redefine, dbQueryAndValidate } from '../../pg-database.js'
 import { IGetDemarcheByIdOrSlugDbQuery, IGetEtapesByDemarcheIdDbQuery } from './demarches.queries.types.js'
 import { z } from 'zod'
@@ -12,14 +12,12 @@ import { etapeTypeIdValidator } from 'camino-common/src/static/etapesTypes.js'
 import { etapeIdValidator, etapeSlugValidator } from 'camino-common/src/etape.js'
 import { etapeStatutIdValidator } from 'camino-common/src/static/etapesStatuts.js'
 import { contenuValidator } from './activites.queries.js'
-import { sectionValidator } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sections.js'
 import { sdomZoneIdValidator } from 'camino-common/src/static/sdom.js'
 import { foretIdValidator } from 'camino-common/src/static/forets.js'
 import { Pool } from 'pg'
 import { featureCollectionForagesValidator, featureCollectionPointsValidator, featureMultiPolygonValidator, multiPolygonValidator } from 'camino-common/src/perimetre.js'
 import { etapeHeritagePropsValidator } from 'camino-common/src/heritage.js'
-import { titreIdValidator } from 'camino-common/src/validators/titres.js'
-import { demarcheTypeIdValidator } from 'camino-common/src/static/demarchesTypes.js'
+import { getDemarcheByIdOrSlugValidator as commonGetDemarcheByIdOrSlugValidator } from 'camino-common/src/titres.js'
 import { geoSystemeIdValidator } from 'camino-common/src/static/geoSystemes.js'
 
 const getEtapesByDemarcheIdDbValidator = z.object({
@@ -42,8 +40,6 @@ const getEtapesByDemarcheIdDbValidator = z.object({
   contenu: contenuValidator.nullable(),
   sdom_zones: z.array(sdomZoneIdValidator).nullable(),
   forets: z.array(foretIdValidator).nullable(),
-  decisions_annexes_contenu: contenuValidator.nullable(),
-  decisions_annexes_sections: z.array(sectionValidator).nullable(),
   geojson4326_perimetre: multiPolygonValidator.nullable(),
   geojson4326_points: featureCollectionPointsValidator.nullable(),
   geojson_origine_points: featureCollectionPointsValidator.nullable(),
@@ -78,8 +74,6 @@ select
     e.slug,
     e.sdom_zones,
     e.forets,
-    e.decisions_annexes_contenu,
-    e.decisions_annexes_sections,
     ST_AsGeoJSON (e.geojson4326_perimetre, 40)::json as geojson4326_perimetre,
     e.geojson4326_points as geojson4326_points,
     e.geojson_origine_points,
@@ -96,11 +90,7 @@ order by
     date desc
 `
 
-const getDemarcheByIdOrSlugValidator = z.object({
-  demarche_id: demarcheIdValidator,
-  demarche_slug: demarcheSlugValidator,
-  demarche_type_id: demarcheTypeIdValidator,
-  titre_id: titreIdValidator,
+const getDemarcheByIdOrSlugValidator = commonGetDemarcheByIdOrSlugValidator.extend({
   entreprises_lecture: z.boolean(),
   public_lecture: z.boolean(),
 })
@@ -113,15 +103,20 @@ export const getDemarcheByIdOrSlug = async (pool: Pool, idOrSlug: DemarcheIdOrSl
 
 const getDemarcheByIdOrSlugDb = sql<Redefine<IGetDemarcheByIdOrSlugDbQuery, { idOrSlug: DemarcheIdOrSlug }, GetDemarcheByIdOrSlugValidator>>`
 select
-    id as demarche_id,
-    slug as demarche_slug,
-    type_id as demarche_type_id,
-    entreprises_lecture,
-    public_lecture,
-    titre_id
+    td.id as demarche_id,
+    td.slug as demarche_slug,
+    td.type_id as demarche_type_id,
+    td.description as demarche_description,
+    td.entreprises_lecture,
+    td.public_lecture,
+    t.id as titre_id,
+    t.slug as titre_slug,
+    t.type_id as titre_type_id,
+    t.nom as titre_nom
 from
-    titres_demarches
-where (id = $ idOrSlug !
-    or slug = $ idOrSlug !)
-and archive is false
+    titres_demarches td
+    join titres t on t.id = td.titre_id
+where (td.id = $ idOrSlug !
+    or td.slug = $ idOrSlug !)
+and td.archive is false
 `
diff --git a/packages/api/src/api/rest/demarches.queries.types.ts b/packages/api/src/api/rest/demarches.queries.types.ts
index abd04dde8a6c7058b858c6f162355dd3c17d8724..81afd99fa24464800b01e3a080ac15c71dcb6bff 100644
--- a/packages/api/src/api/rest/demarches.queries.types.ts
+++ b/packages/api/src/api/rest/demarches.queries.types.ts
@@ -1,8 +1,6 @@
 /** Types generated for queries found in "src/api/rest/demarches.queries.ts" */
 export type Json = null | boolean | number | string | Json[] | { [key: string]: Json };
 
-export type JsonArray = (Json)[];
-
 /** 'GetEtapesByDemarcheIdDb' parameters type */
 export interface IGetEtapesByDemarcheIdDbParams {
   demarcheId: string;
@@ -15,8 +13,6 @@ export interface IGetEtapesByDemarcheIdDbResult {
   date: string;
   date_debut: string | null;
   date_fin: string | null;
-  decisions_annexes_contenu: Json | null;
-  decisions_annexes_sections: JsonArray | null;
   duree: number | null;
   etape_statut_id: string;
   etape_type_id: string;
@@ -53,12 +49,16 @@ export interface IGetDemarcheByIdOrSlugDbParams {
 
 /** 'GetDemarcheByIdOrSlugDb' return type */
 export interface IGetDemarcheByIdOrSlugDbResult {
+  demarche_description: string | null;
   demarche_id: string;
   demarche_slug: string | null;
   demarche_type_id: string;
   entreprises_lecture: boolean;
   public_lecture: boolean;
   titre_id: string;
+  titre_nom: string;
+  titre_slug: string;
+  titre_type_id: string;
 }
 
 /** 'GetDemarcheByIdOrSlugDb' query type */
diff --git a/packages/api/src/api/rest/demarches.ts b/packages/api/src/api/rest/demarches.ts
index 41ad1f8edd74bcaa82d78ded5da4e0b0eae9cbd1..68cd6b3ac7f3db0469cc9f73e7f8cf88da23825a 100644
--- a/packages/api/src/api/rest/demarches.ts
+++ b/packages/api/src/api/rest/demarches.ts
@@ -2,25 +2,36 @@ import { Pool } from 'pg'
 import { HTTP_STATUS } from 'camino-common/src/http.js'
 import { CaminoRequest, CustomResponse } from './express-type.js'
 import { demarcheIdOrSlugValidator } from 'camino-common/src/demarche.js'
-import { isSuper } from 'camino-common/src/roles.js'
 import { getDemarcheByIdOrSlug as getDemarcheByIdOrSlugDb } from './demarches.queries.js'
-import { GetDemarcheByIdOrSlugValidator } from 'camino-common/src/titres.js'
+import { GetDemarcheByIdOrSlugValidator, getDemarcheByIdOrSlugValidator } from 'camino-common/src/titres.js'
+import { getAdministrationsLocalesByTitreId, getTitreByIdOrSlug, getTitulairesAmodiatairesByTitreId } from './titres.queries.js'
+import { memoize } from 'camino-common/src/typescript-tools.js'
+import { canReadDemarche } from './permissions/demarches.js'
 
 export const getDemarcheByIdOrSlug = (pool: Pool) => async (req: CaminoRequest, res: CustomResponse<GetDemarcheByIdOrSlugValidator>) => {
   try {
     const demarcheIdOrSlugParsed = demarcheIdOrSlugValidator.safeParse(req.params.demarcheIdOrSlug)
     const user = req.auth
-    if (!isSuper(user)) {
-      res.sendStatus(HTTP_STATUS.HTTP_STATUS_FORBIDDEN)
-    } else if (!demarcheIdOrSlugParsed.success) {
+    if (!demarcheIdOrSlugParsed.success) {
       res.sendStatus(HTTP_STATUS.HTTP_STATUS_BAD_REQUEST)
     } else {
-      try {
-        const result = await getDemarcheByIdOrSlugDb(pool, demarcheIdOrSlugParsed.data)
-        res.json(result)
-      } catch (e) {
-        res.sendStatus(HTTP_STATUS.HTTP_STATUS_INTERNAL_SERVER_ERROR)
-        console.error(e)
+      const demarche = await getDemarcheByIdOrSlugDb(pool, demarcheIdOrSlugParsed.data)
+      const titre = await getTitreByIdOrSlug(pool, demarche.titre_id)
+
+      const administrationsLocales = memoize(() => getAdministrationsLocalesByTitreId(pool, demarche.titre_id))
+
+      if (
+        await canReadDemarche(
+          { ...demarche, titre_public_lecture: titre.public_lecture },
+          user,
+          memoize(() => Promise.resolve(titre.titre_type_id)),
+          administrationsLocales,
+          memoize(() => getTitulairesAmodiatairesByTitreId(pool, demarche.titre_id))
+        )
+      ) {
+        res.json(getDemarcheByIdOrSlugValidator.parse(demarche))
+      } else {
+        res.sendStatus(HTTP_STATUS.HTTP_STATUS_FORBIDDEN)
       }
     }
   } catch (e) {
diff --git a/packages/api/src/api/rest/entreprises.ts b/packages/api/src/api/rest/entreprises.ts
index 4aceb7df554a47e3263a6edbdee959f960ead846..8b98c49f01de5fa55846f5ea14bab8f675ac5e85 100644
--- a/packages/api/src/api/rest/entreprises.ts
+++ b/packages/api/src/api/rest/entreprises.ts
@@ -51,13 +51,11 @@ import {
 } from './entreprises.queries.js'
 import { newEnterpriseDocumentId } from '../../database/models/_format/id-create.js'
 import { isGuyane } from 'camino-common/src/static/pays.js'
-import { LargeObjectManager } from 'pg-large-object'
-import { createReadStream } from 'node:fs'
-import { join } from 'node:path'
 import { NewDownload } from './fichiers'
-import { TempDocumentName } from 'camino-common/src/document.js'
 import Decimal from 'decimal.js'
 
+import { createLargeObject } from '../../database/largeobjects.js'
+
 const conversion = (substanceFiscale: SubstanceFiscale, quantite: IContenuValeur): Decimal => {
   if (typeof quantite !== 'number') {
     return new Decimal(0)
@@ -430,43 +428,6 @@ export const getEntrepriseDocuments = (pool: Pool) => async (req: JWTRequest<Use
   }
 }
 
-const bufferSize = 16384
-
-export const createLargeObject = async (pool: Pool, tmpFileName: TempDocumentName): Promise<number> => {
-  const client = await pool.connect()
-  try {
-    const man = new LargeObjectManager({ pg: client })
-
-    await client.query('BEGIN')
-
-    const [oid, stream] = await man.createAndWritableStreamAsync(bufferSize)
-
-    const promise = new Promise<number>((resolve, reject) => {
-      const pathFrom = join(process.cwd(), `/files/tmp/${tmpFileName}`)
-      const fileStream = createReadStream(pathFrom)
-      fileStream.on('error', function (e) {
-        reject(e)
-      })
-      fileStream.pipe(stream)
-      stream.on('finish', function () {
-        client.query('COMMIT')
-        resolve(oid)
-      })
-      stream.on('error', function (e) {
-        reject(e)
-      })
-    })
-
-    return await promise
-  } catch (e: any) {
-    await client.query('ROLLBACK')
-    console.error(e)
-    throw new Error('error during largeobject creation')
-  } finally {
-    client.release()
-  }
-}
-
 export const postEntrepriseDocument = (pool: Pool) => async (req: JWTRequest<User>, res: CustomResponse<EntrepriseDocumentId | Error>) => {
   const user = req.auth
 
diff --git a/packages/api/src/api/rest/etapes.queries.ts b/packages/api/src/api/rest/etapes.queries.ts
index d7ff891938cb9fd2715bccdac76f9fe9e76b127c..1060dd9992884d059d3c0fdeec2d53c252a48f6c 100644
--- a/packages/api/src/api/rest/etapes.queries.ts
+++ b/packages/api/src/api/rest/etapes.queries.ts
@@ -1,14 +1,34 @@
 /* eslint-disable no-restricted-syntax */
-import { EtapeIdOrSlug, etapeIdValidator } from 'camino-common/src/etape.js'
-import { etapeTypeIdValidator } from 'camino-common/src/static/etapesTypes.js'
+import { EtapeDocumentId, EtapeId, EtapeIdOrSlug, etapeIdValidator, etapeDocumentIdValidator, etapeSlugValidator } from 'camino-common/src/etape.js'
+import { EtapeTypeId, etapeTypeIdValidator } from 'camino-common/src/static/etapesTypes.js'
 import { Pool } from 'pg'
 import { z } from 'zod'
 import { Redefine, dbQueryAndValidate } from '../../pg-database.js'
 import { sql } from '@pgtyped/runtime'
-import { IGetEtapeByIdDbQuery } from './etapes.queries.types.js'
-import { demarcheIdValidator } from 'camino-common/src/demarche.js'
+import {
+  IGetAdministrationsLocalesByEtapeIdQuery,
+  IGetEtapeByDemarcheIdAndEtapeTypeIdDbQuery,
+  IGetEtapeByIdDbQuery,
+  IGetEtapeDataForEditionDbQuery,
+  IGetEtapeDocumentsDbQuery,
+  IGetLargeobjectIdByEtapeDocumentIdInternalQuery,
+  IGetTitulairesAmodiatairesTitreEtapeQuery,
+} from './etapes.queries.types.js'
+import { DemarcheId, demarcheIdValidator } from 'camino-common/src/demarche.js'
 import { sdomZoneIdValidator } from 'camino-common/src/static/sdom.js'
 import { multiPolygonValidator } from 'camino-common/src/perimetre.js'
+import { documentTypeIdValidator } from 'camino-common/src/static/documentsTypes.js'
+import { demarcheTypeIdValidator } from 'camino-common/src/static/demarchesTypes.js'
+import { titreTypeIdValidator } from 'camino-common/src/static/titresTypes.js'
+import { AdministrationId, administrationIdValidator } from 'camino-common/src/static/administrations.js'
+import { EntrepriseId, entrepriseIdValidator } from 'camino-common/src/entreprise.js'
+import { User } from 'camino-common/src/roles.js'
+import { LargeObjectId, largeObjectIdValidator } from '../../database/largeobjects.js'
+import { canReadDocument } from './permissions/documents.js'
+import { isNotNullNorUndefinedNorEmpty, memoize } from 'camino-common/src/typescript-tools.js'
+import { etapeStatutIdValidator } from 'camino-common/src/static/etapesStatuts.js'
+import { caminoDateValidator } from 'camino-common/src/date.js'
+import { contenuValidator } from './activites.queries.js'
 
 const getEtapeByIdValidator = z.object({
   etape_id: etapeIdValidator,
@@ -36,3 +56,192 @@ where (id = $ etapeId !
     or slug = $ etapeId !)
 and archive is false
 `
+
+const etapeDocumentValidator = z.object({
+  id: etapeDocumentIdValidator,
+  description: z.string(),
+  etape_id: etapeIdValidator,
+  etape_document_type_id: documentTypeIdValidator,
+})
+
+type EtapeDocument = z.infer<typeof etapeDocumentValidator>
+export const getEtapeDocuments = async (pool: Pool): Promise<EtapeDocument[]> => {
+  return dbQueryAndValidate(getEtapeDocumentsDb, undefined, pool, etapeDocumentValidator)
+}
+
+const getEtapeDocumentsDb = sql<Redefine<IGetEtapeDocumentsDbQuery, undefined, EtapeDocument>>`
+select
+    d.id,
+    d.description,
+    d.etape_id,
+    d.etape_document_type_id
+from
+    etapes_documents d
+`
+
+const loidByEtapeDocumentIdValidator = z.object({
+  largeobject_id: largeObjectIdValidator,
+  etape_id: etapeIdValidator,
+  public_lecture: z.boolean(),
+  entreprises_lecture: z.boolean(),
+})
+export const getLargeobjectIdByEtapeDocumentId = async (pool: Pool, user: User, etapeDocumentId: EtapeDocumentId): Promise<LargeObjectId | null> => {
+  const result = await dbQueryAndValidate(
+    getLargeobjectIdByEtapeDocumentIdInternal,
+    {
+      etapeDocumentId,
+    },
+    pool,
+    loidByEtapeDocumentIdValidator
+  )
+
+  if (result.length === 1) {
+    const etapeDocument = result[0]
+    const etapeData = await getEtapeDataForEdition(pool, etapeDocument.etape_id)
+
+    const titreTypeId = memoize(() => Promise.resolve(etapeData.titre_type_id))
+    const administrationsLocales = memoize(() => administrationsLocalesByEtapeId(etapeDocument.etape_id, pool))
+    const entreprisesTitulairesOuAmodiataires = memoize(() => entreprisesTitulairesOuAmoditairesByEtapeId(etapeDocument.etape_id, pool))
+
+    if (
+      await canReadDocument(etapeDocument, user, titreTypeId, administrationsLocales, entreprisesTitulairesOuAmodiataires, etapeData.etape_type_id, {
+        demarche_type_id: etapeData.demarche_type_id,
+        entreprises_lecture: etapeData.demarche_entreprises_lecture,
+        public_lecture: etapeData.demarche_public_lecture,
+        titre_public_lecture: etapeData.titre_public_lecture,
+      })
+    ) {
+      return etapeDocument.largeobject_id
+    }
+  }
+
+  return null
+}
+const getLargeobjectIdByEtapeDocumentIdInternal = sql<Redefine<IGetLargeobjectIdByEtapeDocumentIdInternalQuery, { etapeDocumentId: EtapeDocumentId }, z.infer<typeof loidByEtapeDocumentIdValidator>>>`
+select
+    d.largeobject_id,
+    d.etape_id,
+    d.public_lecture,
+    d.entreprises_lecture
+from
+    etapes_documents d
+where
+    d.id = $ etapeDocumentId !
+LIMIT 1
+`
+
+export const getEtapeDataForEdition = async (pool: Pool, etapeId: EtapeId) => {
+  return (await dbQueryAndValidate(getEtapeDataForEditionDb, { etapeId }, pool, getEtapeDataForEditionValidator))[0]
+}
+
+const getEtapeDataForEditionValidator = z.object({
+  etape_type_id: etapeTypeIdValidator,
+  demarche_id: demarcheIdValidator,
+  etape_statut_id: etapeStatutIdValidator,
+  demarche_type_id: demarcheTypeIdValidator,
+  titre_type_id: titreTypeIdValidator,
+  demarche_public_lecture: z.boolean(),
+  demarche_entreprises_lecture: z.boolean(),
+  titre_public_lecture: z.boolean(),
+  etape_slug: etapeSlugValidator,
+})
+
+export type GetEtapeDataForEdition = z.infer<typeof getEtapeDataForEditionValidator>
+
+const getEtapeDataForEditionDb = sql<Redefine<IGetEtapeDataForEditionDbQuery, { etapeId: EtapeId }, GetEtapeDataForEdition>>`
+select
+    te.type_id as etape_type_id,
+    te.statut_id as etape_statut_id,
+    te.titre_demarche_id as demarche_id,
+    td.type_id as demarche_type_id,
+    t.type_id as titre_type_id,
+    td.public_lecture as demarche_public_lecture,
+    td.entreprises_lecture as demarche_entreprises_lecture,
+    t.public_lecture as titre_public_lecture,
+    te.slug as etape_slug
+from
+    titres_etapes te
+    join titres_demarches td on td.id = te.titre_demarche_id
+    join titres t on t.id = td.titre_id
+where
+    te.id = $ etapeId !
+`
+
+export const administrationsLocalesByEtapeId = async (etapeId: EtapeId, pool: Pool): Promise<AdministrationId[]> => {
+  const admins = await dbQueryAndValidate(getAdministrationsLocalesByEtapeId, { etapeId }, pool, administrationsLocalesValidator)
+  if (admins.length > 1) {
+    throw new Error(`Trop d'administrations locales trouvées pour l'etape ${etapeId}`)
+  }
+  if (admins.length === 0) {
+    return []
+  }
+
+  return admins[0].administrations_locales
+}
+
+const administrationsLocalesValidator = z.object({ administrations_locales: z.array(administrationIdValidator) })
+const getAdministrationsLocalesByEtapeId = sql<Redefine<IGetAdministrationsLocalesByEtapeIdQuery, { etapeId: EtapeId }, z.infer<typeof administrationsLocalesValidator>>>`
+select
+    tepoints.administrations_locales
+from
+    titres_etapes te
+    join titres_demarches td on td.id = te.titre_demarche_id
+    join titres t on t.id = td.titre_id
+    left join titres_etapes tepoints on tepoints.id = t.props_titre_etapes_ids ->> 'points'
+where
+    te.id = $ etapeId !
+`
+
+export const entreprisesTitulairesOuAmoditairesByEtapeId = async (etapeId: EtapeId, pool: Pool): Promise<EntrepriseId[]> => {
+  const entreprises = await dbQueryAndValidate(getTitulairesAmodiatairesTitreEtape, { etapeId }, pool, entrepriseIdObjectValidator)
+
+  return entreprises.map(({ id }) => id)
+}
+
+const entrepriseIdObjectValidator = z.object({ id: entrepriseIdValidator })
+const getTitulairesAmodiatairesTitreEtape = sql<Redefine<IGetTitulairesAmodiatairesTitreEtapeQuery, { etapeId: EtapeId }, z.infer<typeof entrepriseIdObjectValidator>>>`
+select distinct
+    e.id
+from
+    entreprises e,
+    titres_etapes te
+    join titres_demarches td on td.id = te.titre_demarche_id
+    join titres t on t.id = td.titre_id
+    left join titres_titulaires tt on tt.titre_etape_id = t.props_titre_etapes_ids ->> 'titulaires'
+    left join titres_amodiataires tta on tta.titre_etape_id = t.props_titre_etapes_ids ->> 'amodiataires'
+where
+    te.id = $ etapeId !
+    and (tt.entreprise_id = e.id
+        or tta.entreprise_id = e.id)
+`
+
+const getEtapeByDemarcheIdAndEtapeTypeIdValidator = z.object({
+  etape_id: etapeIdValidator,
+  etape_statut_id: etapeStatutIdValidator,
+  date: caminoDateValidator,
+  contenu: contenuValidator.nullable(),
+})
+type EtapeByDemarcheIdAndEtapeTypeId = z.infer<typeof getEtapeByDemarcheIdAndEtapeTypeIdValidator>
+export const getEtapeByDemarcheIdAndEtapeTypeId = async (pool: Pool, etapeTypeId: EtapeTypeId, demarcheId: DemarcheId): Promise<EtapeByDemarcheIdAndEtapeTypeId | null> => {
+  const result = await dbQueryAndValidate(getEtapeByDemarcheIdAndEtapeTypeIdDb, { etapeTypeId, demarcheId }, pool, getEtapeByDemarcheIdAndEtapeTypeIdValidator)
+
+  if (isNotNullNorUndefinedNorEmpty(result)) {
+    return result[0]
+  }
+
+  return null
+}
+
+const getEtapeByDemarcheIdAndEtapeTypeIdDb = sql<Redefine<IGetEtapeByDemarcheIdAndEtapeTypeIdDbQuery, { etapeTypeId: EtapeTypeId; demarcheId: DemarcheId }, EtapeByDemarcheIdAndEtapeTypeId>>`
+select
+    te.id as etape_id,
+    te.statut_id as etape_statut_id,
+    te.date,
+    te.contenu
+from
+    titres_etapes te
+where
+    te.type_id = $ etapeTypeId !
+    and te.titre_demarche_id = $ demarcheId !
+    and te.archive is false
+`
diff --git a/packages/api/src/api/rest/etapes.queries.types.ts b/packages/api/src/api/rest/etapes.queries.types.ts
index 321476b3f98f44589182d543854ec29a6e68ffa6..94fe0fa9deed8f31d8ed3d0bf964665e0e8c475d 100644
--- a/packages/api/src/api/rest/etapes.queries.types.ts
+++ b/packages/api/src/api/rest/etapes.queries.types.ts
@@ -21,3 +21,115 @@ export interface IGetEtapeByIdDbQuery {
   result: IGetEtapeByIdDbResult;
 }
 
+/** 'GetEtapeDocumentsDb' parameters type */
+export type IGetEtapeDocumentsDbParams = void;
+
+/** 'GetEtapeDocumentsDb' return type */
+export interface IGetEtapeDocumentsDbResult {
+  description: string | null;
+  etape_document_type_id: string;
+  etape_id: string;
+  id: string;
+}
+
+/** 'GetEtapeDocumentsDb' query type */
+export interface IGetEtapeDocumentsDbQuery {
+  params: IGetEtapeDocumentsDbParams;
+  result: IGetEtapeDocumentsDbResult;
+}
+
+/** 'GetLargeobjectIdByEtapeDocumentIdInternal' parameters type */
+export interface IGetLargeobjectIdByEtapeDocumentIdInternalParams {
+  etapeDocumentId: string;
+}
+
+/** 'GetLargeobjectIdByEtapeDocumentIdInternal' return type */
+export interface IGetLargeobjectIdByEtapeDocumentIdInternalResult {
+  entreprises_lecture: boolean;
+  etape_id: string;
+  largeobject_id: number | null;
+  public_lecture: boolean;
+}
+
+/** 'GetLargeobjectIdByEtapeDocumentIdInternal' query type */
+export interface IGetLargeobjectIdByEtapeDocumentIdInternalQuery {
+  params: IGetLargeobjectIdByEtapeDocumentIdInternalParams;
+  result: IGetLargeobjectIdByEtapeDocumentIdInternalResult;
+}
+
+/** 'GetEtapeDataForEditionDb' parameters type */
+export interface IGetEtapeDataForEditionDbParams {
+  etapeId: string;
+}
+
+/** 'GetEtapeDataForEditionDb' return type */
+export interface IGetEtapeDataForEditionDbResult {
+  demarche_entreprises_lecture: boolean;
+  demarche_id: string;
+  demarche_public_lecture: boolean;
+  demarche_type_id: string;
+  etape_slug: string | null;
+  etape_statut_id: string;
+  etape_type_id: string;
+  titre_public_lecture: boolean;
+  titre_type_id: string;
+}
+
+/** 'GetEtapeDataForEditionDb' query type */
+export interface IGetEtapeDataForEditionDbQuery {
+  params: IGetEtapeDataForEditionDbParams;
+  result: IGetEtapeDataForEditionDbResult;
+}
+
+/** 'GetAdministrationsLocalesByEtapeId' parameters type */
+export interface IGetAdministrationsLocalesByEtapeIdParams {
+  etapeId: string;
+}
+
+/** 'GetAdministrationsLocalesByEtapeId' return type */
+export interface IGetAdministrationsLocalesByEtapeIdResult {
+  administrations_locales: Json;
+}
+
+/** 'GetAdministrationsLocalesByEtapeId' query type */
+export interface IGetAdministrationsLocalesByEtapeIdQuery {
+  params: IGetAdministrationsLocalesByEtapeIdParams;
+  result: IGetAdministrationsLocalesByEtapeIdResult;
+}
+
+/** 'GetTitulairesAmodiatairesTitreEtape' parameters type */
+export interface IGetTitulairesAmodiatairesTitreEtapeParams {
+  etapeId: string;
+}
+
+/** 'GetTitulairesAmodiatairesTitreEtape' return type */
+export interface IGetTitulairesAmodiatairesTitreEtapeResult {
+  id: string;
+}
+
+/** 'GetTitulairesAmodiatairesTitreEtape' query type */
+export interface IGetTitulairesAmodiatairesTitreEtapeQuery {
+  params: IGetTitulairesAmodiatairesTitreEtapeParams;
+  result: IGetTitulairesAmodiatairesTitreEtapeResult;
+}
+
+/** 'GetEtapeByDemarcheIdAndEtapeTypeIdDb' parameters type */
+export interface IGetEtapeByDemarcheIdAndEtapeTypeIdDbParams {
+  demarcheId: string;
+  etapeTypeId: string;
+}
+
+/** 'GetEtapeByDemarcheIdAndEtapeTypeIdDb' return type */
+export interface IGetEtapeByDemarcheIdAndEtapeTypeIdDbResult {
+  contenu: Json | null;
+  date: string;
+  etape_id: string;
+  etape_statut_id: string;
+}
+
+/** 'GetEtapeByDemarcheIdAndEtapeTypeIdDb' query type */
+export interface IGetEtapeByDemarcheIdAndEtapeTypeIdDbQuery {
+  params: IGetEtapeByDemarcheIdAndEtapeTypeIdDbParams;
+  result: IGetEtapeByDemarcheIdAndEtapeTypeIdDbResult;
+}
+
diff --git a/packages/api/src/api/rest/etapes.ts b/packages/api/src/api/rest/etapes.ts
index 2dc8be6aeb5c93250390b5f1b856ec597bf0176a..d074599a3c1bc7c83a5aca213e4ec7adb1b49859 100644
--- a/packages/api/src/api/rest/etapes.ts
+++ b/packages/api/src/api/rest/etapes.ts
@@ -1,30 +1,40 @@
 import { z } from 'zod'
 import { CaminoRequest, CustomResponse } from './express-type.js'
-import { EtapeTypeEtapeStatutWithMainStep, etapeIdValidator, EtapeId } from 'camino-common/src/etape.js'
+import { EtapeTypeEtapeStatutWithMainStep, etapeIdValidator, EtapeId, GetEtapeDocumentsByEtapeId, needAslAndDae, documentTypeIdComplementaireObligatoireDAE } from 'camino-common/src/etape.js'
 import { DemarcheId, demarcheIdValidator } from 'camino-common/src/demarche.js'
 import { HTTP_STATUS } from 'camino-common/src/http.js'
 import { CaminoDate, caminoDateValidator } from 'camino-common/src/date.js'
 import { titreDemarcheGet } from '../../database/queries/titres-demarches.js'
 import { userSuper } from '../../database/user-super.js'
-import { titreEtapeGet } from '../../database/queries/titres-etapes.js'
+import { titreEtapeGet, titreEtapeUpdate } from '../../database/queries/titres-etapes.js'
 import { demarcheDefinitionFind } from '../../business/rules-demarches/definitions.js'
 import { etapeTypeDateFinCheck } from '../_format/etapes-types.js'
 import { User } from 'camino-common/src/roles.js'
-import { canCreateEtape } from 'camino-common/src/permissions/titres-etapes.js'
+import { canCreateEtape, isEtapeDeposable } from 'camino-common/src/permissions/titres-etapes.js'
 import { TitresStatutIds } from 'camino-common/src/static/titresStatuts.js'
 import { CaminoMachines } from '../../business/rules-demarches/machines.js'
 import { titreEtapesSortAscByOrdre } from '../../business/utils/titre-etapes-sort.js'
 import { Etape, TitreEtapeForMachine, titreEtapeForMachineValidator, toMachineEtapes } from '../../business/rules-demarches/machine-common.js'
 import { EtapesTypes, EtapeTypeId } from 'camino-common/src/static/etapesTypes.js'
-import { isNotNullNorUndefined, onlyUnique } from 'camino-common/src/typescript-tools.js'
+import { SimplePromiseFn, isNotNullNorUndefined, isNullOrUndefined, memoize, onlyUnique } from 'camino-common/src/typescript-tools.js'
 import { getEtapesTDE, isTDEExist } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/index.js'
 import { EtapeStatutId } from 'camino-common/src/static/etapesStatuts.js'
 import { getEtapesStatuts } from 'camino-common/src/static/etapesTypesEtapesStatuts.js'
 import { DemarchesTypes } from 'camino-common/src/static/demarchesTypes.js'
 import { Pool } from 'pg'
-import { EtapeEntrepriseDocument } from 'camino-common/src/entreprise.js'
-import { getEntrepriseDocumentIdsByEtapeId } from '../../database/queries/titres-etapes.queries.js'
-import { etapeDeposer, etapeSupprimer } from '../graphql/resolvers/titres-etapes.js'
+import { EntrepriseId, EtapeEntrepriseDocument } from 'camino-common/src/entreprise.js'
+import { getDocumentsByEtapeId, getEntrepriseDocumentIdsByEtapeId } from '../../database/queries/titres-etapes.queries.js'
+import { etapeSupprimer, statutIdAndDateGet } from '../graphql/resolvers/titres-etapes.js'
+import { GetEtapeDataForEdition, administrationsLocalesByEtapeId, entreprisesTitulairesOuAmoditairesByEtapeId, getEtapeByDemarcheIdAndEtapeTypeId, getEtapeDataForEdition } from './etapes.queries.js'
+import { SDOMZoneId } from 'camino-common/src/static/sdom.js'
+import { objectClone } from '../../tools/index.js'
+import { titreEtapeAdministrationsEmailsSend } from '../graphql/resolvers/_titre-etape-email.js'
+import { getGeojsonInformation } from './perimetre.queries.js'
+import { titreEtapeUpdateTask } from '../../business/titre-etape-update.js'
+import { valeurFind } from 'camino-common/src/sections.js'
+import { getElementWithValue, getSections, getSectionsWithValue } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sections.js'
+import { TitreTypeId } from 'camino-common/src/static/titresTypes.js'
+import { AdministrationId } from 'camino-common/src/static/administrations.js'
 
 export const getEtapeEntrepriseDocuments =
   (pool: Pool) =>
@@ -45,6 +55,119 @@ export const getEtapeEntrepriseDocuments =
     }
   }
 
+const getDaeDocument = async (
+  pool: Pool,
+  user: User,
+  titreTypeId: SimplePromiseFn<TitreTypeId>,
+  titresAdministrationsLocales: SimplePromiseFn<AdministrationId[]>,
+  entreprisesTitulairesOuAmodiataires: SimplePromiseFn<EntrepriseId[]>,
+  etapeData: GetEtapeDataForEdition
+) => {
+  const daeEtape = await getEtapeByDemarcheIdAndEtapeTypeId(pool, 'dae', etapeData.demarche_id)
+  if (isNotNullNorUndefined(daeEtape)) {
+    const daeEtapeDocuments = await getDocumentsByEtapeId(daeEtape.etape_id, pool, user, titreTypeId, titresAdministrationsLocales, entreprisesTitulairesOuAmodiataires, etapeData.etape_type_id, {
+      demarche_type_id: etapeData.demarche_type_id,
+      entreprises_lecture: etapeData.demarche_entreprises_lecture,
+      public_lecture: etapeData.demarche_public_lecture,
+      titre_public_lecture: etapeData.titre_public_lecture,
+    })
+
+    const daeArreteDocument = daeEtapeDocuments.find(({ etape_document_type_id }) => etape_document_type_id === documentTypeIdComplementaireObligatoireDAE)
+    if (isNotNullNorUndefined(daeArreteDocument)) {
+      const sectionsWithValue = getSectionsWithValue(getSections(etapeData.titre_type_id, etapeData.demarche_type_id, 'dae'), daeEtape.contenu)
+      const elementWithValue = getElementWithValue(sectionsWithValue, 'mea', 'arrete')
+      const arrete_prefectoral = isNotNullNorUndefined(elementWithValue) ? valeurFind(elementWithValue) : null
+
+      return {
+        id: daeArreteDocument.id,
+        date: daeEtape.date,
+        etape_statut_id: daeEtape.etape_statut_id,
+        arrete_prefectoral,
+        description: daeArreteDocument.description,
+        entreprises_lecture: daeArreteDocument.entreprises_lecture,
+        public_lecture: daeArreteDocument.public_lecture,
+        etape_document_type_id: documentTypeIdComplementaireObligatoireDAE,
+      }
+    }
+  }
+
+  return null
+}
+
+const getAslDocument = async (
+  pool: Pool,
+  user: User,
+  titreTypeId: SimplePromiseFn<TitreTypeId>,
+  titresAdministrationsLocales: SimplePromiseFn<AdministrationId[]>,
+  entreprisesTitulairesOuAmodiataires: SimplePromiseFn<EntrepriseId[]>,
+  etapeData: GetEtapeDataForEdition
+): Promise<GetEtapeDocumentsByEtapeId['asl'] | null> => {
+  const aslEtape = await getEtapeByDemarcheIdAndEtapeTypeId(pool, 'asl', etapeData.demarche_id)
+  if (isNotNullNorUndefined(aslEtape)) {
+    const aslEtapeDocuments = await getDocumentsByEtapeId(aslEtape.etape_id, pool, user, titreTypeId, titresAdministrationsLocales, entreprisesTitulairesOuAmodiataires, etapeData.etape_type_id, {
+      demarche_type_id: etapeData.demarche_type_id,
+      entreprises_lecture: etapeData.demarche_entreprises_lecture,
+      public_lecture: etapeData.demarche_public_lecture,
+      titre_public_lecture: etapeData.titre_public_lecture,
+    })
+
+    const aslEtapeDocumentTypeId = 'let'
+
+    const aslLettreDocument = aslEtapeDocuments.find(({ etape_document_type_id }) => etape_document_type_id === aslEtapeDocumentTypeId)
+    if (isNotNullNorUndefined(aslLettreDocument)) {
+      return {
+        id: aslLettreDocument.id,
+        date: aslEtape.date,
+        etape_statut_id: aslEtape.etape_statut_id,
+        description: aslLettreDocument.description,
+        entreprises_lecture: aslLettreDocument.entreprises_lecture,
+        public_lecture: aslLettreDocument.public_lecture,
+        etape_document_type_id: aslEtapeDocumentTypeId,
+      }
+    }
+  }
+
+  return null
+}
+
+export const getEtapeDocuments =
+  (pool: Pool) =>
+  async (req: CaminoRequest, res: CustomResponse<GetEtapeDocumentsByEtapeId>): Promise<void> => {
+    const etapeIdParsed = etapeIdValidator.safeParse(req.params.etapeId)
+    const user = req.auth
+
+    if (!etapeIdParsed.success) {
+      res.sendStatus(HTTP_STATUS.HTTP_STATUS_BAD_REQUEST)
+    } else {
+      try {
+        const etapeData = await getEtapeDataForEdition(pool, etapeIdParsed.data)
+
+        const titreTypeId = memoize(() => Promise.resolve(etapeData.titre_type_id))
+        const administrationsLocales = memoize(() => administrationsLocalesByEtapeId(etapeIdParsed.data, pool))
+        const entreprisesTitulairesOuAmodiataires = memoize(() => entreprisesTitulairesOuAmoditairesByEtapeId(etapeIdParsed.data, pool))
+
+        const result = await getDocumentsByEtapeId(etapeIdParsed.data, pool, user, titreTypeId, administrationsLocales, entreprisesTitulairesOuAmodiataires, etapeData.etape_type_id, {
+          demarche_type_id: etapeData.demarche_type_id,
+          entreprises_lecture: etapeData.demarche_entreprises_lecture,
+          public_lecture: etapeData.demarche_public_lecture,
+          titre_public_lecture: etapeData.titre_public_lecture,
+        })
+
+        let dae: null | GetEtapeDocumentsByEtapeId['dae'] = null
+        let asl: null | GetEtapeDocumentsByEtapeId['asl'] = null
+        if (needAslAndDae({ etapeTypeId: etapeData.etape_type_id, demarcheTypeId: etapeData.demarche_type_id, titreTypeId: etapeData.titre_type_id }, etapeData.etape_statut_id, user)) {
+          dae = await getDaeDocument(pool, user, titreTypeId, administrationsLocales, entreprisesTitulairesOuAmodiataires, etapeData)
+          asl = await getAslDocument(pool, user, titreTypeId, administrationsLocales, entreprisesTitulairesOuAmodiataires, etapeData)
+        }
+
+        res.json({ etapeDocuments: result, asl, dae })
+      } catch (e) {
+        res.sendStatus(HTTP_STATUS.HTTP_STATUS_INTERNAL_SERVER_ERROR)
+        console.error(e)
+      }
+    }
+  }
+
 export const deleteEtape = (pool: Pool) => async (req: CaminoRequest, res: CustomResponse<void>) => {
   const user = req.auth
 
@@ -70,7 +193,117 @@ export const deposeEtape = (pool: Pool) => async (req: CaminoRequest, res: Custo
     res.sendStatus(HTTP_STATUS.HTTP_STATUS_BAD_REQUEST)
   } else {
     try {
-      await etapeDeposer({ id: etapeId.data }, { pool, user })
+      const id = etapeId.data
+
+      if (!user) {
+        throw new Error("l'étape n'existe pas")
+      }
+
+      const titreEtape = await titreEtapeGet(id, { fields: { id: {} } }, user)
+
+      if (isNullOrUndefined(titreEtape)) throw new Error("l'étape n'existe pas")
+      const titreEtapeOld = objectClone(titreEtape)
+
+      const titreDemarche = await titreDemarcheGet(
+        titreEtape.titreDemarcheId,
+        {
+          fields: {
+            titre: { pointsEtape: { id: {} }, titulaires: { id: {} }, amodiataires: { id: {} } },
+          },
+        },
+        userSuper
+      )
+
+      if (!titreDemarche) throw new Error("la démarche n'existe pas")
+
+      const titre = titreDemarche.titre
+      if (isNullOrUndefined(titre)) throw new Error("le titre n'est pas chargé")
+      if (isNullOrUndefined(titre.administrationsLocales)) throw new Error('les administrations locales du titre ne sont pas chargées')
+
+      if (isNullOrUndefined(titre.titulaires)) throw new Error('les titulaires du titre ne sont pas chargés')
+      if (isNullOrUndefined(titre.amodiataires)) throw new Error('les amodiataires du titre ne sont pas chargés')
+      if (isNullOrUndefined(titreEtape.slug)) throw new Error("le slug de l'étape est obligatoire")
+
+      const sdomZones: SDOMZoneId[] = []
+      if (isNotNullNorUndefined(titreEtape.geojson4326Perimetre)) {
+        const { sdom } = await getGeojsonInformation(pool, titreEtape.geojson4326Perimetre.geometry)
+
+        sdomZones.push(...sdom)
+      }
+      const titreTypeId = memoize(() => Promise.resolve(titre.typeId))
+      const administrationsLocales = memoize(() => Promise.resolve(titre.administrationsLocales ?? []))
+      const entreprisesTitulairesOuAmodiataires = memoize(() => {
+        return Promise.resolve([...(titre.titulaires ?? []).map(({ id }) => id), ...(titre.amodiataires ?? []).map(({ id }) => id)])
+      })
+      const etapeDocuments = await getDocumentsByEtapeId(id, pool, user, titreTypeId, administrationsLocales, entreprisesTitulairesOuAmodiataires, titreEtape.typeId, {
+        demarche_type_id: titreDemarche.typeId,
+        entreprises_lecture: titreDemarche.entreprisesLecture ?? false,
+        public_lecture: titreDemarche.publicLecture ?? false,
+        titre_public_lecture: titre.publicLecture ?? false,
+      })
+
+      const entrepriseDocuments = await getEntrepriseDocumentIdsByEtapeId({ titre_etape_id: titreEtape.id }, pool, userSuper)
+
+      const daeDocument = await getDaeDocument(pool, user, titreTypeId, administrationsLocales, entreprisesTitulairesOuAmodiataires, {
+        demarche_entreprises_lecture: titreDemarche.entreprisesLecture ?? false,
+        demarche_public_lecture: titreDemarche.publicLecture ?? false,
+        demarche_id: titreDemarche.id,
+        demarche_type_id: titreDemarche.typeId,
+        etape_statut_id: titreEtape.statutId,
+        etape_type_id: titreEtape.typeId,
+        titre_public_lecture: titre.publicLecture ?? false,
+        titre_type_id: titre.typeId,
+        etape_slug: titreEtape.slug,
+      })
+
+      const aslDocument = await getAslDocument(pool, user, titreTypeId, administrationsLocales, entreprisesTitulairesOuAmodiataires, {
+        demarche_entreprises_lecture: titreDemarche.entreprisesLecture ?? false,
+        demarche_public_lecture: titreDemarche.publicLecture ?? false,
+        demarche_id: titreDemarche.id,
+        demarche_type_id: titreDemarche.typeId,
+        etape_statut_id: titreEtape.statutId,
+        etape_type_id: titreEtape.typeId,
+        titre_public_lecture: titre.publicLecture ?? false,
+        titre_type_id: titre.typeId,
+        etape_slug: titreEtape.slug,
+      })
+
+      // TODO 2023-06-14 TS 5.1 n’arrive pas réduire le type de titre
+      const deposable = isEtapeDeposable(
+        user,
+        { ...titre, titulaires: titre.titulaires ?? [], administrationsLocales: titre.administrationsLocales ?? [] },
+        titreDemarche.typeId,
+        { ...titreEtape, contenu: titreEtape.contenu ?? {} },
+        etapeDocuments,
+        entrepriseDocuments,
+        sdomZones,
+        daeDocument,
+        aslDocument
+      )
+      if (!deposable) throw new Error('droits insuffisants')
+
+      const statutIdAndDate = statutIdAndDateGet(titreEtape, user, true)
+
+      await titreEtapeUpdate(
+        titreEtape.id,
+        {
+          ...statutIdAndDate,
+        },
+        user,
+        titreDemarche.titreId
+      )
+      const etapeUpdated = await titreEtapeGet(
+        titreEtape.id,
+        {
+          fields: { id: {} },
+        },
+        user
+      )
+
+      await titreEtapeUpdateTask(pool, etapeUpdated.id, etapeUpdated.titreDemarcheId, user)
+
+      await titreEtapeAdministrationsEmailsSend(etapeUpdated, titreDemarche.typeId, titreDemarche.titreId, titreDemarche.titre!.typeId, user!, titreEtapeOld)
+
       res.sendStatus(HTTP_STATUS.HTTP_STATUS_NO_CONTENT)
     } catch (e) {
       res.sendStatus(HTTP_STATUS.HTTP_STATUS_INTERNAL_SERVER_ERROR)
diff --git a/packages/api/src/api/rest/fichiers.ts b/packages/api/src/api/rest/fichiers.ts
index ebf183c1d99c09b74212e8d3df6ba3dbd4f642d4..a252a233bde535b15d8c7f4a7ed7fe8c9d1f3548 100644
--- a/packages/api/src/api/rest/fichiers.ts
+++ b/packages/api/src/api/rest/fichiers.ts
@@ -1,25 +1,18 @@
-import { IContenuElement, IContenuValeur, IDocumentRepertoire } from '../../types.js'
-
-import { documentGet } from '../../database/queries/documents.js'
-import { titreEtapeGet } from '../../database/queries/titres-etapes.js'
-import { documentRepertoireFind } from '../../tools/documents/document-repertoire-find.js'
-import { documentFilePathFind } from '../../tools/documents/document-path-find.js'
-
 import JSZip from 'jszip'
-import { statSync, readFileSync, createWriteStream } from 'node:fs'
+import { createWriteStream } from 'node:fs'
 import { User } from 'camino-common/src/roles'
 import { DOWNLOAD_FORMATS, contentTypes } from 'camino-common/src/rest.js'
 import { Pool } from 'pg'
-import { EtapeId } from 'camino-common/src/etape.js'
-import { DocumentId } from 'camino-common/src/entreprise.js'
-import { getEntrepriseDocumentLargeObjectIdsByEtapeId } from '../../database/queries/titres-etapes.queries.js'
+import { EtapeId, etapeDocumentIdValidator } from 'camino-common/src/etape.js'
+import { getEntrepriseDocumentLargeObjectIdsByEtapeId, getEtapeDocumentLargeObjectIdsByEtapeId } from '../../database/queries/titres-etapes.queries.js'
 import { LargeObjectManager } from 'pg-large-object'
 
 import express from 'express'
 import { join } from 'node:path'
-import { isNotNullNorUndefined, isNullOrUndefined } from 'camino-common/src/typescript-tools.js'
 import { DocumentsTypes } from 'camino-common/src/static/documentsTypes.js'
 import { slugify } from 'camino-common/src/strings.js'
+import { administrationsLocalesByEtapeId, entreprisesTitulairesOuAmoditairesByEtapeId, getEtapeDataForEdition, getLargeobjectIdByEtapeDocumentId } from './etapes.queries.js'
+import { memoize } from 'camino-common/src/typescript-tools.js'
 export type NewDownload = (params: Record<string, unknown>, user: User, pool: Pool) => Promise<{ loid: number | null; fileName: string }>
 
 export const DOWNLOADS_DIRECTORY = 'downloads'
@@ -30,22 +23,20 @@ export const etapeTelecharger =
     if (!etapeId) {
       throw new Error("id d'étape absent")
     }
-    const titreEtape = await titreEtapeGet(
-      etapeId,
-      {
-        fields: {
-          documents: {
-            id: {},
-          },
-        },
-      },
-      user
-    )
-
-    if (isNullOrUndefined(titreEtape)) throw new Error("l'étape n'existe pas")
-
-    const documents = titreEtape.documents ?? []
-    const entrepriseDocuments = await getEntrepriseDocumentLargeObjectIdsByEtapeId({ titre_etape_id: titreEtape.id }, pool, user)
+
+    const etapeData = await getEtapeDataForEdition(pool, etapeId)
+
+    const titreTypeId = memoize(() => Promise.resolve(etapeData.titre_type_id))
+    const administrationsLocales = memoize(() => administrationsLocalesByEtapeId(etapeId, pool))
+    const entreprisesTitulairesOuAmodiataires = memoize(() => entreprisesTitulairesOuAmoditairesByEtapeId(etapeId, pool))
+
+    const documents = await getEtapeDocumentLargeObjectIdsByEtapeId(etapeId, pool, user, titreTypeId, administrationsLocales, entreprisesTitulairesOuAmodiataires, etapeData.etape_type_id, {
+      demarche_type_id: etapeData.demarche_type_id,
+      titre_public_lecture: etapeData.titre_public_lecture,
+      entreprises_lecture: etapeData.demarche_entreprises_lecture,
+      public_lecture: etapeData.demarche_public_lecture,
+    })
+    const entrepriseDocuments = await getEntrepriseDocumentLargeObjectIdsByEtapeId({ titre_etape_id: etapeId }, pool, user)
 
     if (!documents.length && !entrepriseDocuments.length) {
       throw new Error("aucun document n'a été trouvé pour cette demande")
@@ -53,19 +44,19 @@ export const etapeTelecharger =
 
     const zip = new JSZip()
 
-    for (const document of documents) {
-      const path = documentFilePathFind(document)
-      const fileName = slugify(`${document.id}-${DocumentsTypes[document.typeId].nom}`)
-
-      if (statSync(path).isFile()) {
-        zip.file(`${fileName}.pdf`, readFileSync(path))
-      }
-    }
     const client = await pool.connect()
 
     try {
       const man = new LargeObjectManager({ pg: client })
 
+      for (let i = 0; i < documents.length; i++) {
+        await client.query('BEGIN')
+
+        const document = documents[i]
+        const [_size, stream] = await man.openAndReadableStreamAsync(document.largeobject_id, bufferSize)
+        const fileName = slugify(`${document.id}-${DocumentsTypes[document.etape_document_type_id].nom}`)
+        zip.file(`${fileName}.pdf`, stream)
+      }
       for (let i = 0; i < entrepriseDocuments.length; i++) {
         await client.query('BEGIN')
 
@@ -74,7 +65,7 @@ export const etapeTelecharger =
         const fileName = slugify(`${entrepriseDocument.id}-${DocumentsTypes[entrepriseDocument.entreprise_document_type_id].nom}`)
         zip.file(`${fileName}.pdf`, stream)
       }
-      const nom = `documents-${titreEtape.slug}.zip`
+      const nom = `documents-${etapeData.etape_slug}.zip`
 
       const filePath = `/${DOWNLOADS_DIRECTORY}/${nom}`
       await new Promise<void>(resolve =>
@@ -138,112 +129,9 @@ export const streamLargeObjectInResponse = async (pool: Pool, res: express.Respo
   }
 }
 
-export const fichier =
-  (_pool: Pool) =>
-  async ({ params: { documentId } }: { params: { documentId?: DocumentId } }, user: User) => {
-    if (!documentId) {
-      throw new Error('id du document absent')
-    }
-
-    const document = await documentGet(
-      documentId,
-      {
-        fields: {
-          etape: { id: {} },
-        },
-      },
-      user
-    )
-
-    if (isNullOrUndefined(document) || !(document.fichier ?? false)) {
-      throw new Error(`fichier inexistant ${documentId}`)
-    }
-
-    const format = DOWNLOAD_FORMATS.PDF
-
-    let dossier
-
-    const repertoire = documentRepertoireFind(document)
-
-    if (repertoire === 'demarches') {
-      dossier = document.etape!.id
-    }
-
-    const nom = `${document.date}-${dossier ? dossier + '-' : ''}${document.typeId}.${format}`
-
-    const filePath = `${repertoire}/${dossier ? dossier + '/' : ''}${document.id}.${document.fichierTypeId}`
-
-    return {
-      nom,
-      format,
-      filePath,
-    }
-  }
-
-const etapeIdPathGet = (etapeId: string, fichierNom: string, contenu: IContenuValeur, heritageContenu: { actif: boolean; etapeId?: string | null }): null | string => {
-  if (Array.isArray(contenu)) {
-    const contenuArray = contenu as IContenuElement[]
-    for (let i = 0; i < contenuArray.length; i++) {
-      const contenuElement = contenuArray[i]
-      for (const contenuElementAttr of Object.keys(contenuElement)) {
-        const etapeIdFound = etapeIdPathGet(etapeId, fichierNom, contenuElement[contenuElementAttr], heritageContenu)
-        if (isNotNullNorUndefined(etapeIdFound)) {
-          return etapeIdFound
-        }
-      }
-    }
-  } else if (contenu === fichierNom) {
-    if (heritageContenu.actif) {
-      return heritageContenu.etapeId!
-    } else {
-      return etapeId
-    }
-  }
+export const etapeDocumentDownload: NewDownload = async (params, user, pool) => {
+  const etapeDocumentId = etapeDocumentIdValidator.parse(params.documentId)
+  const activiteDocumentLargeObjectId = await getLargeobjectIdByEtapeDocumentId(pool, user, etapeDocumentId)
 
-  return null
+  return { loid: activiteDocumentLargeObjectId, fileName: etapeDocumentId }
 }
-
-export const etapeFichier =
-  (_pool: Pool) =>
-  async ({ params: { etapeId, fichierNom } }: { params: { etapeId?: EtapeId; fichierNom?: string } }, user: User) => {
-    if (!etapeId) {
-      throw new Error('id de l’étape absent')
-    }
-    if (isNullOrUndefined(fichierNom)) {
-      throw new Error('nom du fichier absent')
-    }
-
-    const etape = await titreEtapeGet(etapeId, { fields: {} }, user)
-
-    if (isNullOrUndefined(etape)) {
-      throw new Error(`étape ${etapeId} non trouvée, impossible de récupérer les documents associés`)
-    }
-
-    let etapeIdPath
-
-    if (etape.contenu) {
-      // recherche dans quel élément de quelle section est stocké ce fichier, pour savoir si l’héritage est activé
-      for (const sectionId of Object.keys(etape.contenu)) {
-        for (const elementId of Object.keys(etape.contenu[sectionId])) {
-          etapeIdPath = etapeIdPathGet(etape.id, fichierNom, etape.contenu[sectionId][elementId], etape.heritageContenu![sectionId][elementId])
-        }
-      }
-    }
-
-    if (isNullOrUndefined(etapeIdPath) && etape.decisionsAnnexesContenu) {
-      etapeIdPath = etape.id
-    }
-
-    if (isNullOrUndefined(etapeIdPath)) {
-      throw new Error(`fichier inexistant pour l'étape ${etapeId}`)
-    }
-    const repertoire = 'demarches' as IDocumentRepertoire
-
-    const filePath = `${repertoire}/${etapeIdPath}/${fichierNom}`
-
-    return {
-      nom: fichierNom.slice(5),
-      format: DOWNLOAD_FORMATS.PDF,
-      filePath,
-    }
-  }
diff --git a/packages/api/src/api/rest/format/titres.ts b/packages/api/src/api/rest/format/titres.ts
index f1941118cadc247e9e5e4695f115dbda4e959241..dab83674ac2c1c6945e9ad12a38c8114f5c03281 100644
--- a/packages/api/src/api/rest/format/titres.ts
+++ b/packages/api/src/api/rest/format/titres.ts
@@ -40,7 +40,7 @@ const titreContenuTableFormat = (titre: ITitre): Record<string, string> => {
       .map(section => ({ ...section, elements: section.elements.filter(element => !(etape.heritageContenu?.[section.id]?.[element.id]?.actif ?? false)) }))
       .filter(section => section.elements.length > 0)
 
-    const sections_with_values: SectionWithValue[] = getSectionsWithValue(sections, etape.contenu)
+    const sections_with_values: SectionWithValue[] = getSectionsWithValue(sections, etape.contenu ?? {})
 
     return { etape_type_id: etape.typeId, sections_with_values }
   })
diff --git a/packages/api/src/api/rest/perimetre.queries.ts b/packages/api/src/api/rest/perimetre.queries.ts
index 0e983e8fcf875646d5b46d486264d55e61d335c4..547b51f04451ad732dee580ec5bb17428632dcb9 100644
--- a/packages/api/src/api/rest/perimetre.queries.ts
+++ b/packages/api/src/api/rest/perimetre.queries.ts
@@ -13,8 +13,8 @@ import { communeIdValidator } from 'camino-common/src/static/communes.js'
 import { secteurDbIdValidator } from 'camino-common/src/static/facades.js'
 import { foretIdValidator } from 'camino-common/src/static/forets.js'
 import { sdomZoneIdValidator } from 'camino-common/src/static/sdom.js'
-import { isNullOrUndefined } from 'camino-common/src/typescript-tools.js'
 import { KM2, km2Validator, m2Validator } from 'camino-common/src/number.js'
+import { isNullOrUndefined } from 'camino-common/src/typescript-tools.js'
 
 export const convertPoints = async <T extends z.ZodTypeAny>(
   pool: Pool,
diff --git a/packages/api/src/api/rest/titre-demande.ts b/packages/api/src/api/rest/titre-demande.ts
index 539af5dd6b715e8bbc23762d5f1f98c0c0c2533d..7678cd025d137e08eb56befe0776dc0629db4d66 100644
--- a/packages/api/src/api/rest/titre-demande.ts
+++ b/packages/api/src/api/rest/titre-demande.ts
@@ -5,19 +5,15 @@ import { titreEtapeUpsert } from '../../database/queries/titres-etapes.js'
 
 import titreUpdateTask from '../../business/titre-update.js'
 import { titreDemarcheUpdate } from '../../business/titre-demarche-update.js'
-import titreEtapeUpdateTask from '../../business/titre-etape-update.js'
+import { titreEtapeUpdateTask } from '../../business/titre-etape-update.js'
 import { userSuper } from '../../database/user-super.js'
 import { User, isBureauDEtudes, isEntreprise } from 'camino-common/src/roles.js'
 import { linkTitres } from '../../database/queries/titres-titres.js'
 import { getLinkConfig, canCreateTitre } from 'camino-common/src/permissions/titres.js'
 import { checkTitreLinks } from '../../business/validations/titre-links-validate.js'
-import { getEtapesStatuts } from 'camino-common/src/static/etapesTypesEtapesStatuts.js'
-import { EtapeTypeId, EtapesTypes } from 'camino-common/src/static/etapesTypes.js'
 import { utilisateurTitreCreate } from '../../database/queries/utilisateurs.js'
-import { getDocuments } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/documents.js'
 import { toCaminoDate } from 'camino-common/src/date.js'
-import { getSections, SectionElement } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sections.js'
-import { DeepReadonly, NonEmptyArray, isNotNullNorUndefinedNorEmpty, isNullOrUndefined } from 'camino-common/src/typescript-tools.js'
+import { isNotNullNorUndefinedNorEmpty, isNullOrUndefined } from 'camino-common/src/typescript-tools.js'
 import { EtapeId } from 'camino-common/src/etape.js'
 import { titreDemandeValidator } from 'camino-common/src/titres.js'
 import { HTTP_STATUS } from 'camino-common/src/http.js'
@@ -99,68 +95,6 @@ export const titreDemandeCreer = (pool: Pool) => async (req: CaminoRequest, res:
           titulaires: [titulaire],
         }
 
-        if (isBureauDEtudes(user) || isEntreprise(user)) {
-          let decisionsAnnexesEtapeTypeIds: EtapeTypeId[] = []
-          if (titreDemande.typeId === 'axm') {
-            // si c’est une AXM, d’après l’arbre d’instructions il y a 2 décisions annexes
-            // - la décision du propriétaire du sol (asl)
-            // - la décision de la mission autorité environnementale (dae)
-            decisionsAnnexesEtapeTypeIds = ['asl', 'dae']
-          }
-          if (decisionsAnnexesEtapeTypeIds.length) {
-            titreEtape.decisionsAnnexesSections = []
-
-            for (const etapeTypeId of decisionsAnnexesEtapeTypeIds) {
-              const etapeType = EtapesTypes[etapeTypeId]
-
-              const etapesStatuts = getEtapesStatuts(etapeTypeId)
-
-              const documentsElements: DeepReadonly<SectionElement[]> = getDocuments(titreDemande.typeId, titreDemarche.typeId, etapeTypeId)
-                .filter(dt => !dt.optionnel)
-                .map(dt => ({
-                  id: dt.id,
-                  nom: dt.nom,
-                  type: 'file',
-                }))
-
-              const elements: (DeepReadonly<SectionElement> & { sectionId: string })[] = []
-              const etapeTypeSections = [...getSections(titre.typeId, titreDemarche.typeId, etapeTypeId)]
-              if (etapeTypeSections.length) {
-                etapeTypeSections.forEach(section => {
-                  section.elements?.forEach(element => {
-                    elements.push({ ...element, sectionId: section.id })
-                  })
-                })
-              }
-
-              titreEtape.decisionsAnnexesSections = [
-                ...titreEtape.decisionsAnnexesSections,
-                {
-                  id: etapeTypeId,
-                  nom: etapeType.nom,
-                  elements: [
-                    {
-                      id: 'date',
-                      nom: 'Date',
-                      type: 'date',
-                    },
-                    {
-                      id: 'statutId',
-                      nom: 'Statut',
-                      type: 'select',
-                      options: etapesStatuts.map(statut => ({
-                        id: statut.id,
-                        nom: statut.nom,
-                      })) as NonEmptyArray<{ id: string; nom: string }>,
-                    },
-                    ...elements,
-                    ...documentsElements,
-                  ],
-                },
-              ]
-            }
-          }
-        }
         const updatedTitreEtape = await titreEtapeUpsert(titreEtape, user, titreId)
         await titreEtapeUpdateTask(pool, updatedTitreEtape.id, titreEtape.titreDemarcheId, user)
 
diff --git a/packages/api/src/api/rest/titres.queries.ts b/packages/api/src/api/rest/titres.queries.ts
index 94c1779372ebe4271a0264501c932bb656374793..2e8458653b6d2fe417ec731c9add6ff313d0231c 100644
--- a/packages/api/src/api/rest/titres.queries.ts
+++ b/packages/api/src/api/rest/titres.queries.ts
@@ -41,7 +41,7 @@ import { EntrepriseId, entrepriseIdValidator } from 'camino-common/src/entrepris
 import { AdministrationId } from 'camino-common/src/static/administrations.js'
 import { secteurMaritimeValidator } from 'camino-common/src/static/facades.js'
 
-type SuperEtapeDemarcheTitreGet = OmitDistributive<DemarcheEtape, 'documents'>
+type SuperEtapeDemarcheTitreGet = OmitDistributive<DemarcheEtape, 'etape_documents'>
 type SuperDemarcheTitreGet = Omit<TitreGet['demarches'][0], 'etapes'> & { etapes: SuperEtapeDemarcheTitreGet[]; public_lecture: boolean; entreprises_lecture: boolean; titre_public_lecture: boolean }
 
 export const getTitre = async (pool: Pool, user: User, idOrSlug: TitreIdOrSlug): Promise<TitreGet | null> => {
@@ -77,7 +77,7 @@ export const getTitre = async (pool: Pool, user: User, idOrSlug: TitreIdOrSlug):
           entrepriseDocuments.push(...(await getEntrepriseDocumentIdsByEtapeId({ titre_etape_id: etape.id }, pool, user)))
         }
 
-        const etapeCommon: Omit<DemarcheEtapeCommon, 'documents'> = {
+        const etapeCommon: Omit<DemarcheEtapeCommon, 'etape_documents'> = {
           date: etape.date,
           ordre: etape.ordre,
           notes: etape.notes,
@@ -86,8 +86,6 @@ export const getTitre = async (pool: Pool, user: User, idOrSlug: TitreIdOrSlug):
           etape_statut_id: etape.etape_statut_id,
           sections_with_values: contenu,
           entreprises_documents: entrepriseDocuments,
-          decisions_annexes_contenu: isNotNullNorUndefined(etape.decisions_annexes_contenu) ? etape.decisions_annexes_contenu : null,
-          decisions_annexes_sections: isNotNullNorUndefined(etape.decisions_annexes_sections) ? etape.decisions_annexes_sections : null,
         }
         if (isEtapeTypeIdFondamentale(etape.etape_type_id)) {
           let perimetre: DemarcheEtapeFondamentale['fondamentale']['perimetre'] = null
@@ -141,7 +139,7 @@ export const getTitre = async (pool: Pool, user: User, idOrSlug: TitreIdOrSlug):
             }
           }
 
-          const etapeFondamentale: Omit<DemarcheEtapeFondamentale, 'documents'> = {
+          const etapeFondamentale: Omit<DemarcheEtapeFondamentale, 'etape_documents'> = {
             etape_type_id: etape.etape_type_id,
             fondamentale: {
               amodiataires,
@@ -157,7 +155,7 @@ export const getTitre = async (pool: Pool, user: User, idOrSlug: TitreIdOrSlug):
 
           formatedEtapes.push(etapeFondamentale)
         } else {
-          const etapeNonFondamentale: Omit<DemarcheEtapeNonFondamentale, 'documents'> = { etape_type_id: etape.etape_type_id, ...etapeCommon }
+          const etapeNonFondamentale: Omit<DemarcheEtapeNonFondamentale, 'etape_documents'> = { etape_type_id: etape.etape_type_id, ...etapeCommon }
 
           formatedEtapes.push(etapeNonFondamentale)
         }
@@ -208,14 +206,14 @@ export const getTitre = async (pool: Pool, user: User, idOrSlug: TitreIdOrSlug):
         for (const superEtape of superDemarche.etapes) {
           const canRead: boolean = await canReadEtape(user, titreTypeId, administrationsLocales, entreprisesTitulairesOuAmodiataires, superEtape.etape_type_id, superDemarche)
           if (canRead) {
-            const documents: EtapeDocument[] = []
+            const etape_documents: EtapeDocument[] = []
             const documentsTypes = getDocuments(titre.titre_type_id, superDemarche.demarche_type_id, superEtape.etape_type_id)
             if (documentsTypes.length > 0) {
-              documents.push(
+              etape_documents.push(
                 ...(await getDocumentsByEtapeId(superEtape.id, pool, user, titreTypeId, administrationsLocales, entreprisesTitulairesOuAmodiataires, superEtape.etape_type_id, superDemarche))
               )
             }
-            etapes.push({ ...superEtape, documents })
+            etapes.push({ ...superEtape, etape_documents })
           }
         }
 
diff --git a/packages/api/src/api/rest/titres.test.integration.ts b/packages/api/src/api/rest/titres.test.integration.ts
index 49fdbf4d98a689489ad6cd5f78b2337634ea7de3..c3907b4518360fe257df9266f0b123290f0003e4 100644
--- a/packages/api/src/api/rest/titres.test.integration.ts
+++ b/packages/api/src/api/rest/titres.test.integration.ts
@@ -469,10 +469,8 @@ describe('getTitre', () => {
             "etapes": [
               {
                 "date": "2022-01-01",
-                "decisions_annexes_contenu": null,
-                "decisions_annexes_sections": null,
-                "documents": [],
                 "entreprises_documents": [],
+                "etape_documents": [],
                 "etape_statut_id": "fai",
                 "etape_type_id": "mfr",
                 "fondamentale": {
diff --git a/packages/api/src/business/processes/__snapshots__/titres-etapes-areas-update.test.integration.ts.snap b/packages/api/src/business/processes/__snapshots__/titres-etapes-areas-update.test.integration.ts.snap
index eb02521fad086fa6d5fc22c824b090a16ecfb996..ecb02dbc2523994be3d2729fcf7d21f59a3e51ef 100644
--- a/packages/api/src/business/processes/__snapshots__/titres-etapes-areas-update.test.integration.ts.snap
+++ b/packages/api/src/business/processes/__snapshots__/titres-etapes-areas-update.test.integration.ts.snap
@@ -19,8 +19,6 @@ exports[`titresEtapesAreasUpdate > met à jour les communes, forêts et zone du
     "date": "2022-03-09",
     "dateDebut": null,
     "dateFin": null,
-    "decisionsAnnexesContenu": null,
-    "decisionsAnnexesSections": null,
     "duree": null,
     "forets": [
       "DBR",
@@ -153,8 +151,6 @@ exports[`titresEtapesAreasUpdate > met à jour les communes, forêts et zone du
       "date": "2022-03-09",
       "dateDebut": null,
       "dateFin": null,
-      "decisionsAnnexesContenu": null,
-      "decisionsAnnexesSections": null,
       "duree": null,
       "forets": [
         "DBR",
diff --git a/packages/api/src/business/processes/titres-demarches-depot-create.ts b/packages/api/src/business/processes/titres-demarches-depot-create.ts
index 0fe57c5094fcfc12f7d4fda96ab698a0a0a2875f..4c40fbeaa54b3bcbd95d1a75f2019dbfa664915a 100644
--- a/packages/api/src/business/processes/titres-demarches-depot-create.ts
+++ b/packages/api/src/business/processes/titres-demarches-depot-create.ts
@@ -3,7 +3,7 @@ import type { ITitreDemarche, ITitreEntreprise, ITitreEtape } from '../../types.
 import { titreEtapeUpsert } from '../../database/queries/titres-etapes.js'
 import { titreDemarcheGet } from '../../database/queries/titres-demarches.js'
 import { userSuper } from '../../database/user-super.js'
-import titreEtapeUpdateTask from '../titre-etape-update.js'
+import { titreEtapeUpdateTask } from '../titre-etape-update.js'
 import { titreEtapeAdministrationsEmailsSend } from '../../api/graphql/resolvers/_titre-etape-email.js'
 import { demarcheDefinitionFind } from '../rules-demarches/definitions.js'
 import { titreUrlGet } from '../utils/urls-get.js'
diff --git a/packages/api/src/business/rules-demarches/definitions.ts b/packages/api/src/business/rules-demarches/definitions.ts
index cf0aebf3ebba35817fae8b9a3974c98be0c150be..9b36679f5d246de9f124253a54059441c9fd4c6f 100644
--- a/packages/api/src/business/rules-demarches/definitions.ts
+++ b/packages/api/src/business/rules-demarches/definitions.ts
@@ -12,6 +12,7 @@ import { DemarcheTypeId } from 'camino-common/src/static/demarchesTypes.js'
 import { TitreTypeId } from 'camino-common/src/static/titresTypes.js'
 import { ArmRenProMachine } from './arm/ren-pro.machine.js'
 import { PrmOctMachine } from './prm/oct.machine.js'
+import { DeepReadonly } from 'camino-common/src/typescript-tools.js'
 
 interface DemarcheDefinitionCommon {
   titreTypeId: TitreTypeId
@@ -107,7 +108,7 @@ export const demarchesDefinitions: DemarcheDefinition[] = [
 export const demarcheDefinitionFind = (
   titreTypeId: TitreTypeId,
   demarcheTypeId: DemarcheTypeId,
-  titreEtapes: Pick<ITitreEtape, 'date' | 'typeId'>[] | undefined,
+  titreEtapes: DeepReadonly<Pick<ITitreEtape, 'date' | 'typeId'>[]> | undefined,
   demarcheId: DemarcheId
 ): DemarcheDefinition | undefined => {
   const date = titreDemarcheDepotDemandeDateFind(titreEtapes)
diff --git a/packages/api/src/business/rules/titre-demarche-depot-demande-date-find.ts b/packages/api/src/business/rules/titre-demarche-depot-demande-date-find.ts
index 4288fbdc3e6470d61d6a79a4442bb4806c25f22a..b5b0aae069819474234ece6957c2ec877187a81e 100644
--- a/packages/api/src/business/rules/titre-demarche-depot-demande-date-find.ts
+++ b/packages/api/src/business/rules/titre-demarche-depot-demande-date-find.ts
@@ -1,3 +1,4 @@
+import { DeepReadonly } from 'camino-common/src/typescript-tools.js'
 import { ITitreEtape } from '../../types.js'
 
 // si il y a un dépot de la demande
@@ -5,7 +6,7 @@ import { ITitreEtape } from '../../types.js'
 // sinon
 // retourne la date de la première étape
 
-export const titreDemarcheDepotDemandeDateFind = (titreEtapes: Pick<ITitreEtape, 'date' | 'typeId'>[] | undefined): undefined | string => {
+export const titreDemarcheDepotDemandeDateFind = (titreEtapes: DeepReadonly<Pick<ITitreEtape, 'date' | 'typeId'>[]> | undefined): undefined | string => {
   if (!titreEtapes || titreEtapes.length === 0) {
     return undefined
   }
diff --git a/packages/api/src/business/titre-etape-update.ts b/packages/api/src/business/titre-etape-update.ts
index 5845b0438a07176d5e02448b99bcbcdcd79d777b..9d8020643b2c00ccf0c816db79469b48f85434cf 100644
--- a/packages/api/src/business/titre-etape-update.ts
+++ b/packages/api/src/business/titre-etape-update.ts
@@ -23,7 +23,7 @@ import { titresEtapesDepotCreate } from './processes/titres-demarches-depot-crea
 import type { UserNotNull } from 'camino-common/src/roles.js'
 import type { Pool } from 'pg'
 
-const titreEtapeUpdate = async (pool: Pool, titreEtapeId: EtapeId | null, titreDemarcheId: DemarcheId, user: UserNotNull) => {
+export const titreEtapeUpdateTask = async (pool: Pool, titreEtapeId: EtapeId | null, titreDemarcheId: DemarcheId, user: UserNotNull) => {
   try {
     console.info()
     console.info('- - -')
@@ -92,5 +92,3 @@ const titreEtapeUpdate = async (pool: Pool, titreEtapeId: EtapeId | null, titreD
     throw e
   }
 }
-
-export default titreEtapeUpdate
diff --git a/packages/api/src/business/utils/contenu-element-file-process.test.ts b/packages/api/src/business/utils/contenu-element-file-process.test.ts
deleted file mode 100644
index f263452340c7188c4be35fee11aac319fd972827..0000000000000000000000000000000000000000
--- a/packages/api/src/business/utils/contenu-element-file-process.test.ts
+++ /dev/null
@@ -1,148 +0,0 @@
-import { FileUpload } from 'graphql-upload'
-import { ReadStream } from 'fs'
-import { afterEach, vi, describe, test, expect } from 'vitest'
-
-import { IContenu, ITitreEtape } from '../../types.js'
-
-import { contenuElementFilesCreate, contenuElementFilesDelete, sectionsContenuAndFilesGet } from './contenu-element-file-process.js'
-
-import { objectClone } from '../../tools/index.js'
-import { dirCreate } from '../../tools/dir-create.js'
-import fileStreamCreate from '../../tools/file-stream-create.js'
-import fileDelete from '../../tools/file-delete.js'
-import { Section } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sections.js'
-import { DeepReadonly } from 'camino-common/src/typescript-tools.js'
-
-vi.mock('../../tools/dir-create', () => ({
-  dirCreate: vi.fn(),
-}))
-const dirCreateMock = vi.mocked(dirCreate, true)
-
-vi.mock('../../tools/file-stream-create', () => ({
-  __esModule: true,
-  default: vi.fn(),
-}))
-const fileStreamCreateMock = vi.mocked(fileStreamCreate, true)
-
-vi.mock('../../tools/file-delete', () => ({
-  __esModule: true,
-  default: vi.fn(),
-}))
-
-vi.mock('../../database/models/_format/id-create', () => ({ idGenerate: () => 'prefix' }))
-const fileDeleteMock = vi.mocked(fileDelete, true)
-
-afterEach(() => {
-  vi.resetAllMocks()
-})
-
-describe('sectionsContenuAndFilesGet', () => {
-  test('si pas de contenu alors pas de contenu ni de fichier', () => {
-    expect(sectionsContenuAndFilesGet(null, [])).toEqual({
-      contenu: null,
-      newFiles: [],
-    })
-  })
-
-  test('si contenu sans nouveau fichier alors contenu identique', () => {
-    const contenu = {
-      arm: {
-        mecanise: true,
-        franchissements: 3,
-        justificatif: 'nomdefichier.pdf',
-      },
-    }
-    expect(
-      sectionsContenuAndFilesGet(contenu, [
-        {
-          id: 'arm',
-          elements: [
-            { id: 'mecanise', nom: 'mecanise', type: 'checkbox' },
-            { id: 'franchissements', nom: 'franchissements', type: 'number' },
-            { id: 'justificatif', nom: 'justificatif', type: 'file' },
-          ],
-        },
-      ])
-    ).toMatchObject({
-      contenu: objectClone(contenu),
-      newFiles: [],
-    })
-  })
-
-  test('si contenu avec nouveau fichier alors contenu modifié', () => {
-    const contenu = {
-      arm: {
-        mecanise: true,
-        franchissements: 3,
-        justificatif: { file: { filename: 'super.pdf' } as FileUpload },
-      },
-    }
-
-    const newContenu = objectClone(contenu) as IContenu
-    newContenu.arm.justificatif = 'prefix-super.pdf'
-
-    const res = sectionsContenuAndFilesGet(contenu, [
-      {
-        id: 'arm',
-        elements: [
-          { id: 'mecanise', nom: 'mecanise', type: 'checkbox' },
-          { id: 'franchissements', nom: 'franchissements', type: 'number' },
-          { id: 'justificatif', nom: 'justificatif', type: 'file' },
-        ],
-      },
-    ])
-    expect(res).toMatchObject({
-      contenu: newContenu,
-      newFiles: [{ filename: 'prefix-super.pdf' }],
-    })
-  })
-})
-
-describe('contenuElementFileProcess', () => {
-  test('enregistre les nouveaux fichiers sur le disque', async () => {
-    const file = {
-      createReadStream: () => ({} as unknown as ReadStream),
-      filename: 'toto.pdf',
-      encoding: 'utf-8',
-      mimetype: 'application/pdf',
-    } as unknown as FileUpload
-
-    await contenuElementFilesCreate([file, file], 'demarches', 'etapeId')
-
-    expect(dirCreateMock).toHaveBeenCalledTimes(1)
-    expect(fileStreamCreateMock).toHaveBeenCalledTimes(2)
-  })
-
-  test('supprime les anciens fichiers sur le disque', async () => {
-    const sections: DeepReadonly<Section[]> = [
-      {
-        id: 'arm',
-        elements: [
-          { id: 'mecanise', nom: 'mecanise', type: 'checkbox' },
-          { id: 'franchissements', nom: 'franchissements', type: 'number' },
-          { id: 'justificatif', nom: 'justificatif', type: 'file' },
-          { id: 'facture', nom: 'facture', type: 'file' },
-        ],
-      },
-    ]
-
-    const oldContenu = {
-      arm: {
-        mecanise: true,
-        justificatif: 'fichier.pdf',
-        facture: 'facture.pdf',
-      },
-    } as IContenu
-    const contenu = {
-      arm: {
-        mecanise: true,
-        justificatif: 'newfichier.pdf',
-        facture: 'facture.pdf',
-      },
-    }
-
-    await contenuElementFilesDelete('demarches', 'etapeId', sections, etape => etape.contenu, [{ contenu } as unknown as ITitreEtape], oldContenu)
-
-    expect(fileDeleteMock).toHaveBeenCalledTimes(1)
-  })
-})
diff --git a/packages/api/src/business/utils/contenu-element-file-process.ts b/packages/api/src/business/utils/contenu-element-file-process.ts
deleted file mode 100644
index a7109262ed953de0c83683a9acd0f8a39026f6fd..0000000000000000000000000000000000000000
--- a/packages/api/src/business/utils/contenu-element-file-process.ts
+++ /dev/null
@@ -1,142 +0,0 @@
-import { FileUpload } from 'graphql-upload'
-import { join } from 'path'
-
-import { IContenu, IContenuValeur, IDocumentRepertoire, ITitreEtape } from '../../types.js'
-
-import { dirCreate } from '../../tools/dir-create.js'
-import fileStreamCreate from '../../tools/file-stream-create.js'
-import fileDelete from '../../tools/file-delete.js'
-import { Section, SectionElement } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sections.js'
-import { DeepReadonly } from 'camino-common/src/typescript-tools.js'
-import { idGenerate } from '../../database/models/_format/id-create.js'
-
-const sectionElementContenuAndFilesGet = (contenuValeur: IContenuValeur, sectionElement: DeepReadonly<SectionElement>) => {
-  const newFiles = [] as FileUpload[]
-  let newValue = contenuValeur as IContenuValeur | null
-
-  if (sectionElement.type === 'file') {
-    const fileUpload = contenuValeur as {
-      file: FileUpload
-    }
-
-    if (fileUpload?.file) {
-      const fileName = `${idGenerate(4)}-${fileUpload.file.filename}`
-      fileUpload.file.filename = fileName
-      newFiles.push(fileUpload?.file)
-      newValue = fileName
-    }
-  }
-
-  return { newValue, newFiles }
-}
-
-const sectionsContenuAndFilesGet = (contenu: IContenu | undefined | null, sections: DeepReadonly<Section[]>) => {
-  const newFiles = [] as FileUpload[]
-  if (contenu) {
-    Object.keys(contenu)
-      .filter(sectionId => contenu![sectionId])
-      .forEach(sectionId =>
-        Object.keys(contenu![sectionId]).forEach(elementId => {
-          const sectionElement = sections.find(s => s.id === sectionId)?.elements?.find(e => e.id === elementId)
-
-          if (sectionElement) {
-            const sectionElementResult = sectionElementContenuAndFilesGet(contenu[sectionId][elementId], sectionElement)
-
-            if (!sectionElementResult || sectionElementResult.newValue === undefined || sectionElementResult.newValue === null) {
-              delete contenu[sectionId][elementId]
-            } else {
-              contenu[sectionId][elementId] = sectionElementResult.newValue
-            }
-
-            if (sectionElementResult.newFiles.length) {
-              newFiles.push(...sectionElementResult.newFiles)
-            }
-          }
-        })
-      )
-  }
-
-  return { contenu, newFiles }
-}
-
-const contenuFilesGet = (contenu: IContenu | null | undefined, sections: DeepReadonly<Section[]>) => {
-  const files = [] as string[]
-  if (contenu) {
-    sections
-      .filter(section => section.elements)
-      .forEach(section =>
-        section.elements!.forEach(element => {
-          const contenuValeur = contenu[section.id] ? contenu[section.id][element.id] : null
-
-          files.push(...sectionElementFilesGet(element, contenuValeur))
-        })
-      )
-  }
-
-  return files
-}
-
-const sectionElementFilesGet = (sectionElement: DeepReadonly<SectionElement>, contenuValeur: IContenuValeur | null) => {
-  const files = [] as string[]
-  if (sectionElement.type === 'file') {
-    if (contenuValeur) {
-      files.push(contenuValeur as string)
-    }
-  }
-
-  return files
-}
-
-const contenuFilesPathGet = (repertoire: IDocumentRepertoire, parentId: string) => `files/${repertoire}/${parentId}`
-
-const contenuElementFilesCreate = async (newFiles: FileUpload[], repertoire: IDocumentRepertoire, parentId: string) => {
-  if (newFiles.length) {
-    const dirPath = `files/${repertoire}/${parentId}`
-    dirCreate(join(process.cwd(), dirPath))
-    // on enregistre tous les nouveaux fichiers sur le disque
-    for (const file of newFiles) {
-      if (file) {
-        const { createReadStream } = file
-
-        await fileStreamCreate(createReadStream(), join(process.cwd(), `${dirPath}/${file.filename}`))
-      }
-    }
-  }
-}
-
-const contenuElementFilesDelete = async (
-  repertoire: IDocumentRepertoire,
-  parentId: string,
-  sections: DeepReadonly<Section[]>,
-  contenuGet: (etape: ITitreEtape) => IContenu | null | undefined,
-  etapes?: ITitreEtape[] | null,
-  oldContenu?: IContenu | null
-) => {
-  const dirPath = `files/${repertoire}/${parentId}`
-
-  // on récupère tous les fichiers présents sur le disque avant la mise à jour
-  const oldFiles = contenuFilesGet(oldContenu, sections)
-
-  // on récupère tous les fichiers actuels
-  const files = etapes
-    ? etapes.reduce((acc, etape) => {
-        acc.push(...contenuFilesGet(contenuGet(etape), sections))
-
-        return acc
-      }, [] as string[])
-    : []
-
-  // on supprime les fichiers qui ne sont plus utiles
-  for (const oldFile of oldFiles) {
-    if (!files.includes(oldFile)) {
-      const oldFilePath = `${dirPath}/${oldFile}`
-      try {
-        await fileDelete(join(process.cwd(), oldFilePath))
-      } catch (e) {
-        console.error(`impossible de supprimer le fichier: ${oldFilePath}`, e)
-      }
-    }
-  }
-}
-
-export { contenuElementFilesCreate, contenuElementFilesDelete, sectionsContenuAndFilesGet, contenuFilesGet, contenuFilesPathGet }
diff --git a/packages/api/src/business/validations/document-input-validate.ts b/packages/api/src/business/validations/document-input-validate.ts
deleted file mode 100644
index a9dcb96278a4058aebeb90a8a4404ff6ed713d96..0000000000000000000000000000000000000000
--- a/packages/api/src/business/validations/document-input-validate.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-import { dateValidate } from 'camino-common/src/date.js'
-import { IDocument } from '../../types.js'
-
-export const documentInputValidate = (document: IDocument): string[] => {
-  const errors: string[] = []
-
-  if (!document.id && !document.typeId) {
-    errors.push('type de fichier manquant')
-  }
-
-  if (document.fichierNouveau && !document.fichierTypeId) {
-    errors.push('extension du fichier manquante')
-  }
-
-  const dateCheck = dateValidate(document.date)
-  if (!dateCheck.valid) {
-    errors.push(dateCheck.error)
-  }
-
-  return errors
-}
diff --git a/packages/api/src/business/validations/document-updation-validate.ts b/packages/api/src/business/validations/document-updation-validate.ts
deleted file mode 100644
index 9a77eb17d6cb7a33a576610803d4062f7a4dfec1..0000000000000000000000000000000000000000
--- a/packages/api/src/business/validations/document-updation-validate.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-import { dateValidate } from 'camino-common/src/date.js'
-import { IDocument } from '../../types.js'
-
-export const documentUpdationValidate = (document: IDocument): string[] => {
-  const errors: string[] = []
-
-  const dateCheck = dateValidate(document.date)
-
-  if (!dateCheck.valid) {
-    errors.push(dateCheck.error)
-  }
-
-  return errors
-}
diff --git a/packages/api/src/business/validations/titre-demarche-etat-validate.ts b/packages/api/src/business/validations/titre-demarche-etat-validate.ts
index e902ebb009f6f1ff8a5133f224df60a66a136d05..c140d4c31a5d1bfc7be72b2668912a8c696d3a2d 100644
--- a/packages/api/src/business/validations/titre-demarche-etat-validate.ts
+++ b/packages/api/src/business/validations/titre-demarche-etat-validate.ts
@@ -1,5 +1,5 @@
 // valide la date et la position de l'étape en fonction des autres étapes
-import { isNullOrUndefinedOrEmpty } from 'camino-common/src/typescript-tools.js'
+import { DeepReadonly, isNullOrUndefinedOrEmpty } from 'camino-common/src/typescript-tools.js'
 import type { ITitre, ITitreEtape } from '../../types.js'
 
 import { demarcheDefinitionFind } from '../rules-demarches/definitions.js'
@@ -8,21 +8,21 @@ import { titreEtapeTypeAndStatusValidate } from './titre-etape-type-and-status-v
 import { DemarcheId } from 'camino-common/src/demarche.js'
 import { DemarcheTypeId } from 'camino-common/src/static/demarchesTypes.js'
 
-const titreDemarcheEtapesBuild = <T extends Pick<Partial<ITitreEtape>, 'id'>>(titreEtape: T, suppression: boolean, titreDemarcheEtapes?: T[] | null): T[] => {
+const titreDemarcheEtapesBuild = <T extends Pick<Partial<ITitreEtape>, 'id'>>(titreEtape: DeepReadonly<T>, suppression: boolean, titreDemarcheEtapes?: DeepReadonly<T[]> | null): DeepReadonly<T[]> => {
   if (isNullOrUndefinedOrEmpty(titreDemarcheEtapes)) {
     return [titreEtape]
   }
 
   // si nous n’ajoutons pas une nouvelle étape
   // on supprime l’étape en cours de modification ou de suppression
-  const titreEtapes = titreDemarcheEtapes.reduce((acc: T[], te) => {
+  const titreEtapes = titreDemarcheEtapes.reduce((acc: DeepReadonly<T[]>, te) => {
     if (te.id !== titreEtape.id) {
-      acc.push(te)
+      acc = [...acc, te]
     }
 
     // modification
     if (!suppression && te.id === titreEtape.id) {
-      acc.push(titreEtape)
+      acc = [...acc, titreEtape]
     }
 
     return acc
@@ -30,7 +30,7 @@ const titreDemarcheEtapesBuild = <T extends Pick<Partial<ITitreEtape>, 'id'>>(ti
 
   // création
   if (!titreEtape.id) {
-    titreEtapes.push(titreEtape)
+    return [...titreEtapes, titreEtape]
   }
 
   return titreEtapes
diff --git a/packages/api/src/business/validations/titre-etape-updation-validate.test.ts b/packages/api/src/business/validations/titre-etape-updation-validate.test.ts
index e6bfac1d989aa5b203e55924092baa2ac3c5343b..213350276e13479a83b45db9c05639bd8c02adb9 100644
--- a/packages/api/src/business/validations/titre-etape-updation-validate.test.ts
+++ b/packages/api/src/business/validations/titre-etape-updation-validate.test.ts
@@ -19,7 +19,7 @@ describe('valide l’étape avant de l’enregistrer', () => {
       typeId: 'arm',
     } as unknown as ITitre
 
-    let errors = titreEtapeUpdationValidate(titreEtape, titreDemarche, titre, [], [], [], userSuper)
+    let errors = titreEtapeUpdationValidate(titreEtape, titreDemarche, titre, [], [], [], userSuper, null, null)
     expect(errors).not.toContain("une autorisation de recherche ne peut pas inclure d'amodiataires")
     expect(errors).not.toContain("une autorisation d'exploitation ne peut pas inclure d'amodiataires")
 
@@ -28,7 +28,7 @@ describe('valide l’étape avant de l’enregistrer', () => {
       amodiataires: [{ id: 'foo', nom: 'bar', operateur: true }],
     } as unknown as ITitreEtape
 
-    errors = titreEtapeUpdationValidate(titreEtape, titreDemarche, titre, [], [], [], userSuper)
+    errors = titreEtapeUpdationValidate(titreEtape, titreDemarche, titre, [], [], [], userSuper, null, null)
     expect(errors).toContain("une autorisation de recherche ne peut pas inclure d'amodiataires")
 
     // // AXM
@@ -42,7 +42,7 @@ describe('valide l’étape avant de l’enregistrer', () => {
       typeId: 'axm',
     } as unknown as ITitre
 
-    errors = titreEtapeUpdationValidate(titreEtape, titreDemarche, titre, [], [], [], userSuper)
+    errors = titreEtapeUpdationValidate(titreEtape, titreDemarche, titre, [], [], [], userSuper, null, null)
     expect(errors).not.toContain("une autorisation d'exploitation ne peut pas inclure d'amodiataires")
     expect(errors).not.toContain("une autorisation de recherche ne peut pas inclure d'amodiataires")
 
@@ -51,7 +51,7 @@ describe('valide l’étape avant de l’enregistrer', () => {
       amodiataires: [{ id: 'foo', nom: 'bar', operateur: true }],
     } as unknown as ITitreEtape
 
-    errors = titreEtapeUpdationValidate(titreEtape, titreDemarche, titre, [], [], [], userSuper)
+    errors = titreEtapeUpdationValidate(titreEtape, titreDemarche, titre, [], [], [], userSuper, null, null)
     expect(errors).toContain("une autorisation d'exploitation ne peut pas inclure d'amodiataires")
   })
 })
diff --git a/packages/api/src/business/validations/titre-etape-updation-validate.ts b/packages/api/src/business/validations/titre-etape-updation-validate.ts
index 655b7fe885e2132cb57f777a68b04e36d910a8bc..7d99e0a56964e641b342a24180616cb66f7d3266 100644
--- a/packages/api/src/business/validations/titre-etape-updation-validate.ts
+++ b/packages/api/src/business/validations/titre-etape-updation-validate.ts
@@ -1,4 +1,4 @@
-import { ITitreEtape, ITitreDemarche, ITitre, IDocument, ITitreEntreprise } from '../../types.js'
+import { ITitreEtape, ITitreDemarche, ITitre, ITitreEntreprise } from '../../types.js'
 
 import { titreDemarcheUpdatedEtatValidate } from './titre-demarche-etat-validate.js'
 import { heritageContenuValidate } from './utils/heritage-contenu-validate.js'
@@ -11,6 +11,7 @@ import { User } from 'camino-common/src/roles.js'
 import { SDOMZoneId } from 'camino-common/src/static/sdom.js'
 import { getSections } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sections.js'
 import { EntrepriseDocument } from 'camino-common/src/entreprise.js'
+import { EtapeDocument, GetEtapeDocumentsByEtapeIdAslDocument, GetEtapeDocumentsByEtapeIdDaeDocument } from 'camino-common/src/etape.js'
 const numberProps = ['duree', 'surface'] as unknown as [keyof ITitreEtape]
 
 const dateProps = ['date', 'dateDebut', 'dateFin'] as unknown as [keyof ITitreEtape]
@@ -19,13 +20,15 @@ export const titreEtapeUpdationValidate = (
   titreEtape: ITitreEtape,
   titreDemarche: ITitreDemarche,
   titre: ITitre,
-  documents: IDocument[] | null | undefined,
+  documents: Pick<EtapeDocument, 'etape_document_type_id'>[],
   entrepriseDocuments: Pick<EntrepriseDocument, 'entreprise_document_type_id'>[],
   sdomZones: SDOMZoneId[] | null | undefined,
   user: User,
+  daeDocument: Omit<GetEtapeDocumentsByEtapeIdDaeDocument, 'id'> | null,
+  aslDocument: Omit<GetEtapeDocumentsByEtapeIdAslDocument, 'id'> | null,
   titreEtapeOld?: ITitreEtape
 ) => {
-  const errors = []
+  const errors: string[] = []
 
   const sections = getSections(titre.typeId, titreDemarche.typeId, titreEtape.typeId)
 
@@ -106,7 +109,17 @@ export const titreEtapeUpdationValidate = (
 
   // 4. si l’étape n’est pas en cours de construction
   if (titreEtape.statutId !== 'aco') {
-    const etapeComplete = isEtapeComplete(titreEtape, titre.typeId, titreDemarche.typeId, documents, entrepriseDocuments, sdomZones)
+    const etapeComplete = isEtapeComplete(
+      { ...titreEtape, contenu: titreEtape.contenu ?? {} },
+      titre.typeId,
+      titreDemarche.typeId,
+      documents,
+      entrepriseDocuments,
+      sdomZones,
+      daeDocument,
+      aslDocument,
+      user
+    )
     if (!etapeComplete.valid) {
       errors.push(...etapeComplete.errors)
     }
diff --git a/packages/api/src/database/largeobjects.ts b/packages/api/src/database/largeobjects.ts
new file mode 100644
index 0000000000000000000000000000000000000000..9c5bd300627c4cce6377e132a5c08acc1e105b9a
--- /dev/null
+++ b/packages/api/src/database/largeobjects.ts
@@ -0,0 +1,45 @@
+import { TempDocumentName } from 'camino-common/src/document.js'
+import { createReadStream } from 'fs'
+import { join } from 'path'
+import { Pool } from 'pg'
+import { LargeObjectManager } from 'pg-large-object'
+import { z } from 'zod'
+
+const bufferSize = 16384
+
+export const largeObjectIdValidator = z.number().brand('LargeObjectId')
+export type LargeObjectId = z.infer<typeof largeObjectIdValidator>
+export const createLargeObject = async (pool: Pool, tmpFileName: TempDocumentName): Promise<LargeObjectId> => {
+  const client = await pool.connect()
+  try {
+    const man = new LargeObjectManager({ pg: client })
+
+    await client.query('BEGIN')
+
+    const [oid, stream] = await man.createAndWritableStreamAsync(bufferSize)
+
+    const promise = new Promise<LargeObjectId>((resolve, reject) => {
+      const pathFrom = join(process.cwd(), `/files/tmp/${tmpFileName}`)
+      const fileStream = createReadStream(pathFrom)
+      fileStream.on('error', function (e) {
+        reject(e)
+      })
+      fileStream.pipe(stream)
+      stream.on('finish', function () {
+        client.query('COMMIT')
+        resolve(largeObjectIdValidator.parse(oid))
+      })
+      stream.on('error', function (e) {
+        reject(e)
+      })
+    })
+
+    return await promise
+  } catch (e: any) {
+    await client.query('ROLLBACK')
+    console.error(e)
+    throw new Error('error during largeobject creation')
+  } finally {
+    client.release()
+  }
+}
diff --git a/packages/api/src/database/models/_format/id-create.test.ts b/packages/api/src/database/models/_format/id-create.test.ts
index 6901af319794b2e15b44fdbcb981974bd7f84ff7..0f03ba257ef92aca9c8076cbd4c992c29066cbde 100644
--- a/packages/api/src/database/models/_format/id-create.test.ts
+++ b/packages/api/src/database/models/_format/id-create.test.ts
@@ -1,5 +1,5 @@
 import { test, expect } from 'vitest'
-import { idGenerate, newDocumentId } from './id-create.js'
+import { idGenerate, newEtapeDocumentId } from './id-create.js'
 import { toCaminoDate } from 'camino-common/src/date.js'
 
 test('idGenerate', () => {
@@ -8,5 +8,5 @@ test('idGenerate', () => {
   expect(idGenerate(12)).toHaveLength(12)
 })
 test('newDocumentId', () => {
-  expect(newDocumentId(toCaminoDate('2023-01-01'), 'aac')).toHaveLength(23)
+  expect(newEtapeDocumentId(toCaminoDate('2023-01-01'), 'aac')).toHaveLength(23)
 })
diff --git a/packages/api/src/database/models/_format/id-create.ts b/packages/api/src/database/models/_format/id-create.ts
index c29b73d8baa4c46924bde91478d73c5f75278a22..34cc81ebdbdecdd621515bfeb4ceefd809c637cf 100644
--- a/packages/api/src/database/models/_format/id-create.ts
+++ b/packages/api/src/database/models/_format/id-create.ts
@@ -1,10 +1,10 @@
 import { DemarcheId } from 'camino-common/src/demarche.js'
 import { CaminoDate } from 'camino-common/src/date.js'
-import { DocumentId, EntrepriseDocumentId, documentIdValidator, entrepriseDocumentIdValidator } from 'camino-common/src/entreprise.js'
+import { EntrepriseDocumentId, entrepriseDocumentIdValidator } from 'camino-common/src/entreprise.js'
 import { ActiviteDocumentTypeId, DocumentTypeId } from 'camino-common/src/static/documentsTypes.js'
 import { randomBytes } from 'node:crypto'
 import { TitreId } from 'camino-common/src/validators/titres.js'
-import { EtapeId } from 'camino-common/src/etape.js'
+import { EtapeDocumentId, EtapeId, etapeDocumentIdValidator } from 'camino-common/src/etape.js'
 import { UtilisateurId } from 'camino-common/src/roles.js'
 import { ActiviteDocumentId, activiteDocumentIdValidator } from 'camino-common/src/activite.js'
 
@@ -36,10 +36,10 @@ export const newActiviteDocumentId = (date: CaminoDate, activiteDocumentTypeId:
   return activiteDocumentIdValidator.parse(`${date}-${activiteDocumentTypeId}-${hash}`)
 }
 
-export const newDocumentId = (date: CaminoDate, documentTypeId: DocumentTypeId): DocumentId => {
+export const newEtapeDocumentId = (date: CaminoDate, documentTypeId: DocumentTypeId): EtapeDocumentId => {
   const hash = idGenerate(8)
 
-  return documentIdValidator.parse(`${date}-${documentTypeId}-${hash}`)
+  return etapeDocumentIdValidator.parse(`${date}-${documentTypeId}-${hash}`)
 }
 
 export const newUtilisateurId = (value: string = idGenerate(6)): UtilisateurId => {
diff --git a/packages/api/src/database/models/documents.ts b/packages/api/src/database/models/documents.ts
deleted file mode 100644
index 62a5e118e0803f0e870456ec45ad52f110bbf8dd..0000000000000000000000000000000000000000
--- a/packages/api/src/database/models/documents.ts
+++ /dev/null
@@ -1,59 +0,0 @@
-import { Model, Pojo } from 'objection'
-
-import { IDocument } from '../../types.js'
-import TitresEtapes from './titres-etapes.js'
-
-interface Document extends IDocument {}
-class Document extends Model {
-  public static tableName = 'documents'
-
-  public static jsonSchema = {
-    type: 'object',
-    required: ['id', 'typeId', 'date'],
-
-    properties: {
-      id: { type: 'string' },
-      typeId: { type: 'string' },
-      date: { type: 'string' },
-      titreEtapeId: { type: ['string', 'null'] },
-      description: { type: ['string', 'null'] },
-      fichier: { type: ['boolean', 'null'] },
-      fichierTypeId: { type: ['string', 'null'] },
-      publicLecture: { type: ['boolean', 'null'] },
-      entreprisesLecture: { type: ['boolean', 'null'] },
-    },
-  }
-
-  static relationMappings = () => ({
-    etape: {
-      relation: Model.HasOneRelation,
-      modelClass: TitresEtapes,
-      join: {
-        from: 'documents.titreEtapeId',
-        to: 'titresEtapes.id',
-      },
-    },
-  })
-
-  public $formatDatabaseJson(json: Pojo): Pojo {
-    delete json.modification
-    delete json.suppression
-    delete json.fichierNouveau
-    delete json.nomTemporaire
-    json = super.$formatDatabaseJson(json)
-
-    return json
-  }
-
-  public $parseJson(json: Pojo): Pojo {
-    delete json.modification
-    delete json.suppression
-    delete json.fichierNouveau
-    delete json.nomTemporaire
-    json = super.$parseJson(json)
-
-    return json
-  }
-}
-
-export default Document
diff --git a/packages/api/src/database/models/titres-etapes.ts b/packages/api/src/database/models/titres-etapes.ts
index d3a9a138f19136422d76ffb2ee6bc106a46605ce..3ca3cc48f84cf3856c7d70e8027196d2792d0247 100644
--- a/packages/api/src/database/models/titres-etapes.ts
+++ b/packages/api/src/database/models/titres-etapes.ts
@@ -8,7 +8,6 @@ import { heritagePropsFormat, heritageContenuFormat } from './_format/titre-etap
 import { idGenerate } from './_format/id-create.js'
 import TitresDemarches from './titres-demarches.js'
 import Entreprises from './entreprises.js'
-import Document from './documents.js'
 import Journaux from './journaux.js'
 import { etapeSlugValidator } from 'camino-common/src/etape.js'
 import { isNotNullNorUndefined } from 'camino-common/src/typescript-tools.js'
@@ -41,8 +40,6 @@ class TitresEtapes extends Model {
       contenu: { type: ['object', 'null'] },
       heritageContenu: { type: ['object', 'null'] },
       heritageProps: { type: ['object', 'null'] },
-      decisionsAnnexesSections: {},
-      decisionsAnnexesContenu: { type: ['object', 'null'] },
       archive: { type: 'boolean' },
       substances: { type: ['array', 'null'] },
       communes: { type: ['array', 'null'] },
@@ -92,15 +89,6 @@ class TitresEtapes extends Model {
         to: 'entreprises.id',
       },
     },
-
-    documents: {
-      relation: Model.HasManyRelation,
-      modelClass: Document,
-      join: {
-        from: 'titresEtapes.id',
-        to: 'documents.titreEtapeId',
-      },
-    },
     journaux: {
       relation: Model.HasManyRelation,
       modelClass: Journaux,
diff --git a/packages/api/src/database/queries/_options.ts b/packages/api/src/database/queries/_options.ts
index f1d7cf7d61c54b7342e9ac56401cca5e394ad34f..639fadb165f30ea86804e508b4d6d4385e82b5fd 100644
--- a/packages/api/src/database/queries/_options.ts
+++ b/packages/api/src/database/queries/_options.ts
@@ -1,15 +1,3 @@
-const documentsRelateTrue: string[] = []
-const documentsRelateFalse: string[] = []
-
-const documents = {
-  graph: ``,
-  update: {
-    insertMissing: true,
-    relate: documentsRelateTrue,
-    unrelate: documentsRelateFalse,
-  },
-}
-
 const entreprisesEtablissements = {
   update: { insertMissing: true },
 }
@@ -43,11 +31,10 @@ const utilisateursTitres = {
 
 const titresEtapesRelateTrue = ['titulaires', 'amodiataires']
 
-const titresEtapesRelateFalse = ['titulaires.etablissements', 'titulaires.utilisateurs', 'amodiataires.etablissements', 'amodiataires.utilisateurs', `documents`]
+const titresEtapesRelateFalse = ['titulaires.etablissements', 'titulaires.utilisateurs', 'amodiataires.etablissements', 'amodiataires.utilisateurs']
 
 const titresEtapes = {
   graph: `[
-    documents,
     titulaires.${entreprises.graph},
     amodiataires.${entreprises.graph}
   ]`,
@@ -129,7 +116,6 @@ const journaux = {
 }
 
 export default {
-  documents,
   entreprises,
   entreprisesEtablissements,
   titres,
@@ -149,9 +135,6 @@ export type FieldsEntreprise = FieldId & {
   amodiataireTitres?: FieldId
 }
 
-export type FieldsDocument = FieldId & {
-  etape?: FieldsEtape
-}
 export type FieldsUtilisateur = FieldId & {
   entreprises?: FieldsEntreprise
 }
@@ -181,7 +164,6 @@ export type FieldsEtape = FieldId & {
   titulaires?: FieldsEntreprise
   amodiataires?: FieldsEntreprise
   demarche?: FieldsDemarche
-  documents?: FieldsDocument
 }
 
 export type FieldsActivite = FieldId & {
diff --git a/packages/api/src/database/queries/documents.ts b/packages/api/src/database/queries/documents.ts
deleted file mode 100644
index c4cea45ca36f78bdec34963712df75e3ead6694f..0000000000000000000000000000000000000000
--- a/packages/api/src/database/queries/documents.ts
+++ /dev/null
@@ -1,47 +0,0 @@
-import { Transaction } from 'objection'
-
-import { IDocument } from '../../types.js'
-
-import options, { FieldsDocument } from './_options.js'
-import graphBuild from './graph/build.js'
-import { fieldsFormat } from './graph/fields-format.js'
-
-import Document from '../models/documents.js'
-import { documentsQueryModify } from './permissions/documents.js'
-import { User } from 'camino-common/src/roles'
-import { DocumentId } from 'camino-common/src/entreprise.js'
-
-export const documentGet = async (documentId: string, { fields }: { fields?: FieldsDocument }, user: User): Promise<IDocument | null> => {
-  const graph = fields ? graphBuild(fields, 'documents', fieldsFormat) : options.documents.graph
-
-  const q = Document.query().withGraphFetched(graph)
-
-  documentsQueryModify(q, user)
-
-  const document = await q.findById(documentId)
-
-  return document as IDocument | null
-}
-
-export const documentsGet = async ({ ids }: { ids?: string[] }, { fields }: { fields?: FieldsDocument }, user: User) => {
-  const graph = fields ? graphBuild(fields, 'documents', fieldsFormat) : options.documents.graph
-
-  const q = Document.query().withGraphFetched(graph)
-
-  if (ids?.length) {
-    q.whereIn('documents.id', ids)
-  }
-
-  documentsQueryModify(q, user)
-
-  return q
-}
-
-export const documentCreate = async (document: IDocument, tr?: Transaction) => Document.query(tr).withGraphFetched(options.documents.graph).insertAndFetch(document)
-
-export const documentUpdate = async (id: DocumentId, props: Partial<IDocument>) =>
-  Document.query()
-    .withGraphFetched(options.documents.graph)
-    .patchAndFetchById(id, { ...props, id })
-
-export const documentDelete = async (id: string, tr?: Transaction) => Document.query(tr).deleteById(id).withGraphFetched(options.documents.graph).returning('*')
diff --git a/packages/api/src/database/queries/graph/fields-format.ts b/packages/api/src/database/queries/graph/fields-format.ts
index 7f482e7bd64ea3297c11fb2f37287f220fca7921..89062deb8752a94212b77be868cc65f86fbbe915 100644
--- a/packages/api/src/database/queries/graph/fields-format.ts
+++ b/packages/api/src/database/queries/graph/fields-format.ts
@@ -64,10 +64,6 @@ export const fieldsFormat = (fields: IFields, parent: string) => {
 
   // pour calculer la propriété « déposable » sur les étapes
   if (['etapes', 'etape'].includes(parent)) {
-    if (!fields.documents) {
-      fields.documents = { id: {} }
-    }
-
     if (!fields.demarche) {
       fields.demarche = { id: {} }
     }
diff --git a/packages/api/src/database/queries/permissions/documents.test.integration.ts b/packages/api/src/database/queries/permissions/documents.test.integration.ts
deleted file mode 100644
index b4fb1dec8a9f4c776cc7571af400d253d58fdacc..0000000000000000000000000000000000000000
--- a/packages/api/src/database/queries/permissions/documents.test.integration.ts
+++ /dev/null
@@ -1,63 +0,0 @@
-import { dbManager } from '../../../../tests/db-manager.js'
-
-import { userSuper } from '../../user-super.js'
-
-import TitresEtapes from '../../models/titres-etapes.js'
-import Document from '../../models/documents.js'
-
-import { documentCreate, documentGet } from '../documents.js'
-import { Knex } from 'knex'
-import { newDemarcheId, newDocumentId, newEtapeId } from '../../models/_format/id-create.js'
-import { toCaminoDate } from 'camino-common/src/date.js'
-import { expect, test, describe, afterAll, beforeAll, vi } from 'vitest'
-import { EtapeStatutId } from 'camino-common/src/static/etapesStatuts.js'
-
-console.info = vi.fn()
-console.error = vi.fn()
-let knex: Knex<any, unknown[]>
-beforeAll(async () => {
-  const { knex: knexInstance } = await dbManager.populateDb()
-  knex = knexInstance
-})
-
-afterAll(async () => {
-  await dbManager.closeKnex()
-})
-
-describe('documentSupprimer', () => {
-  test.each<[EtapeStatutId, boolean]>([
-    ['aco', true],
-    ['fai', false],
-  ])('vérifie la possibilité de supprimer un document optionnel ou non d’une étape (utilisateur super)', async (statutId, suppression) => {
-    // suppression de la clé étrangère sur la démarche pour ne pas avoir à tout créer
-    await TitresEtapes.query().delete()
-    await Document.query().delete()
-    await knex.schema.alterTable(TitresEtapes.tableName, table => {
-      table.dropColumns('titreDemarcheId')
-    })
-
-    await knex.schema.alterTable(TitresEtapes.tableName, table => {
-      table.string('titreDemarcheId').index().notNullable()
-    })
-
-    await TitresEtapes.query().insertGraph({
-      id: newEtapeId('titreEtapeId'),
-      typeId: 'dpu',
-      titreDemarcheId: newDemarcheId('titreDemarcheId'),
-      date: toCaminoDate('2022-01-01'),
-      statutId,
-    })
-
-    const documentId = newDocumentId(toCaminoDate('2023-01-12'), 'dec')
-    await documentCreate({
-      id: documentId,
-      typeId: 'dec',
-      date: toCaminoDate('2023-01-12'),
-      titreEtapeId: newEtapeId('titreEtapeId'),
-    })
-
-    const documentRes = await documentGet(documentId, {}, userSuper)
-
-    expect(documentRes?.suppression).toBe(suppression)
-  })
-})
diff --git a/packages/api/src/database/queries/permissions/documents.ts b/packages/api/src/database/queries/permissions/documents.ts
deleted file mode 100644
index 2461c22e6a8ae302704b9e78eb7850b5b7e09866..0000000000000000000000000000000000000000
--- a/packages/api/src/database/queries/permissions/documents.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-import { QueryBuilder, raw } from 'objection'
-
-import Documents from '../../models/documents.js'
-import { isBureauDEtudes, isDefault, isEntreprise, User } from 'camino-common/src/roles.js'
-import TitresEtapes from '../../models/titres-etapes.js'
-
-export const documentsQueryModify = (q: QueryBuilder<Documents, Documents | Documents[]>, user: User) => {
-  q.select('documents.*')
-
-  if (isEntreprise(user) || isBureauDEtudes(user)) {
-    // repertoire = etapes
-    q.leftJoinRelated('etape.demarche.titre.[titulaires, amodiataires]')
-  }
-
-  if (isDefault(user) || isEntreprise(user) || isBureauDEtudes(user)) {
-    q.where(b => {
-      b.orWhere('documents.publicLecture', true)
-
-      // autorise à voir les docs temporaires
-      b.orWhereNull('documents.titreEtapeId')
-
-      if (isEntreprise(user) || isBureauDEtudes(user)) {
-        b.orWhere(c => {
-          c.where('documents.entreprisesLecture', true)
-
-          // si l'utilisateur est `entreprise`,
-          // titres dont il est titulaire ou amodiataire
-          const entreprisesIds = user.entreprises.map(e => e.id) ?? []
-
-          c.where(d => {
-            d.orWhereIn('etape:demarche:titre:titulaires.id', entreprisesIds)
-            d.orWhereIn('etape:demarche:titre:amodiataires.id', entreprisesIds)
-          })
-        })
-      }
-    })
-  }
-
-  q.select(raw('(not exists(?))', [etapeStatutNotAco()]).as('suppression'))
-}
-const etapeStatutNotAco = () => TitresEtapes.query().whereRaw('?? = ??', ['id', 'documents.titreEtapeId']).andWhereRaw('?? != ?', ['titresEtapes.statutId', 'aco'])
diff --git a/packages/api/src/database/queries/permissions/titres-etapes.ts b/packages/api/src/database/queries/permissions/titres-etapes.ts
index 1b2b9bcc98008c164340377fb7aeb17fc9c59c58..57e9944c058a84dd86df70d18bfea639ee94cedd 100644
--- a/packages/api/src/database/queries/permissions/titres-etapes.ts
+++ b/packages/api/src/database/queries/permissions/titres-etapes.ts
@@ -1,10 +1,8 @@
 import { QueryBuilder } from 'objection'
 
-import Documents from '../../models/documents.js'
 import TitresEtapes from '../../models/titres-etapes.js'
 import Entreprises from '../../models/entreprises.js'
 
-import { documentsQueryModify } from './documents.js'
 import { administrationsTitresQuery } from './administrations.js'
 import { entreprisesQueryModify, entreprisesTitresQuery } from './entreprises.js'
 import { titresDemarchesQueryModify } from './titres-demarches.js'
@@ -72,10 +70,6 @@ export const titresEtapesQueryModify = (q: QueryBuilder<TitresEtapes, TitresEtap
     titresDemarchesQueryModify(b as QueryBuilder<TitresDemarches, TitresDemarches | TitresDemarches[]>, user)
   })
 
-  q.modifyGraph('documents', b => {
-    documentsQueryModify(b as QueryBuilder<Documents, Documents | Documents[]>, user)
-  })
-
   q.modifyGraph('titulaires', b => {
     entreprisesQueryModify(b as QueryBuilder<Entreprises, Entreprises | Entreprises[]>, user).select('titresTitulaires.operateur')
   })
diff --git a/packages/api/src/database/queries/titres-etapes.queries.ts b/packages/api/src/database/queries/titres-etapes.queries.ts
index 0138522e841bdf9d882e92117d3e3793a4f2b034..a54b132e514d1fa3fd48a6f3b8881968a6b2bc13 100644
--- a/packages/api/src/database/queries/titres-etapes.queries.ts
+++ b/packages/api/src/database/queries/titres-etapes.queries.ts
@@ -9,8 +9,12 @@ import {
   IGetAmodiatairesByEtapeIdQueryDbQuery,
   IInsertTitreEtapeEntrepriseDocumentInternalQuery,
   IGetDocumentsByEtapeIdQueryQuery,
+  IInsertEtapeDocumentDbQuery,
+  IDeleteEtapeDocumentsDbQuery,
+  IUpdateEtapeDocumentFileDbQuery,
+  IUpdateEtapeDocumentInfoDbQuery,
 } from './titres-etapes.queries.types.js'
-import { EtapeDocument, etapeDocumentValidator, EtapeId } from 'camino-common/src/etape.js'
+import { EtapeDocument, EtapeDocumentId, EtapeDocumentModification, etapeDocumentValidator, EtapeDocumentWithFileModification, EtapeId, TempEtapeDocument } from 'camino-common/src/etape.js'
 import { EntrepriseDocumentId, entrepriseDocumentValidator, EntrepriseId, EtapeEntrepriseDocument, etapeEntrepriseDocumentValidator } from 'camino-common/src/entreprise.js'
 import { EntreprisesByEtapeId, entreprisesByEtapeIdValidator } from 'camino-common/src/demarche.js'
 import { Pool } from 'pg'
@@ -22,8 +26,13 @@ import { canReadDocument } from '../../api/rest/permissions/documents.js'
 import { AdministrationId } from 'camino-common/src/static/administrations.js'
 import { EtapeTypeId } from 'camino-common/src/static/etapesTypes.js'
 import { TitreTypeId } from 'camino-common/src/static/titresTypes.js'
-import { SimplePromiseFn } from 'camino-common/src/typescript-tools.js'
+import { isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty, SimplePromiseFn } from 'camino-common/src/typescript-tools.js'
 import { CanReadDemarche } from '../../api/rest/permissions/demarches.js'
+import { newEtapeDocumentId } from '../models/_format/id-create.js'
+import { getCurrent } from 'camino-common/src/date.js'
+import { createLargeObject, LargeObjectId } from '../largeobjects.js'
+import { EtapeStatutId } from 'camino-common/src/static/etapesStatuts.js'
+import { canDeleteEtapeDocument } from 'camino-common/src/permissions/titres-etapes.js'
 
 export const insertTitreEtapeEntrepriseDocument = async (pool: Pool, params: { titre_etape_id: EtapeId; entreprise_document_id: EntrepriseDocumentId }) =>
   dbQueryAndValidate(insertTitreEtapeEntrepriseDocumentInternal, params, pool, z.void())
@@ -83,6 +92,77 @@ export const getEntrepriseDocumentLargeObjectIdsByEtapeId = async (params: { tit
   return result.filter(r => canSeeEntrepriseDocuments(user, r.entreprise_id))
 }
 
+export const updateEtapeDocuments = async (pool: Pool, _user: User, titre_etape_id: EtapeId, etapeStatutId: EtapeStatutId, etapeDocuments: EtapeDocumentModification[]) => {
+  const documentsInDb = await dbQueryAndValidate(getDocumentsByEtapeIdQuery, { titre_etape_id }, pool, getDocumentsByEtapeIdQueryValidator)
+
+  const etapeDocumentToUpdate = etapeDocuments.filter((document): document is EtapeDocumentWithFileModification => 'id' in document)
+  const etapeDocumentIdsToUpdate = etapeDocumentToUpdate.map(({ id }) => id)
+  const toDeleteDocuments = documentsInDb.filter(({ id }) => !etapeDocumentIdsToUpdate.includes(id))
+  const toInsertDocuments = etapeDocuments.filter((document): document is TempEtapeDocument => !('id' in document))
+
+  if (isNotNullNorUndefinedNorEmpty(etapeDocumentToUpdate)) {
+    for (const documentToUpdate of etapeDocumentToUpdate) {
+      if (isNotNullNorUndefined(documentToUpdate.temp_document_name)) {
+        const largeobject_id = await createLargeObject(pool, documentToUpdate.temp_document_name)
+        await dbQueryAndValidate(updateEtapeDocumentFileDb, { id: documentToUpdate.id, largeobject_id }, pool, z.void())
+      }
+      await dbQueryAndValidate(
+        updateEtapeDocumentInfoDb,
+        { id: documentToUpdate.id, public_lecture: documentToUpdate.public_lecture, entreprises_lecture: documentToUpdate.entreprises_lecture, description: documentToUpdate.description },
+        pool,
+        z.void()
+      )
+    }
+  }
+  if (isNotNullNorUndefinedNorEmpty(toInsertDocuments)) {
+    await insertEtapeDocuments(pool, titre_etape_id, toInsertDocuments)
+  }
+  if (isNotNullNorUndefinedNorEmpty(toDeleteDocuments)) {
+    if (!canDeleteEtapeDocument(etapeStatutId)) {
+      throw new Error('Impossible de supprimer les documents')
+    }
+
+    await dbQueryAndValidate(deleteEtapeDocumentsDb, { ids: toDeleteDocuments.map(({ id }) => id) }, pool, z.void())
+  }
+}
+const updateEtapeDocumentFileDb = sql<Redefine<IUpdateEtapeDocumentFileDbQuery, { id: EtapeDocumentId; largeobject_id: LargeObjectId }, void>>`
+update
+    etapes_documents
+set
+    largeobject_id = $ largeobject_id !
+where
+    id = $ id !
+`
+const updateEtapeDocumentInfoDb = sql<Redefine<IUpdateEtapeDocumentInfoDbQuery, { id: EtapeDocumentId; public_lecture: boolean; entreprises_lecture: boolean; description: string | null }, void>>`
+update
+    etapes_documents
+set
+    public_lecture = $ public_lecture !,
+    entreprises_lecture = $ entreprises_lecture !,
+    description = $ description
+where
+    id = $ id !
+`
+const deleteEtapeDocumentsDb = sql<Redefine<IDeleteEtapeDocumentsDbQuery, { ids: EtapeDocumentId[] }, void>>`
+delete from etapes_documents
+where id in $$ ids !
+`
+
+export const insertEtapeDocuments = async (pool: Pool, titre_etape_id: EtapeId, etapeDocuments: TempEtapeDocument[]) => {
+  for (const document of etapeDocuments) {
+    const id = newEtapeDocumentId(getCurrent(), document.etape_document_type_id)
+    const largeobject_id = await createLargeObject(pool, document.temp_document_name)
+    await dbQueryAndValidate(insertEtapeDocumentDb, { ...document, etape_id: titre_etape_id, id, largeobject_id }, pool, z.void())
+  }
+}
+
+const insertEtapeDocumentDb = sql<
+  Redefine<IInsertEtapeDocumentDbQuery, { etape_id: EtapeId; id: EtapeDocumentId; largeobject_id: LargeObjectId } & Omit<TempEtapeDocument, 'temp_document_name'>, void>
+>`
+insert into etapes_documents (id, etape_document_type_id, etape_id, description, public_lecture, entreprises_lecture, largeobject_id)
+    values ($ id !, $ etape_document_type_id !, $ etape_id !, $ description, $ public_lecture !, $ entreprises_lecture !, $ largeobject_id !)
+`
+
 export const getTitulairesByEtapeIdQuery = async (etapeId: EtapeId, pool: Pool): Promise<EntreprisesByEtapeId[]> => {
   return dbQueryAndValidate(getTitulairesByEtapeIdQueryDb, { etapeId }, pool, entreprisesByEtapeIdValidator)
 }
@@ -114,21 +194,25 @@ from
 where
     tt.titre_etape_id = $ etapeId !
 `
+const etapeDocumentLargeObjectIdValidator = z.number().brand('EtapeDocumentLargeObjectId')
 
-const getDocumentsByEtapeIdQuery = sql<Redefine<IGetDocumentsByEtapeIdQueryQuery, { titre_etape_id: EtapeId }, EtapeDocument>>`
+const getDocumentsByEtapeIdQueryValidator = etapeDocumentValidator.extend({ largeobject_id: etapeDocumentLargeObjectIdValidator })
+type GetDocumentsByEtapeIdQuery = z.infer<typeof getDocumentsByEtapeIdQueryValidator>
+
+const getDocumentsByEtapeIdQuery = sql<Redefine<IGetDocumentsByEtapeIdQueryQuery, { titre_etape_id: EtapeId }, GetDocumentsByEtapeIdQuery>>`
 select
     d.id,
-    d.type_id as document_type_id,
+    d.etape_document_type_id,
     d.description,
-    public_lecture,
-    entreprises_lecture
+    d.public_lecture,
+    d.entreprises_lecture,
+    d.largeobject_id
 from
-    documents d
+    etapes_documents d
 where
-    d.titre_etape_id = $ titre_etape_id !
+    d.etape_id = $ titre_etape_id !
 `
-
-export const getDocumentsByEtapeId = async (
+export const getEtapeDocumentLargeObjectIdsByEtapeId = async (
   titre_etape_id: EtapeId,
   pool: Pool,
   user: User,
@@ -137,10 +221,10 @@ export const getDocumentsByEtapeId = async (
   entreprisesTitulairesOuAmodiataires: SimplePromiseFn<EntrepriseId[]>,
   etapeTypeId: EtapeTypeId,
   demarche: CanReadDemarche
-): Promise<EtapeDocument[]> => {
-  const result = await dbQueryAndValidate(getDocumentsByEtapeIdQuery, { titre_etape_id }, pool, etapeDocumentValidator)
+): Promise<GetDocumentsByEtapeIdQuery[]> => {
+  const result = await dbQueryAndValidate(getDocumentsByEtapeIdQuery, { titre_etape_id }, pool, getDocumentsByEtapeIdQueryValidator)
 
-  const filteredDocuments: EtapeDocument[] = []
+  const filteredDocuments: GetDocumentsByEtapeIdQuery[] = []
 
   for (const document of result) {
     if (await canReadDocument(document, user, titreTypeId, titresAdministrationsLocales, entreprisesTitulairesOuAmodiataires, etapeTypeId, demarche)) {
@@ -150,3 +234,18 @@ export const getDocumentsByEtapeId = async (
 
   return filteredDocuments
 }
+
+export const getDocumentsByEtapeId = async (
+  titre_etape_id: EtapeId,
+  pool: Pool,
+  user: User,
+  titreTypeId: SimplePromiseFn<TitreTypeId>,
+  titresAdministrationsLocales: SimplePromiseFn<AdministrationId[]>,
+  entreprisesTitulairesOuAmodiataires: SimplePromiseFn<EntrepriseId[]>,
+  etapeTypeId: EtapeTypeId,
+  demarche: CanReadDemarche
+): Promise<EtapeDocument[]> => {
+  const result = await getEtapeDocumentLargeObjectIdsByEtapeId(titre_etape_id, pool, user, titreTypeId, titresAdministrationsLocales, entreprisesTitulairesOuAmodiataires, etapeTypeId, demarche)
+
+  return z.array(etapeDocumentValidator).parse(result)
+}
diff --git a/packages/api/src/database/queries/titres-etapes.queries.types.ts b/packages/api/src/database/queries/titres-etapes.queries.types.ts
index a9eadf3de19be1507f65e0f70542b2ffb40b8d6f..b20c43a58d1948c6220d1517c03c8670852a225f 100644
--- a/packages/api/src/database/queries/titres-etapes.queries.types.ts
+++ b/packages/api/src/database/queries/titres-etapes.queries.types.ts
@@ -68,6 +68,72 @@ export interface IGetEntrepriseDocumentLargeObjectIdsByEtapeIdQueryQuery {
   result: IGetEntrepriseDocumentLargeObjectIdsByEtapeIdQueryResult;
 }
 
+/** 'UpdateEtapeDocumentFileDb' parameters type */
+export interface IUpdateEtapeDocumentFileDbParams {
+  id: string;
+  largeobject_id: number;
+}
+
+/** 'UpdateEtapeDocumentFileDb' return type */
+export type IUpdateEtapeDocumentFileDbResult = void;
+
+/** 'UpdateEtapeDocumentFileDb' query type */
+export interface IUpdateEtapeDocumentFileDbQuery {
+  params: IUpdateEtapeDocumentFileDbParams;
+  result: IUpdateEtapeDocumentFileDbResult;
+}
+
+/** 'UpdateEtapeDocumentInfoDb' parameters type */
+export interface IUpdateEtapeDocumentInfoDbParams {
+  description?: string | null | void;
+  entreprises_lecture: boolean;
+  id: string;
+  public_lecture: boolean;
+}
+
+/** 'UpdateEtapeDocumentInfoDb' return type */
+export type IUpdateEtapeDocumentInfoDbResult = void;
+
+/** 'UpdateEtapeDocumentInfoDb' query type */
+export interface IUpdateEtapeDocumentInfoDbQuery {
+  params: IUpdateEtapeDocumentInfoDbParams;
+  result: IUpdateEtapeDocumentInfoDbResult;
+}
+
+/** 'DeleteEtapeDocumentsDb' parameters type */
+export interface IDeleteEtapeDocumentsDbParams {
+  ids: readonly (string)[];
+}
+
+/** 'DeleteEtapeDocumentsDb' return type */
+export type IDeleteEtapeDocumentsDbResult = void;
+
+/** 'DeleteEtapeDocumentsDb' query type */
+export interface IDeleteEtapeDocumentsDbQuery {
+  params: IDeleteEtapeDocumentsDbParams;
+  result: IDeleteEtapeDocumentsDbResult;
+}
+
+/** 'InsertEtapeDocumentDb' parameters type */
+export interface IInsertEtapeDocumentDbParams {
+  description?: string | null | void;
+  entreprises_lecture: boolean;
+  etape_document_type_id: string;
+  etape_id: string;
+  id: string;
+  largeobject_id: number;
+  public_lecture: boolean;
+}
+
+/** 'InsertEtapeDocumentDb' return type */
+export type IInsertEtapeDocumentDbResult = void;
+
+/** 'InsertEtapeDocumentDb' query type */
+export interface IInsertEtapeDocumentDbQuery {
+  params: IInsertEtapeDocumentDbParams;
+  result: IInsertEtapeDocumentDbResult;
+}
+
 /** 'GetTitulairesByEtapeIdQueryDb' parameters type */
 export interface IGetTitulairesByEtapeIdQueryDbParams {
   etapeId: string;
@@ -111,10 +177,11 @@ export interface IGetDocumentsByEtapeIdQueryParams {
 
 /** 'GetDocumentsByEtapeIdQuery' return type */
 export interface IGetDocumentsByEtapeIdQueryResult {
-  description: string;
-  document_type_id: string;
+  description: string | null;
   entreprises_lecture: boolean;
+  etape_document_type_id: string;
   id: string;
+  largeobject_id: number | null;
   public_lecture: boolean;
 }
 
diff --git a/packages/api/src/knex/config.ts b/packages/api/src/knex/config.ts
index 5f530efd040d627fb029a742a74abfd5f0550f87..d894d4fecdae53c32de55c2d8aca89dce565a3f4 100644
--- a/packages/api/src/knex/config.ts
+++ b/packages/api/src/knex/config.ts
@@ -13,7 +13,7 @@ const connection = {
   password: config().PGPASSWORD,
 }
 
-export const simpleKnexConfig = {
+const simpleKnexConfig = {
   client: 'pg',
   connection,
   migrations: {
diff --git a/packages/api/src/knex/migrations/20240320132136_add_etape-document.ts b/packages/api/src/knex/migrations/20240320132136_add_etape-document.ts
new file mode 100644
index 0000000000000000000000000000000000000000..d672c7fa4512b3d46425431c3f56c9b09f1f2776
--- /dev/null
+++ b/packages/api/src/knex/migrations/20240320132136_add_etape-document.ts
@@ -0,0 +1,34 @@
+/* eslint-disable no-restricted-syntax */
+/* eslint-disable sql/no-unsafe-query */
+import { EtapeId } from 'camino-common/src/etape'
+import { Knex } from 'knex'
+
+export const up = async (knex: Knex) => {
+  // TODO 20-03-2024 rendre largeobject_id not null après la migration
+  // await knex.raw('ALTER TABLE etapes_documents ALTER COLUMN largeobject_id SET NOT NULL')
+
+  await knex.raw(
+    'CREATE TABLE etapes_documents (id character varying(255) NOT NULL, etape_document_type_id character varying(3) NOT NULL, etape_id character varying(255) NOT NULL, description character varying(1024), public_lecture boolean NOT NULL, entreprises_lecture boolean NOT NULL, largeobject_id oid)'
+  )
+  await knex.raw('ALTER TABLE etapes_documents ADD CONSTRAINT etapes_documents_pk PRIMARY KEY (id)')
+  await knex.raw('ALTER TABLE etapes_documents ADD CONSTRAINT etapes_documents_fk FOREIGN KEY (etape_id) REFERENCES titres_etapes(id);')
+
+  await knex.raw(
+    'insert into etapes_documents (id, etape_document_type_id, etape_id, description, public_lecture, entreprises_lecture) (SELECT id, type_id as etape_document_type_id, titre_etape_id, description, public_lecture, entreprises_lecture from documents where titre_etape_id is not null and fichier is not null and fichier_type_id is not null)'
+  )
+
+  const result: { rows: { titre_etape_id: EtapeId; description: string }[] } = await knex.raw(
+    'SELECT titre_etape_id, description from documents where titre_etape_id is null or fichier is null or fichier_type_id is  null'
+  )
+
+  for (const document of result.rows) {
+    await knex.raw(`update titres_etapes set notes = concat(notes, '${document.description.replace(/'/g, '’')}') where id = '${document.titre_etape_id}'`)
+  }
+
+  await knex.raw('ALTER TABLE titres_etapes DROP column decisions_annexes_sections')
+  await knex.raw('ALTER TABLE titres_etapes DROP column decisions_annexes_contenu')
+
+  await knex.schema.dropTable('documents')
+}
+
+export const down = () => ({})
diff --git a/packages/api/src/scripts/daily.ts b/packages/api/src/scripts/daily.ts
index d1bfcca5aea272f18f4ebec52363d22e9b112ab4..794d43ff2c8c60ee9b69e47ddf1b1b696293f42b 100644
--- a/packages/api/src/scripts/daily.ts
+++ b/packages/api/src/scripts/daily.ts
@@ -1,10 +1,8 @@
 import '../init.js'
 import { daily } from '../business/daily.js'
-import { documentsCheck } from '../tools/documents/check.js'
 import { consoleOverride } from '../config/logger.js'
 import { mailjetSend } from '../tools/api-mailjet/emails.js'
 import { readFileSync, writeFileSync, createWriteStream } from 'fs'
-import { documentsClean } from '../tools/documents/clean.js'
 import * as Console from 'console'
 import pg from 'pg'
 import { config } from '../config/index.js'
@@ -34,10 +32,6 @@ const tasks = async () => {
   writeFileSync(logFile, '')
   try {
     await daily(pool)
-    if (isNotNullNorUndefined(config().CAMINO_STAGE)) {
-      await documentsClean(pool)
-      await documentsCheck(pool)
-    }
   } catch (e) {
     console.error('Erreur durant le daily', e)
   }
diff --git a/packages/api/src/scripts/database-to-json-export.ts b/packages/api/src/scripts/database-to-json-export.ts
deleted file mode 100644
index 0cc90078e300f1578c76327f0307303357ff9f09..0000000000000000000000000000000000000000
--- a/packages/api/src/scripts/database-to-json-export.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import '../init.js'
-
-import { databaseToJsonExport } from '../tools/database-to-json/index.js'
-
-databaseToJsonExport()
-  .then(() => {
-    process.exit()
-  })
-  .catch(() => {
-    process.exit(1)
-  })
diff --git a/packages/api/src/scripts/etapes-documents-migration.ts b/packages/api/src/scripts/etapes-documents-migration.ts
new file mode 100644
index 0000000000000000000000000000000000000000..9532f21c9589df8fb2214dc2c2ec00dad7782cd6
--- /dev/null
+++ b/packages/api/src/scripts/etapes-documents-migration.ts
@@ -0,0 +1,84 @@
+/* eslint-disable */
+import '../init.js'
+import pg, { Pool } from 'pg'
+import { knex } from '../knex.js'
+import { LargeObjectManager } from 'pg-large-object'
+import { join } from 'path'
+import { createReadStream } from 'node:fs'
+import { getEtapeDocuments } from '../api/rest/etapes.queries.js'
+
+const createLargeObject = (pool: Pool, fullPath: string) =>
+  new Promise<number>(async (resolve, reject) => {
+    const client = await pool.connect()
+    try {
+      const man = new LargeObjectManager({ pg: client })
+
+      await client.query('BEGIN')
+
+      await man.createAndWritableStreamAsync(16384).then(([oid, stream]) => {
+        const pathFrom = join(process.cwd(), fullPath)
+        const fileStream = createReadStream(pathFrom)
+
+        fileStream.pipe(stream)
+        fileStream.on('error', e => {
+          console.error(e)
+          client.query('ROLLBACK')
+          reject()
+        })
+        stream.on('finish', function () {
+          client.query('COMMIT')
+
+          resolve(oid)
+        })
+        stream.on('error', function (e) {
+          console.error(e)
+          client.query('ROLLBACK')
+          reject('error during largeobject creation')
+        })
+      })
+    } catch (e: any) {
+      await client.query('ROLLBACK')
+      console.error(e)
+      reject(e)
+    } finally {
+      client.release()
+    }
+  })
+
+export const launchMigration = async () => {
+  const pool = new pg.Pool({
+    host: process.env.PGHOST,
+    user: process.env.PGUSER,
+    password: process.env.PGPASSWORD,
+    database: process.env.PGDATABASE,
+    idleTimeoutMillis: 60000,
+  })
+
+  const etapesDocuments = await getEtapeDocuments(pool)
+
+  console.time('migration')
+  console.log('documents à migrer : ', etapesDocuments.length)
+  for (const document of etapesDocuments) {
+    const path = `files/demarches/${document.etape_id}/${document.id}.pdf`
+
+    console.log('fichier : ', path)
+
+    try {
+      const oid = await createLargeObject(pool, path)
+
+      await knex.raw(`update etapes_documents set largeobject_id='${oid}' where id='${document.id}';`)
+    } catch (e: any) {
+      console.error('pas la ', path)
+    }
+  }
+  console.timeEnd('migration')
+}
+
+launchMigration()
+  .then(() => {
+    process.exit()
+  })
+  .catch(e => {
+    console.error(e)
+    process.exit(1)
+  })
diff --git a/packages/api/src/server/rest.ts b/packages/api/src/server/rest.ts
index f0e808b58ee96e5644b77ac241d9b58c8672c199..ff986bb0bb267e864c232c829f82c48eb153d358 100644
--- a/packages/api/src/server/rest.ts
+++ b/packages/api/src/server/rest.ts
@@ -8,7 +8,7 @@ import { join } from 'path'
 import { inspect } from 'node:util'
 
 import { activites, demarches, entreprises, titre, titres, travaux } from '../api/rest/index.js'
-import { NewDownload, etapeFichier, etapeTelecharger, fichier, streamLargeObjectInResponse } from '../api/rest/fichiers.js'
+import { NewDownload, etapeDocumentDownload, etapeTelecharger, streamLargeObjectInResponse } from '../api/rest/fichiers.js'
 import { getTitreLiaisons, postTitreLiaisons, removeTitre, titresAdministrations, titresONF, updateTitre, utilisateurTitreAbonner, getTitre, getUtilisateurTitreAbonner } from '../api/rest/titres.js'
 import {
   creerEntreprise,
@@ -40,7 +40,7 @@ import {
 import { CaminoConfig, caminoConfigValidator } from 'camino-common/src/static/config.js'
 import { CaminoRequest, CustomResponse } from '../api/rest/express-type.js'
 import { User } from 'camino-common/src/roles.js'
-import { deleteEtape, deposeEtape, getEtapeEntrepriseDocuments, getEtapesTypesEtapesStatusWithMainStep } from '../api/rest/etapes.js'
+import { deleteEtape, deposeEtape, getEtapeDocuments, getEtapeEntrepriseDocuments, getEtapesTypesEtapesStatusWithMainStep } from '../api/rest/etapes.js'
 import { z } from 'zod'
 import { getCommunes } from '../api/rest/communes.js'
 import { SendFileOptions } from 'express-serve-static-core'
@@ -98,10 +98,10 @@ const getConfig = (_pool: Pool) => async (_req: CaminoRequest, res: CustomRespon
 
 const restRouteImplementations: Readonly<{ [key in CaminoRestRoute]: Transform<key> }> = {
   // NE PAS TOUCHER A CES ROUTES, ELLES SONT UTILISÉES HORS UI
-  '/download/fichiers/:documentId': { download: fichier },
+  '/download/fichiers/:documentId': { newDownload: etapeDocumentDownload },
   '/download/entrepriseDocuments/:documentId': { newDownload: entrepriseDocumentDownload },
   '/download/activiteDocuments/:documentId': { newDownload: activiteDocumentDownload },
-  '/fichiers/:documentId': { download: fichier },
+  '/fichiers/:documentId': { newDownload: etapeDocumentDownload },
   '/titres/:id': { download: titre },
   '/titres': { download: titres },
   '/titres_qgis': { download: titres },
@@ -110,7 +110,6 @@ const restRouteImplementations: Readonly<{ [key in CaminoRestRoute]: Transform<k
   '/activites': { download: activites },
   '/utilisateurs': { download: utilisateurs },
   '/etape/zip/:etapeId': { download: etapeTelecharger },
-  '/etape/:etapeId/:fichierNom': { download: etapeFichier },
   '/entreprises': { download: entreprises },
   // NE PAS TOUCHER A CES ROUTES, ELLES SONT UTILISÉES HORS UI
 
@@ -148,6 +147,7 @@ const restRouteImplementations: Readonly<{ [key in CaminoRestRoute]: Transform<k
   '/rest/etapes/:etapeId': { delete: deleteEtape },
   '/rest/etapes/:etapeId/depot': { put: deposeEtape },
   '/rest/etapes/:etapeId/entrepriseDocuments': { get: getEtapeEntrepriseDocuments },
+  '/rest/etapes/:etapeId/etapeDocuments': { get: getEtapeDocuments },
   '/rest/activites/:activiteId': { get: getActivite, put: updateActivite, delete: deleteActivite },
   '/rest/communes': { get: getCommunes },
   '/rest/geojson/import/:geoSystemeId': { post: geojsonImport },
diff --git a/packages/api/src/tools/database-to-json/index.ts b/packages/api/src/tools/database-to-json/index.ts
deleted file mode 100644
index 4cfbe2b38ba903af95560f03059b35c391967e7b..0000000000000000000000000000000000000000
--- a/packages/api/src/tools/database-to-json/index.ts
+++ /dev/null
@@ -1,50 +0,0 @@
-import { rmSync, writeFileSync, mkdirSync } from 'fs'
-
-import { simpleKnexConfig } from '../../knex/config.js'
-import knex from 'knex'
-import { tables } from './tables.js'
-const knexInstance = knex(simpleKnexConfig)
-const dir = 'sources'
-
-export const databaseToJsonExport = async () => {
-  rmSync(`./${dir}`, { recursive: true, force: true })
-  mkdirSync(`./${dir}`, { recursive: true })
-
-  for (const table of tables) {
-    try {
-      const fileName = `${table.name.replace(/_/g, '-')}.json`
-      const filePath = `${dir}/${fileName}`
-
-      const json = format(
-        await knexInstance.from(table.name).orderBy(
-          table.orderBy.map(column => {
-            return { column, order: 'asc' }
-          })
-        )
-      )
-
-      if (json) {
-        writeFileSync(filePath, JSON.stringify(json, null, 2))
-      } else {
-        console.error(`la table ${table.name} est vide`)
-      }
-    } catch (e) {
-      console.error(e)
-    }
-  }
-}
-
-interface IFields {
-  [key: string]: IFields | string
-}
-
-const format = (elements: IFields[]) =>
-  elements.map(e =>
-    Object.keys(e).reduce((acc: IFields, k: string) => {
-      if (e[k]) {
-        acc[k] = e[k]
-      }
-
-      return acc
-    }, {})
-  )
diff --git a/packages/api/src/tools/database-to-json/tables.ts b/packages/api/src/tools/database-to-json/tables.ts
deleted file mode 100644
index 6cc271262b710263e8a6cb12f292b1fac558abed..0000000000000000000000000000000000000000
--- a/packages/api/src/tools/database-to-json/tables.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-// Liste des noms des tables à sauvegarder au format json
-export const tables = [
-  { name: 'communes', orderBy: ['id'] },
-  { name: 'documents', orderBy: ['id'] },
-  { name: 'entreprises', orderBy: ['id'] },
-  { name: 'entreprises_etablissements', orderBy: ['id'] },
-  { name: 'titres', orderBy: ['id'] },
-  { name: 'titres_activites', orderBy: ['id'] },
-  { name: 'titres_amodiataires', orderBy: ['titre_etape_id', 'entreprise_id'] },
-  { name: 'titres_demarches', orderBy: ['id'] },
-  { name: 'titres_etapes', orderBy: ['id'] },
-  {
-    name: 'titres_etapes_entreprises_documents',
-    orderBy: ['titre_etape_id', 'document_id'],
-  },
-  { name: 'titres_titulaires', orderBy: ['titre_etape_id', 'entreprise_id'] },
-  { name: 'utilisateurs', orderBy: ['id'] },
-  {
-    name: 'utilisateurs__entreprises',
-    orderBy: ['utilisateur_id', 'entreprise_id'],
-  },
-]
diff --git a/packages/api/src/tools/documents/_assets/demarches/file3.pdf b/packages/api/src/tools/documents/_assets/demarches/file3.pdf
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/packages/api/src/tools/documents/_assets/file.pdf b/packages/api/src/tools/documents/_assets/file.pdf
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/packages/api/src/tools/documents/_assets/file2.pdf b/packages/api/src/tools/documents/_assets/file2.pdf
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/packages/api/src/tools/documents/_types.ts b/packages/api/src/tools/documents/_types.ts
deleted file mode 100644
index bc5339c0c6d37d4e8ff2beb35b70c2e42a7506e9..0000000000000000000000000000000000000000
--- a/packages/api/src/tools/documents/_types.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-import { IDocument, Index } from '../../types.js'
-
-export type IndexFile = Index<{ document: IDocument; path: string }>
diff --git a/packages/api/src/tools/documents/_utils.ts b/packages/api/src/tools/documents/_utils.ts
deleted file mode 100644
index eea6c4951106a695ded928f698be96c88395169a..0000000000000000000000000000000000000000
--- a/packages/api/src/tools/documents/_utils.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-import { Index } from '../../types.js'
-
-const hashGet = (str: string) => str.split('-').pop()
-
-export const matchFuzzy = (name: string, index: Index<any>, partGet = hashGet) => {
-  const hash = name.split('-').pop()
-
-  return Object.keys(index).reduce((r: string[], key) => {
-    // on ne garde pas les matches entiers pendant un fuzzy
-    if (key === name) {
-      return r
-    }
-
-    const part = partGet(key)
-
-    if (part === hash) {
-      r.push(key)
-    }
-
-    return r
-  }, [])
-}
diff --git a/packages/api/src/tools/documents/check.ts b/packages/api/src/tools/documents/check.ts
deleted file mode 100644
index e4bbc9b3be0cbc8b1206cf38037ef40a4db67219..0000000000000000000000000000000000000000
--- a/packages/api/src/tools/documents/check.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-import { filesDocumentCheck } from './files-document-check.js'
-import { documentsIndexBuild } from './documents-index-build.js'
-import { filesIndexBuild } from './files-index-build.js'
-import { documentsFilesCheck } from './documents-files-check.js'
-import { Pool } from 'pg'
-
-export const documentsCheck = async (_pool: Pool) => {
-  console.info()
-
-  console.info('- - -')
-  console.info('vérification des documents')
-  console.info()
-  const documentsIndex = await documentsIndexBuild()
-  const filesIndex = filesIndexBuild()
-
-  documentsFilesCheck(documentsIndex, filesIndex)
-  await filesDocumentCheck(documentsIndex, filesIndex)
-}
diff --git a/packages/api/src/tools/documents/clean.ts b/packages/api/src/tools/documents/clean.ts
deleted file mode 100644
index 949a40ddbcf28ad79b15771230ca055d8e714242..0000000000000000000000000000000000000000
--- a/packages/api/src/tools/documents/clean.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-import Document from '../../database/models/documents.js'
-import { documentFilePathFind } from './document-path-find.js'
-import * as fs from 'fs'
-import { documentSupprimer } from '../../api/graphql/resolvers/documents.js'
-import { userSuper } from '../../database/user-super.js'
-import { daysBetween, getCurrent, toCaminoDate } from 'camino-common/src/date.js'
-import type { Pool } from 'pg'
-
-export const documentsClean = async (pool: Pool) => {
-  console.info()
-  console.info('- - -')
-  console.info('suppression des documents orphelins')
-  console.info()
-
-  const documents = await Document.query().whereNull('titreEtapeId')
-
-  for (const document of documents) {
-    const path = documentFilePathFind(document)
-
-    try {
-      const { mtime } = fs.statSync(path)
-      if (daysBetween(toCaminoDate(mtime), getCurrent()) >= 1) {
-        await documentSupprimer({ id: document.id }, { user: userSuper, pool })
-        console.info(`document ${path} supprimé`)
-      }
-    } catch (e) {}
-  }
-}
diff --git a/packages/api/src/tools/documents/document-path-find.ts b/packages/api/src/tools/documents/document-path-find.ts
deleted file mode 100644
index f62de0f6afc1f0657aaf095af8cf35d9da8795ab..0000000000000000000000000000000000000000
--- a/packages/api/src/tools/documents/document-path-find.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-import { IDocument } from '../../types.js'
-import { documentRepertoireFind } from './document-repertoire-find.js'
-import { dirCreate } from '../dir-create.js'
-
-export const documentFilePathFind = (document: Pick<IDocument, 'id' | 'fichierTypeId' | 'titreEtapeId'>, creation = false) => {
-  const repertoire = documentRepertoireFind(document)
-
-  const parentId = document.titreEtapeId
-
-  let dirPath = `files/${repertoire}`
-
-  if (parentId) {
-    dirPath += `/${parentId}`
-  }
-
-  if (creation) {
-    dirCreate(dirPath)
-  }
-
-  return `${dirPath}/${document.id}.${document.fichierTypeId}`
-}
diff --git a/packages/api/src/tools/documents/document-repertoire-find.ts b/packages/api/src/tools/documents/document-repertoire-find.ts
deleted file mode 100644
index 07354d198cdc75074979940206bbfe005de65cd6..0000000000000000000000000000000000000000
--- a/packages/api/src/tools/documents/document-repertoire-find.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-import { IDocument, IDocumentRepertoire } from '../../types.js'
-
-export const documentRepertoireFind = (document: Pick<IDocument, 'titreEtapeId'>): IDocumentRepertoire => {
-  if (document.titreEtapeId) {
-    return 'demarches'
-  }
-
-  return 'tmp'
-}
diff --git a/packages/api/src/tools/documents/documents-files-check.ts b/packages/api/src/tools/documents/documents-files-check.ts
deleted file mode 100644
index f5fd3cd5cbdffaa7b89a57d14d6d0b773262a121..0000000000000000000000000000000000000000
--- a/packages/api/src/tools/documents/documents-files-check.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-import { Index } from '../../types.js'
-import { IndexFile } from './_types.js'
-import { matchFuzzy } from './_utils.js'
-
-export const documentsFilesCheck = (documentsIndex: IndexFile, filesIndex: Index<string>) => {
-  const documentsFichiersMissing = Object.keys(documentsIndex)
-    .filter(documentId => !filesIndex[documentId])
-    .sort()
-
-  if (documentsFichiersMissing.length) {
-    console.info(`${documentsFichiersMissing.length} documents en base de données n'ont pas de fichiers correspondants`)
-
-    documentsFichiersMissing.forEach(documentId => {
-      const document = documentsIndex[documentId].document
-      console.info(`-      ${documentId}.${document.fichierTypeId} -> ${document.titreEtapeId}`)
-
-      const matches = matchFuzzy(documentId, filesIndex)
-
-      if (matches.length) {
-        matches.forEach(name => {
-          console.info(`Match: ${filesIndex[name]}`)
-        })
-      }
-    })
-  } else {
-    console.info('tous les documents en base de données ont des fichiers correspondants')
-  }
-}
diff --git a/packages/api/src/tools/documents/documents-index-build.ts b/packages/api/src/tools/documents/documents-index-build.ts
deleted file mode 100644
index caf9998ff5e99b624fd3365b283de274f767f36c..0000000000000000000000000000000000000000
--- a/packages/api/src/tools/documents/documents-index-build.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-import { IDocument } from '../../types.js'
-import { IndexFile } from './_types.js'
-
-import { documentsGet } from '../../database/queries/documents.js'
-import { userSuper } from '../../database/user-super.js'
-import { documentRepertoireFind } from './document-repertoire-find.js'
-
-const documentPathGet = (document: IDocument) => {
-  let path = documentRepertoireFind(document)
-
-  if (!path) {
-    console.error(`le repertoire est absent ${document}`)
-  }
-
-  if (path === 'demarches') {
-    path += `/${document.titreEtapeId}`
-  }
-
-  return `${path}/${document.id}.${document.fichierTypeId}`
-}
-
-export const documentsIndexBuild = async () => {
-  const documents = await documentsGet({}, {}, userSuper)
-
-  return documents.reduce((res: IndexFile, document) => {
-    if (document.fichier) {
-      res[document.id] = { document, path: documentPathGet(document) }
-    }
-
-    return res
-  }, {})
-}
diff --git a/packages/api/src/tools/documents/files-document-check.ts b/packages/api/src/tools/documents/files-document-check.ts
deleted file mode 100644
index b773eb6ab4f392bde046302d31f05173d7a0f393..0000000000000000000000000000000000000000
--- a/packages/api/src/tools/documents/files-document-check.ts
+++ /dev/null
@@ -1,99 +0,0 @@
-import { Index } from '../../types.js'
-import { IndexFile } from './_types.js'
-import { matchFuzzy } from './_utils.js'
-import { titreEtapeGet } from '../../database/queries/titres-etapes.js'
-import { userSuper } from '../../database/user-super.js'
-import { contenuFilesGet } from '../../business/utils/contenu-element-file-process.js'
-import { getSections } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sections.js'
-import { newEtapeId } from '../../database/models/_format/id-create.js'
-
-const etapeGet = (str: string) => str.split('-').slice(0, -1).join('-')
-
-const contenuFilesCheck = async (filePath: string) => {
-  // c’est peut-être un fichier d’un contenu d’étape
-
-  const split = filePath.split('/')
-
-  const repertoire = split[0]
-  const etapeId = newEtapeId(split[1])
-  const fileName = split[2]
-
-  if (repertoire !== 'demarches') {
-    return false
-  }
-  const etape = await titreEtapeGet(etapeId, { fields: { demarche: { titre: { id: {} } } } }, userSuper)
-  if (etape) {
-    if (!etape.demarche || !etape.demarche.titre) {
-      throw new Error('le titre et la démarche doivent être chargés')
-    }
-    const sections = getSections(etape.demarche.titre.typeId, etape.demarche.typeId, etape.typeId)
-    const contenuFiles = contenuFilesGet(etape.contenu, sections)
-
-    if (contenuFiles.includes(fileName)) {
-      return true
-    }
-
-    if (etape.decisionsAnnexesSections) {
-      const decisionsAnnexesContenuFiles = contenuFilesGet(etape.decisionsAnnexesContenu, etape.decisionsAnnexesSections)
-
-      if (decisionsAnnexesContenuFiles.includes(fileName)) {
-        return true
-      }
-    }
-  }
-
-  return false
-}
-
-export const filesDocumentCheck = async (documentsIndex: IndexFile, filesIndex: Index<string>) => {
-  const filesMissing = [] as {
-    name: string
-    documentsHashMatches: string[]
-    filesHashMatches: string[]
-    filesEtapeMatches: string[]
-  }[]
-
-  for (const fileName of Object.keys(filesIndex).sort()) {
-    if (fileName && !documentsIndex[fileName] && !(await contenuFilesCheck(filesIndex[fileName]))) {
-      filesMissing.push({
-        name: filesIndex[fileName],
-        documentsHashMatches: matchFuzzy(fileName, documentsIndex),
-        filesHashMatches: matchFuzzy(fileName, filesIndex),
-        filesEtapeMatches: matchFuzzy(fileName, filesIndex, etapeGet),
-      })
-    }
-  }
-
-  // trie les fichiers sans hash en base en premier
-  filesMissing.sort(
-    (a, b) => a.documentsHashMatches.length + a.filesHashMatches.length + a.filesEtapeMatches.length - (b.documentsHashMatches.length + b.filesHashMatches.length + b.filesEtapeMatches.length)
-  )
-
-  if (filesMissing.length) {
-    console.info(`${filesMissing.length} fichiers ne correspondent à aucun document dans la base de données`)
-
-    filesMissing.forEach(file => {
-      console.info(`- ${file.name}`)
-
-      if (file.documentsHashMatches.length) {
-        const documentsHashMatchesString = ` (${file.documentsHashMatches.length} hashe(s) en base)`
-
-        console.info(`${documentsHashMatchesString}:`, file.documentsHashMatches.join(', '))
-      }
-
-      if (file.filesHashMatches.length && file.filesHashMatches[0] !== file.documentsHashMatches[0]) {
-        const filesHashMatchesString = ` (${file.filesHashMatches.length} autre(s) hashe(s) dans les fichiers)`
-
-        console.info(`${filesHashMatchesString}:`, file.filesHashMatches.join(', '))
-      }
-
-      if (file.filesEtapeMatches.length && file.filesEtapeMatches[0] !== file.documentsHashMatches[0]) {
-        const filesEtapeMatchesString = ` (${file.filesEtapeMatches.length} autre(s) etape(s) dans les fichiers)`
-
-        console.info(`${filesEtapeMatchesString}:`, file.filesEtapeMatches.join(', '))
-      }
-    })
-  } else {
-    console.info('tous les fichiers correspondent à des documents dans la base de données')
-  }
-}
diff --git a/packages/api/src/tools/documents/files-index-build.test.ts b/packages/api/src/tools/documents/files-index-build.test.ts
deleted file mode 100644
index c53e567ecaf66d271f3f46dc121bc484d986a1a9..0000000000000000000000000000000000000000
--- a/packages/api/src/tools/documents/files-index-build.test.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import { filesIndexBuild } from './files-index-build.js'
-import { expect, test } from 'vitest'
-
-test('filesIndexBuild', () => {
-  const dir = process.cwd()
-  expect(filesIndexBuild(`${dir}/src/tools/documents/_assets`)).toEqual({
-    file: 'file.pdf',
-    file2: 'file2.pdf',
-    file3: 'demarches/file3.pdf',
-  })
-})
diff --git a/packages/api/src/tools/documents/files-index-build.ts b/packages/api/src/tools/documents/files-index-build.ts
deleted file mode 100644
index 8a6fef96735c37c225e825faf6406320bb3ebc48..0000000000000000000000000000000000000000
--- a/packages/api/src/tools/documents/files-index-build.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-import { execSync } from 'child_process'
-import { basename } from 'path'
-
-import { Index } from '../../types.js'
-
-export const filesIndexBuild = (path = './files'): Index<string> => {
-  const filesNames = execSync(`find ${path} | grep -v entreprises | grep -v activites | grep pdf`).toString().split('\n')
-
-  return filesNames.reduce((res: Index<string>, fileName) => {
-    if (fileName) {
-      res[basename(fileName.split('/').pop()!, '.pdf')] = fileName.substring(path.length + 1)
-    }
-
-    return res
-  }, {})
-}
diff --git a/packages/api/src/tools/file-delete.ts b/packages/api/src/tools/file-delete.ts
deleted file mode 100644
index 005f1a303505c2e7cc4e36b1e9e785f6ca8c62f4..0000000000000000000000000000000000000000
--- a/packages/api/src/tools/file-delete.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-import { unlink } from 'fs'
-
-import errorLog from './error-log.js'
-
-const fileDelete = async (path: string) =>
-  new Promise((resolve, reject) =>
-    unlink(path, (err: any) => {
-      if (err) {
-        errorLog(`fichier non supprimé: ${path}`, err)
-
-        return reject(err)
-      }
-
-      const log = `fichier supprimé: ${path}`
-
-      console.info(log)
-
-      resolve(log)
-    })
-  )
-
-export default fileDelete
diff --git a/packages/api/src/tools/file-stream-create.ts b/packages/api/src/tools/file-stream-create.ts
deleted file mode 100644
index ea8a3338c6f950ed4e2272f59ed038317e0e2286..0000000000000000000000000000000000000000
--- a/packages/api/src/tools/file-stream-create.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-import { createWriteStream, unlink } from 'fs'
-
-import errorLog from './error-log.js'
-
-const fileStreamCreate = async (stream: any, path: string) =>
-  new Promise((resolve, reject) => {
-    stream
-      .on('error', (err: any) => {
-        unlink(path, () => {
-          errorLog(`fichier: ${path}`, err)
-          reject(err)
-        })
-      })
-      .pipe(createWriteStream(path))
-      .on('error', (err: any) => {
-        unlink(path, () => {
-          errorLog(`fichier: ${path}`, err)
-          reject(err)
-        })
-      })
-      .on('finish', () => {
-        console.info(`fichier ajouté: ${path}`)
-        resolve(path)
-      })
-  })
-
-export default fileStreamCreate
diff --git a/packages/api/src/types.ts b/packages/api/src/types.ts
index 6c010e43c090b8ce9aa56f121984984500ddf624..8f791d1bb2cf5ccc6ea2248caf30d377e047c916 100644
--- a/packages/api/src/types.ts
+++ b/packages/api/src/types.ts
@@ -1,4 +1,3 @@
-import { FileUpload } from 'graphql-upload'
 import { AdministrationId } from 'camino-common/src/static/administrations.js'
 import { CodePostal } from 'camino-common/src/static/departement.js'
 import { BaseUserNotNull, isAdministrationRole, isEntrepriseOrBureauDetudeRole, Role, User, UserNotNull, UtilisateurId } from 'camino-common/src/roles.js'
@@ -10,16 +9,15 @@ import { SubstanceLegaleId } from 'camino-common/src/static/substancesLegales.js
 import { DemarcheStatutId } from 'camino-common/src/static/demarchesStatuts.js'
 import { TitreStatutId } from 'camino-common/src/static/titresStatuts.js'
 import { TitreReference } from 'camino-common/src/titres-references.js'
-import { DocumentTypeId, FileUploadType } from 'camino-common/src/static/documentsTypes.js'
 import { SecteursMaritimes } from 'camino-common/src/static/facades.js'
 import { CaminoDate } from 'camino-common/src/date.js'
-import { DocumentId, EntrepriseDocumentId, EntrepriseId } from 'camino-common/src/entreprise.js'
+import { EntrepriseDocumentId, EntrepriseId } from 'camino-common/src/entreprise.js'
 import { DeepReadonly, isNotNullNorUndefined } from 'camino-common/src/typescript-tools.js'
 import { SDOMZoneId } from 'camino-common/src/static/sdom.js'
 import { ActivitesStatutId } from 'camino-common/src/static/activitesStatuts.js'
 import { DemarcheId, DemarcheSlug } from 'camino-common/src/demarche.js'
 import type { Pool } from 'pg'
-import { Section, SectionElement } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sections.js'
+import { Section } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sections.js'
 import { ActivitesTypesId } from 'camino-common/src/static/activitesTypes.js'
 import { CommuneId } from 'camino-common/src/static/communes.js'
 import { ForetId } from 'camino-common/src/static/forets.js'
@@ -29,6 +27,7 @@ import { ActiviteId } from 'camino-common/src/activite.js'
 import { FeatureCollectionForages, FeatureCollectionPoints, FeatureMultiPolygon, GeojsonPoint, MultiPolygon } from 'camino-common/src/perimetre.js'
 import { EtapeHeritageProps } from 'camino-common/src/heritage'
 import { GeoSystemeId } from 'camino-common/src/static/geoSystemes'
+import { ElementWithValue } from 'camino-common/src/sections'
 
 enum TitreEtapesTravauxTypes {
   DemandeAutorisationOuverture = 'wfa',
@@ -104,25 +103,9 @@ interface IContenuId {
   elementId: string
 }
 
-type IContenuValeur = string | number | string[] | boolean | IContenuElement[] | { file: FileUpload } | null
+type IContenuValeur = ElementWithValue['value'] | null
 
-interface IContenuElement {
-  [elementId: string]: IContenuValeur
-}
-
-interface IDecisionAnnexeContenuElement extends IContenuElement {
-  date: CaminoDate
-  statutId: EtapeStatutId
-  [elementId: string]: IContenuValeur
-}
-
-interface IDecisionAnnexeContenu {
-  [sectionId: string]: IDecisionAnnexeContenuElement
-}
-
-interface IContenu {
-  [sectionId: string]: IContenuElement
-}
+type IContenu = Record<string, Record<string, ElementWithValue['value']>>
 
 type IPropsTitreEtapesIds = {
   [key in PropsTitreEtapeIdKeys]?: string
@@ -146,7 +129,6 @@ interface ICommune {
 }
 
 export const DOCUMENTS_REPERTOIRES = ['demarches', 'tmp'] as const
-type IDocumentRepertoire = (typeof DOCUMENTS_REPERTOIRES)[number]
 
 interface IEntrepriseEtablissement {
   id: string
@@ -256,22 +238,6 @@ interface ITitreDemarche {
   etapes?: ITitreEtape[]
 }
 
-interface IDocument {
-  id: DocumentId
-  typeId: DocumentTypeId
-  date: CaminoDate
-  description?: string | null
-  fichier?: boolean | null
-  fichierTypeId?: FileUploadType | null
-  fichierNouveau?: { file: FileUpload } | null
-  nomTemporaire?: string | null
-  publicLecture?: boolean | null
-  entreprisesLecture?: boolean | null
-  titreEtapeId?: EtapeId | null
-  etape?: ITitreEtape | null
-  suppression?: boolean | null
-}
-
 export interface ITitreEtapePerimetre {
   geojson4326Perimetre: FeatureMultiPolygon | null | undefined
   geojson4326Points: FeatureCollectionPoints | null | undefined
@@ -291,8 +257,6 @@ type ITitreEtape = {
   date: CaminoDate
   duree?: number | null
   contenu?: IContenu | null
-  documents?: IDocument[] | null
-  documentIds?: string[] | null
   titreDemarcheId: DemarcheId
   demarche?: ITitreDemarche
   dateDebut?: CaminoDate | null
@@ -308,8 +272,6 @@ type ITitreEtape = {
   secteursMaritime?: SecteursMaritimes[] | null
   heritageProps?: IHeritageProps | null
   heritageContenu?: IHeritageContenu | null
-  decisionsAnnexesSections?: DeepReadonly<(Omit<Section, 'elements'> & { elements: (SectionElement & { sectionId?: string })[] })[]> | null
-  decisionsAnnexesContenu?: IDecisionAnnexeContenu | null
   notes?: string | null
 } & Partial<ITitreEtapePerimetre>
 
@@ -410,15 +372,12 @@ export {
   Index,
   ICommune,
   IContenu,
-  IContenuElement,
   IContenuValeur,
-  IDocumentRepertoire,
   IEntreprise,
   IEntrepriseEtablissement,
   ITitre,
   ITitreActivite,
   ITitreDemarche,
-  IDocument,
   ITitreEtape,
   ITitreEtapeFiltre,
   ITitreEntreprise,
@@ -436,5 +395,4 @@ export {
   IHeritageProps,
   IHeritageContenu,
   IJournaux,
-  IDecisionAnnexeContenu,
 }
diff --git a/packages/api/tests/_utils/administrations-permissions.ts b/packages/api/tests/_utils/administrations-permissions.ts
index 814ea94d152b2587fc4570ebfecac79b4106fa65..627b5425bbae8d5a3d7a75f0e8e93f6fbb06406f 100644
--- a/packages/api/tests/_utils/administrations-permissions.ts
+++ b/packages/api/tests/_utils/administrations-permissions.ts
@@ -5,10 +5,9 @@ import { graphQLCall, queryImport } from './index.js'
 
 import Titres from '../../src/database/models/titres.js'
 import options from '../../src/database/queries/_options.js'
-import { newDemarcheId, newDocumentId, newTitreId, newEtapeId } from '../../src/database/models/_format/id-create.js'
+import { newDemarcheId, newTitreId, newEtapeId, idGenerate } from '../../src/database/models/_format/id-create.js'
 import { TitreTypeId } from 'camino-common/src/static/titresTypes.js'
 import { getDocuments } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/documents.js'
-import { documentCreate } from '../../src/database/queries/documents.js'
 import { isGestionnaire } from 'camino-common/src/static/administrationsTitresTypes.js'
 import { EtapeTypeId } from 'camino-common/src/static/etapesTypes.js'
 import { toCaminoDate } from 'camino-common/src/date.js'
@@ -21,6 +20,27 @@ import { TitreId } from 'camino-common/src/validators/titres.js'
 import TitresDemarches from '../../src/database/models/titres-demarches.js'
 import { ETAPE_HERITAGE_PROPS } from 'camino-common/src/heritage.js'
 import { GEO_SYSTEME_IDS } from 'camino-common/src/static/geoSystemes.js'
+import { DocumentTypeId } from 'camino-common/src/static/documentsTypes.js'
+import { copyFileSync, mkdirSync } from 'node:fs'
+import { TempEtapeDocument } from 'camino-common/src/etape.js'
+import { tempDocumentNameValidator } from 'camino-common/src/document.js'
+
+const dir = `${process.cwd()}/files/tmp/`
+
+export const testDocumentCreateTemp = (typeId: DocumentTypeId) => {
+  const fileName = `existing_temp_file_${idGenerate()}`
+  mkdirSync(dir, { recursive: true })
+  copyFileSync(`./src/tools/small.pdf`, `${dir}/${fileName}`)
+  const documentToInsert: TempEtapeDocument = {
+    etape_document_type_id: typeId,
+    entreprises_lecture: true,
+    public_lecture: true,
+    description: 'desc',
+    temp_document_name: tempDocumentNameValidator.parse(fileName),
+  }
+
+  return documentToInsert
+}
 export const visibleCheck = async (
   pool: Pool,
   administrationId: AdministrationId,
@@ -178,17 +198,10 @@ export const creationCheck = async (pool: Pool, administrationId: string, creer:
     const documentTypesIds = getDocuments(titreTypeId, demarche?.typeId, etapeTypeId)
       .filter(({ optionnel }) => !optionnel)
       .map(({ id }) => id)
-    const documentIds = []
+    const etapeDocuments = []
 
     for (const documentTypeId of documentTypesIds) {
-      const id = newDocumentId(toCaminoDate('2020-01-01'), documentTypeId)
-      documentIds.push(id)
-      await documentCreate({
-        id,
-        typeId: documentTypeId,
-        date: toCaminoDate('2020-01-01'),
-        fichier: true,
-      })
+      etapeDocuments.push(testDocumentCreateTemp(documentTypeId))
     }
     const res = await graphQLCall(
       pool,
@@ -213,7 +226,7 @@ export const creationCheck = async (pool: Pool, administrationId: string, creer:
           heritageContenu,
           contenu,
           substances: ['auru'],
-          documentIds,
+          etapeDocuments,
           geojson4326Perimetre: {
             type: 'Feature',
             properties: {},
diff --git a/packages/api/tests/queries/documents-supprimer.graphql b/packages/api/tests/queries/documents-supprimer.graphql
deleted file mode 100644
index 964e526c5d318ab5c1eb74929599f9d7e5732cfd..0000000000000000000000000000000000000000
--- a/packages/api/tests/queries/documents-supprimer.graphql
+++ /dev/null
@@ -1,3 +0,0 @@
-mutation DocumentSupprimer($id: ID!) {
-  documentSupprimer(id: $id)
-}
diff --git a/packages/api/tests/queries/titre.graphql b/packages/api/tests/queries/titre.graphql
index 4a0cd6a53583abc6149358018a27bc543ccededa..5f7c7e29ccf6a5f7947981d759ae4a0bd366689b 100644
--- a/packages/api/tests/queries/titre.graphql
+++ b/packages/api/tests/queries/titre.graphql
@@ -58,9 +58,6 @@ fragment etape on Etape {
     ...entreprise
   }
   substances
-  documents {
-    ...document
-  }
 }
 
 fragment entreprise on Entreprise {
@@ -99,8 +96,3 @@ fragment utilisateur on Utilisateur {
   telephoneFixe
   role
 }
-
-fragment document on Document {
-  id
-  fichier
-}
diff --git a/packages/common/src/demarche.ts b/packages/common/src/demarche.ts
index 3ede9b7dfa042f4118124e248da2ab7ad946cefc..0687dd37ec8611396b3c53afc5ed1f0e0305fc66 100644
--- a/packages/common/src/demarche.ts
+++ b/packages/common/src/demarche.ts
@@ -10,7 +10,6 @@ import { etapeStatutIdValidator } from './static/etapesStatuts.js'
 import { sectionWithValueValidator } from './sections.js'
 import { etapeDocumentValidator, etapeIdValidator, etapeSlugValidator } from './etape.js'
 import { sdomZoneIdValidator } from './static/sdom.js'
-import { sectionValidator } from './static/titresTypes_demarchesTypes_etapesTypes/sections.js'
 import { numberFormat } from './number.js'
 import { DeviseId, deviseIdValidator, DEVISES_IDS, Devises } from './static/devise.js'
 import { TITRES_TYPES_TYPES_IDS } from './static/titresTypesTypes.js'
@@ -38,11 +37,6 @@ export const entreprisesByEtapeIdValidator = z.object({
 
 export type EntreprisesByEtapeId = z.infer<typeof entreprisesByEtapeIdValidator>
 
-/**
- * @deprecated don't expose, don't use
- */
-const contenuValidator = z.record(z.string(), z.record(z.string(), z.unknown().optional()).optional()).nullable()
-
 const demarcheEtapeCommonValidator = z.object({
   etape_statut_id: etapeStatutIdValidator,
   date: caminoDateValidator,
@@ -52,9 +46,7 @@ const demarcheEtapeCommonValidator = z.object({
   slug: etapeSlugValidator,
   sections_with_values: z.array(sectionWithValueValidator),
   entreprises_documents: z.array(etapeEntrepriseDocumentValidator),
-  documents: z.array(etapeDocumentValidator),
-  decisions_annexes_contenu: contenuValidator,
-  decisions_annexes_sections: z.array(sectionValidator).nullable(),
+  etape_documents: z.array(etapeDocumentValidator),
 })
 
 export type DemarcheEtapeCommon = z.infer<typeof demarcheEtapeCommonValidator>
diff --git a/packages/common/src/entreprise.test.ts b/packages/common/src/entreprise.test.ts
index 5f41e0fea93fe7144e1909b2b6a5b9428a1175a5..d555cd60dd4086b9aa6129fdd50be0472fe04012 100644
--- a/packages/common/src/entreprise.test.ts
+++ b/packages/common/src/entreprise.test.ts
@@ -1,5 +1,5 @@
 import { test, expect } from 'vitest'
-import { documentIdValidator, sirenValidator } from './entreprise.js'
+import { sirenValidator } from './entreprise.js'
 
 test('sirenValidator', () => {
   expect(sirenValidator.safeParse('123456789').success).toBe(true)
@@ -9,7 +9,3 @@ test('sirenValidator', () => {
   expect(sirenValidator.safeParse('1234567').success).toBe(false)
   expect(sirenValidator.safeParse('1234567890').success).toBe(false)
 })
-
-test('documentIdValidator', () => {
-  expect(() => documentIdValidator.parse('2021-01-01-kbi-ac123457')).not.toThrowError()
-})
diff --git a/packages/common/src/entreprise.ts b/packages/common/src/entreprise.ts
index aa86c11cd0c12c5c1cf0b053c7c91fa05ac6ccb8..9dd54c50dddfb1683637e3184f040c6f408b7af8 100644
--- a/packages/common/src/entreprise.ts
+++ b/packages/common/src/entreprise.ts
@@ -14,9 +14,6 @@ import type { TitreId } from './validators/titres.js'
 export const entrepriseIdValidator = z.string().brand<'EntrepriseId'>()
 export type EntrepriseId = z.infer<typeof entrepriseIdValidator>
 export const isEntrepriseId = (eid: string): eid is EntrepriseId => entrepriseIdValidator.safeParse(eid).success
-export const documentIdValidator = z.string().brand<'DocumentId'>()
-
-export type DocumentId = z.infer<typeof documentIdValidator>
 
 export const sirenValidator = z
   .string()
diff --git a/packages/common/src/etape.test.ts b/packages/common/src/etape.test.ts
new file mode 100644
index 0000000000000000000000000000000000000000..cce584e592cd292c04e66b1deabe78576565fbde
--- /dev/null
+++ b/packages/common/src/etape.test.ts
@@ -0,0 +1,6 @@
+import { test, expect } from 'vitest'
+import { etapeDocumentIdValidator } from './etape.js'
+
+test('documentIdValidator', () => {
+  expect(() => etapeDocumentIdValidator.parse('2021-01-01-kbi-ac123457')).not.toThrowError()
+})
diff --git a/packages/common/src/etape.ts b/packages/common/src/etape.ts
index 66b4ea410c2c5f4f03f8116f2853950aa5e07283..c3818444a5913e9cf6ea836de359b694adc22918 100644
--- a/packages/common/src/etape.ts
+++ b/packages/common/src/etape.ts
@@ -1,15 +1,22 @@
-import { CaminoDate } from './date.js'
-import { EntrepriseId, documentIdValidator } from './entreprise.js'
+import { CaminoDate, caminoDateValidator } from './date.js'
+import { EntrepriseId } from './entreprise.js'
 import { EtapeHeritageProps, MappingHeritagePropsNameEtapePropsName } from './heritage.js'
 import { AdministrationId } from './static/administrations.js'
-import { DocumentTypeId, documentTypeIdValidator } from './static/documentsTypes.js'
-import { etapeStatutIdValidator } from './static/etapesStatuts.js'
+import { DOCUMENTS_TYPES_IDS, documentTypeIdValidator } from './static/documentsTypes.js'
+import { EtapeStatutId, etapeStatutIdValidator } from './static/etapesStatuts.js'
 import { EtapeTypeId, etapeTypeIdValidator } from './static/etapesTypes.js'
 import { SubstanceLegaleId } from './static/substancesLegales.js'
 import { z } from 'zod'
 import { FeatureCollectionForages, FeatureCollectionPoints, FeatureMultiPolygon } from './perimetre.js'
 import { KM2 } from './number.js'
 import { GeoSystemeId } from './static/geoSystemes.js'
+import { tempDocumentNameValidator } from './document.js'
+import { ElementWithValue } from './sections.js'
+import { DeepReadonly } from './typescript-tools.js'
+import { getSections } from './static/titresTypes_demarchesTypes_etapesTypes/sections.js'
+import { DemarcheTypeId } from './static/demarchesTypes.js'
+import { TitreTypeId } from './static/titresTypes.js'
+import { User, isEntrepriseOrBureauDEtude } from './roles.js'
 
 export const etapeIdValidator = z.string().brand<'EtapeId'>()
 export type EtapeId = z.infer<typeof etapeIdValidator>
@@ -20,69 +27,178 @@ export type EtapeSlug = z.infer<typeof etapeSlugValidator>
 export const etapeIdOrSlugValidator = z.union([etapeIdValidator, etapeSlugValidator])
 export type EtapeIdOrSlug = z.infer<typeof etapeIdOrSlugValidator>
 
-export type HeritageProp<T> =
-  | {
-      actif: true
-      etape: T
-    }
-  | { actif: false; etape?: T }
+export type HeritageProp<T> = { actif: boolean; etape?: T | null }
 
 export interface EtapeEntreprise {
   id: EntrepriseId
-  operateur: boolean
+  operateur: boolean | null
 }
 
 // TODO 2023-06-14 Utiliser seulement par l’ui, à bouger dedans
-export interface CaminoDocument {
-  typeId: DocumentTypeId
-}
-
-type EtapeBase = {
-  id: EtapeId
-  contenu: { [key: string]: unknown }
-  date: CaminoDate
-  typeId: EtapeTypeId
+export type Etape = {
+  id: EtapeId | null
+  contenu: Record<string, Record<string, ElementWithValue['value']>>
+  date: CaminoDate | null
+  typeId: EtapeTypeId | null
+  statutId: EtapeStatutId | null
   substances: SubstanceLegaleId[]
   titulaires: EtapeEntreprise[]
   amodiataires: EtapeEntreprise[]
-  dateDebut: CaminoDate | null
   administrations?: AdministrationId[]
-  documents?: CaminoDocument[]
-  justificatifs?: unknown[]
   communes?: string[]
 
-  geojson4326Perimetre?: FeatureMultiPolygon | null
-  geojson4326Points?: FeatureCollectionPoints | null
-  geojsonOriginePerimetre?: FeatureMultiPolygon | null
-  geojsonOriginePoints?: FeatureCollectionPoints | null
-  geojsonOrigineGeoSystemeId?: GeoSystemeId | null
-  geojson4326Forages?: FeatureCollectionForages | null
-  geojsonOrigineForages?: FeatureCollectionForages | null
-  surface?: KM2 | null
+  geojson4326Perimetre: FeatureMultiPolygon | null
+  geojson4326Points: FeatureCollectionPoints | null
+  geojsonOriginePerimetre: FeatureMultiPolygon | null
+  geojsonOriginePoints: FeatureCollectionPoints | null
+  geojsonOrigineGeoSystemeId: GeoSystemeId | null
+  geojson4326Forages: FeatureCollectionForages | null
+  geojsonOrigineForages: FeatureCollectionForages | null
+  surface: KM2 | null
 
   notes: null | string
-} & ({ duree: number; dateFin: CaminoDate | undefined } | { duree: number | undefined; dateFin: CaminoDate | null })
+  duree: number | null
+  dateDebut: CaminoDate | null
+  dateFin: CaminoDate | null
+}
+
+export type EtapePropsFromHeritagePropName<key extends EtapeHeritageProps> = MappingHeritagePropsNameEtapePropsName[key][number]
 
-type EtapePropsFromHeritagePropName<key extends EtapeHeritageProps> = MappingHeritagePropsNameEtapePropsName[key][number]
+export type EtapeWithHeritage = InternalEtapeWithHeritage<EtapeHeritageProps, Omit<Etape, 'typeId' | 'date' | 'statutId'> & { typeId: EtapeTypeId; date: CaminoDate; statutId: EtapeStatutId }>
 
-export type EtapeWithHeritage<K extends keyof MappingHeritagePropsNameEtapePropsName, T extends Pick<EtapeBase, 'typeId' | 'date' | EtapePropsFromHeritagePropName<K>>> = T & {
+export type HeritageContenu = Record<string, Record<string, HeritageProp<Pick<EtapeWithHeritage, 'contenu' | 'typeId' | 'date'>>>>
+type InternalEtapeWithHeritage<HeritagePropsKeys extends EtapeHeritageProps, T extends Pick<Etape, 'date' | EtapePropsFromHeritagePropName<HeritagePropsKeys>> & { typeId: EtapeTypeId }> = T & {
   heritageProps: {
-    [key in K]: HeritageProp<Pick<T, 'typeId' | 'date' | EtapePropsFromHeritagePropName<K>>>
+    [key in HeritagePropsKeys]: HeritageProp<Pick<T, 'typeId' | 'date' | EtapePropsFromHeritagePropName<key>>>
   }
+  heritageContenu: HeritageContenu
 }
 
-export type Etape = EtapeWithHeritage<keyof MappingHeritagePropsNameEtapePropsName, EtapeBase>
-export type EtapeFondamentale = Etape
-
 export const etapeTypeEtapeStatutWithMainStepValidator = z.object({ etapeTypeId: etapeTypeIdValidator, etapeStatutId: etapeStatutIdValidator, mainStep: z.boolean() })
 export type EtapeTypeEtapeStatutWithMainStep = z.infer<typeof etapeTypeEtapeStatutWithMainStepValidator>
 
+export const etapeDocumentIdValidator = z.string().brand('EtapeDocumentId')
+export type EtapeDocumentId = z.infer<typeof etapeDocumentIdValidator>
+
 export const etapeDocumentValidator = z.object({
-  id: documentIdValidator,
+  id: etapeDocumentIdValidator,
   description: z.string().nullable(),
-  document_type_id: documentTypeIdValidator,
+  etape_document_type_id: documentTypeIdValidator,
   public_lecture: z.boolean().default(false),
   entreprises_lecture: z.boolean().default(false),
 })
 
 export type EtapeDocument = z.infer<typeof etapeDocumentValidator>
+
+const documentComplementaireObligatoireCommon = z.object({
+  date: caminoDateValidator,
+  etape_statut_id: etapeStatutIdValidator,
+})
+export const documentTypeIdComplementaireObligatoireDAE = DOCUMENTS_TYPES_IDS.arretePrefectoral
+
+const documentComplementaireObligatoireDAEValidator = documentComplementaireObligatoireCommon.extend({
+  etape_document_type_id: z.literal(documentTypeIdComplementaireObligatoireDAE),
+  arrete_prefectoral: z.string().nullable(),
+})
+
+export const documentTypeIdComplementaireObligatoireASL = DOCUMENTS_TYPES_IDS.lettre
+const documentComplementaireObligatoireASLValidator = documentComplementaireObligatoireCommon.extend({
+  etape_document_type_id: z.literal(documentTypeIdComplementaireObligatoireASL),
+})
+
+const getEtapeDocumentsByEtapeIdDaeDocumentValidator = etapeDocumentValidator.and(documentComplementaireObligatoireDAEValidator)
+export type GetEtapeDocumentsByEtapeIdDaeDocument = z.infer<typeof getEtapeDocumentsByEtapeIdDaeDocumentValidator>
+
+const getEtapeDocumentsByEtapeIdAslDocumentValidator = z.intersection(etapeDocumentValidator, documentComplementaireObligatoireASLValidator)
+export type GetEtapeDocumentsByEtapeIdAslDocument = z.infer<typeof getEtapeDocumentsByEtapeIdAslDocumentValidator>
+
+export const getEtapeDocumentsByEtapeIdValidator = z.object({
+  etapeDocuments: z.array(etapeDocumentValidator),
+  dae: getEtapeDocumentsByEtapeIdDaeDocumentValidator.nullable(),
+  asl: getEtapeDocumentsByEtapeIdAslDocumentValidator.nullable(),
+})
+
+export type GetEtapeDocumentsByEtapeId = z.infer<typeof getEtapeDocumentsByEtapeIdValidator>
+
+export const needAslAndDae = (
+  tde: {
+    etapeTypeId: EtapeTypeId
+    demarcheTypeId: DemarcheTypeId
+    titreTypeId: TitreTypeId
+  },
+  etapeStatutId: EtapeStatutId,
+  user: User
+): boolean => {
+  return tde.etapeTypeId === 'mfr' && tde.demarcheTypeId === 'oct' && tde.titreTypeId === 'axm' && isEntrepriseOrBureauDEtude(user) && etapeStatutId === 'aco'
+}
+
+export const tempEtapeDocumentValidator = etapeDocumentValidator.omit({ id: true }).extend({ temp_document_name: tempDocumentNameValidator })
+export type TempEtapeDocument = z.infer<typeof tempEtapeDocumentValidator>
+
+const etapeDocumentWithFileModificationValidator = etapeDocumentValidator.extend({ temp_document_name: tempDocumentNameValidator.optional() })
+export type EtapeDocumentWithFileModification = z.infer<typeof etapeDocumentWithFileModificationValidator>
+export const etapeDocumentModificationValidator = z.union([etapeDocumentWithFileModificationValidator, tempEtapeDocumentValidator])
+export type EtapeDocumentModification = z.infer<typeof etapeDocumentModificationValidator>
+
+export const documentComplementaireDaeEtapeDocumentModificationValidator = etapeDocumentModificationValidator.and(documentComplementaireObligatoireDAEValidator)
+export type DocumentComplementaireDaeEtapeDocumentModification = z.infer<typeof documentComplementaireDaeEtapeDocumentModificationValidator>
+
+export const documentComplementaireAslEtapeDocumentModificationValidator = etapeDocumentModificationValidator.and(documentComplementaireObligatoireASLValidator)
+export type DocumentComplementaireAslEtapeDocumentModification = z.infer<typeof documentComplementaireAslEtapeDocumentModificationValidator>
+
+export const flattenEtapeWithHeritage = (
+  titreTypeId: TitreTypeId,
+  demarcheTypeId: DemarcheTypeId,
+  etape: DeepReadonly<Etape>,
+  heritage: DeepReadonly<Pick<EtapeWithHeritage, 'heritageProps' | 'heritageContenu' | 'typeId' | 'date' | 'statutId'>>
+): DeepReadonly<EtapeWithHeritage> => {
+  const substances: Readonly<SubstanceLegaleId[]> = heritage.heritageProps.substances.actif ? heritage.heritageProps.substances.etape?.substances ?? [] : etape.substances
+  const duree: number | null = heritage.heritageProps.duree.actif ? heritage.heritageProps.duree.etape?.duree ?? null : etape.duree
+  const amodiataires: DeepReadonly<EtapeEntreprise[]> = heritage.heritageProps.amodiataires.actif ? heritage.heritageProps.amodiataires.etape?.amodiataires ?? [] : etape.amodiataires
+  const titulaires: DeepReadonly<EtapeEntreprise[]> = heritage.heritageProps.titulaires.actif ? heritage.heritageProps.titulaires.etape?.titulaires ?? [] : etape.titulaires
+  const dateDebut: CaminoDate | null = heritage.heritageProps.dateDebut.actif ? heritage.heritageProps.dateDebut.etape?.dateDebut ?? null : etape.dateDebut
+  const dateFin: CaminoDate | null = heritage.heritageProps.dateFin.actif ? heritage.heritageProps.dateFin.etape?.dateFin ?? null : etape.dateFin
+
+  let perimetre: DeepReadonly<Pick<Etape, EtapePropsFromHeritagePropName<'perimetre'>>> = {
+    geojson4326Perimetre: etape.geojson4326Perimetre,
+    geojson4326Points: etape.geojson4326Points,
+    geojsonOriginePerimetre: etape.geojsonOriginePerimetre,
+    geojsonOriginePoints: etape.geojsonOriginePoints,
+    geojsonOrigineGeoSystemeId: etape.geojsonOrigineGeoSystemeId,
+    geojson4326Forages: etape.geojson4326Forages,
+    geojsonOrigineForages: etape.geojsonOrigineForages,
+    surface: etape.surface,
+  }
+  if (heritage.heritageProps.perimetre.actif) {
+    perimetre = {
+      geojson4326Perimetre: heritage.heritageProps.perimetre.etape?.geojson4326Perimetre ?? null,
+      geojson4326Points: heritage.heritageProps.perimetre.etape?.geojson4326Points ?? null,
+      geojsonOriginePerimetre: heritage.heritageProps.perimetre.etape?.geojsonOriginePerimetre ?? null,
+      geojsonOriginePoints: heritage.heritageProps.perimetre.etape?.geojsonOriginePoints ?? null,
+      geojsonOrigineGeoSystemeId: heritage.heritageProps.perimetre.etape?.geojsonOrigineGeoSystemeId ?? null,
+      geojson4326Forages: heritage.heritageProps.perimetre.etape?.geojson4326Forages ?? null,
+      geojsonOrigineForages: heritage.heritageProps.perimetre.etape?.geojsonOrigineForages ?? null,
+      surface: heritage.heritageProps.perimetre.etape?.surface ?? null,
+    }
+  }
+
+  const sections = getSections(titreTypeId, demarcheTypeId, heritage.typeId)
+
+  let newContenu: DeepReadonly<Etape['contenu']> = {}
+  for (const section of sections) {
+    newContenu = { ...newContenu, [section.id]: {} }
+    for (const element of section.elements) {
+      newContenu = {
+        ...newContenu,
+        [section.id]: {
+          ...newContenu[section.id],
+          [element.id]: heritage.heritageContenu[section.id]?.[element.id]?.actif
+            ? heritage.heritageContenu[section.id][element.id].etape?.contenu[section.id]?.[element.id] ?? null
+            : etape.contenu[section.id]?.[element.id] ?? null,
+        },
+      }
+    }
+  }
+
+  return { ...etape, ...heritage, substances, duree, amodiataires, titulaires, dateDebut, dateFin, ...perimetre, contenu: newContenu }
+}
diff --git a/packages/common/src/heritage.ts b/packages/common/src/heritage.ts
index bfbc20f1f6b51af908bf9bc58b9809746fbeec59..a1341fa9499431c181b65d3f51c6b1a7c8ea1f79 100644
--- a/packages/common/src/heritage.ts
+++ b/packages/common/src/heritage.ts
@@ -8,7 +8,7 @@ export type EtapeHeritageProps = z.infer<typeof etapeHeritagePropsValidator>
 
 export const isHeritageProps = (value: string): value is EtapeHeritageProps => ETAPE_HERITAGE_PROPS.includes(value)
 
-export const mappingHeritagePropsNameEtapePropsName = {
+const mappingHeritagePropsNameEtapePropsName = {
   titulaires: ['titulaires'],
   amodiataires: ['amodiataires'],
   dateDebut: ['dateDebut'],
@@ -16,6 +16,7 @@ export const mappingHeritagePropsNameEtapePropsName = {
   duree: ['duree'],
   substances: ['substances'],
   perimetre: ['geojson4326Perimetre', 'geojson4326Points', 'surface', 'geojsonOriginePerimetre', 'geojsonOriginePoints', 'geojsonOrigineGeoSystemeId', 'geojson4326Forages', 'geojsonOrigineForages'],
-} as const satisfies Record<EtapeHeritageProps, Readonly<string[]>>
+  contenu: ['contenu'],
+} as const satisfies Record<EtapeHeritageProps | 'contenu', Readonly<string[]>>
 
 export type MappingHeritagePropsNameEtapePropsName = typeof mappingHeritagePropsNameEtapePropsName
diff --git a/packages/common/src/permissions/documents.test.ts b/packages/common/src/permissions/documents.test.ts
index a0e67bb8a5b47881650e702d5068c9345e8dcf1b..7315077a4d10e8957fee1f609a362184fac3b284 100644
--- a/packages/common/src/permissions/documents.test.ts
+++ b/packages/common/src/permissions/documents.test.ts
@@ -23,7 +23,7 @@ describe('teste isDocumentsComplete', () => {
     const errors = isDocumentsComplete(
       [
         {
-          typeId: 'arr',
+          etape_document_type_id: 'aac',
         },
       ],
       [{ id: 'arr', optionnel: false }]
@@ -43,8 +43,7 @@ describe('teste isDocumentsComplete', () => {
     const errors = isDocumentsComplete(
       [
         {
-          typeId: 'arr',
-          fichier: true,
+          etape_document_type_id: 'arr',
         },
       ],
       [{ id: 'arr', optionnel: false }]
diff --git a/packages/common/src/permissions/documents.ts b/packages/common/src/permissions/documents.ts
index 1a68bd6efa8f89d870c5ca63458d7c4ec003170c..a815cc7576fcb98635e93a6fbcfe6d0e59099bcb 100644
--- a/packages/common/src/permissions/documents.ts
+++ b/packages/common/src/permissions/documents.ts
@@ -1,8 +1,8 @@
-import { DocumentType, DocumentTypeId } from 'camino-common/src/static/documentsTypes.js'
-import { isNotNullNorUndefined } from '../typescript-tools.js'
+import { DocumentType } from 'camino-common/src/static/documentsTypes.js'
+import { EtapeDocument } from '../etape'
 
 export const isDocumentsComplete = (
-  documents: { typeId: DocumentTypeId; fichier?: unknown; fichierNouveau?: unknown }[],
+  documents: Pick<EtapeDocument, 'etape_document_type_id'>[],
   documentsTypes?: Pick<DocumentType, 'id' | 'optionnel'>[]
 ): { valid: true } | { valid: false; errors: string[] } => {
   const errors = [] as string[]
@@ -11,7 +11,7 @@ export const isDocumentsComplete = (
     documentsTypes
       .filter(dt => !dt.optionnel)
       .forEach(dt => {
-        if (!documents?.find(d => d.typeId === dt.id && !!(isNotNullNorUndefined(d.fichier) || isNotNullNorUndefined(d.fichierNouveau)))) {
+        if (!documents?.find(d => d.etape_document_type_id === dt.id)) {
           errors.push(`le document "${dt.id}" est obligatoire`)
         }
       })
diff --git a/packages/common/src/permissions/etape-form.test.ts b/packages/common/src/permissions/etape-form.test.ts
new file mode 100644
index 0000000000000000000000000000000000000000..00287c23b710c7d8cdc1da7bb9abc75e3bc9a5fc
--- /dev/null
+++ b/packages/common/src/permissions/etape-form.test.ts
@@ -0,0 +1,741 @@
+import { expect, test } from 'vitest'
+import {
+  entrepriseDocumentsStepIsComplete,
+  entrepriseDocumentsStepIsVisible,
+  etapeDocumentsStepIsComplete,
+  etapeDocumentsStepIsVisible,
+  fondamentaleStepIsComplete,
+  fondamentaleStepIsVisible,
+  getDocumentsTypes,
+  perimetreStepIsComplete,
+  perimetreStepIsVisible,
+  sectionsStepIsComplete,
+  sectionsStepIsVisible,
+} from './etape-form'
+import { documentTypeIdComplementaireObligatoireASL, documentTypeIdComplementaireObligatoireDAE, etapeDocumentIdValidator } from '../etape'
+import { toCaminoDate } from '../date'
+import { testBlankUser } from '../tests-utils'
+import { entrepriseDocumentIdValidator, entrepriseIdValidator } from '../entreprise'
+
+test('fondamentaleStepIsVisible', () => {
+  expect(fondamentaleStepIsVisible('mfr')).toBe(true)
+  expect(fondamentaleStepIsVisible('aac')).toBe(false)
+})
+
+test('fondamentaleStepIsComplete', () => {
+  expect(fondamentaleStepIsComplete({ duree: 0, substances: [], typeId: 'aac' }, 'amo', 'prr')).toBe(true)
+
+  expect(fondamentaleStepIsComplete({ duree: 0, substances: [], typeId: 'dpu' }, 'amo', 'prr')).toBe(true)
+  expect(fondamentaleStepIsComplete({ duree: 0, substances: [], typeId: 'mfr' }, 'amo', 'prr')).toBe(false)
+
+  expect(fondamentaleStepIsComplete({ duree: 0, substances: ['auru'], typeId: 'mfr' }, 'oct', 'prr')).toBe(true)
+  expect(fondamentaleStepIsComplete({ duree: 2, substances: ['auru'], typeId: 'mfr' }, 'oct', 'arm')).toBe(true)
+  expect(fondamentaleStepIsComplete({ duree: 0, substances: ['auru'], typeId: 'mfr' }, 'oct', 'arm')).toBe(false)
+  expect(fondamentaleStepIsComplete({ duree: 2, substances: [], typeId: 'mfr' }, 'oct', 'arm')).toBe(false)
+
+  expect(fondamentaleStepIsComplete({ duree: 0, substances: ['auru'], typeId: 'mfr' }, 'mut', 'arm')).toBe(true)
+  expect(fondamentaleStepIsComplete({ duree: 0, substances: [], typeId: 'mfr' }, 'mut', 'arm')).toBe(false)
+})
+
+test('sectionsStepIsVisible', () => {
+  expect(sectionsStepIsVisible({ typeId: 'mfr' }, 'oct', 'arm')).toBe(true)
+  expect(sectionsStepIsVisible({ typeId: 'asl' }, 'oct', 'axm')).toBe(false)
+})
+
+test('sectionsStepIsComplete', () => {
+  expect(sectionsStepIsComplete({ typeId: 'mfr', contenu: {} }, 'oct', 'arm')).toBe(false)
+  expect(sectionsStepIsComplete({ typeId: 'mfr', contenu: { arm: { mecanise: true } } }, 'oct', 'arm')).toBe(true)
+})
+
+test('perimetreStepIsVisible', () => {
+  expect(perimetreStepIsVisible({ typeId: 'mfr' })).toBe(true)
+  expect(perimetreStepIsVisible({ typeId: 'aac' })).toBe(false)
+})
+
+test('perimetreStepIsComplete', () => {
+  expect(perimetreStepIsComplete({ typeId: 'mfr', geojson4326Perimetre: null })).toBe(false)
+  expect(perimetreStepIsComplete({ typeId: 'mfr', geojson4326Perimetre: { type: 'Feature', properties: {}, geometry: { type: 'MultiPolygon', coordinates: [] } } })).toBe(true)
+  expect(perimetreStepIsComplete({ typeId: 'aac', geojson4326Perimetre: null })).toBe(true)
+  expect(perimetreStepIsComplete({ typeId: 'dpu', geojson4326Perimetre: null })).toBe(true)
+})
+
+test('etapeDocumentsStepIsVisible', () => {
+  expect(etapeDocumentsStepIsVisible({ typeId: 'asl' }, 'oct', 'axm')).toBe(true)
+  expect(etapeDocumentsStepIsVisible({ typeId: 'mdp' }, 'oct', 'axm')).toBe(true)
+  expect(etapeDocumentsStepIsVisible({ typeId: 'cod' }, 'oct', 'axm')).toBe(false)
+})
+
+const axmDocumentsComplete = [
+  {
+    description: 'Plan à l’échelle 1/50 000ème ou 1/100 000ème',
+    id: etapeDocumentIdValidator.parse('idcar'),
+    etape_document_type_id: 'car',
+    entreprises_lecture: true,
+    public_lecture: true,
+  },
+
+  {
+    description: null,
+    id: etapeDocumentIdValidator.parse('idlem'),
+    etape_document_type_id: 'lem',
+    entreprises_lecture: true,
+    public_lecture: true,
+  },
+
+  {
+    description: '',
+    id: etapeDocumentIdValidator.parse('ididm'),
+    etape_document_type_id: 'idm',
+    entreprises_lecture: true,
+    public_lecture: true,
+  },
+
+  {
+    description:
+      'la définition des mesures prévues par le pétitionnaire pour réhabiliter le site après exploitation, notamment la nature et les modalités de revégétalisation envisagée. (décret 2001-204, art. 5 bis)',
+    id: etapeDocumentIdValidator.parse('idmes'),
+    etape_document_type_id: 'mes',
+    entreprises_lecture: true,
+    public_lecture: true,
+  },
+  {
+    description: 'descriptif des méthodes envisagées pour l’exécution des travaux ((décret 2001-204, art. 6)',
+    id: etapeDocumentIdValidator.parse('idmet'),
+    etape_document_type_id: 'met',
+    entreprises_lecture: true,
+    public_lecture: true,
+  },
+  {
+    description: null,
+    id: etapeDocumentIdValidator.parse('idnip'),
+    etape_document_type_id: 'nip',
+    entreprises_lecture: true,
+    public_lecture: true,
+  },
+
+  {
+    description: 'Description du phasage et planigramme des travaux. (décret 2001-204, art. 5)',
+    id: etapeDocumentIdValidator.parse('idprg'),
+    etape_document_type_id: 'prg',
+    entreprises_lecture: true,
+    public_lecture: true,
+  },
+  {
+    description: "le schéma de pénétration du massif forestier proposé par le pétitionnaire pour l'acheminement du matériel lourd et la desserte du chantier (décret 2001-204, art. 5 bis)",
+    id: etapeDocumentIdValidator.parse('idsch'),
+    etape_document_type_id: 'sch',
+    entreprises_lecture: true,
+    public_lecture: true,
+  },
+] as const
+
+const entreprise1 = { id: entrepriseIdValidator.parse('id1'), nom: 'entrepriseNom' }
+test('etapeDocumentsStepIsComplete', () => {
+  expect(etapeDocumentsStepIsComplete({ typeId: 'asl', contenu: {}, statutId: 'fai' }, 'oct', 'axm', [], [], null, null, null)).toBe(false)
+  expect(
+    etapeDocumentsStepIsComplete(
+      { typeId: 'asl', contenu: {}, statutId: 'fai' },
+      'oct',
+      'axm',
+      [{ id: etapeDocumentIdValidator.parse('idDoc1'), description: null, entreprises_lecture: true, public_lecture: true, etape_document_type_id: documentTypeIdComplementaireObligatoireASL }],
+      [],
+      null,
+      null,
+      null
+    )
+  ).toBe(true)
+
+  expect(etapeDocumentsStepIsComplete({ typeId: 'mfr', contenu: {}, statutId: 'aco' }, 'oct', 'axm', axmDocumentsComplete, [], null, null, { ...testBlankUser, role: 'super' })).toBe(true)
+  expect(
+    etapeDocumentsStepIsComplete({ typeId: 'mfr', contenu: {}, statutId: 'aco' }, 'oct', 'axm', axmDocumentsComplete, [], null, null, {
+      ...testBlankUser,
+      role: 'entreprise',
+      entreprises: [entreprise1],
+    })
+  ).toBe(false)
+
+  expect(
+    etapeDocumentsStepIsComplete(
+      { typeId: 'mfr', contenu: {}, statutId: 'aco' },
+      'oct',
+      'axm',
+      axmDocumentsComplete,
+      [],
+      {
+        arrete_prefectoral: '',
+        date: toCaminoDate('2023-02-02'),
+        description: null,
+        entreprises_lecture: true,
+        etape_statut_id: 'exe',
+        public_lecture: true,
+        etape_document_type_id: documentTypeIdComplementaireObligatoireDAE,
+        id: etapeDocumentIdValidator.parse('daeId'),
+      },
+      {
+        date: toCaminoDate('2023-02-02'),
+        description: null,
+        entreprises_lecture: true,
+        etape_statut_id: 'exe',
+        public_lecture: true,
+        etape_document_type_id: documentTypeIdComplementaireObligatoireASL,
+        id: etapeDocumentIdValidator.parse('aslId'),
+      },
+      { ...testBlankUser, role: 'entreprise', entreprises: [entreprise1] }
+    )
+  ).toBe(true)
+})
+
+test('entrepriseDocumentsStepIsVisible', () => {
+  expect(entrepriseDocumentsStepIsVisible({ typeId: 'asl' }, 'oct', 'axm')).toBe(false)
+  expect(entrepriseDocumentsStepIsVisible({ typeId: 'mfr' }, 'oct', 'axm')).toBe(true)
+  expect(entrepriseDocumentsStepIsVisible({ typeId: 'cod' }, 'oct', 'axm')).toBe(false)
+})
+test('entrepriseDocumentsStepIsComplete', () => {
+  expect(entrepriseDocumentsStepIsComplete({ typeId: 'asl', titulaires: [], amodiataires: [], contenu: {} }, 'oct', 'axm', [])).toBe(true)
+  expect(entrepriseDocumentsStepIsComplete({ typeId: 'mfr', titulaires: [], amodiataires: [], contenu: {} }, 'oct', 'axm', [])).toBe(true)
+
+  expect(entrepriseDocumentsStepIsComplete({ typeId: 'mfr', titulaires: [{ ...entreprise1, operateur: false }], amodiataires: [], contenu: {} }, 'oct', 'axm', [])).toBe(false)
+  expect(entrepriseDocumentsStepIsComplete({ typeId: 'mfr', titulaires: [], amodiataires: [{ ...entreprise1, operateur: false }], contenu: {} }, 'oct', 'axm', [])).toBe(false)
+
+  expect(
+    entrepriseDocumentsStepIsComplete({ typeId: 'mfr', titulaires: [], amodiataires: [{ ...entreprise1, operateur: false }], contenu: { arm: { mecanise: false } } }, 'oct', 'arm', [
+      {
+        id: entrepriseDocumentIdValidator.parse('idatf'),
+        documentTypeId: 'atf',
+        entrepriseId: entreprise1.id,
+      },
+      {
+        id: entrepriseDocumentIdValidator.parse('idcur'),
+        documentTypeId: 'cur',
+        entrepriseId: entreprise1.id,
+      },
+
+      {
+        id: entrepriseDocumentIdValidator.parse('idjid'),
+        documentTypeId: 'jid',
+        entrepriseId: entreprise1.id,
+      },
+      {
+        id: entrepriseDocumentIdValidator.parse('idjct'),
+        documentTypeId: 'jct',
+        entrepriseId: entreprise1.id,
+      },
+      {
+        id: entrepriseDocumentIdValidator.parse('idkbi'),
+        documentTypeId: 'kbi',
+        entrepriseId: entreprise1.id,
+      },
+      {
+        id: entrepriseDocumentIdValidator.parse('idjcf'),
+        documentTypeId: 'jcf',
+        entrepriseId: entreprise1.id,
+      },
+    ])
+  ).toBe(true)
+})
+
+test('getDocumentsTypes', () => {
+  expect(getDocumentsTypes({ typeId: 'asl', contenu: {} }, 'oct', 'axm', [])).toMatchInlineSnapshot(`
+    [
+      {
+        "id": "dei",
+        "nom": "Décision",
+        "optionnel": true,
+      },
+      {
+        "description": "Avis suite à la demande d'accord du propriétaire du sol",
+        "id": "let",
+        "nom": "Lettre",
+        "optionnel": false,
+      },
+    ]
+  `)
+
+  expect(getDocumentsTypes({ typeId: 'mfr', contenu: {} }, 'oct', 'arm', [])).toMatchInlineSnapshot(`
+    [
+      {
+        "id": "cam",
+        "nom": "Contrat d'amodiation",
+        "optionnel": true,
+      },
+      {
+        "description": undefined,
+        "id": "car",
+        "nom": "Documents cartographiques",
+        "optionnel": false,
+      },
+      {
+        "id": "cnt",
+        "nom": "Contrat",
+        "optionnel": true,
+      },
+      {
+        "id": "cod",
+        "nom": "Compléments au dossier de demande",
+        "optionnel": true,
+      },
+      {
+        "description": undefined,
+        "id": "dep",
+        "nom": "Décision cas par cas",
+        "optionnel": true,
+      },
+      {
+        "description": undefined,
+        "id": "doe",
+        "nom": "Dossier \\"Loi sur l'eau\\"",
+        "optionnel": true,
+      },
+      {
+        "description": undefined,
+        "id": "dom",
+        "nom": "Dossier de demande",
+        "optionnel": false,
+      },
+      {
+        "id": "dos",
+        "nom": "Dossier",
+        "optionnel": true,
+      },
+      {
+        "id": "fac",
+        "nom": "Facture",
+        "optionnel": true,
+      },
+      {
+        "id": "fic",
+        "nom": "Fiche de complétude",
+        "optionnel": true,
+      },
+      {
+        "id": "fip",
+        "nom": "Fiche de présentation",
+        "optionnel": true,
+      },
+      {
+        "description": undefined,
+        "id": "for",
+        "nom": "Formulaire de demande",
+        "optionnel": false,
+      },
+      {
+        "description": undefined,
+        "id": "jpa",
+        "nom": "Justificatif de paiement",
+        "optionnel": false,
+      },
+      {
+        "id": "lem",
+        "nom": "Lettre de demande",
+        "optionnel": true,
+      },
+      {
+        "id": "let",
+        "nom": "Lettre",
+        "optionnel": true,
+      },
+      {
+        "id": "noi",
+        "nom": "Notice d'incidence",
+        "optionnel": true,
+      },
+      {
+        "id": "rec",
+        "nom": "Récépissé \\"Loi sur l'eau\\"",
+        "optionnel": true,
+      },
+    ]
+  `)
+
+  expect(getDocumentsTypes({ typeId: 'mfr', contenu: { arm: { mecanise: true } } }, 'oct', 'arm', [])).toMatchInlineSnapshot(`
+    [
+      {
+        "id": "cam",
+        "nom": "Contrat d'amodiation",
+        "optionnel": true,
+      },
+      {
+        "description": undefined,
+        "id": "car",
+        "nom": "Documents cartographiques",
+        "optionnel": false,
+      },
+      {
+        "id": "cnt",
+        "nom": "Contrat",
+        "optionnel": true,
+      },
+      {
+        "id": "cod",
+        "nom": "Compléments au dossier de demande",
+        "optionnel": true,
+      },
+      {
+        "description": undefined,
+        "id": "dep",
+        "nom": "Décision cas par cas",
+        "optionnel": false,
+      },
+      {
+        "description": undefined,
+        "id": "doe",
+        "nom": "Dossier \\"Loi sur l'eau\\"",
+        "optionnel": false,
+      },
+      {
+        "description": undefined,
+        "id": "dom",
+        "nom": "Dossier de demande",
+        "optionnel": false,
+      },
+      {
+        "id": "dos",
+        "nom": "Dossier",
+        "optionnel": true,
+      },
+      {
+        "id": "fac",
+        "nom": "Facture",
+        "optionnel": true,
+      },
+      {
+        "id": "fic",
+        "nom": "Fiche de complétude",
+        "optionnel": true,
+      },
+      {
+        "id": "fip",
+        "nom": "Fiche de présentation",
+        "optionnel": true,
+      },
+      {
+        "description": undefined,
+        "id": "for",
+        "nom": "Formulaire de demande",
+        "optionnel": false,
+      },
+      {
+        "description": undefined,
+        "id": "jpa",
+        "nom": "Justificatif de paiement",
+        "optionnel": false,
+      },
+      {
+        "id": "lem",
+        "nom": "Lettre de demande",
+        "optionnel": true,
+      },
+      {
+        "id": "let",
+        "nom": "Lettre",
+        "optionnel": true,
+      },
+      {
+        "id": "noi",
+        "nom": "Notice d'incidence",
+        "optionnel": true,
+      },
+      {
+        "id": "rec",
+        "nom": "Récépissé \\"Loi sur l'eau\\"",
+        "optionnel": true,
+      },
+    ]
+  `)
+
+  expect(getDocumentsTypes({ typeId: 'mfr', contenu: {} }, 'oct', 'axm', ['1'])).toMatchInlineSnapshot(`
+    [
+      {
+        "id": "cam",
+        "nom": "Contrat d'amodiation",
+        "optionnel": true,
+      },
+      {
+        "description": "Plan à l’échelle 1/50 000ème ou 1/100 000ème",
+        "id": "car",
+        "nom": "Documents cartographiques",
+        "optionnel": false,
+      },
+      {
+        "id": "cnt",
+        "nom": "Contrat",
+        "optionnel": true,
+      },
+      {
+        "id": "cod",
+        "nom": "Compléments au dossier de demande",
+        "optionnel": true,
+      },
+      {
+        "id": "dep",
+        "nom": "Décision cas par cas",
+        "optionnel": true,
+      },
+      {
+        "id": "doe",
+        "nom": "Dossier \\"Loi sur l'eau\\"",
+        "optionnel": true,
+      },
+      {
+        "id": "dom",
+        "nom": "Dossier de demande",
+        "optionnel": true,
+      },
+      {
+        "id": "dos",
+        "nom": "Dossier",
+        "optionnel": true,
+      },
+      {
+        "id": "fac",
+        "nom": "Facture",
+        "optionnel": true,
+      },
+      {
+        "id": "fic",
+        "nom": "Fiche de complétude",
+        "optionnel": true,
+      },
+      {
+        "id": "fip",
+        "nom": "Fiche de présentation",
+        "optionnel": true,
+      },
+      {
+        "id": "for",
+        "nom": "Formulaire de demande",
+        "optionnel": true,
+      },
+      {
+        "id": "jpa",
+        "nom": "Justificatif de paiement",
+        "optionnel": true,
+      },
+      {
+        "description": undefined,
+        "id": "lem",
+        "nom": "Lettre de demande",
+        "optionnel": false,
+      },
+      {
+        "description": undefined,
+        "id": "let",
+        "nom": "Lettre",
+        "optionnel": true,
+      },
+      {
+        "id": "noi",
+        "nom": "Notice d'incidence",
+        "optionnel": true,
+      },
+      {
+        "id": "rec",
+        "nom": "Récépissé \\"Loi sur l'eau\\"",
+        "optionnel": true,
+      },
+      {
+        "description": "la liste et la valeur du matériel d’extraction et de
+     traitement que le demandeur détient ou qu’il 
+    envisage d’acquérir ainsi que, dans ce dernier
+     cas, le financement correspondant. Ces pièces 
+    sont demandées au titre de la justification des 
+    capacités financières du
+    demandeur 
+    (décret 2001-204, art. 7)",
+        "id": "idm",
+        "nom": "Identification de matériel",
+        "optionnel": false,
+      },
+      {
+        "description": undefined,
+        "id": "jeg",
+        "nom": "Justification d’existence du gisement",
+        "optionnel": true,
+      },
+      {
+        "description": "la définition des mesures prévues par le pétitionnaire pour réhabiliter le site après exploitation, notamment la nature et les modalités de revégétalisation envisagée. (décret 2001-204, art. 5 bis)",
+        "id": "mes",
+        "nom": "Mesures prévues pour réhabiliter le site ",
+        "optionnel": false,
+      },
+      {
+        "description": "descriptif des méthodes envisagées pour l’exécution des travaux ((décret 2001-204, art. 6)",
+        "id": "met",
+        "nom": "Méthodes pour l'exécution des travaux",
+        "optionnel": false,
+      },
+      {
+        "description": undefined,
+        "id": "nip",
+        "nom": "Notice d’impact",
+        "optionnel": false,
+      },
+      {
+        "description": "Obligatoire pour les AEX hors de la zone 2 du SDOM",
+        "id": "nir",
+        "nom": "Notice d’impact renforcée",
+        "optionnel": true,
+      },
+      {
+        "description": "Description du phasage et planigramme des travaux. (décret 2001-204, art. 5)",
+        "id": "prg",
+        "nom": "Programme des travaux ",
+        "optionnel": false,
+      },
+      {
+        "description": "le schéma de pénétration du massif forestier proposé par le pétitionnaire pour l'acheminement du matériel lourd et la desserte du chantier (décret 2001-204, art. 5 bis)",
+        "id": "sch",
+        "nom": "Schéma de pénétration du massif forestier",
+        "optionnel": false,
+      },
+    ]
+  `)
+
+  expect(getDocumentsTypes({ typeId: 'mfr', contenu: {} }, 'oct', 'axm', ['2'])).toMatchInlineSnapshot(`
+    [
+      {
+        "id": "cam",
+        "nom": "Contrat d'amodiation",
+        "optionnel": true,
+      },
+      {
+        "description": "Plan à l’échelle 1/50 000ème ou 1/100 000ème",
+        "id": "car",
+        "nom": "Documents cartographiques",
+        "optionnel": false,
+      },
+      {
+        "id": "cnt",
+        "nom": "Contrat",
+        "optionnel": true,
+      },
+      {
+        "id": "cod",
+        "nom": "Compléments au dossier de demande",
+        "optionnel": true,
+      },
+      {
+        "id": "dep",
+        "nom": "Décision cas par cas",
+        "optionnel": true,
+      },
+      {
+        "id": "doe",
+        "nom": "Dossier \\"Loi sur l'eau\\"",
+        "optionnel": true,
+      },
+      {
+        "id": "dom",
+        "nom": "Dossier de demande",
+        "optionnel": true,
+      },
+      {
+        "id": "dos",
+        "nom": "Dossier",
+        "optionnel": true,
+      },
+      {
+        "id": "fac",
+        "nom": "Facture",
+        "optionnel": true,
+      },
+      {
+        "id": "fic",
+        "nom": "Fiche de complétude",
+        "optionnel": true,
+      },
+      {
+        "id": "fip",
+        "nom": "Fiche de présentation",
+        "optionnel": true,
+      },
+      {
+        "id": "for",
+        "nom": "Formulaire de demande",
+        "optionnel": true,
+      },
+      {
+        "id": "jpa",
+        "nom": "Justificatif de paiement",
+        "optionnel": true,
+      },
+      {
+        "description": undefined,
+        "id": "lem",
+        "nom": "Lettre de demande",
+        "optionnel": false,
+      },
+      {
+        "description": undefined,
+        "id": "let",
+        "nom": "Lettre",
+        "optionnel": true,
+      },
+      {
+        "id": "noi",
+        "nom": "Notice d'incidence",
+        "optionnel": true,
+      },
+      {
+        "id": "rec",
+        "nom": "Récépissé \\"Loi sur l'eau\\"",
+        "optionnel": true,
+      },
+      {
+        "description": "la liste et la valeur du matériel d’extraction et de
+     traitement que le demandeur détient ou qu’il 
+    envisage d’acquérir ainsi que, dans ce dernier
+     cas, le financement correspondant. Ces pièces 
+    sont demandées au titre de la justification des 
+    capacités financières du
+    demandeur 
+    (décret 2001-204, art. 7)",
+        "id": "idm",
+        "nom": "Identification de matériel",
+        "optionnel": false,
+      },
+      {
+        "description": undefined,
+        "id": "jeg",
+        "nom": "Justification d’existence du gisement",
+        "optionnel": false,
+      },
+      {
+        "description": "la définition des mesures prévues par le pétitionnaire pour réhabiliter le site après exploitation, notamment la nature et les modalités de revégétalisation envisagée. (décret 2001-204, art. 5 bis)",
+        "id": "mes",
+        "nom": "Mesures prévues pour réhabiliter le site ",
+        "optionnel": false,
+      },
+      {
+        "description": "descriptif des méthodes envisagées pour l’exécution des travaux ((décret 2001-204, art. 6)",
+        "id": "met",
+        "nom": "Méthodes pour l'exécution des travaux",
+        "optionnel": false,
+      },
+      {
+        "description": undefined,
+        "id": "nip",
+        "nom": "Notice d’impact",
+        "optionnel": true,
+      },
+      {
+        "description": "Obligatoire pour les AEX hors de la zone 2 du SDOM",
+        "id": "nir",
+        "nom": "Notice d’impact renforcée",
+        "optionnel": false,
+      },
+      {
+        "description": "Description du phasage et planigramme des travaux. (décret 2001-204, art. 5)",
+        "id": "prg",
+        "nom": "Programme des travaux ",
+        "optionnel": false,
+      },
+      {
+        "description": "le schéma de pénétration du massif forestier proposé par le pétitionnaire pour l'acheminement du matériel lourd et la desserte du chantier (décret 2001-204, art. 5 bis)",
+        "id": "sch",
+        "nom": "Schéma de pénétration du massif forestier",
+        "optionnel": false,
+      },
+    ]
+  `)
+})
diff --git a/packages/common/src/permissions/etape-form.ts b/packages/common/src/permissions/etape-form.ts
new file mode 100644
index 0000000000000000000000000000000000000000..3d7488c3542d5680bc168c564637b9bfb01039b4
--- /dev/null
+++ b/packages/common/src/permissions/etape-form.ts
@@ -0,0 +1,142 @@
+import { EntrepriseDocumentId, EntrepriseId } from '../entreprise.js'
+import { DocumentComplementaireAslEtapeDocumentModification, DocumentComplementaireDaeEtapeDocumentModification, EtapeDocument, EtapeWithHeritage, TempEtapeDocument, needAslAndDae } from '../etape.js'
+import { User } from '../roles.js'
+import { DemarcheTypeId } from '../static/demarchesTypes.js'
+import { EntrepriseDocumentTypeId } from '../static/documentsTypes.js'
+import { ETAPES_TYPES, EtapeTypeId, EtapesTypes } from '../static/etapesTypes.js'
+import { SDOMZoneId } from '../static/sdom.js'
+import { TitreTypeId } from '../static/titresTypes.js'
+import { getDocuments } from '../static/titresTypes_demarchesTypes_etapesTypes/documents.js'
+import { getEntrepriseDocuments } from '../static/titresTypes_demarchesTypes_etapesTypes/entrepriseDocuments.js'
+import { documentTypeIdsBySdomZonesGet } from '../static/titresTypes_demarchesTypes_etapesTypes/sdom.js'
+import { getSections, getSectionsWithValue } from '../static/titresTypes_demarchesTypes_etapesTypes/sections.js'
+import { isNotNullNorUndefinedNorEmpty, isNotNullNorUndefined, DeepReadonly, onlyUnique } from '../typescript-tools.js'
+import { sectionsWithValueCompleteValidate } from './sections.js'
+import { dureeOptionalCheck } from './titres-etapes.js'
+
+export const fondamentaleStepIsVisible = (etapeTypeId: EtapeTypeId): boolean => {
+  return EtapesTypes[etapeTypeId].fondamentale
+}
+
+export const fondamentaleStepIsComplete = (flattened: DeepReadonly<Pick<EtapeWithHeritage, 'typeId' | 'duree' | 'substances'>>, demarcheTypeId: DemarcheTypeId, titreTypeId: TitreTypeId): boolean => {
+  if (!fondamentaleStepIsVisible(flattened.typeId)) {
+    return true
+  }
+
+  return (
+    flattened.typeId !== ETAPES_TYPES.demande ||
+    (isNotNullNorUndefinedNorEmpty(flattened.substances) && (dureeOptionalCheck(flattened.typeId, demarcheTypeId, titreTypeId) || (isNotNullNorUndefined(flattened.duree) && flattened.duree > 0)))
+  )
+}
+
+export const sectionsStepIsVisible = (etape: Pick<EtapeWithHeritage, 'typeId'>, demarcheTypeId: DemarcheTypeId, titreTypeId: TitreTypeId): boolean => {
+  return getSections(titreTypeId, demarcheTypeId, etape.typeId).length > 0
+}
+export const sectionsStepIsComplete = (etape: DeepReadonly<Pick<EtapeWithHeritage, 'typeId' | 'contenu'>>, demarcheTypeId: DemarcheTypeId, titreTypeId: TitreTypeId): boolean => {
+  if (!sectionsStepIsVisible(etape, demarcheTypeId, titreTypeId)) {
+    return true
+  }
+
+  const sections = getSections(titreTypeId, demarcheTypeId, etape.typeId)
+  const sectionsWithValue = getSectionsWithValue(sections, etape.contenu)
+
+  return sectionsWithValueCompleteValidate(sectionsWithValue).length === 0
+}
+
+export const perimetreStepIsVisible = (etape: Pick<EtapeWithHeritage, 'typeId'>): boolean => {
+  return EtapesTypes[etape.typeId].fondamentale
+}
+export const perimetreStepIsComplete = (etape: DeepReadonly<Pick<EtapeWithHeritage, 'typeId' | 'geojson4326Perimetre'>>): boolean => {
+  if (!perimetreStepIsVisible(etape)) {
+    return true
+  }
+
+  return etape.typeId !== 'mfr' || isNotNullNorUndefined(etape.geojson4326Perimetre)
+}
+
+export const getDocumentsTypes = (
+  etape: DeepReadonly<Pick<EtapeWithHeritage, 'typeId' | 'contenu'>>,
+  demarcheTypeId: DemarcheTypeId,
+  titreTypeId: TitreTypeId,
+  sdomZoneIds: DeepReadonly<SDOMZoneId[]>
+) => {
+  const dts = getDocuments(titreTypeId, demarcheTypeId, etape.typeId)
+
+  // si la démarche est mécanisée il faut ajouter des documents obligatoires
+  if (isNotNullNorUndefined(etape.contenu) && isNotNullNorUndefined(etape.contenu.arm) && etape.contenu.arm.mecanise === true) {
+    for (const documentType of dts) {
+      if (['doe', 'dep'].includes(documentType.id)) {
+        documentType.optionnel = false
+      }
+    }
+  }
+
+  const sdomZonesDocumentTypeIds = documentTypeIdsBySdomZonesGet(sdomZoneIds, titreTypeId, demarcheTypeId, etape.typeId)
+  if (isNotNullNorUndefinedNorEmpty(sdomZonesDocumentTypeIds)) {
+    for (const documentType of dts) {
+      if (sdomZonesDocumentTypeIds.includes(documentType.id)) {
+        documentType.optionnel = false
+      }
+    }
+  }
+
+  return dts
+}
+
+export const etapeDocumentsStepIsVisible = (etape: Pick<EtapeWithHeritage, 'typeId'>, demarcheTypeId: DemarcheTypeId, titreTypeId: TitreTypeId): boolean => {
+  return getDocuments(titreTypeId, demarcheTypeId, etape.typeId).length > 0
+}
+export const etapeDocumentsStepIsComplete = (
+  etape: DeepReadonly<Pick<EtapeWithHeritage, 'typeId' | 'contenu' | 'statutId'>>,
+  demarcheTypeId: DemarcheTypeId,
+  titreTypeId: TitreTypeId,
+  etapeDocuments: DeepReadonly<(EtapeDocument | TempEtapeDocument)[]>,
+  sdomZoneIds: DeepReadonly<SDOMZoneId[]>,
+  daeDocument: DeepReadonly<DocumentComplementaireDaeEtapeDocumentModification> | null,
+  aslDocument: DeepReadonly<DocumentComplementaireAslEtapeDocumentModification> | null,
+  user: User
+): boolean => {
+  if (!etapeDocumentsStepIsVisible(etape, demarcheTypeId, titreTypeId)) {
+    return true
+  }
+
+  const documentTypes = getDocumentsTypes({ contenu: etape.contenu, typeId: etape.typeId }, demarcheTypeId, titreTypeId, sdomZoneIds)
+
+  if (documentTypes.every(({ optionnel, id }) => optionnel || etapeDocuments.some(({ etape_document_type_id }) => etape_document_type_id === id))) {
+    if (needAslAndDae({ etapeTypeId: etape.typeId, demarcheTypeId, titreTypeId }, etape.statutId, user)) {
+      return isNotNullNorUndefined(daeDocument) && isNotNullNorUndefined(aslDocument)
+    }
+
+    return true
+  }
+
+  return false
+}
+
+export const entrepriseDocumentsStepIsVisible = (etape: Pick<EtapeWithHeritage, 'typeId'>, demarcheTypeId: DemarcheTypeId, titreTypeId: TitreTypeId): boolean => {
+  return getEntrepriseDocuments(titreTypeId, demarcheTypeId, etape.typeId).length > 0
+}
+export const entrepriseDocumentsStepIsComplete = (
+  etape: DeepReadonly<Pick<EtapeWithHeritage, 'typeId' | 'contenu' | 'titulaires' | 'amodiataires'>>,
+  demarcheTypeId: DemarcheTypeId,
+  titreTypeId: TitreTypeId,
+  entreprisesDocuments: DeepReadonly<SelectedEntrepriseDocument[]>
+): boolean => {
+  if (!entrepriseDocumentsStepIsVisible(etape, demarcheTypeId, titreTypeId)) {
+    return true
+  }
+
+  const documentTypes = getEntrepriseDocuments(titreTypeId, demarcheTypeId, etape.typeId)
+
+  const entrepriseIds = [...etape.titulaires, ...etape.amodiataires].map(({ id }) => id).filter(onlyUnique)
+
+  return entrepriseIds.every(eId =>
+    documentTypes.every(({ optionnel, id }) => optionnel || entreprisesDocuments.some(({ documentTypeId, entrepriseId }) => documentTypeId === id && entrepriseId === eId))
+  )
+}
+
+export type SelectedEntrepriseDocument = {
+  id: EntrepriseDocumentId
+  entrepriseId: EntrepriseId
+  documentTypeId: EntrepriseDocumentTypeId
+}
diff --git a/packages/common/src/permissions/sections.test.ts b/packages/common/src/permissions/sections.test.ts
index 2558c3064c74db49ccafa6e0d535e68cfcd231b3..43c5e5f82761b99228d5cef14f7c223e607573ab 100644
--- a/packages/common/src/permissions/sections.test.ts
+++ b/packages/common/src/permissions/sections.test.ts
@@ -80,17 +80,6 @@ describe('sectionElementWithValueCompleteValidate', () => {
   ])('Pour élément date', (value, optionnel, expectedComplete) => {
     expect(sectionElementWithValueCompleteValidate({ type: 'date', value, optionnel })).toEqual(expectedComplete)
   })
-
-  test.each<[string | null, ElementWithValue['optionnel'], boolean]>([
-    ['', false, false],
-    [null, false, false],
-    ['fileId', false, true],
-    [null, true, true],
-    [null, undefined, false],
-    ['fileId', undefined, true],
-  ])('Pour élément file', (value, optionnel, expectedComplete) => {
-    expect(sectionElementWithValueCompleteValidate({ type: 'file', value, optionnel })).toEqual(expectedComplete)
-  })
 })
 
 describe('sectionsWithValueCompleteValidate', () => {
diff --git a/packages/common/src/permissions/sections.ts b/packages/common/src/permissions/sections.ts
index 4ea0f2fb30e94188e21babfbd5365939abde1203..bd6e53d86fc17c5a42fdb82589b6ed331cc96809 100644
--- a/packages/common/src/permissions/sections.ts
+++ b/packages/common/src/permissions/sections.ts
@@ -2,7 +2,7 @@ import { Section } from '../static/titresTypes_demarchesTypes_etapesTypes/sectio
 import { ElementWithValue } from '../sections.js'
 import { DeepReadonly, isNullOrUndefined } from '../typescript-tools.js'
 
-export type Contenu = { [key in string]?: { [secondKey in string]?: unknown } } | null | undefined
+export type Contenu = { [key in string]?: { [secondKey in string]?: unknown } } | null
 
 // @deprecated => sectionsWithValueCompleteValidate
 export const contenuCompleteValidate = (sections: DeepReadonly<Section[]>, contenu: Contenu): string[] => {
@@ -20,7 +20,7 @@ export const contenuCompleteValidate = (sections: DeepReadonly<Section[]>, conte
   return errors
 }
 
-export const sectionsWithValueCompleteValidate = (sections_with_value: { nom?: string; elements: Pick<ElementWithValue, 'nom' | 'optionnel' | 'value' | 'type'>[] }[]): string[] => {
+export const sectionsWithValueCompleteValidate = (sections_with_value: DeepReadonly<{ nom?: string; elements: Pick<ElementWithValue, 'nom' | 'optionnel' | 'value' | 'type'>[] }[]>): string[] => {
   const errors: string[] = []
   sections_with_value.forEach(s =>
     s.elements.forEach(e => {
@@ -33,7 +33,7 @@ export const sectionsWithValueCompleteValidate = (sections_with_value: { nom?: s
   return errors
 }
 
-export const sectionElementWithValueCompleteValidate = (elementWithValue: Pick<ElementWithValue, 'optionnel' | 'value' | 'type'>): boolean => {
+export const sectionElementWithValueCompleteValidate = (elementWithValue: DeepReadonly<Pick<ElementWithValue, 'optionnel' | 'value' | 'type'>>): boolean => {
   if ((isNullOrUndefined(elementWithValue.optionnel) || !elementWithValue.optionnel) && !['checkbox'].includes(elementWithValue.type)) {
     if (elementWithValue.value === undefined || elementWithValue.value === null || elementWithValue.value === '') {
       return false
diff --git a/packages/common/src/permissions/titres-etapes.test.ts b/packages/common/src/permissions/titres-etapes.test.ts
index 7120445165769b27640378f9edfa4827717ebd3f..6d37d0f4d1c25aceac4771f72b20b48eb25068a6 100644
--- a/packages/common/src/permissions/titres-etapes.test.ts
+++ b/packages/common/src/permissions/titres-etapes.test.ts
@@ -6,10 +6,11 @@ import { AdministrationId, ADMINISTRATION_IDS } from '../static/administrations.
 import { test, expect } from 'vitest'
 import { TestUser, testBlankUser } from '../tests-utils.js'
 import { TitreStatutId } from '../static/titresStatuts.js'
-import { EntrepriseId, newEntrepriseId } from '../entreprise.js'
+import { EntrepriseId, entrepriseIdValidator, newEntrepriseId } from '../entreprise.js'
 import { EtapeStatutId } from '../static/etapesStatuts.js'
 import { SubstanceLegaleId } from '../static/substancesLegales.js'
 import { FeatureMultiPolygon } from '../perimetre.js'
+import { toCaminoDate } from '../date.js'
 
 test.each<{ etapeTypeId: EtapeTypeId; demarcheTypeId: DemarcheTypeId; titreTypeId: TitreTypeId; optional: boolean }>([
   { etapeTypeId: 'mfr', demarcheTypeId: 'oct', titreTypeId: 'arm', optional: false },
@@ -243,14 +244,10 @@ const etapeComplete: Parameters<typeof isEtapeComplete>[0] = {
   substances: ['auru'],
   geojson4326Perimetre: multiPolygonWith4Points,
   duree: 4,
+  statutId: 'fai',
 }
 
-const armDocuments: Parameters<typeof isEtapeComplete>[3] = [
-  { typeId: 'car', fichier: true },
-  { typeId: 'dom', fichier: true },
-  { typeId: 'for', fichier: true },
-  { typeId: 'jpa', fichier: true },
-]
+const armDocuments: Parameters<typeof isEtapeComplete>[3] = [{ etape_document_type_id: 'car' }, { etape_document_type_id: 'dom' }, { etape_document_type_id: 'for' }, { etape_document_type_id: 'jpa' }]
 const armEntrepriseDocuments: Parameters<typeof isEtapeComplete>[4] = [
   { entreprise_document_type_id: 'cur' },
   { entreprise_document_type_id: 'jid' },
@@ -261,13 +258,13 @@ const armEntrepriseDocuments: Parameters<typeof isEtapeComplete>[4] = [
 ]
 
 const axmDocuments: Parameters<typeof isEtapeComplete>[3] = [
-  { typeId: 'car', fichier: true },
-  { typeId: 'lem', fichier: true },
-  { typeId: 'idm', fichier: true },
-  { typeId: 'mes', fichier: true },
-  { typeId: 'met', fichier: true },
-  { typeId: 'sch', fichier: true },
-  { typeId: 'prg', fichier: true },
+  { etape_document_type_id: 'car' },
+  { etape_document_type_id: 'lem' },
+  { etape_document_type_id: 'idm' },
+  { etape_document_type_id: 'mes' },
+  { etape_document_type_id: 'met' },
+  { etape_document_type_id: 'sch' },
+  { etape_document_type_id: 'prg' },
 ]
 
 const axmEntrepriseDocuments: Parameters<typeof isEtapeComplete>[4] = [
@@ -281,8 +278,24 @@ const axmEntrepriseDocuments: Parameters<typeof isEtapeComplete>[4] = [
   { entreprise_document_type_id: 'jct' },
 ]
 
+test('teste la complétude d’une demande d’AXM faite par un utilisateur entreprises', () => {
+  expect(
+    isEtapeComplete(
+      { ...etapeComplete, statutId: 'aco' },
+      'axm',
+      'oct',
+      axmDocuments,
+      axmEntrepriseDocuments,
+      [],
+      { arrete_prefectoral: '', date: toCaminoDate('2024-01-01'), description: null, entreprises_lecture: true, etape_document_type_id: 'arp', etape_statut_id: 'fai', public_lecture: true },
+      { date: toCaminoDate('2024-04-22'), description: null, entreprises_lecture: true, etape_document_type_id: 'let', etape_statut_id: 'fai', public_lecture: true },
+      { ...testBlankUser, role: 'entreprise', entreprises: [{ id: entrepriseIdValidator.parse('id1'), nom: 'nomEntreprise' }] }
+    )
+  ).toStrictEqual({ valid: true })
+})
+
 test('teste la complétude d’une demande d’ARM', () => {
-  expect(isEtapeComplete(etapeComplete, 'arm', 'oct', armDocuments, armEntrepriseDocuments, [])).toStrictEqual({ valid: true })
+  expect(isEtapeComplete(etapeComplete, 'arm', 'oct', armDocuments, armEntrepriseDocuments, [], null, null, { ...testBlankUser, role: 'super' })).toStrictEqual({ valid: true })
 })
 
 test.each<[SubstanceLegaleId[], EtapeTypeId, TitreTypeId, Parameters<typeof isEtapeComplete>[3], Parameters<typeof isEtapeComplete>[4], boolean]>([
@@ -300,7 +313,7 @@ test.each<[SubstanceLegaleId[], EtapeTypeId, TitreTypeId, Parameters<typeof isEt
     typeId: etapeType,
   }
 
-  const result = isEtapeComplete(titreEtape, titreType, 'oct', testDocuments, entrepriseDocuments, [])
+  const result = isEtapeComplete(titreEtape, titreType, 'oct', testDocuments, entrepriseDocuments, [], null, null, { ...testBlankUser, role: 'super' })
 
   const errorLabel = 'au moins une substance doit être renseignée'
 
@@ -329,7 +342,7 @@ test.each<[FeatureMultiPolygon | null, EtapeTypeId, TitreTypeId, Parameters<type
     typeId: etapeType,
   }
 
-  const result = isEtapeComplete(titreEtape, titreType, 'oct', documents, entrepriseDocuments, [])
+  const result = isEtapeComplete(titreEtape, titreType, 'oct', documents, entrepriseDocuments, [], null, null, { ...testBlankUser, role: 'super' })
 
   const errorLabel = 'le périmètre doit être renseigné'
   if (error) {
@@ -344,7 +357,7 @@ test.each<[FeatureMultiPolygon | null, EtapeTypeId, TitreTypeId, Parameters<type
 })
 
 test('[DEPRECATED] une demande d’ARM mécanisée a des documents obligatoires supplémentaires', () => {
-  const errors = isEtapeComplete({ ...etapeComplete, contenu: { arm: { mecanise: true } } }, 'arm', 'oct', armDocuments, armEntrepriseDocuments, [])
+  const errors = isEtapeComplete({ ...etapeComplete, contenu: { arm: { mecanise: true } } }, 'arm', 'oct', armDocuments, armEntrepriseDocuments, [], null, null, { ...testBlankUser, role: 'super' })
   expect(errors).toMatchInlineSnapshot(`
     {
       "errors": [
@@ -363,7 +376,10 @@ test('une demande d’ARM mécanisée a des documents obligatoires supplémentai
     'oct',
     armDocuments,
     armEntrepriseDocuments,
-    []
+    [],
+    null,
+    null,
+    { ...testBlankUser, role: 'super' }
   )
   expect(errors).toMatchInlineSnapshot(`
     {
@@ -392,7 +408,7 @@ test.each<[number | undefined | null, EtapeTypeId, TitreTypeId, Parameters<typeo
     typeId: etapeType,
   }
 
-  const result = isEtapeComplete(titreEtape, titreType, 'oct', documents, entreprisedocuments, [])
+  const result = isEtapeComplete(titreEtape, titreType, 'oct', documents, entreprisedocuments, [], null, null, { ...testBlankUser, role: 'super' })
 
   const errorLabel = 'la durée doit être renseignée'
   if (error) {
diff --git a/packages/common/src/permissions/titres-etapes.ts b/packages/common/src/permissions/titres-etapes.ts
index e01fcff725e5ec5d2b0cf4d379052ed8aa7aa988..ce9c4b5e9e9e80c344fd710e2631b6e1b299cb05 100644
--- a/packages/common/src/permissions/titres-etapes.ts
+++ b/packages/common/src/permissions/titres-etapes.ts
@@ -11,18 +11,18 @@ import { canAdministrationEtapeTypeId } from '../static/administrationsTitresTyp
 
 import { TitreStatutId } from '../static/titresStatuts.js'
 import { EntrepriseDocument, EntrepriseId } from '../entreprise.js'
-import { Section, getSections } from '../static/titresTypes_demarchesTypes_etapesTypes/sections.js'
+import { getSections } from '../static/titresTypes_demarchesTypes_etapesTypes/sections.js'
 import { getEntrepriseDocuments } from '../static/titresTypes_demarchesTypes_etapesTypes/entrepriseDocuments.js'
 import { SDOMZoneId } from '../static/sdom.js'
-import { documentTypeIdsBySdomZonesGet } from '../static/titresTypes_demarchesTypes_etapesTypes/sdom.js'
-import { DeepReadonly, NonEmptyArray, isNonEmptyArray, isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty, isNullOrUndefined } from '../typescript-tools.js'
-import { DocumentsTypes, DocumentType, DocumentTypeId, EntrepriseDocumentTypeId } from '../static/documentsTypes.js'
+import { NonEmptyArray, isNonEmptyArray, isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty, isNullOrUndefined } from '../typescript-tools.js'
+import { DocumentType, EntrepriseDocumentTypeId } from '../static/documentsTypes.js'
 import { SubstanceLegaleId } from '../static/substancesLegales.js'
 import { isDocumentsComplete } from './documents.js'
-import { getDocuments } from '../static/titresTypes_demarchesTypes_etapesTypes/documents.js'
-import { Contenu, contenuCompleteValidate, sectionsWithValueCompleteValidate } from './sections.js'
-import { SectionWithValue } from '../sections.js'
+import { contenuCompleteValidate, sectionsWithValueCompleteValidate } from './sections.js'
+import { ElementWithValue, SectionWithValue } from '../sections.js'
 import { FeatureMultiPolygon } from '../perimetre.js'
+import { EtapeDocument, GetEtapeDocumentsByEtapeId, GetEtapeDocumentsByEtapeIdAslDocument, GetEtapeDocumentsByEtapeIdDaeDocument, needAslAndDae } from '../etape.js'
+import { getDocumentsTypes } from './etape-form.js'
 
 export const dureeOptionalCheck = (etapeTypeId: EtapeTypeId, demarcheTypeId: DemarcheTypeId, titreTypeId: TitreTypeId): boolean => {
   if (titreTypeId !== 'axm' && titreTypeId !== 'arm') {
@@ -143,27 +143,29 @@ const canCreateOrEditEtape = (
 
 type IsEtapeCompleteEtape = {
   typeId: EtapeTypeId
+  statutId: EtapeStatutId
   /** 
-   @deprecated use sectionsWithValue
+   @deprecated use sectionsWithValue/
   */
-  contenu?: Contenu
+  contenu?: Record<string, Record<string, ElementWithValue['value']>>
   sectionsWithValue?: SectionWithValue[]
-  decisionsAnnexesSections?: DeepReadonly<Section[]> | null
-  decisionsAnnexesContenu?: Contenu
   geojson4326Perimetre?: null | FeatureMultiPolygon
   substances?: null | SubstanceLegaleId[]
   duree?: number | null
 }
+
+// TODO 2024-04-17 utiliser toutes les stepIsComplete
 export const isEtapeComplete = (
   titreEtape: IsEtapeCompleteEtape,
   titreTypeId: TitreTypeId,
   demarcheTypeId: DemarcheTypeId,
-  documents: { typeId: DocumentTypeId; fichier?: unknown; fichierNouveau?: unknown }[] | null | undefined,
+  documents: Pick<EtapeDocument, 'etape_document_type_id'>[],
   entrepriseDocuments: Pick<EntrepriseDocument, 'entreprise_document_type_id'>[],
-  sdomZones: SDOMZoneId[] | null | undefined
+  sdomZones: SDOMZoneId[] | null | undefined,
+  daeDocument: Omit<GetEtapeDocumentsByEtapeIdDaeDocument, 'id'> | null,
+  aslDocument: Omit<GetEtapeDocumentsByEtapeIdAslDocument, 'id'> | null,
+  user: User
 ): { valid: true } | { valid: false; errors: NonEmptyArray<string> } => {
-  const documentsTypes = getDocuments(titreTypeId, demarcheTypeId, titreEtape.typeId)
-
   const errors: string[] = []
   const sections = getSections(titreTypeId, demarcheTypeId, titreEtape.typeId)
   // les éléments non optionnel des sections sont renseignés
@@ -180,37 +182,27 @@ export const isEtapeComplete = (
     }
   }
 
-  // les décisions annexes sont complètes
-  if (titreEtape.decisionsAnnexesSections) {
-    errors.push(...contenuCompleteValidate(titreEtape.decisionsAnnexesSections, titreEtape.decisionsAnnexesContenu))
+  if (needAslAndDae({ etapeTypeId: titreEtape.typeId, demarcheTypeId, titreTypeId }, titreEtape.statutId, user)) {
+    if (isNullOrUndefined(daeDocument)) {
+      errors.push('L’arrêté préfectoral de la mission autorité environnementale est obligatoire')
+    }
+    if (isNullOrUndefined(aslDocument)) {
+      errors.push('La lettre de décision du propriétaire du sol est obligatoire')
+    }
   }
 
-  const dts: DocumentType[] = [...documentsTypes]
-  if (isNotNullNorUndefined(sdomZones)) {
-    // Ajoute les documents obligatoires en fonction des zones du SDOM
-    const documentTypeIds = documentTypeIdsBySdomZonesGet(sdomZones, titreTypeId, demarcheTypeId, titreEtape.typeId)
-
-    documentTypeIds?.forEach(dtId => dts.push({ id: dtId, nom: DocumentsTypes[dtId].nom, optionnel: false }))
+  let contenu = titreEtape.contenu
+  if (isNullOrUndefined(contenu) && isNotNullNorUndefinedNorEmpty(titreEtape.sectionsWithValue)) {
+    contenu = titreEtape.sectionsWithValue.reduce(
+      (accSection, section) => ({ ...accSection, [section.id]: section.elements.reduce((accElement, element) => ({ ...accElement, [element.id]: element.value }), {}) }),
+      {}
+    )
   }
+  const dts: DocumentType[] = getDocumentsTypes({ ...titreEtape, contenu: contenu ?? {} }, demarcheTypeId, titreTypeId, sdomZones ?? [])
 
-  // les fichiers obligatoires sont tous renseignés et complets
-  if (isNonEmptyArray(dts)) {
-    // ajoute des documents obligatoires pour les arm mécanisées
-    if (
-      (titreTypeId === 'arm' && titreEtape.contenu && titreEtape.contenu.arm && titreEtape.contenu?.arm?.mecanise === true) ||
-      (titreEtape.sectionsWithValue &&
-        titreEtape.sectionsWithValue.some(section => section.id === 'arm' && section.elements.some(element => element.id === 'mecanise' && element.type === 'radio' && (element.value ?? false))))
-    ) {
-      dts
-        .filter(dt => ['doe', 'dep'].includes(dt.id))
-        .forEach(dt => {
-          dt.optionnel = false
-        })
-    }
-    const documentsErrors = isDocumentsComplete(documents ?? [], dts)
-    if (!documentsErrors.valid) {
-      errors.push(...documentsErrors.errors)
-    }
+  const documentsErrors = isDocumentsComplete(documents ?? [], dts)
+  if (!documentsErrors.valid) {
+    errors.push(...documentsErrors.errors)
   }
 
   // les documents d'entreprise obligatoires sont tous présents
@@ -266,17 +258,12 @@ export const isEtapeDeposable = (
     administrationsLocales: AdministrationId[]
   },
   demarcheTypeId: DemarcheTypeId,
-  titreEtape: IsEtapeCompleteEtape & { statutId: EtapeStatutId },
-  documents:
-    | {
-        typeId: DocumentTypeId
-        fichier?: unknown
-        fichierNouveau?: unknown
-      }[]
-    | null
-    | undefined,
+  titreEtape: IsEtapeCompleteEtape,
+  etapeDocuments: Pick<EtapeDocument, 'etape_document_type_id'>[],
   entrepriseDocuments: Pick<EntrepriseDocument, 'entreprise_document_type_id'>[],
-  sdomZones: SDOMZoneId[] | null | undefined
+  sdomZones: SDOMZoneId[] | null | undefined,
+  daeDocument: GetEtapeDocumentsByEtapeId['dae'],
+  aslDocument: GetEtapeDocumentsByEtapeId['asl']
 ): boolean => {
   if (titreEtape.typeId === ETAPES_TYPES.demande && titreEtape.statutId === ETAPES_STATUTS.EN_CONSTRUCTION) {
     if (
@@ -291,7 +278,7 @@ export const isEtapeDeposable = (
         'modification'
       )
     ) {
-      const complete = isEtapeComplete(titreEtape, titre.typeId, demarcheTypeId, documents, entrepriseDocuments, sdomZones)
+      const complete = isEtapeComplete(titreEtape, titre.typeId, demarcheTypeId, etapeDocuments, entrepriseDocuments, sdomZones, daeDocument, aslDocument, user)
       if (!complete.valid) {
         console.warn(complete.errors)
 
@@ -304,3 +291,5 @@ export const isEtapeDeposable = (
 
   return false
 }
+
+export const canDeleteEtapeDocument = (etapeStatutId: EtapeStatutId | null): boolean => etapeStatutId === null || etapeStatutId === ETAPES_STATUTS.EN_CONSTRUCTION
diff --git a/packages/common/src/rest.ts b/packages/common/src/rest.ts
index c07b178194a48404edf7bd4411b7e37b8af69540..769c6acfcb3d2ed7311bace69f9c5cf1b5c650a7 100644
--- a/packages/common/src/rest.ts
+++ b/packages/common/src/rest.ts
@@ -1,7 +1,6 @@
 /* eslint-disable @typescript-eslint/ban-types */
 import { ZodType, z } from 'zod'
 import {
-  documentIdValidator,
   entrepriseDocumentIdValidator,
   entrepriseDocumentInputValidator,
   etapeEntrepriseDocumentValidator,
@@ -26,7 +25,7 @@ import {
 } from './titres.js'
 import { adminUserNotNullValidator, userValidator } from './roles.js'
 import { caminoAnneeValidator, caminoDateValidator } from './date.js'
-import { etapeIdOrSlugValidator, etapeIdValidator, etapeTypeEtapeStatutWithMainStepValidator } from './etape.js'
+import { etapeDocumentIdValidator, etapeIdOrSlugValidator, etapeIdValidator, etapeTypeEtapeStatutWithMainStepValidator, getEtapeDocumentsByEtapeIdValidator } from './etape.js'
 import {
   statistiquesDGTMValidator,
   statistiquesDataGouvValidator,
@@ -95,6 +94,7 @@ const IDS = [
   '/rest/etapesTypes/:demarcheId/:date',
   '/rest/demarches/:demarcheId/geojson',
   '/rest/etapes/:etapeId/geojson',
+  '/rest/etapes/:etapeId/etapeDocuments',
   '/rest/etapes/:etapeId/entrepriseDocuments',
   '/rest/etapes/:etapeId',
   '/rest/etapes/:etapeId/depot',
@@ -119,7 +119,6 @@ const IDS = [
   '/activites',
   '/utilisateurs',
   '/etape/zip/:etapeId',
-  '/etape/:etapeId/:fichierNom',
   '/entreprises',
   // NE PAS TOUCHER CES ROUTES, UTILISÉES PAR D'AUTRES
 ] as const
@@ -177,6 +176,7 @@ export const CaminoRestRoutes = {
   '/rest/etapesTypes/:demarcheId/:date': { params: { demarcheId: demarcheIdValidator, date: caminoDateValidator }, get: { output: z.array(etapeTypeEtapeStatutWithMainStepValidator) } },
   '/rest/demarches/:demarcheId/geojson': { params: { demarcheId: demarcheIdOrSlugValidator }, get: { output: perimetreInformationsValidator } },
   '/rest/etapes/:etapeId/geojson': { params: { etapeId: etapeIdOrSlugValidator }, get: { output: perimetreInformationsValidator } },
+  '/rest/etapes/:etapeId/etapeDocuments': { params: { etapeId: etapeIdValidator }, get: { output: getEtapeDocumentsByEtapeIdValidator } },
   '/rest/etapes/:etapeId/entrepriseDocuments': { params: { etapeId: etapeIdValidator }, get: { output: z.array(etapeEntrepriseDocumentValidator) } },
   '/rest/etapes/:etapeId': { params: { etapeId: etapeIdValidator }, delete: true },
   '/rest/etapes/:etapeId/depot': { params: { etapeId: etapeIdValidator }, put: { input: z.void(), output: z.void() } },
@@ -197,10 +197,10 @@ export const CaminoRestRoutes = {
   },
   '/deconnecter': { get: { output: z.string() } },
   '/changerMotDePasse': { get: { output: z.string() } },
-  '/download/fichiers/:documentId': { params: { documentId: z.union([documentIdValidator, entrepriseDocumentIdValidator]) }, download: true },
+  '/download/fichiers/:documentId': { params: { documentId: etapeDocumentIdValidator }, newDownload: true },
   '/download/entrepriseDocuments/:documentId': { params: { documentId: entrepriseDocumentIdValidator }, newDownload: true },
   '/download/activiteDocuments/:documentId': { params: { documentId: activiteDocumentIdValidator }, newDownload: true },
-  '/fichiers/:documentId': { params: { documentId: z.union([documentIdValidator, entrepriseDocumentIdValidator]) }, download: true },
+  '/fichiers/:documentId': { params: { documentId: etapeDocumentIdValidator }, newDownload: true },
   '/titres/:id': { params: { id: titreIdValidator }, download: true },
   '/titres': { download: true },
   '/titres_qgis': { download: true },
@@ -209,7 +209,6 @@ export const CaminoRestRoutes = {
   '/activites': { download: true },
   '/utilisateurs': { download: true },
   '/etape/zip/:etapeId': { params: { etapeId: etapeIdValidator }, download: true },
-  '/etape/:etapeId/:fichierNom': { params: { etapeId: etapeIdValidator, fichierNom: z.string() }, download: true },
   '/entreprises': { download: true },
 } as const satisfies { [k in CaminoRestRoute]: CaminoRoute<k> }
 
diff --git a/packages/common/src/sections.ts b/packages/common/src/sections.ts
index 29bf2c76fd0043600bda0bf649ae1e807bba05ca..1557dce35194170423089cadd320972134421640 100644
--- a/packages/common/src/sections.ts
+++ b/packages/common/src/sections.ts
@@ -4,7 +4,6 @@ import {
   checkboxElementValidator,
   checkboxesElementValidator,
   dateElementValidator,
-  fileElementValidator,
   numberElementValidator,
   radioElementValidator,
   selectElementWithOptionsValidator,
@@ -12,13 +11,10 @@ import {
   urlElementValidator,
 } from './static/titresTypes_demarchesTypes_etapesTypes/sections.js'
 import { z } from 'zod'
-import { isNotNullNorUndefined } from './typescript-tools.js'
+import { DeepReadonly, isNotNullNorUndefined } from './typescript-tools.js'
 
 const dateElementWithValueValidator = dateElementValidator.extend({ value: caminoDateValidator.nullable() })
 
-const fileElementWithValueValidator = fileElementValidator.extend({ value: z.string().nullable() })
-type FileElementWithValue = z.infer<typeof fileElementWithValueValidator>
-
 const textElementWithValueValidator = textElementValidator.extend({ value: z.string().nullable() })
 
 const urlElementWithValueValidator = urlElementValidator.extend({ value: z.string().nullable() })
@@ -27,6 +23,7 @@ const numberElementWithValueValidator = numberElementValidator.extend({ value: z
 type NumberElementWithValue = z.infer<typeof numberElementWithValueValidator>
 
 const radioElementWithValueValidator = radioElementValidator.extend({ value: z.boolean().nullable() })
+type RadioElementWithValue = z.infer<typeof radioElementWithValueValidator>
 
 const checkboxElementWithValueValidator = checkboxElementValidator.extend({ value: z.boolean().nullable() })
 
@@ -37,7 +34,6 @@ const selectElementWithValueValidator = selectElementWithOptionsValidator.extend
 })
 
 const elementWithValueValidator = z.union([
-  fileElementWithValueValidator,
   dateElementWithValueValidator,
   textElementWithValueValidator,
   urlElementWithValueValidator,
@@ -50,13 +46,12 @@ const elementWithValueValidator = z.union([
 
 export type ElementWithValue = z.infer<typeof elementWithValueValidator>
 
-export const isFileElement = (element: ElementWithValue): element is FileElementWithValue => {
-  return element.type === 'file'
-}
-
-export const isNumberElement = (element: ElementWithValue): element is NumberElementWithValue => {
+export const isNumberElement = (element: DeepReadonly<ElementWithValue>): element is DeepReadonly<NumberElementWithValue> => {
   return element.type === 'number' || element.type === 'integer'
 }
+export const isRadioElement = (element: DeepReadonly<ElementWithValue>): element is DeepReadonly<RadioElementWithValue> => {
+  return element.type === 'radio'
+}
 
 export const sectionWithValueValidator = z.object({ id: z.string(), nom: z.string().optional(), elements: z.array(elementWithValueValidator) })
 
diff --git a/packages/common/src/static/documentsTypes.ts b/packages/common/src/static/documentsTypes.ts
index a70ffbae331fab42dbc11d76b6f6b90c1c69f234..96ec45c5c12c84a917fbcb80ae0e4282aa3f654d 100644
--- a/packages/common/src/static/documentsTypes.ts
+++ b/packages/common/src/static/documentsTypes.ts
@@ -1,4 +1,5 @@
 import { z } from 'zod'
+import { NonEmptyArray, map } from '../typescript-tools.js'
 
 export interface DocumentType {
   id: DocumentTypeId
@@ -143,7 +144,7 @@ export const EntrepriseDocumentTypeIds = [
   DOCUMENTS_TYPES_IDS.TroisDerniersBilansEtComptesDeResultats,
   DOCUMENTS_TYPES_IDS.referencesProfessionnelles,
   DOCUMENTS_TYPES_IDS.declarationsBancairesOuCautionsAppropriees,
-] as const satisfies readonly (typeof IDS)[number][]
+] as const satisfies Readonly<NonEmptyArray<Readonly<(typeof IDS)[number]>>>
 
 export const entrepriseDocumentTypeIdValidator = z.enum(EntrepriseDocumentTypeIds)
 export type EntrepriseDocumentTypeId = z.infer<typeof entrepriseDocumentTypeIdValidator>
@@ -263,7 +264,7 @@ export const DocumentsTypes: { [key in DocumentTypeId]: Definition<key> } = {
   sir: { id: 'sir', nom: 'Avis de situation au répertoire Sirene' },
 }
 
-export const sortedEntrepriseDocumentTypes = EntrepriseDocumentTypeIds.map(id => DocumentsTypes[id]).sort((a, b) => a.nom.localeCompare(b.nom))
+export const sortedEntrepriseDocumentTypes = map(EntrepriseDocumentTypeIds, id => DocumentsTypes[id]).sort((a, b) => a.nom.localeCompare(b.nom))
 export const sortedDocumentTypes = IDS.map(id => DocumentsTypes[id]).sort((a, b) => a.nom.localeCompare(b.nom))
 
 const documentsTypesIds = Object.values(DOCUMENTS_TYPES_IDS)
diff --git a/packages/common/src/static/substancesLegales.ts b/packages/common/src/static/substancesLegales.ts
index d774de56acdb8c620b26921e133035346b580ba0..e4cd0c82f256b848127cae91b6f61db7f7e232ac 100644
--- a/packages/common/src/static/substancesLegales.ts
+++ b/packages/common/src/static/substancesLegales.ts
@@ -6,7 +6,7 @@ const IDS = ['cfxx','selh','aloh','anti','arge','arse','auru','bery','bism','cad
 export const substanceLegaleIdValidator = z.enum(IDS)
 export type SubstanceLegaleId = z.infer<typeof substanceLegaleIdValidator>
 
-export interface SubstanceLegale<T = SubstanceLegaleId> {
+interface SubstanceLegale<T = SubstanceLegaleId> {
   id: T
   nom: string
   description?: string
diff --git a/packages/common/src/static/titresTypes_demarchesTypes_etapesTypes/entrepriseDocuments.test.ts b/packages/common/src/static/titresTypes_demarchesTypes_etapesTypes/entrepriseDocuments.test.ts
new file mode 100644
index 0000000000000000000000000000000000000000..93404cbdfeaf40142ae3e6200822bcd9a3a1da1d
--- /dev/null
+++ b/packages/common/src/static/titresTypes_demarchesTypes_etapesTypes/entrepriseDocuments.test.ts
@@ -0,0 +1,105 @@
+import { expect, test } from 'vitest'
+import { getEntrepriseDocuments } from './entrepriseDocuments'
+
+test('getEntrepriseDocuments pas de documents', () => {
+  expect(getEntrepriseDocuments('apm', 'amo', 'wfo')).toMatchInlineSnapshot('[]')
+})
+
+test('getEntrepriseDocuments', () => {
+  expect(getEntrepriseDocuments('arm', 'oct', 'mfr')).toMatchInlineSnapshot(`
+    [
+      {
+        "description": undefined,
+        "id": "atf",
+        "nom": "Attestation fiscale",
+        "optionnel": false,
+      },
+      {
+        "id": "sir",
+        "nom": "Avis de situation au répertoire Sirene",
+        "optionnel": true,
+      },
+      {
+        "description": undefined,
+        "id": "cur",
+        "nom": "Curriculum vitae",
+        "optionnel": false,
+      },
+      {
+        "description": undefined,
+        "id": "idm",
+        "nom": "Identification de matériel",
+        "optionnel": true,
+      },
+      {
+        "description": undefined,
+        "id": "jid",
+        "nom": "Justificatif d’identité",
+        "optionnel": false,
+      },
+      {
+        "description": undefined,
+        "id": "jct",
+        "nom": "Justificatif des capacités techniques",
+        "optionnel": false,
+      },
+      {
+        "description": undefined,
+        "id": "kbi",
+        "nom": "Kbis",
+        "optionnel": false,
+      },
+      {
+        "description": undefined,
+        "id": "jcf",
+        "nom": "Justificatif des capacités financières",
+        "optionnel": false,
+      },
+    ]
+  `)
+
+  expect(getEntrepriseDocuments('prr', 'oct', 'mfr')).toMatchInlineSnapshot(`
+    [
+      {
+        "id": "atf",
+        "nom": "Attestation fiscale",
+        "optionnel": true,
+      },
+      {
+        "id": "sir",
+        "nom": "Avis de situation au répertoire Sirene",
+        "optionnel": true,
+      },
+      {
+        "id": "cur",
+        "nom": "Curriculum vitae",
+        "optionnel": true,
+      },
+      {
+        "id": "idm",
+        "nom": "Identification de matériel",
+        "optionnel": true,
+      },
+      {
+        "id": "jid",
+        "nom": "Justificatif d’identité",
+        "optionnel": true,
+      },
+      {
+        "id": "jct",
+        "nom": "Justificatif des capacités techniques",
+        "optionnel": true,
+      },
+      {
+        "id": "kbi",
+        "nom": "Kbis",
+        "optionnel": true,
+      },
+      {
+        "id": "jcf",
+        "nom": "Justificatif des capacités financières",
+        "optionnel": true,
+      },
+    ]
+  `)
+})
diff --git a/packages/common/src/static/titresTypes_demarchesTypes_etapesTypes/sdom.ts b/packages/common/src/static/titresTypes_demarchesTypes_etapesTypes/sdom.ts
index a2bc066a019831dc66a7320f6f33f17e105836cb..3bc7bed74baf7c990aef2cb961e71dc80430d369 100644
--- a/packages/common/src/static/titresTypes_demarchesTypes_etapesTypes/sdom.ts
+++ b/packages/common/src/static/titresTypes_demarchesTypes_etapesTypes/sdom.ts
@@ -1,3 +1,4 @@
+import { DeepReadonly } from '../../typescript-tools.js'
 import { DEMARCHES_TYPES_IDS } from '../demarchesTypes.js'
 import { DocumentTypeId, DOCUMENTS_TYPES_IDS } from '../documentsTypes.js'
 import { DOMAINES_IDS } from '../domaines.js'
@@ -6,7 +7,7 @@ import { SDOMZoneId, SDOMZoneIds } from '../sdom.js'
 import { toTitreTypeId } from '../titresTypes.js'
 import { TITRES_TYPES_TYPES_IDS } from '../titresTypesTypes.js'
 
-export const documentTypeIdsBySdomZonesGet = (sdomZones: SDOMZoneId[], titreTypeId: string, demarcheTypeId: string, etapeTypeId: string) => {
+export const documentTypeIdsBySdomZonesGet = (sdomZones: DeepReadonly<SDOMZoneId[]>, titreTypeId: string, demarcheTypeId: string, etapeTypeId: string) => {
   const documentTypeIds: DocumentTypeId[] = []
 
   // Pour les demandes d’octroi d’AXM
diff --git a/packages/common/src/static/titresTypes_demarchesTypes_etapesTypes/sections.ts b/packages/common/src/static/titresTypes_demarchesTypes_etapesTypes/sections.ts
index 22a63834eb3503918cd7f57ce4af007dc6aee71b..1a4deea7397de46db79a36c322dcf6a7d68a2591 100644
--- a/packages/common/src/static/titresTypes_demarchesTypes_etapesTypes/sections.ts
+++ b/packages/common/src/static/titresTypes_demarchesTypes_etapesTypes/sections.ts
@@ -932,7 +932,6 @@ const basicElementValidator = z.object({
 })
 
 export const dateElementValidator = basicElementValidator.extend({ type: z.literal('date') })
-export const fileElementValidator = basicElementValidator.extend({ type: z.literal('file') })
 export const textElementValidator = basicElementValidator.extend({ type: z.enum(['text', 'textarea']) })
 export const urlElementValidator = basicElementValidator.extend({ type: z.literal('url') })
 export const numberElementValidator = basicElementValidator.extend({ type: z.enum(['number', 'integer']), uniteId: uniteIdValidator.optional() })
@@ -957,7 +956,6 @@ const selectElementValidator = z.union([selectElementWithMetasValidator, selectE
 type SelectElement = z.infer<typeof selectElementValidator>
 
 const sectionsElementValidator = z.union([
-  fileElementValidator,
   dateElementValidator,
   textElementValidator,
   urlElementValidator,
@@ -1018,6 +1016,20 @@ export const getElementValeurs = (element: DeepReadonly<SelectElement>): { id: s
   return []
 }
 
+export const getElementWithValue = (sectionsWithValue: SectionWithValue[], sectionId: string, elementId: string): ElementWithValue | null => {
+  for (const section of sectionsWithValue) {
+    if (section.id === sectionId) {
+      for (const element of section.elements) {
+        if (element.id === elementId) {
+          return element
+        }
+      }
+    }
+  }
+
+  return null
+}
+
 export const getSectionsWithValue = (sections: DeepReadonly<Section[]>, contenu: Contenu): SectionWithValue[] => {
   const sectionsWithValue: SectionWithValue[] = []
 
diff --git a/packages/common/src/titres.ts b/packages/common/src/titres.ts
index cab48345c71a5db1afd72e801729898ecc7a3a21..1c0d50d188fff3429e12a827b59ae645653f7929 100644
--- a/packages/common/src/titres.ts
+++ b/packages/common/src/titres.ts
@@ -153,7 +153,12 @@ export const getMostRecentValuePropFromEtapeFondamentaleValide = <
 export const getDemarcheByIdOrSlugValidator = z.object({
   demarche_id: demarcheIdValidator,
   demarche_slug: demarcheSlugValidator,
+  demarche_type_id: demarcheTypeIdValidator,
+  demarche_description: z.string().nullable(),
   titre_id: titreIdValidator,
+  titre_slug: titreSlugValidator,
+  titre_type_id: titreTypeIdValidator,
+  titre_nom: z.string(),
 })
 
 export type GetDemarcheByIdOrSlugValidator = z.infer<typeof getDemarcheByIdOrSlugValidator>
diff --git a/packages/common/src/typescript-tools.test.ts b/packages/common/src/typescript-tools.test.ts
index 3dbace4ed051657957455a8651f3c4eb5ed46b07..a8a2be0d0644f0b91e7de33b6b5c4c1eebb6eb1a 100644
--- a/packages/common/src/typescript-tools.test.ts
+++ b/packages/common/src/typescript-tools.test.ts
@@ -1,4 +1,4 @@
-import { isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty, isNullOrUndefinedOrEmpty, memoize, onlyUnique } from './typescript-tools.js'
+import { isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty, isNullOrUndefinedOrEmpty, memoize, onlyUnique, stringArrayEquals } from './typescript-tools.js'
 import { Role } from './roles.js'
 import { AdministrationId } from './static/administrations.js'
 import { Departements } from './static/departement.js'
@@ -21,6 +21,8 @@ test('isNullOrUndefinedOrEmpty', () => {
   expect(isNullOrUndefinedOrEmpty(undefined)).toBe(true)
   expect(isNullOrUndefinedOrEmpty([])).toBe(true)
   expect(isNullOrUndefinedOrEmpty([1])).toBe(false)
+  expect(isNullOrUndefinedOrEmpty('  ')).toBe(true)
+  expect(isNullOrUndefinedOrEmpty(' a ')).toBe(false)
 })
 
 test('isNotNullNorUndefinedNorEmpty', () => {
@@ -28,6 +30,8 @@ test('isNotNullNorUndefinedNorEmpty', () => {
   expect(isNotNullNorUndefinedNorEmpty(undefined)).toBe(false)
   expect(isNotNullNorUndefinedNorEmpty([])).toBe(false)
   expect(isNotNullNorUndefinedNorEmpty([1])).toBe(true)
+  expect(isNotNullNorUndefinedNorEmpty('  ')).toBe(false)
+  expect(isNotNullNorUndefinedNorEmpty(' a ')).toBe(true)
 })
 
 test('onlyUnique', () => {
@@ -53,3 +57,11 @@ test('memoize', async () => {
   expect(await memoized()).toBe(12)
   expect(called).toBe(1)
 })
+test('stringArrayEquals', () => {
+  expect(stringArrayEquals(['un'], ['un'])).toBe(true)
+  expect(stringArrayEquals([], [])).toBe(true)
+  expect(stringArrayEquals(['un'], ['deux'])).toBe(false)
+  expect(stringArrayEquals(['un'], ['un', 'deux'])).toBe(false)
+  expect(stringArrayEquals(['un', 'deux'], ['un'])).toBe(false)
+  expect(stringArrayEquals([], ['un'])).toBe(false)
+})
diff --git a/packages/common/src/typescript-tools.ts b/packages/common/src/typescript-tools.ts
index 23017d612369026dc5c7eba9f133f32e26219834..9a07d8b4d73745ebba67414b0fc395d636fdc04b 100644
--- a/packages/common/src/typescript-tools.ts
+++ b/packages/common/src/typescript-tools.ts
@@ -1,3 +1,5 @@
+/* eslint-disable @typescript-eslint/ban-types */
+
 export type NotNullableKeys<T> = { [K in keyof T]: NonNullable<T[K]> }
 
 export type Nullable<T> = { [P in keyof T]: T[P] | null }
@@ -5,20 +7,35 @@ export function isNotNullNorUndefined<T>(value: T | null | undefined): value is
   return !isNullOrUndefined(value)
 }
 
-export const isNotNullNorUndefinedNorEmpty = <U>(value: U[] | null | undefined): value is NonEmptyArray<U> => {
-  if (!isNullOrUndefined(value)) {
-    return isNonEmptyArray(value)
+export function isNotNullNorUndefinedNorEmpty<U>(value: DeepReadonly<U[]> | null | undefined): value is DeepReadonly<NonEmptyArray<U>>
+export function isNotNullNorUndefinedNorEmpty<U>(value: U[] | null | undefined): value is NonEmptyArray<U>
+export function isNotNullNorUndefinedNorEmpty(value: string | null | undefined): value is string
+export function isNotNullNorUndefinedNorEmpty(value: string | DeepReadonly<any[]> | null | undefined) {
+  if (Array.isArray(value)) {
+    if (!isNullOrUndefined(value)) {
+      return isNonEmptyArray(value)
+    }
+  } else if (typeof value === 'string') {
+    return value !== null && value !== undefined && value.trim() !== ''
   }
 
   return false
 }
 
-export const isNullOrUndefinedOrEmpty = <U>(value: U[] | null | undefined): value is null | undefined => {
-  if (isNullOrUndefined(value)) {
+export function isNullOrUndefinedOrEmpty<U>(value: DeepReadonly<U[]> | null | undefined): value is null | undefined
+export function isNullOrUndefinedOrEmpty(value: string | null | undefined): value is null | undefined
+export function isNullOrUndefinedOrEmpty(value: string | DeepReadonly<any[]> | null | undefined) {
+  if (value === null || value === undefined) {
     return true
   }
 
-  return Array.isArray(value) && value.length === 0
+  if (Array.isArray(value)) {
+    return value.length === 0
+  } else if (typeof value === 'string') {
+    return value.trim() === ''
+  }
+
+  return false
 }
 
 export const isNullOrUndefined = <T>(value: T | null | undefined): value is null | undefined => {
@@ -45,10 +62,76 @@ export const getEntries = <T extends string, U>(object: Record<T, U>, filter: (k
 // @ts-ignore use with caution
 export const getEntriesHardcore = <T extends string, U>(object: Record<T, U>): [T, U][] => Object.entries<U>(object)
 
-export type DeepReadonly<T> = {
-  readonly [K in keyof T]: DeepReadonly<T[K]>
+declare const RefSymbol: unique symbol
+interface Ref<T = any> {
+  value: T
+  /**
+   * Type differentiator only.
+   * We need this to be in public d.ts but don't want it to show up in IDE
+   * autocomplete, so we use a private Symbol instead.
+   */
+  [RefSymbol]: true
+}
+
+// export type DeepReadonly<T> = {
+//   readonly [K in keyof T]: DeepReadonly<T[K]>
+// }
+
+type Primitive = string | number | boolean | bigint | symbol | undefined | null
+type Builtin = Primitive | Function | Date | Error | RegExp
+// DeepReadonly from vue
+export type DeepReadonly<T> = T extends Builtin
+  ? T
+  : T extends Map<infer K, infer V>
+  ? ReadonlyMap<DeepReadonly<K>, DeepReadonly<V>>
+  : T extends ReadonlyMap<infer K, infer V>
+  ? ReadonlyMap<DeepReadonly<K>, DeepReadonly<V>>
+  : T extends WeakMap<infer K, infer V>
+  ? WeakMap<DeepReadonly<K>, DeepReadonly<V>>
+  : T extends Set<infer U>
+  ? ReadonlySet<DeepReadonly<U>>
+  : T extends ReadonlySet<infer U>
+  ? ReadonlySet<DeepReadonly<U>>
+  : T extends WeakSet<infer U>
+  ? WeakSet<DeepReadonly<U>>
+  : T extends Promise<infer U>
+  ? Promise<DeepReadonly<U>>
+  : T extends Ref<infer U>
+  ? Readonly<Ref<DeepReadonly<U>>>
+  : T extends {}
+  ? {
+      readonly [K in keyof T]: DeepReadonly<T[K]>
+    }
+  : Readonly<T>
+
+type Mutable<T> = {
+  -readonly [P in keyof T]: T[P]
 }
 
+export type DeepMutable<T> = T extends Builtin
+  ? T
+  : T extends Map<infer K, infer V>
+  ? Map<DeepMutable<K>, DeepMutable<V>>
+  : T extends ReadonlyMap<infer K, infer V>
+  ? Map<DeepMutable<K>, DeepMutable<V>>
+  : T extends WeakMap<infer K, infer V>
+  ? WeakMap<DeepMutable<K>, DeepMutable<V>>
+  : T extends Set<infer U>
+  ? Set<DeepMutable<U>>
+  : T extends ReadonlySet<infer U>
+  ? Set<DeepMutable<U>>
+  : T extends WeakSet<infer U>
+  ? WeakSet<DeepMutable<U>>
+  : T extends Promise<infer U>
+  ? Promise<DeepMutable<U>>
+  : T extends Ref<infer U>
+  ? Mutable<Ref<DeepMutable<U>>>
+  : T extends {}
+  ? {
+      -readonly [K in keyof T]: DeepMutable<T[K]>
+    }
+  : Mutable<T>
+
 export const exhaustiveCheck = (param: never): never => {
   throw new Error(`Unreachable case: ${JSON.stringify(param)}`)
 }
@@ -57,6 +140,12 @@ export const isNonEmptyArray = <T>(arr: T[]): arr is NonEmptyArray<T> => {
   return arr.length > 0
 }
 
+export const map = <T, U>(array: DeepReadonly<NonEmptyArray<T>>, transform: (item: DeepReadonly<T>) => U): NonEmptyArray<U> => {
+  const [first, ...rest] = array
+
+  return [transform(first), ...rest.map(transform)]
+}
+
 export const isTrue = <T extends true>(_t: T) => {}
 export const isFalse = <T extends false>(_t: T) => {}
 
@@ -78,3 +167,7 @@ export const memoize = <T>(fn: SimplePromiseFn<T>): Memoized<T> => {
     return cache
   }) as Memoized<T>
 }
+
+export const stringArrayEquals = (array1: string[], array2: string[]): boolean => {
+  return array1.length === array2.length && array1.every((value, index) => array2[index] === value)
+}
diff --git a/packages/common/src/zod-tools.test.ts b/packages/common/src/zod-tools.test.ts
new file mode 100644
index 0000000000000000000000000000000000000000..6437e4aaf45b66e335ccf2f0daee0c58b21d8c2e
--- /dev/null
+++ b/packages/common/src/zod-tools.test.ts
@@ -0,0 +1,14 @@
+import { expect, test } from 'vitest'
+import { nullToDefault } from './zod-tools'
+import { z } from 'zod'
+
+test('nullToDefault', () => {
+  expect(z.string().nullable().transform(nullToDefault('inCaseOfNull')).parse(null)).toBe('inCaseOfNull')
+  expect(z.string().optional().transform(nullToDefault('inCaseOfNull')).parse(undefined)).toBe('inCaseOfNull')
+  expect(z.string().optional().transform(nullToDefault('inCaseOfNull')).parse('value')).toBe('value')
+
+  const myArray: string[] = []
+  expect(z.array(z.string()).nullable().transform(nullToDefault(myArray)).parse(null)).toStrictEqual([])
+  expect(z.array(z.string()).optional().transform(nullToDefault(myArray)).parse(undefined)).toStrictEqual([])
+  expect(z.array(z.string()).optional().transform(nullToDefault(myArray)).parse(['toto'])).toStrictEqual(['toto'])
+})
diff --git a/packages/common/src/zod-tools.ts b/packages/common/src/zod-tools.ts
new file mode 100644
index 0000000000000000000000000000000000000000..b1a69470aeeacc403dc41da393bae12961629f91
--- /dev/null
+++ b/packages/common/src/zod-tools.ts
@@ -0,0 +1,11 @@
+import { isNullOrUndefined } from './typescript-tools'
+
+export const nullToDefault =
+  <Y>(defaultWhenNullOrUndefined: Y) =>
+  (val: null | undefined | Y): Y => {
+    if (isNullOrUndefined(val)) {
+      return defaultWhenNullOrUndefined
+    }
+
+    return val
+  }
diff --git a/packages/ui/package.json b/packages/ui/package.json
index 59608630c8138ca8f05eb1c4a511e30a40d82dd9..e90c5645bbbbb3c23b4203841b8a862d9ce1ffa2 100644
--- a/packages/ui/package.json
+++ b/packages/ui/package.json
@@ -32,6 +32,7 @@
     "@storybook/addon-controls": "^7.0.22",
     "@storybook/addon-styling": "^1.3.0",
     "@storybook/builder-vite": "^7.0.22",
+    "@storybook/preview-api": "^7.0.22",
     "@storybook/testing-library": "^0.2.0",
     "@storybook/testing-vue3": "^1.0.0",
     "@storybook/vue3": "^7.0.22",
@@ -94,8 +95,7 @@
     "vue": "^3.3.4",
     "vue-router": "^4.2.2",
     "vue-tsc": "^1.8.1",
-    "vuex": "^4.1.0",
-    "vuex-router-sync": "^6.0.0-rc.1"
+    "vuex": "^4.1.0"
   },
   "eslintConfig": {
     "root": true,
diff --git a/packages/ui/src/api/client-rest.ts b/packages/ui/src/api/client-rest.ts
index 6c786155b3df9953d500480e43d10845ad5eac76..4f24e7fcc8ac644f7f859a817a0c91e689c5b3da 100644
--- a/packages/ui/src/api/client-rest.ts
+++ b/packages/ui/src/api/client-rest.ts
@@ -11,6 +11,7 @@ import {
   PostRestRoutes,
   PutRestRoutes,
 } from 'camino-common/src/rest'
+import { DeepReadonly } from 'vue'
 import { z } from 'zod'
 
 type Loading = { status: 'LOADING' }
@@ -78,5 +79,5 @@ export const postWithJson = async <T extends PostRestRoutes>(
 export const putWithJson = async <T extends PutRestRoutes>(
   path: T,
   params: CaminoRestParams<T>,
-  body: z.infer<(typeof CaminoRestRoutes)[T]['put']['input']>
+  body: DeepReadonly<z.infer<(typeof CaminoRestRoutes)[T]['put']['input']>>
 ): Promise<z.infer<(typeof CaminoRestRoutes)[T]['put']['output']>> => await callFetch(path, params, 'put', {}, body)
diff --git a/packages/ui/src/api/documents.js b/packages/ui/src/api/documents.js
deleted file mode 100644
index 864403ab451355d2dfe9bfd411f30bba44db443d..0000000000000000000000000000000000000000
--- a/packages/ui/src/api/documents.js
+++ /dev/null
@@ -1,29 +0,0 @@
-import gql from 'graphql-tag'
-import { apiGraphQLFetch } from './_client'
-import { fragmentDocument } from './fragments/documents'
-
-export const documentCreer = apiGraphQLFetch(gql`
-  mutation DocumentCreer($document: InputDocumentCreation!) {
-    documentCreer(document: $document) {
-      ...document
-    }
-  }
-
-  ${fragmentDocument}
-`)
-
-export const documentModifier = apiGraphQLFetch(gql`
-  mutation DocumentModifier($document: InputDocumentModification!) {
-    documentModifier(document: $document) {
-      ...document
-    }
-  }
-
-  ${fragmentDocument}
-`)
-
-export const documentSupprimer = apiGraphQLFetch(gql`
-  mutation DocumentSupprimer($id: ID!) {
-    documentSupprimer(id: $id)
-  }
-`)
diff --git a/packages/ui/src/api/fragments/documents.js b/packages/ui/src/api/fragments/documents.js
deleted file mode 100644
index 9698dadfe1ea54da40748eb924f29a98a11040b3..0000000000000000000000000000000000000000
--- a/packages/ui/src/api/fragments/documents.js
+++ /dev/null
@@ -1,18 +0,0 @@
-import gql from 'graphql-tag'
-
-const fragmentDocument = gql`
-  fragment document on Document {
-    id
-    typeId
-    date
-    description
-    fichier
-    fichierTypeId
-    titreEtapeId
-    publicLecture
-    entreprisesLecture
-    suppression
-  }
-`
-
-export { fragmentDocument }
diff --git a/packages/ui/src/api/fragments/entreprises.js b/packages/ui/src/api/fragments/entreprises.js
deleted file mode 100644
index 82febf4721759d4f75d4d8b7c7b28d2b60908bc2..0000000000000000000000000000000000000000
--- a/packages/ui/src/api/fragments/entreprises.js
+++ /dev/null
@@ -1,36 +0,0 @@
-import gql from 'graphql-tag'
-
-export const fragmentTitreEntreprises = gql`
-  fragment titreEntreprises on Entreprise {
-    id
-    nom
-    paysId
-    legalSiren
-    legalEtranger
-    legalForme
-    adresse
-    codePostal
-    commune
-    cedex
-    url
-    etablissements {
-      id
-      nom
-      dateDebut
-      dateFin
-    }
-    operateur
-  }
-`
-
-export const fragmentTitresEntreprises = gql`
-  fragment titresEntreprises on Entreprise {
-    id
-    nom
-    adresse
-    codePostal
-    commune
-    legalSiren
-    legalEtranger
-  }
-`
diff --git a/packages/ui/src/api/fragments/titre-etape.js b/packages/ui/src/api/fragments/titre-etape.js
deleted file mode 100644
index ee83f064a5e32ffcbd2c8b96ea94350aa1f02280..0000000000000000000000000000000000000000
--- a/packages/ui/src/api/fragments/titre-etape.js
+++ /dev/null
@@ -1,171 +0,0 @@
-import gql from 'graphql-tag'
-import { fragmentTitreEntreprises } from './entreprises'
-
-import { fragmentDocument } from './documents'
-
-// fragment qui représente l’étape dont on hérite sur une prop
-const fragmentHeritageEtape = gql`
-  fragment heritageEtape on Etape {
-    id
-    titreDemarcheId
-    ordre
-    date
-    dateDebut
-    dateFin
-    duree
-    surface
-    typeId
-    statutId
-    titulaires {
-      ...titreEntreprises
-    }
-    amodiataires {
-      ...titreEntreprises
-    }
-    geojson4326Perimetre
-    geojson4326Points
-    geojsonOriginePoints
-    geojsonOriginePerimetre
-    geojsonOrigineGeoSystemeId
-    geojson4326Forages
-    geojsonOrigineForages
-    substances
-    contenu
-  }
-
-  ${fragmentTitreEntreprises}
-`
-
-const fragmentHeritageProps = gql`
-  fragment heritageProps on HeritageProps {
-    dateDebut {
-      ...heritageProp
-    }
-    dateFin {
-      ...heritageProp
-    }
-    duree {
-      ...heritageProp
-    }
-    perimetre {
-      ...heritageProp
-    }
-    substances {
-      ...heritageProp
-    }
-    titulaires {
-      ...heritageProp
-    }
-    amodiataires {
-      ...heritageProp
-    }
-  }
-
-  fragment heritageProp on HeritageProp {
-    etape {
-      ...heritageEtape
-    }
-    actif
-  }
-
-  ${fragmentHeritageEtape}
-`
-
-const fragmentEtapeHeritage = gql`
-  fragment etapeHeritage on EtapeHeritage {
-    dateDebut
-    dateFin
-    duree
-    surface
-    typeId
-
-    titulaires {
-      ...titreEntreprises
-    }
-
-    amodiataires {
-      ...titreEntreprises
-    }
-
-    geojson4326Perimetre
-    geojson4326Points
-    geojsonOriginePoints
-    geojsonOriginePerimetre
-    geojsonOrigineGeoSystemeId
-    geojson4326Forages
-    geojsonOrigineForages
-
-    substances
-
-    contenu
-
-    heritageProps {
-      ...heritageProps
-    }
-
-    heritageContenu
-  }
-
-  ${fragmentTitreEntreprises}
-
-  ${fragmentHeritageProps}
-`
-
-const fragmentEtape = gql`
-  fragment etape on Etape {
-    id
-    slug
-    titreDemarcheId
-    demarche {
-      id
-      typeId
-      titre {
-        id
-        slug
-        nom
-        typeId
-      }
-    }
-    ordre
-    date
-    dateDebut
-    dateFin
-    duree
-    surface
-    typeId
-    statutId
-    titulaires {
-      ...titreEntreprises
-    }
-    amodiataires {
-      ...titreEntreprises
-    }
-    geojson4326Perimetre
-    geojson4326Points
-    geojsonOriginePoints
-    geojsonOriginePerimetre
-    geojsonOrigineGeoSystemeId
-    geojson4326Forages
-    geojsonOrigineForages
-    substances
-    documents {
-      ...document
-    }
-    heritageProps {
-      ...heritageProps
-    }
-    contenu
-    heritageContenu
-    decisionsAnnexesSections
-    decisionsAnnexesContenu
-    notes
-  }
-
-  ${fragmentTitreEntreprises}
-
-  ${fragmentDocument}
-
-  ${fragmentHeritageProps}
-`
-
-export { fragmentEtapeHeritage, fragmentEtape }
diff --git a/packages/ui/src/api/fragments/titre.js b/packages/ui/src/api/fragments/titre.js
deleted file mode 100644
index 82c4e8f8571004451c72c228587773c94bdabdf3..0000000000000000000000000000000000000000
--- a/packages/ui/src/api/fragments/titre.js
+++ /dev/null
@@ -1,34 +0,0 @@
-import gql from 'graphql-tag'
-
-import { fragmentTitresEntreprises } from './entreprises'
-
-const fragmentTitres = gql`
-  fragment titres on Titre {
-    id
-    slug
-    nom
-    typeId
-    titreStatutId
-    substances
-    activitesEnConstruction
-    activitesAbsentes
-    titulaires {
-      ...titresEntreprises
-    }
-    amodiataires {
-      ...titresEntreprises
-    }
-    communes {
-      id
-    }
-    secteursMaritime
-    references {
-      referenceTypeId
-      nom
-    }
-  }
-
-  ${fragmentTitresEntreprises}
-`
-
-export { fragmentTitres }
diff --git a/packages/ui/src/api/titres-etapes.js b/packages/ui/src/api/titres-etapes.js
deleted file mode 100644
index 6e22ec088d39f157984162378b8eb3ce62fd389f..0000000000000000000000000000000000000000
--- a/packages/ui/src/api/titres-etapes.js
+++ /dev/null
@@ -1,66 +0,0 @@
-import gql from 'graphql-tag'
-import { apiGraphQLFetch } from './_client'
-
-import { fragmentEtape, fragmentEtapeHeritage } from './fragments/titre-etape'
-export const titreEtapeMetas = apiGraphQLFetch(
-  gql`
-    query TitreEtapeMetas($titreDemarcheId: ID!) {
-      demarche(id: $titreDemarcheId) {
-        id
-        slug
-        description
-        typeId
-        titre {
-          id
-          slug
-          nom
-          typeId
-        }
-      }
-    }
-  `
-)
-
-export const etape = apiGraphQLFetch(gql`
-  query Etape($id: ID!) {
-    etape(id: $id) {
-      ...etape
-    }
-  }
-
-  ${fragmentEtape}
-`)
-
-export const etapeHeritage = apiGraphQLFetch(gql`
-  query EtapeHeritage($titreDemarcheId: ID!, $date: String!, $typeId: ID!) {
-    etapeHeritage(titreDemarcheId: $titreDemarcheId, date: $date, typeId: $typeId) {
-      ...etapeHeritage
-    }
-  }
-
-  ${fragmentEtapeHeritage}
-`)
-
-export const etapeCreer = apiGraphQLFetch(gql`
-  mutation EtapeCreer($etape: InputEtapeCreation!) {
-    etapeCreer(etape: $etape) {
-      id
-    }
-  }
-`)
-
-export const etapeModifier = apiGraphQLFetch(gql`
-  mutation EtapeModifier($etape: InputEtapeModification!) {
-    etapeModifier(etape: $etape) {
-      id
-    }
-  }
-`)
-
-export const etapeDeposer = apiGraphQLFetch(gql`
-  mutation EtapeDeposer($id: ID!) {
-    etapeDeposer(id: $id) {
-      slug
-    }
-  }
-`)
diff --git a/packages/ui/src/api/titres.js b/packages/ui/src/api/titres.js
index 29facc9ef06cbd699a95e8d7614ab528c9fc11ce..82fa699f1f95dca1133fb775fea945b594eead17 100644
--- a/packages/ui/src/api/titres.js
+++ b/packages/ui/src/api/titres.js
@@ -1,8 +1,6 @@
 import gql from 'graphql-tag'
 import { apiGraphQLFetch } from './_client'
 
-import { fragmentTitres } from './fragments/titre'
-
 export const titres = apiGraphQLFetch(
   gql`
     query Titres(
@@ -42,13 +40,44 @@ export const titres = apiGraphQLFetch(
         facadesMaritimes: $facadesMaritimes
       ) {
         elements {
-          ...titres
+          id
+          slug
+          nom
+          typeId
+          titreStatutId
+          substances
+          activitesEnConstruction
+          activitesAbsentes
+          titulaires {
+            id
+            nom
+            adresse
+            codePostal
+            commune
+            legalSiren
+            legalEtranger
+          }
+          amodiataires {
+            id
+            nom
+            adresse
+            codePostal
+            commune
+            legalSiren
+            legalEtranger
+          }
+          communes {
+            id
+          }
+          secteursMaritime
+          references {
+            referenceTypeId
+            nom
+          }
         }
         total
       }
     }
-
-    ${fragmentTitres}
   `
 )
 
diff --git a/packages/ui/src/app.tsx b/packages/ui/src/app.tsx
index 01d5e00f6d162ec19a22250b94bcc6a225653580..cfb3f492d07c2a6adadb1c25634e38bdd175dfca 100644
--- a/packages/ui/src/app.tsx
+++ b/packages/ui/src/app.tsx
@@ -2,17 +2,16 @@ import '@gouvfr/dsfr/dist/core/core.module'
 import '@gouvfr/dsfr/dist/component/navigation/navigation.module'
 import '@gouvfr/dsfr/dist/component/tab/tab.module'
 
-import { defineComponent, Transition, computed, ref, onMounted, inject } from 'vue'
+import { defineComponent, computed, ref, onMounted, inject } from 'vue'
 import { Messages } from './components/_ui/messages'
 import { Header } from './components/page/header'
 import { Footer } from './components/page/footer'
 import { MapPattern } from './components/_map/pattern'
 import { IconSprite } from './components/_ui/iconSprite'
 
-import { CaminoError } from './components/error'
 import { useStore } from 'vuex'
 import { RouterView, useRoute } from 'vue-router'
-import { isNotNullNorUndefined, isNullOrUndefined } from 'camino-common/src/typescript-tools'
+import { isNullOrUndefined } from 'camino-common/src/typescript-tools'
 import { userKey } from './moi'
 export const App = defineComponent(() => {
   const store = useStore()
@@ -20,16 +19,8 @@ export const App = defineComponent(() => {
 
   const loaded = ref<boolean>(false)
 
-  const error = computed(() => store.state.error)
-
   const messages = computed<{ type: 'error' | 'success'; value: string }[]>(() => store.state.messages)
 
-  const popup = computed(() => store.state.popup)
-
-  const loading = computed(() => store.state.loading.length > 0)
-
-  const fileLoading = computed(() => store.state.fileLoading)
-
   const currentMenuSection = computed(() => route.meta?.menuSection)
 
   const user = inject(userKey)
@@ -56,7 +47,7 @@ export const App = defineComponent(() => {
       <Header user={user} currentMenuSection={currentMenuSection.value} routePath={route.fullPath} />
 
       <main class="main" role="main">
-        <div class="container">{isNotNullNorUndefined(error.value) ? <CaminoError couleur={error.value.type} message={error.value.value} /> : <>{loaded.value ? <RouterView /> : null}</>}</div>
+        <div class="container">{loaded.value ? <RouterView /> : null}</div>
       </main>
 
       <Footer displayNewsletter={displayNewsletter.value} version={version.value} />
@@ -64,30 +55,6 @@ export const App = defineComponent(() => {
       <div class="messages">
         <Messages messages={messages.value} />
       </div>
-
-      <Transition name="fade">{isNotNullNorUndefined(popup.value.component) ? <div class="absolute full bg-inverse-alpha" style="z-index: 100002" /> : null}</Transition>
-
-      <Transition name="slide-top">{isNotNullNorUndefined(popup.value.component) ? <popup.value.component {...popup.value.props} /> : null}</Transition>
-
-      <Transition name="fade">
-        {loading.value || (isNotNullNorUndefined(fileLoading.value) && isNotNullNorUndefined(fileLoading.value.total) && fileLoading.value.total !== 0) ? (
-          <div class="loaders fixed p">
-            {loading.value ? <div class="loader" /> : null}
-            {isNotNullNorUndefined(fileLoading.value) && isNotNullNorUndefined(fileLoading.value.total) && fileLoading.value.total !== 0 ? (
-              <div>
-                <div class="relative loader-file">
-                  <div
-                    class="loader-file-bar"
-                    style={{
-                      right: `${100 - 100 * (fileLoading.value.loaded / fileLoading.value.total)}%`,
-                    }}
-                  />
-                </div>
-              </div>
-            ) : null}
-          </div>
-        ) : null}
-      </Transition>
     </div>
   )
 })
diff --git a/packages/ui/src/components/_common/depose-popup.vue b/packages/ui/src/components/_common/depose-popup.vue
deleted file mode 100644
index ce1a9af10284d37a0e49e1310bf1b69e985affbd..0000000000000000000000000000000000000000
--- a/packages/ui/src/components/_common/depose-popup.vue
+++ /dev/null
@@ -1,62 +0,0 @@
-<template>
-  <Popup :messages="messages">
-    <template #header>
-      <h2>Dépôt</h2>
-    </template>
-
-    <p class="bold">Souhaitez vous effectuer le dépôt ?</p>
-    <div class="bg-warning color-bg p-s mb-l"><span class="bold"> Attention </span>: cette opération est définitive et ne peut pas être annulée.</div>
-
-    <template #footer>
-      <div v-if="!loading" class="tablet-blobs">
-        <div class="tablet-blob-1-3 mb tablet-mb-0">
-          <button class="btn-border rnd-xs p-s full-x" @click="cancel">Annuler</button>
-        </div>
-        <div class="tablet-blob-2-3">
-          <button class="btn btn-primary" @click="depose">Déposer</button>
-        </div>
-      </div>
-      <div v-else class="p-s full-x bold">Dépôt en cours…</div>
-    </template>
-  </Popup>
-</template>
-
-<script setup lang="ts">
-import Popup from '../_ui/popup.vue'
-import { computed, onBeforeUnmount } from 'vue'
-import { useStore } from 'vuex'
-
-const emits = defineEmits<{
-  (e: 'onDepose'): void
-}>()
-
-const store = useStore()
-
-const loading = computed(() => store.state.popup.loading)
-const messages = computed(() => store.state.popup.messages)
-
-const depose = () => {
-  emits('onDepose')
-}
-
-const cancel = () => {
-  errorsRemove()
-  store.commit('popupClose')
-}
-
-const errorsRemove = () => {
-  store.commit('popupMessagesRemove')
-}
-
-const keyup = (e: KeyboardEvent) => {
-  if (e.code === 'Escape') {
-    cancel()
-  }
-}
-
-onBeforeUnmount(() => {
-  document.removeEventListener('keyup', keyup)
-})
-
-document.addEventListener('keyup', keyup)
-</script>
diff --git a/packages/ui/src/components/_common/document-type-typeahead.stories.tsx b/packages/ui/src/components/_common/document-type-typeahead.stories.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..078efe8aa951c14fdadbedb3559a2f420a3870d8
--- /dev/null
+++ b/packages/ui/src/components/_common/document-type-typeahead.stories.tsx
@@ -0,0 +1,15 @@
+import { Meta, StoryFn } from '@storybook/vue3'
+import { action } from '@storybook/addon-actions'
+import { DocumentTypeTypeahead } from './document-type-typeahead'
+
+const meta: Meta = {
+  title: 'Components/Common/DocumentTypeTypeahead',
+  // @ts-ignore
+  component: DocumentTypeTypeahead,
+}
+export default meta
+
+const documentTypeIdSelected = action('documentTypeIdSelected')
+
+export const Default: StoryFn = () => <DocumentTypeTypeahead documentTypeIds={['car', 'doe']} documentTypeIdSelected={documentTypeIdSelected} alwaysOpen={true} />
+export const WithDocumentTypeAlreadySelected: StoryFn = () => <DocumentTypeTypeahead documentTypeIds={['car', 'doe']} initialValue="car" documentTypeIdSelected={documentTypeIdSelected} />
diff --git a/packages/ui/src/components/_common/document-type-typeahead.stories_snapshots_Default.html b/packages/ui/src/components/_common/document-type-typeahead.stories_snapshots_Default.html
new file mode 100644
index 0000000000000000000000000000000000000000..d586e616e940faf20abdcaf47d4d79cce9576ce9
--- /dev/null
+++ b/packages/ui/src/components/_common/document-type-typeahead.stories_snapshots_Default.html
@@ -0,0 +1,7 @@
+<div id="typeahead_271_wrapper" class="_typeahead_8eddf1 dsfr">
+  <div class="flex"><input id="typeahead_271" type="text" name="typeahead_271" class="_typeahead-input_8eddf1 fr-input" placeholder="" autocomplete="off"></div>
+  <div class="_typeahead-list_8eddf1">
+    <div class="_typeahead-list-item_8eddf1 _typeahead-list-item-active_8eddf1"><span>Documents cartographiques</span></div>
+    <div class="_typeahead-list-item_8eddf1 "><span>Dossier "Loi sur l'eau"</span></div>
+  </div>
+</div>
\ No newline at end of file
diff --git a/packages/ui/src/components/_common/document-type-typeahead.stories_snapshots_WithDocumentTypeAlreadySelected.html b/packages/ui/src/components/_common/document-type-typeahead.stories_snapshots_WithDocumentTypeAlreadySelected.html
new file mode 100644
index 0000000000000000000000000000000000000000..16d27ec02e25af6d4083db132d233cb0bee03de1
--- /dev/null
+++ b/packages/ui/src/components/_common/document-type-typeahead.stories_snapshots_WithDocumentTypeAlreadySelected.html
@@ -0,0 +1,4 @@
+<div id="typeahead_271_wrapper" class="_typeahead_8eddf1 dsfr">
+  <div class="flex"><input id="typeahead_271" type="text" name="typeahead_271" class="_typeahead-input_8eddf1 fr-input" placeholder="" autocomplete="off"></div>
+  <!---->
+</div>
\ No newline at end of file
diff --git a/packages/ui/src/components/_common/document-type-typeahead.tsx b/packages/ui/src/components/_common/document-type-typeahead.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..6e0417f573293bd3380052eec2a2834e92ccb3e3
--- /dev/null
+++ b/packages/ui/src/components/_common/document-type-typeahead.tsx
@@ -0,0 +1,51 @@
+import { Ref, computed, defineComponent, ref } from 'vue'
+import { TypeAheadSingle } from '../_ui/typeahead-single'
+import { DeepReadonly, isNotNullNorUndefined } from 'camino-common/src/typescript-tools'
+import { DocumentTypeId, DocumentsTypes } from 'camino-common/src/static/documentsTypes'
+
+type Props<T extends DocumentTypeId> = {
+  alwaysOpen?: boolean
+  documentTypeIds: DeepReadonly<T[]>
+  initialValue?: T
+  documentTypeIdSelected: (documentTypeId: T | null) => void
+}
+
+export const DocumentTypeTypeahead = defineComponent(<T extends DocumentTypeId>(props: Props<T>) => {
+  const documentTypeSelected = ref<{ id: T; nom: string } | null>(props.initialValue ? DocumentsTypes[props.initialValue] : null) as Ref<{ id: T; nom: string } | null>
+  const documentTypeUpdate = async (documentType: { id: T; nom: string } | undefined) => {
+    documentTypeSelected.value = documentType ?? null
+    props.documentTypeIdSelected(isNotNullNorUndefined(documentType) ? documentType.id : null)
+  }
+
+  const sortedByUs = computed<DeepReadonly<{ id: T; nom: string }[]>>(() => [...props.documentTypeIds].map(dtId => DocumentsTypes[dtId]).sort((a, b) => a.nom.localeCompare(b.nom)))
+
+  const documentTypeFiltered = ref<DeepReadonly<{ id: T; nom: string }[]>>(sortedByUs.value) as Ref<DeepReadonly<{ id: T; nom: string }[]>>
+  const documentTypeOnInput = (search: string) => {
+    const formatedSearch = search.trim().toLowerCase()
+
+    if (formatedSearch.length === 0) {
+      documentTypeFiltered.value = sortedByUs.value
+    } else {
+      documentTypeFiltered.value = sortedByUs.value.filter(documentType => documentType.nom.toLowerCase().includes(formatedSearch.toLowerCase()))
+    }
+  }
+
+  return () => (
+    <TypeAheadSingle
+      overrideItem={documentTypeSelected.value}
+      props={{
+        alwaysOpen: props.alwaysOpen,
+        items: documentTypeFiltered.value,
+        itemChipLabel: item => item.nom,
+        itemKey: 'id',
+        placeholder: '',
+        minInputLength: 0,
+        onSelectItem: documentTypeUpdate,
+        onInput: documentTypeOnInput,
+      }}
+    />
+  )
+})
+
+// @ts-ignore waiting for https://github.com/vuejs/core/issues/7833
+DocumentTypeTypeahead.props = ['documentTypeIdSelected', 'documentTypeIds', 'alwaysOpen', 'initialValue']
diff --git a/packages/ui/src/components/_common/dsfr-perimetre-table.tsx b/packages/ui/src/components/_common/dsfr-perimetre-table.tsx
index c5b97a7dd923982c43363e675314387205c599b8..f87768efcbf947714bbcb0d07e54c05a45e3f1a4 100644
--- a/packages/ui/src/components/_common/dsfr-perimetre-table.tsx
+++ b/packages/ui/src/components/_common/dsfr-perimetre-table.tsx
@@ -1,6 +1,6 @@
 import { contentTypes } from 'camino-common/src/rest'
 import { GeoSysteme, GeoSystemes, GeoSystemeId } from 'camino-common/src/static/geoSystemes'
-import { defineComponent, FunctionalComponent } from 'vue'
+import { DeepReadonly, defineComponent, FunctionalComponent } from 'vue'
 import { DsfrLink } from '../_ui/dsfr-button'
 import { TableRow, TextColumnData } from '../_ui/table'
 import { TableAuto, Column } from '../_ui/table-auto'
@@ -12,8 +12,8 @@ import { NotNullableKeys, isNotNullNorUndefined } from 'camino-common/src/typesc
 import { GeoSystemeTypeahead } from './geosysteme-typeahead'
 
 interface Props {
-  geojson_origine_points: FeatureCollectionPoints
-  geojson_origine_forages: FeatureCollectionForages | null
+  geojson_origine_points: DeepReadonly<FeatureCollectionPoints>
+  geojson_origine_forages: DeepReadonly<FeatureCollectionForages> | null
   geo_systeme_id: GeoSystemeId
   titreSlug: TitreSlug
   maxRows: number
@@ -25,7 +25,7 @@ const labels = {
   gon: { x: 'longitude', y: 'latitude' },
 } as const satisfies Record<GeoSysteme['uniteId'], { x: string; y: string }>
 
-const geoJsonToArray = (perimetre: FeatureCollectionPoints | FeatureCollectionForages): TableRow<string>[] => {
+const geoJsonToArray = (perimetre: DeepReadonly<FeatureCollectionPoints | FeatureCollectionForages>): TableRow<string>[] => {
   return perimetre.features.map<TableRow<string>>((feature, index) => {
     const x_deg = toDegresMinutes(feature.geometry.coordinates[0])
     const y_deg = toDegresMinutes(feature.geometry.coordinates[1])
@@ -157,7 +157,7 @@ export const TabCaminoTable = defineComponent<Props>(props => {
 // @ts-ignore waiting for https://github.com/vuejs/core/issues/7833
 TabCaminoTable.props = ['geojson_origine_points', 'geojson_origine_forages', 'geo_systeme_id', 'titreSlug', 'maxRows']
 
-export const transformMultipolygonToPoints = (geojson_perimetre: FeatureMultiPolygon): FeatureCollectionPoints => {
+export const transformMultipolygonToPoints = (geojson_perimetre: DeepReadonly<FeatureMultiPolygon>): DeepReadonly<FeatureCollectionPoints> => {
   const currentPoints: (FeatureCollectionPoints['features'][0] & { properties: { latitude: string; longitude: string } })[] = []
   let index = 0
   geojson_perimetre.geometry.coordinates.forEach((topLevel, topLevelIndex) =>
diff --git a/packages/ui/src/components/_common/dsfr-perimetre.tsx b/packages/ui/src/components/_common/dsfr-perimetre.tsx
index 0a1466bbd48f0fa16e9142cb752160e8fa98ef33..5ad089c3324681e50eefe71ff57f5cf249ff4193 100644
--- a/packages/ui/src/components/_common/dsfr-perimetre.tsx
+++ b/packages/ui/src/components/_common/dsfr-perimetre.tsx
@@ -1,4 +1,4 @@
-import { defineComponent, HTMLAttributes, defineAsyncComponent, computed } from 'vue'
+import { defineComponent, HTMLAttributes, defineAsyncComponent, computed, DeepReadonly } from 'vue'
 import { Tab, Tabs } from '../_ui/tabs'
 import { TitreSlug } from 'camino-common/src/validators/titres'
 import { Router } from 'vue-router'
@@ -13,7 +13,7 @@ import { TitreTypeId } from 'camino-common/src/static/titresTypes'
 export type TabId = 'carte' | 'points'
 
 type Props = {
-  perimetre: {
+  perimetre: DeepReadonly<{
     geojson4326_perimetre: FeatureMultiPolygon
     geojson4326_points: FeatureCollectionPoints | null
     geojson_origine_geo_systeme_id: GeoSystemeId
@@ -21,7 +21,7 @@ type Props = {
     geojson_origine_points: FeatureCollectionPoints | null
     geojson4326_forages: FeatureCollectionForages | null
     geojson_origine_forages: FeatureCollectionForages | null
-  }
+  }>
   titreSlug: TitreSlug
   titreTypeId: TitreTypeId
   initTab?: TabId
@@ -38,14 +38,14 @@ const maxRows = 20
  *
  */
 export const DsfrPerimetre = defineComponent<Props>((props: Props) => {
-  const geojson4326Points = computed<FeatureCollectionPoints>(() => {
+  const geojson4326Points = computed<DeepReadonly<FeatureCollectionPoints>>(() => {
     if (isNotNullNorUndefined(props.perimetre.geojson4326_points)) {
       return props.perimetre.geojson4326_points
     }
 
     return transformMultipolygonToPoints(props.perimetre.geojson4326_perimetre)
   })
-  const geojsonOriginePoints = computed<FeatureCollectionPoints>(() => {
+  const geojsonOriginePoints = computed<DeepReadonly<FeatureCollectionPoints>>(() => {
     if (isNotNullNorUndefined(props.perimetre.geojson_origine_points)) {
       return props.perimetre.geojson_origine_points
     }
@@ -80,14 +80,14 @@ export const DsfrPerimetre = defineComponent<Props>((props: Props) => {
 })
 
 type TabCaminoMapProps = OmitDistributive<Props, 'perimetre'> & {
-  perimetre: {
+  perimetre: DeepReadonly<{
     geojson4326_perimetre: FeatureMultiPolygon
     geojson4326_points: FeatureCollectionPoints
     geojson_origine_geo_systeme_id: GeoSystemeId
     geojson_origine_perimetre: FeatureMultiPolygon
     geojson_origine_points: FeatureCollectionPoints
     geojson4326_forages: FeatureCollectionForages | null
-  }
+  }>
 }
 const TabCaminoMap = defineComponent<TabCaminoMapProps>(props => {
   const neighbours = props.calculateNeighbours ? { apiClient: props.apiClient, titreSlug: props.titreSlug, router: props.router } : null
@@ -98,14 +98,14 @@ const TabCaminoMap = defineComponent<TabCaminoMapProps>(props => {
     return DemarcheMap
   })
 
-  const geojson_origine = computed<FeatureCollection>(() => ({
+  const geojson_origine = computed<DeepReadonly<FeatureCollection>>(() => ({
     type: 'FeatureCollection',
     crs: { type: 'name', properties: { name: `urn:ogc:def:crs:EPSG::${props.perimetre.geojson_origine_geo_systeme_id}` } },
     properties: null,
     features: [props.perimetre.geojson_origine_perimetre, ...props.perimetre.geojson_origine_points.features],
   }))
 
-  const geojson_4326 = computed<FeatureCollection>(() => ({
+  const geojson_4326 = computed<DeepReadonly<FeatureCollection>>(() => ({
     type: 'FeatureCollection',
     crs: { type: 'name', properties: { name: 'urn:ogc:def:crs:EPSG::4326' } },
     properties: null,
diff --git a/packages/ui/src/components/_common/new-section-element.stories.tsx b/packages/ui/src/components/_common/new-section-element.stories.tsx
index 445a49d6d0969e4d17434cea786d5d50244bbd47..03f6a5042319243234fded24776b8d6c437cfd2d 100644
--- a/packages/ui/src/components/_common/new-section-element.stories.tsx
+++ b/packages/ui/src/components/_common/new-section-element.stories.tsx
@@ -1,6 +1,5 @@
 import { SectionElement } from './new-section-element'
 import { Meta, StoryFn } from '@storybook/vue3'
-import { action } from '@storybook/addon-actions'
 import { toCaminoDate } from 'camino-common/src/date'
 
 const meta: Meta = {
@@ -9,11 +8,8 @@ const meta: Meta = {
 }
 export default meta
 
-const fileDownload = action('fileDownload')
-
 export const Text: StoryFn = () => (
   <SectionElement
-    fileDownload={fileDownload}
     element={{
       id: 'id',
       type: 'text',
@@ -26,7 +22,6 @@ export const Text: StoryFn = () => (
 
 export const GranulatsMarins: StoryFn = () => (
   <SectionElement
-    fileDownload={fileDownload}
     element={{
       id: 'volumeGranulatsExtrait',
       type: 'number',
@@ -39,7 +34,6 @@ export const GranulatsMarins: StoryFn = () => (
 
 export const JORF: StoryFn = () => (
   <SectionElement
-    fileDownload={fileDownload}
     element={{
       id: 'jorf',
       type: 'text',
@@ -52,7 +46,6 @@ export const JORF: StoryFn = () => (
 
 export const Url: StoryFn = () => (
   <SectionElement
-    fileDownload={fileDownload}
     element={{
       id: 'id',
       type: 'url',
@@ -63,22 +56,8 @@ export const Url: StoryFn = () => (
   />
 )
 
-export const File: StoryFn = () => (
-  <SectionElement
-    fileDownload={fileDownload}
-    element={{
-      id: 'id',
-      type: 'file',
-      nom: 'Un fichier',
-      description: 'description',
-      value: 'superfichier.pdf',
-    }}
-  />
-)
-
 export const Date: StoryFn = () => (
   <SectionElement
-    fileDownload={fileDownload}
     element={{
       id: 'id',
       type: 'date',
@@ -91,7 +70,6 @@ export const Date: StoryFn = () => (
 
 export const Checkboxes: StoryFn = () => (
   <SectionElement
-    fileDownload={fileDownload}
     element={{
       id: 'id',
       type: 'checkboxes',
@@ -109,7 +87,6 @@ export const Checkboxes: StoryFn = () => (
 
 export const Select: StoryFn = () => (
   <SectionElement
-    fileDownload={fileDownload}
     element={{
       id: 'id',
       type: 'select',
@@ -127,7 +104,6 @@ export const Select: StoryFn = () => (
 
 export const Number: StoryFn = () => (
   <SectionElement
-    fileDownload={fileDownload}
     element={{
       id: 'id',
       type: 'number',
@@ -140,7 +116,6 @@ export const Number: StoryFn = () => (
 export const Radio: StoryFn = () => (
   <div>
     <SectionElement
-      fileDownload={fileDownload}
       element={{
         id: 'id',
         type: 'radio',
@@ -149,7 +124,6 @@ export const Radio: StoryFn = () => (
       }}
     />
     <SectionElement
-      fileDownload={fileDownload}
       element={{
         id: 'id',
         type: 'radio',
diff --git a/packages/ui/src/components/_common/new-section-element.stories_snapshots_File.html b/packages/ui/src/components/_common/new-section-element.stories_snapshots_File.html
deleted file mode 100644
index 35392984feba9f543c3e1370a121a9e881021472..0000000000000000000000000000000000000000
--- a/packages/ui/src/components/_common/new-section-element.stories_snapshots_File.html
+++ /dev/null
@@ -1,11 +0,0 @@
-<div class="tablet-blobs">
-  <div class="tablet-blob-1-4">
-    <h5>Un fichier</h5>
-  </div>
-  <div class="tablet-blob-3-4">
-    <div class="flex h6 pb-xs"><span class="mt-xs flex bold"><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="16px" height="16px" viewBox="0 0 24 24" fill="#666" class="mr-xs"><use href="#icon-file"></use></svg>fichier.pdf</span><button title="Télécharger le fichier" aria-label="Télécharger le fichier" class="btn-border py-xs px-s rnd-xs flex-right mt--xs"><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
-          <use href="#icon-download"></use>
-        </svg></button></div>
-    <p class="h6"><span>description</span></p>
-  </div>
-</div>
\ No newline at end of file
diff --git a/packages/ui/src/components/_common/new-section-element.tsx b/packages/ui/src/components/_common/new-section-element.tsx
index c5652ec4603b7d4b1a56ac0096f81e678a72efd4..95ffabd6dc644ab5ef0070bee7a6af383cca96b3 100644
--- a/packages/ui/src/components/_common/new-section-element.tsx
+++ b/packages/ui/src/components/_common/new-section-element.tsx
@@ -1,60 +1,44 @@
-import { Icon } from '@/components/_ui/icon'
-import { ElementWithValue, isFileElement, isNumberElement, valeurFind } from 'camino-common/src/sections'
+import { ElementWithValue, isNumberElement, valeurFind } from 'camino-common/src/sections'
 import { FunctionalComponent } from 'vue'
-import { ButtonIcon } from '../_ui/button-icon'
 import { numberFormat } from 'camino-common/src/number'
+import { isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools'
 
 interface Props {
   element: ElementWithValue
-  fileDownload: (file: string) => void
 }
 
 export const SectionElement: FunctionalComponent<Props> = (props: Props): JSX.Element => {
+  const hasNom: boolean = isNotNullNorUndefinedNorEmpty(props.element.nom)
+  const hasDescription: boolean = isNotNullNorUndefinedNorEmpty(props.element.description)
+
   return (
     <div class="tablet-blobs">
-      {props.element.nom ? (
+      {hasNom ? (
         <div class="tablet-blob-1-4">
           <h5>{props.element.nom}</h5>
         </div>
       ) : null}
-      <div class={`${props.element.nom ? 'tablet-blob-3-4' : 'tablet-blob-1'}`}>
-        {props.element.value && isFileElement(props.element) ? (
-          <div class="flex h6 pb-xs">
-            <span class="mt-xs flex bold">
-              <Icon size="S" name="file" class="mr-xs" aria-hidden="true" />
-              {props.element.value.slice(5)}
-            </span>
-            <ButtonIcon
-              class="btn-border py-xs px-s rnd-xs flex-right mt--xs"
-              onClick={() => (props.element.value && isFileElement(props.element) ? props.fileDownload(props.element.value) : {})}
-              icon="download"
-              title="Télécharger le fichier"
-            />
-          </div>
+      <div class={`${hasNom ? 'tablet-blob-3-4' : 'tablet-blob-1'}`}>
+        {props.element.type === 'url' ? (
+          <a class={`${hasDescription ? 'mb-s' : ''}`} target="_blank" rel="noopener noreferrer" href={valeurFind(props.element)} title={`${props.element.nom} - Lien externe`}>
+            {valeurFind(props.element)}
+          </a>
         ) : (
-          <>
-            {props.element.type === 'url' ? (
-              <a class={`${props.element.description ? 'mb-s' : ''}`} target="_blank" rel="noopener noreferrer" href={valeurFind(props.element)} title={`${props.element.nom} - Lien externe`}>
+          <p class={`cap-first ${hasDescription ? 'mb-s' : ''}`}>
+            {props.element.id === 'jorf' && props.element.value !== null && props.element.value !== '' ? (
+              <a target="_blank" rel="noopener noreferrer" href={`https://www.legifrance.gouv.fr/jorf/id/${valeurFind(props.element)}`} title={`Légifrance - Lien externe`}>
                 {valeurFind(props.element)}
               </a>
             ) : (
-              <p class={`cap-first ${props.element.description ? 'mb-s' : ''}`}>
-                {props.element.id === 'jorf' && props.element.value !== null && props.element.value !== '' ? (
-                  <a target="_blank" rel="noopener noreferrer" href={`https://www.legifrance.gouv.fr/jorf/id/${valeurFind(props.element)}`} title={`Légifrance - Lien externe`}>
-                    {valeurFind(props.element)}
-                  </a>
-                ) : (
-                  valeurFind(props.element)
-                )}
-                {props.element.id === 'volumeGranulatsExtrait' && props.element.value !== null && isNumberElement(props.element) ? (
-                  <span>m3. Soit l’équivalent de {numberFormat(props.element.value * 1.5)} tonnes.</span>
-                ) : null}
-              </p>
+              valeurFind(props.element)
             )}
-          </>
+            {props.element.id === 'volumeGranulatsExtrait' && props.element.value !== null && isNumberElement(props.element) ? (
+              <span>m3. Soit l’équivalent de {numberFormat(props.element.value * 1.5)} tonnes.</span>
+            ) : null}
+          </p>
         )}
 
-        {props.element.description ? (
+        {hasDescription ? (
           <p class="h6">
             <span innerHTML={props.element.description} />
           </p>
diff --git a/packages/ui/src/components/_common/new-section.stories.tsx b/packages/ui/src/components/_common/new-section.stories.tsx
index 3c17a7015e431da5da07dbdf1c4c365644da5b5b..5697573e4530644c471e225917be13431ce8de8f 100644
--- a/packages/ui/src/components/_common/new-section.stories.tsx
+++ b/packages/ui/src/components/_common/new-section.stories.tsx
@@ -1,4 +1,3 @@
-import { action } from '@storybook/addon-actions'
 import { Meta, StoryFn } from '@storybook/vue3'
 import { NewSection } from './new-section'
 import { toCaminoDate } from 'camino-common/src/date'
@@ -9,10 +8,8 @@ const meta: Meta = {
 }
 export default meta
 
-const fileDownload = action('fileDownload')
 export const Default: StoryFn = () => (
   <NewSection
-    fileDownload={fileDownload}
     entete={false}
     date={toCaminoDate('2022-01-01')}
     section={{
@@ -34,7 +31,6 @@ export const Default: StoryFn = () => (
 
 export const WithoutContent: StoryFn = () => (
   <NewSection
-    fileDownload={fileDownload}
     entete={false}
     date={toCaminoDate('2022-01-01')}
     section={{
diff --git a/packages/ui/src/components/_common/new-section.tsx b/packages/ui/src/components/_common/new-section.tsx
index bd6decbb5583d1b29d18721d09b39ee95e40e479..b7d7a288efd8eee8d09d865ef28b22d8ea2ea848 100644
--- a/packages/ui/src/components/_common/new-section.tsx
+++ b/packages/ui/src/components/_common/new-section.tsx
@@ -2,12 +2,13 @@ import { CaminoDate } from 'camino-common/src/date'
 import { SectionWithValue } from 'camino-common/src/sections'
 import { FunctionalComponent } from 'vue'
 import { SectionElement } from './new-section-element'
+import { isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools'
 
 export const Sections = (props: { sections: SectionWithValue[] }): JSX.Element | null => {
   return props.sections?.length ? (
     <>
       {props.sections.map(s => (
-        <NewSection key={s.id} entete={false} section={s} fileDownload={() => ({})} />
+        <NewSection key={s.id} entete={false} section={s} />
       ))}
     </>
   ) : null
@@ -17,7 +18,6 @@ interface Props {
   entete?: boolean
   section: SectionWithValue
   date?: CaminoDate
-  fileDownload: (file: string) => void
 }
 export const NewSection: FunctionalComponent<Props> = (props: Props): JSX.Element => {
   const entete = props.entete ?? true
@@ -31,10 +31,10 @@ export const NewSection: FunctionalComponent<Props> = (props: Props): JSX.Elemen
 
   return (
     <div>
-      {props.section.nom && entete ? <h4 class="cap-first">{props.section.nom}</h4> : null}
+      {isNotNullNorUndefinedNorEmpty(props.section.nom) && entete ? <h4 class="cap-first">{props.section.nom}</h4> : null}
 
       {elements.map(e => (
-        <SectionElement key={e.id} element={e} fileDownload={props.fileDownload} />
+        <SectionElement key={e.id} element={e} />
       ))}
     </div>
   )
diff --git a/packages/ui/src/components/_common/new-sections-edit.stories.tsx b/packages/ui/src/components/_common/new-sections-edit.stories.tsx
index e8cce9e4b635eb2b0f685ea28b282fda3bb6436d..2583a350287a3c287afefb3b2a353b86b702db41 100644
--- a/packages/ui/src/components/_common/new-sections-edit.stories.tsx
+++ b/packages/ui/src/components/_common/new-sections-edit.stories.tsx
@@ -6,8 +6,7 @@ import { UNITES, Unite, Unites } from 'camino-common/src/static/unites'
 import { ActiviteSectionElement, ActivitesTypes, isSubstancesFiscales } from 'camino-common/src/static/activitesTypes'
 import { getSectionsWithValue } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sections'
 import { SubstancesFiscale } from 'camino-common/src/static/substancesFiscales'
-import { DeepReadonly } from 'vue'
-import { NonEmptyArray } from 'camino-common/src/typescript-tools'
+import { DeepReadonly, NonEmptyArray } from 'camino-common/src/typescript-tools'
 
 const meta: Meta = {
   title: 'Components/Common/SectionsEdit',
diff --git a/packages/ui/src/components/_common/new-sections-edit.stories_snapshots_Date.html b/packages/ui/src/components/_common/new-sections-edit.stories_snapshots_Date.html
index 9cd0f85fa232ea445e6d7162dc939cdb6fe6cfd8..30dbbbd9ded4f85e6fb47036265d842b4637923d 100644
--- a/packages/ui/src/components/_common/new-sections-edit.stories_snapshots_Date.html
+++ b/packages/ui/src/components/_common/new-sections-edit.stories_snapshots_Date.html
@@ -4,31 +4,8 @@
       <!---->
       <div class="fr-fieldset__element">
         <div>
-          <div class="dsfr">
-            <fieldset class="fr-fieldset" id="date_271-fieldset" role="group" aria-labelledby="date_271-fieldset-legend">
-              <legend class="fr-fieldset__legend" id="date_271-fieldset-legend">Une date *<span class="fr-hint-text">Et quelle belle date</span></legend>
-              <div class="fr-fieldset__element fr-fieldset__element--inline fr-fieldset__element--number">
-                <div class="fr-input-group"><label class="fr-label" for="input_670">Jour
-                    <!----><span class="fr-hint-text">Exemple : 14</span>
-                  </label><input class="fr-input" name="input_670" id="input_670" type="number" min="1" max="31">
-                  <!---->
-                </div>
-              </div>
-              <div class="fr-fieldset__element fr-fieldset__element--inline fr-fieldset__element--number">
-                <div class="fr-input-group"><label class="fr-label" for="input_74">Mois
-                    <!----><span class="fr-hint-text">Exemple : 12</span>
-                  </label><input class="fr-input" name="input_74" id="input_74" type="number" min="1" max="12">
-                  <!---->
-                </div>
-              </div>
-              <div class="fr-fieldset__element fr-fieldset__element--inline fr-fieldset__element--inline-grow fr-fieldset__element--year">
-                <div class="fr-input-group"><label class="fr-label" for="input_878">Année
-                    <!----><span class="fr-hint-text">Exemple : 1984</span>
-                  </label><input class="fr-input" name="input_878" id="input_878" type="number" min="1750" max="2099">
-                  <!---->
-                </div>
-              </div>
-            </fieldset>
+          <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_271">Une date *<span class="fr-hint-text">Et quelle belle date</span></label><input class="fr-input" name="input_271" id="input_271" required="" type="date">
+            <!---->
           </div>
         </div>
       </div>
diff --git a/packages/ui/src/components/_common/new-sections-edit.stories_snapshots_Default.html b/packages/ui/src/components/_common/new-sections-edit.stories_snapshots_Default.html
index d82847e3fe989b1003ec80810b8f64ce5368aff6..3489934e88b0c0f4caee05140730ab0791d3cbf4 100644
--- a/packages/ui/src/components/_common/new-sections-edit.stories_snapshots_Default.html
+++ b/packages/ui/src/components/_common/new-sections-edit.stories_snapshots_Default.html
@@ -4,28 +4,28 @@
       <legend class="fr-fieldset__legend" id="renseignements-legend">Renseignements</legend>
       <div class="fr-fieldset__element">
         <div>
-          <div class="fr-input-group"><label class="fr-label" for="input_271">Or brut extrait (g) *<span class="fr-hint-text">Masse d’or brut en sortie de mine extrait au cours du trimestre (exemple : masse sous la forme de concentré gravimétrique).</span></label><input class="fr-input" name="input_271" id="input_271" required="" type="number" min="0">
+          <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_271">Or brut extrait (g) *<span class="fr-hint-text">Masse d’or brut en sortie de mine extrait au cours du trimestre (exemple : masse sous la forme de concentré gravimétrique).</span></label><input class="fr-input" name="input_271" id="input_271" required="" type="number" min="0">
             <!---->
           </div>
         </div>
       </div>
       <div class="fr-fieldset__element">
         <div>
-          <div class="fr-input-group"><label class="fr-label" for="input_670">Mercure récupéré (g) *<span class="fr-hint-text">Masse en gramme de l’ensemble des produits contaminés envoyés en traitement au cours du trimestre.</span></label><input class="fr-input" name="input_670" id="input_670" required="" type="number" min="0">
+          <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_670">Mercure récupéré (g) *<span class="fr-hint-text">Masse en gramme de l’ensemble des produits contaminés envoyés en traitement au cours du trimestre.</span></label><input class="fr-input" name="input_670" id="input_670" required="" type="number" min="0">
             <!---->
           </div>
         </div>
       </div>
       <div class="fr-fieldset__element">
         <div>
-          <div class="fr-input-group"><label class="fr-label" for="input_74">Carburant détaxé (l) *<span class="fr-hint-text">Volume total en litre de carburant détaxé consommé au cours du trimestre par les travaux réalisés sur le chantier.</span></label><input class="fr-input" name="input_74" id="input_74" required="" type="number" min="0">
+          <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_74">Carburant détaxé (l) *<span class="fr-hint-text">Volume total en litre de carburant détaxé consommé au cours du trimestre par les travaux réalisés sur le chantier.</span></label><input class="fr-input" name="input_74" id="input_74" required="" type="number" min="0">
             <!---->
           </div>
         </div>
       </div>
       <div class="fr-fieldset__element">
         <div>
-          <div class="fr-input-group"><label class="fr-label" for="input_878">Carburant conventionnel (l) *<span class="fr-hint-text">Volume total en litre de carburant conventionnel consommé au cours du trimestre par les travaux réalisés sur le chantier.</span></label><input class="fr-input" name="input_878" id="input_878" required="" type="number" min="0">
+          <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_878">Carburant conventionnel (l) *<span class="fr-hint-text">Volume total en litre de carburant conventionnel consommé au cours du trimestre par les travaux réalisés sur le chantier.</span></label><input class="fr-input" name="input_878" id="input_878" required="" type="number" min="0">
             <!---->
           </div>
         </div>
@@ -49,21 +49,21 @@
       </div>
       <div class="fr-fieldset__element">
         <div>
-          <div class="fr-input-group"><label class="fr-label" for="input_967">Pelles actives *<span class="fr-hint-text">Nombre moyen de pelles actives au cours du trimestre utilisées sur le chantier (aménagement, exploitation, réhabilitation).</span></label><input class="fr-input" name="input_967" id="input_967" required="" type="number" min="0">
+          <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_967">Pelles actives *<span class="fr-hint-text">Nombre moyen de pelles actives au cours du trimestre utilisées sur le chantier (aménagement, exploitation, réhabilitation).</span></label><input class="fr-input" name="input_967" id="input_967" required="" type="number" min="0">
             <!---->
           </div>
         </div>
       </div>
       <div class="fr-fieldset__element">
         <div>
-          <div class="fr-input-group"><label class="fr-label" for="input_25">Effectifs *<span class="fr-hint-text">Nombre moyen de salariés sur le chantier au cours du trimestre.</span></label><input class="fr-input" name="input_25" id="input_25" required="" type="number" min="0">
+          <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_25">Effectifs *<span class="fr-hint-text">Nombre moyen de salariés sur le chantier au cours du trimestre.</span></label><input class="fr-input" name="input_25" id="input_25" required="" type="number" min="0">
             <!---->
           </div>
         </div>
       </div>
       <div class="fr-fieldset__element">
         <div>
-          <div class="fr-input-group"><label class="fr-label" for="input_128">Dépenses relatives à la protection de l’environnement (euros)
+          <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_128">Dépenses relatives à la protection de l’environnement (euros)
               <!----><span class="fr-hint-text">Montant en euros des investissements consentis au cours du trimestre listés à l’<a href="https://www.legifrance.gouv.fr/affichCodeArticle.do?idArticle=LEGIARTI000021850940&amp;cidTexte=LEGITEXT000006069569" target="_blank" rel="noopener noreferrer">article 318 C de l’annexe II du code général des impôts</a>. Afin de bénéficier des déductions fiscales afférentes, les justificatifs attestant de la réalisation effective des investissements sont susceptibles de vous êtres demandés par l’administration.</span>
             </label><input class="fr-input" name="input_128" id="input_128" type="number" min="0">
             <!---->
diff --git a/packages/ui/src/components/_common/new-sections-edit.stories_snapshots_TousLesElementsRemplis.html b/packages/ui/src/components/_common/new-sections-edit.stories_snapshots_TousLesElementsRemplis.html
index 47ab05003fa8b135bfddb21bb4dd152c8f63e95e..102d70e03e06639f61bded10fde589cf4c55ef32 100644
--- a/packages/ui/src/components/_common/new-sections-edit.stories_snapshots_TousLesElementsRemplis.html
+++ b/packages/ui/src/components/_common/new-sections-edit.stories_snapshots_TousLesElementsRemplis.html
@@ -4,63 +4,40 @@
       <!---->
       <div class="fr-fieldset__element">
         <div>
-          <div class="fr-input-group"><label class="fr-label" for="input_271">integer *<span class="fr-hint-text">Description pour integer</span></label><input class="fr-input" name="input_271" id="input_271" required="" type="number" min="0">
+          <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_271">integer *<span class="fr-hint-text">Description pour integer</span></label><input class="fr-input" name="input_271" id="input_271" required="" type="number" min="0">
             <!---->
           </div>
         </div>
       </div>
       <div class="fr-fieldset__element">
         <div>
-          <div class="fr-input-group"><label class="fr-label" for="input_670">number *<span class="fr-hint-text">Description pour number</span></label><input class="fr-input" name="input_670" id="input_670" required="" type="number" min="0">
+          <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_670">number *<span class="fr-hint-text">Description pour number</span></label><input class="fr-input" name="input_670" id="input_670" required="" type="number" min="0">
             <!---->
           </div>
         </div>
       </div>
       <div class="fr-fieldset__element">
         <div>
-          <div class="dsfr">
-            <fieldset class="fr-fieldset" id="date_74-fieldset" role="group" aria-labelledby="date_74-fieldset-legend">
-              <legend class="fr-fieldset__legend" id="date_74-fieldset-legend">date *<span class="fr-hint-text">Description pour date</span></legend>
-              <div class="fr-fieldset__element fr-fieldset__element--inline fr-fieldset__element--number">
-                <div class="fr-input-group"><label class="fr-label" for="input_878">Jour
-                    <!----><span class="fr-hint-text">Exemple : 14</span>
-                  </label><input class="fr-input" name="input_878" id="input_878" type="number" min="1" max="31">
-                  <!---->
-                </div>
-              </div>
-              <div class="fr-fieldset__element fr-fieldset__element--inline fr-fieldset__element--number">
-                <div class="fr-input-group"><label class="fr-label" for="input_967">Mois
-                    <!----><span class="fr-hint-text">Exemple : 12</span>
-                  </label><input class="fr-input" name="input_967" id="input_967" type="number" min="1" max="12">
-                  <!---->
-                </div>
-              </div>
-              <div class="fr-fieldset__element fr-fieldset__element--inline fr-fieldset__element--inline-grow fr-fieldset__element--year">
-                <div class="fr-input-group"><label class="fr-label" for="input_25">Année
-                    <!----><span class="fr-hint-text">Exemple : 1984</span>
-                  </label><input class="fr-input" name="input_25" id="input_25" type="number" min="1750" max="2099">
-                  <!---->
-                </div>
-              </div>
-            </fieldset>
+          <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_74">date *<span class="fr-hint-text">Description pour date</span></label><input class="fr-input" name="input_74" id="input_74" required="" type="date">
+            <!---->
           </div>
         </div>
       </div>
       <div class="fr-fieldset__element">
         <div>
-          <div class="fr-input-group"><label class="fr-label" for="textarea_128">textarea *<span class="fr-hint-text">Description pour textarea</span></label><textarea class="fr-input" name="textarea_128" id="textarea_128" required=""></textarea></div>
+          <div class="fr-input-group"><label class="fr-label" for="textarea_878">textarea *<span class="fr-hint-text">Description pour textarea</span></label><textarea class="fr-input" name="textarea_878" id="textarea_878" required=""></textarea></div>
         </div>
       </div>
       <div class="fr-fieldset__element">
         <div>
-          <div class="fr-input-group"><label class="fr-label" for="input_772">text *<span class="fr-hint-text">Description pour text</span></label><input class="fr-input" name="input_772" id="input_772" required="" type="text">
+          <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_967">text *<span class="fr-hint-text">Description pour text</span></label><input class="fr-input" name="input_967" id="input_967" required="" type="text">
             <!---->
           </div>
         </div>
       </div>
       <div class="fr-fieldset__element">
         <div>
-          <div class="fr-input-group"><label class="fr-label" for="input_453">url *<span class="fr-hint-text">Description pour url</span></label><input class="fr-input" name="input_453" id="input_453" required="" type="text">
+          <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_25">url *<span class="fr-hint-text">Description pour url</span></label><input class="fr-input" name="input_25" id="input_25" required="" type="text">
             <!---->
           </div>
         </div>
@@ -84,25 +61,25 @@
       </div>
       <div class="fr-fieldset__element">
         <div>
-          <div class="fr-checkbox-group"><input name="archive" id="checkbox_556" type="checkbox"><label class="fr-label" for="checkbox_556">checkbox<span class="fr-hint-text">Description pour checkbox</span></label></div>
+          <div class="fr-checkbox-group"><input name="archive" id="checkbox_128" type="checkbox"><label class="fr-label" for="checkbox_128">checkbox<span class="fr-hint-text">Description pour checkbox</span></label></div>
         </div>
       </div>
       <div class="fr-fieldset__element">
         <div>
-          <fieldset class="fr-fieldset" id="checkboxes_487" aria-labelledby="checkboxes_487-legend">
-            <legend class="fr-fieldset__legend--regular fr-fieldset__legend" id="checkboxes_487-legend">checkboxes<span class="fr-hint-text">Description pour checkboxes</span></legend>
+          <fieldset class="fr-fieldset" id="checkboxes_772" aria-labelledby="checkboxes_772-legend">
+            <legend class="fr-fieldset__legend--regular fr-fieldset__legend" id="checkboxes_772-legend">checkboxes<span class="fr-hint-text">Description pour checkboxes</span></legend>
             <div class="fr-fieldset__element">
-              <div class="fr-checkbox-group" itemid="1"><input name="archive" id="checkboxes_487_0" type="checkbox"><label class="fr-label" for="checkboxes_487_0">Checkbox 1
+              <div class="fr-checkbox-group" itemid="1"><input name="archive" id="checkboxes_772_0" type="checkbox"><label class="fr-label" for="checkboxes_772_0">Checkbox 1
                   <!---->
                 </label></div>
             </div>
             <div class="fr-fieldset__element">
-              <div class="fr-checkbox-group" itemid="2"><input name="archive" id="checkboxes_487_1" type="checkbox"><label class="fr-label" for="checkboxes_487_1">Checkbox2
+              <div class="fr-checkbox-group" itemid="2"><input name="archive" id="checkboxes_772_1" type="checkbox"><label class="fr-label" for="checkboxes_772_1">Checkbox2
                   <!---->
                 </label></div>
             </div>
             <div class="fr-fieldset__element">
-              <div class="fr-checkbox-group" itemid="3"><input name="archive" id="checkboxes_487_2" type="checkbox"><label class="fr-label" for="checkboxes_487_2">Checkbox3
+              <div class="fr-checkbox-group" itemid="3"><input name="archive" id="checkboxes_772_2" type="checkbox"><label class="fr-label" for="checkboxes_772_2">Checkbox3
                   <!---->
                 </label></div>
             </div>
@@ -111,7 +88,7 @@
       </div>
       <div class="fr-fieldset__element">
         <div>
-          <div class="fr-select-group"><label class="fr-label" for="select_796">select *<span class="fr-hint-text">Description pour select</span></label><select class="fr-select" id="select_796" aria-label="select" name="select_796">
+          <div class="fr-select-group"><label class="fr-label" for="select_453">select *<span class="fr-hint-text">Description pour select</span></label><select class="fr-select" id="select_453" aria-label="select" name="select_453">
               <option value="deg">degré</option>
               <option value="gon">grade</option>
               <option value="km3">kilomètre cube</option>
diff --git a/packages/ui/src/components/_common/new-sections-edit.stories_snapshots_TousLesElementsRequis.html b/packages/ui/src/components/_common/new-sections-edit.stories_snapshots_TousLesElementsRequis.html
index 80892239720cdf67f4fa912cd3084c36ec813658..948fffe95f62d72039bc7225f5f5367f2ff7d0d4 100644
--- a/packages/ui/src/components/_common/new-sections-edit.stories_snapshots_TousLesElementsRequis.html
+++ b/packages/ui/src/components/_common/new-sections-edit.stories_snapshots_TousLesElementsRequis.html
@@ -4,63 +4,40 @@
       <!---->
       <div class="fr-fieldset__element">
         <div>
-          <div class="fr-input-group"><label class="fr-label" for="input_271">integer *<span class="fr-hint-text">Description pour integer</span></label><input class="fr-input" name="input_271" id="input_271" required="" type="number" min="0">
+          <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_271">integer *<span class="fr-hint-text">Description pour integer</span></label><input class="fr-input" name="input_271" id="input_271" required="" type="number" min="0">
             <!---->
           </div>
         </div>
       </div>
       <div class="fr-fieldset__element">
         <div>
-          <div class="fr-input-group"><label class="fr-label" for="input_670">number *<span class="fr-hint-text">Description pour number</span></label><input class="fr-input" name="input_670" id="input_670" required="" type="number" min="0">
+          <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_670">number *<span class="fr-hint-text">Description pour number</span></label><input class="fr-input" name="input_670" id="input_670" required="" type="number" min="0">
             <!---->
           </div>
         </div>
       </div>
       <div class="fr-fieldset__element">
         <div>
-          <div class="dsfr">
-            <fieldset class="fr-fieldset" id="date_74-fieldset" role="group" aria-labelledby="date_74-fieldset-legend">
-              <legend class="fr-fieldset__legend" id="date_74-fieldset-legend">date *<span class="fr-hint-text">Description pour date</span></legend>
-              <div class="fr-fieldset__element fr-fieldset__element--inline fr-fieldset__element--number">
-                <div class="fr-input-group"><label class="fr-label" for="input_878">Jour
-                    <!----><span class="fr-hint-text">Exemple : 14</span>
-                  </label><input class="fr-input" name="input_878" id="input_878" type="number" min="1" max="31">
-                  <!---->
-                </div>
-              </div>
-              <div class="fr-fieldset__element fr-fieldset__element--inline fr-fieldset__element--number">
-                <div class="fr-input-group"><label class="fr-label" for="input_967">Mois
-                    <!----><span class="fr-hint-text">Exemple : 12</span>
-                  </label><input class="fr-input" name="input_967" id="input_967" type="number" min="1" max="12">
-                  <!---->
-                </div>
-              </div>
-              <div class="fr-fieldset__element fr-fieldset__element--inline fr-fieldset__element--inline-grow fr-fieldset__element--year">
-                <div class="fr-input-group"><label class="fr-label" for="input_25">Année
-                    <!----><span class="fr-hint-text">Exemple : 1984</span>
-                  </label><input class="fr-input" name="input_25" id="input_25" type="number" min="1750" max="2099">
-                  <!---->
-                </div>
-              </div>
-            </fieldset>
+          <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_74">date *<span class="fr-hint-text">Description pour date</span></label><input class="fr-input" name="input_74" id="input_74" required="" type="date">
+            <!---->
           </div>
         </div>
       </div>
       <div class="fr-fieldset__element">
         <div>
-          <div class="fr-input-group"><label class="fr-label" for="textarea_128">textarea *<span class="fr-hint-text">Description pour textarea</span></label><textarea class="fr-input" name="textarea_128" id="textarea_128" required=""></textarea></div>
+          <div class="fr-input-group"><label class="fr-label" for="textarea_878">textarea *<span class="fr-hint-text">Description pour textarea</span></label><textarea class="fr-input" name="textarea_878" id="textarea_878" required=""></textarea></div>
         </div>
       </div>
       <div class="fr-fieldset__element">
         <div>
-          <div class="fr-input-group"><label class="fr-label" for="input_772">text *<span class="fr-hint-text">Description pour text</span></label><input class="fr-input" name="input_772" id="input_772" required="" type="text">
+          <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_967">text *<span class="fr-hint-text">Description pour text</span></label><input class="fr-input" name="input_967" id="input_967" required="" type="text">
             <!---->
           </div>
         </div>
       </div>
       <div class="fr-fieldset__element">
         <div>
-          <div class="fr-input-group"><label class="fr-label" for="input_453">url *<span class="fr-hint-text">Description pour url</span></label><input class="fr-input" name="input_453" id="input_453" required="" type="text">
+          <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_25">url *<span class="fr-hint-text">Description pour url</span></label><input class="fr-input" name="input_25" id="input_25" required="" type="text">
             <!---->
           </div>
         </div>
@@ -84,20 +61,20 @@
       </div>
       <div class="fr-fieldset__element">
         <div>
-          <div class="fr-checkbox-group"><input name="archive" id="checkbox_556" type="checkbox"><label class="fr-label" for="checkbox_556">checkbox<span class="fr-hint-text">Description pour checkbox</span></label></div>
+          <div class="fr-checkbox-group"><input name="archive" id="checkbox_128" type="checkbox"><label class="fr-label" for="checkbox_128">checkbox<span class="fr-hint-text">Description pour checkbox</span></label></div>
         </div>
       </div>
       <div class="fr-fieldset__element">
         <div>
-          <fieldset class="fr-fieldset" id="checkboxes_487" aria-labelledby="checkboxes_487-legend">
-            <legend class="fr-fieldset__legend--regular fr-fieldset__legend" id="checkboxes_487-legend">checkboxes<span class="fr-hint-text">Description pour checkboxes</span></legend>
+          <fieldset class="fr-fieldset" id="checkboxes_772" aria-labelledby="checkboxes_772-legend">
+            <legend class="fr-fieldset__legend--regular fr-fieldset__legend" id="checkboxes_772-legend">checkboxes<span class="fr-hint-text">Description pour checkboxes</span></legend>
             <div class="fr-fieldset__element">
-              <div class="fr-checkbox-group" itemid="1"><input name="archive" id="checkboxes_487_0" type="checkbox"><label class="fr-label" for="checkboxes_487_0">Checkbox 1
+              <div class="fr-checkbox-group" itemid="1"><input name="archive" id="checkboxes_772_0" type="checkbox"><label class="fr-label" for="checkboxes_772_0">Checkbox 1
                   <!---->
                 </label></div>
             </div>
             <div class="fr-fieldset__element">
-              <div class="fr-checkbox-group" itemid="2"><input name="archive" id="checkboxes_487_1" type="checkbox"><label class="fr-label" for="checkboxes_487_1">Checkbox2
+              <div class="fr-checkbox-group" itemid="2"><input name="archive" id="checkboxes_772_1" type="checkbox"><label class="fr-label" for="checkboxes_772_1">Checkbox2
                   <!---->
                 </label></div>
             </div>
@@ -106,7 +83,7 @@
       </div>
       <div class="fr-fieldset__element">
         <div>
-          <div class="fr-select-group"><label class="fr-label" for="select_796">select *<span class="fr-hint-text">Description pour select</span></label><select class="fr-select" id="select_796" aria-label="select" name="select_796">
+          <div class="fr-select-group"><label class="fr-label" for="select_453">select *<span class="fr-hint-text">Description pour select</span></label><select class="fr-select" id="select_453" aria-label="select" name="select_453">
               <option value="deg">degré</option>
               <option value="gon">grade</option>
               <option value="km3">kilomètre cube</option>
diff --git a/packages/ui/src/components/_common/new-sections-edit.stories_snapshots_TousLesElementsVidesOptionnels.html b/packages/ui/src/components/_common/new-sections-edit.stories_snapshots_TousLesElementsVidesOptionnels.html
index 0222c787df42ca055e8c8c3f2d69fbe7a23bd26b..669ecc9e3a077cba586fd5e5f4830ff29a953f54 100644
--- a/packages/ui/src/components/_common/new-sections-edit.stories_snapshots_TousLesElementsVidesOptionnels.html
+++ b/packages/ui/src/components/_common/new-sections-edit.stories_snapshots_TousLesElementsVidesOptionnels.html
@@ -4,7 +4,7 @@
       <!---->
       <div class="fr-fieldset__element">
         <div>
-          <div class="fr-input-group"><label class="fr-label" for="input_271">integer
+          <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_271">integer
               <!----><span class="fr-hint-text">Description pour integer</span>
             </label><input class="fr-input" name="input_271" id="input_271" type="number" min="0">
             <!---->
@@ -13,7 +13,7 @@
       </div>
       <div class="fr-fieldset__element">
         <div>
-          <div class="fr-input-group"><label class="fr-label" for="input_670">number
+          <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_670">number
               <!----><span class="fr-hint-text">Description pour number</span>
             </label><input class="fr-input" name="input_670" id="input_670" type="number" min="0">
             <!---->
@@ -22,55 +22,34 @@
       </div>
       <div class="fr-fieldset__element">
         <div>
-          <div class="dsfr">
-            <fieldset class="fr-fieldset" id="date_74-fieldset" role="group" aria-labelledby="date_74-fieldset-legend">
-              <legend class="fr-fieldset__legend" id="date_74-fieldset-legend">date <span class="fr-hint-text">Description pour date</span></legend>
-              <div class="fr-fieldset__element fr-fieldset__element--inline fr-fieldset__element--number">
-                <div class="fr-input-group"><label class="fr-label" for="input_878">Jour
-                    <!----><span class="fr-hint-text">Exemple : 14</span>
-                  </label><input class="fr-input" name="input_878" id="input_878" type="number" min="1" max="31">
-                  <!---->
-                </div>
-              </div>
-              <div class="fr-fieldset__element fr-fieldset__element--inline fr-fieldset__element--number">
-                <div class="fr-input-group"><label class="fr-label" for="input_967">Mois
-                    <!----><span class="fr-hint-text">Exemple : 12</span>
-                  </label><input class="fr-input" name="input_967" id="input_967" type="number" min="1" max="12">
-                  <!---->
-                </div>
-              </div>
-              <div class="fr-fieldset__element fr-fieldset__element--inline fr-fieldset__element--inline-grow fr-fieldset__element--year">
-                <div class="fr-input-group"><label class="fr-label" for="input_25">Année
-                    <!----><span class="fr-hint-text">Exemple : 1984</span>
-                  </label><input class="fr-input" name="input_25" id="input_25" type="number" min="1750" max="2099">
-                  <!---->
-                </div>
-              </div>
-            </fieldset>
+          <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_74">date
+              <!----><span class="fr-hint-text">Description pour date</span>
+            </label><input class="fr-input" name="input_74" id="input_74" type="date">
+            <!---->
           </div>
         </div>
       </div>
       <div class="fr-fieldset__element">
         <div>
-          <div class="fr-input-group"><label class="fr-label" for="textarea_128">textarea
+          <div class="fr-input-group"><label class="fr-label" for="textarea_878">textarea
               <!----><span class="fr-hint-text">Description pour textarea</span>
-            </label><textarea class="fr-input" name="textarea_128" id="textarea_128"></textarea></div>
+            </label><textarea class="fr-input" name="textarea_878" id="textarea_878"></textarea></div>
         </div>
       </div>
       <div class="fr-fieldset__element">
         <div>
-          <div class="fr-input-group"><label class="fr-label" for="input_772">text
+          <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_967">text
               <!----><span class="fr-hint-text">Description pour text</span>
-            </label><input class="fr-input" name="input_772" id="input_772" type="text">
+            </label><input class="fr-input" name="input_967" id="input_967" type="text">
             <!---->
           </div>
         </div>
       </div>
       <div class="fr-fieldset__element">
         <div>
-          <div class="fr-input-group"><label class="fr-label" for="input_453">url
+          <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_25">url
               <!----><span class="fr-hint-text">Description pour url</span>
-            </label><input class="fr-input" name="input_453" id="input_453" type="text">
+            </label><input class="fr-input" name="input_25" id="input_25" type="text">
             <!---->
           </div>
         </div>
@@ -94,20 +73,20 @@
       </div>
       <div class="fr-fieldset__element">
         <div>
-          <div class="fr-checkbox-group"><input name="archive" id="checkbox_556" type="checkbox"><label class="fr-label" for="checkbox_556">checkbox<span class="fr-hint-text">Description pour checkbox</span></label></div>
+          <div class="fr-checkbox-group"><input name="archive" id="checkbox_128" type="checkbox"><label class="fr-label" for="checkbox_128">checkbox<span class="fr-hint-text">Description pour checkbox</span></label></div>
         </div>
       </div>
       <div class="fr-fieldset__element">
         <div>
-          <fieldset class="fr-fieldset" id="checkboxes_487" aria-labelledby="checkboxes_487-legend">
-            <legend class="fr-fieldset__legend--regular fr-fieldset__legend" id="checkboxes_487-legend">checkboxes<span class="fr-hint-text">Description pour checkboxes</span></legend>
+          <fieldset class="fr-fieldset" id="checkboxes_772" aria-labelledby="checkboxes_772-legend">
+            <legend class="fr-fieldset__legend--regular fr-fieldset__legend" id="checkboxes_772-legend">checkboxes<span class="fr-hint-text">Description pour checkboxes</span></legend>
             <div class="fr-fieldset__element">
-              <div class="fr-checkbox-group" itemid="1"><input name="archive" id="checkboxes_487_0" type="checkbox"><label class="fr-label" for="checkboxes_487_0">Checkbox 1
+              <div class="fr-checkbox-group" itemid="1"><input name="archive" id="checkboxes_772_0" type="checkbox"><label class="fr-label" for="checkboxes_772_0">Checkbox 1
                   <!---->
                 </label></div>
             </div>
             <div class="fr-fieldset__element">
-              <div class="fr-checkbox-group" itemid="2"><input name="archive" id="checkboxes_487_1" type="checkbox"><label class="fr-label" for="checkboxes_487_1">Checkbox2
+              <div class="fr-checkbox-group" itemid="2"><input name="archive" id="checkboxes_772_1" type="checkbox"><label class="fr-label" for="checkboxes_772_1">Checkbox2
                   <!---->
                 </label></div>
             </div>
@@ -116,7 +95,7 @@
       </div>
       <div class="fr-fieldset__element">
         <div>
-          <div class="fr-select-group"><label class="fr-label" for="select_796">select <span class="fr-hint-text">Description pour select</span></label><select class="fr-select" id="select_796" aria-label="select" name="select_796">
+          <div class="fr-select-group"><label class="fr-label" for="select_453">select <span class="fr-hint-text">Description pour select</span></label><select class="fr-select" id="select_453" aria-label="select" name="select_453">
               <option value="deg">degré</option>
               <option value="gon">grade</option>
               <option value="km3">kilomètre cube</option>
diff --git a/packages/ui/src/components/_common/new-sections-edit.stories_snapshots_ToutesLesActivites.html b/packages/ui/src/components/_common/new-sections-edit.stories_snapshots_ToutesLesActivites.html
index 4c5f2ea8ff1bcfbf5c65ba6f7d143ddcc6363798..75a891326f650ffe05a01bfffa7c91806bd69f9f 100644
--- a/packages/ui/src/components/_common/new-sections-edit.stories_snapshots_ToutesLesActivites.html
+++ b/packages/ui/src/components/_common/new-sections-edit.stories_snapshots_ToutesLesActivites.html
@@ -12,7 +12,7 @@
             <legend class="fr-fieldset__legend" id="substancesFiscales-legend">Production annuelle</legend>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_271">or *<span class="fr-hint-text"><b>g (gramme)</b> contenu dans les minerais</span></label><input class="fr-input" name="input_271" id="input_271" required="" type="number" min="0">
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_271">or *<span class="fr-hint-text"><b>g (gramme)</b> contenu dans les minerais</span></label><input class="fr-input" name="input_271" id="input_271" required="" type="number" min="0">
                   <!---->
                 </div>
               </div>
@@ -39,77 +39,77 @@
             <!---->
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_74">Or brut extrait (g) *<span class="fr-hint-text">Masse d’or brut en sortie de mine extrait au cours du trimestre (exemple : masse sous la forme de concentré gravimétrique).</span></label><input class="fr-input" name="input_74" id="input_74" required="" type="number" min="0">
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_74">Or brut extrait (g) *<span class="fr-hint-text">Masse d’or brut en sortie de mine extrait au cours du trimestre (exemple : masse sous la forme de concentré gravimétrique).</span></label><input class="fr-input" name="input_74" id="input_74" required="" type="number" min="0">
                   <!---->
                 </div>
               </div>
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_878">Or extrait (g) *<span class="fr-hint-text">Masse d'or brut en sortie de mine, ou nette obtenue  après traitement métallurgique, extrait au cours du trimestre.</span></label><input class="fr-input" name="input_878" id="input_878" required="" type="number" min="0">
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_878">Or extrait (g) *<span class="fr-hint-text">Masse d'or brut en sortie de mine, ou nette obtenue  après traitement métallurgique, extrait au cours du trimestre.</span></label><input class="fr-input" name="input_878" id="input_878" required="" type="number" min="0">
                   <!---->
                 </div>
               </div>
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_967">Minerai extrait (m3) *<span class="fr-hint-text">Volume en mètre cube de minerai extrait au cours du trimestre.</span></label><input class="fr-input" name="input_967" id="input_967" required="" type="number" min="0">
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_967">Minerai extrait (m3) *<span class="fr-hint-text">Volume en mètre cube de minerai extrait au cours du trimestre.</span></label><input class="fr-input" name="input_967" id="input_967" required="" type="number" min="0">
                   <!---->
                 </div>
               </div>
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_25">Mercure récupéré (g) *<span class="fr-hint-text">Masse en gramme de l’ensemble des produits contaminés envoyés en traitement au cours du trimestre.</span></label><input class="fr-input" name="input_25" id="input_25" required="" type="number" min="0">
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_25">Mercure récupéré (g) *<span class="fr-hint-text">Masse en gramme de l’ensemble des produits contaminés envoyés en traitement au cours du trimestre.</span></label><input class="fr-input" name="input_25" id="input_25" required="" type="number" min="0">
                   <!---->
                 </div>
               </div>
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_128">Carburant détaxé (l) *<span class="fr-hint-text">Volume total en litre de carburant détaxé consommé au cours du trimestre par les travaux réalisés sur le chantier.</span></label><input class="fr-input" name="input_128" id="input_128" required="" type="number" min="0">
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_128">Carburant détaxé (l) *<span class="fr-hint-text">Volume total en litre de carburant détaxé consommé au cours du trimestre par les travaux réalisés sur le chantier.</span></label><input class="fr-input" name="input_128" id="input_128" required="" type="number" min="0">
                   <!---->
                 </div>
               </div>
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_772">Carburant conventionnel (l) *<span class="fr-hint-text">Volume total en litre de carburant conventionnel consommé au cours du trimestre par les travaux réalisés sur le chantier.</span></label><input class="fr-input" name="input_772" id="input_772" required="" type="number" min="0">
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_772">Carburant conventionnel (l) *<span class="fr-hint-text">Volume total en litre de carburant conventionnel consommé au cours du trimestre par les travaux réalisés sur le chantier.</span></label><input class="fr-input" name="input_772" id="input_772" required="" type="number" min="0">
                   <!---->
                 </div>
               </div>
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_453">Pompes actives *<span class="fr-hint-text">Nombre moyen de pompes actives au cours du trimestre utilisées sur le chantier (pompe à gravier, pompe de relevage…).</span></label><input class="fr-input" name="input_453" id="input_453" required="" type="number" min="0">
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_453">Pompes actives *<span class="fr-hint-text">Nombre moyen de pompes actives au cours du trimestre utilisées sur le chantier (pompe à gravier, pompe de relevage…).</span></label><input class="fr-input" name="input_453" id="input_453" required="" type="number" min="0">
                   <!---->
                 </div>
               </div>
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_556">Pelles actives *<span class="fr-hint-text">Nombre moyen de pelles actives au cours du trimestre utilisées sur le chantier (aménagement, exploitation, réhabilitation).</span></label><input class="fr-input" name="input_556" id="input_556" required="" type="number" min="0">
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_556">Pelles actives *<span class="fr-hint-text">Nombre moyen de pelles actives au cours du trimestre utilisées sur le chantier (aménagement, exploitation, réhabilitation).</span></label><input class="fr-input" name="input_556" id="input_556" required="" type="number" min="0">
                   <!---->
                 </div>
               </div>
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_487">Effectifs *<span class="fr-hint-text">Nombre moyen de salariés sur le chantier au cours du trimestre.</span></label><input class="fr-input" name="input_487" id="input_487" required="" type="number" min="0">
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_487">Effectifs *<span class="fr-hint-text">Nombre moyen de salariés sur le chantier au cours du trimestre.</span></label><input class="fr-input" name="input_487" id="input_487" required="" type="number" min="0">
                   <!---->
                 </div>
               </div>
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_796">Dépenses totales (euros) *<span class="fr-hint-text">Montant en euros des dépenses sur l'exploitation.</span></label><input class="fr-input" name="input_796" id="input_796" required="" type="number" min="0">
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_796">Dépenses totales (euros) *<span class="fr-hint-text">Montant en euros des dépenses sur l'exploitation.</span></label><input class="fr-input" name="input_796" id="input_796" required="" type="number" min="0">
                   <!---->
                 </div>
               </div>
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_216">Dépenses relatives à la protection de l’environnement (euros) *<span class="fr-hint-text">Montant en euros des investissements consentis au cours du trimestre listés à l’<a href="https://www.legifrance.gouv.fr/affichCodeArticle.do?idArticle=LEGIARTI000021850940&amp;cidTexte=LEGITEXT000006069569" target="_blank" title="Page de l’article - site externe" rel="noopener noreferrer">article 318 C de l’annexe II du code général des impôts</a>. Afin de bénéficier des déductions fiscales afférentes, les justificatifs attestant de la réalisation effective des investissements sont susceptibles de vous êtres demandés par l’administration.</span></label><input class="fr-input" name="input_216" id="input_216" required="" type="number" min="0">
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_216">Dépenses relatives à la protection de l’environnement (euros) *<span class="fr-hint-text">Montant en euros des investissements consentis au cours du trimestre listés à l’<a href="https://www.legifrance.gouv.fr/affichCodeArticle.do?idArticle=LEGIARTI000021850940&amp;cidTexte=LEGITEXT000006069569" target="_blank" title="Page de l’article - site externe" rel="noopener noreferrer">article 318 C de l’annexe II du code général des impôts</a>. Afin de bénéficier des déductions fiscales afférentes, les justificatifs attestant de la réalisation effective des investissements sont susceptibles de vous êtres demandés par l’administration.</span></label><input class="fr-input" name="input_216" id="input_216" required="" type="number" min="0">
                   <!---->
                 </div>
               </div>
@@ -547,7 +547,7 @@
             <legend class="fr-fieldset__legend" id="substancesFiscales-legend">Production annuelle</legend>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_686">or *<span class="fr-hint-text"><b>g (gramme)</b> contenu dans les minerais</span></label><input class="fr-input" name="input_686" id="input_686" required="" type="number" min="0">
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_686">or *<span class="fr-hint-text"><b>g (gramme)</b> contenu dans les minerais</span></label><input class="fr-input" name="input_686" id="input_686" required="" type="number" min="0">
                   <!---->
                 </div>
               </div>
@@ -574,7 +574,7 @@
             <legend class="fr-fieldset__legend" id="levesTopographiques-legend">Levés topographiques</legend>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_132">Types de levés
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_132">Types de levés
                     <!----><span class="fr-hint-text">Exemples : LIDAR, géomètre…</span>
                   </label><input class="fr-input" name="input_132" id="input_132" type="text">
                   <!---->
@@ -583,7 +583,7 @@
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_773">Surface des levés(km²)
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_773">Surface des levés(km²)
                     <!----><span class="fr-hint-text">Surface du titre couverte par des levés topographiques</span>
                   </label><input class="fr-input" name="input_773" id="input_773" type="number" min="0">
                   <!---->
@@ -602,7 +602,7 @@
             <legend class="fr-fieldset__legend" id="cartographieGeologique-legend">Cartographie géologique</legend>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_253">Surface cartographiée (km²)
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_253">Surface cartographiée (km²)
                     <!----><span class="fr-hint-text">Surface du titre dont la cartographie géologique a été effectuée au cours de l'année</span>
                   </label><input class="fr-input" name="input_253" id="input_253" type="number" min="0">
                   <!---->
@@ -621,7 +621,7 @@
             <legend class="fr-fieldset__legend" id="levesGeochimiques-legend">Levés géochimiques</legend>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_35">Surface des levés(km²)
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_35">Surface des levés(km²)
                     <!----><span class="fr-hint-text">Surface du titre couverte par des levés géochimiques</span>
                   </label><input class="fr-input" name="input_35" id="input_35" type="number" min="0">
                   <!---->
@@ -630,7 +630,7 @@
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_883">Longueur de levés (km)
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_883">Longueur de levés (km)
                     <!----><span class="fr-hint-text">Longueur de layon couverte par des levés géochimiques</span>
                   </label><input class="fr-input" name="input_883" id="input_883" type="number" min="0">
                   <!---->
@@ -649,7 +649,7 @@
             <legend class="fr-fieldset__legend" id="levesGeophysiques-legend">Levés géophysiques</legend>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_453">Surface des levés de magnétisme (km²)
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_453">Surface des levés de magnétisme (km²)
                     <!----><span class="fr-hint-text">Surface du titre en kilomètre carré couverte par des levés de magnétisme </span>
                   </label><input class="fr-input" name="input_453" id="input_453" type="number" min="0">
                   <!---->
@@ -658,7 +658,7 @@
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_473">Longueur des levés de magnétisme (km)
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_473">Longueur des levés de magnétisme (km)
                     <!----><span class="fr-hint-text">Longueur de layon en kilomètre couverte par des levés de magnétisme</span>
                   </label><input class="fr-input" name="input_473" id="input_473" type="number" min="0">
                   <!---->
@@ -686,7 +686,7 @@
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_292">Surface des levés de spectrométrie (km²)
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_292">Surface des levés de spectrométrie (km²)
                     <!----><span class="fr-hint-text">Surface du titre en kilomètre carré couverte par des levés de spectrométrie</span>
                   </label><input class="fr-input" name="input_292" id="input_292" type="number" min="0">
                   <!---->
@@ -695,7 +695,7 @@
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_276">Longueur des levés de spectrométrie (km)
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_276">Longueur des levés de spectrométrie (km)
                     <!----><span class="fr-hint-text">Longueur de layon en kilomètre couverte par des levés de spectrométrie</span>
                   </label><input class="fr-input" name="input_276" id="input_276" type="number" min="0">
                   <!---->
@@ -723,7 +723,7 @@
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_110">Surface des levés de polarisation provoquée (km²)
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_110">Surface des levés de polarisation provoquée (km²)
                     <!----><span class="fr-hint-text">Surface du titre en kilomètre carré couverte par des levés de polarisation provoquée</span>
                   </label><input class="fr-input" name="input_110" id="input_110" type="number" min="0">
                   <!---->
@@ -732,7 +732,7 @@
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_448">Longueur des levés de polarisation provoquée (km)
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_448">Longueur des levés de polarisation provoquée (km)
                     <!----><span class="fr-hint-text">Longueur de layon en kilomètre couverte par des levés de polarisation provoquée</span>
                   </label><input class="fr-input" name="input_448" id="input_448" type="number" min="0">
                   <!---->
@@ -760,7 +760,7 @@
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_648">Surface des levés sismiques (km²)
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_648">Surface des levés sismiques (km²)
                     <!----><span class="fr-hint-text">Surface du titre en kilomètre carré couverte par des levés sismiques</span>
                   </label><input class="fr-input" name="input_648" id="input_648" type="number" min="0">
                   <!---->
@@ -769,7 +769,7 @@
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_726">Longueur des levés sismiques (km)
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_726">Longueur des levés sismiques (km)
                     <!----><span class="fr-hint-text">Longueur de layon en kilomètre couverte par des levés sismiques</span>
                   </label><input class="fr-input" name="input_726" id="input_726" type="number" min="0">
                   <!---->
@@ -797,7 +797,7 @@
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_894">Surface des levés de conductivité (km²)
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_894">Surface des levés de conductivité (km²)
                     <!----><span class="fr-hint-text">Surface du titre en kilomètre carré couverte par des levés de conductivité</span>
                   </label><input class="fr-input" name="input_894" id="input_894" type="number" min="0">
                   <!---->
@@ -806,7 +806,7 @@
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_822">Longueur des levés de conductivité (km)
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_822">Longueur des levés de conductivité (km)
                     <!----><span class="fr-hint-text">Longueur de layon en kilomètre couverte par des levés de conductivité</span>
                   </label><input class="fr-input" name="input_822" id="input_822" type="number" min="0">
                   <!---->
@@ -834,7 +834,7 @@
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_557">Surface des levés par d'autres méthodes (km²)
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_557">Surface des levés par d'autres méthodes (km²)
                     <!----><span class="fr-hint-text">Surface du titre en kilomètre carré couverte par des levés par d'autres méthodes</span>
                   </label><input class="fr-input" name="input_557" id="input_557" type="number" min="0">
                   <!---->
@@ -843,7 +843,7 @@
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_260">Longueur des levés par d'autres méthodes (km)
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_260">Longueur des levés par d'autres méthodes (km)
                     <!----><span class="fr-hint-text">Longueur de layon en kilomètre couverte par des levés par d'autres méthodes</span>
                   </label><input class="fr-input" name="input_260" id="input_260" type="number" min="0">
                   <!---->
@@ -881,7 +881,7 @@
             <legend class="fr-fieldset__legend" id="trancheesPuits-legend">Tranchées et puits</legend>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_800">Nombre de puits
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_800">Nombre de puits
                     <!----><span class="fr-hint-text">Nombre de puits forés</span>
                   </label><input class="fr-input" name="input_800" id="input_800" type="number" min="0">
                   <!---->
@@ -890,7 +890,7 @@
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_723">Longueur de tranchée (km)
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_723">Longueur de tranchée (km)
                     <!----><span class="fr-hint-text">Longueur de tranchée de prospection ouverte</span>
                   </label><input class="fr-input" name="input_723" id="input_723" type="number" min="0">
                   <!---->
@@ -909,7 +909,7 @@
             <legend class="fr-fieldset__legend" id="sondages-legend">Sondages</legend>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_907">Nombre de sondages tarière
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_907">Nombre de sondages tarière
                     <!----><span class="fr-hint-text">Nombre de sondages effectués à l'aide d'une tarière</span>
                   </label><input class="fr-input" name="input_907" id="input_907" type="number" min="0">
                   <!---->
@@ -918,7 +918,7 @@
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_547">Profondeur maximale des sondages tarière (m)
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_547">Profondeur maximale des sondages tarière (m)
                     <!----><span class="fr-hint-text">Profondeur maximale atteinte par les sondages tarière</span>
                   </label><input class="fr-input" name="input_547" id="input_547" type="number" min="0">
                   <!---->
@@ -927,7 +927,7 @@
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_234">Profondeur moyenne de sondages tarière (m)
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_234">Profondeur moyenne de sondages tarière (m)
                     <!----><span class="fr-hint-text">Profondeur moyenne atteinte par les sondages tarière</span>
                   </label><input class="fr-input" name="input_234" id="input_234" type="number" min="0">
                   <!---->
@@ -936,7 +936,7 @@
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_280">Longueur sondages tarière (m)
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_280">Longueur sondages tarière (m)
                     <!----><span class="fr-hint-text">Longueur du linéaire de sondages tarière</span>
                   </label><input class="fr-input" name="input_280" id="input_280" type="number" min="0">
                   <!---->
@@ -945,7 +945,7 @@
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_537">Nombre de sondages destructifs
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_537">Nombre de sondages destructifs
                     <!----><span class="fr-hint-text">Nombre de sondages effectués à l'aide d'une destructifs</span>
                   </label><input class="fr-input" name="input_537" id="input_537" type="number" min="0">
                   <!---->
@@ -954,7 +954,7 @@
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_184">Profondeur maximale des sondages destructifs (m)
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_184">Profondeur maximale des sondages destructifs (m)
                     <!----><span class="fr-hint-text">Profondeur maximale atteinte par les sondages destructifs</span>
                   </label><input class="fr-input" name="input_184" id="input_184" type="number" min="0">
                   <!---->
@@ -963,7 +963,7 @@
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_76">Profondeur moyenne de sondages destructifs (m)
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_76">Profondeur moyenne de sondages destructifs (m)
                     <!----><span class="fr-hint-text">Profondeur moyenne atteinte par les sondages destructifs</span>
                   </label><input class="fr-input" name="input_76" id="input_76" type="number" min="0">
                   <!---->
@@ -972,7 +972,7 @@
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_202">Longueur sondages destructifs (m)
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_202">Longueur sondages destructifs (m)
                     <!----><span class="fr-hint-text">Longueur du linéaire de sondages destructifs</span>
                   </label><input class="fr-input" name="input_202" id="input_202" type="number" min="0">
                   <!---->
@@ -981,7 +981,7 @@
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_785">Nombre de sondages carottés
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_785">Nombre de sondages carottés
                     <!----><span class="fr-hint-text">Nombre de sondages effectués à l'aide d'une carottés</span>
                   </label><input class="fr-input" name="input_785" id="input_785" type="number" min="0">
                   <!---->
@@ -990,7 +990,7 @@
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_873">Profondeur maximale des sondages carottés (m)
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_873">Profondeur maximale des sondages carottés (m)
                     <!----><span class="fr-hint-text">Profondeur maximale atteinte par les sondages carottés</span>
                   </label><input class="fr-input" name="input_873" id="input_873" type="number" min="0">
                   <!---->
@@ -999,7 +999,7 @@
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_113">Profondeur moyenne de sondages carottés (m)
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_113">Profondeur moyenne de sondages carottés (m)
                     <!----><span class="fr-hint-text">Profondeur moyenne atteinte par les sondages carottés</span>
                   </label><input class="fr-input" name="input_113" id="input_113" type="number" min="0">
                   <!---->
@@ -1008,7 +1008,7 @@
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_120">Longueur sondages carottés (m)
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_120">Longueur sondages carottés (m)
                     <!----><span class="fr-hint-text">Longueur du linéaire de sondages carottés</span>
                   </label><input class="fr-input" name="input_120" id="input_120" type="number" min="0">
                   <!---->
@@ -1027,7 +1027,7 @@
             <legend class="fr-fieldset__legend" id="Analyses-legend">Analyses</legend>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_645">Nombre d'analyses multi-éléments
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_645">Nombre d'analyses multi-éléments
                     <!----><span class="fr-hint-text">Nombre d'analyses multi-éléments</span>
                   </label><input class="fr-input" name="input_645" id="input_645" type="number" min="0">
                   <!---->
@@ -1156,7 +1156,7 @@
             <legend class="fr-fieldset__legend" id="indicateursFinanciersDepensesTotales-legend">Indicateur financier global</legend>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_694">Dépenses totales de prospection *<span class="fr-hint-text">Montant en euros de l'ensemble des dépenses effectuées au cours de l'année</span></label><input class="fr-input" name="input_694" id="input_694" required="" type="number" min="0">
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_694">Dépenses totales de prospection *<span class="fr-hint-text">Montant en euros de l'ensemble des dépenses effectuées au cours de l'année</span></label><input class="fr-input" name="input_694" id="input_694" required="" type="number" min="0">
                   <!---->
                 </div>
               </div>
@@ -1166,7 +1166,7 @@
             <legend class="fr-fieldset__legend" id="indicateursFinanciersLevesTopographiques-legend">Levés topographiques</legend>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_967">Dépenses de levés topographiques (euros) *<span class="fr-hint-text">Montant en euros des dépenses de levés topographiques au cours de l'année</span></label><input class="fr-input" name="input_967" id="input_967" required="" type="number" min="0">
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_967">Dépenses de levés topographiques (euros) *<span class="fr-hint-text">Montant en euros des dépenses de levés topographiques au cours de l'année</span></label><input class="fr-input" name="input_967" id="input_967" required="" type="number" min="0">
                   <!---->
                 </div>
               </div>
@@ -1176,7 +1176,7 @@
             <legend class="fr-fieldset__legend" id="indicateursFinanciersCartographieGeologique-legend">Cartographie géologique</legend>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_875">Dépenses de cartographie géologique (euros) *<span class="fr-hint-text">Montant en euros des dépenses de cartographie géologique au cours de l'année</span></label><input class="fr-input" name="input_875" id="input_875" required="" type="number" min="0">
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_875">Dépenses de cartographie géologique (euros) *<span class="fr-hint-text">Montant en euros des dépenses de cartographie géologique au cours de l'année</span></label><input class="fr-input" name="input_875" id="input_875" required="" type="number" min="0">
                   <!---->
                 </div>
               </div>
@@ -1186,7 +1186,7 @@
             <legend class="fr-fieldset__legend" id="indicateursFinanciersLevesGeochimie-legend">Levés géochimiques</legend>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_339">Dépenses de levés géochimiques (euros) *<span class="fr-hint-text">Montant en euros des dépenses de levés géochimiques au cours de l'année</span></label><input class="fr-input" name="input_339" id="input_339" required="" type="number" min="0">
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_339">Dépenses de levés géochimiques (euros) *<span class="fr-hint-text">Montant en euros des dépenses de levés géochimiques au cours de l'année</span></label><input class="fr-input" name="input_339" id="input_339" required="" type="number" min="0">
                   <!---->
                 </div>
               </div>
@@ -1196,7 +1196,7 @@
             <legend class="fr-fieldset__legend" id="indicateursFinanciersLevesGeophysique-legend">Levés géophysique</legend>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_179">Dépenses de levés géophysique (euros) *<span class="fr-hint-text">Montant en euros des dépenses de levés géophysique au cours de l'année</span></label><input class="fr-input" name="input_179" id="input_179" required="" type="number" min="0">
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_179">Dépenses de levés géophysique (euros) *<span class="fr-hint-text">Montant en euros des dépenses de levés géophysique au cours de l'année</span></label><input class="fr-input" name="input_179" id="input_179" required="" type="number" min="0">
                   <!---->
                 </div>
               </div>
@@ -1206,7 +1206,7 @@
             <legend class="fr-fieldset__legend" id="indicateursFinanciersLevesTrancheesPuits-legend">Tranchées et puits</legend>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_480">Dépenses de tranchées et puits (euros) *<span class="fr-hint-text">Montant en euros des dépenses de tranchées et puits au cours de l'année</span></label><input class="fr-input" name="input_480" id="input_480" required="" type="number" min="0">
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_480">Dépenses de tranchées et puits (euros) *<span class="fr-hint-text">Montant en euros des dépenses de tranchées et puits au cours de l'année</span></label><input class="fr-input" name="input_480" id="input_480" required="" type="number" min="0">
                   <!---->
                 </div>
               </div>
@@ -1216,21 +1216,21 @@
             <legend class="fr-fieldset__legend" id="indicateursFinanciersSondages-legend">Sondages</legend>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_617">Dépenses de sondages tarières (euros) *<span class="fr-hint-text">Montant en euros des dépenses de sondages tarières au cours de l'année</span></label><input class="fr-input" name="input_617" id="input_617" required="" type="number" min="0">
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_617">Dépenses de sondages tarières (euros) *<span class="fr-hint-text">Montant en euros des dépenses de sondages tarières au cours de l'année</span></label><input class="fr-input" name="input_617" id="input_617" required="" type="number" min="0">
                   <!---->
                 </div>
               </div>
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_877">Dépenses de sondages destructifs (euros) *<span class="fr-hint-text">Montant en euros des dépenses de sondages destructifs au cours de l'année</span></label><input class="fr-input" name="input_877" id="input_877" required="" type="number" min="0">
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_877">Dépenses de sondages destructifs (euros) *<span class="fr-hint-text">Montant en euros des dépenses de sondages destructifs au cours de l'année</span></label><input class="fr-input" name="input_877" id="input_877" required="" type="number" min="0">
                   <!---->
                 </div>
               </div>
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_77">Dépenses de sondages carottés (euros) *<span class="fr-hint-text">Montant en euros des dépenses de sondages carottés au cours de l'année</span></label><input class="fr-input" name="input_77" id="input_77" required="" type="number" min="0">
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_77">Dépenses de sondages carottés (euros) *<span class="fr-hint-text">Montant en euros des dépenses de sondages carottés au cours de l'année</span></label><input class="fr-input" name="input_77" id="input_77" required="" type="number" min="0">
                   <!---->
                 </div>
               </div>
@@ -1240,14 +1240,14 @@
             <legend class="fr-fieldset__legend" id="indicateursFinanciersAnalysesMultiElements-legend">Analyses</legend>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_181">Dépenses d'analyses multi-éléments (euros) *<span class="fr-hint-text">Montant en euros des dépenses d'analyses multi-éléments au cours de l'année</span></label><input class="fr-input" name="input_181" id="input_181" required="" type="number" min="0">
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_181">Dépenses d'analyses multi-éléments (euros) *<span class="fr-hint-text">Montant en euros des dépenses d'analyses multi-éléments au cours de l'année</span></label><input class="fr-input" name="input_181" id="input_181" required="" type="number" min="0">
                   <!---->
                 </div>
               </div>
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_932">Dépenses de traitements minéralurgiques (euros) *<span class="fr-hint-text">Montant en euros des dépenses de traitements minéralurgiques au cours de l'année</span></label><input class="fr-input" name="input_932" id="input_932" required="" type="number" min="0">
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_932">Dépenses de traitements minéralurgiques (euros) *<span class="fr-hint-text">Montant en euros des dépenses de traitements minéralurgiques au cours de l'année</span></label><input class="fr-input" name="input_932" id="input_932" required="" type="number" min="0">
                   <!---->
                 </div>
               </div>
@@ -1257,42 +1257,42 @@
             <legend class="fr-fieldset__legend" id="indicateursFinanciersEtudes-legend">Etudes</legend>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_344">Dépenses d'étude environnementale (euros) *<span class="fr-hint-text">Montant en euros des dépenses d'études environnementales au cours de l'année</span></label><input class="fr-input" name="input_344" id="input_344" required="" type="number" min="0">
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_344">Dépenses d'étude environnementale (euros) *<span class="fr-hint-text">Montant en euros des dépenses d'études environnementales au cours de l'année</span></label><input class="fr-input" name="input_344" id="input_344" required="" type="number" min="0">
                   <!---->
                 </div>
               </div>
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_258">Dépenses d'étude économique préliminaire (euros) *<span class="fr-hint-text">Montant en euros des dépenses d'étude économique préliminaire au cours de l'année</span></label><input class="fr-input" name="input_258" id="input_258" required="" type="number" min="0">
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_258">Dépenses d'étude économique préliminaire (euros) *<span class="fr-hint-text">Montant en euros des dépenses d'étude économique préliminaire au cours de l'année</span></label><input class="fr-input" name="input_258" id="input_258" required="" type="number" min="0">
                   <!---->
                 </div>
               </div>
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_268">Dépenses d'étude économique pré-faisabilité (euros) *<span class="fr-hint-text">Montant en euros des dépenses d'étude économique pré-faisabilité au cours de l'année</span></label><input class="fr-input" name="input_268" id="input_268" required="" type="number" min="0">
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_268">Dépenses d'étude économique pré-faisabilité (euros) *<span class="fr-hint-text">Montant en euros des dépenses d'étude économique pré-faisabilité au cours de l'année</span></label><input class="fr-input" name="input_268" id="input_268" required="" type="number" min="0">
                   <!---->
                 </div>
               </div>
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_886">Dépenses d'étude économique faisabilité (euros) *<span class="fr-hint-text">Montant en euros des dépenses d'étude économique faisabilité au cours de l'année</span></label><input class="fr-input" name="input_886" id="input_886" required="" type="number" min="0">
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_886">Dépenses d'étude économique faisabilité (euros) *<span class="fr-hint-text">Montant en euros des dépenses d'étude économique faisabilité au cours de l'année</span></label><input class="fr-input" name="input_886" id="input_886" required="" type="number" min="0">
                   <!---->
                 </div>
               </div>
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_776">Dépenses d'étude sociale (euros) *<span class="fr-hint-text">Montant en euros des dépenses d'étude environnementales au cours de l'année</span></label><input class="fr-input" name="input_776" id="input_776" required="" type="number" min="0">
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_776">Dépenses d'étude sociale (euros) *<span class="fr-hint-text">Montant en euros des dépenses d'étude environnementales au cours de l'année</span></label><input class="fr-input" name="input_776" id="input_776" required="" type="number" min="0">
                   <!---->
                 </div>
               </div>
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_647">Dépenses d'études autres (euros) *<span class="fr-hint-text">Montant en euros des dépenses d'études autres au cours de l'année</span></label><input class="fr-input" name="input_647" id="input_647" required="" type="number" min="0">
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_647">Dépenses d'études autres (euros) *<span class="fr-hint-text">Montant en euros des dépenses d'études autres au cours de l'année</span></label><input class="fr-input" name="input_647" id="input_647" required="" type="number" min="0">
                   <!---->
                 </div>
               </div>
@@ -1302,7 +1302,7 @@
             <legend class="fr-fieldset__legend" id="indicateursFinanciersEnvironnement-legend">Environnement</legend>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_575">Dépenses relatives à la protection de l’environnement (euros) *<span class="fr-hint-text">Montant en euros des investissements consentis au cours de l'année listés à l’<a href="https://www.legifrance.gouv.fr/affichCodeArticle.do?idArticle=LEGIARTI000021850940&amp;cidTexte=LEGITEXT000006069569" target="_blank" title="Page de l’article - site externe" rel="noopener noreferrer">article 318 C de l’annexe II du code général des impôts</a>. Afin de bénéficier des déductions fiscales afférentes, les justificatifs attestant de la réalisation effective des investissements sont susceptibles de vous être demandés par l’administration.</span></label><input class="fr-input" name="input_575" id="input_575" required="" type="number" min="0">
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_575">Dépenses relatives à la protection de l’environnement (euros) *<span class="fr-hint-text">Montant en euros des investissements consentis au cours de l'année listés à l’<a href="https://www.legifrance.gouv.fr/affichCodeArticle.do?idArticle=LEGIARTI000021850940&amp;cidTexte=LEGITEXT000006069569" target="_blank" title="Page de l’article - site externe" rel="noopener noreferrer">article 318 C de l’annexe II du code général des impôts</a>. Afin de bénéficier des déductions fiscales afférentes, les justificatifs attestant de la réalisation effective des investissements sont susceptibles de vous être demandés par l’administration.</span></label><input class="fr-input" name="input_575" id="input_575" required="" type="number" min="0">
                   <!---->
                 </div>
               </div>
@@ -1312,7 +1312,7 @@
             <legend class="fr-fieldset__legend" id="indicateursFinanciersCommunication-legend">Communication</legend>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_817">Dépenses de communication et d'information du public (euros) *<span class="fr-hint-text">Montant en euros des dépenses de communication et frais d'organisation de réunions publiques au cours de l'année</span></label><input class="fr-input" name="input_817" id="input_817" required="" type="number" min="0">
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_817">Dépenses de communication et d'information du public (euros) *<span class="fr-hint-text">Montant en euros des dépenses de communication et frais d'organisation de réunions publiques au cours de l'année</span></label><input class="fr-input" name="input_817" id="input_817" required="" type="number" min="0">
                   <!---->
                 </div>
               </div>
@@ -1322,7 +1322,7 @@
             <legend class="fr-fieldset__legend" id="complementFinancier-legend">Informations complémentaires</legend>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_185">Autres dépenses (euros) *<span class="fr-hint-text">Montant en euros des autres dépenses au cours de l'année</span></label><input class="fr-input" name="input_185" id="input_185" required="" type="number" min="0">
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_185">Autres dépenses (euros) *<span class="fr-hint-text">Montant en euros des autres dépenses au cours de l'année</span></label><input class="fr-input" name="input_185" id="input_185" required="" type="number" min="0">
                   <!---->
                 </div>
               </div>
@@ -1346,42 +1346,42 @@
             <legend class="fr-fieldset__legend" id="indicateursEnvironnement-legend">Indicateurs environnementaux</legend>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_573">Carburant détaxé (l) *<span class="fr-hint-text">Volume total en litre de carburant détaxé consommé au cours de l'année par les travaux réalisés sur le chantier.</span></label><input class="fr-input" name="input_573" id="input_573" required="" type="number" min="0">
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_573">Carburant détaxé (l) *<span class="fr-hint-text">Volume total en litre de carburant détaxé consommé au cours de l'année par les travaux réalisés sur le chantier.</span></label><input class="fr-input" name="input_573" id="input_573" required="" type="number" min="0">
                   <!---->
                 </div>
               </div>
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_486">Carburant conventionnel (l) *<span class="fr-hint-text">Volume total en litre de carburant conventionnel consommé au cours de l'année par les travaux réalisés sur le chantier.</span></label><input class="fr-input" name="input_486" id="input_486" required="" type="number" min="0">
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_486">Carburant conventionnel (l) *<span class="fr-hint-text">Volume total en litre de carburant conventionnel consommé au cours de l'année par les travaux réalisés sur le chantier.</span></label><input class="fr-input" name="input_486" id="input_486" required="" type="number" min="0">
                   <!---->
                 </div>
               </div>
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_44">Pompes actives *<span class="fr-hint-text"><b>Dans le cas d'un chantier alluvionnaire</b>, nombre d'heure de fonctionnement de pompes au cours de l'année sur le chantier (pompe à gravier, pompe de relevage…).</span></label><input class="fr-input" name="input_44" id="input_44" required="" type="number" min="0">
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_44">Pompes actives *<span class="fr-hint-text"><b>Dans le cas d'un chantier alluvionnaire</b>, nombre d'heure de fonctionnement de pompes au cours de l'année sur le chantier (pompe à gravier, pompe de relevage…).</span></label><input class="fr-input" name="input_44" id="input_44" required="" type="number" min="0">
                   <!---->
                 </div>
               </div>
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_181">Pelles actives *<span class="fr-hint-text"><b>Dans le cas d'un chantier alluvionnaire</b>, nombre d'heure de fonctionnement de pelles mécaniques au cours de l'année sur le chantier (aménagement, exploitation, réhabilitation).</span></label><input class="fr-input" name="input_181" id="input_181" required="" type="number" min="0">
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_181">Pelles actives *<span class="fr-hint-text"><b>Dans le cas d'un chantier alluvionnaire</b>, nombre d'heure de fonctionnement de pelles mécaniques au cours de l'année sur le chantier (aménagement, exploitation, réhabilitation).</span></label><input class="fr-input" name="input_181" id="input_181" required="" type="number" min="0">
                   <!---->
                 </div>
               </div>
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_804">Mercure récupéré (g) *<span class="fr-hint-text"><b>En Guyane</b>, masse en gramme de l’ensemble des produits contaminés au mercure envoyés en traitement au cours de l'année.</span></label><input class="fr-input" name="input_804" id="input_804" required="" type="number" min="0">
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_804">Mercure récupéré (g) *<span class="fr-hint-text"><b>En Guyane</b>, masse en gramme de l’ensemble des produits contaminés au mercure envoyés en traitement au cours de l'année.</span></label><input class="fr-input" name="input_804" id="input_804" required="" type="number" min="0">
                   <!---->
                 </div>
               </div>
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_353">Surface déforestée (km²) *<span class="fr-hint-text">Surface déforestée en kilomètre carré au cours de l'année.</span></label><input class="fr-input" name="input_353" id="input_353" required="" type="number" min="0">
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_353">Surface déforestée (km²) *<span class="fr-hint-text">Surface déforestée en kilomètre carré au cours de l'année.</span></label><input class="fr-input" name="input_353" id="input_353" required="" type="number" min="0">
                   <!---->
                 </div>
               </div>
@@ -1408,42 +1408,42 @@
             <legend class="fr-fieldset__legend" id="indicateursSocialEconomiqueDirect-legend">Indicateurs sociaux et économiques sur les emplois directs</legend>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_21">Emplois directs salariés *<span class="fr-hint-text">Nombre total de salariés de l'entreprise affectés aux activités sur le titre minier.</span></label><input class="fr-input" name="input_21" id="input_21" required="" type="number" min="0">
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_21">Emplois directs salariés *<span class="fr-hint-text">Nombre total de salariés de l'entreprise affectés aux activités sur le titre minier.</span></label><input class="fr-input" name="input_21" id="input_21" required="" type="number" min="0">
                   <!---->
                 </div>
               </div>
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_478">Equivalents temps plein salariés *<span class="fr-hint-text">Nombre total d'équivalents temps plein salariés de l'entreprise affectés aux activités sur le titre minier.</span></label><input class="fr-input" name="input_478" id="input_478" required="" type="number" min="0">
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_478">Equivalents temps plein salariés *<span class="fr-hint-text">Nombre total d'équivalents temps plein salariés de l'entreprise affectés aux activités sur le titre minier.</span></label><input class="fr-input" name="input_478" id="input_478" required="" type="number" min="0">
                   <!---->
                 </div>
               </div>
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_959">Emplois directs salariés occupés par des résidents du département *<span class="fr-hint-text">Nombre de salariés de l'entreprise, <b>français ou étrangers, résidant fiscalement dans le département</b>, affectés aux activités sur le titre minier.</span></label><input class="fr-input" name="input_959" id="input_959" required="" type="number" min="0">
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_959">Emplois directs salariés occupés par des résidents du département *<span class="fr-hint-text">Nombre de salariés de l'entreprise, <b>français ou étrangers, résidant fiscalement dans le département</b>, affectés aux activités sur le titre minier.</span></label><input class="fr-input" name="input_959" id="input_959" required="" type="number" min="0">
                   <!---->
                 </div>
               </div>
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_112">Equivalents temps plein salariés occupés par des résidents du département *<span class="fr-hint-text">Nombre d'équivalents temps plein salariés de l'entreprise, occupés par des <b>français ou étrangers, résidant fiscalement dans le département</b>, affectés aux activités sur le titre minier.</span></label><input class="fr-input" name="input_112" id="input_112" required="" type="number" min="0">
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_112">Equivalents temps plein salariés occupés par des résidents du département *<span class="fr-hint-text">Nombre d'équivalents temps plein salariés de l'entreprise, occupés par des <b>français ou étrangers, résidant fiscalement dans le département</b>, affectés aux activités sur le titre minier.</span></label><input class="fr-input" name="input_112" id="input_112" required="" type="number" min="0">
                   <!---->
                 </div>
               </div>
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_152">Emplois directs salariés de nationalité française *<span class="fr-hint-text">Nombre d'employés de <b>nationalité française</b> salariés de l'entreprise affectés aux activités sur le titre minier.</span></label><input class="fr-input" name="input_152" id="input_152" required="" type="number" min="0">
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_152">Emplois directs salariés de nationalité française *<span class="fr-hint-text">Nombre d'employés de <b>nationalité française</b> salariés de l'entreprise affectés aux activités sur le titre minier.</span></label><input class="fr-input" name="input_152" id="input_152" required="" type="number" min="0">
                   <!---->
                 </div>
               </div>
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_132">Equivalents temps plein salariés de nationalité française *<span class="fr-hint-text">Nombre d'équivalents temps plein salariés de l'entreprise occupés par des personnes de <b>nationalité française</b> affectés aux activités sur le titre minier.</span></label><input class="fr-input" name="input_132" id="input_132" required="" type="number" min="0">
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_132">Equivalents temps plein salariés de nationalité française *<span class="fr-hint-text">Nombre d'équivalents temps plein salariés de l'entreprise occupés par des personnes de <b>nationalité française</b> affectés aux activités sur le titre minier.</span></label><input class="fr-input" name="input_132" id="input_132" required="" type="number" min="0">
                   <!---->
                 </div>
               </div>
@@ -1453,42 +1453,42 @@
             <legend class="fr-fieldset__legend" id="indicateursSocialEconomiqueInirects-legend">Indicateurs sociaux et économiques sur la sous-traitance</legend>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_965">Emplois salariés des sous-traitants *<span class="fr-hint-text">Nombre total d'emplois salariés des sous-traitants et prestataires affectés aux activités sur le titre minier.</span></label><input class="fr-input" name="input_965" id="input_965" required="" type="number" min="0">
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_965">Emplois salariés des sous-traitants *<span class="fr-hint-text">Nombre total d'emplois salariés des sous-traitants et prestataires affectés aux activités sur le titre minier.</span></label><input class="fr-input" name="input_965" id="input_965" required="" type="number" min="0">
                   <!---->
                 </div>
               </div>
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_130">Equivalents temps plein salariés des sous-traitants *<span class="fr-hint-text">Nombre total d'équivalents temps plein salariés des sous-traitants et prestataires, affectés aux activités sur le titre minier.</span></label><input class="fr-input" name="input_130" id="input_130" required="" type="number" min="0">
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_130">Equivalents temps plein salariés des sous-traitants *<span class="fr-hint-text">Nombre total d'équivalents temps plein salariés des sous-traitants et prestataires, affectés aux activités sur le titre minier.</span></label><input class="fr-input" name="input_130" id="input_130" required="" type="number" min="0">
                   <!---->
                 </div>
               </div>
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_595">Emplois salariés résidents du département des sous-traitants *<span class="fr-hint-text">Nombre de salariés des sous-traitants et prestataires, <b>résidant fiscalement dans le département</b>, affectés aux activités sur le titre minier.</span></label><input class="fr-input" name="input_595" id="input_595" required="" type="number" min="0">
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_595">Emplois salariés résidents du département des sous-traitants *<span class="fr-hint-text">Nombre de salariés des sous-traitants et prestataires, <b>résidant fiscalement dans le département</b>, affectés aux activités sur le titre minier.</span></label><input class="fr-input" name="input_595" id="input_595" required="" type="number" min="0">
                   <!---->
                 </div>
               </div>
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_908">Equivalents temps plein des salariés des sous-traitants résidents du département *<span class="fr-hint-text">Nombre d'équivalents temps plein des sous-traitants et prestataires, <b>résidant fiscalement dans le département</b>, affectés aux activités sur le titre minier.</span></label><input class="fr-input" name="input_908" id="input_908" required="" type="number" min="0">
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_908">Equivalents temps plein des salariés des sous-traitants résidents du département *<span class="fr-hint-text">Nombre d'équivalents temps plein des sous-traitants et prestataires, <b>résidant fiscalement dans le département</b>, affectés aux activités sur le titre minier.</span></label><input class="fr-input" name="input_908" id="input_908" required="" type="number" min="0">
                   <!---->
                 </div>
               </div>
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_301">Emplois salariés de nationalité française des sous-traitants *<span class="fr-hint-text">Nombre d'employés de <b>nationalité française</b> salariés des sous-traitants et prestataires de l'entreprise, affectés aux activités sur le titre minier.</span></label><input class="fr-input" name="input_301" id="input_301" required="" type="number" min="0">
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_301">Emplois salariés de nationalité française des sous-traitants *<span class="fr-hint-text">Nombre d'employés de <b>nationalité française</b> salariés des sous-traitants et prestataires de l'entreprise, affectés aux activités sur le titre minier.</span></label><input class="fr-input" name="input_301" id="input_301" required="" type="number" min="0">
                   <!---->
                 </div>
               </div>
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_377">Equivalents temps plein salariés de nationalité française des sous-traitants *<span class="fr-hint-text">Nombre d'équivalents temps plein occupés par des personnes de <b>nationalité française</b> salariées des sous-traitants et prestataires de l'entreprise, affectées aux activités sur le titre minier.</span></label><input class="fr-input" name="input_377" id="input_377" required="" type="number" min="0">
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_377">Equivalents temps plein salariés de nationalité française des sous-traitants *<span class="fr-hint-text">Nombre d'équivalents temps plein occupés par des personnes de <b>nationalité française</b> salariées des sous-traitants et prestataires de l'entreprise, affectées aux activités sur le titre minier.</span></label><input class="fr-input" name="input_377" id="input_377" required="" type="number" min="0">
                   <!---->
                 </div>
               </div>
@@ -1498,21 +1498,21 @@
             <legend class="fr-fieldset__legend" id="indicateursConcertationAcceptabilite-legend">Indicateurs de concertation et d'acceptabilité du projet</legend>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_266">Réunions publiques *<span class="fr-hint-text">Nombre de réunions publiques consacrées aux projets sur le titre minier organisées au cours de l'année</span></label><input class="fr-input" name="input_266" id="input_266" required="" type="number" min="0">
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_266">Réunions publiques *<span class="fr-hint-text">Nombre de réunions publiques consacrées aux projets sur le titre minier organisées au cours de l'année</span></label><input class="fr-input" name="input_266" id="input_266" required="" type="number" min="0">
                   <!---->
                 </div>
               </div>
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_940">Rendez-vous *<span class="fr-hint-text">Nombre de rendez-vous avec les parties prenantes concernées par le titre minier organisés au cours de l'année</span></label><input class="fr-input" name="input_940" id="input_940" required="" type="number" min="0">
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_940">Rendez-vous *<span class="fr-hint-text">Nombre de rendez-vous avec les parties prenantes concernées par le titre minier organisés au cours de l'année</span></label><input class="fr-input" name="input_940" id="input_940" required="" type="number" min="0">
                   <!---->
                 </div>
               </div>
             </div>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_966">Actions de communication à destination du public *<span class="fr-hint-text">Nombre d'actions de communication menées par le titulaire du titre à destination du public (hors publication et communication à destination des marchés) au cours de l'année</span></label><input class="fr-input" name="input_966" id="input_966" required="" type="number" min="0">
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_966">Actions de communication à destination du public *<span class="fr-hint-text">Nombre d'actions de communication menées par le titulaire du titre à destination du public (hors publication et communication à destination des marchés) au cours de l'année</span></label><input class="fr-input" name="input_966" id="input_966" required="" type="number" min="0">
                   <!---->
                 </div>
               </div>
@@ -1539,7 +1539,7 @@
             <legend class="fr-fieldset__legend" id="renseignementsProduction-legend">Production annuelle</legend>
             <div class="fr-fieldset__element">
               <div>
-                <div class="fr-input-group"><label class="fr-label" for="input_658">Volume de granulats marins extrait (m3) *<span class="fr-hint-text">Volume de granulats marins extrait, en mètre cube, au cours de l'année.</span></label><input class="fr-input" name="input_658" id="input_658" required="" type="number" min="0">
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_658">Volume de granulats marins extrait (m3) *<span class="fr-hint-text">Volume de granulats marins extrait, en mètre cube, au cours de l'année.</span></label><input class="fr-input" name="input_658" id="input_658" required="" type="number" min="0">
                   <!---->
                 </div>
               </div>
diff --git a/packages/ui/src/components/_common/new-sections-edit.stories_snapshots_VolumeGranulatsExtrait.html b/packages/ui/src/components/_common/new-sections-edit.stories_snapshots_VolumeGranulatsExtrait.html
index ed89d31523b563b9ad17f79bbead1c169949a1e7..fbe100be68e17ffa951403a4186e72dc9064d35c 100644
--- a/packages/ui/src/components/_common/new-sections-edit.stories_snapshots_VolumeGranulatsExtrait.html
+++ b/packages/ui/src/components/_common/new-sections-edit.stories_snapshots_VolumeGranulatsExtrait.html
@@ -4,7 +4,7 @@
       <!---->
       <div class="fr-fieldset__element">
         <div>
-          <div class="fr-input-group"><label class="fr-label" for="input_271">Volume de granulats marins extrait (m3) *<span class="fr-hint-text">Volume de granulats marins extrait, en mètre cube, au cours de l'année.</span></label><input class="fr-input" name="input_271" id="input_271" required="" type="number" min="0" aria-describedby="input_271-info">
+          <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_271">Volume de granulats marins extrait (m3) *<span class="fr-hint-text">Volume de granulats marins extrait, en mètre cube, au cours de l'année.</span></label><input class="fr-input" name="input_271" id="input_271" required="" type="number" min="0" aria-describedby="input_271-info">
             <p id="input_271-info" class="fr-info-text">Soit l’équivalent de 18 tonnes</p>
           </div>
         </div>
diff --git a/packages/ui/src/components/_common/new-sections-edit.tsx b/packages/ui/src/components/_common/new-sections-edit.tsx
index 13a2485a6a6acf90bc94a3bfa10c10aaca1ec8a4..1af5966d6a183c7c6622b9736cc466fe65088ad6 100644
--- a/packages/ui/src/components/_common/new-sections-edit.tsx
+++ b/packages/ui/src/components/_common/new-sections-edit.tsx
@@ -1,8 +1,7 @@
-import { computed, defineComponent, ref, watch } from 'vue'
-import { ElementWithValue, isNumberElement, SectionWithValue } from 'camino-common/src/sections'
-import { exhaustiveCheck, isNonEmptyArray } from 'camino-common/src/typescript-tools'
+import { computed, defineComponent, ref, watch, DeepReadonly } from 'vue'
+import { ElementWithValue, isNumberElement, isRadioElement, SectionWithValue } from 'camino-common/src/sections'
+import { exhaustiveCheck, isNonEmptyArray, isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty, isNullOrUndefined } from 'camino-common/src/typescript-tools'
 import { numberFormat } from 'camino-common/src/number'
-import { InputDate } from '../_ui/dsfr-input-date'
 import { sectionElementWithValueCompleteValidate, sectionsWithValueCompleteValidate } from 'camino-common/src/permissions/sections'
 import { DsfrInput } from '../_ui/dsfr-input'
 import { DsfrTextarea } from '../_ui/dsfr-textarea'
@@ -11,43 +10,54 @@ import { DsfrInputCheckboxes } from '../_ui/dsfr-input-checkboxes'
 import { capitalize } from 'camino-common/src/strings'
 import { DsfrInputRadio } from '../_ui/dsfr-input-radio'
 import { DsfrSelect } from '../_ui/dsfr-select'
+import { useState } from '../../utils/vue-tsx-utils'
+import { CaminoDate } from 'camino-common/src/date'
 
 interface Props {
-  sectionsWithValue: SectionWithValue[]
-  completeUpdate: (complete: boolean, newContenu: SectionWithValue[]) => void
+  sectionsWithValue: DeepReadonly<SectionWithValue[]>
+  completeUpdate: (complete: boolean, newContenu: Props['sectionsWithValue']) => void
 }
 
 export const SectionsEdit = defineComponent<Props>(props => {
-  const sectionsWithValue = ref<SectionWithValue[]>([])
+  const [sectionsWithValue, setSectionsWithValue] = useState<DeepReadonly<SectionWithValue[]>>([])
 
   watch(
     () => props.sectionsWithValue,
     () => {
-      sectionsWithValue.value = [...props.sectionsWithValue]
+      setSectionsWithValue([...props.sectionsWithValue])
       props.completeUpdate(sectionsWithValueCompleteValidate(props.sectionsWithValue).length === 0, props.sectionsWithValue)
     },
     { immediate: true }
   )
 
-  const onValueChange = (elementIndex: number, sectionIndex: number) => (elementWithValue: ElementWithValue) => {
-    const newSection = { ...sectionsWithValue.value[sectionIndex] }
-
-    newSection.elements = [...newSection.elements]
-    newSection.elements.splice(elementIndex, 1, elementWithValue)
-
-    const newSectionsWithValue: SectionWithValue[] = [...sectionsWithValue.value]
-    newSectionsWithValue.splice(sectionIndex, 1, newSection)
+  const onValueChange = (elementIndex: number, sectionIndex: number) => (elementWithValue: DeepReadonly<ElementWithValue>) => {
+    const newSectionsWithValue: DeepReadonly<SectionWithValue[]> = sectionsWithValue.value.map((section, index) => {
+      if (index === sectionIndex) {
+        return {
+          ...section,
+          elements: section.elements.map((element, oldElementIndex) => {
+            if (oldElementIndex === elementIndex) {
+              return elementWithValue
+            } else {
+              return element
+            }
+          }),
+        }
+      } else {
+        return section
+      }
+    })
+    setSectionsWithValue(newSectionsWithValue)
 
     const complete: boolean = sectionsWithValueCompleteValidate(newSectionsWithValue).length === 0
-    sectionsWithValue.value = newSectionsWithValue
     props.completeUpdate(complete, newSectionsWithValue)
   }
 
   return () => (
     <div>
       {sectionsWithValue.value.map((sectionWithValue, sectionIndex) => (
-        <fieldset key={sectionWithValue.id} class="fr-fieldset" aria-labelledby={sectionWithValue.nom ? `${sectionWithValue.id}-legend` : undefined}>
-          {sectionWithValue.nom ? (
+        <fieldset key={sectionWithValue.id} class="fr-fieldset" aria-labelledby={isNotNullNorUndefinedNorEmpty(sectionWithValue.nom) ? `${sectionWithValue.id}-legend` : undefined}>
+          {isNotNullNorUndefinedNorEmpty(sectionWithValue.nom) ? (
             <legend class="fr-fieldset__legend" id={`${sectionWithValue.id}-legend`}>
               {sectionWithValue.nom}
             </legend>
@@ -67,21 +77,21 @@ export const SectionsEdit = defineComponent<Props>(props => {
 SectionsEdit.props = ['sectionsWithValue', 'completeUpdate']
 
 interface SectionElementEditProps {
-  element: ElementWithValue
-  onValueChange: (value: ElementWithValue) => void
+  element: DeepReadonly<ElementWithValue>
+  onValueChange: (value: SectionElementEditProps['element']) => void
 }
-const SectionElementEdit = defineComponent<SectionElementEditProps>(props => {
+export const SectionElementEdit = defineComponent<SectionElementEditProps>(props => {
   let sectionElementEditInput: JSX.Element | null = null
 
   const complete = ref<boolean>(sectionElementWithValueCompleteValidate(props.element))
 
-  const onValueChange = (value: ElementWithValue) => {
+  const onValueChange = (value: DeepReadonly<ElementWithValue>) => {
     complete.value = sectionElementWithValueCompleteValidate(value)
     props.onValueChange(value)
   }
 
   const info = computed<string>(() => {
-    return element.id === 'volumeGranulatsExtrait' && element.value && isNumberElement(element) ? `Soit l’équivalent de ${numberFormat((element.value ?? 0) * 1.5)} tonnes` : ''
+    return element.id === 'volumeGranulatsExtrait' && isNumberElement(element) && isNotNullNorUndefined(element.value) ? `Soit l’équivalent de ${numberFormat(element.value * 1.5)} tonnes` : ''
   })
 
   const required = !(props.element.optionnel ?? false)
@@ -101,10 +111,11 @@ const SectionElementEdit = defineComponent<SectionElementEditProps>(props => {
       break
     case 'date':
       sectionElementEditInput = (
-        <InputDate
+        <DsfrInput
+          type={{ type: 'date' }}
           required={required}
           initialValue={element.value}
-          dateChanged={date => {
+          valueChanged={(date: CaminoDate | null) => {
             onValueChange({ ...element, value: date })
           }}
           legend={{ main: element.nom ?? '', description: element.description }}
@@ -145,7 +156,7 @@ const SectionElementEdit = defineComponent<SectionElementEditProps>(props => {
             { legend: { main: 'Oui' }, itemId: 'oui' },
             { legend: { main: 'Non' }, itemId: 'non' },
           ]}
-          initialValue={props.element.value === null ? null : props.element.value ? 'oui' : 'non'}
+          initialValue={isNullOrUndefined(props.element.value) || !isRadioElement(props.element) ? null : props.element.value ? 'oui' : 'non'}
         />
       )
       break
@@ -184,11 +195,7 @@ const SectionElementEdit = defineComponent<SectionElementEditProps>(props => {
 
       break
     }
-    case 'file':
-      // TODO 2023-09-12 non géré car pas appelé dans les étapes encore
-      // Le jour où on migre les étapes pour appeler ce code, il faut réfléchir à comment gérer le fichier
-      throw new Error('NOT YET IMPLEMENTED')
-    // break
+
     default:
       exhaustiveCheck(element)
   }
diff --git a/packages/ui/src/components/_common/section-element-edit.vue b/packages/ui/src/components/_common/section-element-edit.vue
deleted file mode 100644
index 38e6a4b8eb9a31a02be68255b37ac09d7a9873cf..0000000000000000000000000000000000000000
--- a/packages/ui/src/components/_common/section-element-edit.vue
+++ /dev/null
@@ -1,57 +0,0 @@
-<template>
-  <div>
-    <div class="tablet-blobs">
-      <div v-if="element.nom" class="tablet-blob-1-3 tablet-pt-s pb-s">
-        <h5 class="mb-0">
-          <span class="cap-first">{{ element.nom }}</span>
-        </h5>
-        <p v-if="element.optionnel" class="h6 italic mb-0">Optionnel</p>
-        <Tag v-else-if="!complete" color="bg-warning" :mini="true" text="Incomplet" />
-      </div>
-
-      <div
-        :class="{
-          'tablet-blob-2-3': element.nom,
-          'tablet-blob-1': !element.nom,
-        }"
-      >
-        <SectionElementEdit :contenu="contenu" class="mb-s" :element="element" @update:contenu="newValue => $emit('update:contenu', newValue)" />
-
-        <!-- eslint-disable vue/no-v-html -->
-        <p v-if="element.description || hasValeur" class="h6" v-html="element.description" />
-      </div>
-    </div>
-
-    <hr />
-  </div>
-</template>
-
-<script>
-import { valeurFind, hasValeurCheck, elementsCompleteCheck } from '../../utils/contenu'
-import SectionElementEdit from './section-element-input-edit.vue'
-import { Tag } from '../_ui/tag'
-
-export default {
-  components: { SectionElementEdit, Tag },
-
-  props: {
-    contenu: { type: Object, required: true },
-    element: { type: Object, required: true },
-  },
-  emits: ['update:contenu'],
-
-  computed: {
-    hasValeur() {
-      return hasValeurCheck(this.element.id, this.contenu)
-    },
-
-    valeur() {
-      return valeurFind(this.element, this.contenu)
-    },
-
-    complete() {
-      return elementsCompleteCheck([this.element], this.contenu, true)
-    },
-  },
-}
-</script>
diff --git a/packages/ui/src/components/_common/section-element-file-edit.vue b/packages/ui/src/components/_common/section-element-file-edit.vue
deleted file mode 100644
index f2d057f039e357a5b2bbf47190233dd28e570954..0000000000000000000000000000000000000000
--- a/packages/ui/src/components/_common/section-element-file-edit.vue
+++ /dev/null
@@ -1,49 +0,0 @@
-<template>
-  <div v-if="contenuElement" class="flex">
-    <p class="mb-0 h6 bold">
-      {{ contenuElement && contenuElement.name ? contenuElement.name : contenuElement.slice(5) }}
-    </p>
-    <div class="flex-right mt--xs">
-      <ButtonIcon class="btn-border py-s px-m my--xs rnd-xs flex-right" :onClick="fileRemove" title="Supprimer le fichier" icon="delete" />
-    </div>
-  </div>
-  <div v-else class="dsfr">
-    <InputFile class="btn-border small p-s full-x rnd-xs mb-s" :accept="documents" :uploadFile="fileChange" />
-  </div>
-</template>
-
-<script>
-import { InputFile } from '../_ui/dsfr-input-file'
-import { ButtonIcon } from '@/components/_ui/button-icon'
-
-export default {
-  components: { InputFile, ButtonIcon },
-
-  props: {
-    contenu: { type: [Object], required: true },
-    elementId: { type: String, required: true },
-  },
-  data: function () {
-    return {
-      documents: ['pdf'],
-    }
-  },
-
-  computed: {
-    contenuElement() {
-      return this.contenu[this.elementId]
-    },
-  },
-
-  methods: {
-    fileChange(file) {
-      if (file) {
-        this.contenu[this.elementId] = file
-      }
-    },
-    fileRemove() {
-      this.contenu[this.elementId] = null
-    },
-  },
-}
-</script>
diff --git a/packages/ui/src/components/_common/section-element-input-edit.vue b/packages/ui/src/components/_common/section-element-input-edit.vue
deleted file mode 100644
index 126d6975509d329ca77b9a6bc6cf3414e635b5b0..0000000000000000000000000000000000000000
--- a/packages/ui/src/components/_common/section-element-input-edit.vue
+++ /dev/null
@@ -1,105 +0,0 @@
-<template>
-  <div class="flex flex-direction-column">
-    <inputNumber v-if="element.type === 'number'" :initialValue="contenu[element.id]" class="p-s" placeholder="…" :numberChanged="numberChanged" />
-
-    <inputNumber v-if="element.type === 'integer'" :initialValue="contenu[element.id]" :integer="true" class="p-s" placeholder="…" :numberChanged="numberChanged" />
-
-    <div v-if="element.id === 'volumeGranulatsExtrait' && contenu[element.id]" class="flex-self-end pt-xxs">Soit l’équivalent de {{ masseGranulatsExtraitValeur }} tonnes</div>
-
-    <InputDate v-else-if="element.type === 'date'" :initialValue="contenu[element.id]" :dateChanged="dateChanged" />
-
-    <textarea v-else-if="element.type === 'textarea'" v-model="contenu[element.id]" class="p-s" />
-
-    <input v-else-if="element.type === 'text' || element.type === 'url'" v-model="contenu[element.id]" type="text" class="p-s" />
-
-    <div v-else-if="element.type === 'radio'">
-      <label class="mr">
-        <input v-model="contenu[element.id]" :name="element.id" :value="true" type="radio" class="p-s mt-s mb-s" />
-        Oui
-      </label>
-
-      <label>
-        <input v-model="contenu[element.id]" :name="element.id" :value="false" type="radio" class="p-s mt-s mb-s" />
-        Non
-      </label>
-    </div>
-
-    <input v-else-if="element.type === 'checkbox'" v-model="contenu[element.id]" type="checkbox" class="p-s mt-s mb-s" />
-
-    <div v-else-if="element.type === 'checkboxes'">
-      <div v-for="value in valeurs" :key="value.id">
-        <label>
-          <input v-model="contenu[element.id]" type="checkbox" :value="value.id" class="mr-s" />
-          <span class="cap-first">{{ value.nom }}</span>
-        </label>
-      </div>
-    </div>
-
-    <div v-else-if="element.type === 'select'">
-      <select v-if="valeurs && valeurs.length" v-model="contenu[element.id]" class="p-s mr-s">
-        <option v-for="value in valeurs" :key="value.id" :value="value.id">
-          {{ value.nom }}
-        </option>
-      </select>
-    </div>
-
-    <div v-else-if="element.type === 'file'">
-      <SectionElementFileEdit :contenu="contenu" :elementId="element.id" @update:contenu="newValue => emits('update:contenu', newValue)" />
-    </div>
-  </div>
-</template>
-
-<script>
-import { InputDate } from '../_ui/input-date'
-import { InputNumber } from '../_ui/input-number'
-import SectionElementFileEdit from './section-element-file-edit.vue'
-import { numberFormat } from 'camino-common/src/number'
-
-export default {
-  components: {
-    InputDate,
-    InputNumber,
-    SectionElementFileEdit,
-  },
-
-  props: {
-    contenu: { type: Object, required: true },
-    element: { type: Object, required: true },
-  },
-
-  emits: ['update:contenu'],
-
-  computed: {
-    valeurs() {
-      return this.element.options
-    },
-
-    masseGranulatsExtraitValeur() {
-      return numberFormat(this.contenu[this.element.id] * 1.5)
-    },
-  },
-
-  created() {
-    // si l'élément est un bouton radio
-    // et que le contenu pour cet élément est vide
-    // alors on met la valeur par défaut `false`
-    if (this.contenu && this.contenu[this.element.id] === undefined) {
-      if (this.element.type === 'radio') {
-        this.contenu[this.element.id] = false
-      } else if (this.element.type === 'multiple') {
-        this.contenu[this.element.id] = []
-      }
-    }
-    this.$emit('update:contenu', this.contenu)
-  },
-
-  methods: {
-    dateChanged(date) {
-      this.contenu[this.element.id] = date
-    },
-    numberChanged(value) {
-      this.contenu[this.element.id] = value
-    },
-  },
-}
-</script>
diff --git a/packages/ui/src/components/_common/sections-edit.vue b/packages/ui/src/components/_common/sections-edit.vue
deleted file mode 100644
index 0ccc924838424b65cc07b1d17574b1f97f9e9cd8..0000000000000000000000000000000000000000
--- a/packages/ui/src/components/_common/sections-edit.vue
+++ /dev/null
@@ -1,56 +0,0 @@
-<template>
-  <div>
-    <div v-for="s in sections" :key="s.id">
-      <h3 v-if="s.nom" class="cap-first">{{ s.nom }}</h3>
-
-      <SectionElementEdit v-for="e in s.elements" :key="e.id" v-model:contenu="content[s.id]" :element="e" />
-    </div>
-  </div>
-</template>
-
-<script>
-import { elementContenuBuild, contenuBuild, contenuCompleteCheck } from '../../utils/contenu'
-
-import SectionElementEdit from './section-element-edit.vue'
-
-export default {
-  components: { SectionElementEdit },
-
-  props: {
-    sections: { type: Array, required: true },
-    contenu: { type: [Object, null], required: true },
-  },
-
-  emits: ['complete-update', 'contenu-update'],
-
-  data() {
-    return {
-      content: {},
-    }
-  },
-
-  computed: {
-    complete() {
-      return contenuCompleteCheck(this.sections, this.content)
-    },
-  },
-
-  watch: {
-    content: {
-      handler: function (content) {
-        this.$emit('contenu-update', elementContenuBuild(this.sections, content))
-      },
-      deep: true,
-    },
-
-    complete: function (complete) {
-      this.$emit('complete-update', complete)
-    },
-  },
-
-  created() {
-    this.content = contenuBuild(this.sections, this.contenu)
-    this.$emit('complete-update', this.complete)
-  },
-}
-</script>
diff --git a/packages/ui/src/components/_common/substance-legale-typeahead.stories.tsx b/packages/ui/src/components/_common/substance-legale-typeahead.stories.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..eeb854ebf02c9374b9b059070a44125da9d4493c
--- /dev/null
+++ b/packages/ui/src/components/_common/substance-legale-typeahead.stories.tsx
@@ -0,0 +1,15 @@
+import { Meta, StoryFn } from '@storybook/vue3'
+import { action } from '@storybook/addon-actions'
+import { SubstanceLegaleTypeahead } from './substance-legale-typeahead'
+
+const meta: Meta = {
+  title: 'Components/Common/SubstanceLegaleTypeahead',
+  // @ts-ignore
+  component: SubstanceLegaleTypeahead,
+}
+export default meta
+
+const substanceLegaleSelected = action('substanceLegaleSelected')
+
+export const Default: StoryFn = () => <SubstanceLegaleTypeahead substanceLegaleIds={['auru', 'aloh']} substanceLegaleSelected={substanceLegaleSelected} alwaysOpen={true} />
+export const WithSubstanceTypeAlreadySelected: StoryFn = () => <SubstanceLegaleTypeahead substanceLegaleIds={['auru', 'aloh']} initialValue="auru" substanceLegaleSelected={substanceLegaleSelected} />
diff --git a/packages/ui/src/components/_common/substance-legale-typeahead.stories_snapshots_Default.html b/packages/ui/src/components/_common/substance-legale-typeahead.stories_snapshots_Default.html
new file mode 100644
index 0000000000000000000000000000000000000000..ae5c9acf49729abf1d3b716e04872ae696902e3d
--- /dev/null
+++ b/packages/ui/src/components/_common/substance-legale-typeahead.stories_snapshots_Default.html
@@ -0,0 +1,7 @@
+<div id="typeahead_271_wrapper" class="_typeahead_8eddf1 dsfr">
+  <div class="flex"><input id="typeahead_271" type="text" name="typeahead_271" class="_typeahead-input_8eddf1 fr-input" placeholder="" autocomplete="off"></div>
+  <div class="_typeahead-list_8eddf1">
+    <div class="_typeahead-list-item_8eddf1 _typeahead-list-item-active_8eddf1"><span>bauxite</span></div>
+    <div class="_typeahead-list-item_8eddf1 "><span>or</span></div>
+  </div>
+</div>
\ No newline at end of file
diff --git a/packages/ui/src/components/_common/substance-legale-typeahead.stories_snapshots_WithSubstanceTypeAlreadySelected.html b/packages/ui/src/components/_common/substance-legale-typeahead.stories_snapshots_WithSubstanceTypeAlreadySelected.html
new file mode 100644
index 0000000000000000000000000000000000000000..16d27ec02e25af6d4083db132d233cb0bee03de1
--- /dev/null
+++ b/packages/ui/src/components/_common/substance-legale-typeahead.stories_snapshots_WithSubstanceTypeAlreadySelected.html
@@ -0,0 +1,4 @@
+<div id="typeahead_271_wrapper" class="_typeahead_8eddf1 dsfr">
+  <div class="flex"><input id="typeahead_271" type="text" name="typeahead_271" class="_typeahead-input_8eddf1 fr-input" placeholder="" autocomplete="off"></div>
+  <!---->
+</div>
\ No newline at end of file
diff --git a/packages/ui/src/components/_common/substance-legale-typeahead.tsx b/packages/ui/src/components/_common/substance-legale-typeahead.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..64ee52dd698427372932d99cbc5e7777b1b8eda0
--- /dev/null
+++ b/packages/ui/src/components/_common/substance-legale-typeahead.tsx
@@ -0,0 +1,51 @@
+import { Ref, computed, defineComponent, ref } from 'vue'
+import { TypeAheadSingle } from '../_ui/typeahead-single'
+import { isNotNullNorUndefined } from 'camino-common/src/typescript-tools'
+import { SubstanceLegaleId, SubstancesLegale } from 'camino-common/src/static/substancesLegales'
+
+type Props = {
+  alwaysOpen?: boolean
+  substanceLegaleIds: SubstanceLegaleId[]
+  initialValue?: SubstanceLegaleId
+  substanceLegaleSelected: (substanceLegaleId: SubstanceLegaleId | null) => void
+}
+
+export const SubstanceLegaleTypeahead = defineComponent((props: Props) => {
+  const substanceSelected = ref<{ id: SubstanceLegaleId; nom: string } | null>(props.initialValue ? SubstancesLegale[props.initialValue] : null) as Ref<{ id: SubstanceLegaleId; nom: string } | null>
+  const substanceUpdate = async (substance: { id: SubstanceLegaleId; nom: string } | undefined) => {
+    substanceSelected.value = substance ?? null
+    props.substanceLegaleSelected(isNotNullNorUndefined(substance) ? substance.id : null)
+  }
+
+  const sortedByUs = computed<{ id: SubstanceLegaleId; nom: string }[]>(() => [...props.substanceLegaleIds].map(sId => SubstancesLegale[sId]).sort((a, b) => a.nom.localeCompare(b.nom)))
+
+  const substancesFiltered = ref<{ id: SubstanceLegaleId; nom: string }[]>(sortedByUs.value) as Ref<{ id: SubstanceLegaleId; nom: string }[]>
+  const substanceOnInput = (search: string) => {
+    const formatedSearch = search.trim().toLowerCase()
+
+    if (formatedSearch.length === 0) {
+      substancesFiltered.value = sortedByUs.value
+    } else {
+      substancesFiltered.value = sortedByUs.value.filter(substance => substance.nom.toLowerCase().includes(formatedSearch.toLowerCase()))
+    }
+  }
+
+  return () => (
+    <TypeAheadSingle
+      overrideItem={substanceSelected.value}
+      props={{
+        alwaysOpen: props.alwaysOpen,
+        items: substancesFiltered.value,
+        itemChipLabel: item => item.nom,
+        itemKey: 'id',
+        placeholder: '',
+        minInputLength: 0,
+        onSelectItem: substanceUpdate,
+        onInput: substanceOnInput,
+      }}
+    />
+  )
+})
+
+// @ts-ignore waiting for https://github.com/vuejs/core/issues/7833
+SubstanceLegaleTypeahead.props = ['substanceLegaleIds', 'substanceLegaleSelected', 'alwaysOpen', 'initialValue']
diff --git a/packages/ui/src/components/_common/titre-reference-select.stories_snapshots_Default.html b/packages/ui/src/components/_common/titre-reference-select.stories_snapshots_Default.html
index c90fca3a2ff3b9f14ad0f48f436fa758dfd528f0..4935b5a006f5834d142626546377c0e871cf041f 100644
--- a/packages/ui/src/components/_common/titre-reference-select.stories_snapshots_Default.html
+++ b/packages/ui/src/components/_common/titre-reference-select.stories_snapshots_Default.html
@@ -1,3 +1,3 @@
 <div class="dsfr">
-  <div class="fr-input-group"><label class="fr-label fr-mb-1w" for="references">Références</label><button class="fr-btn fr-btn--icon-right fr-icon-add-line fr-btn--tertiary fr-btn--md" title="Ajouter une référence" aria-label="Ajouter une référence" type="button">Ajouter une référence</button></div>
+  <div class="fr-input-group fr-mb-0"><label class="fr-label fr-mb-1w" for="references">Références</label><button class="fr-btn fr-btn--icon-right fr-icon-add-line fr-btn--tertiary fr-btn--md" title="Ajouter une référence" aria-label="Ajouter une référence" type="button">Ajouter une référence</button></div>
 </div>
\ No newline at end of file
diff --git a/packages/ui/src/components/_common/titre-reference-select.stories_snapshots_WithValues.html b/packages/ui/src/components/_common/titre-reference-select.stories_snapshots_WithValues.html
index 7f6710acb6d3aed08a6b533067708a7723b7a5fb..146c836fea8190080562453573487675c6340e5b 100644
--- a/packages/ui/src/components/_common/titre-reference-select.stories_snapshots_WithValues.html
+++ b/packages/ui/src/components/_common/titre-reference-select.stories_snapshots_WithValues.html
@@ -1,5 +1,5 @@
 <div class="dsfr">
-  <div class="fr-input-group"><label class="fr-label fr-mb-1w" for="references">Références</label>
+  <div class="fr-input-group fr-mb-0"><label class="fr-label fr-mb-1w" for="references">Références</label>
     <div class="fr-grid-row fr-grid-row--middle fr-mb-3v">
       <div class="fr-select-group fr-col fr-mb-0">
         <!----><select class="fr-select" id="select_271" aria-label="" name="select_271">
@@ -16,7 +16,7 @@
           <option disabled="" hidden="" value="">Selectionnez une option</option>
         </select>
       </div>
-      <div class="fr-input-group fr-col fr-ml-2v fr-mb-0">
+      <div class="fr-input-group fr-col fr-ml-2v fr-mb-0" style="margin-bottom: 0px;">
         <!----><input class="fr-input" name="input_670" id="input_670" type="text">
         <!---->
       </div><button class="fr-btn fr-btn--tertiary fr-btn--md fr-icon-delete-bin-line fr-ml-2v" title="Supprimer la référence 1" aria-label="Supprimer la référence 1" type="button">
@@ -39,7 +39,7 @@
           <option disabled="" hidden="" value="">Selectionnez une option</option>
         </select>
       </div>
-      <div class="fr-input-group fr-col fr-ml-2v fr-mb-0">
+      <div class="fr-input-group fr-col fr-ml-2v fr-mb-0" style="margin-bottom: 0px;">
         <!----><input class="fr-input" name="input_878" id="input_878" type="text">
         <!---->
       </div><button class="fr-btn fr-btn--tertiary fr-btn--md fr-icon-delete-bin-line fr-ml-2v" title="Supprimer la référence 2" aria-label="Supprimer la référence 2" type="button">
diff --git a/packages/ui/src/components/_common/titre-reference-select.tsx b/packages/ui/src/components/_common/titre-reference-select.tsx
index 36dc2ae284c225511cc6cc7914712f2a0e5fd66a..56c70cc1cdc2876c4af8a597d31a2acfb55df8f9 100644
--- a/packages/ui/src/components/_common/titre-reference-select.tsx
+++ b/packages/ui/src/components/_common/titre-reference-select.tsx
@@ -39,7 +39,7 @@ export const TitreReferenceSelect = caminoDefineComponent<Props>(['initialValues
   }
 
   return () => (
-    <div class="fr-input-group">
+    <div class="fr-input-group fr-mb-0">
       <label class="fr-label fr-mb-1w" for="references">
         Références
       </label>
diff --git a/packages/ui/src/components/_ui/dsfr-input-date.stories_snapshots_Empty.html b/packages/ui/src/components/_ui/dsfr-input-date.stories_snapshots_Empty.html
index e1b6be174fd1ec3e51335fcec923d8646e2d4b98..835a73070b141daa1708c45197d22ed2b3dc73df 100644
--- a/packages/ui/src/components/_ui/dsfr-input-date.stories_snapshots_Empty.html
+++ b/packages/ui/src/components/_ui/dsfr-input-date.stories_snapshots_Empty.html
@@ -2,21 +2,21 @@
   <fieldset class="fr-fieldset" id="id-1-fieldset" role="group" aria-labelledby="id-1-fieldset-legend">
     <legend class="fr-fieldset__legend" id="id-1-fieldset-legend">Date de naissance <span class="fr-hint-text">Une belle description</span></legend>
     <div class="fr-fieldset__element fr-fieldset__element--inline fr-fieldset__element--number">
-      <div class="fr-input-group"><label class="fr-label" for="input_271">Jour
+      <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_271">Jour
           <!----><span class="fr-hint-text">Exemple : 14</span>
         </label><input class="fr-input" name="input_271" id="input_271" type="number" min="1" max="31">
         <!---->
       </div>
     </div>
     <div class="fr-fieldset__element fr-fieldset__element--inline fr-fieldset__element--number">
-      <div class="fr-input-group"><label class="fr-label" for="input_670">Mois
+      <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_670">Mois
           <!----><span class="fr-hint-text">Exemple : 12</span>
         </label><input class="fr-input" name="input_670" id="input_670" type="number" min="1" max="12">
         <!---->
       </div>
     </div>
     <div class="fr-fieldset__element fr-fieldset__element--inline fr-fieldset__element--inline-grow fr-fieldset__element--year">
-      <div class="fr-input-group"><label class="fr-label" for="input_74">Année
+      <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_74">Année
           <!----><span class="fr-hint-text">Exemple : 1984</span>
         </label><input class="fr-input" name="input_74" id="input_74" type="number" min="1750" max="2099">
         <!---->
diff --git a/packages/ui/src/components/_ui/dsfr-input-date.stories_snapshots_WithDateAlreadySet.html b/packages/ui/src/components/_ui/dsfr-input-date.stories_snapshots_WithDateAlreadySet.html
index 2f234d730f79a74d1eeba5aeaec516a5faeac4db..ec75b0159502c249ae4810f330ad6e6b4e3ef979 100644
--- a/packages/ui/src/components/_ui/dsfr-input-date.stories_snapshots_WithDateAlreadySet.html
+++ b/packages/ui/src/components/_ui/dsfr-input-date.stories_snapshots_WithDateAlreadySet.html
@@ -4,21 +4,21 @@
       <!---->
     </legend>
     <div class="fr-fieldset__element fr-fieldset__element--inline fr-fieldset__element--number">
-      <div class="fr-input-group"><label class="fr-label" for="input_271">Jour
+      <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_271">Jour
           <!----><span class="fr-hint-text">Exemple : 14</span>
         </label><input class="fr-input" name="input_271" id="input_271" type="number" min="1" max="31">
         <!---->
       </div>
     </div>
     <div class="fr-fieldset__element fr-fieldset__element--inline fr-fieldset__element--number">
-      <div class="fr-input-group"><label class="fr-label" for="input_670">Mois
+      <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_670">Mois
           <!----><span class="fr-hint-text">Exemple : 12</span>
         </label><input class="fr-input" name="input_670" id="input_670" type="number" min="1" max="12">
         <!---->
       </div>
     </div>
     <div class="fr-fieldset__element fr-fieldset__element--inline fr-fieldset__element--inline-grow fr-fieldset__element--year">
-      <div class="fr-input-group"><label class="fr-label" for="input_74">Année
+      <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_74">Année
           <!----><span class="fr-hint-text">Exemple : 1984</span>
         </label><input class="fr-input" name="input_74" id="input_74" type="number" min="1750" max="2099">
         <!---->
diff --git a/packages/ui/src/components/_ui/dsfr-input-radio.tsx b/packages/ui/src/components/_ui/dsfr-input-radio.tsx
index 2c43277858eed3accff3fe4f187beda543eb7534..96f900e1c6bdec251fecb719bf17b9a607598931 100644
--- a/packages/ui/src/components/_ui/dsfr-input-radio.tsx
+++ b/packages/ui/src/components/_ui/dsfr-input-radio.tsx
@@ -9,7 +9,7 @@ type Props<T extends string> = {
   required?: boolean
   orientation?: 'vertical' | 'horizontal'
   valueChanged: (value: T) => void
-  initialValue?: string | null
+  initialValue?: T | null
   elements: { itemId: T; legend: { main: string; description?: string } }[]
 }
 
diff --git a/packages/ui/src/components/_ui/dsfr-input.stories.tsx b/packages/ui/src/components/_ui/dsfr-input.stories.tsx
index 9326c895ea476a6d0d681d5f7bf93f2921ae26d4..39b5e1e5057437eb33af3a52ff48ddde259621ce 100644
--- a/packages/ui/src/components/_ui/dsfr-input.stories.tsx
+++ b/packages/ui/src/components/_ui/dsfr-input.stories.tsx
@@ -1,6 +1,7 @@
 import { DsfrInput } from './dsfr-input'
 import { Meta, StoryFn } from '@storybook/vue3'
 import { action } from '@storybook/addon-actions'
+import { caminoDateValidator } from 'camino-common/src/date'
 
 const meta: Meta = {
   title: 'Components/UI/Dsfr/Input',
@@ -19,3 +20,6 @@ export const WithValue: StoryFn = () => <DsfrInput type={{ type: 'text' }} id="i
 export const Disabled: StoryFn = () => <DsfrInput type={{ type: 'text' }} id="input5" disabled={true} legend={{ main: 'Légende' }} initialValue={'valeur initiale'} valueChanged={valueChangedAction} />
 export const Required: StoryFn = () => <DsfrInput type={{ type: 'text' }} id="input6" required={true} legend={{ main: 'Légende' }} initialValue={'valeur initiale'} valueChanged={valueChangedAction} />
 export const Number: StoryFn = () => <DsfrInput id="input1" type={{ type: 'number', min: 1, max: 10 }} legend={{ main: 'Légende' }} valueChanged={valueChangedAction} />
+export const Date: StoryFn = () => (
+  <DsfrInput id="input1" type={{ type: 'date' }} legend={{ main: 'Légende' }} valueChanged={valueChangedAction} initialValue={caminoDateValidator.parse('2023-02-26')} />
+)
diff --git a/packages/ui/src/components/_ui/dsfr-input.stories_snapshots_Date.html b/packages/ui/src/components/_ui/dsfr-input.stories_snapshots_Date.html
new file mode 100644
index 0000000000000000000000000000000000000000..970f046dffef75f1853813319687fc1cfdda247b
--- /dev/null
+++ b/packages/ui/src/components/_ui/dsfr-input.stories_snapshots_Date.html
@@ -0,0 +1,8 @@
+<div class="dsfr">
+  <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input1">Légende
+      <!---->
+      <!---->
+    </label><input class="fr-input" name="input1" id="input1" type="date">
+    <!---->
+  </div>
+</div>
\ No newline at end of file
diff --git a/packages/ui/src/components/_ui/dsfr-input.stories_snapshots_Default.html b/packages/ui/src/components/_ui/dsfr-input.stories_snapshots_Default.html
index 2c627f635e40ee2094b68be8ebf518cdd7ca740c..f38e5638b5deaaab382918424e4e194376dc1ee8 100644
--- a/packages/ui/src/components/_ui/dsfr-input.stories_snapshots_Default.html
+++ b/packages/ui/src/components/_ui/dsfr-input.stories_snapshots_Default.html
@@ -1,5 +1,5 @@
 <div class="dsfr">
-  <div class="fr-input-group"><label class="fr-label" for="input1">Légende
+  <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input1">Légende
       <!---->
       <!---->
     </label><input class="fr-input" name="input1" id="input1" type="text">
diff --git a/packages/ui/src/components/_ui/dsfr-input.stories_snapshots_Disabled.html b/packages/ui/src/components/_ui/dsfr-input.stories_snapshots_Disabled.html
index 69793a1b976e916714e6e440248cb5969ffb023f..ff1d512cb486acd1c37951e2c4cb0d1e0ad59f94 100644
--- a/packages/ui/src/components/_ui/dsfr-input.stories_snapshots_Disabled.html
+++ b/packages/ui/src/components/_ui/dsfr-input.stories_snapshots_Disabled.html
@@ -1,5 +1,5 @@
 <div class="dsfr">
-  <div class="fr-input-group fr-input-group--disabled"><label class="fr-label" for="input5">Légende
+  <div class="fr-input-group fr-input-group--disabled" style="margin-bottom: 0px;"><label class="fr-label" for="input5">Légende
       <!---->
       <!---->
     </label><input class="fr-input" name="input5" id="input5" disabled="" type="text">
diff --git a/packages/ui/src/components/_ui/dsfr-input.stories_snapshots_Number.html b/packages/ui/src/components/_ui/dsfr-input.stories_snapshots_Number.html
index 8980fb441a5311e69f5aee3da2ac3478eb06e002..e5aa6ef9e3df7f8477fea275e79182d4bc5cf6ef 100644
--- a/packages/ui/src/components/_ui/dsfr-input.stories_snapshots_Number.html
+++ b/packages/ui/src/components/_ui/dsfr-input.stories_snapshots_Number.html
@@ -1,5 +1,5 @@
 <div class="dsfr">
-  <div class="fr-input-group"><label class="fr-label" for="input1">Légende
+  <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input1">Légende
       <!---->
       <!---->
     </label><input class="fr-input" name="input1" id="input1" type="number" min="1" max="10">
diff --git a/packages/ui/src/components/_ui/dsfr-input.stories_snapshots_Required.html b/packages/ui/src/components/_ui/dsfr-input.stories_snapshots_Required.html
index 3ccffc17dcbae3a41c08eda79130088b61e999d2..0b61b75b032c617c1bb4e6ae783936f3a834dc00 100644
--- a/packages/ui/src/components/_ui/dsfr-input.stories_snapshots_Required.html
+++ b/packages/ui/src/components/_ui/dsfr-input.stories_snapshots_Required.html
@@ -1,5 +1,5 @@
 <div class="dsfr">
-  <div class="fr-input-group"><label class="fr-label" for="input6">Légende *
+  <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input6">Légende *
       <!---->
     </label><input class="fr-input" name="input6" id="input6" required="" type="text">
     <!---->
diff --git a/packages/ui/src/components/_ui/dsfr-input.stories_snapshots_WithDescription.html b/packages/ui/src/components/_ui/dsfr-input.stories_snapshots_WithDescription.html
index 2277309d7052757b26ad7f91c0e4f91ad4bcb1bf..2b70e6a8756a98e7786bdb4da6746af8cc1ea430 100644
--- a/packages/ui/src/components/_ui/dsfr-input.stories_snapshots_WithDescription.html
+++ b/packages/ui/src/components/_ui/dsfr-input.stories_snapshots_WithDescription.html
@@ -1,5 +1,5 @@
 <div class="dsfr">
-  <div class="fr-input-group"><label class="fr-label" for="input2">Légende
+  <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input2">Légende
       <!----><span class="fr-hint-text">description</span>
     </label><input class="fr-input" name="input2" id="input2" type="text">
     <!---->
diff --git a/packages/ui/src/components/_ui/dsfr-input.stories_snapshots_WithDescriptionAndPlaceholder.html b/packages/ui/src/components/_ui/dsfr-input.stories_snapshots_WithDescriptionAndPlaceholder.html
index 0e4357ddba3ebb86931157a210e2c3b445112d3a..5bdd086070b8372e2c5ae9cc9e86a89e37d654c0 100644
--- a/packages/ui/src/components/_ui/dsfr-input.stories_snapshots_WithDescriptionAndPlaceholder.html
+++ b/packages/ui/src/components/_ui/dsfr-input.stories_snapshots_WithDescriptionAndPlaceholder.html
@@ -1,5 +1,5 @@
 <div class="dsfr">
-  <div class="fr-input-group"><label class="fr-label" for="input3">Légende
+  <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input3">Légende
       <!----><span class="fr-hint-text">une URL</span>
     </label><input placeholder="https://" class="fr-input" name="input3" id="input3" type="text">
     <!---->
diff --git a/packages/ui/src/components/_ui/dsfr-input.stories_snapshots_WithValue.html b/packages/ui/src/components/_ui/dsfr-input.stories_snapshots_WithValue.html
index 4c9e9f80ec624b9e76dea5614904927629813e50..69f52357b1ab17dffa851afa777ee4bb573badac 100644
--- a/packages/ui/src/components/_ui/dsfr-input.stories_snapshots_WithValue.html
+++ b/packages/ui/src/components/_ui/dsfr-input.stories_snapshots_WithValue.html
@@ -1,5 +1,5 @@
 <div class="dsfr">
-  <div class="fr-input-group"><label class="fr-label" for="input4">Légende
+  <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input4">Légende
       <!---->
       <!---->
     </label><input class="fr-input" name="input4" id="input4" type="text">
diff --git a/packages/ui/src/components/_ui/dsfr-input.tsx b/packages/ui/src/components/_ui/dsfr-input.tsx
index a71efacc8aa3d502bf8c2d8b46f8d8c2f5152ca8..e7d63b8fd69e35a0f8424f6059f01d97bbde0c7b 100644
--- a/packages/ui/src/components/_ui/dsfr-input.tsx
+++ b/packages/ui/src/components/_ui/dsfr-input.tsx
@@ -1,4 +1,5 @@
 import { caminoDefineComponent, isEventWithTarget, random } from '@/utils/vue-tsx-utils'
+import { CaminoDate, caminoDateValidator } from 'camino-common/src/date'
 import { isNotNullNorUndefined } from 'camino-common/src/typescript-tools'
 import { ref } from 'vue'
 
@@ -6,6 +7,10 @@ type TextInputType = {
   type: 'text'
 }
 
+type DateInputType = {
+  type: 'date'
+}
+
 type NumberInputType = {
   type: 'number'
   min?: number
@@ -18,7 +23,7 @@ type BaseProps = {
   required?: boolean
 }
 
-type Props = BaseProps & (TextProps | NumberProps)
+type Props = BaseProps & (TextProps | NumberProps | DateProps)
 
 type TextProps = {
   type: TextInputType
@@ -32,8 +37,15 @@ type NumberProps = {
   initialValue?: number | null
 }
 
+type DateProps = {
+  type: DateInputType
+  valueChanged: (value: CaminoDate | null) => void
+  initialValue?: CaminoDate | null
+}
+
 const isTextProps = (props: Props): props is BaseProps & TextProps => props.type.type === 'text'
 const isNumberProps = (props: Props): props is BaseProps & NumberProps => props.type.type === 'number'
+const isDateProps = (props: Props): props is BaseProps & DateProps => props.type.type === 'date'
 
 export const DsfrInput = caminoDefineComponent<Props>(['id', 'initialValue', 'valueChanged', 'legend', 'disabled', 'required', 'type'], props => {
   const id = props.id ?? `input_${(random() * 1000).toFixed()}`
@@ -48,12 +60,17 @@ export const DsfrInput = caminoDefineComponent<Props>(['id', 'initialValue', 'va
         const valueAsNumber = e.target.valueAsNumber
         value.value = valueAsNumber
         props.valueChanged(isNaN(valueAsNumber) ? null : valueAsNumber)
+      } else if (isDateProps(props)) {
+        const dateParsed = caminoDateValidator.safeParse(e.target.value)
+        const newValue = dateParsed.success ? dateParsed.data : null
+        value.value = newValue
+        props.valueChanged(newValue)
       }
     }
   }
 
   return () => (
-    <div class={['fr-input-group', isNotNullNorUndefined(props.disabled) && props.disabled ? 'fr-input-group--disabled' : null]}>
+    <div class={['fr-input-group', isNotNullNorUndefined(props.disabled) && props.disabled ? 'fr-input-group--disabled' : null]} style={{ marginBottom: 0 }}>
       {props.legend.visible ?? true ? (
         <label class="fr-label" for={id}>
           {props.legend.main} {isNotNullNorUndefined(props.required) && props.required ? ' *' : null}
diff --git a/packages/ui/src/components/_ui/dsfr-select.stories.tsx b/packages/ui/src/components/_ui/dsfr-select.stories.tsx
index d96b1a8aab16887e0820d06badb854cf4b700968..ae8f1f05b1faf514d6276a63c7ecfbf9124fbcdb 100644
--- a/packages/ui/src/components/_ui/dsfr-select.stories.tsx
+++ b/packages/ui/src/components/_ui/dsfr-select.stories.tsx
@@ -24,3 +24,18 @@ export const AlreadySelectedItem: StoryFn = () => <DsfrSelect id="select" legend
 
 export const Disabled: StoryFn = () => <DsfrSelect id="select" disabled={true} legend={{ main: 'label de cadix' }} items={items} initialValue={'id1'} valueChanged={onvalueChangedAction} />
 export const Required: StoryFn = () => <DsfrSelect id="select" required={true} legend={{ main: 'label de cadix' }} items={items} initialValue={'id1'} valueChanged={onvalueChangedAction} />
+
+export const ElementDisabled: StoryFn = () => (
+  <DsfrSelect
+    id="select"
+    required={true}
+    legend={{ main: 'label de cadix' }}
+    items={[
+      { id: 'id1', label: 'premier label' },
+      { id: 'id2', label: 'second label' },
+      { id: 'id3', label: 'troisième label désactivé', disabled: true },
+    ]}
+    initialValue={'id1'}
+    valueChanged={onvalueChangedAction}
+  />
+)
diff --git a/packages/ui/src/components/_ui/dsfr-select.stories_snapshots_ElementDisabled.html b/packages/ui/src/components/_ui/dsfr-select.stories_snapshots_ElementDisabled.html
new file mode 100644
index 0000000000000000000000000000000000000000..bc3a2f34b7cccff3a97b6feb155433f6d4b26226
--- /dev/null
+++ b/packages/ui/src/components/_ui/dsfr-select.stories_snapshots_ElementDisabled.html
@@ -0,0 +1,10 @@
+<div class="dsfr">
+  <div class="fr-select-group"><label class="fr-label" for="select">label de cadix *
+      <!---->
+    </label><select class="fr-select" id="select" aria-label="label de cadix" name="select">
+      <option value="id1">premier label</option>
+      <option value="id2">second label</option>
+      <option disabled="" value="id3">troisième label désactivé</option>
+      <option disabled="" hidden="" value="">Selectionnez une option</option>
+    </select></div>
+</div>
\ No newline at end of file
diff --git a/packages/ui/src/components/_ui/dsfr-select.tsx b/packages/ui/src/components/_ui/dsfr-select.tsx
index 66af80a61abe93198df8b376a4555c99b6aca149..6c718277e1895095088ab759ceb6b1a6bfb7f5e1 100644
--- a/packages/ui/src/components/_ui/dsfr-select.tsx
+++ b/packages/ui/src/components/_ui/dsfr-select.tsx
@@ -1,27 +1,27 @@
-import { NonEmptyArray } from 'camino-common/src/typescript-tools'
+import { NonEmptyArray, isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools'
 import { isEventWithTarget, random } from '../../utils/vue-tsx-utils'
-import { HTMLAttributes } from 'vue'
+import { DeepReadonly, HTMLAttributes } from 'vue'
 
-export type Item<T> = { id: T; label: string }
-type Props<T, Items extends Readonly<NonEmptyArray<Item<T>>>> = {
+export type Item<T> = { id: T; label: string; disabled?: boolean }
+type Props<T, Items extends DeepReadonly<NonEmptyArray<Item<T>>>> = {
   id?: string
   items: Items
   legend: { main: string; visible?: boolean; description?: string; placeholder?: string }
   initialValue: Items[number]['id'] | null
   required?: boolean
   disabled?: boolean
-  valueChanged: (id: Items[number]['id'] | null) => void
+  valueChanged: (id: DeepReadonly<Items[number]['id'] | null>) => void
 } & HTMLAttributes
 
-export const DsfrSelect = <T, Items extends Readonly<NonEmptyArray<Item<T>>>>(props: Props<T, Items>): JSX.Element => {
+export const DsfrSelect = <T, Items extends DeepReadonly<NonEmptyArray<Item<T>>>>(props: Props<T, Items>): JSX.Element => {
   const id = props.id ?? `select_${(random() * 1000).toFixed()}`
 
   return (
-    <div class={['fr-select-group', props.disabled ? 'fr-select-group--disabled' : null]}>
+    <div class={['fr-select-group', props.disabled ?? false ? 'fr-select-group--disabled' : null]}>
       {props.legend.visible ?? true ? (
         <label class="fr-label" for={id}>
-          {props.legend.main} {props.required ? ' *' : ''}
-          {props.legend.description ? <span class="fr-hint-text">{props.legend.description}</span> : null}
+          {props.legend.main} {props.required ?? false ? ' *' : ''}
+          {isNotNullNorUndefinedNorEmpty(props.legend.description) ? <span class="fr-hint-text">{props.legend.description}</span> : null}
         </label>
       ) : null}
 
@@ -32,15 +32,15 @@ export const DsfrSelect = <T, Items extends Readonly<NonEmptyArray<Item<T>>>>(pr
         disabled={props.disabled ?? false}
         name={id}
         value={props.initialValue}
-        onChange={event => (isEventWithTarget(event) ? props.valueChanged(event.target.value as T) : null)}
+        onChange={event => (isEventWithTarget(event) ? props.valueChanged(event.target.value as DeepReadonly<Items[number]['id']>) : null)}
       >
-        {props.items.map(({ id, label }) => (
-          <option value={id} selected={props.initialValue === id}>
+        {props.items.map(({ id, label, disabled }) => (
+          <option value={id} selected={props.initialValue === id} disabled={disabled}>
             {label}
           </option>
         ))}
         <option value="" selected={props.initialValue === null} disabled hidden>
-          {props.legend.placeholder ? props.legend.placeholder : 'Selectionnez une option'}
+          {isNotNullNorUndefinedNorEmpty(props.legend.placeholder) ? props.legend.placeholder : 'Selectionnez une option'}
         </option>
       </select>
     </div>
diff --git a/packages/ui/src/components/_ui/filters/filters.stories_snapshots_Loading.html b/packages/ui/src/components/_ui/filters/filters.stories_snapshots_Loading.html
index a880d766b260a989f247f7d34bd437267f086129..a632258e2cb6fcc253d97afb8fb18084b8c42c7d 100644
--- a/packages/ui/src/components/_ui/filters/filters.stories_snapshots_Loading.html
+++ b/packages/ui/src/components/_ui/filters/filters.stories_snapshots_Loading.html
@@ -9,7 +9,7 @@
         <use href="#icon-chevron-bas"></use>
       </svg></div>
   </button>
-  <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+  <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
     <!---->
     <div class="_spinner_3306d0"></div>
   </div>
diff --git a/packages/ui/src/components/_ui/functional-loader.stories_snapshots_All.html b/packages/ui/src/components/_ui/functional-loader.stories_snapshots_All.html
index 5cbf3534ecd97d5db17649eb6984234e584a6c63..deaea499d2b48c63222d9931948afeb1b81e7e36 100644
--- a/packages/ui/src/components/_ui/functional-loader.stories_snapshots_All.html
+++ b/packages/ui/src/components/_ui/functional-loader.stories_snapshots_All.html
@@ -1,8 +1,8 @@
 <div>
-  <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+  <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
     <!---->
     <div class="_spinner_3306d0"></div>
-  </div>La valeur de l’item est : chargé<div class="" style="display: flex; justify-content: center;">
+  </div>La valeur de l’item est : chargé<div class=" undefined" style="display: flex; justify-content: center;">
     <div>
       <div class="_tooltip_4f6ea8">
         <h6 class="_tooltip-content_4f6ea8">Erreur</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
diff --git a/packages/ui/src/components/_ui/functional-loader.tsx b/packages/ui/src/components/_ui/functional-loader.tsx
index fb9788183fde8aa5ce12fa6d4e737121dbdeacff..2a316a220a509d2c30ee9118f5ab51584e5490e7 100644
--- a/packages/ui/src/components/_ui/functional-loader.tsx
+++ b/packages/ui/src/components/_ui/functional-loader.tsx
@@ -6,7 +6,7 @@ import styles from './functional-loader.module.css'
 type Props<T> = {
   data: AsyncData<T>
   renderItem: (item: T) => JSX.Element | null
-} & HTMLAttributes
+} & Pick<HTMLAttributes, 'class' | 'style'>
 
 export const LoadingElement = <T,>(props: Props<T>) => {
   return (
@@ -14,7 +14,7 @@ export const LoadingElement = <T,>(props: Props<T>) => {
       {props.data.status === 'LOADED' ? (
         props.renderItem(props.data.value)
       ) : (
-        <div class={`${props.data.status === 'LOADING' ? styles['top-level'] : ''}`} style={'display: flex; justify-content: center'}>
+        <div class={`${props.data.status === 'LOADING' ? styles['top-level'] : ''} ${props.class}`} style={'display: flex; justify-content: center'}>
           {props.data.status === 'ERROR' ? (
             <div>
               <HelpTooltip icon="error-warning" text={props.data.message} />
diff --git a/packages/ui/src/components/_ui/functional-popup.tsx b/packages/ui/src/components/_ui/functional-popup.tsx
index ba21697aa1eff05ccd6aeaf7e1269ab210856738..c2bae96165a4b91e48db249cf1883357e5c8f869 100644
--- a/packages/ui/src/components/_ui/functional-popup.tsx
+++ b/packages/ui/src/components/_ui/functional-popup.tsx
@@ -108,7 +108,7 @@ export const FunctionalPopup = caminoDefineComponent<Props>(['id', 'title', 'con
                             </button>
                           </li>
                           <li>
-                            <button class="fr-btn fr-icon-arrow-go-back-fill fr-btn--icon-left fr-btn--secondary" aria-controls={id} onClick={() => props.close()}>
+                            <button class="fr-btn fr-icon-arrow-go-back-fill fr-btn--icon-left fr-btn--secondary" aria-controls={id} onClick={props.close}>
                               Annuler
                             </button>
                           </li>
diff --git a/packages/ui/src/components/_ui/popup.vue b/packages/ui/src/components/_ui/popup.vue
deleted file mode 100644
index 0d7261793f67036f000d2698dc908339edc9e398..0000000000000000000000000000000000000000
--- a/packages/ui/src/components/_ui/popup.vue
+++ /dev/null
@@ -1,29 +0,0 @@
-<template>
-  <div class="popup fixed shadow full bg-bg">
-    <div class="popup-header px-l pt-l">
-      <slot name="header" />
-    </div>
-    <div class="popup-content px-l pt">
-      <slot />
-    </div>
-    <div class="popup-footer px-l pt pb-l">
-      <Messages id="cmn-ui-popup-messages" :messages="messages" />
-      <slot name="footer" />
-    </div>
-  </div>
-</template>
-
-<script>
-import { Messages } from './messages'
-export default {
-  name: 'UiSystemPopup',
-
-  components: {
-    Messages,
-  },
-
-  props: {
-    messages: { type: Array, default: () => [] },
-  },
-}
-</script>
diff --git a/packages/ui/src/components/_ui/table-pagination.stories_snapshots_Loading.html b/packages/ui/src/components/_ui/table-pagination.stories_snapshots_Loading.html
index d68c6f38c47534c10971aaa10fdf05563985460f..82cf7484e42b43dbc05de92f4db9ae6329ba9b88 100644
--- a/packages/ui/src/components/_ui/table-pagination.stories_snapshots_Loading.html
+++ b/packages/ui/src/components/_ui/table-pagination.stories_snapshots_Loading.html
@@ -87,7 +87,7 @@
       </table>
     </div>
   </div>
-  <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+  <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
     <!---->
     <div class="_spinner_3306d0"></div>
   </div>
diff --git a/packages/ui/src/components/_ui/table-pagination.stories_snapshots_WithError.html b/packages/ui/src/components/_ui/table-pagination.stories_snapshots_WithError.html
index dce4ec31e8b54b73fc4a879bd4019b12721483cb..cf43eed07d9902965627e13ff85b36e96c05c1a7 100644
--- a/packages/ui/src/components/_ui/table-pagination.stories_snapshots_WithError.html
+++ b/packages/ui/src/components/_ui/table-pagination.stories_snapshots_WithError.html
@@ -87,7 +87,7 @@
       </table>
     </div>
   </div>
-  <div class="" style="display: flex; justify-content: center;">
+  <div class=" undefined" style="display: flex; justify-content: center;">
     <div>
       <div class="_tooltip_4f6ea8">
         <h6 class="_tooltip-content_4f6ea8">une erreur</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
diff --git a/packages/ui/src/components/_ui/tag-list.tsx b/packages/ui/src/components/_ui/tag-list.tsx
deleted file mode 100644
index 7c986ba13aa3124adc60f0771eef4f84c2c99de0..0000000000000000000000000000000000000000
--- a/packages/ui/src/components/_ui/tag-list.tsx
+++ /dev/null
@@ -1,20 +0,0 @@
-import { FunctionalComponent, HTMLAttributes } from 'vue'
-import { Tag } from './tag'
-
-type Props = {
-  elements: string[]
-} & HTMLAttributes
-
-export const TagList: FunctionalComponent<Props> = props => {
-  return (
-    <ul class="list-inline">
-      {props.elements.map(element => {
-        return (
-          <li key={element} class="mr-xs mb-xs">
-            <Tag class="lh-2" text={element} />
-          </li>
-        )
-      })}
-    </ul>
-  )
-}
diff --git a/packages/ui/src/components/_ui/tag.tsx b/packages/ui/src/components/_ui/tag.tsx
index 5492e6b28635004cd56a7d7e8686b95df9fa4189..82c0c272ea024d47657483634b985ebf7367d458 100644
--- a/packages/ui/src/components/_ui/tag.tsx
+++ b/packages/ui/src/components/_ui/tag.tsx
@@ -1,34 +1,8 @@
-import { Couleur } from 'camino-common/src/static/couleurs'
 import { isNotNullNorUndefined } from 'camino-common/src/typescript-tools'
 import { FunctionalComponent, HTMLAttributes } from 'vue'
 import { UseLinkOptions } from 'vue-router'
 import { CaminoRouterLink } from '../../router/camino-router-link'
 
-type Props = {
-  color?: `bg-${Couleur}`
-  mini?: boolean
-  text: string
-} & HTMLAttributes
-
-/**
- * @deprecated use DsfrTag
- */
-export const Tag: FunctionalComponent<Props> = props => {
-  let css: string = props.color ?? 'bg-neutral'
-
-  if (props.mini ?? false) {
-    css += ' py-xxs px-xs'
-  } else {
-    css += ' py-xs px-s'
-  }
-
-  return (
-    <span class="bold cap-first small">
-      <span class={`${css} rnd-xs color-bg box`}>{props.text}</span>
-    </span>
-  )
-}
-
 type DsfrTagProps = {
   ariaLabel: string
   label?: string
diff --git a/packages/ui/src/components/_ui/typeahead-single.tsx b/packages/ui/src/components/_ui/typeahead-single.tsx
index 6324ea57a86f4eea8fe6543c2b29d7ba8c2cc73f..b9193e6975d1a291d4803eb7da13a25007b391bb 100644
--- a/packages/ui/src/components/_ui/typeahead-single.tsx
+++ b/packages/ui/src/components/_ui/typeahead-single.tsx
@@ -1,7 +1,7 @@
 import { computed, Ref, ref, watch, defineComponent } from 'vue'
 import styles from './typeahead.module.css'
 import { isEventWithTarget, random } from '@/utils/vue-tsx-utils'
-import { isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools'
+import { DeepReadonly, isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools'
 
 type TypeAheadRecord = Record<string | symbol | number, any>
 
@@ -12,7 +12,7 @@ type Props<T extends TypeAheadRecord, K extends keyof T> = {
     id?: string
     itemKey: K
     placeholder: string
-    items: T[]
+    items: DeepReadonly<T[]>
     minInputLength: number
     alwaysOpen?: boolean
     itemChipLabel: (key: T) => string
diff --git a/packages/ui/src/components/activite-edition.stories_snapshots_FullDeposable.html b/packages/ui/src/components/activite-edition.stories_snapshots_FullDeposable.html
index 54397d28f12a96ccaeedaf490cd682916259c06e..47491b93d358885098b96d96579593d8e3b0c1e2 100644
--- a/packages/ui/src/components/activite-edition.stories_snapshots_FullDeposable.html
+++ b/packages/ui/src/components/activite-edition.stories_snapshots_FullDeposable.html
@@ -16,21 +16,21 @@
         <!---->
         <div class="fr-fieldset__element">
           <div>
-            <div class="fr-input-group"><label class="fr-label" for="input_271">Or brut extrait (g) *<span class="fr-hint-text">Masse d’or brut en sortie de mine extrait au cours du trimestre (exemple : masse sous la forme de concentré gravimétrique).</span></label><input class="fr-input" name="input_271" id="input_271" required="" type="number" min="0">
+            <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_271">Or brut extrait (g) *<span class="fr-hint-text">Masse d’or brut en sortie de mine extrait au cours du trimestre (exemple : masse sous la forme de concentré gravimétrique).</span></label><input class="fr-input" name="input_271" id="input_271" required="" type="number" min="0">
               <!---->
             </div>
           </div>
         </div>
         <div class="fr-fieldset__element">
           <div>
-            <div class="fr-input-group"><label class="fr-label" for="input_670">Mercure récupéré (g) *<span class="fr-hint-text">Masse en gramme de l’ensemble des produits contaminés envoyés en traitement au cours du trimestre.</span></label><input class="fr-input" name="input_670" id="input_670" required="" type="number" min="0">
+            <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_670">Mercure récupéré (g) *<span class="fr-hint-text">Masse en gramme de l’ensemble des produits contaminés envoyés en traitement au cours du trimestre.</span></label><input class="fr-input" name="input_670" id="input_670" required="" type="number" min="0">
               <!---->
             </div>
           </div>
         </div>
         <div class="fr-fieldset__element">
           <div>
-            <div class="fr-input-group"><label class="fr-label" for="input_74">Carburant détaxé (l) *<span class="fr-hint-text">Volume total en litre de carburant détaxé consommé au cours du trimestre par les travaux réalisés sur le chantier.</span></label><input class="fr-input" name="input_74" id="input_74" required="" type="number" min="0">
+            <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_74">Carburant détaxé (l) *<span class="fr-hint-text">Volume total en litre de carburant détaxé consommé au cours du trimestre par les travaux réalisés sur le chantier.</span></label><input class="fr-input" name="input_74" id="input_74" required="" type="number" min="0">
               <!---->
             </div>
           </div>
diff --git a/packages/ui/src/components/activite-edition.stories_snapshots_FullEmpty.html b/packages/ui/src/components/activite-edition.stories_snapshots_FullEmpty.html
index 1b9a0e30cf132e0e0cc1ee0147ee8680a236f199..e45ae3f8c1e4bd91a1a0a33db76cc751f5ae2d66 100644
--- a/packages/ui/src/components/activite-edition.stories_snapshots_FullEmpty.html
+++ b/packages/ui/src/components/activite-edition.stories_snapshots_FullEmpty.html
@@ -16,28 +16,28 @@
         <!---->
         <div class="fr-fieldset__element">
           <div>
-            <div class="fr-input-group"><label class="fr-label" for="input_271">Or brut extrait (g) *<span class="fr-hint-text">Masse d’or brut en sortie de mine extrait au cours du trimestre (exemple : masse sous la forme de concentré gravimétrique).</span></label><input class="fr-input" name="input_271" id="input_271" required="" type="number" min="0">
+            <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_271">Or brut extrait (g) *<span class="fr-hint-text">Masse d’or brut en sortie de mine extrait au cours du trimestre (exemple : masse sous la forme de concentré gravimétrique).</span></label><input class="fr-input" name="input_271" id="input_271" required="" type="number" min="0">
               <!---->
             </div>
           </div>
         </div>
         <div class="fr-fieldset__element">
           <div>
-            <div class="fr-input-group"><label class="fr-label" for="input_670">Mercure récupéré (g) *<span class="fr-hint-text">Masse en gramme de l’ensemble des produits contaminés envoyés en traitement au cours du trimestre.</span></label><input class="fr-input" name="input_670" id="input_670" required="" type="number" min="0">
+            <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_670">Mercure récupéré (g) *<span class="fr-hint-text">Masse en gramme de l’ensemble des produits contaminés envoyés en traitement au cours du trimestre.</span></label><input class="fr-input" name="input_670" id="input_670" required="" type="number" min="0">
               <!---->
             </div>
           </div>
         </div>
         <div class="fr-fieldset__element">
           <div>
-            <div class="fr-input-group"><label class="fr-label" for="input_74">Carburant détaxé (l) *<span class="fr-hint-text">Volume total en litre de carburant détaxé consommé au cours du trimestre par les travaux réalisés sur le chantier.</span></label><input class="fr-input" name="input_74" id="input_74" required="" type="number" min="0">
+            <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_74">Carburant détaxé (l) *<span class="fr-hint-text">Volume total en litre de carburant détaxé consommé au cours du trimestre par les travaux réalisés sur le chantier.</span></label><input class="fr-input" name="input_74" id="input_74" required="" type="number" min="0">
               <!---->
             </div>
           </div>
         </div>
         <div class="fr-fieldset__element">
           <div>
-            <div class="fr-input-group"><label class="fr-label" for="input_878">Carburant conventionnel (l) *<span class="fr-hint-text">Volume total en litre de carburant conventionnel consommé au cours du trimestre par les travaux réalisés sur le chantier.</span></label><input class="fr-input" name="input_878" id="input_878" required="" type="number" min="0">
+            <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_878">Carburant conventionnel (l) *<span class="fr-hint-text">Volume total en litre de carburant conventionnel consommé au cours du trimestre par les travaux réalisés sur le chantier.</span></label><input class="fr-input" name="input_878" id="input_878" required="" type="number" min="0">
               <!---->
             </div>
           </div>
@@ -61,21 +61,21 @@
         </div>
         <div class="fr-fieldset__element">
           <div>
-            <div class="fr-input-group"><label class="fr-label" for="input_967">Pelles actives *<span class="fr-hint-text">Nombre moyen de pelles actives au cours du trimestre utilisées sur le chantier (aménagement, exploitation, réhabilitation).</span></label><input class="fr-input" name="input_967" id="input_967" required="" type="number" min="0">
+            <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_967">Pelles actives *<span class="fr-hint-text">Nombre moyen de pelles actives au cours du trimestre utilisées sur le chantier (aménagement, exploitation, réhabilitation).</span></label><input class="fr-input" name="input_967" id="input_967" required="" type="number" min="0">
               <!---->
             </div>
           </div>
         </div>
         <div class="fr-fieldset__element">
           <div>
-            <div class="fr-input-group"><label class="fr-label" for="input_25">Effectifs *<span class="fr-hint-text">Nombre moyen de salariés sur le chantier au cours du trimestre.</span></label><input class="fr-input" name="input_25" id="input_25" required="" type="number" min="0">
+            <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_25">Effectifs *<span class="fr-hint-text">Nombre moyen de salariés sur le chantier au cours du trimestre.</span></label><input class="fr-input" name="input_25" id="input_25" required="" type="number" min="0">
               <!---->
             </div>
           </div>
         </div>
         <div class="fr-fieldset__element">
           <div>
-            <div class="fr-input-group"><label class="fr-label" for="input_128">Dépenses relatives à la protection de l’environnement (euros) *<span class="fr-hint-text">Montant en euros des investissements consentis au cours du trimestre listés à l’<a href="https://www.legifrance.gouv.fr/affichCodeArticle.do?idArticle=LEGIARTI000021850940&amp;cidTexte=LEGITEXT000006069569" target="_blank" rel="noopener noreferrer">article 318 C de l’annexe II du code général des impôts</a>. Afin de bénéficier des déductions fiscales afférentes, les justificatifs attestant de la réalisation effective des investissements sont susceptibles de vous êtres demandés par l’administration.</span></label><input class="fr-input" name="input_128" id="input_128" required="" type="number" min="0">
+            <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_128">Dépenses relatives à la protection de l’environnement (euros) *<span class="fr-hint-text">Montant en euros des investissements consentis au cours du trimestre listés à l’<a href="https://www.legifrance.gouv.fr/affichCodeArticle.do?idArticle=LEGIARTI000021850940&amp;cidTexte=LEGITEXT000006069569" target="_blank" rel="noopener noreferrer">article 318 C de l’annexe II du code général des impôts</a>. Afin de bénéficier des déductions fiscales afférentes, les justificatifs attestant de la réalisation effective des investissements sont susceptibles de vous êtres demandés par l’administration.</span></label><input class="fr-input" name="input_128" id="input_128" required="" type="number" min="0">
               <!---->
             </div>
           </div>
diff --git a/packages/ui/src/components/activite-edition.stories_snapshots_FullEmptyWithMandatoryDocument.html b/packages/ui/src/components/activite-edition.stories_snapshots_FullEmptyWithMandatoryDocument.html
index 70215f6dc2d8df7dc4f27b3f45abc69afebf8f39..2d55b796afdc8036d40dbdac3aaa7e46e52d3470 100644
--- a/packages/ui/src/components/activite-edition.stories_snapshots_FullEmptyWithMandatoryDocument.html
+++ b/packages/ui/src/components/activite-edition.stories_snapshots_FullEmptyWithMandatoryDocument.html
@@ -19,28 +19,28 @@
         <!---->
         <div class="fr-fieldset__element">
           <div>
-            <div class="fr-input-group"><label class="fr-label" for="input_271">Or brut extrait (g) *<span class="fr-hint-text">Masse d’or brut en sortie de mine extrait au cours du trimestre (exemple : masse sous la forme de concentré gravimétrique).</span></label><input class="fr-input" name="input_271" id="input_271" required="" type="number" min="0">
+            <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_271">Or brut extrait (g) *<span class="fr-hint-text">Masse d’or brut en sortie de mine extrait au cours du trimestre (exemple : masse sous la forme de concentré gravimétrique).</span></label><input class="fr-input" name="input_271" id="input_271" required="" type="number" min="0">
               <!---->
             </div>
           </div>
         </div>
         <div class="fr-fieldset__element">
           <div>
-            <div class="fr-input-group"><label class="fr-label" for="input_670">Mercure récupéré (g) *<span class="fr-hint-text">Masse en gramme de l’ensemble des produits contaminés envoyés en traitement au cours du trimestre.</span></label><input class="fr-input" name="input_670" id="input_670" required="" type="number" min="0">
+            <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_670">Mercure récupéré (g) *<span class="fr-hint-text">Masse en gramme de l’ensemble des produits contaminés envoyés en traitement au cours du trimestre.</span></label><input class="fr-input" name="input_670" id="input_670" required="" type="number" min="0">
               <!---->
             </div>
           </div>
         </div>
         <div class="fr-fieldset__element">
           <div>
-            <div class="fr-input-group"><label class="fr-label" for="input_74">Carburant détaxé (l) *<span class="fr-hint-text">Volume total en litre de carburant détaxé consommé au cours du trimestre par les travaux réalisés sur le chantier.</span></label><input class="fr-input" name="input_74" id="input_74" required="" type="number" min="0">
+            <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_74">Carburant détaxé (l) *<span class="fr-hint-text">Volume total en litre de carburant détaxé consommé au cours du trimestre par les travaux réalisés sur le chantier.</span></label><input class="fr-input" name="input_74" id="input_74" required="" type="number" min="0">
               <!---->
             </div>
           </div>
         </div>
         <div class="fr-fieldset__element">
           <div>
-            <div class="fr-input-group"><label class="fr-label" for="input_878">Carburant conventionnel (l) *<span class="fr-hint-text">Volume total en litre de carburant conventionnel consommé au cours du trimestre par les travaux réalisés sur le chantier.</span></label><input class="fr-input" name="input_878" id="input_878" required="" type="number" min="0">
+            <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_878">Carburant conventionnel (l) *<span class="fr-hint-text">Volume total en litre de carburant conventionnel consommé au cours du trimestre par les travaux réalisés sur le chantier.</span></label><input class="fr-input" name="input_878" id="input_878" required="" type="number" min="0">
               <!---->
             </div>
           </div>
@@ -64,21 +64,21 @@
         </div>
         <div class="fr-fieldset__element">
           <div>
-            <div class="fr-input-group"><label class="fr-label" for="input_967">Pelles actives *<span class="fr-hint-text">Nombre moyen de pelles actives au cours du trimestre utilisées sur le chantier (aménagement, exploitation, réhabilitation).</span></label><input class="fr-input" name="input_967" id="input_967" required="" type="number" min="0">
+            <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_967">Pelles actives *<span class="fr-hint-text">Nombre moyen de pelles actives au cours du trimestre utilisées sur le chantier (aménagement, exploitation, réhabilitation).</span></label><input class="fr-input" name="input_967" id="input_967" required="" type="number" min="0">
               <!---->
             </div>
           </div>
         </div>
         <div class="fr-fieldset__element">
           <div>
-            <div class="fr-input-group"><label class="fr-label" for="input_25">Effectifs *<span class="fr-hint-text">Nombre moyen de salariés sur le chantier au cours du trimestre.</span></label><input class="fr-input" name="input_25" id="input_25" required="" type="number" min="0">
+            <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_25">Effectifs *<span class="fr-hint-text">Nombre moyen de salariés sur le chantier au cours du trimestre.</span></label><input class="fr-input" name="input_25" id="input_25" required="" type="number" min="0">
               <!---->
             </div>
           </div>
         </div>
         <div class="fr-fieldset__element">
           <div>
-            <div class="fr-input-group"><label class="fr-label" for="input_128">Dépenses relatives à la protection de l’environnement (euros) *<span class="fr-hint-text">Montant en euros des investissements consentis au cours du trimestre listés à l’<a href="https://www.legifrance.gouv.fr/affichCodeArticle.do?idArticle=LEGIARTI000021850940&amp;cidTexte=LEGITEXT000006069569" target="_blank" rel="noopener noreferrer">article 318 C de l’annexe II du code général des impôts</a>. Afin de bénéficier des déductions fiscales afférentes, les justificatifs attestant de la réalisation effective des investissements sont susceptibles de vous êtres demandés par l’administration.</span></label><input class="fr-input" name="input_128" id="input_128" required="" type="number" min="0">
+            <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_128">Dépenses relatives à la protection de l’environnement (euros) *<span class="fr-hint-text">Montant en euros des investissements consentis au cours du trimestre listés à l’<a href="https://www.legifrance.gouv.fr/affichCodeArticle.do?idArticle=LEGIARTI000021850940&amp;cidTexte=LEGITEXT000006069569" target="_blank" rel="noopener noreferrer">article 318 C de l’annexe II du code général des impôts</a>. Afin de bénéficier des déductions fiscales afférentes, les justificatifs attestant de la réalisation effective des investissements sont susceptibles de vous êtres demandés par l’administration.</span></label><input class="fr-input" name="input_128" id="input_128" required="" type="number" min="0">
               <!---->
             </div>
           </div>
diff --git a/packages/ui/src/components/activite-edition.stories_snapshots_Loading.html b/packages/ui/src/components/activite-edition.stories_snapshots_Loading.html
index 5c04e30cca5e5478f7d7e4a99b2e6523211937ce..cc72be8da28170691121814760d7070efafa9128 100644
--- a/packages/ui/src/components/activite-edition.stories_snapshots_Loading.html
+++ b/packages/ui/src/components/activite-edition.stories_snapshots_Loading.html
@@ -1,6 +1,6 @@
 <div class="dsfr">
   <h1>Activité</h1>
-  <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+  <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
     <!---->
     <div class="_spinner_3306d0"></div>
   </div>
diff --git a/packages/ui/src/components/activite-edition.stories_snapshots_WithError.html b/packages/ui/src/components/activite-edition.stories_snapshots_WithError.html
index 1f4ad905bf4bef5c4043aee92f5aebf728da536a..93bddab2cbcb05283867812272c8a9aa9d5cc0eb 100644
--- a/packages/ui/src/components/activite-edition.stories_snapshots_WithError.html
+++ b/packages/ui/src/components/activite-edition.stories_snapshots_WithError.html
@@ -1,6 +1,6 @@
 <div class="dsfr">
   <h1>Activité</h1>
-  <div class="" style="display: flex; justify-content: center;">
+  <div class=" undefined" style="display: flex; justify-content: center;">
     <div>
       <div class="_tooltip_4f6ea8">
         <h6 class="_tooltip-content_4f6ea8">Une erreur est survenue</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
diff --git a/packages/ui/src/components/activite-edition.tsx b/packages/ui/src/components/activite-edition.tsx
index aab9df8d67e12a51c72947a16305d4133d1259b7..5a532af7aa512ad4846d06357e751ea73c953c7f 100644
--- a/packages/ui/src/components/activite-edition.tsx
+++ b/packages/ui/src/components/activite-edition.tsx
@@ -1,6 +1,6 @@
 import { ActiviteDocumentsEdit } from './activite/activite-documents-edit'
 import { getPeriode } from 'camino-common/src/static/frequence'
-import { computed, defineComponent, onBeforeUnmount, onMounted, ref } from 'vue'
+import { DeepReadonly, computed, defineComponent, onBeforeUnmount, onMounted, ref } from 'vue'
 import { AsyncData } from '@/api/client-rest'
 import { Activite, ActiviteDocumentId, ActiviteId, ActiviteIdOrSlug, TempActiviteDocument, activiteIdOrSlugValidator } from 'camino-common/src/activite'
 import { useRouter } from 'vue-router'
@@ -45,7 +45,7 @@ export const PureActiviteEdition = defineComponent<Props>(props => {
     activiteDocumentIds: [],
     tempsDocuments: [],
   })
-  const sectionsComplete = ref<{ complete: boolean; sectionsWithValue: SectionWithValue[] }>({ complete: false, sectionsWithValue: [] })
+  const sectionsComplete = ref<{ complete: boolean; sectionsWithValue: DeepReadonly<SectionWithValue[]> }>({ complete: false, sectionsWithValue: [] })
 
   const data = ref<AsyncData<Activite>>({ status: 'LOADING' })
 
@@ -116,7 +116,7 @@ export const PureActiviteEdition = defineComponent<Props>(props => {
     documentsComplete.value = { complete, activiteDocumentIds, tempsDocuments }
   }
 
-  const sectionsUpdate = (complete: boolean, sectionsWithValue: SectionWithValue[]) => {
+  const sectionsUpdate = (complete: boolean, sectionsWithValue: DeepReadonly<SectionWithValue[]>) => {
     sectionsComplete.value = { complete, sectionsWithValue }
   }
 
diff --git a/packages/ui/src/components/activite.stories_snapshots_Loading.html b/packages/ui/src/components/activite.stories_snapshots_Loading.html
index 87be2dea39a28709ab5f225c578b106b3fc73d60..c41e1df845be4b548f2c07f465df3cb14e832aca 100644
--- a/packages/ui/src/components/activite.stories_snapshots_Loading.html
+++ b/packages/ui/src/components/activite.stories_snapshots_Loading.html
@@ -1,6 +1,6 @@
 <div>
   <h2>Activité</h2>
-  <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+  <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
     <!---->
     <div class="_spinner_3306d0"></div>
   </div>
diff --git a/packages/ui/src/components/activite.stories_snapshots_WithError.html b/packages/ui/src/components/activite.stories_snapshots_WithError.html
index e2956d3b5c6f27527ead7346d6518f090bec9974..f5ef7bdbb713dcdd5375d0e5bc7964b3ed9283d1 100644
--- a/packages/ui/src/components/activite.stories_snapshots_WithError.html
+++ b/packages/ui/src/components/activite.stories_snapshots_WithError.html
@@ -1,6 +1,6 @@
 <div>
   <h2>Activité</h2>
-  <div class="" style="display: flex; justify-content: center;">
+  <div class=" undefined" style="display: flex; justify-content: center;">
     <div>
       <div class="_tooltip_4f6ea8">
         <h6 class="_tooltip-content_4f6ea8">Une erreur est survenue</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
diff --git a/packages/ui/src/components/activite/activite-api-client.ts b/packages/ui/src/components/activite/activite-api-client.ts
index 0341fda781ee2e58f0fe301df78d9cfa0c870755..1b786e64a0705191845d704d958cba856df1dc04 100644
--- a/packages/ui/src/components/activite/activite-api-client.ts
+++ b/packages/ui/src/components/activite/activite-api-client.ts
@@ -6,6 +6,7 @@ import { ActivitesTypesId } from 'camino-common/src/static/activitesTypes'
 import gql from 'graphql-tag'
 import { deleteWithJson, getWithJson, putWithJson } from '../../api/client-rest'
 import { SectionWithValue } from 'camino-common/src/sections'
+import { DeepReadonly } from 'vue'
 
 export interface UiGraphqlActivite {
   id: string
@@ -31,7 +32,7 @@ export interface ActiviteApiClient {
   updateActivite: (
     activiteId: ActiviteId,
     activiteTypeId: ActivitesTypesId,
-    sectionsWithValue: SectionWithValue[],
+    sectionsWithValue: DeepReadonly<SectionWithValue[]>,
     activiteDocumentIds: ActiviteDocumentId[],
     newTempDocuments: TempActiviteDocument[]
   ) => Promise<void>
@@ -128,7 +129,7 @@ export const activiteApiClient: ActiviteApiClient = {
   updateActivite: async (
     activiteId: ActiviteId,
     _activiteTypeId: ActivitesTypesId,
-    sectionsWithValue: SectionWithValue[],
+    sectionsWithValue: DeepReadonly<SectionWithValue[]>,
     activiteDocumentIds: ActiviteDocumentId[],
     newTempDocuments: TempActiviteDocument[]
   ) => {
diff --git a/packages/ui/src/components/activite/add-activite-document-popup.stories_snapshots_DocumentObligatoire.html b/packages/ui/src/components/activite/add-activite-document-popup.stories_snapshots_DocumentObligatoire.html
index 8f531fbbb0e714947b23ab788efd04ab77ec362a..54f66f8c70caffd168e70a101177b1e317370afd 100644
--- a/packages/ui/src/components/activite/add-activite-document-popup.stories_snapshots_DocumentObligatoire.html
+++ b/packages/ui/src/components/activite/add-activite-document-popup.stories_snapshots_DocumentObligatoire.html
@@ -16,7 +16,7 @@
                       <div class="fr-upload-group"><label class="fr-label" for="file-upload">Ajouter un fichier<span class="fr-hint-text">Taille maximale : 100 Mo. Format<!----> supporté<!----> : pdf.</span></label><input class="fr-upload" type="file" id="file-upload" name="file-upload" accept=".pdf"></div>
                     </div>
                     <div class="fr-fieldset__element">
-                      <div class="fr-input-group"><label class="fr-label" for="input_271">Description
+                      <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_271">Description
                           <!---->
                           <!---->
                         </label><input class="fr-input" name="input_271" id="input_271" type="text">
diff --git a/packages/ui/src/components/activite/add-activite-document-popup.stories_snapshots_DocumentOptionnel.html b/packages/ui/src/components/activite/add-activite-document-popup.stories_snapshots_DocumentOptionnel.html
index fccddfcb192ad57d88d2333a3325ad762d598be8..ea0be91dfec50ad120b303a13060e57c0202ba19 100644
--- a/packages/ui/src/components/activite/add-activite-document-popup.stories_snapshots_DocumentOptionnel.html
+++ b/packages/ui/src/components/activite/add-activite-document-popup.stories_snapshots_DocumentOptionnel.html
@@ -16,7 +16,7 @@
                       <div class="fr-upload-group"><label class="fr-label" for="file-upload">Ajouter un fichier<span class="fr-hint-text">Taille maximale : 100 Mo. Format<!----> supporté<!----> : pdf.</span></label><input class="fr-upload" type="file" id="file-upload" name="file-upload" accept=".pdf"></div>
                     </div>
                     <div class="fr-fieldset__element">
-                      <div class="fr-input-group"><label class="fr-label" for="input_271">Description
+                      <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_271">Description
                           <!---->
                           <!---->
                         </label><input class="fr-input" name="input_271" id="input_271" type="text">
diff --git a/packages/ui/src/components/dashboard/dgtm-stats-full.stories_snapshots_Loading.html b/packages/ui/src/components/dashboard/dgtm-stats-full.stories_snapshots_Loading.html
index d664edea6552fbde46188acb2eee03ffb79bc9c5..b206be2db4e84960f03c074e54992a29318cee43 100644
--- a/packages/ui/src/components/dashboard/dgtm-stats-full.stories_snapshots_Loading.html
+++ b/packages/ui/src/components/dashboard/dgtm-stats-full.stories_snapshots_Loading.html
@@ -1,26 +1,26 @@
 <div class="width-full-p">
   <div style="display: grid; grid-template-columns: 1fr 1fr 1fr;">
-    <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+    <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
       <!---->
       <div class="_spinner_3306d0"></div>
     </div>
-    <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+    <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
       <!---->
       <div class="_spinner_3306d0"></div>
     </div>
-    <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+    <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
       <!---->
       <div class="_spinner_3306d0"></div>
     </div>
-    <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+    <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
       <!---->
       <div class="_spinner_3306d0"></div>
     </div>
-    <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+    <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
       <!---->
       <div class="_spinner_3306d0"></div>
     </div>
-    <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+    <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
       <!---->
       <div class="_spinner_3306d0"></div>
     </div>
diff --git a/packages/ui/src/components/dashboard/dgtm-stats-full.stories_snapshots_WithError.html b/packages/ui/src/components/dashboard/dgtm-stats-full.stories_snapshots_WithError.html
index 94fc8114b17663bb3bb5e15c6dc9d0fbc03a7651..c1d7da5c02a402cb4d096f16d340c8610dd2f472 100644
--- a/packages/ui/src/components/dashboard/dgtm-stats-full.stories_snapshots_WithError.html
+++ b/packages/ui/src/components/dashboard/dgtm-stats-full.stories_snapshots_WithError.html
@@ -1,6 +1,6 @@
 <div class="width-full-p">
   <div style="display: grid; grid-template-columns: 1fr 1fr 1fr;">
-    <div class="" style="display: flex; justify-content: center;">
+    <div class=" undefined" style="display: flex; justify-content: center;">
       <div>
         <div class="_tooltip_4f6ea8">
           <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
@@ -10,7 +10,7 @@
       </div>
       <!---->
     </div>
-    <div class="" style="display: flex; justify-content: center;">
+    <div class=" undefined" style="display: flex; justify-content: center;">
       <div>
         <div class="_tooltip_4f6ea8">
           <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
@@ -20,7 +20,7 @@
       </div>
       <!---->
     </div>
-    <div class="" style="display: flex; justify-content: center;">
+    <div class=" undefined" style="display: flex; justify-content: center;">
       <div>
         <div class="_tooltip_4f6ea8">
           <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
@@ -30,7 +30,7 @@
       </div>
       <!---->
     </div>
-    <div class="" style="display: flex; justify-content: center;">
+    <div class=" undefined" style="display: flex; justify-content: center;">
       <div>
         <div class="_tooltip_4f6ea8">
           <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
@@ -40,7 +40,7 @@
       </div>
       <!---->
     </div>
-    <div class="" style="display: flex; justify-content: center;">
+    <div class=" undefined" style="display: flex; justify-content: center;">
       <div>
         <div class="_tooltip_4f6ea8">
           <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
@@ -50,7 +50,7 @@
       </div>
       <!---->
     </div>
-    <div class="" style="display: flex; justify-content: center;">
+    <div class=" undefined" style="display: flex; justify-content: center;">
       <div>
         <div class="_tooltip_4f6ea8">
           <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
diff --git a/packages/ui/src/components/dashboard/pure-administration-dashboard.stories_snapshots_Loading.html b/packages/ui/src/components/dashboard/pure-administration-dashboard.stories_snapshots_Loading.html
index bc4720486eb425f447e6e8e7a75a4e3f1b504ca3..832221f60ede28004dcd69676ea91c7c58802e0d 100644
--- a/packages/ui/src/components/dashboard/pure-administration-dashboard.stories_snapshots_Loading.html
+++ b/packages/ui/src/components/dashboard/pure-administration-dashboard.stories_snapshots_Loading.html
@@ -10,11 +10,11 @@
       </div>
     </div>
     <!---->
-    <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+    <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
       <!---->
       <div class="_spinner_3306d0"></div>
     </div>
-    <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+    <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
       <!---->
       <div class="_spinner_3306d0"></div>
     </div>
diff --git a/packages/ui/src/components/dashboard/pure-administration-dashboard.stories_snapshots_WithError.html b/packages/ui/src/components/dashboard/pure-administration-dashboard.stories_snapshots_WithError.html
index a5e5917bf1bdf453d8ed9269f74f0aab1b10c946..83fe44c506f5df27bcc30cd5be7ef186431cd77f 100644
--- a/packages/ui/src/components/dashboard/pure-administration-dashboard.stories_snapshots_WithError.html
+++ b/packages/ui/src/components/dashboard/pure-administration-dashboard.stories_snapshots_WithError.html
@@ -10,7 +10,7 @@
       </div>
     </div>
     <!---->
-    <div class="" style="display: flex; justify-content: center;">
+    <div class=" undefined" style="display: flex; justify-content: center;">
       <div>
         <div class="_tooltip_4f6ea8">
           <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
@@ -20,7 +20,7 @@
       </div>
       <!---->
     </div>
-    <div class="" style="display: flex; justify-content: center;">
+    <div class=" undefined" style="display: flex; justify-content: center;">
       <div>
         <div class="_tooltip_4f6ea8">
           <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
diff --git a/packages/ui/src/components/dashboard/pure-dgtm-stats.stories_snapshots_Loading.html b/packages/ui/src/components/dashboard/pure-dgtm-stats.stories_snapshots_Loading.html
index 32fa06de4d60fb9fb679c36493e704440a16f883..922436ce3694db6e1841d56501749ccb54dce795 100644
--- a/packages/ui/src/components/dashboard/pure-dgtm-stats.stories_snapshots_Loading.html
+++ b/packages/ui/src/components/dashboard/pure-dgtm-stats.stories_snapshots_Loading.html
@@ -1,13 +1,13 @@
 <div style="display: grid; grid-template-columns: 1fr 1fr 1fr;">
-  <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+  <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
     <!---->
     <div class="_spinner_3306d0"></div>
   </div>
-  <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+  <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
     <!---->
     <div class="_spinner_3306d0"></div>
   </div>
-  <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+  <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
     <!---->
     <div class="_spinner_3306d0"></div>
   </div>
diff --git a/packages/ui/src/components/dashboard/pure-dgtm-stats.stories_snapshots_WithError.html b/packages/ui/src/components/dashboard/pure-dgtm-stats.stories_snapshots_WithError.html
index 900909b47c1f1597a26778236f20b71fd62f9454..3786ed450b7ef676482f1647f4e42339ed9ba9d2 100644
--- a/packages/ui/src/components/dashboard/pure-dgtm-stats.stories_snapshots_WithError.html
+++ b/packages/ui/src/components/dashboard/pure-dgtm-stats.stories_snapshots_WithError.html
@@ -1,5 +1,5 @@
 <div style="display: grid; grid-template-columns: 1fr 1fr 1fr;">
-  <div class="" style="display: flex; justify-content: center;">
+  <div class=" undefined" style="display: flex; justify-content: center;">
     <div>
       <div class="_tooltip_4f6ea8">
         <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
@@ -9,7 +9,7 @@
     </div>
     <!---->
   </div>
-  <div class="" style="display: flex; justify-content: center;">
+  <div class=" undefined" style="display: flex; justify-content: center;">
     <div>
       <div class="_tooltip_4f6ea8">
         <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
@@ -19,7 +19,7 @@
     </div>
     <!---->
   </div>
-  <div class="" style="display: flex; justify-content: center;">
+  <div class=" undefined" style="display: flex; justify-content: center;">
     <div>
       <div class="_tooltip_4f6ea8">
         <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
diff --git a/packages/ui/src/components/dashboard/pure-entreprise-dashboard.stories_snapshots_Loading.html b/packages/ui/src/components/dashboard/pure-entreprise-dashboard.stories_snapshots_Loading.html
index 5f7828f817df1ad7f8dfe3c0f843380e991e18ac..2faa56f363c43ef63fc5c777efcace96b8c6a775 100644
--- a/packages/ui/src/components/dashboard/pure-entreprise-dashboard.stories_snapshots_Loading.html
+++ b/packages/ui/src/components/dashboard/pure-entreprise-dashboard.stories_snapshots_Loading.html
@@ -8,7 +8,7 @@
       <div class="fr-ml-1w"><a href="/mocked-href" title="Demander un titre" class="fr-btn fr-btn--primary fr-btn--icon-right fr-icon-add-line" aria-label="Demander un titre">Demander un titre</a></div>
     </div>
   </div>
-  <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+  <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
     <!---->
     <div class="_spinner_3306d0"></div>
   </div>
diff --git a/packages/ui/src/components/dashboard/pure-entreprise-dashboard.stories_snapshots_WithError.html b/packages/ui/src/components/dashboard/pure-entreprise-dashboard.stories_snapshots_WithError.html
index b4acdf75acdd3957977e42eaf55bb43e81ce79c7..d4241add793eb160c22fe965e30752faaacc7c87 100644
--- a/packages/ui/src/components/dashboard/pure-entreprise-dashboard.stories_snapshots_WithError.html
+++ b/packages/ui/src/components/dashboard/pure-entreprise-dashboard.stories_snapshots_WithError.html
@@ -8,7 +8,7 @@
       <div class="fr-ml-1w"><a href="/mocked-href" title="Demander un titre" class="fr-btn fr-btn--primary fr-btn--icon-right fr-icon-add-line" aria-label="Demander un titre">Demander un titre</a></div>
     </div>
   </div>
-  <div class="" style="display: flex; justify-content: center;">
+  <div class=" undefined" style="display: flex; justify-content: center;">
     <div>
       <div class="_tooltip_4f6ea8">
         <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
diff --git a/packages/ui/src/components/demarche/demarche-etape.stories.tsx b/packages/ui/src/components/demarche/demarche-etape.stories.tsx
index d32cb5670a6c9a5a6a86b4f23fca7e124921259b..baeb96563f312922ac987897abeaee9f947e13ed 100644
--- a/packages/ui/src/components/demarche/demarche-etape.stories.tsx
+++ b/packages/ui/src/components/demarche/demarche-etape.stories.tsx
@@ -2,13 +2,13 @@ import { Meta, StoryFn } from '@storybook/vue3'
 import { DemarcheEtape } from './demarche-etape'
 import { EtapesTypesEtapesStatuts } from 'camino-common/src/static/etapesTypesEtapesStatuts'
 import { toCaminoDate } from 'camino-common/src/date'
-import { EtapeEntrepriseDocument, documentIdValidator, entrepriseDocumentIdValidator, entrepriseIdValidator } from 'camino-common/src/entreprise'
+import { EtapeEntrepriseDocument, entrepriseDocumentIdValidator, entrepriseIdValidator } from 'camino-common/src/entreprise'
 import { titreSlugValidator } from 'camino-common/src/validators/titres'
 import { Router } from 'vue-router'
 import { action } from '@storybook/addon-actions'
 import { vueRouter } from 'storybook-vue3-router'
 import { testBlankUser } from 'camino-common/src/tests-utils'
-import { EtapeDocument, etapeIdValidator, etapeSlugValidator } from 'camino-common/src/etape'
+import { EtapeDocument, etapeDocumentIdValidator, etapeIdValidator, etapeSlugValidator } from 'camino-common/src/etape'
 import { DOCUMENTS_TYPES_IDS } from 'camino-common/src/static/documentsTypes'
 import { ApiClient } from '@/api/api-client'
 import { FeatureMultiPolygon } from 'camino-common/src/perimetre'
@@ -57,29 +57,29 @@ const routerPushMock: Pick<Router, 'push'> = {
 }
 const documentsDemande: EtapeDocument[] = [
   {
-    id: documentIdValidator.parse('id'),
-    document_type_id: 'car',
+    id: etapeDocumentIdValidator.parse('id'),
+    etape_document_type_id: 'car',
     description: 'Une description',
     public_lecture: false,
     entreprises_lecture: false,
   },
   {
-    id: documentIdValidator.parse('id2'),
-    document_type_id: 'dom',
+    id: etapeDocumentIdValidator.parse('id2'),
+    etape_document_type_id: 'dom',
     description: null,
     public_lecture: true,
     entreprises_lecture: true,
   },
   {
-    id: documentIdValidator.parse('id3'),
-    document_type_id: 'for',
+    id: etapeDocumentIdValidator.parse('id3'),
+    etape_document_type_id: 'for',
     description: null,
     public_lecture: false,
     entreprises_lecture: true,
   },
   {
-    id: documentIdValidator.parse('id4'),
-    document_type_id: 'jpa',
+    id: etapeDocumentIdValidator.parse('id4'),
+    etape_document_type_id: 'jpa',
     description: null,
     public_lecture: false,
     entreprises_lecture: true,
@@ -133,22 +133,22 @@ const entrepriseDocumentsDemande: EtapeEntrepriseDocument[] = [
 
 const documents: EtapeDocument[] = [
   {
-    id: documentIdValidator.parse('id'),
-    document_type_id: 'aac',
+    id: etapeDocumentIdValidator.parse('id'),
+    etape_document_type_id: 'aac',
     description: 'Une description',
     public_lecture: false,
     entreprises_lecture: false,
   },
   {
-    id: documentIdValidator.parse('id2'),
-    document_type_id: 'acg',
+    id: etapeDocumentIdValidator.parse('id2'),
+    etape_document_type_id: 'acg',
     description: null,
     public_lecture: true,
     entreprises_lecture: true,
   },
   {
-    id: documentIdValidator.parse('id2'),
-    document_type_id: 'acm',
+    id: etapeDocumentIdValidator.parse('id2'),
+    etape_document_type_id: 'acm',
     description: null,
     public_lecture: false,
     entreprises_lecture: true,
@@ -183,6 +183,7 @@ export const NoSnapshotDemande: StoryFn = () => (
       ],
       administrationsLocales: [],
       sdom_zones: [],
+      etapes: [],
     }}
     user={{ ...testBlankUser, role: 'super' }}
     router={routerPushMock}
@@ -194,8 +195,7 @@ export const NoSnapshotDemande: StoryFn = () => (
       etape_type_id: EtapesTypesEtapesStatuts.demande.FAIT.etapeTypeId,
       etape_statut_id: EtapesTypesEtapesStatuts.demande.FAIT.etapeStatutId,
       date,
-      decisions_annexes_contenu: {},
-      decisions_annexes_sections: [],
+
       fondamentale: {
         date_debut: toCaminoDate('2023-10-25'),
         duree: 12,
@@ -292,7 +292,7 @@ export const NoSnapshotDemande: StoryFn = () => (
         },
       },
       sections_with_values: [{ id: 'arm', elements: [{ id: 'mecanise', type: 'radio', value: true, nom: 'Mécanisation' }], nom: 'Arm' }],
-      documents: [],
+      etape_documents: [],
       entreprises_documents: [],
     }}
   />
@@ -309,6 +309,7 @@ export const DemandeMultipleEntreprisesDocuments: StoryFn = () => (
       ],
       administrationsLocales: [],
       sdom_zones: [],
+      etapes: [],
     }}
     user={{ ...testBlankUser, role: 'super' }}
     router={routerPushMock}
@@ -318,8 +319,7 @@ export const DemandeMultipleEntreprisesDocuments: StoryFn = () => (
       slug: etapeSlugValidator.parse('etape-slug'),
       etape_type_id: EtapesTypesEtapesStatuts.demande.FAIT.etapeTypeId,
       etape_statut_id: EtapesTypesEtapesStatuts.demande.FAIT.etapeStatutId,
-      decisions_annexes_contenu: {},
-      decisions_annexes_sections: [],
+
       date,
       notes: 'Super note',
       fondamentale: {
@@ -351,7 +351,7 @@ export const DemandeMultipleEntreprisesDocuments: StoryFn = () => (
           ],
         },
       ],
-      documents,
+      etape_documents: documents,
       entreprises_documents: [
         ...entrepriseDocuments,
         {
@@ -376,7 +376,7 @@ export const DemandeMultipleEntreprisesDocuments: StoryFn = () => (
 export const DemandeNoMap: StoryFn = () => (
   <DemarcheEtape
     titre={{ titreStatutId: 'val', typeId: 'arm', nom: 'nom du titre', slug: titreSlug }}
-    demarche={{ demarche_type_id: 'oct', titulaires: [{ id: entrepriseIdValidator.parse('titulaire1'), nom: 'titulaire1' }], administrationsLocales: [], sdom_zones: [] }}
+    demarche={{ demarche_type_id: 'oct', titulaires: [{ id: entrepriseIdValidator.parse('titulaire1'), nom: 'titulaire1' }], administrationsLocales: [], sdom_zones: [], etapes: [] }}
     user={{ ...testBlankUser, role: 'super' }}
     router={routerPushMock}
     apiClient={apiClient}
@@ -386,8 +386,7 @@ export const DemandeNoMap: StoryFn = () => (
       slug: etapeSlugValidator.parse('etape-slug'),
       etape_type_id: EtapesTypesEtapesStatuts.demande.FAIT.etapeTypeId,
       etape_statut_id: EtapesTypesEtapesStatuts.demande.FAIT.etapeStatutId,
-      decisions_annexes_contenu: {},
-      decisions_annexes_sections: [],
+
       date,
       fondamentale: {
         date_debut: toCaminoDate('2023-10-25'),
@@ -418,7 +417,7 @@ export const DemandeNoMap: StoryFn = () => (
           ],
         },
       ],
-      documents,
+      etape_documents: documents,
       entreprises_documents: entrepriseDocuments,
     }}
   />
@@ -427,7 +426,7 @@ export const DemandeNoMap: StoryFn = () => (
 export const DemandeNonDeposable: StoryFn = () => (
   <DemarcheEtape
     titre={{ titreStatutId: 'val', typeId: 'arm', nom: 'nom du titre', slug: titreSlug }}
-    demarche={{ demarche_type_id: 'oct', titulaires: [], administrationsLocales: [], sdom_zones: [] }}
+    demarche={{ demarche_type_id: 'oct', titulaires: [], administrationsLocales: [], sdom_zones: [], etapes: [] }}
     user={{ ...testBlankUser, role: 'super' }}
     router={routerPushMock}
     apiClient={apiClient}
@@ -438,8 +437,7 @@ export const DemandeNonDeposable: StoryFn = () => (
       etape_type_id: EtapesTypesEtapesStatuts.demande.EN_CONSTRUCTION.etapeTypeId,
       etape_statut_id: EtapesTypesEtapesStatuts.demande.EN_CONSTRUCTION.etapeStatutId,
       date,
-      decisions_annexes_contenu: {},
-      decisions_annexes_sections: [],
+
       fondamentale: {
         date_debut: toCaminoDate('2023-10-25'),
         duree: 12,
@@ -453,7 +451,7 @@ export const DemandeNonDeposable: StoryFn = () => (
         perimetre: null,
       },
       sections_with_values: [{ id: 'arm', elements: [{ id: 'mecanise', type: 'radio', value: true, nom: 'Mécanisation' }], nom: 'Arm' }],
-      documents: [],
+      etape_documents: [],
       entreprises_documents: [],
     }}
   />
@@ -498,7 +496,7 @@ const demandeArmMecaniseNonDeposable: FeatureMultiPolygon = {
 export const DemandeArmMecaniseNonDeposable: StoryFn = () => (
   <DemarcheEtape
     titre={{ titreStatutId: 'val', typeId: 'arm', nom: 'nom du titre', slug: titreSlug }}
-    demarche={{ demarche_type_id: 'oct', titulaires: [{ id: entrepriseIdValidator.parse('entrepriseId'), nom: 'titulaire1' }], administrationsLocales: [], sdom_zones: [] }}
+    demarche={{ demarche_type_id: 'oct', titulaires: [{ id: entrepriseIdValidator.parse('entrepriseId'), nom: 'titulaire1' }], administrationsLocales: [], sdom_zones: [], etapes: [] }}
     user={{ ...testBlankUser, role: 'super' }}
     router={routerPushMock}
     apiClient={apiClient}
@@ -510,8 +508,7 @@ export const DemandeArmMecaniseNonDeposable: StoryFn = () => (
       etape_type_id: EtapesTypesEtapesStatuts.demande.EN_CONSTRUCTION.etapeTypeId,
       etape_statut_id: EtapesTypesEtapesStatuts.demande.EN_CONSTRUCTION.etapeStatutId,
       date,
-      decisions_annexes_contenu: {},
-      decisions_annexes_sections: [],
+
       fondamentale: {
         date_debut: toCaminoDate('2023-10-25'),
         duree: 12,
@@ -538,7 +535,7 @@ export const DemandeArmMecaniseNonDeposable: StoryFn = () => (
         },
       },
       sections_with_values: [{ id: 'arm', elements: [{ id: 'mecanise', type: 'radio', value: true, nom: 'Mécanisation' }], nom: 'Arm' }],
-      documents: documentsDemande,
+      etape_documents: documentsDemande,
       entreprises_documents: entrepriseDocumentsDemande,
     }}
   />
@@ -583,7 +580,7 @@ const demandeArmMecaniseDeposable: FeatureMultiPolygon = {
 export const DemandeArmMecaniseDeposable: StoryFn = () => (
   <DemarcheEtape
     titre={{ titreStatutId: 'val', typeId: 'arm', nom: 'nom du titre', slug: titreSlug }}
-    demarche={{ demarche_type_id: 'oct', titulaires: [{ id: entrepriseIdValidator.parse('entrepriseId'), nom: 'titulaire1' }], administrationsLocales: [], sdom_zones: [] }}
+    demarche={{ demarche_type_id: 'oct', titulaires: [{ id: entrepriseIdValidator.parse('entrepriseId'), nom: 'titulaire1' }], administrationsLocales: [], sdom_zones: [], etapes: [] }}
     user={{ ...testBlankUser, role: 'super' }}
     router={routerPushMock}
     apiClient={apiClient}
@@ -595,8 +592,7 @@ export const DemandeArmMecaniseDeposable: StoryFn = () => (
       etape_type_id: EtapesTypesEtapesStatuts.demande.EN_CONSTRUCTION.etapeTypeId,
       etape_statut_id: EtapesTypesEtapesStatuts.demande.EN_CONSTRUCTION.etapeStatutId,
       date,
-      decisions_annexes_contenu: {},
-      decisions_annexes_sections: [],
+
       fondamentale: {
         date_debut: toCaminoDate('2023-10-25'),
         duree: 12,
@@ -623,10 +619,10 @@ export const DemandeArmMecaniseDeposable: StoryFn = () => (
         },
       },
       sections_with_values: [{ id: 'arm', elements: [{ id: 'mecanise', type: 'radio', value: true, nom: 'Mécanisation' }], nom: 'Arm' }],
-      documents: [
+      etape_documents: [
         ...documentsDemande,
-        { id: documentIdValidator.parse('idDoe'), document_type_id: 'doe', public_lecture: true, entreprises_lecture: true, description: null },
-        { id: documentIdValidator.parse('idDep'), document_type_id: 'dep', public_lecture: true, entreprises_lecture: true, description: null },
+        { id: etapeDocumentIdValidator.parse('idDoe'), etape_document_type_id: 'doe', public_lecture: true, entreprises_lecture: true, description: null },
+        { id: etapeDocumentIdValidator.parse('idDep'), etape_document_type_id: 'dep', public_lecture: true, entreprises_lecture: true, description: null },
       ],
       entreprises_documents: entrepriseDocumentsDemande,
     }}
@@ -672,7 +668,7 @@ const demandeArmNonMecaniseDeposable: FeatureMultiPolygon = {
 export const DemandeArmNonMecaniseDeposable: StoryFn = () => (
   <DemarcheEtape
     titre={{ titreStatutId: 'val', typeId: 'arm', nom: 'nom du titre', slug: titreSlug }}
-    demarche={{ demarche_type_id: 'oct', titulaires: [{ id: entrepriseIdValidator.parse('entrepriseId'), nom: 'titulaire1' }], administrationsLocales: [], sdom_zones: [] }}
+    demarche={{ demarche_type_id: 'oct', titulaires: [{ id: entrepriseIdValidator.parse('entrepriseId'), nom: 'titulaire1' }], administrationsLocales: [], sdom_zones: [], etapes: [] }}
     user={{ ...testBlankUser, role: 'super' }}
     router={routerPushMock}
     apiClient={apiClient}
@@ -684,8 +680,7 @@ export const DemandeArmNonMecaniseDeposable: StoryFn = () => (
       etape_type_id: EtapesTypesEtapesStatuts.demande.EN_CONSTRUCTION.etapeTypeId,
       etape_statut_id: EtapesTypesEtapesStatuts.demande.EN_CONSTRUCTION.etapeStatutId,
       date,
-      decisions_annexes_contenu: {},
-      decisions_annexes_sections: [],
+
       fondamentale: {
         date_debut: toCaminoDate('2023-10-25'),
         duree: 12,
@@ -712,7 +707,7 @@ export const DemandeArmNonMecaniseDeposable: StoryFn = () => (
         },
       },
       sections_with_values: [{ id: 'arm', elements: [{ id: 'mecanise', type: 'radio', value: false, nom: 'Mécanisation' }], nom: 'Arm' }],
-      documents: documentsDemande,
+      etape_documents: documentsDemande,
       entreprises_documents: entrepriseDocumentsDemande,
     }}
   />
@@ -721,7 +716,7 @@ export const DemandeArmNonMecaniseDeposable: StoryFn = () => (
 export const Depot: StoryFn = () => (
   <DemarcheEtape
     titre={{ titreStatutId: 'val', typeId: 'arm', nom: 'nom du titre', slug: titreSlug }}
-    demarche={{ demarche_type_id: 'oct', titulaires: [{ id: entrepriseIdValidator.parse('titulaire1'), nom: 'titulaire1' }], administrationsLocales: [], sdom_zones: [] }}
+    demarche={{ demarche_type_id: 'oct', titulaires: [{ id: entrepriseIdValidator.parse('titulaire1'), nom: 'titulaire1' }], administrationsLocales: [], sdom_zones: [], etapes: [] }}
     router={routerPushMock}
     user={{ ...testBlankUser, role: 'super' }}
     etape={{
@@ -732,9 +727,7 @@ export const Depot: StoryFn = () => (
       etape_statut_id: EtapesTypesEtapesStatuts.depotDeLaDemande.FAIT.etapeStatutId,
       date,
       sections_with_values: [],
-      decisions_annexes_contenu: {},
-      decisions_annexes_sections: [],
-      documents,
+      etape_documents: documents,
       entreprises_documents: entrepriseDocuments,
     }}
     apiClient={apiClient}
@@ -744,7 +737,7 @@ export const Depot: StoryFn = () => (
 export const AvisDefavorable: StoryFn = () => (
   <DemarcheEtape
     titre={{ titreStatutId: 'val', typeId: 'arm', nom: 'nom du titre', slug: titreSlug }}
-    demarche={{ demarche_type_id: 'oct', titulaires: [], administrationsLocales: [], sdom_zones: [] }}
+    demarche={{ demarche_type_id: 'oct', titulaires: [], administrationsLocales: [], sdom_zones: [], etapes: [] }}
     user={{ ...testBlankUser, role: 'super' }}
     router={routerPushMock}
     etape={{
@@ -755,9 +748,8 @@ export const AvisDefavorable: StoryFn = () => (
       etape_statut_id: EtapesTypesEtapesStatuts.avisDGTMServiceAmenagementUrbanismeConstructionLogement_AUCL_.DEFAVORABLE.etapeStatutId,
       date,
       sections_with_values: [],
-      decisions_annexes_contenu: {},
-      decisions_annexes_sections: [],
-      documents: [],
+
+      etape_documents: [],
       entreprises_documents: [],
     }}
     apiClient={apiClient}
@@ -785,7 +777,7 @@ const demandeAvecSeulementPerimetre: FeatureMultiPolygon = {
 export const DemandeAvecSeulementPerimetre: StoryFn = () => (
   <DemarcheEtape
     titre={{ titreStatutId: 'val', typeId: 'arm', nom: 'nom du titre', slug: titreSlug }}
-    demarche={{ demarche_type_id: 'oct', titulaires: [], administrationsLocales: [], sdom_zones: [] }}
+    demarche={{ demarche_type_id: 'oct', titulaires: [], administrationsLocales: [], sdom_zones: [], etapes: [] }}
     user={{ ...testBlankUser, role: 'super' }}
     router={routerPushMock}
     apiClient={apiClient}
@@ -797,8 +789,7 @@ export const DemandeAvecSeulementPerimetre: StoryFn = () => (
       etape_type_id: EtapesTypesEtapesStatuts.demande.EN_CONSTRUCTION.etapeTypeId,
       etape_statut_id: EtapesTypesEtapesStatuts.demande.EN_CONSTRUCTION.etapeStatutId,
       date,
-      decisions_annexes_contenu: {},
-      decisions_annexes_sections: [],
+
       fondamentale: {
         date_debut: null,
         duree: null,
@@ -822,7 +813,7 @@ export const DemandeAvecSeulementPerimetre: StoryFn = () => (
         },
       },
       sections_with_values: [],
-      documents: [],
+      etape_documents: [],
       entreprises_documents: [],
     }}
   />
@@ -849,7 +840,7 @@ const demandeAvecGrosseNote: FeatureMultiPolygon = {
 export const DemandeAvecGrosseNote: StoryFn = () => (
   <DemarcheEtape
     titre={{ titreStatutId: 'val', typeId: 'arm', nom: 'nom du titre', slug: titreSlug }}
-    demarche={{ demarche_type_id: 'oct', titulaires: [], administrationsLocales: [], sdom_zones: [] }}
+    demarche={{ demarche_type_id: 'oct', titulaires: [], administrationsLocales: [], sdom_zones: [], etapes: [] }}
     user={{ ...testBlankUser, role: 'super' }}
     router={routerPushMock}
     apiClient={apiClient}
@@ -861,8 +852,7 @@ export const DemandeAvecGrosseNote: StoryFn = () => (
       etape_type_id: EtapesTypesEtapesStatuts.demande.EN_CONSTRUCTION.etapeTypeId,
       etape_statut_id: EtapesTypesEtapesStatuts.demande.EN_CONSTRUCTION.etapeStatutId,
       date,
-      decisions_annexes_contenu: {},
-      decisions_annexes_sections: [],
+
       fondamentale: {
         date_debut: null,
         duree: null,
@@ -886,8 +876,130 @@ export const DemandeAvecGrosseNote: StoryFn = () => (
         },
       },
       sections_with_values: [],
-      documents: [],
+      etape_documents: [],
       entreprises_documents: [],
     }}
   />
 )
+
+export const AxmDeposableAvecDaeEtAsl: StoryFn = () => (
+  <DemarcheEtape
+    titre={{ titreStatutId: 'dmi', typeId: 'axm', nom: 'nom du titre', slug: titreSlug }}
+    demarche={{
+      demarche_type_id: 'oct',
+      titulaires: [{ id: entrepriseIdValidator.parse('entrepriseId'), nom: 'nom entreprise' }],
+      administrationsLocales: [],
+      sdom_zones: [],
+      etapes: [
+        {
+          date: toCaminoDate('2024-04-22'),
+          id: etapeIdValidator.parse('idDae'),
+          entreprises_documents: [],
+          etape_documents: [],
+          etape_statut_id: 'exe',
+          etape_type_id: 'dae',
+          notes: null,
+          sections_with_values: [],
+          ordre: 1,
+          slug: etapeSlugValidator.parse('slug-dae'),
+        },
+        {
+          date: toCaminoDate('2024-04-22'),
+          id: etapeIdValidator.parse('idAsl'),
+          entreprises_documents: [],
+          etape_documents: [],
+          etape_statut_id: 'exe',
+          etape_type_id: 'asl',
+          notes: null,
+          sections_with_values: [],
+          ordre: 2,
+          slug: etapeSlugValidator.parse('slug-asl'),
+        },
+      ],
+    }}
+    user={{ ...testBlankUser, role: 'entreprise', entreprises: [{ id: entrepriseIdValidator.parse('entrepriseId'), nom: 'nom entreprise' }] }}
+    router={routerPushMock}
+    apiClient={apiClient}
+    initTab="points"
+    etape={{
+      id: etapeIdValidator.parse('etapeId'),
+      slug: etapeSlugValidator.parse('etape-slug'),
+      notes: '',
+      etape_type_id: EtapesTypesEtapesStatuts.demande.EN_CONSTRUCTION.etapeTypeId,
+      etape_statut_id: EtapesTypesEtapesStatuts.demande.EN_CONSTRUCTION.etapeStatutId,
+      date,
+
+      fondamentale: {
+        date_debut: null,
+        duree: 4,
+        date_fin: null,
+        substances: ['auru'],
+        titulaires: [{ id: entrepriseIdValidator.parse('entrepriseId'), operateur: false, nom: 'nom entreprise' }],
+        amodiataires: [],
+        perimetre: {
+          geojson4326_points: null,
+          geojson4326_perimetre: demandeAvecGrosseNote,
+          geojson_origine_geo_systeme_id: '4326',
+          geojson_origine_perimetre: demandeAvecGrosseNote,
+          geojson_origine_points: null,
+          geojson4326_forages: null,
+          geojson_origine_forages: null,
+          surface: 0,
+          communes: [],
+          sdom_zones: [],
+          forets: [],
+          secteurs_maritimes: [],
+        },
+      },
+      sections_with_values: [],
+      etape_documents: [
+        ...documentsDemande,
+        { id: etapeDocumentIdValidator.parse('idlem'), etape_document_type_id: 'lem', description: null, entreprises_lecture: true, public_lecture: true },
+        { id: etapeDocumentIdValidator.parse('ididm'), etape_document_type_id: 'idm', description: null, entreprises_lecture: true, public_lecture: true },
+        { id: etapeDocumentIdValidator.parse('idmes'), etape_document_type_id: 'mes', description: null, entreprises_lecture: true, public_lecture: true },
+        { id: etapeDocumentIdValidator.parse('idmet'), etape_document_type_id: 'met', description: null, entreprises_lecture: true, public_lecture: true },
+        { id: etapeDocumentIdValidator.parse('idprg'), etape_document_type_id: 'prg', description: null, entreprises_lecture: true, public_lecture: true },
+        { id: etapeDocumentIdValidator.parse('idsch'), etape_document_type_id: 'sch', description: null, entreprises_lecture: true, public_lecture: true },
+      ],
+      entreprises_documents: [
+        ...entrepriseDocumentsDemande,
+
+        {
+          entreprise_document_type_id: 'lis',
+          date: toCaminoDate('2024-04-22'),
+          description: null,
+          entreprise_id: entrepriseIdValidator.parse('entrepriseId'),
+          id: entrepriseDocumentIdValidator.parse('idlis'),
+        },
+        {
+          entreprise_document_type_id: 'jac',
+          date: toCaminoDate('2024-04-22'),
+          description: null,
+          entreprise_id: entrepriseIdValidator.parse('entrepriseId'),
+          id: entrepriseDocumentIdValidator.parse('idjac'),
+        },
+        {
+          entreprise_document_type_id: 'bil',
+          date: toCaminoDate('2024-04-22'),
+          description: null,
+          entreprise_id: entrepriseIdValidator.parse('entrepriseId'),
+          id: entrepriseDocumentIdValidator.parse('idbil'),
+        },
+        {
+          entreprise_document_type_id: 'ref',
+          date: toCaminoDate('2024-04-22'),
+          description: null,
+          entreprise_id: entrepriseIdValidator.parse('entrepriseId'),
+          id: entrepriseDocumentIdValidator.parse('idref'),
+        },
+        {
+          entreprise_document_type_id: 'deb',
+          date: toCaminoDate('2024-04-22'),
+          description: null,
+          entreprise_id: entrepriseIdValidator.parse('entrepriseId'),
+          id: entrepriseDocumentIdValidator.parse('iddeb'),
+        },
+      ],
+    }}
+  />
+)
diff --git a/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_AxmDeposableAvecDaeEtAsl.html b/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_AxmDeposableAvecDaeEtAsl.html
new file mode 100644
index 0000000000000000000000000000000000000000..0f15eba823e7a35490614943495898a72cc09bb2
--- /dev/null
+++ b/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_AxmDeposableAvecDaeEtAsl.html
@@ -0,0 +1,288 @@
+<div class="dsfr">
+  <div class="fr-pb-2w fr-pl-2w fr-pr-2w fr-tile--shadow">
+    <div class="_sticky_964a6e fr-pt-1w">
+      <div style="display: flex; justify-content: space-between; align-items: center;">
+        <div class="fr-text--lg fr-mb-0" style="font-weight: 500;">Demande</div>
+        <div style="display: flex;"><button class="fr-btn fr-btn--primary fr-btn--md fr-mr-1v" title="Déposer la demande" aria-label="Déposer la demande" type="button">Déposer</button><a href="/mocked-href" title="Modifier l’étape" class="fr-mr-1v fr-btn fr-btn--secondary fr-icon-pencil-line" aria-label="Modifier l’étape">Modifier l’étape</a><button class="fr-btn fr-btn--secondary fr-btn--md fr-icon-delete-bin-line fr-mr-1v" title="Supprimer l’étape" aria-label="Supprimer l’étape" type="button">
+            <!---->
+          </button>
+          <div style="display: flex;">
+            <!----><button class="fr-btn fr-btn--secondary fr-btn--md fr-icon-file-download-line" title="Télécharger l’ensemble de la demande dans un fichier .zip" aria-label="Télécharger l’ensemble de la demande dans un fichier .zip" type="button">
+              <!---->
+            </button>
+          </div>
+        </div>
+      </div>
+      <p style="z-index: unset; margin-bottom: 0px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;" class="fr-badge fr-badge--md fr-badge--orange-terre-battue" title="en construction" aria-label="en construction">en construction</p>
+      <div class="fr-mt-1w"><span class="fr-icon-calendar-line" aria-hidden="true"></span> 24-10-2023</div>
+    </div>
+    <div class="fr-mb-3w fr-mt-3w" style="height: 1px; width: 100%;"></div>
+    <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); align-content: flex-start; column-gap: 16px; row-gap: 8px;">
+      <!---->
+      <div>
+        <div class="fr-text--sm fr-mb-0">Durée</div>
+        <div class="fr-text--md fr-mb-0" style="font-weight: 500;"><span><!----><!----><span>4 mois</span></span></div>
+      </div>
+      <!---->
+      <div>
+        <div class="fr-text--sm fr-mb-0">Substances</div>
+        <div class="fr-text--md fr-mb-0" style="font-weight: 500;">Or</div>
+      </div>
+      <div>
+        <div class="fr-text--sm fr-mb-0">Titulaire</div>
+        <div class="fr-text--md fr-mb-0" style="font-weight: 500;">
+          <ul class="fr-m-0 fr-p-0" style="list-style: none;">
+            <li><a href="/mocked-href" title="nom entreprise" class="fr-link" aria-label="nom entreprise">Nom entreprise</a></li>
+          </ul>
+        </div>
+      </div>
+      <!---->
+      <div>
+        <div class="fr-text--sm fr-mb-0">Surface</div>
+        <div class="fr-text--md fr-mb-0" style="font-weight: 500;">0 km² environ</div>
+      </div>
+      <div style="grid-column: 1 / -1; white-space: pre-line;">
+        <div class="fr-text--sm fr-mb-0">Notes</div>
+        <div class="fr-text--md fr-mb-0" style="font-weight: 500;"></div>
+      </div>
+    </div>
+    <div class="dsfr fr-pt-2w">
+      <div class="fr-tabs">
+        <ul class="fr-tabs__list" role="tablist" aria-label="Affichage des titres en vue carte ou tableau">
+          <li role="presentation"><button id="tabpanel-carte-271" class="fr-tabs__tab fr-icon-earth-fill fr-tabs__tab--icon-left" tabindex="-1" role="tab" aria-label="Carte" aria-selected="false" aria-controls="tabpanel-carte-271-panel">Carte</button></li>
+          <li role="presentation"><button id="tabpanel-points-271" class="fr-tabs__tab fr-icon-list-unordered fr-tabs__tab--icon-left" tabindex="0" role="tab" aria-label="Tableau" aria-selected="true" aria-controls="tabpanel-points-271-panel">Tableau</button></li>
+        </ul>
+        <div id="tabpanel-carte-271-panel" class="fr-tabs__panel" role="tabpanel" aria-labelledby="tabpanel-carte-271" tabindex="0">
+          <!---->
+        </div>
+        <div id="tabpanel-points-271-panel" class="fr-tabs__panel fr-tabs__panel--selected" role="tabpanel" aria-labelledby="tabpanel-points-271" tabindex="0">
+          <div style="display: flex; flex-direction: column;">
+            <div id="typeahead_670_wrapper" class="_typeahead_8eddf1 dsfr">
+              <div class="flex"><input id="typeahead_670" type="text" name="typeahead_670" disabled="" class="_typeahead-input_8eddf1 fr-input" placeholder="" autocomplete="off"></div>
+              <!---->
+            </div>
+            <div style="display: flex; flex-direction: column;">
+              <div style="overflow-x: auto;" class="fr-mb-1w">
+                <div class="fr-table">
+                  <table style="display: table;">
+                    <caption></caption>
+                    <thead>
+                      <tr>
+                        <th scope="col" class="nowrap">
+                          <div class="fr-text--md">Nom du point</div>
+                        </th>
+                        <th scope="col" class="nowrap">
+                          <div class="fr-text--md">Description</div>
+                        </th>
+                        <th scope="col" class="nowrap">
+                          <div class="fr-text--md">Longitude</div>
+                        </th>
+                        <th scope="col" class="nowrap">
+                          <div class="fr-text--md">Latitude</div>
+                        </th>
+                        <th scope="col" class="nowrap">
+                          <div class="fr-text--md">Longitude (E)</div>
+                        </th>
+                        <th scope="col" class="nowrap">
+                          <div class="fr-text--md">Latitude (N)</div>
+                        </th>
+                      </tr>
+                    </thead>
+                    <tbody>
+                      <tr>
+                        <td class=""><span class="">A</span></td>
+                        <td class=""><span class="">Polygone 1</span></td>
+                        <td class=""><span class="">-53.58181013905019</span></td>
+                        <td class=""><span class="">3.8309654861273</span></td>
+                        <td class=""><span class="">-53°34,909'</span></td>
+                        <td class=""><span class="">3°49,858'</span></td>
+                      </tr>
+                      <tr>
+                        <td class=""><span class="">B</span></td>
+                        <td class=""><span class="">Polygone 1</span></td>
+                        <td class=""><span class="">-53.58178306390299</span></td>
+                        <td class=""><span class="">3.8219278216269807</span></td>
+                        <td class=""><span class="">-53°34,907'</span></td>
+                        <td class=""><span class="">3°49,316'</span></td>
+                      </tr>
+                      <tr>
+                        <td class=""><span class="">C</span></td>
+                        <td class=""><span class="">Polygone 1</span></td>
+                        <td class=""><span class="">-53.572785590706495</span></td>
+                        <td class=""><span class="">3.82195493825841</span></td>
+                        <td class=""><span class="">-53°34,367'</span></td>
+                        <td class=""><span class="">3°49,317'</span></td>
+                      </tr>
+                      <tr>
+                        <td class=""><span class="">D</span></td>
+                        <td class=""><span class="">Polygone 1</span></td>
+                        <td class=""><span class="">-53.57281257175149</span></td>
+                        <td class=""><span class="">3.8309926670647294</span></td>
+                        <td class=""><span class="">-53°34,369'</span></td>
+                        <td class=""><span class="">3°49,86'</span></td>
+                      </tr>
+                    </tbody>
+                  </table>
+                </div>
+              </div><a class="fr-btn fr-btn--secondary fr-btn--icon-right fr-icon-download-line" title="Télécharge les points au format csv" href="data:text/csv;charset=utf-8,nom;description;longitude;latitude;x_deg;y_deg%0AA;Polygone%201;-53.58181013905019;3.8309654861273;-53%C2%B034,909';3%C2%B049,858'%0AB;Polygone%201;-53.58178306390299;3.8219278216269807;-53%C2%B034,907';3%C2%B049,316'%0AC;Polygone%201;-53.572785590706495;3.82195493825841;-53%C2%B034,367';3%C2%B049,317'%0AD;Polygone%201;-53.57281257175149;3.8309926670647294;-53%C2%B034,369';3%C2%B049,86'" download="points-titre-slug.csv" style="align-self: end;">.csv</a>
+            </div>
+            <!---->
+          </div>
+        </div>
+      </div>
+    </div>
+    <div style="overflow-x: auto;">
+      <div class=" fr-table fr-m-0">
+        <table style="display: table;" class="fr-table--no-caption fr-m-0">
+          <caption>Documents</caption>
+          <thead>
+            <tr>
+              <th scope="col">Nom</th>
+              <th scope="col">Description</th>
+              <!---->
+            </tr>
+          </thead>
+          <tbody>
+            <tr>
+              <td><a href="/apiUrl/download/fichiers/id" title="Télécharger le document Documents cartographiques - nouvelle fenêtre" target="_blank">Documents cartographiques</a></td>
+              <td>Une description</td>
+              <!---->
+            </tr>
+            <tr>
+              <td><a href="/apiUrl/download/fichiers/id2" title="Télécharger le document Dossier de demande - nouvelle fenêtre" target="_blank">Dossier de demande</a></td>
+              <td>
+                <!---->
+              </td>
+              <!---->
+            </tr>
+            <tr>
+              <td><a href="/apiUrl/download/fichiers/id3" title="Télécharger le document Formulaire de demande - nouvelle fenêtre" target="_blank">Formulaire de demande</a></td>
+              <td>
+                <!---->
+              </td>
+              <!---->
+            </tr>
+            <tr>
+              <td><a href="/apiUrl/download/fichiers/id4" title="Télécharger le document Justificatif de paiement - nouvelle fenêtre" target="_blank">Justificatif de paiement</a></td>
+              <td>
+                <!---->
+              </td>
+              <!---->
+            </tr>
+            <tr>
+              <td><a href="/apiUrl/download/fichiers/idlem" title="Télécharger le document Lettre de demande - nouvelle fenêtre" target="_blank">Lettre de demande</a></td>
+              <td>
+                <!---->
+              </td>
+              <!---->
+            </tr>
+            <tr>
+              <td><a href="/apiUrl/download/fichiers/ididm" title="Télécharger le document Identification de matériel - nouvelle fenêtre" target="_blank">Identification de matériel</a></td>
+              <td>
+                <!---->
+              </td>
+              <!---->
+            </tr>
+            <tr>
+              <td><a href="/apiUrl/download/fichiers/idmes" title="Télécharger le document Mesures prévues pour réhabiliter le site  - nouvelle fenêtre" target="_blank">Mesures prévues pour réhabiliter le site </a></td>
+              <td>
+                <!---->
+              </td>
+              <!---->
+            </tr>
+            <tr>
+              <td><a href="/apiUrl/download/fichiers/idmet" title="Télécharger le document Méthodes pour l'exécution des travaux - nouvelle fenêtre" target="_blank">Méthodes pour l'exécution des travaux</a></td>
+              <td>
+                <!---->
+              </td>
+              <!---->
+            </tr>
+            <tr>
+              <td><a href="/apiUrl/download/fichiers/idprg" title="Télécharger le document Programme des travaux  - nouvelle fenêtre" target="_blank">Programme des travaux </a></td>
+              <td>
+                <!---->
+              </td>
+              <!---->
+            </tr>
+            <tr>
+              <td><a href="/apiUrl/download/fichiers/idsch" title="Télécharger le document Schéma de pénétration du massif forestier - nouvelle fenêtre" target="_blank">Schéma de pénétration du massif forestier</a></td>
+              <td>
+                <!---->
+              </td>
+              <!---->
+            </tr>
+            <tr>
+              <td><a href="/apiUrl/download/entrepriseDocuments/id" title="Télécharger le document nom entreprise - Attestation fiscale - (2023-01-01) - nouvelle fenêtre" target="_blank">nom entreprise - Attestation fiscale - (2023-01-01)</a></td>
+              <td>
+                <!---->
+              </td>
+              <!---->
+            </tr>
+            <tr>
+              <td><a href="/apiUrl/download/entrepriseDocuments/id2" title="Télécharger le document nom entreprise - Curriculum vitae - (2023-03-01) - nouvelle fenêtre" target="_blank">nom entreprise - Curriculum vitae - (2023-03-01)</a></td>
+              <td>Une description</td>
+              <!---->
+            </tr>
+            <tr>
+              <td><a href="/apiUrl/download/entrepriseDocuments/id3" title="Télécharger le document nom entreprise - Justificatif d’identité - (2023-03-01) - nouvelle fenêtre" target="_blank">nom entreprise - Justificatif d’identité - (2023-03-01)</a></td>
+              <td>Une description</td>
+              <!---->
+            </tr>
+            <tr>
+              <td><a href="/apiUrl/download/entrepriseDocuments/id4" title="Télécharger le document nom entreprise - Justificatif des capacités techniques - (2023-03-01) - nouvelle fenêtre" target="_blank">nom entreprise - Justificatif des capacités techniques - (2023-03-01)</a></td>
+              <td>Une description</td>
+              <!---->
+            </tr>
+            <tr>
+              <td><a href="/apiUrl/download/entrepriseDocuments/id5" title="Télécharger le document nom entreprise - Kbis - (2023-03-01) - nouvelle fenêtre" target="_blank">nom entreprise - Kbis - (2023-03-01)</a></td>
+              <td>Une description</td>
+              <!---->
+            </tr>
+            <tr>
+              <td><a href="/apiUrl/download/entrepriseDocuments/id3" title="Télécharger le document nom entreprise - Justificatif des capacités financières - (2023-03-01) - nouvelle fenêtre" target="_blank">nom entreprise - Justificatif des capacités financières - (2023-03-01)</a></td>
+              <td>Une description</td>
+              <!---->
+            </tr>
+            <tr>
+              <td><a href="/apiUrl/download/entrepriseDocuments/idlis" title="Télécharger le document nom entreprise - Liste des travaux antérieurs - (2024-04-22) - nouvelle fenêtre" target="_blank">nom entreprise - Liste des travaux antérieurs - (2024-04-22)</a></td>
+              <td>
+                <!---->
+              </td>
+              <!---->
+            </tr>
+            <tr>
+              <td><a href="/apiUrl/download/entrepriseDocuments/idjac" title="Télécharger le document nom entreprise - Justificatif d’adhésion à la charte des bonnes pratiques - (2024-04-22) - nouvelle fenêtre" target="_blank">nom entreprise - Justificatif d’adhésion à la charte des bonnes pratiques - (2024-04-22)</a></td>
+              <td>
+                <!---->
+              </td>
+              <!---->
+            </tr>
+            <tr>
+              <td><a href="/apiUrl/download/entrepriseDocuments/idbil" title="Télécharger le document nom entreprise - 3 derniers bilans et comptes de résultats - (2024-04-22) - nouvelle fenêtre" target="_blank">nom entreprise - 3 derniers bilans et comptes de résultats - (2024-04-22)</a></td>
+              <td>
+                <!---->
+              </td>
+              <!---->
+            </tr>
+            <tr>
+              <td><a href="/apiUrl/download/entrepriseDocuments/idref" title="Télécharger le document nom entreprise - Références professionnelles  - (2024-04-22) - nouvelle fenêtre" target="_blank">nom entreprise - Références professionnelles - (2024-04-22)</a></td>
+              <td>
+                <!---->
+              </td>
+              <!---->
+            </tr>
+            <tr>
+              <td><a href="/apiUrl/download/entrepriseDocuments/iddeb" title="Télécharger le document nom entreprise - Déclarations bancaires ou cautions appropriées - (2024-04-22) - nouvelle fenêtre" target="_blank">nom entreprise - Déclarations bancaires ou cautions appropriées - (2024-04-22)</a></td>
+              <td>
+                <!---->
+              </td>
+              <!---->
+            </tr>
+          </tbody>
+        </table>
+      </div>
+    </div>
+    <!---->
+    <!---->
+  </div>
+</div>
\ No newline at end of file
diff --git a/packages/ui/src/components/demarche/demarche-etape.tsx b/packages/ui/src/components/demarche/demarche-etape.tsx
index 27a27fc093fd7e36c37b7db85b4cea24ee3ce40f..94de72df92debf2a932f0a49cae4118e2c2128a4 100644
--- a/packages/ui/src/components/demarche/demarche-etape.tsx
+++ b/packages/ui/src/components/demarche/demarche-etape.tsx
@@ -31,6 +31,8 @@ import { RemoveEtapePopup } from './remove-etape-popup'
 import { SDOMZoneId } from 'camino-common/src/static/sdom'
 import { DeposeEtapePopup } from './depose-etape-popup'
 import { ApiClient } from '@/api/api-client'
+import { TitreGetDemarche } from 'camino-common/src/titres'
+import { GetEtapeDocumentsByEtapeId, documentTypeIdComplementaireObligatoireASL, documentTypeIdComplementaireObligatoireDAE, etapeDocumentIdValidator, needAslAndDae } from 'camino-common/src/etape'
 // Il ne faut pas utiliser de literal dans le 'in' il n'y aura jamais d'erreur typescript
 const fondamentalePropsName = 'fondamentale'
 
@@ -41,6 +43,7 @@ type Props = {
     administrationsLocales: AdministrationId[]
     demarche_type_id: DemarcheTypeId
     sdom_zones: SDOMZoneId[]
+    etapes: TitreGetDemarche['etapes']
   }
   titre: {
     typeId: TitreTypeId
@@ -97,12 +100,51 @@ export const DemarcheEtape = defineComponent<Props>(props => {
     deposePopupVisible.value = !deposePopupVisible.value
   }
 
-  const canDownloadZip = computed<boolean>(() => props.etape.etape_type_id === ETAPES_TYPES.demande && (props.etape.entreprises_documents.length > 0 || props.etape.documents.length > 0))
+  const canDownloadZip = computed<boolean>(() => props.etape.etape_type_id === ETAPES_TYPES.demande && (props.etape.entreprises_documents.length > 0 || props.etape.etape_documents.length > 0))
 
   const canEditOrDeleteEtape = computed<boolean>(() =>
     canEditEtape(props.user, props.etape.etape_type_id, props.etape.etape_statut_id, props.demarche.titulaires, props.demarche.administrationsLocales, props.demarche.demarche_type_id, props.titre)
   )
 
+  const daeDocument = computed<GetEtapeDocumentsByEtapeId['dae']>(() => {
+    if (needAslAndDae({ etapeTypeId: props.etape.etape_type_id, demarcheTypeId: props.demarche.demarche_type_id, titreTypeId: props.titre.typeId }, props.etape.etape_statut_id, props.user)) {
+      const daeEtape = props.demarche.etapes.find(({ etape_type_id }) => etape_type_id === 'dae')
+      if (isNotNullNorUndefined(daeEtape)) {
+        return {
+          id: etapeDocumentIdValidator.parse('daeId'),
+          date: daeEtape.date,
+          description: '',
+          arrete_prefectoral: '',
+          public_lecture: false,
+          entreprises_lecture: true,
+          etape_statut_id: daeEtape.etape_statut_id,
+          etape_document_type_id: documentTypeIdComplementaireObligatoireDAE,
+        }
+      }
+    }
+
+    return null
+  })
+
+  const aslDocument = computed<GetEtapeDocumentsByEtapeId['asl']>(() => {
+    if (needAslAndDae({ etapeTypeId: props.etape.etape_type_id, demarcheTypeId: props.demarche.demarche_type_id, titreTypeId: props.titre.typeId }, props.etape.etape_statut_id, props.user)) {
+      const aslEtape = props.demarche.etapes.find(({ etape_type_id }) => etape_type_id === 'asl')
+      if (isNotNullNorUndefined(aslEtape)) {
+        return {
+          id: etapeDocumentIdValidator.parse('aslId'),
+          date: aslEtape.date,
+          description: '',
+          public_lecture: false,
+          entreprises_lecture: true,
+          etape_statut_id: aslEtape.etape_statut_id,
+          etape_document_type_id: documentTypeIdComplementaireObligatoireASL,
+        }
+      }
+    }
+
+    return null
+  })
+
   const isDeposable = computed<boolean>(() =>
     fondamentalePropsName in props.etape
       ? isEtapeDeposable(
@@ -116,13 +158,12 @@ export const DemarcheEtape = defineComponent<Props>(props => {
             substances: props.etape.fondamentale.substances,
             duree: props.etape.fondamentale.duree,
             geojson4326Perimetre: props.etape.fondamentale.perimetre?.geojson4326_perimetre ?? null,
-            decisionsAnnexesContenu: props.etape.decisions_annexes_contenu,
-            decisionsAnnexesSections: props.etape.decisions_annexes_sections,
           },
-          // TODO 2023-11-15 hack pas très propres en attendant de pouvoir supprimer le code vue
-          props.etape.documents.map(document => ({ typeId: document.document_type_id, fichier: true })),
+          props.etape.etape_documents,
           props.etape.entreprises_documents,
-          props.demarche.sdom_zones
+          props.demarche.sdom_zones,
+          daeDocument.value,
+          aslDocument.value
         )
       : false
   )
@@ -258,7 +299,7 @@ export const DemarcheEtape = defineComponent<Props>(props => {
         />
       ) : null}
 
-      <EtapeDocuments etapeDocuments={props.etape.documents} entrepriseDocuments={props.etape.entreprises_documents} titulaires={props.demarche.titulaires} user={props.user} />
+      <EtapeDocuments etapeDocuments={props.etape.etape_documents} entrepriseDocuments={props.etape.entreprises_documents} titulaires={props.demarche.titulaires} user={props.user} />
 
       {removePopupVisible.value ? (
         <RemoveEtapePopup
@@ -271,17 +312,7 @@ export const DemarcheEtape = defineComponent<Props>(props => {
           titreNom={props.titre.nom}
         />
       ) : null}
-      {deposePopupVisible.value ? (
-        <DeposeEtapePopup
-          close={closeDeposePopup}
-          apiClient={props.apiClient}
-          demarcheTypeId={props.demarche.demarche_type_id}
-          etapeTypeId={props.etape.etape_type_id}
-          id={props.etape.id}
-          titreTypeId={props.titre.typeId}
-          titreNom={props.titre.nom}
-        />
-      ) : null}
+      {deposePopupVisible.value ? <DeposeEtapePopup close={closeDeposePopup} apiClient={props.apiClient} id={props.etape.id} /> : null}
     </div>
   )
 })
diff --git a/packages/ui/src/components/demarche/demarche-map.tsx b/packages/ui/src/components/demarche/demarche-map.tsx
index 118ccf1ee4fc7d4309eab60480f16a272c1e3981..cba92390a1065fe79ab652da2d1fb68b069888ef 100644
--- a/packages/ui/src/components/demarche/demarche-map.tsx
+++ b/packages/ui/src/components/demarche/demarche-map.tsx
@@ -1,4 +1,4 @@
-import { FunctionalComponent, HTMLAttributes, defineComponent, onMounted, ref, Ref, computed, watch, onUnmounted } from 'vue'
+import { FunctionalComponent, HTMLAttributes, defineComponent, onMounted, ref, Ref, computed, watch, onUnmounted, DeepReadonly } from 'vue'
 import { FullscreenControl, Map, NavigationControl, StyleSpecification, LayerSpecification, LngLatBounds, SourceSpecification, Popup } from 'maplibre-gl'
 import 'maplibre-gl/dist/maplibre-gl.css'
 import { z } from 'zod'
@@ -9,13 +9,13 @@ import { TitresStatutIds } from 'camino-common/src/static/titresStatuts'
 import { TitreSlug } from 'camino-common/src/validators/titres'
 import { TitreApiClient } from '../titre/titre-api-client'
 import { TitreWithPerimetre } from '../titres/mapUtil'
-import { isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty, isNullOrUndefined } from 'camino-common/src/typescript-tools'
+import { isNotNullNorUndefined, isNullOrUndefined } from 'camino-common/src/typescript-tools'
 import { couleurParDomaine } from '../_common/domaine'
 import { TitreTypeId, getDomaineId } from 'camino-common/src/static/titresTypes'
 import { Router } from 'vue-router'
 import { canHaveForages } from 'camino-common/src/permissions/titres'
 import { capitalize } from 'camino-common/src/strings'
-import { CaminoMapLibre } from '@/typings/maplibre-gl'
+import { CaminoLngLatBounds, CaminoMapLibre } from '@/typings/maplibre-gl'
 
 const contoursSourceName = 'Contours'
 const pointsSourceName = 'Points'
@@ -28,7 +28,7 @@ const titresValidesFillName = 'TitresValidesFill'
 const titresValidesLineName = 'TitresValidesLine'
 
 type Props = {
-  perimetre: { geojson4326_perimetre: FeatureMultiPolygon; geojson4326_points: FeatureCollectionPoints; geojson4326_forages: FeatureCollectionForages | null }
+  perimetre: DeepReadonly<{ geojson4326_perimetre: FeatureMultiPolygon; geojson4326_points: FeatureCollectionPoints; geojson4326_forages: FeatureCollectionForages | null }>
   maxMarkers: number
   style?: HTMLAttributes['style']
   class?: HTMLAttributes['class']
@@ -285,7 +285,7 @@ export const DemarcheMap = defineComponent<Props>(props => {
     return values
   })
 
-  const points = computed<FeatureCollectionPoints>(() => {
+  const points = computed<DeepReadonly<FeatureCollectionPoints>>(() => {
     return {
       type: 'FeatureCollection',
       features: props.perimetre.geojson4326_points.features.map(feature => {
@@ -294,7 +294,7 @@ export const DemarcheMap = defineComponent<Props>(props => {
     }
   })
 
-  const forages = computed<FeatureCollectionForages>(() => {
+  const forages = computed<DeepReadonly<FeatureCollectionForages>>(() => {
     return {
       type: 'FeatureCollection',
       features:
@@ -314,8 +314,8 @@ export const DemarcheMap = defineComponent<Props>(props => {
     }
   })
 
-  const bounds = computed<LngLatBounds>(() => {
-    const bounds = new LngLatBounds()
+  const bounds = computed<CaminoLngLatBounds>(() => {
+    const bounds: CaminoLngLatBounds = new LngLatBounds() as CaminoLngLatBounds
     props.perimetre.geojson4326_perimetre.geometry.coordinates.forEach(top => {
       top.forEach(lowerLever => lowerLever.forEach(coordinates => bounds.extend(coordinates)))
     })
@@ -468,7 +468,7 @@ export const DemarcheMap = defineComponent<Props>(props => {
       mapLibre.on('moveend', moveend)
 
       mapLibre.on('click', contourPointsName, e => {
-        if (isNotNullNorUndefinedNorEmpty(e.features)) {
+        if (e.features !== null && e.features !== undefined && e.features.length > 0) {
           new Popup({ closeButton: false, maxWidth: '500' })
             .setLngLat(e.lngLat)
             .setHTML(
@@ -481,7 +481,7 @@ export const DemarcheMap = defineComponent<Props>(props => {
       })
 
       mapLibre.on('click', contourForagesName, e => {
-        if (isNotNullNorUndefinedNorEmpty(e.features)) {
+        if (e.features !== null && e.features !== undefined && e.features.length > 0) {
           const properties = featureForagePropertiesValidator.safeParse(e.features[0].properties)
           if (properties.success) {
             new Popup({ closeButton: false, maxWidth: '500' })
@@ -504,7 +504,7 @@ export const DemarcheMap = defineComponent<Props>(props => {
       })
 
       mapLibre.on('mouseenter', titresValidesFillName, e => {
-        if (isNotNullNorUndefinedNorEmpty(e.features)) {
+        if (e.features !== null && e.features !== undefined && e.features.length > 0) {
           const titreProperties = e.features[0].properties as TitreValideProperties
 
           popup.setLngLat(e.lngLat).setHTML(`<div class="fr-text--lg fr-m-0">${titreProperties.nom}</div>`).addTo(mapLibre)
@@ -516,7 +516,7 @@ export const DemarcheMap = defineComponent<Props>(props => {
       })
 
       mapLibre.on('click', titresValidesFillName, e => {
-        if (isNotNullNorUndefinedNorEmpty(e.features)) {
+        if (e.features !== null && e.features !== undefined && e.features.length > 0) {
           const titreProperties = e.features[0].properties as TitreValideProperties
           props.neighbours?.router.push({ name: 'titre', params: { id: titreProperties.slug } })
         }
diff --git a/packages/ui/src/components/demarche/depose-etape-popup.stories.tsx b/packages/ui/src/components/demarche/depose-etape-popup.stories.tsx
index 7eb25799b4e52f5f921d1f91406af4d86ddfe9a6..ac3cd41dab877211f68d980084d2d85d1bc72f20 100644
--- a/packages/ui/src/components/demarche/depose-etape-popup.stories.tsx
+++ b/packages/ui/src/components/demarche/depose-etape-popup.stories.tsx
@@ -6,7 +6,6 @@ import { etapeIdValidator } from 'camino-common/src/etape'
 const meta: Meta = {
   title: 'Components/Demarche/DeposeEtapePopup',
   component: DeposeEtapePopup,
-  argTypes: {},
 }
 export default meta
 
@@ -15,9 +14,6 @@ const close = action('close')
 
 export const Default: StoryFn = () => (
   <DeposeEtapePopup
-    demarcheTypeId="oct"
-    etapeTypeId="mfr"
-    titreTypeId="arm"
     id={etapeIdValidator.parse('etapeId')}
     apiClient={{
       deposeEtape(titreEtapeId) {
@@ -26,7 +22,6 @@ export const Default: StoryFn = () => (
         return Promise.resolve()
       },
     }}
-    titreNom="Nouvelle espérance"
     close={close}
   />
 )
diff --git a/packages/ui/src/components/demarche/depose-etape-popup.tsx b/packages/ui/src/components/demarche/depose-etape-popup.tsx
index 71d2cfcb5cef34d0f728ec0f7a5d4466319aa5d1..31f82f7baee70d0b3120cd4d1aad60df5d0b53ff 100644
--- a/packages/ui/src/components/demarche/depose-etape-popup.tsx
+++ b/packages/ui/src/components/demarche/depose-etape-popup.tsx
@@ -1,17 +1,10 @@
 import { FunctionalComponent } from 'vue'
 import { FunctionalPopup } from '../_ui/functional-popup'
 import { Alert } from '@/components/_ui/alert'
-import { EtapeTypeId } from 'camino-common/src/static/etapesTypes'
-import { DemarcheTypeId } from 'camino-common/src/static/demarchesTypes'
-import { TitreTypeId } from 'camino-common/src/static/titresTypes'
 import { EtapeApiClient } from '../etape/etape-api-client'
 import { EtapeId } from 'camino-common/src/etape'
 interface Props {
   id: EtapeId
-  etapeTypeId: EtapeTypeId
-  demarcheTypeId: DemarcheTypeId
-  titreTypeId: TitreTypeId
-  titreNom: string
   close: () => void
   apiClient: Pick<EtapeApiClient, 'deposeEtape'>
 }
diff --git a/packages/ui/src/components/demarches/page.stories_snapshots_Loading.html b/packages/ui/src/components/demarches/page.stories_snapshots_Loading.html
index e5dec14449bd31c54b86bd598fc7624d77ba436b..8fef1588047827ded7b18008c8e0eb21526a4515 100644
--- a/packages/ui/src/components/demarches/page.stories_snapshots_Loading.html
+++ b/packages/ui/src/components/demarches/page.stories_snapshots_Loading.html
@@ -32,7 +32,7 @@
           <use href="#icon-chevron-bas"></use>
         </svg></div>
     </button>
-    <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+    <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
       <!---->
       <div class="_spinner_3306d0"></div>
     </div>
@@ -407,7 +407,7 @@
         </table>
       </div>
     </div>
-    <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+    <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
       <!---->
       <div class="_spinner_3306d0"></div>
     </div>
diff --git a/packages/ui/src/components/demarches/page.stories_snapshots_WithError.html b/packages/ui/src/components/demarches/page.stories_snapshots_WithError.html
index 6129f88f540bce22cbaa8b7287d89599d4dfdb6d..d5c5aa06f7ed423298b59f279d7c32f2ac1ab8c7 100644
--- a/packages/ui/src/components/demarches/page.stories_snapshots_WithError.html
+++ b/packages/ui/src/components/demarches/page.stories_snapshots_WithError.html
@@ -32,7 +32,7 @@
           <use href="#icon-chevron-bas"></use>
         </svg></div>
     </button>
-    <div class="" style="display: flex; justify-content: center;">
+    <div class=" undefined" style="display: flex; justify-content: center;">
       <div>
         <div class="_tooltip_4f6ea8">
           <h6 class="_tooltip-content_4f6ea8">Cassé</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
@@ -413,7 +413,7 @@
         </table>
       </div>
     </div>
-    <div class="" style="display: flex; justify-content: center;">
+    <div class=" undefined" style="display: flex; justify-content: center;">
       <div>
         <div class="_tooltip_4f6ea8">
           <h6 class="_tooltip-content_4f6ea8">Cassé</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
diff --git a/packages/ui/src/components/document/button-add.vue b/packages/ui/src/components/document/button-add.vue
deleted file mode 100644
index 92ee47b7e8e8fd970cd66528bdca997a66414b90..0000000000000000000000000000000000000000
--- a/packages/ui/src/components/document/button-add.vue
+++ /dev/null
@@ -1,40 +0,0 @@
-<template>
-  <button class="flex small mt-s" title="Ajouter un document" aria-label="Ajouter un document" @click="addPopupOpen">
-    <span v-if="large" class="mt-xxs mr-s">Ajouter un document</span>
-    <Icon size="M" name="file-add" class="flex-right" aria-hidden="true" />
-  </button>
-</template>
-
-<script>
-import DocumentEditPopup from './edit-popup.vue'
-import { Icon } from '@/components/_ui/icon'
-
-export default {
-  components: { Icon },
-  props: {
-    route: { type: Object, default: null },
-    action: { type: Object, default: null },
-    document: { type: Object, required: true },
-    title: { type: String, required: true },
-    large: { type: Boolean, default: false },
-    documentsTypes: { type: Array, required: true },
-    user: { type: Object, required: true },
-  },
-
-  methods: {
-    addPopupOpen() {
-      this.$store.commit('popupOpen', {
-        component: DocumentEditPopup,
-        props: {
-          document: this.document,
-          action: this.action,
-          route: this.route,
-          title: this.title,
-          documentsTypes: this.documentsTypes,
-          user: this.user,
-        },
-      })
-    },
-  },
-}
-</script>
diff --git a/packages/ui/src/components/document/edit-popup.vue b/packages/ui/src/components/document/edit-popup.vue
deleted file mode 100644
index 3373a7eb219c24005c96137e49d8dc4f8cab8ce2..0000000000000000000000000000000000000000
--- a/packages/ui/src/components/document/edit-popup.vue
+++ /dev/null
@@ -1,130 +0,0 @@
-<template>
-  <Popup :messages="messages">
-    <template #header>
-      <div>
-        <h6>
-          <span class="cap-first">
-            {{ title }}
-          </span>
-        </h6>
-        <h2 class="cap-first">{{ document.id ? 'Modification du' : "Ajout d'un" }} document</h2>
-      </div>
-    </template>
-
-    <div class="tablet-blobs">
-      <div class="tablet-blob-1-3 tablet-pt-s pb-s">
-        <h5>Type</h5>
-      </div>
-      <div class="mb tablet-blob-2-3">
-        <select v-if="!document.id" v-model="document.typeId" class="p-s">
-          <option v-for="dt in types" :key="dt.id" :value="dt.id" :disabled="document.typeId === dt.id">
-            {{ dt.nom }}
-          </option>
-        </select>
-        <div v-else-if="documentType" class="p-s">
-          {{ documentType.nom }}
-        </div>
-      </div>
-    </div>
-
-    <hr />
-
-    <SectionsEdit :document="document" :user="user" @update:document="newValue => emits('update:document', newValue)" />
-
-    <template #footer>
-      <div class="tablet-blobs">
-        <div class="tablet-blob-1-3 mb tablet-mb-0">
-          <button v-if="!loading" class="btn-border rnd-xs p-s full-x" @click="cancel">Annuler</button>
-        </div>
-        <div class="tablet-blob-2-3">
-          <button v-if="!loading" ref="save-button" class="btn btn-primary" :disabled="!complete" @click="save">Enregistrer</button>
-
-          <div v-else class="p-s full-x bold">Enregistrement en cours…</div>
-        </div>
-      </div>
-    </template>
-  </Popup>
-</template>
-
-<script>
-import Popup from '../_ui/popup.vue'
-import SectionsEdit from './sections-edit.vue'
-
-export default {
-  name: 'CaminoDocumentEditPopup',
-
-  components: {
-    Popup,
-    SectionsEdit,
-  },
-
-  props: {
-    title: { type: String, required: true },
-    route: { type: Object, default: null },
-    action: { type: Object, default: null },
-    document: { type: Object, required: true },
-    documentsTypes: { type: Array, required: true },
-    user: { type: Object, required: true },
-  },
-
-  emits: ['update:document'],
-
-  computed: {
-    loading() {
-      return this.$store.state.popup.loading
-    },
-
-    complete() {
-      return this.document.typeId && this.document.date && (this.document.fichier || this.document.fichierNouveau)
-    },
-
-    messages() {
-      return this.$store.state.popup.messages
-    },
-
-    types() {
-      return this.documentsTypes
-    },
-
-    documentType() {
-      return this.types && this.types.find(d => d.id === this.document.typeId)
-    },
-  },
-
-  async created() {
-    document.addEventListener('keyup', this.keyUp)
-  },
-
-  beforeUnmount() {
-    document.removeEventListener('keyup', this.keyUp)
-  },
-
-  methods: {
-    async save() {
-      await this.$store.dispatch('document/upsert', {
-        document: this.document,
-        route: this.route,
-        action: this.action,
-      })
-    },
-
-    cancel() {
-      this.errorsRemove()
-      this.$store.commit('popupClose')
-    },
-
-    keyUp(e) {
-      if (!this.loading) {
-        if ((e.which || e.keyCode) === 27) {
-          this.cancel()
-        } else if ((e.which || e.keyCode) === 13 && this.complete) {
-          this.$refs['save-button'].focus()
-          this.save()
-        }
-      }
-    },
-
-    errorsRemove() {},
-  },
-}
-</script>
diff --git a/packages/ui/src/components/document/multi-edit.vue b/packages/ui/src/components/document/multi-edit.vue
deleted file mode 100644
index 7a72ca851fd6819f87f97b07919ecfa65a169c64..0000000000000000000000000000000000000000
--- a/packages/ui/src/components/document/multi-edit.vue
+++ /dev/null
@@ -1,86 +0,0 @@
-<template>
-  <div>
-    <Documents
-      v-if="documents.length"
-      :documents="documents"
-      :boutonModification="true"
-      :boutonSuppression="true"
-      :addAction="addAction"
-      :removeAction="removeAction"
-      :manquantShow="true"
-      :helpShow="true"
-      :title="documentPopupTitle"
-      :documentsTypes="documentsTypes"
-      :user="user"
-    />
-
-    <DocumentAddButton
-      v-if="documentsTypes?.length"
-      :document="{
-        date,
-        entreprisesLecture: !userIsAdmin,
-        publicLecture: false,
-        fichier: null,
-        fichierNouveau: null,
-        fichierTypeId: null,
-        typeId: '',
-      }"
-      :action="addAction"
-      :title="documentPopupTitle"
-      class="btn py-s px-m rnd-xs mb-s full-x"
-      :large="true"
-      :documentsTypes="documentsTypes"
-      :user="user"
-    />
-  </div>
-</template>
-
-<script>
-import DocumentAddButton from './button-add.vue'
-import Documents from '../documents/list.vue'
-import { getCurrent } from 'camino-common/src/date'
-import { isAdministrationAdmin, isAdministrationEditeur, isSuper } from 'camino-common/src/roles'
-
-export default {
-  components: { DocumentAddButton, Documents },
-
-  props: {
-    documents: { type: Array, required: true },
-    documentsTypes: { type: Array, required: true },
-    documentPopupTitle: { type: String, required: true },
-    addAction: { type: Object, default: null },
-    removeAction: { type: Object, default: null },
-    date: { type: String, default: getCurrent() },
-    user: { type: Object, required: true },
-  },
-
-  emits: ['complete-update'],
-
-  computed: {
-    complete() {
-      return this.documents.every(d => {
-        const documentType = this.documentsTypes.find(dt => dt.id === d.typeId)
-        return !documentType || documentType.optionnel || !!((d.fichier || d.fichierNouveau) && d.date)
-      })
-    },
-
-    userIsAdmin() {
-      return isSuper(this.user) || isAdministrationAdmin(this.user) || isAdministrationEditeur(this.user)
-    },
-  },
-
-  watch: {
-    complete: 'completeUpdate',
-  },
-
-  created() {
-    this.completeUpdate()
-  },
-
-  methods: {
-    completeUpdate() {
-      this.$emit('complete-update', this.complete)
-    },
-  },
-}
-</script>
diff --git a/packages/ui/src/components/document/remove-popup.vue b/packages/ui/src/components/document/remove-popup.vue
deleted file mode 100644
index aa35015f0e492b6a198c1582e918dd8148156002..0000000000000000000000000000000000000000
--- a/packages/ui/src/components/document/remove-popup.vue
+++ /dev/null
@@ -1,90 +0,0 @@
-<template>
-  <Popup :messages="messages">
-    <template #header>
-      <div>
-        <h6>
-          <span class="cap-first">
-            {{ title }}
-          </span>
-        </h6>
-        <h2 class="cap-first">Suppression du document</h2>
-      </div>
-    </template>
-
-    <p class="bold">
-      Souhaitez vous supprimer le document
-      <span class="color-inverse">{{ documentType.nom }}</span> de <span class="color-inverse">{{ title }}</span> ?
-    </p>
-    <div class="bg-warning color-bg p-s mb-l"><span class="bold"> Attention </span>: cette opération est définitive et ne peut pas être annulée.</div>
-
-    <template #footer>
-      <div class="tablet-blobs">
-        <div class="tablet-blob-1-3 mb tablet-mb-0">
-          <button v-if="!loading" class="btn-border rnd-xs p-s full-x" @click="cancel">Annuler</button>
-        </div>
-        <div class="tablet-blob-2-3">
-          <button v-if="!loading" class="btn-flash rnd-xs p-s full-x" @click="remove">Supprimer</button>
-          <div v-else class="p-s full-x bold">Suppression en cours…</div>
-        </div>
-      </div>
-    </template>
-  </Popup>
-</template>
-
-<script>
-import Popup from '../_ui/popup.vue'
-
-export default {
-  name: 'CaminoDocumentRemovePopup',
-
-  components: {
-    Popup,
-  },
-
-  props: {
-    title: { type: String, default: '' },
-    route: { type: Object, required: true },
-    document: { type: Object, default: () => ({}) },
-    documentType: { type: Object, default: () => ({}) },
-  },
-
-  computed: {
-    messages() {
-      return this.$store.state.popup.messages
-    },
-
-    loading() {
-      return this.$store.state.popup.loading
-    },
-  },
-
-  created() {
-    document.addEventListener('keyup', this.keyup)
-  },
-
-  beforeUnmount() {
-    document.removeEventListener('keyup', this.keyup)
-  },
-
-  methods: {
-    async remove() {
-      await this.$store.dispatch('document/remove', {
-        id: this.document.id,
-        route: this.route,
-      })
-    },
-
-    cancel() {
-      this.$store.commit('popupClose')
-    },
-
-    keyup(e) {
-      if ((e.which || e.keyCode) === 27) {
-        this.cancel()
-      } else if ((e.which || e.keyCode) === 13) {
-        this.remove()
-      }
-    },
-  },
-}
-</script>
diff --git a/packages/ui/src/components/document/sections-edit.vue b/packages/ui/src/components/document/sections-edit.vue
deleted file mode 100644
index bd87f88530c459310a79814c09ff2a26cab6ea53..0000000000000000000000000000000000000000
--- a/packages/ui/src/components/document/sections-edit.vue
+++ /dev/null
@@ -1,185 +0,0 @@
-<template>
-  <div>
-    <div class="tablet-blobs">
-      <div class="tablet-blob-1-3 tablet-pt-s pb-s">
-        <h5>Date</h5>
-      </div>
-      <div class="tablet-blob-2-3">
-        <InputDate :initialValue="document.date" :dateChanged="dateChanged" class="mb" />
-      </div>
-    </div>
-
-    <hr />
-
-    <div v-if="documentsVisibilites.length > 1">
-      <div class="tablet-blobs">
-        <div class="tablet-blob-1-3">
-          <h5>Visibilité</h5>
-        </div>
-        <div class="tablet-blob-2-3">
-          <ul class="list-sans">
-            <li v-for="visibilite in documentsVisibilites" :key="visibilite.id">
-              <label class="small bold">
-                <input :value="visibilite.id" :checked="visibilite.id === visibiliteId" type="radio" class="mr-s" @change="visibiliteUpdate(visibilite.id)" />
-                {{ visibilite.nom }}
-              </label>
-            </li>
-          </ul>
-        </div>
-      </div>
-      <hr />
-    </div>
-
-    <div class="tablet-blobs">
-      <div class="tablet-blob-1-3 tablet-pt-s pb-s">
-        <h5 class="mb-xs">Fichier</h5>
-        <p v-if="userIsAdmin" class="h6 italic mb-0">Optionnel</p>
-      </div>
-      <div class="tablet-blob-2-3">
-        <div v-if="document.fichier || document.fichierNouveau" class="flex">
-          <p class="mb-0 word-break">
-            {{ (document.fichierNouveau && document.fichierNouveau.name) || `${document.id}.${document.fichierTypeId}` }}
-          </p>
-          <div class="flex-right flex flex-center pl-s">
-            <ButtonIcon class="btn-border py-s px-m my--xs rnd-l-xs" :onClick="fileRemove" icon="delete" title="Supprime le fichier" />
-            <ButtonIcon class="btn-border py-s px-m my--xs rnd-r-xs" :onClick="fileDownload" icon="download" title="Télécharger le fichier" />
-          </div>
-        </div>
-        <div v-else class="dsfr">
-          <InputFile class="btn-border small p-s full-x rnd-xs mb-s" :accept="fichiersTypesIds" :uploadFile="fileChange" />
-        </div>
-      </div>
-    </div>
-
-    <hr />
-
-    <div v-if="document.fichierNouveau">
-      <div class="tablet-blobs">
-        <div class="tablet-blob-1-3 tablet-pt-s pb-s">
-          <h5>Type de fichier</h5>
-        </div>
-        <div class="tablet-blob-2-3 mb">
-          <select v-model="document.fichierTypeId" class="p-s">
-            <option v-for="fichierTypeId in fichiersTypesIds" :key="fichierTypeId" :value="fichierTypeId" :disabled="document.fichierTypeId === fichierTypeId">
-              {{ fichierTypeId }}
-            </option>
-          </select>
-        </div>
-      </div>
-      <hr />
-    </div>
-
-    <div>
-      <div class="tablet-blobs">
-        <div class="tablet-blob-1-3 tablet-pt-s pb-s">
-          <h5 class="mb-xs">Description</h5>
-          <p class="h6 italic mb-0">Optionnel</p>
-        </div>
-        <div class="mb tablet-blob-2-3">
-          <input v-model="document.description" type="text" class="p-s" />
-        </div>
-      </div>
-      <hr />
-    </div>
-
-    <Messages :messages="warnings" />
-  </div>
-</template>
-
-<script>
-import { InputDate } from '../_ui/input-date'
-import { InputFile } from '../_ui/dsfr-input-file'
-import { Messages } from '../_ui/messages'
-import { ButtonIcon } from '@/components/_ui/button-icon'
-import { isAdministrationAdmin, isAdministrationEditeur, isBureauDEtudes, isEntreprise, isSuper } from 'camino-common/src/roles'
-
-export default {
-  components: { ButtonIcon, Messages, InputFile, InputDate },
-
-  props: {
-    document: { type: Object, required: true },
-    user: { type: Object, required: true },
-  },
-
-  data() {
-    return {
-      fichiersTypesIds: ['pdf'],
-      warnings: [],
-    }
-  },
-
-  computed: {
-    documentsVisibilites() {
-      if (!this.user) return []
-
-      if (isSuper(this.user) || isAdministrationAdmin(this.user) || isAdministrationEditeur(this.user)) {
-        return [
-          { id: 'admin', nom: 'Administrations uniquement' },
-          {
-            id: 'entreprise',
-            nom: 'Administrations et entreprises titulaires',
-          },
-          { id: 'public', nom: 'Public' },
-        ]
-      }
-
-      if (isEntreprise(this.user) || isBureauDEtudes(this.user)) {
-        return [{ id: 'entreprise', nom: 'Administrations et entreprises titulaires' }]
-      }
-
-      return []
-    },
-
-    userIsAdmin() {
-      return isSuper(this.user) || isAdministrationAdmin(this.user) || isAdministrationEditeur(this.user)
-    },
-
-    visibiliteId() {
-      if (this.document.publicLecture) {
-        return 'public'
-      }
-
-      if (this.document.entreprisesLecture) {
-        return 'entreprise'
-      }
-
-      return 'admin'
-    },
-  },
-
-  async mounted() {
-    if (this.documentsVisibilites.length && this.documentsVisibilites.length < 2) {
-      this.document.publicLecture = this.documentsVisibilites[0].id === 'public'
-      this.document.entreprisesLecture = this.documentsVisibilites[0].id === 'entreprise'
-    }
-  },
-
-  methods: {
-    dateChanged(date) {
-      this.document.date = date
-    },
-    fileChange(file) {
-      this.warnings = []
-      this.document.fichierNouveau = file
-      this.document.fichier = true
-      this.document.fichierTypeId = 'pdf'
-    },
-
-    fileRemove() {
-      this.document.fichier = null
-      this.document.fichierNouveau = null
-      this.document.fichierTypeId = null
-      this.warnings = []
-    },
-
-    fileDownload() {
-      this.$store.dispatch('downloadDocument', this.document)
-    },
-
-    visibiliteUpdate(id) {
-      this.document.publicLecture = id === 'public'
-      this.document.entreprisesLecture = id === 'entreprise'
-    },
-  },
-}
-</script>
diff --git a/packages/ui/src/components/documents/list.vue b/packages/ui/src/components/documents/list.vue
deleted file mode 100644
index 228d501b01231efca1db87af905020cfe7c58bd9..0000000000000000000000000000000000000000
--- a/packages/ui/src/components/documents/list.vue
+++ /dev/null
@@ -1,58 +0,0 @@
-<template>
-  <div class="overflow-scroll-x">
-    <table>
-      <tr>
-        <th>Nom</th>
-        <th>Date</th>
-        <th class="full-x-">Description</th>
-        <th />
-      </tr>
-      <DocumentTr
-        v-for="document in documents"
-        :key="document.id"
-        :document="document"
-        :parentId="parentId"
-        :route="route"
-        :addAction="addAction"
-        :removeAction="removeAction"
-        :title="title"
-        :etiquette="etiquette"
-        :boutonVisualisation="true"
-        :boutonSuppression="boutonSuppression && document.suppression"
-        :boutonModification="boutonModification"
-        :boutonDissociation="boutonDissociation"
-        :manquantShow="manquantShow"
-        :helpShow="helpShow"
-        :documentsTypes="documentsTypes"
-        :user="user"
-      />
-    </table>
-  </div>
-</template>
-
-<script>
-import DocumentTr from './tr.vue'
-
-export default {
-  components: {
-    DocumentTr,
-  },
-
-  props: {
-    documents: { type: Array, required: true },
-    title: { type: String, default: '' },
-    route: { type: Object, default: null },
-    addAction: { type: Object, default: null },
-    removeAction: { type: Object, default: null },
-    parentId: { type: String, default: '' },
-    etiquette: { type: Boolean, default: false },
-    boutonDissociation: { type: Boolean, default: false },
-    boutonModification: { type: Boolean, default: false },
-    boutonSuppression: { type: Boolean, default: false },
-    manquantShow: { type: Boolean, default: false },
-    helpShow: { type: Boolean, default: false },
-    documentsTypes: { type: Array, required: true },
-    user: { type: Object, required: true },
-  },
-}
-</script>
diff --git a/packages/ui/src/components/documents/tr.vue b/packages/ui/src/components/documents/tr.vue
deleted file mode 100644
index a9578f0e64c2e0c023a593aecfbb9631766a3db6..0000000000000000000000000000000000000000
--- a/packages/ui/src/components/documents/tr.vue
+++ /dev/null
@@ -1,145 +0,0 @@
-<template>
-  <tr class="h6">
-    <td class="nowrap pt-m flex flex-center">
-      <span class="bold">{{ documentType.nom }}</span>
-      <span>
-        <HelpTooltip v-if="helpShow && documentType.description" :text="documentType.description" class="ml-xs" />
-      </span>
-      <span v-if="etiquette">
-        <Tag v-if="document.publicLecture" :mini="true" color="bg-info" class="ml-xs" text="Public" />
-
-        <Tag v-if="document.entreprisesLecture && !document.publicLecture" :mini="true" color="bg-info" class="ml-xs" text="Entreprise" />
-      </span>
-      <Tag v-if="manquant && manquantShow" color="bg-warning" class="ml-xs" :mini="true" text="Fichier manquant" />
-    </td>
-    <td class="nowrap pt-m">
-      {{ dateFormat(document.date) }}
-    </td>
-    <td class="pt-m">{{ document.description || '–' }}</td>
-    <td class="flex text-right">
-      <ButtonIcon v-if="boutonModification" class="btn rnd-l-xs py-s px-m my--xs mr-px" :onClick="editPopupOpen" icon="pencil" title="Modifier le document" />
-      <ButtonIcon
-        v-if="boutonSuppression"
-        class="btn py-s px-m my--xs"
-        :class="{
-          'rnd-r-xs': !document.fichier,
-        }"
-        icon="delete"
-        title="Supprimer le document"
-        :onClick="removePopupOpen"
-      />
-      <a
-        v-if="document.fichier || document.fichierNouveau"
-        class="btn-border py-s px-m my--xs rnd-r-xs"
-        :class="{
-          'rnd-l-xs': !boutonVisualisation && !boutonModification && !boutonSuppression && !boutonDissociation,
-        }"
-        :href="`/apiUrl/download/fichiers/${document.id}`"
-        :download="document.nom"
-        target="_blank"
-        title="Consulter le document - nouvelle fenêtre"
-        aria-label="Consulter le document - nouvelle fenêtre"
-      >
-        <Icon name="download" size="M" aria-hidden="true" />
-      </a>
-    </td>
-  </tr>
-</template>
-
-<script>
-import { cloneAndClean, dateFormat } from '../../utils/index'
-import { Tag } from '../_ui/tag'
-import DocumentEditPopup from '../document/edit-popup.vue'
-import DocumentRemovePopup from '../document/remove-popup.vue'
-import { HelpTooltip } from '../_ui/help-tooltip'
-import { Icon } from '@/components/_ui/icon'
-import { ButtonIcon } from '@/components/_ui/button-icon'
-import { DocumentsTypes } from 'camino-common/src/static/documentsTypes'
-
-export default {
-  components: {
-    ButtonIcon,
-    Icon,
-    Tag,
-    HelpTooltip,
-  },
-
-  props: {
-    document: { type: Object, required: true },
-    title: { type: String, required: true },
-    route: { type: Object, default: null },
-    addAction: { type: Object, default: null },
-    removeAction: { type: Object, default: null },
-    parentId: { type: String, default: '' },
-    etiquette: { type: Boolean, default: false },
-    boutonVisualisation: { type: Boolean, default: true },
-    boutonDissociation: { type: Boolean, default: false },
-    boutonModification: { type: Boolean, default: false },
-    boutonSuppression: { type: Boolean, default: false },
-    manquantShow: { type: Boolean, default: false },
-    helpShow: { type: Boolean, default: false },
-    documentsTypes: { type: Array, required: true },
-    user: { type: Object, required: true },
-  },
-
-  data() {
-    return {
-      fileReader: null,
-    }
-  },
-
-  computed: {
-    manquant() {
-      return !(this.document.fichier || this.document.fichierNouveau)
-    },
-    documentType() {
-      return DocumentsTypes[this.document.typeId]
-    },
-  },
-
-  methods: {
-    editPopupOpen() {
-      const document = cloneAndClean(this.document)
-      if (this.parentId) {
-        document.titreEtapeId = this.parentId
-      }
-
-      document.fichierNouveau = null
-
-      delete document.suppression
-
-      this.$store.commit('popupOpen', {
-        component: DocumentEditPopup,
-        props: {
-          title: this.title,
-          route: this.route,
-          action: this.addAction,
-          document,
-          documentsTypes: this.documentsTypes,
-          user: this.user,
-        },
-      })
-    },
-
-    removePopupOpen() {
-      if (this.removeAction) {
-        this.$store.dispatch(this.removeAction.name, { id: this.document.id }, { root: true })
-      } else {
-        this.$store.commit('popupOpen', {
-          component: DocumentRemovePopup,
-          props: {
-            title: this.title,
-            document: this.document,
-            route: this.route,
-            documentType: this.documentType,
-          },
-        })
-      }
-    },
-
-    dateFormat(date) {
-      return dateFormat(date)
-    },
-  },
-}
-</script>
diff --git a/packages/ui/src/components/entreprise.stories_snapshots_Loading.html b/packages/ui/src/components/entreprise.stories_snapshots_Loading.html
index 285c4a7bdef28476721ac63ae939fce06668ca8c..8c272183a5c1fdea2888f9a9bdd457f09e16f377 100644
--- a/packages/ui/src/components/entreprise.stories_snapshots_Loading.html
+++ b/packages/ui/src/components/entreprise.stories_snapshots_Loading.html
@@ -1,4 +1,4 @@
-<div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+<div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
   <!---->
   <div class="_spinner_3306d0"></div>
 </div>
\ No newline at end of file
diff --git a/packages/ui/src/components/entreprise/add-entreprise-document-popup.stories_snapshots_Default.html b/packages/ui/src/components/entreprise/add-entreprise-document-popup.stories_snapshots_Default.html
index 53e9c1156b3f52aa21c2b76f68ee8157e4496292..f54526a6960b475b3e9b2b1254a6e278223814fa 100644
--- a/packages/ui/src/components/entreprise/add-entreprise-document-popup.stories_snapshots_Default.html
+++ b/packages/ui/src/components/entreprise/add-entreprise-document-popup.stories_snapshots_Default.html
@@ -36,21 +36,21 @@
                         <!---->
                       </legend>
                       <div class="fr-fieldset__element fr-fieldset__element--inline fr-fieldset__element--number">
-                        <div class="fr-input-group"><label class="fr-label" for="input_271">Jour
+                        <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_271">Jour
                             <!----><span class="fr-hint-text">Exemple : 14</span>
                           </label><input class="fr-input" name="input_271" id="input_271" type="number" min="1" max="31">
                           <!---->
                         </div>
                       </div>
                       <div class="fr-fieldset__element fr-fieldset__element--inline fr-fieldset__element--number">
-                        <div class="fr-input-group"><label class="fr-label" for="input_670">Mois
+                        <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_670">Mois
                             <!----><span class="fr-hint-text">Exemple : 12</span>
                           </label><input class="fr-input" name="input_670" id="input_670" type="number" min="1" max="12">
                           <!---->
                         </div>
                       </div>
                       <div class="fr-fieldset__element fr-fieldset__element--inline fr-fieldset__element--inline-grow fr-fieldset__element--year">
-                        <div class="fr-input-group"><label class="fr-label" for="input_74">Année
+                        <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_74">Année
                             <!----><span class="fr-hint-text">Exemple : 1984</span>
                           </label><input class="fr-input" name="input_74" id="input_74" type="number" min="1750" max="2099">
                           <!---->
@@ -63,7 +63,7 @@
                       <div class="fr-upload-group"><label class="fr-label" for="file-upload">Ajouter un fichier<span class="fr-hint-text">Taille maximale : 100 Mo. Format<!----> supporté<!----> : pdf.</span></label><input class="fr-upload" type="file" id="file-upload" name="file-upload" accept=".pdf"></div>
                     </div>
                     <div class="fr-fieldset__element">
-                      <div class="fr-input-group"><label class="fr-label" for="input_878">Description
+                      <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_878">Description
                           <!---->
                           <!---->
                         </label><input class="fr-input" name="input_878" id="input_878" type="text">
diff --git a/packages/ui/src/components/entreprise/add-entreprise-document-popup.stories_snapshots_TypeDeDocumentVerouille.html b/packages/ui/src/components/entreprise/add-entreprise-document-popup.stories_snapshots_TypeDeDocumentVerouille.html
index 43cf23ad50ca664bd95e882ecf09c2113bfde1e6..a30ea6079c845aaa5a19457db4aad0a8236700bf 100644
--- a/packages/ui/src/components/entreprise/add-entreprise-document-popup.stories_snapshots_TypeDeDocumentVerouille.html
+++ b/packages/ui/src/components/entreprise/add-entreprise-document-popup.stories_snapshots_TypeDeDocumentVerouille.html
@@ -17,21 +17,21 @@
                         <!---->
                       </legend>
                       <div class="fr-fieldset__element fr-fieldset__element--inline fr-fieldset__element--number">
-                        <div class="fr-input-group"><label class="fr-label" for="input_271">Jour
+                        <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_271">Jour
                             <!----><span class="fr-hint-text">Exemple : 14</span>
                           </label><input class="fr-input" name="input_271" id="input_271" type="number" min="1" max="31">
                           <!---->
                         </div>
                       </div>
                       <div class="fr-fieldset__element fr-fieldset__element--inline fr-fieldset__element--number">
-                        <div class="fr-input-group"><label class="fr-label" for="input_670">Mois
+                        <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_670">Mois
                             <!----><span class="fr-hint-text">Exemple : 12</span>
                           </label><input class="fr-input" name="input_670" id="input_670" type="number" min="1" max="12">
                           <!---->
                         </div>
                       </div>
                       <div class="fr-fieldset__element fr-fieldset__element--inline fr-fieldset__element--inline-grow fr-fieldset__element--year">
-                        <div class="fr-input-group"><label class="fr-label" for="input_74">Année
+                        <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_74">Année
                             <!----><span class="fr-hint-text">Exemple : 1984</span>
                           </label><input class="fr-input" name="input_74" id="input_74" type="number" min="1750" max="2099">
                           <!---->
@@ -44,7 +44,7 @@
                       <div class="fr-upload-group"><label class="fr-label" for="file-upload">Ajouter un fichier<span class="fr-hint-text">Taille maximale : 100 Mo. Format<!----> supporté<!----> : pdf.</span></label><input class="fr-upload" type="file" id="file-upload" name="file-upload" accept=".pdf"></div>
                     </div>
                     <div class="fr-fieldset__element">
-                      <div class="fr-input-group"><label class="fr-label" for="input_878">Description
+                      <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_878">Description
                           <!---->
                           <!---->
                         </label><input class="fr-input" name="input_878" id="input_878" type="text">
diff --git a/packages/ui/src/components/entreprise/add-entreprise-document-popup.tsx b/packages/ui/src/components/entreprise/add-entreprise-document-popup.tsx
index 7a64d59eb01428ef079821fdfe4ac51d230d40ee..56319d11bb706a37f48d72436ff61c0bb9abcec6 100644
--- a/packages/ui/src/components/entreprise/add-entreprise-document-popup.tsx
+++ b/packages/ui/src/components/entreprise/add-entreprise-document-popup.tsx
@@ -16,6 +16,7 @@ interface Props {
   lockedEntrepriseDocumentTypeId?: EntrepriseDocumentTypeId
   apiClient: Pick<ApiClient, 'creerEntrepriseDocument' | 'uploadTempDocument'>
 }
+// TODO 2024-04-22 Utiliser un DsfrSelect
 export const AddEntrepriseDocumentPopup = caminoDefineComponent<Props>(['close', 'entrepriseId', 'apiClient', 'lockedEntrepriseDocumentTypeId'], props => {
   const entrepriseDocumentTypeId = ref<(typeof EntrepriseDocumentTypeIds)[number] | null>(props.lockedEntrepriseDocumentTypeId ?? null)
   const documentDate = ref<CaminoDate | null>(null)
diff --git a/packages/ui/src/components/entreprise/add-popup.stories_snapshots_Super.html b/packages/ui/src/components/entreprise/add-popup.stories_snapshots_Super.html
index 0f01eb8363538567b56e395e0fad376067d531f5..5992b4b4229182cd8233ef9559317a0154c34f2c 100644
--- a/packages/ui/src/components/entreprise/add-popup.stories_snapshots_Super.html
+++ b/packages/ui/src/components/entreprise/add-popup.stories_snapshots_Super.html
@@ -10,13 +10,13 @@
               <h1 id="monId-title" class="fr-modal__title"><span class="fr-icon-arrow-right-line fr-icon--lg" aria-hidden="true"></span>Création d'une entreprise</h1>
               <div class="fr-container">
                 <form>
-                  <div class="fr-input-group fr-input-group--disabled"><label class="fr-label" for="input_271">Pays
+                  <div class="fr-input-group fr-input-group--disabled" style="margin-bottom: 0px;"><label class="fr-label" for="input_271">Pays
                       <!---->
                       <!---->
                     </label><input class="fr-input" name="input_271" id="input_271" disabled="" type="text">
                     <!---->
                   </div>
-                  <div class="fr-input-group"><label class="fr-label" for="input_670">Siren
+                  <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_670">Siren
                       <!---->
                       <!---->
                     </label><input class="fr-input" name="input_670" id="input_670" type="text">
diff --git a/packages/ui/src/components/entreprise/edit-popup.stories_snapshots_Ok.html b/packages/ui/src/components/entreprise/edit-popup.stories_snapshots_Ok.html
index 6f94bc7a83d8505c0022c958ce8d6e70477a42b7..c4476f13be08df00fb5dc82f9abc5ecabbe2508e 100644
--- a/packages/ui/src/components/entreprise/edit-popup.stories_snapshots_Ok.html
+++ b/packages/ui/src/components/entreprise/edit-popup.stories_snapshots_Ok.html
@@ -10,19 +10,19 @@
               <h1 id="monId-title" class="fr-modal__title"><span class="fr-icon-arrow-right-line fr-icon--lg" aria-hidden="true"></span>Modification d'une entreprise</h1>
               <div class="fr-container">
                 <form>
-                  <div class="fr-input-group"><label class="fr-label" for="input_271">Téléphone
+                  <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_271">Téléphone
                       <!---->
                       <!---->
                     </label><input class="fr-input" name="input_271" id="input_271" type="text">
                     <!---->
                   </div>
-                  <div class="fr-input-group"><label class="fr-label" for="input_670">Adresse électronique
+                  <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_670">Adresse électronique
                       <!---->
                       <!---->
                     </label><input class="fr-input" name="input_670" id="input_670" type="text">
                     <!---->
                   </div>
-                  <div class="fr-input-group"><label class="fr-label" for="input_74">Site internet
+                  <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_74">Site internet
                       <!---->
                       <!---->
                     </label><input class="fr-input" name="input_74" id="input_74" type="text">
diff --git a/packages/ui/src/components/entreprise/edit-popup.stories_snapshots_Super.html b/packages/ui/src/components/entreprise/edit-popup.stories_snapshots_Super.html
index 1ca3ee58c088a85139abc0d28789ebd46aa8085f..c5c8b9a8ff5134c2649f42c9fd27911f616ff908 100644
--- a/packages/ui/src/components/entreprise/edit-popup.stories_snapshots_Super.html
+++ b/packages/ui/src/components/entreprise/edit-popup.stories_snapshots_Super.html
@@ -10,19 +10,19 @@
               <h1 id="monId-title" class="fr-modal__title"><span class="fr-icon-arrow-right-line fr-icon--lg" aria-hidden="true"></span>Modification d'une entreprise</h1>
               <div class="fr-container">
                 <form>
-                  <div class="fr-input-group"><label class="fr-label" for="input_271">Téléphone
+                  <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_271">Téléphone
                       <!---->
                       <!---->
                     </label><input class="fr-input" name="input_271" id="input_271" type="text">
                     <!---->
                   </div>
-                  <div class="fr-input-group"><label class="fr-label" for="input_670">Adresse électronique
+                  <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_670">Adresse électronique
                       <!---->
                       <!---->
                     </label><input class="fr-input" name="input_670" id="input_670" type="text">
                     <!---->
                   </div>
-                  <div class="fr-input-group"><label class="fr-label" for="input_74">Site internet
+                  <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_74">Site internet
                       <!---->
                       <!---->
                     </label><input class="fr-input" name="input_74" id="input_74" type="text">
diff --git a/packages/ui/src/components/entreprise/entreprise-api-client.ts b/packages/ui/src/components/entreprise/entreprise-api-client.ts
index 6db527e06aa79508c444b7f98708bc188d3e350c..4b4f98667b604d14452a53d96125822d9da9573d 100644
--- a/packages/ui/src/components/entreprise/entreprise-api-client.ts
+++ b/packages/ui/src/components/entreprise/entreprise-api-client.ts
@@ -27,7 +27,7 @@ export interface EntrepriseApiClient {
 }
 export const uiEntrepriseDocumentInputValidator = entrepriseDocumentInputValidator.omit({ tempDocumentName: true })
 
-type UiEntrepriseDocumentInput = z.infer<typeof uiEntrepriseDocumentInputValidator>
+export type UiEntrepriseDocumentInput = z.infer<typeof uiEntrepriseDocumentInputValidator>
 
 export const entrepriseApiClient: EntrepriseApiClient = {
   getFiscaliteEntreprise: async (annee, entrepriseId): Promise<Fiscalite> => {
diff --git a/packages/ui/src/components/entreprise/entreprise-fiscalite.stories_snapshots_Loading.html b/packages/ui/src/components/entreprise/entreprise-fiscalite.stories_snapshots_Loading.html
index 57a88251bc9632e794f68d43250720a5da5f9b29..97966dc9a29ae97b92ed1f18e1bb5ab1fd28f0a9 100644
--- a/packages/ui/src/components/entreprise/entreprise-fiscalite.stories_snapshots_Loading.html
+++ b/packages/ui/src/components/entreprise/entreprise-fiscalite.stories_snapshots_Loading.html
@@ -6,23 +6,23 @@
   <!----><strong>Cotisations</strong>
   <div class="_fiscalite-table_16f3a1">
     <div>a. Redevance communale</div>
-    <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+    <div class="_top-level_3306d0 _fiscalite-value_16f3a1" style="display: flex; justify-content: center;">
       <!---->
       <div class="_spinner_3306d0"></div>
     </div>
     <div>b. Redevance départementale</div>
-    <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+    <div class="_top-level_3306d0 _fiscalite-value_16f3a1" style="display: flex; justify-content: center;">
       <!---->
       <div class="_spinner_3306d0"></div>
     </div>
     <!---->
     <div>f. Frais de gestion de fiscalité directe locale (a+b)X 8%</div>
-    <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+    <div class="_top-level_3306d0 _fiscalite-value_16f3a1" style="display: flex; justify-content: center;">
       <!---->
       <div class="_spinner_3306d0"></div>
     </div>
     <div>Somme à payer auprès du comptable (2)</div>
-    <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+    <div class="_top-level_3306d0 _fiscalite-value_16f3a1" style="display: flex; justify-content: center;">
       <!---->
       <div class="_spinner_3306d0"></div>
     </div>
diff --git a/packages/ui/src/components/entreprise/entreprise-fiscalite.stories_snapshots_WithError.html b/packages/ui/src/components/entreprise/entreprise-fiscalite.stories_snapshots_WithError.html
index 700e437fd83f5a74e7f9bb182ba123334200dcce..82940d269d9309e32d068aad42bb7f6d5482d6d5 100644
--- a/packages/ui/src/components/entreprise/entreprise-fiscalite.stories_snapshots_WithError.html
+++ b/packages/ui/src/components/entreprise/entreprise-fiscalite.stories_snapshots_WithError.html
@@ -6,7 +6,7 @@
   <!----><strong>Cotisations</strong>
   <div class="_fiscalite-table_16f3a1">
     <div>a. Redevance communale</div>
-    <div class="" style="display: flex; justify-content: center;">
+    <div class=" _fiscalite-value_16f3a1" style="display: flex; justify-content: center;">
       <div>
         <div class="_tooltip_4f6ea8">
           <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
@@ -17,7 +17,7 @@
       <!---->
     </div>
     <div>b. Redevance départementale</div>
-    <div class="" style="display: flex; justify-content: center;">
+    <div class=" _fiscalite-value_16f3a1" style="display: flex; justify-content: center;">
       <div>
         <div class="_tooltip_4f6ea8">
           <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
@@ -29,7 +29,7 @@
     </div>
     <!---->
     <div>f. Frais de gestion de fiscalité directe locale (a+b)X 8%</div>
-    <div class="" style="display: flex; justify-content: center;">
+    <div class=" _fiscalite-value_16f3a1" style="display: flex; justify-content: center;">
       <div>
         <div class="_tooltip_4f6ea8">
           <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
@@ -40,7 +40,7 @@
       <!---->
     </div>
     <div>Somme à payer auprès du comptable (2)</div>
-    <div class="" style="display: flex; justify-content: center;">
+    <div class=" _fiscalite-value_16f3a1" style="display: flex; justify-content: center;">
       <div>
         <div class="_tooltip_4f6ea8">
           <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
diff --git a/packages/ui/src/components/etape-edition.stories.tsx b/packages/ui/src/components/etape-edition.stories.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..7f3999a83944b7d2b5a89a3aec25335f588ce948
--- /dev/null
+++ b/packages/ui/src/components/etape-edition.stories.tsx
@@ -0,0 +1,870 @@
+import { Meta, StoryFn } from '@storybook/vue3'
+import { action } from '@storybook/addon-actions'
+import { vueRouter } from 'storybook-vue3-router'
+import { Props, PureEtapeEdition } from './etape-edition'
+import { EntrepriseDocumentId, EntrepriseId, EtapeEntrepriseDocument, entrepriseDocumentIdValidator, entrepriseIdValidator, toEntrepriseDocumentId } from 'camino-common/src/entreprise'
+import { DemarcheId, demarcheIdOrSlugValidator, demarcheIdValidator, demarcheSlugValidator } from 'camino-common/src/demarche'
+import { EtapeId, EtapeWithHeritage, etapeDocumentIdValidator, etapeIdOrSlugValidator, etapeIdValidator, etapeSlugValidator } from 'camino-common/src/etape'
+import { titreIdValidator, titreSlugValidator } from 'camino-common/src/validators/titres'
+import { FeatureMultiPolygon, PerimetreInformations } from 'camino-common/src/perimetre'
+import { CaminoDate, caminoDateValidator, toCaminoDate } from 'camino-common/src/date'
+import { testBlankUser } from 'camino-common/src/tests-utils'
+import { EtapeTypeId } from 'camino-common/src/static/etapesTypes'
+import { tempDocumentNameValidator, TempDocumentName } from 'camino-common/src/document'
+import { UiEntrepriseDocumentInput } from './entreprise/entreprise-api-client'
+
+const meta: Meta = {
+  title: 'Components/EtapeEdition',
+  // @ts-ignore
+  component: PureEtapeEdition,
+  decorators: [vueRouter([{ name: 'titre' }])],
+}
+export default meta
+
+const getEtapeAction = action('getEtape')
+const deposeEtapeAction = action('deposeEtape')
+const getEtapeHeritagePotentielAction = action('getEtapeHeritagePotentiel')
+const getDemarcheByIdOrSlugAction = action('getDemarcheByIdOrSlug')
+const getPerimetreInfosByDemarcheIdAction = action('getPerimetreInfosByDemarcheId')
+const getPerimetreInfosByEtapeIdAction = action('getPerimetreInfosByEtapeId')
+const getEtapesTypesEtapesStatutsAction = action('getEtapesTypesEtapesStatuts')
+const geojsonImportAction = action('geojsonImport')
+const uploadTempDocumentAction = action('uploadTempDocument')
+const getGeojsonByGeoSystemeIdAction = action('getGeojsonByGeoSystemeId')
+const getEtapeDocumentsByEtapeIdAction = action('getEtapeDocumentsByEtapeId')
+const getEtapeEntrepriseDocumentsAction = action('getEtapeEntrepriseDocuments')
+const creerEntrepriseDocumentAction = action('creerEntrepriseDocument')
+const goToDemarcheAction = action('goToDemarche')
+const etapeCreerAction = action('etapeCreer')
+const etapeModifierAction = action('etapeModifier')
+
+const entreprises = [
+  { id: entrepriseIdValidator.parse('fr-899600233'), nom: '10 A', legal_siren: '899600233' },
+  { id: entrepriseIdValidator.parse('fr-529770646'), nom: '2GRE', legal_siren: '529770646' },
+  { id: entrepriseIdValidator.parse('fr-895187920'), nom: '45-8 AVANT-MONTS', legal_siren: '895187920' },
+  { id: entrepriseIdValidator.parse('fr-831762786'), nom: '45-8 FONTS-BOUILLANTS', legal_siren: '831762786' },
+  { id: entrepriseIdValidator.parse('fr-539449124'), nom: '6EME SENS IMMOBILIER ENTREPRISES', legal_siren: '539449124' },
+  { id: entrepriseIdValidator.parse('xx-100000146'), nom: '8 communes de la vallée de Vicdessos', legal_siren: null },
+  { id: entrepriseIdValidator.parse('xx-97300a001'), nom: 'Aboeka Alphonse', legal_siren: null },
+  { id: entrepriseIdValidator.parse('fr-523359024'), nom: 'ABOEKA METAL', legal_siren: '523359024' },
+  { id: entrepriseIdValidator.parse('xx-97300a002'), nom: 'Aboeka Thomas', legal_siren: null },
+  { id: entrepriseIdValidator.parse('fr-839888138'), nom: 'ABOUNAMI GOLD', legal_siren: '839888138' },
+]
+
+const perimetreInformations: PerimetreInformations = {
+  sdomZoneIds: ['1'],
+  superposition_alertes: [{ nom: 'Titre Tutu', slug: titreSlugValidator.parse('slug-tutu'), titre_statut_id: 'mod' }],
+}
+
+const heritagePropsAllFalse: EtapeWithHeritage['heritageProps'] = {
+  dateDebut: {
+    actif: false,
+  },
+  dateFin: {
+    actif: false,
+  },
+  duree: {
+    actif: false,
+  },
+  substances: {
+    actif: false,
+  },
+  titulaires: {
+    actif: false,
+  },
+  amodiataires: {
+    actif: false,
+  },
+  perimetre: {
+    actif: false,
+  },
+}
+
+const heritageProps: EtapeWithHeritage['heritageProps'] = {
+  dateDebut: {
+    actif: false,
+  },
+  dateFin: {
+    actif: false,
+    etape: {
+      date: toCaminoDate('2022-01-01'),
+      typeId: 'mfr',
+      dateFin: toCaminoDate('2022-01-01'),
+    },
+  },
+  duree: {
+    actif: false,
+    etape: {
+      date: toCaminoDate('2022-01-01'),
+      typeId: 'mfr',
+      duree: 12,
+    },
+  },
+  substances: {
+    actif: true,
+    etape: {
+      date: toCaminoDate('2022-01-01'),
+      typeId: 'mfr',
+      substances: ['arge'],
+    },
+  },
+  titulaires: {
+    actif: false,
+  },
+  amodiataires: {
+    actif: false,
+  },
+  perimetre: {
+    actif: false,
+  },
+}
+
+const perimetre: FeatureMultiPolygon = {
+  type: 'Feature',
+  properties: {},
+
+  geometry: {
+    type: 'MultiPolygon',
+    coordinates: [
+      [
+        [
+          [-52.54, 4.22269896902571],
+          [-52.55, 4.22438936251509],
+          [-52.55, 4.24113309117193],
+          [-52.54, 4.22269896902571],
+        ],
+      ],
+    ],
+  },
+}
+
+const apiClient: Props['apiClient'] = {
+  deposeEtape(etapeId) {
+    deposeEtapeAction(etapeId)
+
+    return Promise.resolve(undefined)
+  },
+  etapeCreer(etape) {
+    etapeCreerAction(etape)
+
+    return Promise.resolve(etapeIdValidator.parse('etapeIdSaved'))
+  },
+  etapeModifier(etape) {
+    etapeModifierAction(etape)
+
+    return Promise.resolve(etape.id)
+  },
+  getEntrepriseDocuments(id) {
+    return Promise.resolve([
+      {
+        id: toEntrepriseDocumentId(toCaminoDate('2023-06-23'), 'jct', 'ueoau'),
+        description: '',
+        date: toCaminoDate('2023-06-23'),
+        entreprise_document_type_id: 'jct',
+        can_delete_document: false,
+        entreprise_id: id,
+      },
+      {
+        id: toEntrepriseDocumentId(toCaminoDate('2023-06-03'), 'atf', 'ueoau'),
+        description: "Attestation sur l'honneur",
+        date: toCaminoDate('2023-06-03'),
+        entreprise_document_type_id: 'atf',
+        can_delete_document: false,
+        entreprise_id: id,
+      },
+      {
+        id: toEntrepriseDocumentId(toCaminoDate('2023-06-23'), 'cur', 'ueoau'),
+        description: 'Jon. Doe',
+        date: toCaminoDate('2023-06-23'),
+        entreprise_document_type_id: 'cur',
+        can_delete_document: false,
+        entreprise_id: id,
+      },
+      {
+        id: toEntrepriseDocumentId(toCaminoDate('2023-06-23'), 'jid', 'eaoueo'),
+        description: 'Jon. Doe',
+        date: toCaminoDate('2023-06-23'),
+        entreprise_document_type_id: 'jid',
+        can_delete_document: false,
+        entreprise_id: id,
+      },
+      {
+        id: toEntrepriseDocumentId(toCaminoDate('2023-06-23'), 'jid', 'ueoau'),
+        description: 'Arm. Strong',
+        date: toCaminoDate('2023-06-23'),
+        entreprise_document_type_id: 'jid',
+        can_delete_document: false,
+        entreprise_id: id,
+      },
+      {
+        id: toEntrepriseDocumentId(toCaminoDate('2023-06-23'), 'idm', 'ueoaue'),
+        description: 'Facture pelle',
+        date: toCaminoDate('2023-06-23'),
+        entreprise_document_type_id: 'idm',
+        can_delete_document: false,
+        entreprise_id: id,
+      },
+      {
+        id: toEntrepriseDocumentId(toCaminoDate('2023-06-08'), 'kbi', 'ueoau'),
+        description: '',
+        date: toCaminoDate('2023-06-08'),
+        entreprise_document_type_id: 'kbi',
+        can_delete_document: false,
+        entreprise_id: id,
+      },
+      {
+        id: toEntrepriseDocumentId(toCaminoDate('2023-06-23'), 'jcf', 'uueoau'),
+        description: '',
+        date: toCaminoDate('2023-06-23'),
+        entreprise_document_type_id: 'jcf',
+        can_delete_document: false,
+        entreprise_id: id,
+      },
+    ])
+  },
+  getEtapesTypesEtapesStatuts(demarcheId: DemarcheId, titreEtapeId: EtapeId | null, date: CaminoDate) {
+    getEtapesTypesEtapesStatutsAction(demarcheId, titreEtapeId, date)
+
+    return Promise.resolve([
+      { etapeTypeId: 'mfr', etapeStatutId: 'fai', mainStep: true },
+      { etapeTypeId: 'mfr', etapeStatutId: 'aco', mainStep: true },
+      { etapeTypeId: 'mdp', etapeStatutId: 'fai', mainStep: true },
+      { etapeTypeId: 'mod', etapeStatutId: 'fai', mainStep: true },
+    ])
+  },
+  getEtapeHeritagePotentiel(titreDemarcheId: DemarcheId, date: CaminoDate, typeId: EtapeTypeId) {
+    getEtapeHeritagePotentielAction(titreDemarcheId, date, typeId)
+
+    return Promise.resolve({
+      heritageContenu: { arm: { mecanise: { actif: false }, franchissements: { actif: false } } },
+      heritageProps,
+    })
+  },
+  geojsonImport(body, geoSystemeId) {
+    geojsonImportAction(body, geoSystemeId)
+
+    return Promise.reject(new Error('plop'))
+  },
+  geojsonPointsImport(body, geoSystemeId) {
+    geojsonImportAction(body, geoSystemeId)
+
+    return Promise.reject(new Error('plop'))
+  },
+  geojsonForagesImport(body, geoSystemeId) {
+    geojsonImportAction(body, geoSystemeId)
+
+    return Promise.reject(new Error('plop'))
+  },
+  uploadTempDocument(document) {
+    uploadTempDocumentAction(document)
+
+    return Promise.resolve(tempDocumentNameValidator.parse('name'))
+  },
+  getGeojsonByGeoSystemeId(geojson, geoSystemeId) {
+    getGeojsonByGeoSystemeIdAction(geojson, geoSystemeId)
+
+    return Promise.resolve(geojson)
+  },
+  getEtapeDocumentsByEtapeId(etapeId: EtapeId) {
+    getEtapeDocumentsByEtapeIdAction(etapeId)
+
+    return Promise.resolve({ etapeDocuments: [], dae: null, asl: null })
+  },
+  getEtapeEntrepriseDocuments(etapeId: EtapeId): Promise<EtapeEntrepriseDocument[]> {
+    getEtapeEntrepriseDocumentsAction(etapeId)
+
+    return Promise.resolve([])
+  },
+  creerEntrepriseDocument(entrepriseId: EntrepriseId, entrepriseDocumentInput: UiEntrepriseDocumentInput, tempDocumentName: TempDocumentName): Promise<EntrepriseDocumentId> {
+    creerEntrepriseDocumentAction(entrepriseId, entrepriseDocumentInput, tempDocumentName)
+
+    return Promise.resolve(entrepriseDocumentIdValidator.parse('entrepriseDocumentId'))
+  },
+  getEtape(etapeIdOrSlug) {
+    getEtapeAction(etapeIdOrSlug)
+
+    return Promise.resolve({
+      id: etapeIdValidator.parse('etape-id'),
+      slug: etapeSlugValidator.parse('etape-slug'),
+      typeId: 'mfr',
+      statutId: 'fai',
+      titreDemarcheId: demarcheIdValidator.parse('demarche-id'),
+      date: caminoDateValidator.parse('2023-02-01'),
+      dateDebut: null,
+      dateFin: null,
+      duree: null,
+      substances: [],
+      titulaires: [],
+      amodiataires: [],
+      contenu: {},
+      notes: null,
+      geojson4326Forages: null,
+      geojson4326Perimetre: null,
+      geojson4326Points: null,
+      geojsonOrigineForages: null,
+      geojsonOrigineGeoSystemeId: null,
+      geojsonOriginePerimetre: null,
+      geojsonOriginePoints: null,
+      surface: null,
+      demarche: {
+        slug: demarcheSlugValidator.parse('demarche-slug'),
+        typeId: 'oct',
+        description: 'Super description',
+        titre: {
+          id: titreIdValidator.parse('titre-id'),
+          slug: titreSlugValidator.parse('titre-slug'),
+          nom: 'Nom du titre',
+          typeId: 'arm',
+        },
+      },
+      heritageContenu: {},
+      heritageProps: {
+        amodiataires: { actif: false },
+        dateDebut: { actif: false },
+        dateFin: { actif: false },
+        duree: { actif: false },
+        perimetre: { actif: false },
+        substances: { actif: false },
+        titulaires: { actif: false },
+      },
+    })
+  },
+  getDemarcheByIdOrSlug(demarcheIdOrSlug) {
+    getDemarcheByIdOrSlugAction(demarcheIdOrSlug)
+
+    return Promise.resolve({
+      demarche_description: 'Super description',
+      demarche_id: demarcheIdValidator.parse('demarche-id'),
+      demarche_slug: demarcheSlugValidator.parse('demarche-slug'),
+      demarche_type_id: 'oct',
+      titre_id: titreIdValidator.parse('titre-id'),
+      titre_nom: 'Nom du titre',
+      titre_slug: titreSlugValidator.parse('titre-slug'),
+      titre_type_id: 'arm',
+    })
+  },
+  getPerimetreInfosByDemarcheId(demarcheId) {
+    getPerimetreInfosByDemarcheIdAction(demarcheId)
+
+    return Promise.resolve(perimetreInformations)
+  },
+  getPerimetreInfosByEtapeId(etapeId) {
+    getPerimetreInfosByEtapeIdAction(etapeId)
+
+    return Promise.resolve(perimetreInformations)
+  },
+}
+
+export const Creation: StoryFn = () => (
+  <PureEtapeEdition
+    goToDemarche={goToDemarcheAction}
+    entreprises={entreprises}
+    apiClient={apiClient}
+    user={{ ...testBlankUser, role: 'super' }}
+    initTab="points"
+    demarcheIdOrSlug={demarcheIdOrSlugValidator.parse('demarche-id')}
+    etapeIdOrSlug={null}
+  />
+)
+
+export const Modification: StoryFn = () => (
+  <PureEtapeEdition
+    goToDemarche={goToDemarcheAction}
+    entreprises={entreprises}
+    apiClient={apiClient}
+    user={null}
+    demarcheIdOrSlug={null}
+    initTab="points"
+    etapeIdOrSlug={etapeIdOrSlugValidator.parse('etape-id')}
+  />
+)
+
+export const AffichageAide: StoryFn = () => (
+  <PureEtapeEdition
+    goToDemarche={goToDemarcheAction}
+    entreprises={entreprises}
+    apiClient={{
+      ...apiClient,
+      getEtape(etapeIdOrSlug) {
+        getEtapeAction(etapeIdOrSlug)
+
+        return Promise.resolve({
+          id: etapeIdValidator.parse('etape-id'),
+          slug: etapeSlugValidator.parse('etape-slug'),
+          typeId: 'mfr',
+          statutId: 'fai',
+          titreDemarcheId: demarcheIdValidator.parse('demarche-id'),
+          date: caminoDateValidator.parse('2023-02-01'),
+          dateDebut: null,
+          dateFin: null,
+          duree: null,
+          substances: [],
+          titulaires: [],
+          amodiataires: [],
+          contenu: {},
+          notes: null,
+          geojson4326Forages: null,
+          geojson4326Perimetre: null,
+          geojson4326Points: null,
+          geojsonOrigineForages: null,
+          geojsonOrigineGeoSystemeId: null,
+          geojsonOriginePerimetre: null,
+          geojsonOriginePoints: null,
+          surface: null,
+          demarche: {
+            slug: demarcheSlugValidator.parse('demarche-slug'),
+            typeId: 'oct',
+            description: 'Super description',
+            titre: {
+              id: titreIdValidator.parse('titre-id'),
+              slug: titreSlugValidator.parse('titre-slug'),
+              nom: 'Nom du titre',
+              typeId: 'arm',
+            },
+          },
+          heritageContenu: {},
+          heritageProps: {
+            amodiataires: { actif: false },
+            dateDebut: { actif: false },
+            dateFin: { actif: false },
+            duree: { actif: false },
+            perimetre: { actif: false },
+            substances: { actif: false },
+            titulaires: { actif: false },
+          },
+        })
+      },
+    }}
+    user={null}
+    demarcheIdOrSlug={null}
+    initTab="points"
+    etapeIdOrSlug={etapeIdOrSlugValidator.parse('etape-id')}
+  />
+)
+
+export const DemandeArmComplete: StoryFn = () => (
+  <PureEtapeEdition
+    goToDemarche={goToDemarcheAction}
+    entreprises={entreprises}
+    apiClient={{
+      ...apiClient,
+      getEtapeHeritagePotentiel(titreDemarcheId: DemarcheId, date: CaminoDate, typeId: EtapeTypeId) {
+        getEtapeHeritagePotentielAction(titreDemarcheId, date, typeId)
+
+        return Promise.resolve({
+          heritageContenu: { arm: { mecanise: { actif: false }, franchissements: { actif: false } } },
+          heritageProps: {
+            dateDebut: {
+              actif: false,
+            },
+            dateFin: {
+              actif: false,
+            },
+            duree: {
+              actif: false,
+            },
+            substances: {
+              actif: false,
+            },
+            titulaires: {
+              actif: false,
+            },
+            amodiataires: {
+              actif: false,
+            },
+            perimetre: {
+              actif: false,
+            },
+          },
+        })
+      },
+      getEtapeEntrepriseDocuments(etapeId: EtapeId): Promise<EtapeEntrepriseDocument[]> {
+        getEtapeEntrepriseDocumentsAction(etapeId)
+
+        const id = entreprises[0].id
+
+        return Promise.resolve([
+          {
+            id: toEntrepriseDocumentId(toCaminoDate('2023-06-23'), 'jct', 'ueoau'),
+            description: '',
+            date: toCaminoDate('2023-06-23'),
+            entreprise_document_type_id: 'jct',
+            entreprise_id: id,
+          },
+          {
+            id: toEntrepriseDocumentId(toCaminoDate('2023-06-03'), 'atf', 'ueoau'),
+            description: "Attestation sur l'honneur",
+            date: toCaminoDate('2023-06-03'),
+            entreprise_document_type_id: 'atf',
+            entreprise_id: id,
+          },
+          {
+            id: toEntrepriseDocumentId(toCaminoDate('2023-06-23'), 'cur', 'ueoau'),
+            description: 'Jon. Doe',
+            date: toCaminoDate('2023-06-23'),
+            entreprise_document_type_id: 'cur',
+            entreprise_id: id,
+          },
+          {
+            id: toEntrepriseDocumentId(toCaminoDate('2023-06-23'), 'jid', 'eaoueo'),
+            description: 'Jon. Doe',
+            date: toCaminoDate('2023-06-23'),
+            entreprise_document_type_id: 'jid',
+            entreprise_id: id,
+          },
+          {
+            id: toEntrepriseDocumentId(toCaminoDate('2023-06-23'), 'idm', 'ueoaue'),
+            description: 'Facture pelle',
+            date: toCaminoDate('2023-06-23'),
+            entreprise_document_type_id: 'idm',
+            entreprise_id: id,
+          },
+          {
+            id: toEntrepriseDocumentId(toCaminoDate('2023-06-08'), 'kbi', 'ueoau'),
+            description: '',
+            date: toCaminoDate('2023-06-08'),
+            entreprise_document_type_id: 'kbi',
+            entreprise_id: id,
+          },
+          {
+            id: toEntrepriseDocumentId(toCaminoDate('2023-06-23'), 'jcf', 'uueoau'),
+            description: '',
+            date: toCaminoDate('2023-06-23'),
+            entreprise_document_type_id: 'jcf',
+            entreprise_id: id,
+          },
+        ])
+      },
+      getEtapeDocumentsByEtapeId(etapeId: EtapeId) {
+        getEtapeDocumentsByEtapeIdAction(etapeId)
+
+        return Promise.resolve({
+          etapeDocuments: [
+            {
+              id: etapeDocumentIdValidator.parse('id1'),
+              description: null,
+              etape_document_type_id: 'car',
+              public_lecture: true,
+              entreprises_lecture: true,
+            },
+            {
+              id: etapeDocumentIdValidator.parse('id2'),
+              description: null,
+              etape_document_type_id: 'dep',
+              public_lecture: true,
+              entreprises_lecture: true,
+            },
+            {
+              id: etapeDocumentIdValidator.parse('id2'),
+              description: null,
+              etape_document_type_id: 'doe',
+              public_lecture: true,
+              entreprises_lecture: true,
+            },
+            {
+              id: etapeDocumentIdValidator.parse('id2'),
+              description: null,
+              etape_document_type_id: 'dom',
+              public_lecture: true,
+              entreprises_lecture: true,
+            },
+            {
+              id: etapeDocumentIdValidator.parse('id2'),
+              description: null,
+              etape_document_type_id: 'for',
+              public_lecture: true,
+              entreprises_lecture: true,
+            },
+            {
+              id: etapeDocumentIdValidator.parse('id2'),
+              description: null,
+              etape_document_type_id: 'jpa',
+              public_lecture: true,
+              entreprises_lecture: true,
+            },
+          ],
+          dae: null,
+          asl: null,
+        })
+      },
+      getEtape(etapeIdOrSlug) {
+        getEtapeAction(etapeIdOrSlug)
+
+        return Promise.resolve({
+          id: etapeIdValidator.parse('etape-id'),
+          slug: etapeSlugValidator.parse('etape-slug'),
+          typeId: 'mfr',
+          statutId: 'aco',
+          titreDemarcheId: demarcheIdValidator.parse('demarche-id'),
+          date: caminoDateValidator.parse('2023-02-01'),
+          dateDebut: null,
+          dateFin: null,
+          duree: 6,
+          substances: ['arge'],
+          titulaires: [{ id: entreprises[0].id, operateur: false }],
+          amodiataires: [],
+          contenu: { arm: { mecanise: true, franchissements: 9 } },
+          notes: null,
+          geojson4326Forages: null,
+          geojson4326Perimetre: perimetre,
+          geojson4326Points: null,
+          geojsonOrigineForages: null,
+          geojsonOrigineGeoSystemeId: '4326',
+          geojsonOriginePerimetre: perimetre,
+          geojsonOriginePoints: null,
+          surface: null,
+          demarche: {
+            slug: demarcheSlugValidator.parse('demarche-slug'),
+            typeId: 'oct',
+            description: 'Super description',
+            titre: {
+              id: titreIdValidator.parse('titre-id'),
+              slug: titreSlugValidator.parse('titre-slug'),
+              nom: 'Nom du titre',
+              typeId: 'arm',
+            },
+          },
+          heritageContenu: {},
+          heritageProps: {
+            amodiataires: { actif: false },
+            dateDebut: { actif: false },
+            dateFin: { actif: false },
+            duree: { actif: false },
+            perimetre: { actif: false },
+            substances: { actif: false },
+            titulaires: { actif: false },
+          },
+        })
+      },
+    }}
+    user={{ ...testBlankUser, role: 'super' }}
+    initTab="points"
+    demarcheIdOrSlug={null}
+    etapeIdOrSlug={etapeIdOrSlugValidator.parse('etape-id')}
+  />
+)
+
+const modHeritageProps: EtapeWithHeritage['heritageProps'] = {
+  dateDebut: {
+    actif: true,
+    etape: {
+      date: toCaminoDate('2022-01-01'),
+      typeId: 'mfr',
+      dateDebut: toCaminoDate('2021-01-01'),
+    },
+  },
+  dateFin: {
+    actif: true,
+    etape: {
+      date: toCaminoDate('2022-01-01'),
+      typeId: 'mfr',
+      dateFin: toCaminoDate('2022-01-01'),
+    },
+  },
+  duree: {
+    actif: true,
+    etape: {
+      date: toCaminoDate('2022-01-01'),
+      typeId: 'mfr',
+      duree: 12,
+    },
+  },
+  substances: {
+    actif: true,
+    etape: {
+      date: toCaminoDate('2022-01-01'),
+      typeId: 'mfr',
+      substances: ['arge'],
+    },
+  },
+  titulaires: {
+    actif: true,
+    etape: {
+      date: toCaminoDate('2022-01-01'),
+      typeId: 'mfr',
+      titulaires: [{ id: entreprises[0].id, operateur: false }],
+    },
+  },
+  amodiataires: {
+    actif: false,
+  },
+  perimetre: {
+    actif: true,
+    etape: {
+      date: toCaminoDate('2022-01-01'),
+      typeId: 'mfr',
+      geojson4326Forages: null,
+      geojson4326Perimetre: perimetre,
+      geojson4326Points: null,
+      geojsonOrigineForages: null,
+      geojsonOrigineGeoSystemeId: '4326',
+      geojsonOriginePerimetre: perimetre,
+      geojsonOriginePoints: null,
+      surface: null,
+    },
+  },
+}
+
+export const ModificationDemandeHeritee: StoryFn = () => (
+  <PureEtapeEdition
+    goToDemarche={goToDemarcheAction}
+    entreprises={entreprises}
+    apiClient={{
+      ...apiClient,
+      getEtapeHeritagePotentiel(titreDemarcheId: DemarcheId, date: CaminoDate, typeId: EtapeTypeId) {
+        getEtapeHeritagePotentielAction(titreDemarcheId, date, typeId)
+
+        return Promise.resolve({
+          heritageContenu: {
+            arm: {
+              mecanise: {
+                actif: true,
+                etape: {
+                  date: toCaminoDate('2022-01-01'),
+                  typeId: 'mfr',
+                  contenu: { arm: { mecanise: true } },
+                },
+              },
+              franchissements: {
+                actif: true,
+                etape: {
+                  date: toCaminoDate('2022-01-01'),
+                  typeId: 'mfr',
+                  contenu: { arm: { franchissements: 2 } },
+                },
+              },
+            },
+          },
+          heritageProps: modHeritageProps,
+        })
+      },
+      getEtape(etapeIdOrSlug) {
+        getEtapeAction(etapeIdOrSlug)
+
+        return Promise.resolve({
+          id: etapeIdValidator.parse('etape-id'),
+          slug: etapeSlugValidator.parse('etape-slug'),
+          typeId: 'mod',
+          statutId: 'fai',
+          titreDemarcheId: demarcheIdValidator.parse('demarche-id'),
+          date: caminoDateValidator.parse('2023-02-01'),
+          dateDebut: null,
+          dateFin: null,
+          duree: 6,
+          substances: [],
+          titulaires: [],
+          amodiataires: [],
+          contenu: {},
+          notes: null,
+          geojson4326Forages: null,
+          geojson4326Perimetre: null,
+          geojson4326Points: null,
+          geojsonOrigineForages: null,
+          geojsonOrigineGeoSystemeId: null,
+          geojsonOriginePerimetre: null,
+          geojsonOriginePoints: null,
+          surface: null,
+          demarche: {
+            slug: demarcheSlugValidator.parse('demarche-slug'),
+            typeId: 'oct',
+            description: 'Super description',
+            titre: {
+              id: titreIdValidator.parse('titre-id'),
+              slug: titreSlugValidator.parse('titre-slug'),
+              nom: 'Nom du titre',
+              typeId: 'arm',
+            },
+          },
+          heritageContenu: {
+            arm: {
+              mecanise: {
+                actif: true,
+                etape: {
+                  date: toCaminoDate('2022-01-01'),
+                  typeId: 'mfr',
+                  contenu: { arm: { mecanise: true } },
+                },
+              },
+              franchissements: {
+                actif: true,
+                etape: {
+                  date: toCaminoDate('2022-01-01'),
+                  typeId: 'mfr',
+                  contenu: { arm: { franchissements: 2 } },
+                },
+              },
+            },
+          },
+          heritageProps: modHeritageProps,
+        })
+      },
+    }}
+    user={{ ...testBlankUser, role: 'super' }}
+    initTab="points"
+    demarcheIdOrSlug={null}
+    etapeIdOrSlug={etapeIdOrSlugValidator.parse('etape-id')}
+  />
+)
+
+export const AxmEnZoneDuSdom: StoryFn = () => (
+  <PureEtapeEdition
+    goToDemarche={goToDemarcheAction}
+    entreprises={entreprises}
+    apiClient={{
+      ...apiClient,
+      getEtapeHeritagePotentiel(titreDemarcheId: DemarcheId, date: CaminoDate, typeId: EtapeTypeId) {
+        getEtapeHeritagePotentielAction(titreDemarcheId, date, typeId)
+
+        return Promise.resolve({
+          heritageContenu: {},
+          heritageProps: heritagePropsAllFalse,
+        })
+      },
+      getEtape(etapeIdOrSlug) {
+        getEtapeAction(etapeIdOrSlug)
+
+        return Promise.resolve({
+          id: etapeIdValidator.parse('etape-id'),
+          slug: etapeSlugValidator.parse('etape-slug'),
+          typeId: 'mfr',
+          statutId: 'aco',
+          titreDemarcheId: demarcheIdValidator.parse('demarche-id'),
+          date: caminoDateValidator.parse('2023-02-01'),
+          dateDebut: null,
+          dateFin: null,
+          duree: 6,
+          substances: [],
+          titulaires: [],
+          amodiataires: [],
+          contenu: {},
+          notes: null,
+          geojson4326Forages: null,
+          geojson4326Perimetre: null,
+          geojson4326Points: null,
+          geojsonOrigineForages: null,
+          geojsonOrigineGeoSystemeId: null,
+          geojsonOriginePerimetre: null,
+          geojsonOriginePoints: null,
+          surface: null,
+          demarche: {
+            slug: demarcheSlugValidator.parse('demarche-slug'),
+            typeId: 'oct',
+            description: 'Super description',
+            titre: {
+              id: titreIdValidator.parse('titre-id'),
+              slug: titreSlugValidator.parse('titre-slug'),
+              nom: 'Nom du titre',
+              typeId: 'axm',
+            },
+          },
+          heritageContenu: {},
+          heritageProps: heritagePropsAllFalse,
+        })
+      },
+    }}
+    user={{ ...testBlankUser, role: 'entreprise', entreprises: [{ id: entrepriseIdValidator.parse('entrepriseID'), nom: 'Entreprise' }] }}
+    initTab="points"
+    demarcheIdOrSlug={null}
+    etapeIdOrSlug={etapeIdOrSlugValidator.parse('etape-id')}
+  />
+)
diff --git a/packages/ui/src/components/etape-edition.stories_snapshots_AffichageAide.html b/packages/ui/src/components/etape-edition.stories_snapshots_AffichageAide.html
new file mode 100644
index 0000000000000000000000000000000000000000..06ef6314af7981f1f8826b084be1a806d8a98b47
--- /dev/null
+++ b/packages/ui/src/components/etape-edition.stories_snapshots_AffichageAide.html
@@ -0,0 +1,228 @@
+<div class="dsfr">
+  <div><a href="/mocked-href" title="Nom du titre" class="fr-link" aria-label="Nom du titre">Nom du titre</a><span> &gt; </span><span class="cap-first"> octroi Super description </span></div>
+  <h1 class="fr-mt-5w">Étape - Demande</h1>
+  <div class="fr-alert fr-alert--info fr-alert--sm">
+    <p><span>Besoin d’aide pour déposer votre demande ? <a class="fr-link" title="Page contact - site externe" href="https://camino.gitbook.io/guide-dutilisation/a-propos/contact" target="_blank" rel="noopener noreferrer">Page contact</a></span></p>
+  </div>
+  <form class="dsfr">
+    <!---->
+    <div gotodemarche="function(...args){let channel=import_preview_api.addons.getChannel(),id=(0,import_uuid.v4)(),minDepth=5,serializedArgs=args.map(serializeArg),normalizedArgs=args.length>1?serializedArgs:serializedArgs[0],actionDisplayToEmit={id,count:0,data:{name,args:normalizedArgs},options:{...actionOptions,maxDepth:minDepth+(actionOptions.depth||3),allowFunction:actionOptions.allowFunction||!1}};channel.emit(EVENT_ID,actionDisplayToEmit)}">
+      <div>
+        <div class="dsfr">
+          <h2 class="cap-first fr-pt-6w">Propriétés</h2>
+          <p style="z-index: unset; margin-bottom: 0px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;" class="fr-badge fr-badge--sm fr-badge--error fr-badge--no-icon" title="Incomplet" aria-label="Incomplet">Incomplet</p>
+          <!---->
+        </div>
+        <div>
+          <div class="fr-grid-row">
+            <div class="fr-col-12 fr-col-xl-6">
+              <!---->
+              <!---->
+              <!---->
+              <!---->
+              <!---->
+              <div>
+                <h6>Substances</h6>
+                <div class="mb-s">
+                  <div style="display: flex; flex-direction: column;">
+                    <div>
+                      <div style="display: flex;" class="fr-mt-2w">
+                        <div id="typeahead_271_wrapper" class="_typeahead_8eddf1 dsfr">
+                          <div class="flex"><input id="typeahead_271" type="text" name="typeahead_271" class="_typeahead-input_8eddf1 fr-input" placeholder="" autocomplete="off"></div>
+                          <!---->
+                        </div>
+                        <!---->
+                        <!----><button class="fr-btn fr-btn--secondary fr-btn--md fr-icon-delete-bin-line fr-ml-2w" title="Supprimer la substance " aria-label="Supprimer la substance " type="button">
+                          <!---->
+                        </button>
+                      </div>
+                    </div>
+                    <!---->
+                  </div>
+                  <!---->
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div>
+        <div class="dsfr">
+          <h2 class="cap-first fr-pt-6w">Propriétés spécifiques</h2>
+          <p style="z-index: unset; margin-bottom: 0px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;" class="fr-badge fr-badge--sm fr-badge--error fr-badge--no-icon" title="Incomplet" aria-label="Incomplet">Incomplet</p>
+          <div class="fr-alert fr-alert--info fr-alert--sm">
+            <p>Ce bloc permet de savoir si la prospection est mécanisée ou non et s’il y a des franchissements de cours d’eau (si oui, combien ?)</p>
+          </div>
+        </div>
+        <div>
+          <div class="fr-grid-row">
+            <div class="fr-col-12 fr-col-xl-6">
+              <div>
+                <h3>Caractéristiques ARM</h3>
+                <div class="mb-s">
+                  <div>
+                    <fieldset class="fr-fieldset" id="mecanise" aria-labelledby="mecanise-legend">
+                      <legend class="fr-fieldset__legend--regular fr-fieldset__legend" id="mecanise-legend">Prospection mécanisée *
+                        <!---->
+                      </legend>
+                      <div class="fr-fieldset__element">
+                        <div class="fr-radio-group"><input type="radio" id="mecanise-0" name="mecanise"><label class="fr-label" for="mecanise-0">Oui
+                            <!---->
+                          </label></div>
+                      </div>
+                      <div class="fr-fieldset__element">
+                        <div class="fr-radio-group"><input type="radio" id="mecanise-1" name="mecanise"><label class="fr-label" for="mecanise-1">Non
+                            <!---->
+                          </label></div>
+                      </div>
+                    </fieldset>
+                  </div>
+                  <!---->
+                </div>
+                <div class="mb-s">
+                  <div>
+                    <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_670">Franchissements de cours d'eau
+                        <!----><span class="fr-hint-text">Nombre de franchissements de cours d'eau</span>
+                      </label><input class="fr-input" name="input_670" id="input_670" type="number" min="0">
+                      <!---->
+                    </div>
+                  </div>
+                  <!---->
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div>
+        <div class="dsfr">
+          <h2 class="cap-first fr-pt-6w">Périmètre</h2>
+          <p style="z-index: unset; margin-bottom: 0px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;" class="fr-badge fr-badge--sm fr-badge--error fr-badge--no-icon" title="Incomplet" aria-label="Incomplet">Incomplet</p>
+          <!---->
+        </div>
+        <div>
+          <div>
+            <div class="mb-s">
+              <div><button class="fr-btn fr-btn--primary fr-btn--md" title="Importer un périmètre" aria-label="Importer un périmètre" type="button">Importer un périmètre</button>
+                <!---->
+                <!---->
+                <!---->
+              </div>
+              <!---->
+            </div>
+            <!---->
+            <!---->
+            <!---->
+          </div>
+        </div>
+      </div>
+      <div>
+        <div class="dsfr">
+          <h2 class="cap-first fr-pt-6w">Liste des documents</h2>
+          <p style="z-index: unset; margin-bottom: 0px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;" class="fr-badge fr-badge--sm fr-badge--error fr-badge--no-icon" title="Incomplet" aria-label="Incomplet">Incomplet</p>
+          <!---->
+        </div>
+        <div>
+          <div class="fr-table fr-mb-0">
+            <table style="display: table;">
+              <caption>Documents obligatoires</caption>
+              <thead>
+                <tr>
+                  <th scope="col">Nom</th>
+                  <th scope="col">Description</th>
+                  <th scope="col">Visibilité</th>
+                  <th scope="col" style="display: flex; justify-content: end;">Action</th>
+                </tr>
+              </thead>
+              <tbody>
+                <tr>
+                  <td class="fr-label--disabled">Documents cartographiques</td>
+                  <td>-</td>
+                  <td>-</td>
+                  <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Documents cartographiques" aria-label="Ajouter un document Documents cartographiques" type="button">
+                      <!---->
+                    </button></td>
+                </tr>
+                <tr>
+                  <td class="fr-label--disabled">Dossier de demande</td>
+                  <td>-</td>
+                  <td>-</td>
+                  <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Dossier de demande" aria-label="Ajouter un document Dossier de demande" type="button">
+                      <!---->
+                    </button></td>
+                </tr>
+                <tr>
+                  <td class="fr-label--disabled">Formulaire de demande</td>
+                  <td>-</td>
+                  <td>-</td>
+                  <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Formulaire de demande" aria-label="Ajouter un document Formulaire de demande" type="button">
+                      <!---->
+                    </button></td>
+                </tr>
+                <tr>
+                  <td class="fr-label--disabled">Justificatif de paiement</td>
+                  <td>-</td>
+                  <td>-</td>
+                  <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Justificatif de paiement" aria-label="Ajouter un document Justificatif de paiement" type="button">
+                      <!---->
+                    </button></td>
+                </tr>
+              </tbody>
+            </table>
+          </div>
+          <div style="display: flex; flex-direction: column;" class="fr-mt-3w">
+            <div class="fr-table fr-mb-0">
+              <table style="display: table;">
+                <caption>Documents complémentaires</caption>
+                <thead>
+                  <tr>
+                    <th scope="col">Nom</th>
+                    <th scope="col">Description</th>
+                    <th scope="col">Visibilité</th>
+                    <th scope="col" style="display: flex; justify-content: end;">Action</th>
+                  </tr>
+                </thead>
+                <tbody></tbody>
+              </table>
+            </div><button class="fr-btn fr-btn--secondary fr-btn--md fr-icon-add-line fr-btn--icon-right fr-mt-1w" title="Ajouter un document complémentaire" aria-label="Ajouter un document complémentaire" type="button" style="align-self: end;">Ajouter</button>
+          </div>
+          <!---->
+          <!---->
+          <!---->
+        </div>
+      </div>
+      <div>
+        <div class="dsfr">
+          <h2 class="cap-first fr-pt-6w">Documents d’entreprise</h2>
+          <!---->
+          <div class="fr-alert fr-alert--info fr-alert--sm">
+            <p>Les documents d’entreprise sont des documents propres à l'entreprise, et pourront être réutilisés pour la création d'un autre dossier et mis à jour si nécessaire. Ces documents d’entreprise sont consultables dans la fiche entreprise de votre société. Cette section permet de protéger et de centraliser les informations d'ordre privé relatives à la société et à son personnel.</p>
+          </div>
+        </div>
+        <div>
+          <div class="fr-alert fr-alert--warning fr-alert--sm fr-mt-2w">
+            <p>Aucun titulaire ou amodiataire associé à cette étape.</p>
+          </div>
+          <!---->
+        </div>
+      </div>
+      <div class="fr-input-group fr-mt-2w"><label class="fr-label" for="textarea_74">Notes
+          <!---->
+          <!---->
+        </label><textarea class="fr-input" name="textarea_74" id="textarea_74"></textarea></div>
+    </div>
+    <div class="fr-mt-2w fr-pt-2w fr-pb-2w" style="position: sticky; bottom: 0px; z-index: 100000; background: white;">
+      <div style="display: flex; flex-direction: column;">
+        <div class="fr-alert fr-alert--warning fr-alert--sm">
+          <p><a class="fr-link" title="Le titre Titre Tutu au statut « valide - modification en instance » est superposé à ce titre" href="/titres/slug-tutu" target="_blank">Le titre Titre Tutu au statut « valide - modification en instance » est superposé à ce titre</a></p>
+        </div>
+        <!---->
+        <div style="display: flex; justify-content: end; align-items: center;" class="fr-mt-2w">
+          <!----><button class="fr-btn fr-btn--primary fr-btn--md fr-ml-2w" disabled="" title="Enregistrer l'étape" aria-label="Enregistrer l'étape" type="submit">Enregistrer l'étape</button>
+          <!---->
+        </div>
+      </div>
+    </div>
+    <!---->
+  </form>
+</div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape-edition.stories_snapshots_AxmEnZoneDuSdom.html b/packages/ui/src/components/etape-edition.stories_snapshots_AxmEnZoneDuSdom.html
new file mode 100644
index 0000000000000000000000000000000000000000..56ec963dd0ed3ad9d9e6c3621c163ef3376fd8f0
--- /dev/null
+++ b/packages/ui/src/components/etape-edition.stories_snapshots_AxmEnZoneDuSdom.html
@@ -0,0 +1,247 @@
+<div class="dsfr">
+  <div><a href="/mocked-href" title="Nom du titre" class="fr-link" aria-label="Nom du titre">Nom du titre</a><span> &gt; </span><span class="cap-first"> octroi Super description </span></div>
+  <h1 class="fr-mt-5w">Étape - Demande</h1>
+  <div class="fr-alert fr-alert--info fr-alert--sm">
+    <p><span>Besoin d’aide pour déposer votre demande ? <a class="fr-link" title="Page contact - site externe" href="https://camino.gitbook.io/guide-dutilisation/a-propos/contact" target="_blank" rel="noopener noreferrer">Page contact</a></span></p>
+  </div>
+  <form class="dsfr">
+    <!---->
+    <div gotodemarche="function(...args){let channel=import_preview_api.addons.getChannel(),id=(0,import_uuid.v4)(),minDepth=5,serializedArgs=args.map(serializeArg),normalizedArgs=args.length>1?serializedArgs:serializedArgs[0],actionDisplayToEmit={id,count:0,data:{name,args:normalizedArgs},options:{...actionOptions,maxDepth:minDepth+(actionOptions.depth||3),allowFunction:actionOptions.allowFunction||!1}};channel.emit(EVENT_ID,actionDisplayToEmit)}">
+      <div>
+        <div class="dsfr">
+          <h2 class="cap-first fr-pt-6w">Propriétés</h2>
+          <p style="z-index: unset; margin-bottom: 0px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;" class="fr-badge fr-badge--sm fr-badge--error fr-badge--no-icon" title="Incomplet" aria-label="Incomplet">Incomplet</p>
+          <!---->
+        </div>
+        <div>
+          <div class="fr-grid-row">
+            <div class="fr-col-12 fr-col-xl-6">
+              <div class="mb-s">
+                <div style="display: flex;">
+                  <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_271">Durée (années) *
+                      <!---->
+                      <!---->
+                    </label><input class="fr-input" name="input_271" id="input_271" type="number">
+                    <!---->
+                  </div>
+                  <div class="fr-input-group fr-ml-2w" style="margin-bottom: 0px;"><label class="fr-label" for="input_670">Durée (mois) *
+                      <!---->
+                      <!---->
+                    </label><input class="fr-input" name="input_670" id="input_670" type="number">
+                    <!---->
+                  </div>
+                </div>
+                <!---->
+              </div>
+              <!---->
+              <!---->
+              <!---->
+              <!---->
+              <div>
+                <h6>Substances</h6>
+                <div class="mb-s">
+                  <div style="display: flex; flex-direction: column;">
+                    <div>
+                      <div style="display: flex;" class="fr-mt-2w">
+                        <div id="typeahead_74_wrapper" class="_typeahead_8eddf1 dsfr">
+                          <div class="flex"><input id="typeahead_74" type="text" name="typeahead_74" class="_typeahead-input_8eddf1 fr-input" placeholder="" autocomplete="off"></div>
+                          <!---->
+                        </div>
+                        <!---->
+                        <!----><button class="fr-btn fr-btn--secondary fr-btn--md fr-icon-delete-bin-line fr-ml-2w" title="Supprimer la substance " aria-label="Supprimer la substance " type="button">
+                          <!---->
+                        </button>
+                      </div>
+                    </div>
+                    <!---->
+                  </div>
+                  <!---->
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+      <!---->
+      <div>
+        <div class="dsfr">
+          <h2 class="cap-first fr-pt-6w">Périmètre</h2>
+          <p style="z-index: unset; margin-bottom: 0px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;" class="fr-badge fr-badge--sm fr-badge--error fr-badge--no-icon" title="Incomplet" aria-label="Incomplet">Incomplet</p>
+          <!---->
+        </div>
+        <div>
+          <div>
+            <div class="mb-s">
+              <div><button class="fr-btn fr-btn--primary fr-btn--md" title="Importer un périmètre" aria-label="Importer un périmètre" type="button">Importer un périmètre</button>
+                <!---->
+                <!---->
+                <!---->
+              </div>
+              <!---->
+            </div>
+            <!---->
+            <!---->
+            <!---->
+          </div>
+        </div>
+      </div>
+      <div>
+        <div class="dsfr">
+          <h2 class="cap-first fr-pt-6w">Liste des documents</h2>
+          <p style="z-index: unset; margin-bottom: 0px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;" class="fr-badge fr-badge--sm fr-badge--error fr-badge--no-icon" title="Incomplet" aria-label="Incomplet">Incomplet</p>
+          <!---->
+        </div>
+        <div>
+          <div class="fr-table fr-mb-0">
+            <table style="display: table;">
+              <caption>Documents obligatoires</caption>
+              <thead>
+                <tr>
+                  <th scope="col">Nom</th>
+                  <th scope="col">Description</th>
+                  <th scope="col">Visibilité</th>
+                  <th scope="col" style="display: flex; justify-content: end;">Action</th>
+                </tr>
+              </thead>
+              <tbody>
+                <tr>
+                  <td class="fr-label--disabled">Documents cartographiques</td>
+                  <td>-</td>
+                  <td>-</td>
+                  <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Documents cartographiques" aria-label="Ajouter un document Documents cartographiques" type="button">
+                      <!---->
+                    </button></td>
+                </tr>
+                <tr>
+                  <td class="fr-label--disabled">Lettre de demande</td>
+                  <td>-</td>
+                  <td>-</td>
+                  <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Lettre de demande" aria-label="Ajouter un document Lettre de demande" type="button">
+                      <!---->
+                    </button></td>
+                </tr>
+                <tr>
+                  <td class="fr-label--disabled">Identification de matériel</td>
+                  <td>-</td>
+                  <td>-</td>
+                  <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Identification de matériel" aria-label="Ajouter un document Identification de matériel" type="button">
+                      <!---->
+                    </button></td>
+                </tr>
+                <tr>
+                  <td class="fr-label--disabled">Mesures prévues pour réhabiliter le site </td>
+                  <td>-</td>
+                  <td>-</td>
+                  <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Mesures prévues pour réhabiliter le site " aria-label="Ajouter un document Mesures prévues pour réhabiliter le site " type="button">
+                      <!---->
+                    </button></td>
+                </tr>
+                <tr>
+                  <td class="fr-label--disabled">Méthodes pour l'exécution des travaux</td>
+                  <td>-</td>
+                  <td>-</td>
+                  <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Méthodes pour l'exécution des travaux" aria-label="Ajouter un document Méthodes pour l'exécution des travaux" type="button">
+                      <!---->
+                    </button></td>
+                </tr>
+                <tr>
+                  <td class="fr-label--disabled">Notice d’impact</td>
+                  <td>-</td>
+                  <td>-</td>
+                  <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Notice d’impact" aria-label="Ajouter un document Notice d’impact" type="button">
+                      <!---->
+                    </button></td>
+                </tr>
+                <tr>
+                  <td class="fr-label--disabled">Programme des travaux </td>
+                  <td>-</td>
+                  <td>-</td>
+                  <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Programme des travaux " aria-label="Ajouter un document Programme des travaux " type="button">
+                      <!---->
+                    </button></td>
+                </tr>
+                <tr>
+                  <td class="fr-label--disabled">Schéma de pénétration du massif forestier</td>
+                  <td>-</td>
+                  <td>-</td>
+                  <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Schéma de pénétration du massif forestier" aria-label="Ajouter un document Schéma de pénétration du massif forestier" type="button">
+                      <!---->
+                    </button></td>
+                </tr>
+                <tr>
+                  <td class="fr-label--disabled">Arrêté préfectoral de la mission autorité environnementale</td>
+                  <td>-</td>
+                  <td>-</td>
+                  <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Arrêté préfectoral de la mission autorité environnementale" aria-label="Ajouter un document Arrêté préfectoral de la mission autorité environnementale" type="button">
+                      <!---->
+                    </button></td>
+                </tr>
+                <tr>
+                  <td class="fr-label--disabled">Lettre de la décision du propriétaire du sol</td>
+                  <td>-</td>
+                  <td>-</td>
+                  <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Lettre de la décision du propriétaire du sol" aria-label="Ajouter un document Lettre de la décision du propriétaire du sol" type="button">
+                      <!---->
+                    </button></td>
+                </tr>
+              </tbody>
+            </table>
+          </div>
+          <div style="display: flex; flex-direction: column;" class="fr-mt-3w">
+            <div class="fr-table fr-mb-0">
+              <table style="display: table;">
+                <caption>Documents complémentaires</caption>
+                <thead>
+                  <tr>
+                    <th scope="col">Nom</th>
+                    <th scope="col">Description</th>
+                    <th scope="col">Visibilité</th>
+                    <th scope="col" style="display: flex; justify-content: end;">Action</th>
+                  </tr>
+                </thead>
+                <tbody></tbody>
+              </table>
+            </div><button class="fr-btn fr-btn--secondary fr-btn--md fr-icon-add-line fr-btn--icon-right fr-mt-1w" title="Ajouter un document complémentaire" aria-label="Ajouter un document complémentaire" type="button" style="align-self: end;">Ajouter</button>
+          </div>
+          <!---->
+          <!---->
+          <!---->
+        </div>
+      </div>
+      <div>
+        <div class="dsfr">
+          <h2 class="cap-first fr-pt-6w">Documents d’entreprise</h2>
+          <!---->
+          <div class="fr-alert fr-alert--info fr-alert--sm">
+            <p>Les documents d’entreprise sont des documents propres à l'entreprise, et pourront être réutilisés pour la création d'un autre dossier et mis à jour si nécessaire. Ces documents d’entreprise sont consultables dans la fiche entreprise de votre société. Cette section permet de protéger et de centraliser les informations d'ordre privé relatives à la société et à son personnel.</p>
+          </div>
+        </div>
+        <div>
+          <div class="fr-alert fr-alert--warning fr-alert--sm fr-mt-2w">
+            <p>Aucun titulaire ou amodiataire associé à cette étape.</p>
+          </div>
+          <!---->
+        </div>
+      </div>
+      <div class="fr-input-group fr-mt-2w"><label class="fr-label" for="textarea_878">Notes
+          <!---->
+          <!---->
+        </label><textarea class="fr-input" name="textarea_878" id="textarea_878"></textarea></div>
+    </div>
+    <div class="fr-mt-2w fr-pt-2w fr-pb-2w" style="position: sticky; bottom: 0px; z-index: 100000; background: white;">
+      <div style="display: flex; flex-direction: column;">
+        <div class="fr-alert fr-alert--warning fr-alert--sm">
+          <p><a class="fr-link" title="Le titre Titre Tutu au statut « valide - modification en instance » est superposé à ce titre" href="/titres/slug-tutu" target="_blank">Le titre Titre Tutu au statut « valide - modification en instance » est superposé à ce titre</a></p>
+        </div>
+        <div class="fr-alert fr-alert--warning fr-alert--sm">
+          <p>Le périmètre renseigné est dans une zone du Sdom interdite à l’exploitation minière : ZONE 1, activité minière interdite sauf exploitation souterraine et recherches aériennes</p>
+        </div>
+        <!---->
+        <div style="display: flex; justify-content: end; align-items: center;" class="fr-mt-2w">
+          <!----><button class="fr-btn fr-btn--secondary fr-btn--md fr-ml-2w" title="Enregistrer l'étape" aria-label="Enregistrer l'étape" type="button">Enregistrer l'étape</button><button class="fr-btn fr-btn--primary fr-btn--md fr-ml-2w" disabled="" title="Enregistrer puis déposer l'étape" aria-label="Enregistrer puis déposer l'étape" type="submit">Enregistrer puis déposer l'étape</button>
+        </div>
+      </div>
+    </div>
+    <!---->
+  </form>
+</div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape-edition.stories_snapshots_Creation.html b/packages/ui/src/components/etape-edition.stories_snapshots_Creation.html
new file mode 100644
index 0000000000000000000000000000000000000000..adfb0de5a833ff0f03a799900350303f0e124ce0
--- /dev/null
+++ b/packages/ui/src/components/etape-edition.stories_snapshots_Creation.html
@@ -0,0 +1,28 @@
+<div class="dsfr">
+  <div><a href="/mocked-href" title="Nom du titre" class="fr-link" aria-label="Nom du titre">Nom du titre</a><span> &gt; </span><span class="cap-first"> octroi Super description </span></div>
+  <h1 class="fr-mt-5w">Création d’une étape</h1>
+  <!---->
+  <form class="dsfr">
+    <div>
+      <div class="dsfr">
+        <h2 class="cap-first fr-pt-6w">Informations principales</h2>
+        <p style="z-index: unset; margin-bottom: 0px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;" class="fr-badge fr-badge--sm fr-badge--error fr-badge--no-icon" title="Incomplet" aria-label="Incomplet">Incomplet</p>
+        <!---->
+      </div>
+      <div>
+        <div class="fr-grid-row">
+          <div class="fr-col-12 fr-col-xl-6">
+            <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_271">Date
+                <!---->
+                <!---->
+              </label><input class="fr-input" name="input_271" id="input_271" type="date">
+              <!---->
+            </div>
+            <!---->
+          </div>
+        </div>
+      </div>
+    </div>
+    <!---->
+  </form>
+</div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape-edition.stories_snapshots_DemandeArmComplete.html b/packages/ui/src/components/etape-edition.stories_snapshots_DemandeArmComplete.html
new file mode 100644
index 0000000000000000000000000000000000000000..46deafdaad77133b1d88a85bda32064c9304c3b0
--- /dev/null
+++ b/packages/ui/src/components/etape-edition.stories_snapshots_DemandeArmComplete.html
@@ -0,0 +1,560 @@
+<div class="dsfr">
+  <div><a href="/mocked-href" title="Nom du titre" class="fr-link" aria-label="Nom du titre">Nom du titre</a><span> &gt; </span><span class="cap-first"> octroi Super description </span></div>
+  <h1 class="fr-mt-5w">Étape - Demande</h1>
+  <!---->
+  <form class="dsfr">
+    <div>
+      <div class="dsfr">
+        <h2 class="cap-first fr-pt-6w">Informations principales</h2>
+        <!---->
+        <!---->
+      </div>
+      <div>
+        <div class="fr-grid-row">
+          <div class="fr-col-12 fr-col-xl-6">
+            <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_271">Date
+                <!---->
+                <!---->
+              </label><input class="fr-input" name="input_271" id="input_271" type="date">
+              <!---->
+            </div>
+            <div class="fr-mt-2w">
+              <div class="fr-input-group"><label class="fr-label fr-mb-1w" for="select-etape-type">Type *</label>
+                <div id="select-etape-type_wrapper" class="_typeahead_8eddf1 dsfr">
+                  <div class="flex"><input id="select-etape-type" type="text" name="select-etape-type" disabled="" class="_typeahead-input_8eddf1 fr-input" placeholder="" autocomplete="off"></div>
+                  <!---->
+                </div>
+              </div>
+              <!---->
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div gotodemarche="function(...args){let channel=import_preview_api.addons.getChannel(),id=(0,import_uuid.v4)(),minDepth=5,serializedArgs=args.map(serializeArg),normalizedArgs=args.length>1?serializedArgs:serializedArgs[0],actionDisplayToEmit={id,count:0,data:{name,args:normalizedArgs},options:{...actionOptions,maxDepth:minDepth+(actionOptions.depth||3),allowFunction:actionOptions.allowFunction||!1}};channel.emit(EVENT_ID,actionDisplayToEmit)}">
+      <div>
+        <div class="dsfr">
+          <h2 class="cap-first fr-pt-6w">Propriétés</h2>
+          <!---->
+          <!---->
+        </div>
+        <div>
+          <div class="fr-grid-row">
+            <div class="fr-col-12 fr-col-xl-6">
+              <!---->
+              <!---->
+              <!---->
+              <div class="fr-input-group"><label class="fr-label" for="filters_autocomplete_titulaires">
+                  <h6>Titulaires</h6>
+                </label>
+                <div class="mb-s">
+                  <div id="filters_autocomplete_titulaires_wrapper" class="_typeahead_8eddf1 dsfr">
+                    <div style="display: flex; max-height: unset; flex-wrap: wrap; gap: 8px; outline-offset: 2px; outline-width: 2px; outline-color: rgb(10, 118, 246);" class="fr-input _fake-input_8eddf1"><button class="fr-tag fr-tag--sm fr-tag--dismiss" title="10 A">10 A</button><input id="filters_autocomplete_titulaires" type="text" name="filters_autocomplete_titulaires" class="_typeahead-input_8eddf1" style="outline: none;" placeholder="titulaires" autocomplete="off"></div>
+                    <!---->
+                  </div>
+                  <!---->
+                </div>
+              </div>
+              <!---->
+              <div>
+                <h6>Substances</h6>
+                <div class="mb-s">
+                  <div style="display: flex; flex-direction: column;">
+                    <div>
+                      <div style="display: flex;" class="fr-mt-2w">
+                        <div id="typeahead_670_wrapper" class="_typeahead_8eddf1 dsfr">
+                          <div class="flex"><input id="typeahead_670" type="text" name="typeahead_670" class="_typeahead-input_8eddf1 fr-input" placeholder="" autocomplete="off"></div>
+                          <!---->
+                        </div>
+                        <!---->
+                        <!----><button class="fr-btn fr-btn--secondary fr-btn--md fr-icon-delete-bin-line fr-ml-2w" title="Supprimer la substance argent" aria-label="Supprimer la substance argent" type="button">
+                          <!---->
+                        </button>
+                      </div>
+                    </div><button class="fr-btn fr-btn--primary fr-btn--md fr-icon-add-line fr-mt-2w" title="Ajouter une substance" aria-label="Ajouter une substance" type="button" style="align-self: end;">
+                      <!---->
+                    </button>
+                  </div>
+                  <!---->
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div>
+        <div class="dsfr">
+          <h2 class="cap-first fr-pt-6w">Propriétés spécifiques</h2>
+          <!---->
+          <div class="fr-alert fr-alert--info fr-alert--sm">
+            <p>Ce bloc permet de savoir si la prospection est mécanisée ou non et s’il y a des franchissements de cours d’eau (si oui, combien ?)</p>
+          </div>
+        </div>
+        <div>
+          <div class="fr-grid-row">
+            <div class="fr-col-12 fr-col-xl-6">
+              <div>
+                <h3>Caractéristiques ARM</h3>
+                <div class="mb-s">
+                  <div>
+                    <fieldset class="fr-fieldset" id="mecanise" aria-labelledby="mecanise-legend">
+                      <legend class="fr-fieldset__legend--regular fr-fieldset__legend" id="mecanise-legend">Prospection mécanisée *
+                        <!---->
+                      </legend>
+                      <div class="fr-fieldset__element">
+                        <div class="fr-radio-group"><input type="radio" id="mecanise-0" name="mecanise"><label class="fr-label" for="mecanise-0">Oui
+                            <!---->
+                          </label></div>
+                      </div>
+                      <div class="fr-fieldset__element">
+                        <div class="fr-radio-group"><input type="radio" id="mecanise-1" name="mecanise"><label class="fr-label" for="mecanise-1">Non
+                            <!---->
+                          </label></div>
+                      </div>
+                    </fieldset>
+                  </div>
+                  <!---->
+                </div>
+                <div class="mb-s">
+                  <div>
+                    <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_74">Franchissements de cours d'eau
+                        <!----><span class="fr-hint-text">Nombre de franchissements de cours d'eau</span>
+                      </label><input class="fr-input" name="input_74" id="input_74" type="number" min="0">
+                      <!---->
+                    </div>
+                  </div>
+                  <!---->
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div>
+        <div class="dsfr">
+          <h2 class="cap-first fr-pt-6w">Périmètre</h2>
+          <!---->
+          <!---->
+        </div>
+        <div>
+          <div>
+            <div class="mb-s">
+              <div><button class="fr-btn fr-btn--primary fr-btn--md" title="Importer un périmètre" aria-label="Importer un périmètre" type="button">Importer un périmètre</button><button class="fr-btn fr-btn--secondary fr-btn--md fr-ml-2w" title="Éditer les points" aria-label="Éditer les points" type="button">Éditer les points</button>
+                <!---->
+                <!---->
+                <div class="fr-mt-2w">
+                  <div class="dsfr">
+                    <div class="fr-tabs">
+                      <ul class="fr-tabs__list" role="tablist" aria-label="Affichage des titres en vue carte ou tableau">
+                        <li role="presentation"><button id="tabpanel-carte-878" class="fr-tabs__tab fr-icon-earth-fill fr-tabs__tab--icon-left" tabindex="-1" role="tab" aria-label="Carte" aria-selected="false" aria-controls="tabpanel-carte-878-panel">Carte</button></li>
+                        <li role="presentation"><button id="tabpanel-points-878" class="fr-tabs__tab fr-icon-list-unordered fr-tabs__tab--icon-left" tabindex="0" role="tab" aria-label="Tableau" aria-selected="true" aria-controls="tabpanel-points-878-panel">Tableau</button></li>
+                      </ul>
+                      <div id="tabpanel-carte-878-panel" class="fr-tabs__panel" role="tabpanel" aria-labelledby="tabpanel-carte-878" tabindex="0">
+                        <!---->
+                      </div>
+                      <div id="tabpanel-points-878-panel" class="fr-tabs__panel fr-tabs__panel--selected" role="tabpanel" aria-labelledby="tabpanel-points-878" tabindex="0">
+                        <div style="display: flex; flex-direction: column;">
+                          <div id="typeahead_967_wrapper" class="_typeahead_8eddf1 dsfr">
+                            <div class="flex"><input id="typeahead_967" type="text" name="typeahead_967" disabled="" class="_typeahead-input_8eddf1 fr-input" placeholder="" autocomplete="off"></div>
+                            <!---->
+                          </div>
+                          <div style="display: flex; flex-direction: column;">
+                            <div style="overflow-x: auto;" class="fr-mb-1w">
+                              <div class="fr-table">
+                                <table style="display: table;">
+                                  <caption></caption>
+                                  <thead>
+                                    <tr>
+                                      <th scope="col" class="nowrap">
+                                        <div class="fr-text--md">Nom du point</div>
+                                      </th>
+                                      <th scope="col" class="nowrap">
+                                        <div class="fr-text--md">Description</div>
+                                      </th>
+                                      <th scope="col" class="nowrap">
+                                        <div class="fr-text--md">Longitude</div>
+                                      </th>
+                                      <th scope="col" class="nowrap">
+                                        <div class="fr-text--md">Latitude</div>
+                                      </th>
+                                      <th scope="col" class="nowrap">
+                                        <div class="fr-text--md">Longitude (E)</div>
+                                      </th>
+                                      <th scope="col" class="nowrap">
+                                        <div class="fr-text--md">Latitude (N)</div>
+                                      </th>
+                                    </tr>
+                                  </thead>
+                                  <tbody>
+                                    <tr>
+                                      <td class=""><span class="">A</span></td>
+                                      <td class=""><span class="">Polygone 1</span></td>
+                                      <td class=""><span class="">-52.54</span></td>
+                                      <td class=""><span class="">4.22269896902571</span></td>
+                                      <td class=""><span class="">-52°32,4'</span></td>
+                                      <td class=""><span class="">4°13,362'</span></td>
+                                    </tr>
+                                    <tr>
+                                      <td class=""><span class="">B</span></td>
+                                      <td class=""><span class="">Polygone 1</span></td>
+                                      <td class=""><span class="">-52.55</span></td>
+                                      <td class=""><span class="">4.22438936251509</span></td>
+                                      <td class=""><span class="">-52°33'</span></td>
+                                      <td class=""><span class="">4°13,463'</span></td>
+                                    </tr>
+                                    <tr>
+                                      <td class=""><span class="">C</span></td>
+                                      <td class=""><span class="">Polygone 1</span></td>
+                                      <td class=""><span class="">-52.55</span></td>
+                                      <td class=""><span class="">4.24113309117193</span></td>
+                                      <td class=""><span class="">-52°33'</span></td>
+                                      <td class=""><span class="">4°14,468'</span></td>
+                                    </tr>
+                                  </tbody>
+                                </table>
+                              </div>
+                            </div><a class="fr-btn fr-btn--secondary fr-btn--icon-right fr-icon-download-line" title="Télécharge les points au format csv" href="data:text/csv;charset=utf-8,nom;description;longitude;latitude;x_deg;y_deg%0AA;Polygone%201;-52.54;4.22269896902571;-52%C2%B032,4';4%C2%B013,362'%0AB;Polygone%201;-52.55;4.22438936251509;-52%C2%B033';4%C2%B013,463'%0AC;Polygone%201;-52.55;4.24113309117193;-52%C2%B033';4%C2%B014,468'" download="points-titre-slug.csv" style="align-self: end;">.csv</a>
+                          </div>
+                          <!---->
+                        </div>
+                      </div>
+                    </div>
+                  </div>
+                  <!---->
+                </div>
+              </div>
+              <!---->
+            </div>
+            <!---->
+            <!---->
+            <!---->
+          </div>
+        </div>
+      </div>
+      <div>
+        <div class="dsfr">
+          <h2 class="cap-first fr-pt-6w">Liste des documents</h2>
+          <!---->
+          <!---->
+        </div>
+        <div>
+          <div class="fr-table fr-mb-0">
+            <table style="display: table;">
+              <caption>Documents obligatoires</caption>
+              <thead>
+                <tr>
+                  <th scope="col">Nom</th>
+                  <th scope="col">Description</th>
+                  <th scope="col">Visibilité</th>
+                  <th scope="col" style="display: flex; justify-content: end;">Action</th>
+                </tr>
+              </thead>
+              <tbody>
+                <tr>
+                  <td>Documents cartographiques</td>
+                  <td style="white-space: pre-line;">
+                    <!---->
+                  </td>
+                  <td>Public</td>
+                  <td>
+                    <div style="display: flex; justify-content: end; align-items: center;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-edit-line" title="Modifier le document de Documents cartographiques" aria-label="Modifier le document de Documents cartographiques" type="button">
+                        <!---->
+                      </button><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-delete-bin-line fr-ml-1w" title="Supprimer le document de Documents cartographiques" aria-label="Supprimer le document de Documents cartographiques" type="button">
+                        <!---->
+                      </button></div>
+                  </td>
+                </tr>
+                <tr>
+                  <td>Décision cas par cas</td>
+                  <td style="white-space: pre-line;">
+                    <!---->
+                  </td>
+                  <td>Public</td>
+                  <td>
+                    <div style="display: flex; justify-content: end; align-items: center;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-edit-line" title="Modifier le document de Décision cas par cas" aria-label="Modifier le document de Décision cas par cas" type="button">
+                        <!---->
+                      </button><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-delete-bin-line fr-ml-1w" title="Supprimer le document de Décision cas par cas" aria-label="Supprimer le document de Décision cas par cas" type="button">
+                        <!---->
+                      </button></div>
+                  </td>
+                </tr>
+                <tr>
+                  <td>Dossier "Loi sur l'eau"</td>
+                  <td style="white-space: pre-line;">
+                    <!---->
+                  </td>
+                  <td>Public</td>
+                  <td>
+                    <div style="display: flex; justify-content: end; align-items: center;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-edit-line" title="Modifier le document de Dossier &quot;Loi sur l'eau&quot;" aria-label="Modifier le document de Dossier &quot;Loi sur l'eau&quot;" type="button">
+                        <!---->
+                      </button><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-delete-bin-line fr-ml-1w" title="Supprimer le document de Dossier &quot;Loi sur l'eau&quot;" aria-label="Supprimer le document de Dossier &quot;Loi sur l'eau&quot;" type="button">
+                        <!---->
+                      </button></div>
+                  </td>
+                </tr>
+                <tr>
+                  <td>Dossier de demande</td>
+                  <td style="white-space: pre-line;">
+                    <!---->
+                  </td>
+                  <td>Public</td>
+                  <td>
+                    <div style="display: flex; justify-content: end; align-items: center;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-edit-line" title="Modifier le document de Dossier de demande" aria-label="Modifier le document de Dossier de demande" type="button">
+                        <!---->
+                      </button><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-delete-bin-line fr-ml-1w" title="Supprimer le document de Dossier de demande" aria-label="Supprimer le document de Dossier de demande" type="button">
+                        <!---->
+                      </button></div>
+                  </td>
+                </tr>
+                <tr>
+                  <td>Formulaire de demande</td>
+                  <td style="white-space: pre-line;">
+                    <!---->
+                  </td>
+                  <td>Public</td>
+                  <td>
+                    <div style="display: flex; justify-content: end; align-items: center;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-edit-line" title="Modifier le document de Formulaire de demande" aria-label="Modifier le document de Formulaire de demande" type="button">
+                        <!---->
+                      </button><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-delete-bin-line fr-ml-1w" title="Supprimer le document de Formulaire de demande" aria-label="Supprimer le document de Formulaire de demande" type="button">
+                        <!---->
+                      </button></div>
+                  </td>
+                </tr>
+                <tr>
+                  <td>Justificatif de paiement</td>
+                  <td style="white-space: pre-line;">
+                    <!---->
+                  </td>
+                  <td>Public</td>
+                  <td>
+                    <div style="display: flex; justify-content: end; align-items: center;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-edit-line" title="Modifier le document de Justificatif de paiement" aria-label="Modifier le document de Justificatif de paiement" type="button">
+                        <!---->
+                      </button><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-delete-bin-line fr-ml-1w" title="Supprimer le document de Justificatif de paiement" aria-label="Supprimer le document de Justificatif de paiement" type="button">
+                        <!---->
+                      </button></div>
+                  </td>
+                </tr>
+              </tbody>
+            </table>
+          </div>
+          <div style="display: flex; flex-direction: column;" class="fr-mt-3w">
+            <div class="fr-table fr-mb-0">
+              <table style="display: table;">
+                <caption>Documents complémentaires</caption>
+                <thead>
+                  <tr>
+                    <th scope="col">Nom</th>
+                    <th scope="col">Description</th>
+                    <th scope="col">Visibilité</th>
+                    <th scope="col" style="display: flex; justify-content: end;">Action</th>
+                  </tr>
+                </thead>
+                <tbody></tbody>
+              </table>
+            </div><button class="fr-btn fr-btn--secondary fr-btn--md fr-icon-add-line fr-btn--icon-right fr-mt-1w" title="Ajouter un document complémentaire" aria-label="Ajouter un document complémentaire" type="button" style="align-self: end;">Ajouter</button>
+          </div>
+          <!---->
+          <!---->
+          <!---->
+        </div>
+      </div>
+      <div>
+        <div class="dsfr">
+          <h2 class="cap-first fr-pt-6w">Documents d’entreprise</h2>
+          <!---->
+          <div class="fr-alert fr-alert--info fr-alert--sm">
+            <p>Les documents d’entreprise sont des documents propres à l'entreprise, et pourront être réutilisés pour la création d'un autre dossier et mis à jour si nécessaire. Ces documents d’entreprise sont consultables dans la fiche entreprise de votre société. Cette section permet de protéger et de centraliser les informations d'ordre privé relatives à la société et à son personnel.</p>
+          </div>
+        </div>
+        <div>
+          <div>
+            <div class="fr-table fr-mb-0">
+              <table style="display: table;">
+                <caption>10 A</caption>
+                <thead>
+                  <tr>
+                    <th scope="col">Nom</th>
+                    <th scope="col"></th>
+                    <th scope="col" style="display: flex; justify-content: end;">Action</th>
+                  </tr>
+                </thead>
+                <tbody>
+                  <tr>
+                    <td>
+                      <div style="display: flex; flex-direction: column; align-items: start;"><a class="fr-link" title="Télécharger le document Attestation fiscale - nouvelle fenêtre" href="/apiUrl/download/entrepriseDocuments/2023-06-03-atf-ueoau" target="_blank">Attestation fiscale</a>
+                        <!---->
+                      </div>
+                    </td>
+                    <td>
+                      <div class="fr-select-group">
+                        <!----><select class="fr-select" id="select_128" aria-label="Choix du document pour [object Object]" name="select_128">
+                          <option disabled="" value="2023-06-03-atf-ueoau">Attestation fiscale : Attestation sur l'honneur (03-06-2023)</option>
+                          <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                          <option disabled="" hidden="" value="">Selectionnez une option</option>
+                        </select>
+                      </div>
+                    </td>
+                    <td style="text-align: right;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-delete-bin-line fr-ml-1w" title="Supprimer le document d’entreprise Attestation fiscale" aria-label="Supprimer le document d’entreprise Attestation fiscale" type="button">
+                        <!---->
+                      </button></td>
+                  </tr>
+                  <tr>
+                    <td>
+                      <div style="display: flex; flex-direction: column; align-items: start;"><a class="fr-link" title="Télécharger le document Curriculum vitae - nouvelle fenêtre" href="/apiUrl/download/entrepriseDocuments/2023-06-23-cur-ueoau" target="_blank">Curriculum vitae</a>
+                        <!---->
+                      </div>
+                    </td>
+                    <td>
+                      <div class="fr-select-group">
+                        <!----><select class="fr-select" id="select_772" aria-label="Choix du document pour [object Object]" name="select_772">
+                          <option disabled="" value="2023-06-23-cur-ueoau">Curriculum vitae : Jon. Doe (23-06-2023)</option>
+                          <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                          <option disabled="" hidden="" value="">Selectionnez une option</option>
+                        </select>
+                      </div>
+                    </td>
+                    <td style="text-align: right;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-delete-bin-line fr-ml-1w" title="Supprimer le document d’entreprise Curriculum vitae" aria-label="Supprimer le document d’entreprise Curriculum vitae" type="button">
+                        <!---->
+                      </button></td>
+                  </tr>
+                  <tr>
+                    <td>
+                      <div style="display: flex; flex-direction: column; align-items: start;"><a class="fr-link" title="Télécharger le document Identification de matériel - nouvelle fenêtre" href="/apiUrl/download/entrepriseDocuments/2023-06-23-idm-ueoaue" target="_blank">Identification de matériel</a>
+                        <!---->
+                      </div>
+                    </td>
+                    <td>
+                      <div class="fr-select-group">
+                        <!----><select class="fr-select" id="select_453" aria-label="Choix du document pour [object Object]" name="select_453">
+                          <option disabled="" value="2023-06-23-idm-ueoaue">Identification de matériel : Facture pelle (23-06-2023)</option>
+                          <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                          <option disabled="" hidden="" value="">Selectionnez une option</option>
+                        </select>
+                      </div>
+                    </td>
+                    <td style="text-align: right;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-delete-bin-line fr-ml-1w" title="Supprimer le document d’entreprise Identification de matériel" aria-label="Supprimer le document d’entreprise Identification de matériel" type="button">
+                        <!---->
+                      </button></td>
+                  </tr>
+                  <tr>
+                    <td>
+                      <div style="display: flex; flex-direction: column; align-items: start;"><a class="fr-link" title="Télécharger le document Justificatif d’identité - nouvelle fenêtre" href="/apiUrl/download/entrepriseDocuments/2023-06-23-jid-eaoueo" target="_blank">Justificatif d’identité</a>
+                        <!---->
+                      </div>
+                    </td>
+                    <td>
+                      <div class="fr-select-group">
+                        <!----><select class="fr-select" id="select_556" aria-label="Choix du document pour [object Object]" name="select_556">
+                          <option disabled="" value="2023-06-23-jid-eaoueo">Justificatif d’identité : Jon. Doe (23-06-2023)</option>
+                          <option value="2023-06-23-jid-ueoau">Justificatif d’identité : Arm. Strong (23-06-2023)</option>
+                          <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                          <option disabled="" hidden="" value="">Selectionnez une option</option>
+                        </select>
+                      </div>
+                    </td>
+                    <td style="text-align: right;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-delete-bin-line fr-ml-1w" title="Supprimer le document d’entreprise Justificatif d’identité" aria-label="Supprimer le document d’entreprise Justificatif d’identité" type="button">
+                        <!---->
+                      </button></td>
+                  </tr>
+                  <tr>
+                    <td>
+                      <div style="display: flex; flex-direction: column; align-items: start;"><a class="fr-link" title="Télécharger le document Justificatif des capacités techniques - nouvelle fenêtre" href="/apiUrl/download/entrepriseDocuments/2023-06-23-jct-ueoau" target="_blank">Justificatif des capacités techniques</a>
+                        <!---->
+                      </div>
+                    </td>
+                    <td>
+                      <div class="fr-select-group">
+                        <!----><select class="fr-select" id="select_487" aria-label="Choix du document pour [object Object]" name="select_487">
+                          <option disabled="" value="2023-06-23-jct-ueoau">Justificatif des capacités techniques : (23-06-2023)</option>
+                          <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                          <option disabled="" hidden="" value="">Selectionnez une option</option>
+                        </select>
+                      </div>
+                    </td>
+                    <td style="text-align: right;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-delete-bin-line fr-ml-1w" title="Supprimer le document d’entreprise Justificatif des capacités techniques" aria-label="Supprimer le document d’entreprise Justificatif des capacités techniques" type="button">
+                        <!---->
+                      </button></td>
+                  </tr>
+                  <tr>
+                    <td>
+                      <div style="display: flex; flex-direction: column; align-items: start;"><a class="fr-link" title="Télécharger le document Kbis - nouvelle fenêtre" href="/apiUrl/download/entrepriseDocuments/2023-06-08-kbi-ueoau" target="_blank">Kbis</a>
+                        <!---->
+                      </div>
+                    </td>
+                    <td>
+                      <div class="fr-select-group">
+                        <!----><select class="fr-select" id="select_796" aria-label="Choix du document pour [object Object]" name="select_796">
+                          <option disabled="" value="2023-06-08-kbi-ueoau">Kbis : (08-06-2023)</option>
+                          <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                          <option disabled="" hidden="" value="">Selectionnez une option</option>
+                        </select>
+                      </div>
+                    </td>
+                    <td style="text-align: right;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-delete-bin-line fr-ml-1w" title="Supprimer le document d’entreprise Kbis" aria-label="Supprimer le document d’entreprise Kbis" type="button">
+                        <!---->
+                      </button></td>
+                  </tr>
+                  <tr>
+                    <td>
+                      <div style="display: flex; flex-direction: column; align-items: start;"><a class="fr-link" title="Télécharger le document Justificatif des capacités financières - nouvelle fenêtre" href="/apiUrl/download/entrepriseDocuments/2023-06-23-jcf-uueoau" target="_blank">Justificatif des capacités financières</a>
+                        <!---->
+                      </div>
+                    </td>
+                    <td>
+                      <div class="fr-select-group">
+                        <!----><select class="fr-select" id="select_216" aria-label="Choix du document pour [object Object]" name="select_216">
+                          <option disabled="" value="2023-06-23-jcf-uueoau">Justificatif des capacités financières : (23-06-2023)</option>
+                          <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                          <option disabled="" hidden="" value="">Selectionnez une option</option>
+                        </select>
+                      </div>
+                    </td>
+                    <td style="text-align: right;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-delete-bin-line fr-ml-1w" title="Supprimer le document d’entreprise Justificatif des capacités financières" aria-label="Supprimer le document d’entreprise Justificatif des capacités financières" type="button">
+                        <!---->
+                      </button></td>
+                  </tr>
+                  <tr>
+                    <td>
+                      <div class="fr-select-group">
+                        <!----><select class="fr-select" id="select_482" aria-label="Ajouter un nouveau type de document" name="select_482">
+                          <option value="atf">Attestation fiscale</option>
+                          <option value="sir">Avis de situation au répertoire Sirene</option>
+                          <option value="cur">Curriculum vitae</option>
+                          <option value="idm">Identification de matériel</option>
+                          <option value="jid">Justificatif d’identité</option>
+                          <option value="jct">Justificatif des capacités techniques</option>
+                          <option value="kbi">Kbis</option>
+                          <option value="jcf">Justificatif des capacités financières</option>
+                          <option disabled="" hidden="" value="">Selectionnez une option</option>
+                        </select>
+                      </div>
+                    </td>
+                    <td></td>
+                    <td></td>
+                  </tr>
+                </tbody>
+              </table>
+            </div>
+          </div>
+          <!---->
+        </div>
+      </div>
+      <div class="fr-input-group fr-mt-2w"><label class="fr-label" for="textarea_25">Notes
+          <!---->
+          <!---->
+        </label><textarea class="fr-input" name="textarea_25" id="textarea_25"></textarea></div>
+    </div>
+    <div class="fr-mt-2w fr-pt-2w fr-pb-2w" style="position: sticky; bottom: 0px; z-index: 100000; background: white;">
+      <div style="display: flex; flex-direction: column;">
+        <div class="fr-alert fr-alert--warning fr-alert--sm">
+          <p><a class="fr-link" title="Le titre Titre Tutu au statut « valide - modification en instance » est superposé à ce titre" href="/titres/slug-tutu" target="_blank">Le titre Titre Tutu au statut « valide - modification en instance » est superposé à ce titre</a></p>
+        </div>
+        <!---->
+        <div style="display: flex; justify-content: end; align-items: center;" class="fr-mt-2w">
+          <!----><button class="fr-btn fr-btn--secondary fr-btn--md fr-ml-2w" title="Enregistrer l'étape" aria-label="Enregistrer l'étape" type="button">Enregistrer l'étape</button><button class="fr-btn fr-btn--primary fr-btn--md fr-ml-2w" title="Enregistrer puis déposer l'étape" aria-label="Enregistrer puis déposer l'étape" type="submit">Enregistrer puis déposer l'étape</button>
+        </div>
+      </div>
+    </div>
+    <!---->
+  </form>
+</div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape-edition.stories_snapshots_Modification.html b/packages/ui/src/components/etape-edition.stories_snapshots_Modification.html
new file mode 100644
index 0000000000000000000000000000000000000000..06ef6314af7981f1f8826b084be1a806d8a98b47
--- /dev/null
+++ b/packages/ui/src/components/etape-edition.stories_snapshots_Modification.html
@@ -0,0 +1,228 @@
+<div class="dsfr">
+  <div><a href="/mocked-href" title="Nom du titre" class="fr-link" aria-label="Nom du titre">Nom du titre</a><span> &gt; </span><span class="cap-first"> octroi Super description </span></div>
+  <h1 class="fr-mt-5w">Étape - Demande</h1>
+  <div class="fr-alert fr-alert--info fr-alert--sm">
+    <p><span>Besoin d’aide pour déposer votre demande ? <a class="fr-link" title="Page contact - site externe" href="https://camino.gitbook.io/guide-dutilisation/a-propos/contact" target="_blank" rel="noopener noreferrer">Page contact</a></span></p>
+  </div>
+  <form class="dsfr">
+    <!---->
+    <div gotodemarche="function(...args){let channel=import_preview_api.addons.getChannel(),id=(0,import_uuid.v4)(),minDepth=5,serializedArgs=args.map(serializeArg),normalizedArgs=args.length>1?serializedArgs:serializedArgs[0],actionDisplayToEmit={id,count:0,data:{name,args:normalizedArgs},options:{...actionOptions,maxDepth:minDepth+(actionOptions.depth||3),allowFunction:actionOptions.allowFunction||!1}};channel.emit(EVENT_ID,actionDisplayToEmit)}">
+      <div>
+        <div class="dsfr">
+          <h2 class="cap-first fr-pt-6w">Propriétés</h2>
+          <p style="z-index: unset; margin-bottom: 0px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;" class="fr-badge fr-badge--sm fr-badge--error fr-badge--no-icon" title="Incomplet" aria-label="Incomplet">Incomplet</p>
+          <!---->
+        </div>
+        <div>
+          <div class="fr-grid-row">
+            <div class="fr-col-12 fr-col-xl-6">
+              <!---->
+              <!---->
+              <!---->
+              <!---->
+              <!---->
+              <div>
+                <h6>Substances</h6>
+                <div class="mb-s">
+                  <div style="display: flex; flex-direction: column;">
+                    <div>
+                      <div style="display: flex;" class="fr-mt-2w">
+                        <div id="typeahead_271_wrapper" class="_typeahead_8eddf1 dsfr">
+                          <div class="flex"><input id="typeahead_271" type="text" name="typeahead_271" class="_typeahead-input_8eddf1 fr-input" placeholder="" autocomplete="off"></div>
+                          <!---->
+                        </div>
+                        <!---->
+                        <!----><button class="fr-btn fr-btn--secondary fr-btn--md fr-icon-delete-bin-line fr-ml-2w" title="Supprimer la substance " aria-label="Supprimer la substance " type="button">
+                          <!---->
+                        </button>
+                      </div>
+                    </div>
+                    <!---->
+                  </div>
+                  <!---->
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div>
+        <div class="dsfr">
+          <h2 class="cap-first fr-pt-6w">Propriétés spécifiques</h2>
+          <p style="z-index: unset; margin-bottom: 0px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;" class="fr-badge fr-badge--sm fr-badge--error fr-badge--no-icon" title="Incomplet" aria-label="Incomplet">Incomplet</p>
+          <div class="fr-alert fr-alert--info fr-alert--sm">
+            <p>Ce bloc permet de savoir si la prospection est mécanisée ou non et s’il y a des franchissements de cours d’eau (si oui, combien ?)</p>
+          </div>
+        </div>
+        <div>
+          <div class="fr-grid-row">
+            <div class="fr-col-12 fr-col-xl-6">
+              <div>
+                <h3>Caractéristiques ARM</h3>
+                <div class="mb-s">
+                  <div>
+                    <fieldset class="fr-fieldset" id="mecanise" aria-labelledby="mecanise-legend">
+                      <legend class="fr-fieldset__legend--regular fr-fieldset__legend" id="mecanise-legend">Prospection mécanisée *
+                        <!---->
+                      </legend>
+                      <div class="fr-fieldset__element">
+                        <div class="fr-radio-group"><input type="radio" id="mecanise-0" name="mecanise"><label class="fr-label" for="mecanise-0">Oui
+                            <!---->
+                          </label></div>
+                      </div>
+                      <div class="fr-fieldset__element">
+                        <div class="fr-radio-group"><input type="radio" id="mecanise-1" name="mecanise"><label class="fr-label" for="mecanise-1">Non
+                            <!---->
+                          </label></div>
+                      </div>
+                    </fieldset>
+                  </div>
+                  <!---->
+                </div>
+                <div class="mb-s">
+                  <div>
+                    <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_670">Franchissements de cours d'eau
+                        <!----><span class="fr-hint-text">Nombre de franchissements de cours d'eau</span>
+                      </label><input class="fr-input" name="input_670" id="input_670" type="number" min="0">
+                      <!---->
+                    </div>
+                  </div>
+                  <!---->
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div>
+        <div class="dsfr">
+          <h2 class="cap-first fr-pt-6w">Périmètre</h2>
+          <p style="z-index: unset; margin-bottom: 0px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;" class="fr-badge fr-badge--sm fr-badge--error fr-badge--no-icon" title="Incomplet" aria-label="Incomplet">Incomplet</p>
+          <!---->
+        </div>
+        <div>
+          <div>
+            <div class="mb-s">
+              <div><button class="fr-btn fr-btn--primary fr-btn--md" title="Importer un périmètre" aria-label="Importer un périmètre" type="button">Importer un périmètre</button>
+                <!---->
+                <!---->
+                <!---->
+              </div>
+              <!---->
+            </div>
+            <!---->
+            <!---->
+            <!---->
+          </div>
+        </div>
+      </div>
+      <div>
+        <div class="dsfr">
+          <h2 class="cap-first fr-pt-6w">Liste des documents</h2>
+          <p style="z-index: unset; margin-bottom: 0px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;" class="fr-badge fr-badge--sm fr-badge--error fr-badge--no-icon" title="Incomplet" aria-label="Incomplet">Incomplet</p>
+          <!---->
+        </div>
+        <div>
+          <div class="fr-table fr-mb-0">
+            <table style="display: table;">
+              <caption>Documents obligatoires</caption>
+              <thead>
+                <tr>
+                  <th scope="col">Nom</th>
+                  <th scope="col">Description</th>
+                  <th scope="col">Visibilité</th>
+                  <th scope="col" style="display: flex; justify-content: end;">Action</th>
+                </tr>
+              </thead>
+              <tbody>
+                <tr>
+                  <td class="fr-label--disabled">Documents cartographiques</td>
+                  <td>-</td>
+                  <td>-</td>
+                  <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Documents cartographiques" aria-label="Ajouter un document Documents cartographiques" type="button">
+                      <!---->
+                    </button></td>
+                </tr>
+                <tr>
+                  <td class="fr-label--disabled">Dossier de demande</td>
+                  <td>-</td>
+                  <td>-</td>
+                  <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Dossier de demande" aria-label="Ajouter un document Dossier de demande" type="button">
+                      <!---->
+                    </button></td>
+                </tr>
+                <tr>
+                  <td class="fr-label--disabled">Formulaire de demande</td>
+                  <td>-</td>
+                  <td>-</td>
+                  <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Formulaire de demande" aria-label="Ajouter un document Formulaire de demande" type="button">
+                      <!---->
+                    </button></td>
+                </tr>
+                <tr>
+                  <td class="fr-label--disabled">Justificatif de paiement</td>
+                  <td>-</td>
+                  <td>-</td>
+                  <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Justificatif de paiement" aria-label="Ajouter un document Justificatif de paiement" type="button">
+                      <!---->
+                    </button></td>
+                </tr>
+              </tbody>
+            </table>
+          </div>
+          <div style="display: flex; flex-direction: column;" class="fr-mt-3w">
+            <div class="fr-table fr-mb-0">
+              <table style="display: table;">
+                <caption>Documents complémentaires</caption>
+                <thead>
+                  <tr>
+                    <th scope="col">Nom</th>
+                    <th scope="col">Description</th>
+                    <th scope="col">Visibilité</th>
+                    <th scope="col" style="display: flex; justify-content: end;">Action</th>
+                  </tr>
+                </thead>
+                <tbody></tbody>
+              </table>
+            </div><button class="fr-btn fr-btn--secondary fr-btn--md fr-icon-add-line fr-btn--icon-right fr-mt-1w" title="Ajouter un document complémentaire" aria-label="Ajouter un document complémentaire" type="button" style="align-self: end;">Ajouter</button>
+          </div>
+          <!---->
+          <!---->
+          <!---->
+        </div>
+      </div>
+      <div>
+        <div class="dsfr">
+          <h2 class="cap-first fr-pt-6w">Documents d’entreprise</h2>
+          <!---->
+          <div class="fr-alert fr-alert--info fr-alert--sm">
+            <p>Les documents d’entreprise sont des documents propres à l'entreprise, et pourront être réutilisés pour la création d'un autre dossier et mis à jour si nécessaire. Ces documents d’entreprise sont consultables dans la fiche entreprise de votre société. Cette section permet de protéger et de centraliser les informations d'ordre privé relatives à la société et à son personnel.</p>
+          </div>
+        </div>
+        <div>
+          <div class="fr-alert fr-alert--warning fr-alert--sm fr-mt-2w">
+            <p>Aucun titulaire ou amodiataire associé à cette étape.</p>
+          </div>
+          <!---->
+        </div>
+      </div>
+      <div class="fr-input-group fr-mt-2w"><label class="fr-label" for="textarea_74">Notes
+          <!---->
+          <!---->
+        </label><textarea class="fr-input" name="textarea_74" id="textarea_74"></textarea></div>
+    </div>
+    <div class="fr-mt-2w fr-pt-2w fr-pb-2w" style="position: sticky; bottom: 0px; z-index: 100000; background: white;">
+      <div style="display: flex; flex-direction: column;">
+        <div class="fr-alert fr-alert--warning fr-alert--sm">
+          <p><a class="fr-link" title="Le titre Titre Tutu au statut « valide - modification en instance » est superposé à ce titre" href="/titres/slug-tutu" target="_blank">Le titre Titre Tutu au statut « valide - modification en instance » est superposé à ce titre</a></p>
+        </div>
+        <!---->
+        <div style="display: flex; justify-content: end; align-items: center;" class="fr-mt-2w">
+          <!----><button class="fr-btn fr-btn--primary fr-btn--md fr-ml-2w" disabled="" title="Enregistrer l'étape" aria-label="Enregistrer l'étape" type="submit">Enregistrer l'étape</button>
+          <!---->
+        </div>
+      </div>
+    </div>
+    <!---->
+  </form>
+</div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape-edition.stories_snapshots_ModificationDemandeHeritee.html b/packages/ui/src/components/etape-edition.stories_snapshots_ModificationDemandeHeritee.html
new file mode 100644
index 0000000000000000000000000000000000000000..9f984bb8d4826e9e6b78e349df9df4fa62a02bbe
--- /dev/null
+++ b/packages/ui/src/components/etape-edition.stories_snapshots_ModificationDemandeHeritee.html
@@ -0,0 +1,382 @@
+<div class="dsfr">
+  <div><a href="/mocked-href" title="Nom du titre" class="fr-link" aria-label="Nom du titre">Nom du titre</a><span> &gt; </span><span class="cap-first"> octroi Super description </span></div>
+  <h1 class="fr-mt-5w">Étape - Modification de la demande</h1>
+  <!---->
+  <form class="dsfr">
+    <div>
+      <div class="dsfr">
+        <h2 class="cap-first fr-pt-6w">Informations principales</h2>
+        <!---->
+        <!---->
+      </div>
+      <div>
+        <div class="fr-grid-row">
+          <div class="fr-col-12 fr-col-xl-6">
+            <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_271">Date
+                <!---->
+                <!---->
+              </label><input class="fr-input" name="input_271" id="input_271" type="date">
+              <!---->
+            </div>
+            <div class="fr-mt-2w">
+              <div class="fr-input-group"><label class="fr-label fr-mb-1w" for="select-etape-type">Type *</label>
+                <div id="select-etape-type_wrapper" class="_typeahead_8eddf1 dsfr">
+                  <div class="flex"><input id="select-etape-type" type="text" name="select-etape-type" disabled="" class="_typeahead-input_8eddf1 fr-input" placeholder="" autocomplete="off"></div>
+                  <!---->
+                </div>
+              </div>
+              <div class="fr-select-group"><label class="fr-label" for="select-etape-statut-id">Statut *
+                  <!---->
+                </label><select class="fr-select" id="select-etape-statut-id" aria-label="Statut" name="select-etape-statut-id">
+                  <option disabled="" value="fai">fait</option>
+                  <option disabled="" hidden="" value="">Selectionnez une option</option>
+                </select></div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div gotodemarche="function(...args){let channel=import_preview_api.addons.getChannel(),id=(0,import_uuid.v4)(),minDepth=5,serializedArgs=args.map(serializeArg),normalizedArgs=args.length>1?serializedArgs:serializedArgs[0],actionDisplayToEmit={id,count:0,data:{name,args:normalizedArgs},options:{...actionOptions,maxDepth:minDepth+(actionOptions.depth||3),allowFunction:actionOptions.allowFunction||!1}};channel.emit(EVENT_ID,actionDisplayToEmit)}">
+      <div>
+        <div class="dsfr">
+          <h2 class="cap-first fr-pt-6w">Propriétés</h2>
+          <!---->
+          <!---->
+        </div>
+        <div>
+          <div class="fr-grid-row">
+            <div class="fr-col-12 fr-col-xl-6">
+              <!---->
+              <div class="mb-s">
+                <div>
+                  <div class="fr-input-group fr-input-group--disabled" style="margin-bottom: 0px;"><label class="fr-label" for="input_670">Date de début
+                      <!---->
+                      <!---->
+                    </label><input class="fr-input" name="input_670" id="input_670" disabled="" type="date">
+                    <!---->
+                  </div>
+                </div>
+                <div class="dsfr">
+                  <div class="fr-toggle"><input type="checkbox" class="fr-toggle__input" id="toggle_74"><label class="fr-toggle__label" for="toggle_74" data-fr-checked-label="Activé" data-fr-unchecked-label="Désactivé"><span class=" fr-ml-4w">Hériter de l’étape "Demande" du 01-01-2022</span></label>
+                    <!---->
+                  </div>
+                </div>
+              </div>
+              <div class="mb-s">
+                <div>
+                  <div class="fr-input-group fr-input-group--disabled" style="margin-bottom: 0px;"><label class="fr-label" for="input_878">Date d’échéance
+                      <!---->
+                      <!---->
+                    </label><input class="fr-input" name="input_878" id="input_878" disabled="" type="date">
+                    <!---->
+                  </div>
+                </div>
+                <div class="dsfr">
+                  <div class="fr-toggle"><input type="checkbox" class="fr-toggle__input" id="toggle_967"><label class="fr-toggle__label" for="toggle_967" data-fr-checked-label="Activé" data-fr-unchecked-label="Désactivé"><span class=" fr-ml-4w">Hériter de l’étape "Demande" du 01-01-2022</span></label>
+                    <!---->
+                  </div>
+                </div>
+              </div>
+              <div class="fr-input-group"><label class="fr-label" for="filters_autocomplete_titulaires">
+                  <h6>Titulaires</h6>
+                </label>
+                <div class="mb-s">
+                  <div>
+                    <div>
+                      <p class="fr-tag fr-tag--md fr-mr-1w" title="10 A" aria-label="10 A">10 A</p>
+                    </div>
+                  </div>
+                  <div class="dsfr">
+                    <div class="fr-toggle"><input type="checkbox" class="fr-toggle__input" id="toggle_25"><label class="fr-toggle__label" for="toggle_25" data-fr-checked-label="Activé" data-fr-unchecked-label="Désactivé"><span class=" fr-ml-4w">Hériter de l’étape "Demande" du 01-01-2022</span></label>
+                      <!---->
+                    </div>
+                  </div>
+                </div>
+              </div>
+              <!---->
+              <div>
+                <h6>Substances</h6>
+                <div class="mb-s">
+                  <div>
+                    <p class="fr-tag fr-tag--md fr-mr-1w" title="Argent" aria-label="Argent">Argent</p>
+                  </div>
+                  <div class="dsfr">
+                    <div class="fr-toggle"><input type="checkbox" class="fr-toggle__input" id="toggle_128"><label class="fr-toggle__label" for="toggle_128" data-fr-checked-label="Activé" data-fr-unchecked-label="Désactivé"><span class=" fr-ml-4w">Hériter de l’étape "Demande" du 01-01-2022</span></label>
+                      <!---->
+                    </div>
+                  </div>
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div>
+        <div class="dsfr">
+          <h2 class="cap-first fr-pt-6w">Propriétés spécifiques</h2>
+          <!---->
+          <!---->
+        </div>
+        <div>
+          <div class="fr-grid-row">
+            <div class="fr-col-12 fr-col-xl-6">
+              <div>
+                <h3>Caractéristiques ARM</h3>
+                <div class="mb-s">
+                  <div>
+                    <div class="tablet-blobs">
+                      <div class="tablet-blob-1-4">
+                        <h5>Prospection mécanisée</h5>
+                      </div>
+                      <div class="tablet-blob-3-4">
+                        <p class="cap-first ">Oui
+                          <!---->
+                        </p>
+                        <!---->
+                      </div>
+                    </div>
+                  </div>
+                  <div class="dsfr">
+                    <div class="fr-toggle"><input type="checkbox" class="fr-toggle__input" id="toggle_772"><label class="fr-toggle__label" for="toggle_772" data-fr-checked-label="Activé" data-fr-unchecked-label="Désactivé"><span class=" fr-ml-4w">Hériter de l’étape "Demande" du 01-01-2022</span></label>
+                      <!---->
+                    </div>
+                  </div>
+                </div>
+                <div class="mb-s">
+                  <div>
+                    <div class="tablet-blobs">
+                      <div class="tablet-blob-1-4">
+                        <h5>Franchissements de cours d'eau</h5>
+                      </div>
+                      <div class="tablet-blob-3-4">
+                        <p class="cap-first mb-s">2
+                          <!---->
+                        </p>
+                        <p class="h6"><span>Nombre de franchissements de cours d'eau</span></p>
+                      </div>
+                    </div>
+                  </div>
+                  <div class="dsfr">
+                    <div class="fr-toggle"><input type="checkbox" class="fr-toggle__input" id="toggle_453"><label class="fr-toggle__label" for="toggle_453" data-fr-checked-label="Activé" data-fr-unchecked-label="Désactivé"><span class=" fr-ml-4w">Hériter de l’étape "Demande" du 01-01-2022</span></label>
+                      <!---->
+                    </div>
+                  </div>
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div>
+        <div class="dsfr">
+          <h2 class="cap-first fr-pt-6w">Périmètre</h2>
+          <!---->
+          <!---->
+        </div>
+        <div>
+          <div>
+            <div class="mb-s">
+              <div>
+                <div>
+                  <div class="dsfr">
+                    <div class="fr-tabs">
+                      <ul class="fr-tabs__list" role="tablist" aria-label="Affichage des titres en vue carte ou tableau">
+                        <li role="presentation"><button id="tabpanel-carte-556" class="fr-tabs__tab fr-icon-earth-fill fr-tabs__tab--icon-left" tabindex="-1" role="tab" aria-label="Carte" aria-selected="false" aria-controls="tabpanel-carte-556-panel">Carte</button></li>
+                        <li role="presentation"><button id="tabpanel-points-556" class="fr-tabs__tab fr-icon-list-unordered fr-tabs__tab--icon-left" tabindex="0" role="tab" aria-label="Tableau" aria-selected="true" aria-controls="tabpanel-points-556-panel">Tableau</button></li>
+                      </ul>
+                      <div id="tabpanel-carte-556-panel" class="fr-tabs__panel" role="tabpanel" aria-labelledby="tabpanel-carte-556" tabindex="0">
+                        <!---->
+                      </div>
+                      <div id="tabpanel-points-556-panel" class="fr-tabs__panel fr-tabs__panel--selected" role="tabpanel" aria-labelledby="tabpanel-points-556" tabindex="0">
+                        <div style="display: flex; flex-direction: column;">
+                          <div id="typeahead_487_wrapper" class="_typeahead_8eddf1 dsfr">
+                            <div class="flex"><input id="typeahead_487" type="text" name="typeahead_487" disabled="" class="_typeahead-input_8eddf1 fr-input" placeholder="" autocomplete="off"></div>
+                            <!---->
+                          </div>
+                          <div style="display: flex; flex-direction: column;">
+                            <div style="overflow-x: auto;" class="fr-mb-1w">
+                              <div class="fr-table">
+                                <table style="display: table;">
+                                  <caption></caption>
+                                  <thead>
+                                    <tr>
+                                      <th scope="col" class="nowrap">
+                                        <div class="fr-text--md">Nom du point</div>
+                                      </th>
+                                      <th scope="col" class="nowrap">
+                                        <div class="fr-text--md">Description</div>
+                                      </th>
+                                      <th scope="col" class="nowrap">
+                                        <div class="fr-text--md">Longitude</div>
+                                      </th>
+                                      <th scope="col" class="nowrap">
+                                        <div class="fr-text--md">Latitude</div>
+                                      </th>
+                                      <th scope="col" class="nowrap">
+                                        <div class="fr-text--md">Longitude (E)</div>
+                                      </th>
+                                      <th scope="col" class="nowrap">
+                                        <div class="fr-text--md">Latitude (N)</div>
+                                      </th>
+                                    </tr>
+                                  </thead>
+                                  <tbody>
+                                    <tr>
+                                      <td class=""><span class="">A</span></td>
+                                      <td class=""><span class="">Polygone 1</span></td>
+                                      <td class=""><span class="">-52.54</span></td>
+                                      <td class=""><span class="">4.22269896902571</span></td>
+                                      <td class=""><span class="">-52°32,4'</span></td>
+                                      <td class=""><span class="">4°13,362'</span></td>
+                                    </tr>
+                                    <tr>
+                                      <td class=""><span class="">B</span></td>
+                                      <td class=""><span class="">Polygone 1</span></td>
+                                      <td class=""><span class="">-52.55</span></td>
+                                      <td class=""><span class="">4.22438936251509</span></td>
+                                      <td class=""><span class="">-52°33'</span></td>
+                                      <td class=""><span class="">4°13,463'</span></td>
+                                    </tr>
+                                    <tr>
+                                      <td class=""><span class="">C</span></td>
+                                      <td class=""><span class="">Polygone 1</span></td>
+                                      <td class=""><span class="">-52.55</span></td>
+                                      <td class=""><span class="">4.24113309117193</span></td>
+                                      <td class=""><span class="">-52°33'</span></td>
+                                      <td class=""><span class="">4°14,468'</span></td>
+                                    </tr>
+                                  </tbody>
+                                </table>
+                              </div>
+                            </div><a class="fr-btn fr-btn--secondary fr-btn--icon-right fr-icon-download-line" title="Télécharge les points au format csv" href="data:text/csv;charset=utf-8,nom;description;longitude;latitude;x_deg;y_deg%0AA;Polygone%201;-52.54;4.22269896902571;-52%C2%B032,4';4%C2%B013,362'%0AB;Polygone%201;-52.55;4.22438936251509;-52%C2%B033';4%C2%B013,463'%0AC;Polygone%201;-52.55;4.24113309117193;-52%C2%B033';4%C2%B014,468'" download="points-titre-slug.csv" style="align-self: end;">.csv</a>
+                          </div>
+                          <!---->
+                        </div>
+                      </div>
+                    </div>
+                  </div>
+                  <!---->
+                </div>
+              </div>
+              <div class="dsfr">
+                <div class="fr-toggle"><input type="checkbox" class="fr-toggle__input" id="toggle_796"><label class="fr-toggle__label" for="toggle_796" data-fr-checked-label="Activé" data-fr-unchecked-label="Désactivé"><span class=" fr-ml-4w">Hériter de l’étape "Demande" du 01-01-2022</span></label>
+                  <!---->
+                </div>
+              </div>
+            </div>
+            <!---->
+            <!---->
+            <!---->
+          </div>
+        </div>
+      </div>
+      <div>
+        <div class="dsfr">
+          <h2 class="cap-first fr-pt-6w">Liste des documents</h2>
+          <p style="z-index: unset; margin-bottom: 0px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;" class="fr-badge fr-badge--sm fr-badge--error fr-badge--no-icon" title="Incomplet" aria-label="Incomplet">Incomplet</p>
+          <!---->
+        </div>
+        <div>
+          <div class="fr-table fr-mb-0">
+            <table style="display: table;">
+              <caption>Documents obligatoires</caption>
+              <thead>
+                <tr>
+                  <th scope="col">Nom</th>
+                  <th scope="col">Description</th>
+                  <th scope="col">Visibilité</th>
+                  <th scope="col" style="display: flex; justify-content: end;">Action</th>
+                </tr>
+              </thead>
+              <tbody>
+                <tr>
+                  <td class="fr-label--disabled">Dossier "Loi sur l'eau"</td>
+                  <td>-</td>
+                  <td>-</td>
+                  <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Dossier &quot;Loi sur l'eau&quot;" aria-label="Ajouter un document Dossier &quot;Loi sur l'eau&quot;" type="button">
+                      <!---->
+                    </button></td>
+                </tr>
+              </tbody>
+            </table>
+          </div>
+          <div style="display: flex; flex-direction: column;" class="fr-mt-3w">
+            <div class="fr-table fr-mb-0">
+              <table style="display: table;">
+                <caption>Documents complémentaires</caption>
+                <thead>
+                  <tr>
+                    <th scope="col">Nom</th>
+                    <th scope="col">Description</th>
+                    <th scope="col">Visibilité</th>
+                    <th scope="col" style="display: flex; justify-content: end;">Action</th>
+                  </tr>
+                </thead>
+                <tbody></tbody>
+              </table>
+            </div><button class="fr-btn fr-btn--secondary fr-btn--md fr-icon-add-line fr-btn--icon-right fr-mt-1w" title="Ajouter un document complémentaire" aria-label="Ajouter un document complémentaire" type="button" style="align-self: end;">Ajouter</button>
+          </div>
+          <!---->
+          <!---->
+          <!---->
+        </div>
+      </div>
+      <div>
+        <div class="dsfr">
+          <h2 class="cap-first fr-pt-6w">Documents d’entreprise</h2>
+          <!---->
+          <!---->
+        </div>
+        <div>
+          <div>
+            <div class="fr-table fr-mb-0">
+              <table style="display: table;">
+                <caption>10 A</caption>
+                <thead>
+                  <tr>
+                    <th scope="col">Nom</th>
+                    <th scope="col"></th>
+                    <th scope="col" style="display: flex; justify-content: end;">Action</th>
+                  </tr>
+                </thead>
+                <tbody>
+                  <tr>
+                    <td>
+                      <div class="fr-select-group">
+                        <!----><select class="fr-select" id="select_482" aria-label="Ajouter un nouveau type de document" name="select_482">
+                          <option value="atf">Attestation fiscale</option>
+                          <option value="jcf">Justificatif des capacités financières</option>
+                          <option disabled="" hidden="" value="">Selectionnez une option</option>
+                        </select>
+                      </div>
+                    </td>
+                    <td></td>
+                    <td></td>
+                  </tr>
+                </tbody>
+              </table>
+            </div>
+          </div>
+          <!---->
+        </div>
+      </div>
+      <div class="fr-input-group fr-mt-2w"><label class="fr-label" for="textarea_216">Notes
+          <!---->
+          <!---->
+        </label><textarea class="fr-input" name="textarea_216" id="textarea_216"></textarea></div>
+    </div>
+    <div class="fr-mt-2w fr-pt-2w fr-pb-2w" style="position: sticky; bottom: 0px; z-index: 100000; background: white;">
+      <div style="display: flex; flex-direction: column;">
+        <div class="fr-alert fr-alert--warning fr-alert--sm">
+          <p><a class="fr-link" title="Le titre Titre Tutu au statut « valide - modification en instance » est superposé à ce titre" href="/titres/slug-tutu" target="_blank">Le titre Titre Tutu au statut « valide - modification en instance » est superposé à ce titre</a></p>
+        </div>
+        <!---->
+        <div style="display: flex; justify-content: end; align-items: center;" class="fr-mt-2w">
+          <!----><button class="fr-btn fr-btn--primary fr-btn--md fr-ml-2w" disabled="" title="Enregistrer l'étape" aria-label="Enregistrer l'étape" type="submit">Enregistrer l'étape</button>
+          <!---->
+        </div>
+      </div>
+    </div>
+    <!---->
+  </form>
+</div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape-edition.tsx b/packages/ui/src/components/etape-edition.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..cd930ed351cf5da97fe1a9b9dfecb29a864eb229
--- /dev/null
+++ b/packages/ui/src/components/etape-edition.tsx
@@ -0,0 +1,209 @@
+import { DeepReadonly, computed, defineComponent, inject, onMounted, ref } from 'vue'
+import { useRouter } from 'vue-router'
+import { ApiClient, apiClient } from '../api/api-client'
+import { DemarcheId, DemarcheIdOrSlug, demarcheIdOrSlugValidator } from 'camino-common/src/demarche'
+import { isNotNullNorUndefined } from 'camino-common/src/typescript-tools'
+import { Alert } from './_ui/alert'
+import { EtapeIdOrSlug, etapeIdOrSlugValidator } from 'camino-common/src/etape'
+import { entreprisesKey, userKey } from '../moi'
+import { User, isAdministrationAdmin, isAdministrationEditeur, isSuper } from 'camino-common/src/roles'
+import { Entreprise } from 'camino-common/src/entreprise'
+import { useState } from '../utils/vue-tsx-utils'
+import { AsyncData } from '../api/client-rest'
+import { GetDemarcheByIdOrSlugValidator } from 'camino-common/src/titres'
+import { PerimetreInformations } from 'camino-common/src/perimetre'
+import { LoadingElement } from './_ui/functional-loader'
+import { DemarchesTypes } from 'camino-common/src/static/demarchesTypes'
+import { DsfrLink } from './_ui/dsfr-button'
+import { EtapeTypeId, EtapesTypes } from 'camino-common/src/static/etapesTypes'
+import { capitalize } from 'camino-common/src/strings'
+import { EtapeEditForm, Props as EtapeEditFormProps } from './etape/etape-edit-form'
+import { TitreTypeId } from 'camino-common/src/static/titresTypes'
+import { CaminoAccessError } from './error'
+
+export const EtapeEdition = defineComponent(() => {
+  const router = useRouter()
+  const user = inject(userKey)
+  const entreprises = inject(entreprisesKey, ref([]))
+
+  const demarcheIdOrSlug = computed<DemarcheIdOrSlug | null>(() => {
+    return demarcheIdOrSlugValidator.nullable().parse(router.currentRoute.value.query['demarche-id'] ?? null)
+  })
+  const etapeIdOrSlug = computed<EtapeIdOrSlug | null>(() => {
+    return etapeIdOrSlugValidator.nullable().parse(router.currentRoute.value.params.id ?? null)
+  })
+
+  const goToDemarche = (demarcheId: DemarcheId) => {
+    router.push({ name: 'demarche', params: { demarcheId } })
+  }
+
+  return () => (
+    <>
+      {isNotNullNorUndefined(demarcheIdOrSlug.value) || isNotNullNorUndefined(etapeIdOrSlug.value) ? (
+        <PureEtapeEdition etapeIdOrSlug={etapeIdOrSlug.value} demarcheIdOrSlug={demarcheIdOrSlug.value} user={user} entreprises={entreprises.value} apiClient={apiClient} goToDemarche={goToDemarche} />
+      ) : (
+        <CaminoAccessError user={user} />
+      )}
+    </>
+  )
+})
+
+export type Props = {
+  initTab?: 'points' | 'carte'
+  etapeIdOrSlug: EtapeIdOrSlug | null
+  demarcheIdOrSlug: DemarcheIdOrSlug | null
+  user: User
+  entreprises: Entreprise[]
+  goToDemarche: (demarcheId: DemarcheId) => void
+  apiClient: Pick<
+    ApiClient,
+    | 'getEntrepriseDocuments'
+    | 'getEtapesTypesEtapesStatuts'
+    | 'getEtapeHeritagePotentiel'
+    | 'uploadTempDocument'
+    | 'geojsonImport'
+    | 'getGeojsonByGeoSystemeId'
+    | 'geojsonPointsImport'
+    | 'geojsonForagesImport'
+    | 'getEtapeDocumentsByEtapeId'
+    | 'getEtapeEntrepriseDocuments'
+    | 'creerEntrepriseDocument'
+    | 'getEtape'
+    | 'getDemarcheByIdOrSlug'
+    | 'getPerimetreInfosByDemarcheId'
+    | 'getPerimetreInfosByEtapeId'
+    | 'etapeCreer'
+    | 'etapeModifier'
+    | 'deposeEtape'
+  >
+}
+
+const helpVisible = (user: User, titreTypeId: TitreTypeId, etapeTypeId: EtapeTypeId | null): boolean => {
+  return !(isSuper(user) || isAdministrationAdmin(user) || isAdministrationEditeur(user)) && ['axm', 'arm'].includes(titreTypeId) && etapeTypeId === 'mfr'
+}
+
+export const PureEtapeEdition = defineComponent<Props>(props => {
+  const [asyncData, setAsyncData] = useState<AsyncData<DeepReadonly<{ etape: EtapeEditFormProps['etape']; demarche: GetDemarcheByIdOrSlugValidator; perimetre: PerimetreInformations }>>>({
+    status: 'LOADING',
+  })
+
+  onMounted(async () => {
+    try {
+      if (isNotNullNorUndefined(props.etapeIdOrSlug)) {
+        const etape = await props.apiClient.getEtape(props.etapeIdOrSlug)
+        const demarche = {
+          demarche_description: etape.demarche.description,
+          demarche_id: etape.titreDemarcheId,
+          demarche_slug: etape.demarche.slug,
+          demarche_type_id: etape.demarche.typeId,
+          titre_id: etape.demarche.titre.id,
+          titre_nom: etape.demarche.titre.nom,
+          titre_slug: etape.demarche.titre.slug,
+          titre_type_id: etape.demarche.titre.typeId,
+        }
+
+        const perimetre = await props.apiClient.getPerimetreInfosByEtapeId(etape.id)
+        setAsyncData({ status: 'LOADED', value: { etape, demarche, perimetre } })
+      } else if (isNotNullNorUndefined(props.demarcheIdOrSlug)) {
+        const demarche = await props.apiClient.getDemarcheByIdOrSlug(props.demarcheIdOrSlug)
+        const perimetre = await props.apiClient.getPerimetreInfosByDemarcheId(demarche.demarche_id)
+        setAsyncData({
+          status: 'LOADED',
+          value: {
+            etape: {
+              id: null,
+              contenu: {},
+              date: null,
+              typeId: null,
+              statutId: null,
+              substances: [],
+              titulaires: [],
+              amodiataires: [],
+              geojson4326Perimetre: null,
+              geojson4326Points: null,
+              geojsonOriginePerimetre: null,
+              geojsonOriginePoints: null,
+              geojsonOrigineGeoSystemeId: null,
+              geojson4326Forages: null,
+              geojsonOrigineForages: null,
+              surface: null,
+              notes: null,
+              duree: null,
+              dateDebut: null,
+              dateFin: null,
+              heritageContenu: null,
+              heritageProps: null,
+            },
+            demarche,
+            perimetre,
+          },
+        })
+      }
+    } catch (e: any) {
+      console.error('error', e)
+      setAsyncData({ status: 'ERROR', message: e.message ?? "Une erreur s'est produite" })
+    }
+  })
+
+  return () => (
+    <div class="dsfr">
+      <LoadingElement
+        data={asyncData.value}
+        renderItem={({ etape, demarche, perimetre }) => (
+          <>
+            <div>
+              <DsfrLink to={{ name: 'titre', params: { id: demarche.titre_slug } }} disabled={false} title={demarche.titre_nom} icon={null} />
+              <span> {'>'} </span>
+              <span class="cap-first">
+                {' '}
+                {DemarchesTypes[demarche.demarche_type_id].nom} {demarche.demarche_description}{' '}
+              </span>
+            </div>
+
+            <h1 class="fr-mt-5w">{etape.typeId !== null ? `Étape - ${capitalize(EtapesTypes[etape.typeId].nom)}` : 'Création d’une étape'}</h1>
+
+            {helpVisible(props.user, demarche.titre_type_id, etape.typeId) ? (
+              <Alert
+                small={true}
+                title={
+                  <span>
+                    Besoin d’aide pour déposer votre demande ?{' '}
+                    <DsfrLink
+                      disabled={false}
+                      icon={null}
+                      target="_blank"
+                      href="https://camino.gitbook.io/guide-dutilisation/a-propos/contact"
+                      rel="noopener noreferrer"
+                      label="Page contact"
+                      title="Page contact - site externe"
+                    >
+                      Contactez-nous
+                    </DsfrLink>
+                  </span>
+                }
+                type="info"
+              />
+            ) : null}
+
+            <EtapeEditForm
+              initTab={props.initTab}
+              etape={etape}
+              demarcheId={demarche.demarche_id}
+              demarcheTypeId={demarche.demarche_type_id}
+              titreSlug={demarche.titre_slug}
+              titreTypeId={demarche.titre_type_id}
+              user={props.user}
+              entreprises={props.entreprises}
+              apiClient={props.apiClient}
+              perimetre={perimetre}
+              goToDemarche={props.goToDemarche}
+            />
+          </>
+        )}
+      />
+    </div>
+  )
+})
+
+// @ts-ignore waiting for https://github.com/vuejs/core/issues/7833
+PureEtapeEdition.props = ['etapeIdOrSlug', 'demarcheIdOrSlug', 'user', 'entreprises', 'apiClient', 'initTab', 'goToDemarche']
diff --git a/packages/ui/src/components/etape-edition.vue b/packages/ui/src/components/etape-edition.vue
deleted file mode 100644
index 938bd2ab986165e590b8455ba91bd9b3a0c3a477..0000000000000000000000000000000000000000
--- a/packages/ui/src/components/etape-edition.vue
+++ /dev/null
@@ -1,329 +0,0 @@
-<template>
-  <div v-if="loaded">
-    <p>
-      <router-link :to="{ name: 'titre', params: { id: titre.slug } }" class="cap-first">
-        {{ titre.nom }}
-      </router-link>
-      <span class="color-neutral"> | </span>
-      <span class="cap-first"> {{ demarcheType.nom }} {{ demarcheDescription }} </span>
-    </p>
-    <h1 style="margin: 0">Étape</h1>
-
-    <div v-if="helpVisible" class="p-s bg-info color-bg mb">
-      Besoin d'aide pour déposer votre demande ?
-      <a target="_blank" class="p-s bg-info color-bg mb" href="https://camino.gitbook.io/guide-dutilisation/a-propos/contact" rel="noopener noreferrer" title="Page contact - site externe"
-        >Contactez-nous</a
-      >
-    </div>
-
-    <div v-if="dateIsVisible" class="tablet-blobs">
-      <div class="tablet-blob-1-3 tablet-pt-s pb-s">
-        <h5>Date</h5>
-      </div>
-      <div class="tablet-blob-2-3">
-        <InputDate :initialValue="newDate" :dateChanged="dateChanged" class="mb" />
-      </div>
-    </div>
-
-    <Edit
-      v-else
-      :etape="editedEtape"
-      :demarcheTypeId="demarcheType.id"
-      :user="user"
-      :etapeIsDemandeEnConstruction="etapeIsDemandeEnConstruction"
-      :titreTypeId="titre.typeId"
-      :titreSlug="titre.slug"
-      :documentPopupTitle="documentPopupTitle"
-      :etapeType="etapeType"
-      @complete-update="completeUpdate"
-      @type-complete-update="typeCompleteUpdate"
-      @change="editChange"
-      @alertes-update="alertesUpdate"
-    />
-
-    <div v-if="loading" class="tablet-blobs">
-      <div class="tablet-blob-1-3" />
-      <div class="tablet-blob-2-3">
-        <div class="p-s bold mb">Enregistrement en cours…</div>
-      </div>
-    </div>
-
-    <div v-else-if="dateIsVisible" class="tablet-blobs mb">
-      <div class="tablet-blob-1-3" />
-      <div class="tablet-blob-2-3">
-        <button ref="date-button" class="btn btn-primary" :disabled="!newDate" :class="{ disabled: !newDate }" @click="dateUpdate">Valider</button>
-      </div>
-    </div>
-
-    <div v-else ref="save-btn-container" class="tablet-blobs pb-m pt-m bg-bg b-0 sticky" style="z-index: 100000">
-      <div class="tablet-blob-1-3" />
-      <FormSaveBtn ref="save-btn" :alertes="alertes" :canSave="isFormComplete" :canDepose="complete" :showDepose="etapeIsDemandeEnConstruction" @save="save" @depose="depose" />
-    </div>
-  </div>
-</template>
-
-<script>
-import { cap, dateFormat } from '@/utils'
-import { InputDate } from './_ui/input-date'
-import Edit from './etape/edit.vue'
-import { getCurrent } from 'camino-common/src/date'
-import FormSaveBtn from './etape/pure-form-save-btn.vue'
-import DeposePopup from './etape/depose-popup.vue'
-import { DemarchesTypes } from 'camino-common/src/static/demarchesTypes'
-import { SDOMZoneIds, SDOMZones } from 'camino-common/src/static/sdom'
-import { isNotNullNorUndefined } from 'camino-common/src/typescript-tools'
-import { TitresStatutIds, TitresStatuts } from 'camino-common/src/static/titresStatuts'
-import { isAdministrationAdmin, isAdministrationEditeur, isSuper } from 'camino-common/src/roles'
-import { documentTypeIdsBySdomZonesGet } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sdom'
-import { apiClient } from '../api/api-client'
-import { userKey, entreprisesKey } from '@/moi'
-
-// TODO 2023-06-14 Revoir comment est gérer le droit de déposer l’étape
-export default {
-  components: { Edit, InputDate, FormSaveBtn },
-
-  beforeRouteLeave(_, __, next) {
-    if (this.isFormDirty && !confirm(this.promptMsg)) {
-      next(false)
-    } else {
-      next()
-    }
-  },
-
-  data() {
-    return {
-      complete: false,
-      isFormDirty: false,
-      typeComplete: false,
-      promptMsg: 'Quitter le formulaire sans enregistrer les changements ?',
-      newDate: getCurrent(),
-      sdomZoneIds: [],
-      superposition_alertes: [],
-    }
-  },
-
-  computed: {
-    loaded() {
-      return this.$store.state.titreEtapeEdition.loaded
-    },
-
-    etapeId() {
-      return this.$route.params.id
-    },
-
-    editedEtape() {
-      return this.$store.state.titreEtapeEdition.element
-    },
-
-    etapeType() {
-      return this.$store.getters['titreEtapeEdition/etapeType']
-    },
-
-    demarche() {
-      return this.$store.state.titreEtapeEdition.metas.demarche
-    },
-
-    demarcheDescription() {
-      return this.demarche?.description ? `(${this.demarche.description})` : ''
-    },
-
-    alertes() {
-      const alertes = []
-      if (this.superposition_alertes.length > 0) {
-        alertes.push(
-          ...this.superposition_alertes.map(t => ({
-            message: `Le titre ${t.nom} au statut « ${isNotNullNorUndefined(t.titre_statut_id) ? TitresStatuts[t.titre_statut_id].nom : ''} » est superposé à ce titre`,
-            url: `/titres/${t.slug}`,
-          }))
-        )
-      }
-
-      // si c’est une demande d’AXM, on doit afficher une alerte si on est en zone 0 ou 1 du Sdom
-      if (['mfr', 'mcr'].includes(this.etapeType?.id) && this.titre.typeId === 'axm') {
-        const zoneId = this.sdomZoneIds.find(id => [SDOMZoneIds.Zone0, SDOMZoneIds.Zone0Potentielle, SDOMZoneIds.Zone1].includes(id))
-        if (zoneId) {
-          alertes.push({ message: `Le périmètre renseigné est dans une zone du Sdom interdite à l’exploitation minière : ${SDOMZones[zoneId].nom}` })
-        }
-      }
-
-      return alertes
-    },
-
-    demarcheType() {
-      return DemarchesTypes[this.demarche.typeId]
-    },
-
-    titre() {
-      return this.demarche.titre
-    },
-
-    dateIsVisible() {
-      return !this.editedEtape?.date
-    },
-
-    loading() {
-      return this.$store.state.loading.includes('titreEtapeUpdate') || this.$store.state.loading.includes('titreEtapeMetasGet') || this.$store.state.loading.includes('titreEtapeGet')
-    },
-
-    etapeIsDemandeEnConstruction() {
-      return this.etapeType?.id === 'mfr' && this.editedEtape?.statutId === 'aco'
-    },
-
-    isPopupOpen() {
-      return !!this.$store.state.popup.component
-    },
-
-    isFormComplete() {
-      return (this.etapeIsDemandeEnConstruction && this.typeComplete) || this.complete
-    },
-
-    documentPopupTitle() {
-      return `${cap(this.titre.nom)} | ${cap(this.demarcheType.nom)} | ${this.etapeType ? cap(this.etapeType.nom) : ''}`
-    },
-
-    helpVisible() {
-      return !(isSuper(this.user) || isAdministrationAdmin(this.user) || isAdministrationEditeur(this.user)) && ['axm', 'arm'].includes(this.titre.typeId) && this.etapeType?.id === 'mfr'
-    },
-  },
-  async created() {
-    await this.init()
-
-    document.addEventListener('keyup', this.keyUp)
-    window.addEventListener('beforeunload', this.beforeWindowUnload)
-  },
-
-  beforeUnmount() {
-    document.removeEventListener('keyup', this.keyUp)
-    window.removeEventListener('beforeunload', this.beforeWindowUnload)
-  },
-
-  unmounted() {
-    this.$store.commit('titreEtapeEdition/reset')
-  },
-
-  methods: {
-    dateChanged(date) {
-      this.newDate = date
-    },
-    async init() {
-      const titreDemarcheId = this.$route.query['demarche-id']
-      await this.$store.dispatch('titreEtapeEdition/init', {
-        titreDemarcheId,
-        id: this.etapeId,
-        entreprises: this.entreprises,
-        date: this.newDate,
-      })
-
-      let perimetreInfos = null
-      if (isNotNullNorUndefined(this.etapeId)) {
-        perimetreInfos = await apiClient.getPerimetreInfosByEtapeId(this.etapeId)
-      } else {
-        perimetreInfos = await apiClient.getPerimetreInfosByDemarcheId(titreDemarcheId)
-      }
-      this.alertesUpdate(perimetreInfos)
-    },
-
-    beforeWindowUnload(e) {
-      if (!this.isFormDirty) return true
-      e.returnValue = this.promptMsg
-      return this.promptMsg
-    },
-
-    async reroute(titreEtapeId) {
-      // TODO 2023-09-21 il faut automatiquement déplier l'étape et aller sur l'ancre
-      await this.$router.push({
-        name: 'titre',
-        params: { id: this.titre.id },
-        query: { demarcheSlug: this.demarche.slug },
-        hash: `#${titreEtapeId}`,
-      })
-    },
-
-    async save(reroute = true) {
-      this.isFormDirty = false
-
-      if (this.isFormComplete) {
-        const titreEtapeId = await this.$store.dispatch('titreEtapeEdition/upsert', {
-          etape: this.editedEtape,
-        })
-
-        if (titreEtapeId) {
-          if (reroute) {
-            await this.reroute(titreEtapeId)
-          }
-        }
-        return titreEtapeId
-      }
-
-      return undefined
-    },
-
-    async depose() {
-      if (this.complete) {
-        const etapeId = await this.save(false)
-
-        if (etapeId) {
-          this.$store.commit('popupOpen', {
-            component: DeposePopup,
-            props: {
-              etapeId,
-              onDepotDone: async () => {
-                await this.reroute(etapeId)
-              },
-            },
-          })
-        }
-      }
-    },
-
-    keyUp(e) {
-      if ((e.which || e.keyCode) === 13 && this.complete && !this.isPopupOpen) {
-        if (this.dateIsVisible && this.newDate) {
-          this.$refs['date-button'].focus()
-          this.dateUpdate()
-        } else if (!this.dateIsVisible && !this.loading && this.isFormComplete) {
-          this.$refs['save-btn'].focusBtn()
-          this.save()
-        }
-      }
-    },
-
-    completeUpdate(complete) {
-      this.complete = complete
-    },
-
-    typeCompleteUpdate(complete) {
-      this.typeComplete = complete
-    },
-
-    alertesUpdate(infos) {
-      this.superposition_alertes = infos.superposition_alertes
-      this.sdomZoneIds = infos.sdomZoneIds
-
-      if (isNotNullNorUndefined(this.etapeType)) {
-        const documentTypeIds = documentTypeIdsBySdomZonesGet(infos.sdomZoneIds, this.titre.typeId, this.demarche.typeId, this.etapeType.id)
-
-        this.$store.commit('titreEtapeEdition/metasSet', {
-          sdomZonesDocumentTypeIds: documentTypeIds,
-        })
-        this.$store.dispatch('titreEtapeEdition/documentInit', this.editedEtape.documents)
-      }
-    },
-
-    editChange() {
-      if (!this.loaded) return
-      this.isFormDirty = true
-    },
-
-    async dateUpdate() {
-      await this.$store.dispatch('titreEtapeEdition/dateUpdate', {
-        date: this.newDate,
-      })
-    },
-
-    dateFormat(date) {
-      return dateFormat(date)
-    },
-  },
-}
-</script>
diff --git a/packages/ui/src/components/etape/add-etape-asl-document-popup.stories.tsx b/packages/ui/src/components/etape/add-etape-asl-document-popup.stories.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..244e53e29339a04ddc230aecfb116548cdee4321
--- /dev/null
+++ b/packages/ui/src/components/etape/add-etape-asl-document-popup.stories.tsx
@@ -0,0 +1,59 @@
+import { Meta, StoryFn } from '@storybook/vue3'
+import { action } from '@storybook/addon-actions'
+import { tempDocumentNameValidator } from 'camino-common/src/document'
+import { ApiClient } from '@/api/api-client'
+import { AddEtapeAslDocumentPopup } from './add-etape-asl-document-popup'
+import { toCaminoDate } from 'camino-common/src/date'
+import { etapeDocumentIdValidator } from 'camino-common/src/etape'
+
+const meta: Meta = {
+  title: 'Components/Etape/Document/AjoutDocumentPourAsl',
+  // @ts-ignore
+  component: AddEtapeAslDocumentPopup,
+}
+export default meta
+
+const close = action('close')
+const uploadTempDocumentAction = action('uploadTempDocument')
+
+const apiClient: Pick<ApiClient, 'uploadTempDocument'> = {
+  uploadTempDocument: (...params) => {
+    uploadTempDocumentAction(params)
+
+    return Promise.resolve(tempDocumentNameValidator.parse(new Date().toISOString()))
+  },
+}
+
+export const SansDocumentInitial: StoryFn = () => <AddEtapeAslDocumentPopup close={close} apiClient={apiClient} initialDocument={null} />
+
+export const DocumentInitialTemporaire: StoryFn = () => (
+  <AddEtapeAslDocumentPopup
+    close={close}
+    initialDocument={{
+      description: 'description',
+      entreprises_lecture: true,
+      public_lecture: false,
+      etape_document_type_id: 'let',
+      temp_document_name: tempDocumentNameValidator.parse('value'),
+      date: toCaminoDate('2023-01-02'),
+      etape_statut_id: 'exe',
+    }}
+    apiClient={apiClient}
+  />
+)
+
+export const DocumentInitialDejaSauvegarde: StoryFn = () => (
+  <AddEtapeAslDocumentPopup
+    close={close}
+    initialDocument={{
+      description: 'description',
+      entreprises_lecture: true,
+      public_lecture: false,
+      etape_document_type_id: 'let',
+      id: etapeDocumentIdValidator.parse('documentId'),
+      date: toCaminoDate('2023-01-02'),
+      etape_statut_id: 'req',
+    }}
+    apiClient={apiClient}
+  />
+)
diff --git a/packages/ui/src/components/etape/add-etape-asl-document-popup.stories_snapshots_DocumentInitialDejaSauvegarde.html b/packages/ui/src/components/etape/add-etape-asl-document-popup.stories_snapshots_DocumentInitialDejaSauvegarde.html
new file mode 100644
index 0000000000000000000000000000000000000000..fc5b10cf6d2398563ac00b21eb1e467ed8757507
--- /dev/null
+++ b/packages/ui/src/components/etape/add-etape-asl-document-popup.stories_snapshots_DocumentInitialDejaSauvegarde.html
@@ -0,0 +1,59 @@
+<!--teleport start-->
+<div class="dsfr">
+  <dialog id="monId" class="fr-modal fr-modal--opened" open="" aria-modal="true" role="dialog" aria-labelledby="monId-title" style="z-index: 1000001;">
+    <div class="fr-container fr-container--fluid fr-container-md">
+      <div class="fr-grid-row fr-grid-row--center">
+        <div class="fr-col-12 fr-col-md-8 fr-col-lg-6">
+          <div class="fr-modal__body">
+            <div class="fr-modal__header"><button class="fr-btn--close fr-btn" aria-controls="monId" title="Fermer">Fermer</button></div>
+            <div class="fr-modal__content">
+              <h1 id="monId-title" class="fr-modal__title"><span class="fr-icon-arrow-right-line fr-icon--lg" aria-hidden="true"></span>Éditer 'Lettre' pour l’avis du propriétaire du sol</h1>
+              <div class="fr-container">
+                <form>
+                  <fieldset class="fr-fieldset" id="text">
+                    <div class="fr-fieldset__element">
+                      <div class="fr-upload-group"><label class="fr-label" for="file-upload">Ajouter un fichier<span class="fr-hint-text">Taille maximale : 100 Mo. Format<!----> supporté<!----> : pdf.</span></label><input class="fr-upload" type="file" id="file-upload" name="file-upload" accept=".pdf"></div>
+                    </div>
+                    <div class="fr-fieldset__element">
+                      <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_271">Date
+                          <!---->
+                          <!---->
+                        </label><input class="fr-input" name="input_271" id="input_271" type="date">
+                        <!---->
+                      </div>
+                    </div>
+                    <div class="fr-fieldset__element">
+                      <div class="fr-select-group"><label class="fr-label" for="select_670">Statut
+                          <!---->
+                        </label><select class="fr-select" id="select_670" aria-label="Statut" name="select_670">
+                          <option value="fav">favorable</option>
+                          <option value="fre">favorable avec réserves</option>
+                          <option value="def">défavorable</option>
+                          <option disabled="" hidden="" value="">Selectionnez une option</option>
+                        </select></div>
+                    </div>
+                    <div class="fr-fieldset__element">
+                      <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_74">Description
+                          <!---->
+                          <!---->
+                        </label><input class="fr-input" name="input_74" id="input_74" type="text">
+                        <!---->
+                      </div>
+                    </div>
+                  </fieldset>
+                </form>
+              </div>
+            </div>
+            <div class="fr-modal__footer">
+              <ul class="fr-btns-group fr-btns-group--right fr-btns-group--inline-reverse fr-btns-group--inline-lg fr-btns-group--icon-left">
+                <li><button class="fr-btn fr-icon-check-line fr-btn--icon-left">Enregistrer</button></li>
+                <li><button class="fr-btn fr-icon-arrow-go-back-fill fr-btn--icon-left fr-btn--secondary" aria-controls="monId">Annuler</button></li>
+              </ul>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </dialog>
+</div>
+<!--teleport end-->
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/add-etape-asl-document-popup.stories_snapshots_DocumentInitialTemporaire.html b/packages/ui/src/components/etape/add-etape-asl-document-popup.stories_snapshots_DocumentInitialTemporaire.html
new file mode 100644
index 0000000000000000000000000000000000000000..fc5b10cf6d2398563ac00b21eb1e467ed8757507
--- /dev/null
+++ b/packages/ui/src/components/etape/add-etape-asl-document-popup.stories_snapshots_DocumentInitialTemporaire.html
@@ -0,0 +1,59 @@
+<!--teleport start-->
+<div class="dsfr">
+  <dialog id="monId" class="fr-modal fr-modal--opened" open="" aria-modal="true" role="dialog" aria-labelledby="monId-title" style="z-index: 1000001;">
+    <div class="fr-container fr-container--fluid fr-container-md">
+      <div class="fr-grid-row fr-grid-row--center">
+        <div class="fr-col-12 fr-col-md-8 fr-col-lg-6">
+          <div class="fr-modal__body">
+            <div class="fr-modal__header"><button class="fr-btn--close fr-btn" aria-controls="monId" title="Fermer">Fermer</button></div>
+            <div class="fr-modal__content">
+              <h1 id="monId-title" class="fr-modal__title"><span class="fr-icon-arrow-right-line fr-icon--lg" aria-hidden="true"></span>Éditer 'Lettre' pour l’avis du propriétaire du sol</h1>
+              <div class="fr-container">
+                <form>
+                  <fieldset class="fr-fieldset" id="text">
+                    <div class="fr-fieldset__element">
+                      <div class="fr-upload-group"><label class="fr-label" for="file-upload">Ajouter un fichier<span class="fr-hint-text">Taille maximale : 100 Mo. Format<!----> supporté<!----> : pdf.</span></label><input class="fr-upload" type="file" id="file-upload" name="file-upload" accept=".pdf"></div>
+                    </div>
+                    <div class="fr-fieldset__element">
+                      <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_271">Date
+                          <!---->
+                          <!---->
+                        </label><input class="fr-input" name="input_271" id="input_271" type="date">
+                        <!---->
+                      </div>
+                    </div>
+                    <div class="fr-fieldset__element">
+                      <div class="fr-select-group"><label class="fr-label" for="select_670">Statut
+                          <!---->
+                        </label><select class="fr-select" id="select_670" aria-label="Statut" name="select_670">
+                          <option value="fav">favorable</option>
+                          <option value="fre">favorable avec réserves</option>
+                          <option value="def">défavorable</option>
+                          <option disabled="" hidden="" value="">Selectionnez une option</option>
+                        </select></div>
+                    </div>
+                    <div class="fr-fieldset__element">
+                      <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_74">Description
+                          <!---->
+                          <!---->
+                        </label><input class="fr-input" name="input_74" id="input_74" type="text">
+                        <!---->
+                      </div>
+                    </div>
+                  </fieldset>
+                </form>
+              </div>
+            </div>
+            <div class="fr-modal__footer">
+              <ul class="fr-btns-group fr-btns-group--right fr-btns-group--inline-reverse fr-btns-group--inline-lg fr-btns-group--icon-left">
+                <li><button class="fr-btn fr-icon-check-line fr-btn--icon-left">Enregistrer</button></li>
+                <li><button class="fr-btn fr-icon-arrow-go-back-fill fr-btn--icon-left fr-btn--secondary" aria-controls="monId">Annuler</button></li>
+              </ul>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </dialog>
+</div>
+<!--teleport end-->
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/add-etape-asl-document-popup.stories_snapshots_SansDocumentInitial.html b/packages/ui/src/components/etape/add-etape-asl-document-popup.stories_snapshots_SansDocumentInitial.html
new file mode 100644
index 0000000000000000000000000000000000000000..4e17e617fd179c071f9099245a3a9005fa49f717
--- /dev/null
+++ b/packages/ui/src/components/etape/add-etape-asl-document-popup.stories_snapshots_SansDocumentInitial.html
@@ -0,0 +1,59 @@
+<!--teleport start-->
+<div class="dsfr">
+  <dialog id="monId" class="fr-modal fr-modal--opened" open="" aria-modal="true" role="dialog" aria-labelledby="monId-title" style="z-index: 1000001;">
+    <div class="fr-container fr-container--fluid fr-container-md">
+      <div class="fr-grid-row fr-grid-row--center">
+        <div class="fr-col-12 fr-col-md-8 fr-col-lg-6">
+          <div class="fr-modal__body">
+            <div class="fr-modal__header"><button class="fr-btn--close fr-btn" aria-controls="monId" title="Fermer">Fermer</button></div>
+            <div class="fr-modal__content">
+              <h1 id="monId-title" class="fr-modal__title"><span class="fr-icon-arrow-right-line fr-icon--lg" aria-hidden="true"></span>Ajouter 'Lettre' pour l’avis du propriétaire du sol</h1>
+              <div class="fr-container">
+                <form>
+                  <fieldset class="fr-fieldset" id="text">
+                    <div class="fr-fieldset__element">
+                      <div class="fr-upload-group"><label class="fr-label" for="file-upload">Ajouter un fichier<span class="fr-hint-text">Taille maximale : 100 Mo. Format<!----> supporté<!----> : pdf.</span></label><input class="fr-upload" type="file" id="file-upload" name="file-upload" accept=".pdf"></div>
+                    </div>
+                    <div class="fr-fieldset__element">
+                      <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_271">Date
+                          <!---->
+                          <!---->
+                        </label><input class="fr-input" name="input_271" id="input_271" type="date">
+                        <!---->
+                      </div>
+                    </div>
+                    <div class="fr-fieldset__element">
+                      <div class="fr-select-group"><label class="fr-label" for="select_670">Statut
+                          <!---->
+                        </label><select class="fr-select" id="select_670" aria-label="Statut" name="select_670">
+                          <option value="fav">favorable</option>
+                          <option value="fre">favorable avec réserves</option>
+                          <option value="def">défavorable</option>
+                          <option disabled="" hidden="" value="">Selectionnez une option</option>
+                        </select></div>
+                    </div>
+                    <div class="fr-fieldset__element">
+                      <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_74">Description
+                          <!---->
+                          <!---->
+                        </label><input class="fr-input" name="input_74" id="input_74" type="text">
+                        <!---->
+                      </div>
+                    </div>
+                  </fieldset>
+                </form>
+              </div>
+            </div>
+            <div class="fr-modal__footer">
+              <ul class="fr-btns-group fr-btns-group--right fr-btns-group--inline-reverse fr-btns-group--inline-lg fr-btns-group--icon-left">
+                <li><button class="fr-btn fr-icon-check-line fr-btn--icon-left disabled" disabled="">Enregistrer</button></li>
+                <li><button class="fr-btn fr-icon-arrow-go-back-fill fr-btn--icon-left fr-btn--secondary" aria-controls="monId">Annuler</button></li>
+              </ul>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </dialog>
+</div>
+<!--teleport end-->
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/add-etape-asl-document-popup.tsx b/packages/ui/src/components/etape/add-etape-asl-document-popup.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..1a6081726b532161a76efcdbaadd7d409b190138
--- /dev/null
+++ b/packages/ui/src/components/etape/add-etape-asl-document-popup.tsx
@@ -0,0 +1,116 @@
+import { computed, defineComponent, ref } from 'vue'
+import { FunctionalPopup } from '../_ui/functional-popup'
+import { DocumentsTypes } from 'camino-common/src/static/documentsTypes'
+import { InputFile } from '../_ui/dsfr-input-file'
+import { ApiClient } from '@/api/api-client'
+import { TempDocumentName } from 'camino-common/src/document'
+import { Nullable, isNonEmptyArray, isNotNullNorUndefined, map } from 'camino-common/src/typescript-tools'
+import { DsfrInput } from '../_ui/dsfr-input'
+import {
+  DocumentComplementaireAslEtapeDocumentModification,
+  documentComplementaireAslEtapeDocumentModificationValidator,
+  documentTypeIdComplementaireObligatoireASL,
+  tempEtapeDocumentValidator,
+} from 'camino-common/src/etape'
+import { useState } from '@/utils/vue-tsx-utils'
+import { DsfrSelect } from '../_ui/dsfr-select'
+import { ETAPES_TYPES } from 'camino-common/src/static/etapesTypes'
+import { getEtapesStatuts } from 'camino-common/src/static/etapesTypesEtapesStatuts'
+
+interface Props {
+  close: (document: DocumentComplementaireAslEtapeDocumentModification | null) => void
+  initialDocument: DocumentComplementaireAslEtapeDocumentModification | null
+  apiClient: Pick<ApiClient, 'uploadTempDocument'>
+}
+
+export const AddEtapeAslDocumentPopup = defineComponent<Props>(props => {
+  const etapeDocumentTypeId = documentTypeIdComplementaireObligatoireASL
+  const etapeDocumentFile = ref<File | null>(null)
+  const documentDescription = ref<string>(props.initialDocument?.description ?? '')
+  const [documentDate, setDocumentDate] = useState(props.initialDocument?.date ?? null)
+  const [etapeStatutId, setEtapeStatutId] = useState(props.initialDocument?.etape_statut_id ?? null)
+  const tempDocumentName = ref<TempDocumentName | undefined>(
+    isNotNullNorUndefined(props.initialDocument) && 'temp_document_name' in props.initialDocument ? props.initialDocument.temp_document_name : undefined
+  )
+
+  const descriptionChange = (value: string) => {
+    documentDescription.value = value
+  }
+
+  const etapeStatutItems = computed(() => {
+    const etapeStatus = getEtapesStatuts(ETAPES_TYPES.decisionDuProprietaireDuSol)
+    if (isNonEmptyArray(etapeStatus)) {
+      return map(etapeStatus, ({ id, nom }) => ({ id, label: nom }))
+    }
+    throw new Error('cas impossible')
+  })
+  const content = () => {
+    return (
+      <form>
+        <fieldset class="fr-fieldset" id="text">
+          <div class="fr-fieldset__element">
+            <InputFile
+              accept={['pdf']}
+              uploadFile={file => {
+                etapeDocumentFile.value = file
+              }}
+            />
+          </div>
+          <div class="fr-fieldset__element">
+            <DsfrInput legend={{ main: 'Date' }} type={{ type: 'date' }} initialValue={documentDate.value} valueChanged={setDocumentDate} />
+          </div>
+
+          <div class="fr-fieldset__element">
+            <DsfrSelect legend={{ main: 'Statut' }} items={etapeStatutItems.value} initialValue={etapeStatutId.value} valueChanged={setEtapeStatutId} />
+          </div>
+
+          <div class="fr-fieldset__element">
+            <DsfrInput legend={{ main: 'Description' }} initialValue={documentDescription.value} type={{ type: 'text' }} valueChanged={descriptionChange} />
+          </div>
+        </fieldset>
+      </form>
+    )
+  }
+
+  const tempDocument = computed<Nullable<Omit<DocumentComplementaireAslEtapeDocumentModification, 'temp_document_name' | 'id'>>>(() => ({
+    etape_document_type_id: etapeDocumentTypeId,
+    description: documentDescription.value,
+    public_lecture: false,
+    entreprises_lecture: true,
+    date: documentDate.value,
+    etape_statut_id: etapeStatutId.value,
+  }))
+
+  const canSave = computed<boolean>(() => {
+    return tempEtapeDocumentValidator.omit({ temp_document_name: true }).safeParse(tempDocument.value).success && (etapeDocumentFile.value !== null || isNotNullNorUndefined(props.initialDocument))
+  })
+
+  return () => (
+    <FunctionalPopup
+      title={`${isNotNullNorUndefined(props.initialDocument) ? 'Éditer' : 'Ajouter'} '${DocumentsTypes[etapeDocumentTypeId].nom}' pour l’avis du propriétaire du sol`}
+      content={content}
+      close={() => {
+        props.close(null)
+      }}
+      validate={{
+        action: async () => {
+          if (etapeDocumentFile.value !== null) {
+            tempDocumentName.value = await props.apiClient.uploadTempDocument(etapeDocumentFile.value)
+          }
+          const value = { ...props.initialDocument, ...tempDocument.value, etape_document_type_id: etapeDocumentTypeId, temp_document_name: tempDocumentName.value }
+          const parsed = documentComplementaireAslEtapeDocumentModificationValidator.safeParse(value)
+
+          if (parsed.success) {
+            props.close(parsed.data)
+          } else {
+            console.error(parsed.error)
+          }
+        },
+      }}
+      canValidate={canSave.value}
+    />
+  )
+})
+
+// @ts-ignore waiting for https://github.com/vuejs/core/issues/7833
+AddEtapeAslDocumentPopup.props = ['close', 'apiClient', 'initialDocument']
diff --git a/packages/ui/src/components/etape/add-etape-dae-document-popup.stories.tsx b/packages/ui/src/components/etape/add-etape-dae-document-popup.stories.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..a669ec78a250f3884263d4d4d1f37580663777a9
--- /dev/null
+++ b/packages/ui/src/components/etape/add-etape-dae-document-popup.stories.tsx
@@ -0,0 +1,61 @@
+import { Meta, StoryFn } from '@storybook/vue3'
+import { action } from '@storybook/addon-actions'
+import { tempDocumentNameValidator } from 'camino-common/src/document'
+import { ApiClient } from '@/api/api-client'
+import { AddEtapeDaeDocumentPopup } from './add-etape-dae-document-popup'
+import { toCaminoDate } from 'camino-common/src/date'
+import { etapeDocumentIdValidator } from 'camino-common/src/etape'
+
+const meta: Meta = {
+  title: 'Components/Etape/Document/AjoutDocumentPourDae',
+  // @ts-ignore
+  component: AddEtapeDaeDocumentPopup,
+}
+export default meta
+
+const close = action('close')
+const uploadTempDocumentAction = action('uploadTempDocument')
+
+const apiClient: Pick<ApiClient, 'uploadTempDocument'> = {
+  uploadTempDocument: (...params) => {
+    uploadTempDocumentAction(params)
+
+    return Promise.resolve(tempDocumentNameValidator.parse(new Date().toISOString()))
+  },
+}
+
+export const SansDocumentInitial: StoryFn = () => <AddEtapeDaeDocumentPopup close={close} apiClient={apiClient} initialDocument={null} />
+
+export const DocumentInitialTemporaire: StoryFn = () => (
+  <AddEtapeDaeDocumentPopup
+    close={close}
+    initialDocument={{
+      description: 'description',
+      entreprises_lecture: true,
+      public_lecture: false,
+      etape_document_type_id: 'arp',
+      temp_document_name: tempDocumentNameValidator.parse('value'),
+      arrete_prefectoral: 'toto',
+      date: toCaminoDate('2023-01-02'),
+      etape_statut_id: 'exe',
+    }}
+    apiClient={apiClient}
+  />
+)
+
+export const DocumentInitialDejaSauvegarde: StoryFn = () => (
+  <AddEtapeDaeDocumentPopup
+    close={close}
+    initialDocument={{
+      description: 'description',
+      entreprises_lecture: true,
+      public_lecture: false,
+      etape_document_type_id: 'arp',
+      id: etapeDocumentIdValidator.parse('documentId'),
+      arrete_prefectoral: 'toto',
+      date: toCaminoDate('2023-01-02'),
+      etape_statut_id: 'req',
+    }}
+    apiClient={apiClient}
+  />
+)
diff --git a/packages/ui/src/components/etape/add-etape-dae-document-popup.stories_snapshots_DocumentInitialDejaSauvegarde.html b/packages/ui/src/components/etape/add-etape-dae-document-popup.stories_snapshots_DocumentInitialDejaSauvegarde.html
new file mode 100644
index 0000000000000000000000000000000000000000..696816d3c71fbda767fd052325af5eb17b5c9c6e
--- /dev/null
+++ b/packages/ui/src/components/etape/add-etape-dae-document-popup.stories_snapshots_DocumentInitialDejaSauvegarde.html
@@ -0,0 +1,66 @@
+<!--teleport start-->
+<div class="dsfr">
+  <dialog id="monId" class="fr-modal fr-modal--opened" open="" aria-modal="true" role="dialog" aria-labelledby="monId-title" style="z-index: 1000001;">
+    <div class="fr-container fr-container--fluid fr-container-md">
+      <div class="fr-grid-row fr-grid-row--center">
+        <div class="fr-col-12 fr-col-md-8 fr-col-lg-6">
+          <div class="fr-modal__body">
+            <div class="fr-modal__header"><button class="fr-btn--close fr-btn" aria-controls="monId" title="Fermer">Fermer</button></div>
+            <div class="fr-modal__content">
+              <h1 id="monId-title" class="fr-modal__title"><span class="fr-icon-arrow-right-line fr-icon--lg" aria-hidden="true"></span>Éditer 'Arrêté préfectoral' pour la décision de l'autorité environnementale</h1>
+              <div class="fr-container">
+                <form>
+                  <fieldset class="fr-fieldset" id="text">
+                    <div class="fr-fieldset__element">
+                      <div class="fr-upload-group"><label class="fr-label" for="file-upload">Ajouter un fichier<span class="fr-hint-text">Taille maximale : 100 Mo. Format<!----> supporté<!----> : pdf.</span></label><input class="fr-upload" type="file" id="file-upload" name="file-upload" accept=".pdf"></div>
+                    </div>
+                    <div class="fr-fieldset__element">
+                      <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_271">Date
+                          <!---->
+                          <!---->
+                        </label><input class="fr-input" name="input_271" id="input_271" type="date">
+                        <!---->
+                      </div>
+                    </div>
+                    <div class="fr-fieldset__element">
+                      <div class="fr-select-group"><label class="fr-label" for="select_670">Statut
+                          <!---->
+                        </label><select class="fr-select" id="select_670" aria-label="Statut" name="select_670">
+                          <option value="exe">exempté</option>
+                          <option value="req">requis</option>
+                          <option disabled="" hidden="" value="">Selectionnez une option</option>
+                        </select></div>
+                    </div>
+                    <div class="fr-fieldset__element">
+                      <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_74">Description
+                          <!---->
+                          <!---->
+                        </label><input class="fr-input" name="input_74" id="input_74" type="text">
+                        <!---->
+                      </div>
+                    </div>
+                    <div class="fr-fieldset__element">
+                      <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_878">Arrêté préféctoral
+                          <!---->
+                          <!---->
+                        </label><input class="fr-input" name="input_878" id="input_878" type="text">
+                        <!---->
+                      </div>
+                    </div>
+                  </fieldset>
+                </form>
+              </div>
+            </div>
+            <div class="fr-modal__footer">
+              <ul class="fr-btns-group fr-btns-group--right fr-btns-group--inline-reverse fr-btns-group--inline-lg fr-btns-group--icon-left">
+                <li><button class="fr-btn fr-icon-check-line fr-btn--icon-left">Enregistrer</button></li>
+                <li><button class="fr-btn fr-icon-arrow-go-back-fill fr-btn--icon-left fr-btn--secondary" aria-controls="monId">Annuler</button></li>
+              </ul>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </dialog>
+</div>
+<!--teleport end-->
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/add-etape-dae-document-popup.stories_snapshots_DocumentInitialTemporaire.html b/packages/ui/src/components/etape/add-etape-dae-document-popup.stories_snapshots_DocumentInitialTemporaire.html
new file mode 100644
index 0000000000000000000000000000000000000000..696816d3c71fbda767fd052325af5eb17b5c9c6e
--- /dev/null
+++ b/packages/ui/src/components/etape/add-etape-dae-document-popup.stories_snapshots_DocumentInitialTemporaire.html
@@ -0,0 +1,66 @@
+<!--teleport start-->
+<div class="dsfr">
+  <dialog id="monId" class="fr-modal fr-modal--opened" open="" aria-modal="true" role="dialog" aria-labelledby="monId-title" style="z-index: 1000001;">
+    <div class="fr-container fr-container--fluid fr-container-md">
+      <div class="fr-grid-row fr-grid-row--center">
+        <div class="fr-col-12 fr-col-md-8 fr-col-lg-6">
+          <div class="fr-modal__body">
+            <div class="fr-modal__header"><button class="fr-btn--close fr-btn" aria-controls="monId" title="Fermer">Fermer</button></div>
+            <div class="fr-modal__content">
+              <h1 id="monId-title" class="fr-modal__title"><span class="fr-icon-arrow-right-line fr-icon--lg" aria-hidden="true"></span>Éditer 'Arrêté préfectoral' pour la décision de l'autorité environnementale</h1>
+              <div class="fr-container">
+                <form>
+                  <fieldset class="fr-fieldset" id="text">
+                    <div class="fr-fieldset__element">
+                      <div class="fr-upload-group"><label class="fr-label" for="file-upload">Ajouter un fichier<span class="fr-hint-text">Taille maximale : 100 Mo. Format<!----> supporté<!----> : pdf.</span></label><input class="fr-upload" type="file" id="file-upload" name="file-upload" accept=".pdf"></div>
+                    </div>
+                    <div class="fr-fieldset__element">
+                      <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_271">Date
+                          <!---->
+                          <!---->
+                        </label><input class="fr-input" name="input_271" id="input_271" type="date">
+                        <!---->
+                      </div>
+                    </div>
+                    <div class="fr-fieldset__element">
+                      <div class="fr-select-group"><label class="fr-label" for="select_670">Statut
+                          <!---->
+                        </label><select class="fr-select" id="select_670" aria-label="Statut" name="select_670">
+                          <option value="exe">exempté</option>
+                          <option value="req">requis</option>
+                          <option disabled="" hidden="" value="">Selectionnez une option</option>
+                        </select></div>
+                    </div>
+                    <div class="fr-fieldset__element">
+                      <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_74">Description
+                          <!---->
+                          <!---->
+                        </label><input class="fr-input" name="input_74" id="input_74" type="text">
+                        <!---->
+                      </div>
+                    </div>
+                    <div class="fr-fieldset__element">
+                      <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_878">Arrêté préféctoral
+                          <!---->
+                          <!---->
+                        </label><input class="fr-input" name="input_878" id="input_878" type="text">
+                        <!---->
+                      </div>
+                    </div>
+                  </fieldset>
+                </form>
+              </div>
+            </div>
+            <div class="fr-modal__footer">
+              <ul class="fr-btns-group fr-btns-group--right fr-btns-group--inline-reverse fr-btns-group--inline-lg fr-btns-group--icon-left">
+                <li><button class="fr-btn fr-icon-check-line fr-btn--icon-left">Enregistrer</button></li>
+                <li><button class="fr-btn fr-icon-arrow-go-back-fill fr-btn--icon-left fr-btn--secondary" aria-controls="monId">Annuler</button></li>
+              </ul>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </dialog>
+</div>
+<!--teleport end-->
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/add-etape-dae-document-popup.stories_snapshots_SansDocumentInitial.html b/packages/ui/src/components/etape/add-etape-dae-document-popup.stories_snapshots_SansDocumentInitial.html
new file mode 100644
index 0000000000000000000000000000000000000000..6c2febfa46baaa5cdbdf8e400fb0121d4e907095
--- /dev/null
+++ b/packages/ui/src/components/etape/add-etape-dae-document-popup.stories_snapshots_SansDocumentInitial.html
@@ -0,0 +1,66 @@
+<!--teleport start-->
+<div class="dsfr">
+  <dialog id="monId" class="fr-modal fr-modal--opened" open="" aria-modal="true" role="dialog" aria-labelledby="monId-title" style="z-index: 1000001;">
+    <div class="fr-container fr-container--fluid fr-container-md">
+      <div class="fr-grid-row fr-grid-row--center">
+        <div class="fr-col-12 fr-col-md-8 fr-col-lg-6">
+          <div class="fr-modal__body">
+            <div class="fr-modal__header"><button class="fr-btn--close fr-btn" aria-controls="monId" title="Fermer">Fermer</button></div>
+            <div class="fr-modal__content">
+              <h1 id="monId-title" class="fr-modal__title"><span class="fr-icon-arrow-right-line fr-icon--lg" aria-hidden="true"></span>Ajouter 'Arrêté préfectoral' pour la décision de l'autorité environnementale</h1>
+              <div class="fr-container">
+                <form>
+                  <fieldset class="fr-fieldset" id="text">
+                    <div class="fr-fieldset__element">
+                      <div class="fr-upload-group"><label class="fr-label" for="file-upload">Ajouter un fichier<span class="fr-hint-text">Taille maximale : 100 Mo. Format<!----> supporté<!----> : pdf.</span></label><input class="fr-upload" type="file" id="file-upload" name="file-upload" accept=".pdf"></div>
+                    </div>
+                    <div class="fr-fieldset__element">
+                      <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_271">Date
+                          <!---->
+                          <!---->
+                        </label><input class="fr-input" name="input_271" id="input_271" type="date">
+                        <!---->
+                      </div>
+                    </div>
+                    <div class="fr-fieldset__element">
+                      <div class="fr-select-group"><label class="fr-label" for="select_670">Statut
+                          <!---->
+                        </label><select class="fr-select" id="select_670" aria-label="Statut" name="select_670">
+                          <option value="exe">exempté</option>
+                          <option value="req">requis</option>
+                          <option disabled="" hidden="" value="">Selectionnez une option</option>
+                        </select></div>
+                    </div>
+                    <div class="fr-fieldset__element">
+                      <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_74">Description
+                          <!---->
+                          <!---->
+                        </label><input class="fr-input" name="input_74" id="input_74" type="text">
+                        <!---->
+                      </div>
+                    </div>
+                    <div class="fr-fieldset__element">
+                      <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_878">Arrêté préféctoral
+                          <!---->
+                          <!---->
+                        </label><input class="fr-input" name="input_878" id="input_878" type="text">
+                        <!---->
+                      </div>
+                    </div>
+                  </fieldset>
+                </form>
+              </div>
+            </div>
+            <div class="fr-modal__footer">
+              <ul class="fr-btns-group fr-btns-group--right fr-btns-group--inline-reverse fr-btns-group--inline-lg fr-btns-group--icon-left">
+                <li><button class="fr-btn fr-icon-check-line fr-btn--icon-left disabled" disabled="">Enregistrer</button></li>
+                <li><button class="fr-btn fr-icon-arrow-go-back-fill fr-btn--icon-left fr-btn--secondary" aria-controls="monId">Annuler</button></li>
+              </ul>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </dialog>
+</div>
+<!--teleport end-->
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/add-etape-dae-document-popup.tsx b/packages/ui/src/components/etape/add-etape-dae-document-popup.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..210a824a9e61fa65f7c03db959cc2e35a8163c8d
--- /dev/null
+++ b/packages/ui/src/components/etape/add-etape-dae-document-popup.tsx
@@ -0,0 +1,121 @@
+import { computed, defineComponent, ref } from 'vue'
+import { FunctionalPopup } from '../_ui/functional-popup'
+import { DocumentsTypes } from 'camino-common/src/static/documentsTypes'
+import { InputFile } from '../_ui/dsfr-input-file'
+import { ApiClient } from '@/api/api-client'
+import { TempDocumentName } from 'camino-common/src/document'
+import { Nullable, isNonEmptyArray, isNotNullNorUndefined, map } from 'camino-common/src/typescript-tools'
+import { DsfrInput } from '../_ui/dsfr-input'
+import {
+  DocumentComplementaireDaeEtapeDocumentModification,
+  documentComplementaireDaeEtapeDocumentModificationValidator,
+  documentTypeIdComplementaireObligatoireDAE,
+  tempEtapeDocumentValidator,
+} from 'camino-common/src/etape'
+import { useState } from '@/utils/vue-tsx-utils'
+import { DsfrSelect } from '../_ui/dsfr-select'
+import { ETAPES_TYPES } from 'camino-common/src/static/etapesTypes'
+import { getEtapesStatuts } from 'camino-common/src/static/etapesTypesEtapesStatuts'
+
+interface Props {
+  close: (document: DocumentComplementaireDaeEtapeDocumentModification | null) => void
+  initialDocument: DocumentComplementaireDaeEtapeDocumentModification | null
+  apiClient: Pick<ApiClient, 'uploadTempDocument'>
+}
+
+export const AddEtapeDaeDocumentPopup = defineComponent<Props>(props => {
+  const etapeDocumentTypeId = documentTypeIdComplementaireObligatoireDAE
+  const etapeDocumentFile = ref<File | null>(null)
+  const documentDescription = ref<string>(props.initialDocument?.description ?? '')
+  const [documentDate, setDocumentDate] = useState(props.initialDocument?.date ?? null)
+  const [etapeStatutId, setEtapeStatutId] = useState(props.initialDocument?.etape_statut_id ?? null)
+  const [arretePrefectoral, setArretePrefectoral] = useState(props.initialDocument?.arrete_prefectoral ?? null)
+  const tempDocumentName = ref<TempDocumentName | undefined>(
+    isNotNullNorUndefined(props.initialDocument) && 'temp_document_name' in props.initialDocument ? props.initialDocument.temp_document_name : undefined
+  )
+
+  const descriptionChange = (value: string) => {
+    documentDescription.value = value
+  }
+
+  const etapeStatutItems = computed(() => {
+    const etapeStatus = getEtapesStatuts(ETAPES_TYPES.decisionDeLaMissionAutoriteEnvironnementale_ExamenAuCasParCasDuProjet_)
+    if (isNonEmptyArray(etapeStatus)) {
+      return map(etapeStatus, ({ id, nom }) => ({ id, label: nom }))
+    }
+    throw new Error('cas impossible')
+  })
+  const content = () => {
+    return (
+      <form>
+        <fieldset class="fr-fieldset" id="text">
+          <div class="fr-fieldset__element">
+            <InputFile
+              accept={['pdf']}
+              uploadFile={file => {
+                etapeDocumentFile.value = file
+              }}
+            />
+          </div>
+          <div class="fr-fieldset__element">
+            <DsfrInput legend={{ main: 'Date' }} type={{ type: 'date' }} initialValue={documentDate.value} valueChanged={setDocumentDate} />
+          </div>
+
+          <div class="fr-fieldset__element">
+            <DsfrSelect legend={{ main: 'Statut' }} items={etapeStatutItems.value} initialValue={etapeStatutId.value} valueChanged={setEtapeStatutId} />
+          </div>
+
+          <div class="fr-fieldset__element">
+            <DsfrInput legend={{ main: 'Description' }} initialValue={documentDescription.value} type={{ type: 'text' }} valueChanged={descriptionChange} />
+          </div>
+          <div class="fr-fieldset__element">
+            <DsfrInput legend={{ main: 'Arrêté préféctoral' }} initialValue={arretePrefectoral.value} type={{ type: 'text' }} valueChanged={setArretePrefectoral} />
+          </div>
+        </fieldset>
+      </form>
+    )
+  }
+
+  const tempDocument = computed<Nullable<Omit<DocumentComplementaireDaeEtapeDocumentModification, 'temp_document_name' | 'id'>>>(() => ({
+    etape_document_type_id: etapeDocumentTypeId,
+    description: documentDescription.value,
+    public_lecture: false,
+    entreprises_lecture: true,
+    date: documentDate.value,
+    etape_statut_id: etapeStatutId.value,
+    arrete_prefectoral: arretePrefectoral.value,
+  }))
+
+  const canSave = computed<boolean>(() => {
+    return tempEtapeDocumentValidator.omit({ temp_document_name: true }).safeParse(tempDocument.value).success && (etapeDocumentFile.value !== null || isNotNullNorUndefined(props.initialDocument))
+  })
+
+  return () => (
+    <FunctionalPopup
+      title={`${isNotNullNorUndefined(props.initialDocument) ? 'Éditer' : 'Ajouter'} '${DocumentsTypes[etapeDocumentTypeId].nom}' pour la décision de l'autorité environnementale`}
+      content={content}
+      close={() => {
+        props.close(null)
+      }}
+      validate={{
+        action: async () => {
+          if (etapeDocumentFile.value !== null) {
+            tempDocumentName.value = await props.apiClient.uploadTempDocument(etapeDocumentFile.value)
+          }
+          const value = { ...props.initialDocument, ...tempDocument.value, etape_document_type_id: etapeDocumentTypeId, temp_document_name: tempDocumentName.value }
+          const parsed = documentComplementaireDaeEtapeDocumentModificationValidator.safeParse(value)
+
+          if (parsed.success) {
+            props.close(parsed.data)
+          } else {
+            console.error(parsed.error)
+          }
+        },
+      }}
+      canValidate={canSave.value}
+    />
+  )
+})
+
+// @ts-ignore waiting for https://github.com/vuejs/core/issues/7833
+AddEtapeDaeDocumentPopup.props = ['close', 'apiClient', 'initialDocument']
diff --git a/packages/ui/src/components/etape/add-etape-document-popup.stories.tsx b/packages/ui/src/components/etape/add-etape-document-popup.stories.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..0eb04c2d3ec815770c9e1b9fd4b4de2855d8229b
--- /dev/null
+++ b/packages/ui/src/components/etape/add-etape-document-popup.stories.tsx
@@ -0,0 +1,45 @@
+import { Meta, StoryFn } from '@storybook/vue3'
+import { action } from '@storybook/addon-actions'
+import { tempDocumentNameValidator } from 'camino-common/src/document'
+import { AddEtapeDocumentPopup } from './add-etape-document-popup'
+import { ApiClient } from '@/api/api-client'
+import { testBlankUser } from 'camino-common/src/tests-utils'
+
+const meta: Meta = {
+  title: 'Components/Etape/Document/Ajout',
+  // @ts-ignore
+  component: AddEtapeDocumentPopup,
+}
+export default meta
+
+const close = action('close')
+const uploadTempDocumentAction = action('uploadTempDocument')
+
+const apiClient: Pick<ApiClient, 'uploadTempDocument'> = {
+  uploadTempDocument: (...params) => {
+    uploadTempDocumentAction(params)
+
+    return Promise.resolve(tempDocumentNameValidator.parse(new Date().toISOString()))
+  },
+}
+export const Default: StoryFn = () => (
+  <AddEtapeDocumentPopup close={close} documentTypeIds={['car', 'doe', 'jpa']} user={{ ...testBlankUser, role: 'admin', administrationId: 'aut-97300-01' }} apiClient={apiClient} />
+)
+
+export const Entreprise: StoryFn = () => (
+  <AddEtapeDocumentPopup close={close} documentTypeIds={['car', 'doe', 'jpa']} user={{ ...testBlankUser, role: 'entreprise', entreprises: [] }} apiClient={apiClient} />
+)
+
+export const UnSeulDocumentPossible: StoryFn = () => (
+  <AddEtapeDocumentPopup close={close} documentTypeIds={['car']} user={{ ...testBlankUser, role: 'entreprise', entreprises: [] }} apiClient={apiClient} />
+)
+
+export const DocumentInitial: StoryFn = () => (
+  <AddEtapeDocumentPopup
+    close={close}
+    documentTypeIds={['car']}
+    initialDocument={{ description: 'description', entreprises_lecture: true, public_lecture: false, etape_document_type_id: 'car', temp_document_name: tempDocumentNameValidator.parse('value') }}
+    user={{ ...testBlankUser, role: 'super' }}
+    apiClient={apiClient}
+  />
+)
diff --git a/packages/ui/src/components/etape/add-etape-document-popup.stories_snapshots_Default.html b/packages/ui/src/components/etape/add-etape-document-popup.stories_snapshots_Default.html
new file mode 100644
index 0000000000000000000000000000000000000000..02b2c6ccc8ab23e435f16cd2fa80ad2c747cfafa
--- /dev/null
+++ b/packages/ui/src/components/etape/add-etape-document-popup.stories_snapshots_Default.html
@@ -0,0 +1,73 @@
+<!--teleport start-->
+<div class="dsfr">
+  <dialog id="monId" class="fr-modal fr-modal--opened" open="" aria-modal="true" role="dialog" aria-labelledby="monId-title" style="z-index: 1000001;">
+    <div class="fr-container fr-container--fluid fr-container-md">
+      <div class="fr-grid-row fr-grid-row--center">
+        <div class="fr-col-12 fr-col-md-8 fr-col-lg-6">
+          <div class="fr-modal__body">
+            <div class="fr-modal__header"><button class="fr-btn--close fr-btn" aria-controls="monId" title="Fermer">Fermer</button></div>
+            <div class="fr-modal__content">
+              <h1 id="monId-title" class="fr-modal__title"><span class="fr-icon-arrow-right-line fr-icon--lg" aria-hidden="true"></span>Ajout d'un document</h1>
+              <div class="fr-container">
+                <form>
+                  <fieldset class="fr-fieldset" id="text">
+                    <div class="fr-fieldset__element">
+                      <div class="fr-select-group"><label class="fr-label" for="type">Type de document</label>
+                        <div id="typeahead_271_wrapper" class="_typeahead_8eddf1 dsfr">
+                          <div class="flex"><input id="typeahead_271" type="text" name="typeahead_271" class="_typeahead-input_8eddf1 fr-input" placeholder="" autocomplete="off"></div>
+                          <!---->
+                        </div>
+                      </div>
+                    </div>
+                  </fieldset>
+                  <fieldset class="fr-fieldset" id="text">
+                    <div class="fr-fieldset__element">
+                      <div class="fr-upload-group"><label class="fr-label" for="file-upload">Ajouter un fichier<span class="fr-hint-text">Taille maximale : 100 Mo. Format<!----> supporté<!----> : pdf.</span></label><input class="fr-upload" type="file" id="file-upload" name="file-upload" accept=".pdf"></div>
+                    </div>
+                    <div class="fr-fieldset__element">
+                      <fieldset class="fr-fieldset" id="radio_670" aria-labelledby="radio_670-legend">
+                        <legend class="fr-fieldset__legend--regular fr-fieldset__legend" id="radio_670-legend">Visibilité
+                          <!---->
+                        </legend>
+                        <div class="fr-fieldset__element">
+                          <div class="fr-radio-group"><input type="radio" id="radio_670-0" name="radio_670"><label class="fr-label" for="radio_670-0">Visible seulement par les administrations
+                              <!---->
+                            </label></div>
+                        </div>
+                        <div class="fr-fieldset__element">
+                          <div class="fr-radio-group"><input type="radio" id="radio_670-1" name="radio_670"><label class="fr-label" for="radio_670-1">Visible seulement par les entreprises titulaires
+                              <!---->
+                            </label></div>
+                        </div>
+                        <div class="fr-fieldset__element">
+                          <div class="fr-radio-group"><input type="radio" id="radio_670-2" name="radio_670"><label class="fr-label" for="radio_670-2">Public
+                              <!---->
+                            </label></div>
+                        </div>
+                      </fieldset>
+                    </div>
+                    <div class="fr-fieldset__element">
+                      <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_74">Description
+                          <!---->
+                          <!---->
+                        </label><input class="fr-input" name="input_74" id="input_74" type="text">
+                        <!---->
+                      </div>
+                    </div>
+                  </fieldset>
+                </form>
+              </div>
+            </div>
+            <div class="fr-modal__footer">
+              <ul class="fr-btns-group fr-btns-group--right fr-btns-group--inline-reverse fr-btns-group--inline-lg fr-btns-group--icon-left">
+                <li><button class="fr-btn fr-icon-check-line fr-btn--icon-left disabled" disabled="">Enregistrer</button></li>
+                <li><button class="fr-btn fr-icon-arrow-go-back-fill fr-btn--icon-left fr-btn--secondary" aria-controls="monId">Annuler</button></li>
+              </ul>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </dialog>
+</div>
+<!--teleport end-->
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/add-etape-document-popup.stories_snapshots_DocumentInitial.html b/packages/ui/src/components/etape/add-etape-document-popup.stories_snapshots_DocumentInitial.html
new file mode 100644
index 0000000000000000000000000000000000000000..d46abac6853c62166bc077a3a65c8a81686b66af
--- /dev/null
+++ b/packages/ui/src/components/etape/add-etape-document-popup.stories_snapshots_DocumentInitial.html
@@ -0,0 +1,64 @@
+<!--teleport start-->
+<div class="dsfr">
+  <dialog id="monId" class="fr-modal fr-modal--opened" open="" aria-modal="true" role="dialog" aria-labelledby="monId-title" style="z-index: 1000001;">
+    <div class="fr-container fr-container--fluid fr-container-md">
+      <div class="fr-grid-row fr-grid-row--center">
+        <div class="fr-col-12 fr-col-md-8 fr-col-lg-6">
+          <div class="fr-modal__body">
+            <div class="fr-modal__header"><button class="fr-btn--close fr-btn" aria-controls="monId" title="Fermer">Fermer</button></div>
+            <div class="fr-modal__content">
+              <h1 id="monId-title" class="fr-modal__title"><span class="fr-icon-arrow-right-line fr-icon--lg" aria-hidden="true"></span>Éditer Documents cartographiques</h1>
+              <div class="fr-container">
+                <form>
+                  <!---->
+                  <fieldset class="fr-fieldset" id="text">
+                    <div class="fr-fieldset__element">
+                      <div class="fr-upload-group"><label class="fr-label" for="file-upload">Ajouter un fichier<span class="fr-hint-text">Taille maximale : 100 Mo. Format<!----> supporté<!----> : pdf.</span></label><input class="fr-upload" type="file" id="file-upload" name="file-upload" accept=".pdf"></div>
+                    </div>
+                    <div class="fr-fieldset__element">
+                      <fieldset class="fr-fieldset" id="radio_271" aria-labelledby="radio_271-legend">
+                        <legend class="fr-fieldset__legend--regular fr-fieldset__legend" id="radio_271-legend">Visibilité
+                          <!---->
+                        </legend>
+                        <div class="fr-fieldset__element">
+                          <div class="fr-radio-group"><input type="radio" id="radio_271-0" name="radio_271"><label class="fr-label" for="radio_271-0">Visible seulement par les administrations
+                              <!---->
+                            </label></div>
+                        </div>
+                        <div class="fr-fieldset__element">
+                          <div class="fr-radio-group"><input type="radio" id="radio_271-1" name="radio_271"><label class="fr-label" for="radio_271-1">Visible seulement par les entreprises titulaires
+                              <!---->
+                            </label></div>
+                        </div>
+                        <div class="fr-fieldset__element">
+                          <div class="fr-radio-group"><input type="radio" id="radio_271-2" name="radio_271"><label class="fr-label" for="radio_271-2">Public
+                              <!---->
+                            </label></div>
+                        </div>
+                      </fieldset>
+                    </div>
+                    <div class="fr-fieldset__element">
+                      <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_670">Description
+                          <!---->
+                          <!---->
+                        </label><input class="fr-input" name="input_670" id="input_670" type="text">
+                        <!---->
+                      </div>
+                    </div>
+                  </fieldset>
+                </form>
+              </div>
+            </div>
+            <div class="fr-modal__footer">
+              <ul class="fr-btns-group fr-btns-group--right fr-btns-group--inline-reverse fr-btns-group--inline-lg fr-btns-group--icon-left">
+                <li><button class="fr-btn fr-icon-check-line fr-btn--icon-left">Enregistrer</button></li>
+                <li><button class="fr-btn fr-icon-arrow-go-back-fill fr-btn--icon-left fr-btn--secondary" aria-controls="monId">Annuler</button></li>
+              </ul>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </dialog>
+</div>
+<!--teleport end-->
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/add-etape-document-popup.stories_snapshots_Entreprise.html b/packages/ui/src/components/etape/add-etape-document-popup.stories_snapshots_Entreprise.html
new file mode 100644
index 0000000000000000000000000000000000000000..0b81c6c1e2b048878d762b3a8ca9bca8c133c561
--- /dev/null
+++ b/packages/ui/src/components/etape/add-etape-document-popup.stories_snapshots_Entreprise.html
@@ -0,0 +1,68 @@
+<!--teleport start-->
+<div class="dsfr">
+  <dialog id="monId" class="fr-modal fr-modal--opened" open="" aria-modal="true" role="dialog" aria-labelledby="monId-title" style="z-index: 1000001;">
+    <div class="fr-container fr-container--fluid fr-container-md">
+      <div class="fr-grid-row fr-grid-row--center">
+        <div class="fr-col-12 fr-col-md-8 fr-col-lg-6">
+          <div class="fr-modal__body">
+            <div class="fr-modal__header"><button class="fr-btn--close fr-btn" aria-controls="monId" title="Fermer">Fermer</button></div>
+            <div class="fr-modal__content">
+              <h1 id="monId-title" class="fr-modal__title"><span class="fr-icon-arrow-right-line fr-icon--lg" aria-hidden="true"></span>Ajout d'un document</h1>
+              <div class="fr-container">
+                <form>
+                  <fieldset class="fr-fieldset" id="text">
+                    <div class="fr-fieldset__element">
+                      <div class="fr-select-group"><label class="fr-label" for="type">Type de document</label>
+                        <div id="typeahead_271_wrapper" class="_typeahead_8eddf1 dsfr">
+                          <div class="flex"><input id="typeahead_271" type="text" name="typeahead_271" class="_typeahead-input_8eddf1 fr-input" placeholder="" autocomplete="off"></div>
+                          <!---->
+                        </div>
+                      </div>
+                    </div>
+                  </fieldset>
+                  <fieldset class="fr-fieldset" id="text">
+                    <div class="fr-fieldset__element">
+                      <div class="fr-upload-group"><label class="fr-label" for="file-upload">Ajouter un fichier<span class="fr-hint-text">Taille maximale : 100 Mo. Format<!----> supporté<!----> : pdf.</span></label><input class="fr-upload" type="file" id="file-upload" name="file-upload" accept=".pdf"></div>
+                    </div>
+                    <div class="fr-fieldset__element">
+                      <fieldset class="fr-fieldset" id="radio_670" aria-labelledby="radio_670-legend">
+                        <legend class="fr-fieldset__legend--regular fr-fieldset__legend" id="radio_670-legend">Visibilité
+                          <!---->
+                        </legend>
+                        <div class="fr-fieldset__element">
+                          <div class="fr-radio-group"><input type="radio" id="radio_670-0" name="radio_670"><label class="fr-label" for="radio_670-0">Visible seulement par les entreprises titulaires
+                              <!---->
+                            </label></div>
+                        </div>
+                        <div class="fr-fieldset__element">
+                          <div class="fr-radio-group"><input type="radio" id="radio_670-1" name="radio_670"><label class="fr-label" for="radio_670-1">Public
+                              <!---->
+                            </label></div>
+                        </div>
+                      </fieldset>
+                    </div>
+                    <div class="fr-fieldset__element">
+                      <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_74">Description
+                          <!---->
+                          <!---->
+                        </label><input class="fr-input" name="input_74" id="input_74" type="text">
+                        <!---->
+                      </div>
+                    </div>
+                  </fieldset>
+                </form>
+              </div>
+            </div>
+            <div class="fr-modal__footer">
+              <ul class="fr-btns-group fr-btns-group--right fr-btns-group--inline-reverse fr-btns-group--inline-lg fr-btns-group--icon-left">
+                <li><button class="fr-btn fr-icon-check-line fr-btn--icon-left disabled" disabled="">Enregistrer</button></li>
+                <li><button class="fr-btn fr-icon-arrow-go-back-fill fr-btn--icon-left fr-btn--secondary" aria-controls="monId">Annuler</button></li>
+              </ul>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </dialog>
+</div>
+<!--teleport end-->
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/add-etape-document-popup.stories_snapshots_UnSeulDocumentPossible.html b/packages/ui/src/components/etape/add-etape-document-popup.stories_snapshots_UnSeulDocumentPossible.html
new file mode 100644
index 0000000000000000000000000000000000000000..2cc57e938817191b8ee1eb1f6bccaf6e3c58adaa
--- /dev/null
+++ b/packages/ui/src/components/etape/add-etape-document-popup.stories_snapshots_UnSeulDocumentPossible.html
@@ -0,0 +1,59 @@
+<!--teleport start-->
+<div class="dsfr">
+  <dialog id="monId" class="fr-modal fr-modal--opened" open="" aria-modal="true" role="dialog" aria-labelledby="monId-title" style="z-index: 1000001;">
+    <div class="fr-container fr-container--fluid fr-container-md">
+      <div class="fr-grid-row fr-grid-row--center">
+        <div class="fr-col-12 fr-col-md-8 fr-col-lg-6">
+          <div class="fr-modal__body">
+            <div class="fr-modal__header"><button class="fr-btn--close fr-btn" aria-controls="monId" title="Fermer">Fermer</button></div>
+            <div class="fr-modal__content">
+              <h1 id="monId-title" class="fr-modal__title"><span class="fr-icon-arrow-right-line fr-icon--lg" aria-hidden="true"></span>Ajouter Documents cartographiques</h1>
+              <div class="fr-container">
+                <form>
+                  <!---->
+                  <fieldset class="fr-fieldset" id="text">
+                    <div class="fr-fieldset__element">
+                      <div class="fr-upload-group"><label class="fr-label" for="file-upload">Ajouter un fichier<span class="fr-hint-text">Taille maximale : 100 Mo. Format<!----> supporté<!----> : pdf.</span></label><input class="fr-upload" type="file" id="file-upload" name="file-upload" accept=".pdf"></div>
+                    </div>
+                    <div class="fr-fieldset__element">
+                      <fieldset class="fr-fieldset" id="radio_271" aria-labelledby="radio_271-legend">
+                        <legend class="fr-fieldset__legend--regular fr-fieldset__legend" id="radio_271-legend">Visibilité
+                          <!---->
+                        </legend>
+                        <div class="fr-fieldset__element">
+                          <div class="fr-radio-group"><input type="radio" id="radio_271-0" name="radio_271"><label class="fr-label" for="radio_271-0">Visible seulement par les entreprises titulaires
+                              <!---->
+                            </label></div>
+                        </div>
+                        <div class="fr-fieldset__element">
+                          <div class="fr-radio-group"><input type="radio" id="radio_271-1" name="radio_271"><label class="fr-label" for="radio_271-1">Public
+                              <!---->
+                            </label></div>
+                        </div>
+                      </fieldset>
+                    </div>
+                    <div class="fr-fieldset__element">
+                      <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_670">Description
+                          <!---->
+                          <!---->
+                        </label><input class="fr-input" name="input_670" id="input_670" type="text">
+                        <!---->
+                      </div>
+                    </div>
+                  </fieldset>
+                </form>
+              </div>
+            </div>
+            <div class="fr-modal__footer">
+              <ul class="fr-btns-group fr-btns-group--right fr-btns-group--inline-reverse fr-btns-group--inline-lg fr-btns-group--icon-left">
+                <li><button class="fr-btn fr-icon-check-line fr-btn--icon-left disabled" disabled="">Enregistrer</button></li>
+                <li><button class="fr-btn fr-icon-arrow-go-back-fill fr-btn--icon-left fr-btn--secondary" aria-controls="monId">Annuler</button></li>
+              </ul>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </dialog>
+</div>
+<!--teleport end-->
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/add-etape-document-popup.tsx b/packages/ui/src/components/etape/add-etape-document-popup.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..b4de694330718b4857a4168cb131de66fa3c0518
--- /dev/null
+++ b/packages/ui/src/components/etape/add-etape-document-popup.tsx
@@ -0,0 +1,136 @@
+import { computed, defineComponent, ref } from 'vue'
+import { FunctionalPopup } from '../_ui/functional-popup'
+import { DocumentTypeId, DocumentsTypes } from 'camino-common/src/static/documentsTypes'
+import { InputFile } from '../_ui/dsfr-input-file'
+import { ApiClient } from '@/api/api-client'
+import { TempDocumentName } from 'camino-common/src/document'
+import { NonEmptyArray, Nullable, isNotNullNorUndefined } from 'camino-common/src/typescript-tools'
+import { DsfrInput } from '../_ui/dsfr-input'
+import { EtapeDocumentModification, TempEtapeDocument, etapeDocumentModificationValidator, tempEtapeDocumentValidator } from 'camino-common/src/etape'
+import { DsfrInputRadio } from '../_ui/dsfr-input-radio'
+import { VisibilityLabel } from './etape-documents'
+import { isEntrepriseOrBureauDEtude, User } from 'camino-common/src/roles'
+import { DocumentTypeTypeahead } from '../_common/document-type-typeahead'
+
+interface Props {
+  close: (document: EtapeDocumentModification | null) => void
+  documentTypeIds: NonEmptyArray<DocumentTypeId>
+  initialDocument?: EtapeDocumentModification
+  apiClient: Pick<ApiClient, 'uploadTempDocument'>
+  user: User
+}
+
+type DocumentVisibility = (typeof visibility)[number]
+
+const visibility = ['administrations', 'entreprises', 'public'] as const
+
+export const AddEtapeDocumentPopup = defineComponent<Props>(props => {
+  const etapeDocumentTypeId = ref<DocumentTypeId | null>(props.documentTypeIds.length === 1 ? props.documentTypeIds[0] : null)
+  const etapeDocumentFile = ref<File | null>(null)
+  const documentDescription = ref<string>(props.initialDocument?.description ?? '')
+  const tempDocumentName = ref<TempDocumentName | undefined>(
+    isNotNullNorUndefined(props.initialDocument) && 'temp_document_name' in props.initialDocument ? props.initialDocument.temp_document_name : undefined
+  )
+
+  const etapeDocumentVisibility = ref<DocumentVisibility | null>(
+    isNotNullNorUndefined(props.initialDocument) ? (props.initialDocument.public_lecture ? 'public' : props.initialDocument.entreprises_lecture ? 'entreprises' : 'administrations') : null
+  )
+
+  const descriptionChange = (value: string) => {
+    documentDescription.value = value
+  }
+
+  const visibilityChange = (value: DocumentVisibility) => {
+    etapeDocumentVisibility.value = value
+  }
+
+  const visibilityChoices = computed<{ itemId: DocumentVisibility; legend: { main: string } }[]>(() => {
+    return visibility
+      .filter(visibility => {
+        if (isEntrepriseOrBureauDEtude(props.user) && visibility === 'administrations') {
+          return false
+        }
+
+        return true
+      })
+      .map(visibility => ({ itemId: visibility, legend: { main: VisibilityLabel[visibility] } }))
+  })
+  const updateDocumentTypeId = (documentTypeId: DocumentTypeId | null) => {
+    etapeDocumentTypeId.value = documentTypeId
+  }
+  const content = () => (
+    <form>
+      {props.documentTypeIds.length === 1 ? null : (
+        <fieldset class="fr-fieldset" id="text">
+          <div class="fr-fieldset__element">
+            <div class="fr-select-group">
+              <label class="fr-label" for="type">
+                Type de document
+              </label>
+              <DocumentTypeTypeahead documentTypeIds={props.documentTypeIds} documentTypeIdSelected={updateDocumentTypeId} />
+            </div>
+          </div>
+        </fieldset>
+      )}
+
+      <fieldset class="fr-fieldset" id="text">
+        <div class="fr-fieldset__element">
+          <InputFile
+            accept={['pdf']}
+            uploadFile={file => {
+              etapeDocumentFile.value = file
+            }}
+          />
+        </div>
+
+        <div class="fr-fieldset__element">
+          <DsfrInputRadio legend={{ main: 'Visibilité' }} elements={visibilityChoices.value} initialValue={etapeDocumentVisibility.value} valueChanged={visibilityChange} />
+        </div>
+        <div class="fr-fieldset__element">
+          <DsfrInput legend={{ main: 'Description' }} initialValue={documentDescription.value} type={{ type: 'text' }} valueChanged={descriptionChange} />
+        </div>
+      </fieldset>
+    </form>
+  )
+
+  const tempDocument = computed<Nullable<Omit<TempEtapeDocument, 'temp_document_name'>>>(() => ({
+    etape_document_type_id: etapeDocumentTypeId.value,
+    description: documentDescription.value,
+    public_lecture: etapeDocumentVisibility.value !== null ? etapeDocumentVisibility.value === 'public' : null,
+    entreprises_lecture: etapeDocumentVisibility.value !== null ? etapeDocumentVisibility.value !== 'administrations' : null,
+  }))
+
+  const canSave = computed<boolean>(() => {
+    return tempEtapeDocumentValidator.omit({ temp_document_name: true }).safeParse(tempDocument.value).success && (etapeDocumentFile.value !== null || isNotNullNorUndefined(props.initialDocument))
+  })
+
+  return () => (
+    <FunctionalPopup
+      title={props.documentTypeIds.length === 1 ? `${isNotNullNorUndefined(props.initialDocument) ? 'Éditer' : 'Ajouter'} ${DocumentsTypes[props.documentTypeIds[0]].nom}` : "Ajout d'un document"}
+      content={content}
+      close={() => {
+        props.close(null)
+      }}
+      validate={{
+        action: async () => {
+          if (etapeDocumentFile.value !== null) {
+            tempDocumentName.value = await props.apiClient.uploadTempDocument(etapeDocumentFile.value)
+          }
+          const value = { ...props.initialDocument, ...tempDocument.value, temp_document_name: tempDocumentName.value }
+
+          const parsed = etapeDocumentModificationValidator.safeParse(value)
+
+          if (parsed.success) {
+            props.close(parsed.data)
+          } else {
+            console.error(parsed.error)
+          }
+        },
+      }}
+      canValidate={canSave.value}
+    />
+  )
+})
+
+// @ts-ignore waiting for https://github.com/vuejs/core/issues/7833
+AddEtapeDocumentPopup.props = ['close', 'apiClient', 'documentTypeIds', 'user', 'initialDocument']
diff --git a/packages/ui/src/components/etape/autocomplete-entreprise.stories.tsx b/packages/ui/src/components/etape/autocomplete-entreprise.stories.tsx
index 63644c247358b14eb457c847fa932683e8d39523..4640ecd92cfdec504a5b9c4a97c76fd3ce80d44d 100644
--- a/packages/ui/src/components/etape/autocomplete-entreprise.stories.tsx
+++ b/packages/ui/src/components/etape/autocomplete-entreprise.stories.tsx
@@ -12,12 +12,12 @@ export default meta
 
 const onEntreprisesUpdate = action('onEntreprisesUpdate')
 export const Default: StoryFn = () => (
-  <AutocompleteEntreprise placeholder="placeholder" allEntities={[{ id: newEntrepriseId('optionId1'), nom: 'optionNom1', legal_siren: null }]} onEntreprisesUpdate={onEntreprisesUpdate} />
+  <AutocompleteEntreprise name="titulaires" allEntities={[{ id: newEntrepriseId('optionId1'), nom: 'optionNom1', legal_siren: null }]} onEntreprisesUpdate={onEntreprisesUpdate} />
 )
 
 export const WithEntitiesAlreadyPresent: StoryFn = () => (
   <AutocompleteEntreprise
-    placeholder="placeholder"
+    name="amodiataires"
     allEntities={[
       { id: newEntrepriseId('optionId1'), nom: 'optionNom1', legal_siren: null },
       { id: newEntrepriseId('optionId2'), nom: 'optionNom2', legal_siren: null },
diff --git a/packages/ui/src/components/etape/autocomplete-entreprise.stories_snapshots_Default.html b/packages/ui/src/components/etape/autocomplete-entreprise.stories_snapshots_Default.html
index bd6cbbb8d710c9f7e961fdb56736676cae63e284..5b76f941a9e332afa25dcf7d742a925c80ecc626 100644
--- a/packages/ui/src/components/etape/autocomplete-entreprise.stories_snapshots_Default.html
+++ b/packages/ui/src/components/etape/autocomplete-entreprise.stories_snapshots_Default.html
@@ -1,6 +1,4 @@
-<div>
-  <div id="autocomplete_entreprise_wrapper" class="_typeahead_8eddf1 dsfr">
-    <div class="flex"><input id="autocomplete_entreprise" type="text" name="autocomplete_entreprise" class="_typeahead-input_8eddf1 fr-input" placeholder="placeholder" autocomplete="off"></div>
-    <!---->
-  </div>
+<div id="filters_autocomplete_titulaires_wrapper" class="_typeahead_8eddf1 dsfr">
+  <div style="display: flex; max-height: unset; flex-wrap: wrap; gap: 8px; outline-offset: 2px; outline-width: 2px; outline-color: rgb(10, 118, 246);" class="fr-input _fake-input_8eddf1"><input id="filters_autocomplete_titulaires" type="text" name="filters_autocomplete_titulaires" class="_typeahead-input_8eddf1" style="outline: none;" placeholder="titulaires" autocomplete="off"></div>
+  <!---->
 </div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/autocomplete-entreprise.stories_snapshots_WithEntitiesAlreadyPresent.html b/packages/ui/src/components/etape/autocomplete-entreprise.stories_snapshots_WithEntitiesAlreadyPresent.html
index 227b0264f3ff41562ac7ffdcf5ab3109af1dd65c..c6d3a9c614bd0567767e9e27e0a850dd303fa690 100644
--- a/packages/ui/src/components/etape/autocomplete-entreprise.stories_snapshots_WithEntitiesAlreadyPresent.html
+++ b/packages/ui/src/components/etape/autocomplete-entreprise.stories_snapshots_WithEntitiesAlreadyPresent.html
@@ -1,20 +1,4 @@
-<div>
-  <div>
-    <div class="flex mb-s flex-center">
-      <div class="h4" style="flex: 0 1 15em;">optionNom10</div><label style="flex-basis: auto; user-select: none;"><input type="checkbox" class="mr-xs">Opérateur</label><button title="Supprime l’entreprise" aria-label="Supprime l’entreprise" class="btn py-s px-m rnd-xs"><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
-          <use href="#icon-minus"></use>
-        </svg></button>
-    </div>
-  </div>
-  <div>
-    <div class="flex mb-s flex-center">
-      <div class="h4" style="flex: 0 1 15em;">optionNom2</div><label style="flex-basis: auto; user-select: none;"><input type="checkbox" class="mr-xs">Opérateur</label><button title="Supprime l’entreprise" aria-label="Supprime l’entreprise" class="btn py-s px-m rnd-xs"><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
-          <use href="#icon-minus"></use>
-        </svg></button>
-    </div>
-  </div>
-  <div id="autocomplete_entreprise_wrapper" class="_typeahead_8eddf1 dsfr">
-    <div class="flex"><input id="autocomplete_entreprise" type="text" name="autocomplete_entreprise" class="_typeahead-input_8eddf1 fr-input" placeholder="placeholder" autocomplete="off"></div>
-    <!---->
-  </div>
+<div id="filters_autocomplete_amodiataires_wrapper" class="_typeahead_8eddf1 dsfr">
+  <div style="display: flex; max-height: unset; flex-wrap: wrap; gap: 8px; outline-offset: 2px; outline-width: 2px; outline-color: rgb(10, 118, 246);" class="fr-input _fake-input_8eddf1"><button class="fr-tag fr-tag--sm fr-tag--dismiss" title="optionNom10">optionNom10</button><button class="fr-tag fr-tag--sm fr-tag--dismiss" title="optionNom2">optionNom2</button><input id="filters_autocomplete_amodiataires" type="text" name="filters_autocomplete_amodiataires" class="_typeahead-input_8eddf1" style="outline: none;" placeholder="amodiataires" autocomplete="off"></div>
+  <!---->
 </div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/autocomplete-entreprise.tsx b/packages/ui/src/components/etape/autocomplete-entreprise.tsx
index a115dbd8b65bf778f18c8dca4a2cb2c5c99d9257..dbe6d63b1c2373a0693c04d885b2025410e1cbba 100644
--- a/packages/ui/src/components/etape/autocomplete-entreprise.tsx
+++ b/packages/ui/src/components/etape/autocomplete-entreprise.tsx
@@ -1,92 +1,53 @@
-import { caminoDefineComponent } from '@/utils/vue-tsx-utils'
-import { computed, ref, watch } from 'vue'
+import { caminoDefineComponent, useState } from '@/utils/vue-tsx-utils'
+import { DeepReadonly, computed, watch } from 'vue'
 import { EtapeEntreprise } from 'camino-common/src/etape'
 import { EntrepriseId, Entreprise } from 'camino-common/src/entreprise'
-import { ButtonIcon } from '../_ui/button-icon'
-import { TypeAheadSingle } from '../_ui/typeahead-single'
-import { isNullOrUndefinedOrEmpty } from 'camino-common/src/typescript-tools'
+import { isNullOrUndefinedOrEmpty, stringArrayEquals } from 'camino-common/src/typescript-tools'
+import { TypeAheadSmartMultiple } from '../_ui/typeahead-smart-multiple'
 
 interface Props {
-  nonSelectableEntities?: EntrepriseId[]
-  selectedEntities?: EtapeEntreprise[]
-  allEntities: Entreprise[]
-  placeholder: string
-  onEntreprisesUpdate: (entreprise: EtapeEntreprise[]) => void
+  nonSelectableEntities?: DeepReadonly<EntrepriseId[]>
+  selectedEntities?: DeepReadonly<EtapeEntreprise[]>
+  allEntities: DeepReadonly<Entreprise[]>
+  name: 'titulaires' | 'amodiataires'
+  onEntreprisesUpdate: (entreprise: DeepReadonly<EtapeEntreprise[]>) => void
 }
-export const AutocompleteEntreprise = caminoDefineComponent<Props>(['onEntreprisesUpdate', 'nonSelectableEntities', 'selectedEntities', 'allEntities', 'placeholder'], props => {
-  const overrideItem = ref<{ id: EntrepriseId } | null>(null)
-
-  const mySelectedEntities = ref<EtapeEntreprise[]>([])
-  const inputValue = ref<string>('')
+export const AutocompleteEntreprise = caminoDefineComponent<Props>(['onEntreprisesUpdate', 'nonSelectableEntities', 'selectedEntities', 'allEntities', 'name'], props => {
+  const [mySelectedEntities, setMySelectedEntities] = useState<DeepReadonly<EtapeEntreprise[]>>(props.selectedEntities ?? [])
 
   watch(
     () => props.selectedEntities,
-    entities => {
-      mySelectedEntities.value = entities?.map(entity => ({ ...entity })) ?? []
-    },
-    { immediate: true, deep: true }
-  )
-
-  const selectableEntities = computed(() =>
-    props.allEntities
-      .filter(entity => isNullOrUndefinedOrEmpty(props.nonSelectableEntities) || !props.nonSelectableEntities.some(id => id === entity.id))
-      .filter(entity => !mySelectedEntities.value.some(mySelectedEntitiy => mySelectedEntitiy.id === entity.id))
-      .filter(entity => inputValue.value === '' || entity.nom.toLowerCase().includes(inputValue.value.toLowerCase()))
+    (newEntities, oldEntities) => {
+      if (!stringArrayEquals(newEntities?.map(({ id }) => id) ?? [], oldEntities?.map(({ id }) => id) ?? [])) {
+        setMySelectedEntities(newEntities?.map(entity => ({ ...entity })) ?? [])
+      }
+    }
   )
-
-  const addEntity = (entity: Entreprise | undefined) => {
-    if (entity) {
-      mySelectedEntities.value.push({ id: entity.id, operateur: false })
-      overrideItem.value = null
-
+  watch(
+    () => mySelectedEntities.value,
+    () => {
       props.onEntreprisesUpdate(mySelectedEntities.value)
     }
-  }
+  )
 
-  const removeEntity = (entity: EtapeEntreprise) => {
-    mySelectedEntities.value = mySelectedEntities.value.filter(e => e.id !== entity.id)
-    props.onEntreprisesUpdate(mySelectedEntities.value)
-  }
+  const selectableEntities = computed(() => {
+    return props.allEntities.filter(entity => isNullOrUndefinedOrEmpty(props.nonSelectableEntities) || !props.nonSelectableEntities.some(id => id === entity.id))
+  })
 
-  const toggleOperator = (entity: EtapeEntreprise) => {
-    entity.operateur = !entity.operateur
-    props.onEntreprisesUpdate(mySelectedEntities.value)
+  const onSelectEntreprises = (entreprises: { id: EntrepriseId }[]) => {
+    // TODO 2024-04-22 virer opérateur
+    setMySelectedEntities(entreprises.map(entity => ({ ...entity, operateur: false })) ?? [])
   }
 
-  const getEntrepriseNom = (entity: EtapeEntreprise) => props.allEntities.find(({ id }) => id === entity.id)?.nom ?? ''
-
-  const itemKey: keyof Entreprise = 'id'
-  const typeAheadProps = computed(() => ({
-    id: 'autocomplete_entreprise',
-    itemKey,
-    placeholder: props.placeholder,
-    items: selectableEntities.value,
-    minInputLength: 2,
-    itemChipLabel: (item: Entreprise) => item.nom,
-    onSelectItem: addEntity,
-    onInput: (event: string) => (inputValue.value = event),
-  }))
-
   return () => (
-    <div>
-      {mySelectedEntities.value.map(entity => (
-        <div key={entity.id}>
-          <div class="flex mb-s flex-center">
-            <div class="h4" style="flex: 0 1 15em">
-              {getEntrepriseNom(entity)}
-            </div>
-
-            <label style="flex: auto; user-select: none">
-              <input checked={entity.operateur} type="checkbox" class="mr-xs" onChange={() => toggleOperator(entity)} />
-              Opérateur
-            </label>
-
-            <ButtonIcon class="btn py-s px-m rnd-xs" style="" onClick={() => removeEntity(entity)} icon="minus" title="Supprime l’entreprise" />
-          </div>
-        </div>
-      ))}
-
-      <TypeAheadSingle props={typeAheadProps.value} overrideItem={overrideItem.value} />
-    </div>
+    <TypeAheadSmartMultiple
+      filter={{
+        name: props.name,
+        value: mySelectedEntities.value.map(({ id }) => id),
+        elements: selectableEntities.value,
+        lazy: false,
+      }}
+      onSelectItems={onSelectEntreprises}
+    />
   )
 })
diff --git a/packages/ui/src/components/etape/date-edit.tsx b/packages/ui/src/components/etape/date-edit.tsx
deleted file mode 100644
index 19acaa078a31af0341918422d8c40aa76384a7ba..0000000000000000000000000000000000000000
--- a/packages/ui/src/components/etape/date-edit.tsx
+++ /dev/null
@@ -1,21 +0,0 @@
-import { CaminoDate } from 'camino-common/src/date'
-import { FunctionalComponent } from 'vue'
-import { InputDate } from '../_ui/input-date'
-
-type Props = {
-  date?: CaminoDate
-  onDateChanged: (date: CaminoDate | null) => void
-}
-
-export const DateEdit: FunctionalComponent<Props> = props => {
-  return (
-    <div class="tablet-blobs">
-      <div class="tablet-blob-1-3 tablet-pt-s pb-s">
-        <h5>Date</h5>
-      </div>
-      <div class="tablet-blob-2-3">
-        <InputDate dateChanged={props.onDateChanged} initialValue={props.date} class="mb-s" />
-      </div>
-    </div>
-  )
-}
diff --git a/packages/ui/src/components/etape/date-type-edit.stories.tsx b/packages/ui/src/components/etape/date-type-edit.stories.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..42c1c834385b4e7ac22ae16067c91e66e0827471
--- /dev/null
+++ b/packages/ui/src/components/etape/date-type-edit.stories.tsx
@@ -0,0 +1,61 @@
+import { Meta, StoryFn } from '@storybook/vue3'
+import { DateTypeEdit, Props } from './date-type-edit'
+import { action } from '@storybook/addon-actions'
+import { CaminoDate, toCaminoDate } from 'camino-common/src/date'
+import { DemarcheId, demarcheIdValidator } from 'camino-common/src/demarche'
+import { EtapeId } from 'camino-common/src/etape'
+
+const meta: Meta = {
+  title: 'Components/Etape/DateTypeEdit',
+  component: DateTypeEdit,
+  decorators: [() => ({ template: '<div class="dsfr"><story/></div>' })],
+}
+export default meta
+
+const completeUpdate = action('completeUpdate')
+const getEtapesTypesEtapesStatutsAction = action('getEtapesTypesEtapesStatuts')
+const apiClient: Props['apiClient'] = {
+  getEtapesTypesEtapesStatuts(demarcheId: DemarcheId, titreEtapeId: EtapeId | null, date: CaminoDate) {
+    getEtapesTypesEtapesStatutsAction(demarcheId, titreEtapeId, date)
+
+    return Promise.resolve([
+      { etapeTypeId: 'mfr', etapeStatutId: 'fai', mainStep: true },
+      { etapeTypeId: 'mfr', etapeStatutId: 'aco', mainStep: true },
+      { etapeTypeId: 'mdp', etapeStatutId: 'fai', mainStep: true },
+    ])
+  },
+}
+
+const demarcheId = demarcheIdValidator.parse('demarche-id')
+export const Default: StoryFn = () => (
+  <DateTypeEdit apiClient={apiClient} demarcheId={demarcheId} etape={{ date: toCaminoDate('2023-01-01'), id: null, statutId: null, typeId: null }} completeUpdate={completeUpdate} />
+)
+export const WithTypeId: StoryFn = () => (
+  <DateTypeEdit apiClient={apiClient} demarcheId={demarcheId} etape={{ date: toCaminoDate('2023-01-01'), id: null, statutId: null, typeId: 'mfr' }} completeUpdate={completeUpdate} />
+)
+
+export const WithTypeIdAndStatutId: StoryFn = () => (
+  <DateTypeEdit apiClient={apiClient} demarcheId={demarcheId} etape={{ date: toCaminoDate('2023-01-01'), id: null, statutId: 'fai', typeId: 'mfr' }} completeUpdate={completeUpdate} />
+)
+
+export const EnConstruction: StoryFn = () => (
+  <DateTypeEdit apiClient={apiClient} demarcheId={demarcheId} etape={{ date: toCaminoDate('2023-01-01'), id: null, statutId: 'aco', typeId: 'mfr' }} completeUpdate={completeUpdate} />
+)
+
+export const Loading: StoryFn = () => (
+  <DateTypeEdit
+    apiClient={{ ...apiClient, getEtapesTypesEtapesStatuts: () => new Promise(() => ({})) }}
+    demarcheId={demarcheId}
+    etape={{ date: toCaminoDate('2023-01-01'), id: null, statutId: 'fai', typeId: 'mfr' }}
+    completeUpdate={completeUpdate}
+  />
+)
+
+export const WithError: StoryFn = () => (
+  <DateTypeEdit
+    apiClient={{ ...apiClient, getEtapesTypesEtapesStatuts: () => Promise.reject(new Error('Une erreur est survenue')) }}
+    demarcheId={demarcheId}
+    etape={{ date: toCaminoDate('2023-01-01'), id: null, statutId: 'fai', typeId: 'mfr' }}
+    completeUpdate={completeUpdate}
+  />
+)
diff --git a/packages/ui/src/components/etape/date-type-edit.stories_snapshots_Default.html b/packages/ui/src/components/etape/date-type-edit.stories_snapshots_Default.html
new file mode 100644
index 0000000000000000000000000000000000000000..ccbaa143dd405cdf6b501eaab6a2ed100ecd6fe6
--- /dev/null
+++ b/packages/ui/src/components/etape/date-type-edit.stories_snapshots_Default.html
@@ -0,0 +1,21 @@
+<div class="dsfr">
+  <div class="fr-grid-row">
+    <div class="fr-col-12 fr-col-xl-6">
+      <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_271">Date
+          <!---->
+          <!---->
+        </label><input class="fr-input" name="input_271" id="input_271" type="date">
+        <!---->
+      </div>
+      <div class="fr-mt-2w">
+        <div class="fr-input-group"><label class="fr-label fr-mb-1w" for="select-etape-type">Type *</label>
+          <div id="select-etape-type_wrapper" class="_typeahead_8eddf1 dsfr">
+            <div class="flex"><input id="select-etape-type" type="text" name="select-etape-type" class="_typeahead-input_8eddf1 fr-input" placeholder="" autocomplete="off"></div>
+            <!---->
+          </div>
+        </div>
+        <!---->
+      </div>
+    </div>
+  </div>
+</div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/date-type-edit.stories_snapshots_EnConstruction.html b/packages/ui/src/components/etape/date-type-edit.stories_snapshots_EnConstruction.html
new file mode 100644
index 0000000000000000000000000000000000000000..81bbe7b2afed53191b1c6b6bbe1e4544abfe5a5e
--- /dev/null
+++ b/packages/ui/src/components/etape/date-type-edit.stories_snapshots_EnConstruction.html
@@ -0,0 +1,21 @@
+<div class="dsfr">
+  <div class="fr-grid-row">
+    <div class="fr-col-12 fr-col-xl-6">
+      <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_271">Date
+          <!---->
+          <!---->
+        </label><input class="fr-input" name="input_271" id="input_271" type="date">
+        <!---->
+      </div>
+      <div class="fr-mt-2w">
+        <div class="fr-input-group"><label class="fr-label fr-mb-1w" for="select-etape-type">Type *</label>
+          <div id="select-etape-type_wrapper" class="_typeahead_8eddf1 dsfr">
+            <div class="flex"><input id="select-etape-type" type="text" name="select-etape-type" disabled="" class="_typeahead-input_8eddf1 fr-input" placeholder="" autocomplete="off"></div>
+            <!---->
+          </div>
+        </div>
+        <!---->
+      </div>
+    </div>
+  </div>
+</div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/date-type-edit.stories_snapshots_Loading.html b/packages/ui/src/components/etape/date-type-edit.stories_snapshots_Loading.html
new file mode 100644
index 0000000000000000000000000000000000000000..65c7cf6a241d41864d751c5d6c4768ad4863925f
--- /dev/null
+++ b/packages/ui/src/components/etape/date-type-edit.stories_snapshots_Loading.html
@@ -0,0 +1,16 @@
+<div class="dsfr">
+  <div class="fr-grid-row">
+    <div class="fr-col-12 fr-col-xl-6">
+      <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_271">Date
+          <!---->
+          <!---->
+        </label><input class="fr-input" name="input_271" id="input_271" type="date">
+        <!---->
+      </div>
+      <div class="_top-level_3306d0 fr-mt-2w" style="display: flex; justify-content: center;">
+        <!---->
+        <div class="_spinner_3306d0"></div>
+      </div>
+    </div>
+  </div>
+</div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/date-type-edit.stories_snapshots_WithError.html b/packages/ui/src/components/etape/date-type-edit.stories_snapshots_WithError.html
new file mode 100644
index 0000000000000000000000000000000000000000..9d9b7fa66bfb33ecc7f9fc3df4ce544902833f0d
--- /dev/null
+++ b/packages/ui/src/components/etape/date-type-edit.stories_snapshots_WithError.html
@@ -0,0 +1,22 @@
+<div class="dsfr">
+  <div class="fr-grid-row">
+    <div class="fr-col-12 fr-col-xl-6">
+      <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_271">Date
+          <!---->
+          <!---->
+        </label><input class="fr-input" name="input_271" id="input_271" type="date">
+        <!---->
+      </div>
+      <div class=" fr-mt-2w" style="display: flex; justify-content: center;">
+        <div>
+          <div class="_tooltip_4f6ea8">
+            <h6 class="_tooltip-content_4f6ea8">Une erreur est survenue</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
+              <use href="#icon-error-warning"></use>
+            </svg>
+          </div>
+        </div>
+        <!---->
+      </div>
+    </div>
+  </div>
+</div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/date-type-edit.stories_snapshots_WithTypeId.html b/packages/ui/src/components/etape/date-type-edit.stories_snapshots_WithTypeId.html
new file mode 100644
index 0000000000000000000000000000000000000000..c744a27577e5080cb3387362bc7b699d0bcc5b86
--- /dev/null
+++ b/packages/ui/src/components/etape/date-type-edit.stories_snapshots_WithTypeId.html
@@ -0,0 +1,27 @@
+<div class="dsfr">
+  <div class="fr-grid-row">
+    <div class="fr-col-12 fr-col-xl-6">
+      <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_271">Date
+          <!---->
+          <!---->
+        </label><input class="fr-input" name="input_271" id="input_271" type="date">
+        <!---->
+      </div>
+      <div class="fr-mt-2w">
+        <div class="fr-input-group"><label class="fr-label fr-mb-1w" for="select-etape-type">Type *</label>
+          <div id="select-etape-type_wrapper" class="_typeahead_8eddf1 dsfr">
+            <div class="flex"><input id="select-etape-type" type="text" name="select-etape-type" disabled="" class="_typeahead-input_8eddf1 fr-input" placeholder="" autocomplete="off"></div>
+            <!---->
+          </div>
+        </div>
+        <div class="fr-select-group"><label class="fr-label" for="select-etape-statut-id">Statut *
+            <!---->
+          </label><select class="fr-select" id="select-etape-statut-id" aria-label="Statut" name="select-etape-statut-id">
+            <option value="fai">fait</option>
+            <option value="aco">en construction</option>
+            <option disabled="" hidden="" value="">Selectionnez une option</option>
+          </select></div>
+      </div>
+    </div>
+  </div>
+</div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/date-type-edit.stories_snapshots_WithTypeIdAndStatutId.html b/packages/ui/src/components/etape/date-type-edit.stories_snapshots_WithTypeIdAndStatutId.html
new file mode 100644
index 0000000000000000000000000000000000000000..b8e6dd809a9f1cf019f0af80f11710d296afa326
--- /dev/null
+++ b/packages/ui/src/components/etape/date-type-edit.stories_snapshots_WithTypeIdAndStatutId.html
@@ -0,0 +1,27 @@
+<div class="dsfr">
+  <div class="fr-grid-row">
+    <div class="fr-col-12 fr-col-xl-6">
+      <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_271">Date
+          <!---->
+          <!---->
+        </label><input class="fr-input" name="input_271" id="input_271" type="date">
+        <!---->
+      </div>
+      <div class="fr-mt-2w">
+        <div class="fr-input-group"><label class="fr-label fr-mb-1w" for="select-etape-type">Type *</label>
+          <div id="select-etape-type_wrapper" class="_typeahead_8eddf1 dsfr">
+            <div class="flex"><input id="select-etape-type" type="text" name="select-etape-type" disabled="" class="_typeahead-input_8eddf1 fr-input" placeholder="" autocomplete="off"></div>
+            <!---->
+          </div>
+        </div>
+        <div class="fr-select-group"><label class="fr-label" for="select-etape-statut-id">Statut *
+            <!---->
+          </label><select class="fr-select" id="select-etape-statut-id" aria-label="Statut" name="select-etape-statut-id">
+            <option disabled="" value="fai">fait</option>
+            <option value="aco">en construction</option>
+            <option disabled="" hidden="" value="">Selectionnez une option</option>
+          </select></div>
+      </div>
+    </div>
+  </div>
+</div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/date-type-edit.tsx b/packages/ui/src/components/etape/date-type-edit.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..9f410b4c52d41affe8b66f651ea956992522ce92
--- /dev/null
+++ b/packages/ui/src/components/etape/date-type-edit.tsx
@@ -0,0 +1,72 @@
+import { caminoDefineComponent, useState } from '@/utils/vue-tsx-utils'
+import { CaminoDate } from 'camino-common/src/date'
+import { EtapeId } from 'camino-common/src/etape'
+import { EtapeTypeId } from 'camino-common/src/static/etapesTypes'
+import { watch, DeepReadonly } from 'vue'
+import { isNotNullNorUndefined } from 'camino-common/src/typescript-tools'
+import { TypeEdit } from './type-edit'
+import { DemarcheId } from 'camino-common/src/demarche'
+import { ApiClient } from '../../api/api-client'
+import { EtapeStatutId } from 'camino-common/src/static/etapesStatuts'
+import { DsfrInput } from '../_ui/dsfr-input'
+import { User, isAdministrationAdmin, isAdministrationEditeur, isSuper } from 'camino-common/src/roles'
+
+export type EtapeDateTypeEdit = DeepReadonly<{
+  statutId: EtapeStatutId | null
+  typeId: EtapeTypeId | null
+  id: EtapeId | null
+  date: CaminoDate | null
+}>
+
+export interface Props {
+  etape: EtapeDateTypeEdit
+  demarcheId: DemarcheId
+  apiClient: Pick<ApiClient, 'getEtapesTypesEtapesStatuts'>
+  completeUpdate: (etape: Props['etape']) => void
+}
+
+export const dateTypeStepIsVisible = (user: User): boolean => {
+  return isSuper(user) || isAdministrationAdmin(user) || isAdministrationEditeur(user)
+}
+export const dateTypeStepIsComplete = (etape: EtapeDateTypeEdit, user: User): boolean => {
+  if (!dateTypeStepIsVisible(user)) {
+    return true
+  }
+
+  return isNotNullNorUndefined(etape.date) && isNotNullNorUndefined(etape.typeId) && isNotNullNorUndefined(etape.statutId)
+}
+
+export const DateTypeEdit = caminoDefineComponent<Props>(['etape', 'demarcheId', 'apiClient', 'completeUpdate'], props => {
+  const [date, setDate] = useState(props.etape.date)
+  const [typeStatut, setTypeStatut] = useState({ etapeTypeId: props.etape.typeId, etapeStatutId: props.etape.statutId })
+
+  watch(
+    () => [date.value, typeStatut.value],
+    () => {
+      props.completeUpdate({ id: props.etape.id, date: date.value, typeId: typeStatut.value.etapeTypeId, statutId: typeStatut.value.etapeStatutId })
+    }
+  )
+
+  const onDateChanged = (date: CaminoDate | null) => {
+    if (isNotNullNorUndefined(date)) {
+      setDate(date)
+    }
+  }
+
+  const onEtapeTypeChange = (etapeStatutId: EtapeStatutId | null, etapeTypeId: EtapeTypeId | null) => {
+    if (isNotNullNorUndefined(etapeTypeId) && isNotNullNorUndefined(etapeStatutId)) {
+      setTypeStatut({ etapeStatutId, etapeTypeId })
+    }
+  }
+
+  return () => (
+    <div class="fr-grid-row">
+      <div class="fr-col-12 fr-col-xl-6">
+        <DsfrInput type={{ type: 'date' }} valueChanged={onDateChanged} initialValue={props.etape.date} legend={{ main: 'Date' }} />
+        {isNotNullNorUndefined(date.value) ? (
+          <TypeEdit class="fr-mt-2w" etape={{ ...props.etape, date: date.value }} demarcheId={props.demarcheId} apiClient={props.apiClient} onEtapeChange={onEtapeTypeChange} />
+        ) : null}
+      </div>
+    </div>
+  )
+})
diff --git a/packages/ui/src/components/etape/decisions-annexes-edit.vue b/packages/ui/src/components/etape/decisions-annexes-edit.vue
deleted file mode 100644
index 382232b9a5e8b1e749b3c61fabd8e87b99d769c9..0000000000000000000000000000000000000000
--- a/packages/ui/src/components/etape/decisions-annexes-edit.vue
+++ /dev/null
@@ -1,21 +0,0 @@
-<template>
-  <SectionsEdit
-    :sections="etape.decisionsAnnexesSections"
-    :contenu="etape.decisionsAnnexesContenu"
-    @complete-update="$emit('complete-update', $event)"
-    @contenu-update="etape.decisionsAnnexesContenu = $event"
-  />
-</template>
-
-<script>
-import SectionsEdit from '../_common/sections-edit.vue'
-export default {
-  components: { SectionsEdit },
-
-  props: {
-    etape: { type: Object, required: true },
-  },
-
-  emits: ['complete-update'],
-}
-</script>
diff --git a/packages/ui/src/components/etape/depose-popup.vue b/packages/ui/src/components/etape/depose-popup.vue
deleted file mode 100644
index ab6a1e49123d06dea5da238da46ad05c5ea05904..0000000000000000000000000000000000000000
--- a/packages/ui/src/components/etape/depose-popup.vue
+++ /dev/null
@@ -1,20 +0,0 @@
-<template>
-  <CommonDeposePopup @on-depose="depose"></CommonDeposePopup>
-</template>
-
-<script setup lang="ts">
-import CommonDeposePopup from '../_common/depose-popup.vue'
-import { useStore } from 'vuex'
-
-const props = defineProps<{
-  etapeId: string
-  onDepotDone: () => void
-}>()
-
-const store = useStore()
-
-const depose = async () => {
-  await store.dispatch('titreEtape/depose', props.etapeId)
-  props.onDepotDone()
-}
-</script>
diff --git a/packages/ui/src/components/etape/edit.vue b/packages/ui/src/components/etape/edit.vue
deleted file mode 100644
index d165b783b272001d2e80d2a75078867688363cbc..0000000000000000000000000000000000000000
--- a/packages/ui/src/components/etape/edit.vue
+++ /dev/null
@@ -1,403 +0,0 @@
-<template>
-  <div class="mb">
-    <Bloc v-if="stepType" id="step-type" :step="stepType" :complete="typeComplete">
-      <DateEdit v-if="userIsAdmin" :date="etape.date" :onDateChanged="onDateChanged" />
-
-      <TypeEdit :etape="etape" :etapeDate="etape.date" :demarcheId="etape.titreDemarcheId" :apiClient="apiClient" :onEtapeChange="onEtapeTypeChange" />
-    </Bloc>
-
-    <Bloc v-if="stepFondamentales" id="step-fondamentales" :step="stepFondamentales" :complete="stepFondamentalesComplete">
-      <FondamentalesEdit
-        :etape="etape"
-        :demarcheTypeId="demarcheTypeId"
-        :titreTypeId="titreTypeId"
-        :user="user"
-        :entreprises="entreprises"
-        @update:etape="newValue => $emit('update:etape', newValue)"
-        @complete-update="fondamentalesCompleteUpdate"
-      />
-    </Bloc>
-
-    <Bloc v-if="stepPoints" id="step-points" :step="stepPoints" :complete="stepPerimetreComplete">
-      <PerimetreEdit
-        :etape="etape"
-        :titreTypeId="titreTypeId"
-        :titreSlug="titreSlug"
-        :apiClient="apiClient"
-        :onEtapeChange="onEtapePerimetreChange"
-        :onPointsChange="onEtapePointsChange"
-        :onForagesChange="onEtapeForagesChange"
-        :completeUpdate="perimetreCompleteUpdate"
-      />
-    </Bloc>
-
-    <Bloc v-if="stepSections" id="step-sections" :step="stepSections" :complete="stepSectionsComplete">
-      <SectionsEdit :etape="etape" :sections="sections" @update:etape="newValue => $emit('update:etape', newValue)" @complete-update="sectionsCompleteUpdate" @sections-update="sectionsUpdate" />
-    </Bloc>
-
-    <Bloc v-if="stepDocuments" id="step-documents" :step="stepDocuments" :complete="stepDocumentsComplete">
-      <DocumentsEdit
-        v-model:documents="etape.documents"
-        :addAction="{ name: 'titreEtapeEdition/documentAdd' }"
-        :removeAction="{ name: 'titreEtapeEdition/documentRemove' }"
-        :documentPopupTitle="documentPopupTitle"
-        :documentsTypes="documentsTypes"
-        :date="etape.date"
-        :user="user"
-        @complete-update="documentsCompleteUpdate"
-      />
-    </Bloc>
-
-    <Bloc v-if="stepEntrepriseDocuments" id="step-entrepriseDocuments" :step="stepEntrepriseDocuments" :complete="stepEntrepriseDocumentsComplete">
-      <EntrepriseDocumentsEdit :entreprises="titulairesAndAmodiataires" :apiClient="apiClient" :tde="tde" :etapeId="etape.id" :completeUpdate="entrepriseDocumentsCompleteUpdate" />
-    </Bloc>
-
-    <Bloc v-if="stepDecisionsAnnexes" id="step-decisionsAnnexes" :step="stepDecisionsAnnexes" :complete="stepDecisionsAnnexesComplete">
-      <DecisionsAnnexesEdit :etape="etape" @complete-update="decisionsAnnexesComplete = $event" />
-    </Bloc>
-
-    <div class="dsfr">
-      <div class="fr-input-group">
-        <label class="fr-label" for="notes">Notes</label>
-        <textarea id="notes" v-model="etape.notes" class="fr-input" name="notes"></textarea>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script>
-import { TypeEdit } from './type-edit'
-import { Bloc } from './bloc'
-import { DateEdit } from './date-edit'
-import { FondamentalesEdit } from './fondamentales-edit'
-import { PerimetreEdit } from './perimetre-edit'
-import SectionsEdit from './sections-edit.vue'
-import DocumentsEdit from '../document/multi-edit.vue'
-import { EntrepriseDocumentsEdit } from './entreprises-documents-edit'
-import DecisionsAnnexesEdit from './decisions-annexes-edit.vue'
-import { apiClient } from '../../api/api-client'
-import { getSections } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sections'
-import { EtapesTypes } from 'camino-common/src/static/etapesTypes'
-import { getEntrepriseDocuments } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/entrepriseDocuments'
-import { getDocuments } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/documents'
-import { isAdministrationAdmin, isAdministrationEditeur, isSuper } from 'camino-common/src/roles'
-
-export default {
-  components: {
-    DecisionsAnnexesEdit,
-    Bloc,
-    TypeEdit,
-    FondamentalesEdit,
-    PerimetreEdit,
-    SectionsEdit,
-    DocumentsEdit,
-    EntrepriseDocumentsEdit,
-    DateEdit,
-  },
-
-  props: {
-    etape: { type: Object, required: true },
-    demarcheTypeId: { type: String, required: true },
-    etapeType: { type: Object, default: null },
-    titreTypeId: { type: String, required: true },
-    titreSlug: { type: String, required: true },
-    user: { type: Object, required: true },
-    etapeIsDemandeEnConstruction: { type: Boolean, required: true },
-    documentPopupTitle: { type: String, required: true },
-  },
-
-  emits: ['complete-update', 'type-complete-update', 'change', 'update:etape', 'alertes-update'],
-
-  data() {
-    return {
-      fondamentalesComplete: false,
-      perimetreComplete: false,
-      sectionsComplete: false,
-      documentsComplete: false,
-      entrepriseDocumentsComplete: false,
-      decisionsAnnexesComplete: false,
-      entrepriseDocuments: false,
-      help: {},
-      apiClient,
-    }
-  },
-
-  computed: {
-    tde() {
-      return {
-        titreTypeId: this.titreTypeId,
-        demarcheTypeId: this.demarcheTypeId,
-        etapeTypeId: this.etapeType?.id,
-      }
-    },
-    documentsTypes() {
-      return this.$store.getters['titreEtapeEdition/documentsTypes']
-    },
-
-    entreprises() {
-      return this.$store.state.titreEtapeEdition.metas.entreprises
-    },
-
-    titulairesAndAmodiataires() {
-      const titulaireIds = this.etape.titulaires.map(({ id }) => id)
-      const amodiatairesIds = this.etape.amodiataires.map(({ id }) => id)
-
-      return this.entreprises.filter(({ id }) => titulaireIds.includes(id) || amodiatairesIds.includes(id))
-    },
-
-    heritageLoaded() {
-      return this.$store.state.titreEtapeEdition.heritageLoaded
-    },
-
-    typeComplete() {
-      if (!this.stepType) {
-        return true
-      }
-
-      if (!this.etape.date || !this.etape.typeId) {
-        return false
-      }
-
-      if (this.userIsAdmin && this.etapeIsDemandeEnConstruction) {
-        return true
-      }
-
-      return !!this.etape.statutId
-    },
-
-    complete() {
-      return (
-        this.typeComplete &&
-        this.stepFondamentalesComplete &&
-        this.stepPerimetreComplete &&
-        this.stepSectionsComplete &&
-        this.stepDocumentsComplete &&
-        this.stepEntrepriseDocumentsComplete &&
-        this.stepDecisionsAnnexesComplete
-      )
-    },
-
-    stepFondamentalesComplete() {
-      return !this.stepFondamentales || this.fondamentalesComplete
-    },
-
-    stepPerimetreComplete() {
-      return !this.stepFondamentales || this.perimetreComplete
-    },
-
-    stepSectionsComplete() {
-      return !this.stepSections || this.sectionsComplete
-    },
-
-    stepDocumentsComplete() {
-      return !this.stepDocuments || this.documentsComplete
-    },
-
-    stepEntrepriseDocumentsComplete() {
-      return !this.stepEntrepriseDocuments || this.entrepriseDocumentsComplete
-    },
-
-    stepDecisionsAnnexesComplete() {
-      return !this.stepDecisionsAnnexes || this.decisionsAnnexesComplete
-    },
-
-    steps() {
-      const steps = []
-
-      if (this.userIsAdmin) {
-        steps.push({
-          id: 'type',
-          name: 'Type',
-        })
-      }
-
-      if (this.heritageLoaded && this.etapeType?.fondamentale) {
-        steps.push({
-          id: 'fondamentales',
-          name: 'Propriétés',
-        })
-        steps.push({
-          id: 'points',
-          name: 'Périmètre',
-        })
-      }
-
-      if (this.heritageLoaded && this.sections?.length) {
-        steps.push({ id: 'sections', name: 'Propriétés spécifiques' })
-      }
-
-      const hasDocuments = this.etapeType?.id ? getDocuments(this.titreTypeId, this.demarcheTypeId, this.etapeType?.id).length > 0 : false
-
-      if (this.heritageLoaded && hasDocuments) {
-        steps.push({
-          id: 'documents',
-          name: `Documents liés à l’étape ${EtapesTypes[this.etape.typeId].nom}`,
-        })
-      }
-
-      const hasEntrepriseDocuments = this.etapeType?.id ? getEntrepriseDocuments(this.titreTypeId, this.demarcheTypeId, this.etapeType?.id).length > 0 : false
-
-      if (this.heritageLoaded && hasEntrepriseDocuments) {
-        steps.push({ id: 'entrepriseDocuments', name: 'Documents d’entreprise' })
-      }
-
-      if (this.etape.decisionsAnnexesSections) {
-        steps.push({ id: 'decisionsAnnexes', name: 'Décisions annexes' })
-      }
-
-      const titreTypeHelp = this.help[this.titreTypeId]
-      if (titreTypeHelp) {
-        steps.forEach(step => {
-          step.help = titreTypeHelp[step.id]
-        })
-      }
-
-      return steps
-    },
-
-    stepType() {
-      return this.steps.find(s => s.id === 'type')
-    },
-
-    stepFondamentales() {
-      return this.steps.find(s => s.id === 'fondamentales')
-    },
-
-    stepPoints() {
-      return this.steps.find(s => s.id === 'points')
-    },
-
-    stepSections() {
-      return this.steps.find(s => s.id === 'sections')
-    },
-
-    stepDocuments() {
-      return this.steps.find(s => s.id === 'documents')
-    },
-
-    stepEntrepriseDocuments() {
-      return this.steps.find(s => s.id === 'entrepriseDocuments')
-    },
-
-    stepDecisionsAnnexes() {
-      return this.steps.find(s => s.id === 'decisionsAnnexes')
-    },
-
-    userIsAdmin() {
-      return isSuper(this.user) || isAdministrationAdmin(this.user) || isAdministrationEditeur(this.user)
-    },
-
-    sections() {
-      try {
-        return getSections(this.titreTypeId, this.demarcheTypeId, this.etapeType.id)
-      } catch (e) {
-        return []
-      }
-    },
-  },
-
-  watch: {
-    complete: 'completeUpdate',
-
-    etape: {
-      handler: function () {
-        this.$emit('change')
-      },
-      deep: true,
-    },
-  },
-
-  created() {
-    this.$emit('type-complete-update', this.typeComplete)
-    this.completeUpdate()
-
-    if (this.etapeType?.id === 'mfr') {
-      this.help.arm = {
-        sections: 'Ce bloc permet de savoir si la prospection est mécanisée ou non et s’il y a des franchissements de cours d’eau (si oui, combien ?)',
-        documents: 'Toutes les pièces obligatoires, spécifiques à la demande, doivent être déposées dans cette rubrique en format pdf.',
-        entrepriseDocuments:
-          "Les documents d’entreprise sont des documents propres à l'entreprise, et pourront être réutilisés pour la création d'un autre dossier et mis à jour si nécessaire. Ces documents d’entreprise sont consultables dans la fiche entreprise de votre société. Cette section permet de protéger et de centraliser les informations d'ordre privé relatives à la société et à son personnel.",
-      }
-
-      this.help.axm = this.help.arm
-    }
-  },
-
-  methods: {
-    fondamentalesCompleteUpdate(complete) {
-      this.fondamentalesComplete = complete
-    },
-
-    perimetreCompleteUpdate(complete) {
-      this.perimetreComplete = complete
-    },
-
-    documentsCompleteUpdate(complete) {
-      this.documentsComplete = complete
-    },
-
-    entrepriseDocumentsCompleteUpdate(entrepriseDocumentIds, complete) {
-      this.etape.entrepriseDocumentIds = entrepriseDocumentIds
-      this.entrepriseDocumentsComplete = complete
-    },
-
-    sectionsCompleteUpdate(complete) {
-      this.sectionsComplete = complete
-    },
-
-    async sectionsUpdate() {
-      await this.$store.dispatch('titreEtapeEdition/documentInit', this.etape.documents)
-    },
-
-    completeUpdate() {
-      this.$emit('complete-update', this.complete)
-    },
-
-    onDateChanged(date) {
-      this.etape.date = date
-      this.$emit('update:etape', this.etape)
-    },
-
-    async onEtapeTypeChange(etapeStatutId, etapeTypeId) {
-      if (this.etape.typeId !== etapeTypeId) {
-        await this.$store.dispatch('titreEtapeEdition/heritageGet', {
-          ...this.tde,
-          etapeTypeId,
-        })
-      }
-      // TODO 2023-01-13 Il faut que les données soient mises après l'appel au store, sinon l'étape est réinitialisée.
-      // Pour que ça soit propre, il faut arrêter de bouger le même objet pour diverses raisons, et maintenir une étape minimaliste à part
-      this.etape.statutId = etapeStatutId
-      this.etape.typeId = etapeTypeId
-      this.$emit('type-complete-update', this.typeComplete)
-      this.$emit('update:etape', this.etape)
-    },
-
-    onEtapePerimetreChange(perimetreInfos) {
-      // TODO 2023-01-13 Il faut que les données soient mises après l'appel au store, sinon l'étape est réinitialisée.
-      // Pour que ça soit propre, il faut arrêter de bouger le même objet pour diverses raisons, et maintenir une étape minimaliste à part
-      this.etape.geojson4326Perimetre = perimetreInfos.geojson4326_perimetre
-      this.etape.geojson4326Points = perimetreInfos.geojson4326_points
-      this.etape.geojsonOriginePerimetre = perimetreInfos.geojson_origine_perimetre
-      this.etape.geojsonOriginePoints = perimetreInfos.geojson_origine_points
-      this.etape.geojsonOrigineGeoSystemeId = perimetreInfos.geojson_origine_geo_systeme_id
-
-      this.etape.geojson4326Forages = perimetreInfos.geojson4326_forages
-      this.etape.geojsonOrigineForages = perimetreInfos.geojson_origine_forages
-
-      this.$emit('alertes-update', { superposition_alertes: perimetreInfos.superposition_alertes, sdomZoneIds: perimetreInfos.sdomZoneIds })
-      this.$emit('update:etape', this.etape)
-    },
-    onEtapePointsChange(geojson4326Points, geojsonOriginePoints) {
-      this.etape.geojson4326Points = geojson4326Points
-      this.etape.geojsonOriginePoints = geojsonOriginePoints
-      this.$emit('update:etape', this.etape)
-    },
-    onEtapeForagesChange(geojson4326Forages, geojsonOrigineForages) {
-      this.etape.geojson4326Forages = geojson4326Forages
-      this.etape.geojsonOrigineForages = geojsonOrigineForages
-      this.$emit('update:etape', this.etape)
-    },
-  },
-}
-</script>
diff --git a/packages/ui/src/components/etape/entreprises-documents-edit.stories.tsx b/packages/ui/src/components/etape/entreprises-documents-edit.stories.tsx
index 765123a729069c41d4f451e7b49336b16fc2e59e..9678a0d9f30955437a5599db18fe24f48bbbc3c1 100644
--- a/packages/ui/src/components/etape/entreprises-documents-edit.stories.tsx
+++ b/packages/ui/src/components/etape/entreprises-documents-edit.stories.tsx
@@ -10,6 +10,7 @@ const meta: Meta = {
   title: 'Components/Etape/EditionEntreprisesDocuments',
   component: EntrepriseDocumentsEdit,
   argTypes: {},
+  decorators: [() => ({ template: '<div class="dsfr"><story/></div>' })],
 }
 export default meta
 
@@ -32,7 +33,7 @@ export const Loading: StoryFn = () => (
       getEtapeEntrepriseDocuments: etapeId => {
         getEtapeEntrepriseDocumentsAction(etapeId)
 
-        return Promise.resolve([])
+        return new Promise(() => ({}))
       },
       uploadTempDocument: document => {
         uploadTempDocumentAction(document)
@@ -447,3 +448,45 @@ export const AxmDeuxEntreprisesDocumentDEntrepriseComplet: StoryFn = () => (
     etapeId={etapeIdValidator.parse('etapeIdAgain')}
   />
 )
+
+export const ArmDocumentOptionnel: StoryFn = () => (
+  <EntrepriseDocumentsEdit
+    tde={{ titreTypeId: 'arm', demarcheTypeId: 'oct', etapeTypeId: 'mod' }}
+    apiClient={{
+      creerEntrepriseDocument: async (entrepriseId, entrepriseDocumentInput) => {
+        creerEntrepriseDocumentAction(entrepriseId, entrepriseDocumentInput)
+
+        return toEntrepriseDocumentId(toCaminoDate('2023-05-17'), 'arm', 'hash')
+      },
+      uploadTempDocument: document => {
+        uploadTempDocumentAction(document)
+
+        return Promise.resolve(tempDocumentNameValidator.parse(new Date().toISOString()))
+      },
+
+      getEntrepriseDocuments: async id => {
+        getEntrepriseDocumentsAction(id)
+        const entrepriseDocuments: EntrepriseDocument[] = [
+          {
+            id: toEntrepriseDocumentId(toCaminoDate('2023-06-23'), 'idm', 'uueoau'),
+            description: '',
+            date: toCaminoDate('2023-06-23'),
+            entreprise_document_type_id: 'idm',
+            can_delete_document: true,
+            entreprise_id: id,
+          },
+        ]
+
+        return entrepriseDocuments
+      },
+      getEtapeEntrepriseDocuments: etapeId => {
+        getEtapeEntrepriseDocumentsAction(etapeId)
+
+        return Promise.resolve([])
+      },
+    }}
+    entreprises={[{ id: newEntrepriseId('id'), nom: 'nom entreprise' }]}
+    completeUpdate={completeUpdateAction}
+    etapeId={etapeIdValidator.parse('hello')}
+  />
+)
diff --git a/packages/ui/src/components/etape/entreprises-documents-edit.stories_snapshots_ArmDocumentOptionnel.html b/packages/ui/src/components/etape/entreprises-documents-edit.stories_snapshots_ArmDocumentOptionnel.html
new file mode 100644
index 0000000000000000000000000000000000000000..3d72d8b2864a78c9939634feba922bcc40c2954d
--- /dev/null
+++ b/packages/ui/src/components/etape/entreprises-documents-edit.stories_snapshots_ArmDocumentOptionnel.html
@@ -0,0 +1,32 @@
+<div class="dsfr">
+  <div>
+    <div class="fr-table fr-mb-0">
+      <table style="display: table;">
+        <caption>nom entreprise</caption>
+        <thead>
+          <tr>
+            <th scope="col">Nom</th>
+            <th scope="col"></th>
+            <th scope="col" style="display: flex; justify-content: end;">Action</th>
+          </tr>
+        </thead>
+        <tbody>
+          <tr>
+            <td>
+              <div class="fr-select-group">
+                <!----><select class="fr-select" id="select_271" aria-label="Ajouter un nouveau type de document" name="select_271">
+                  <option value="atf">Attestation fiscale</option>
+                  <option value="jcf">Justificatif des capacités financières</option>
+                  <option disabled="" hidden="" value="">Selectionnez une option</option>
+                </select>
+              </div>
+            </td>
+            <td></td>
+            <td></td>
+          </tr>
+        </tbody>
+      </table>
+    </div>
+  </div>
+  <!---->
+</div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/entreprises-documents-edit.stories_snapshots_ArmUneEntrepriseAvecDocumentDEntrepriseComplet.html b/packages/ui/src/components/etape/entreprises-documents-edit.stories_snapshots_ArmUneEntrepriseAvecDocumentDEntrepriseComplet.html
index 6e0c31967f811bba4cc038616bfcca017630e3fa..a92193e694b3a686a16f4f9421e912d7732ce9a7 100644
--- a/packages/ui/src/components/etape/entreprises-documents-edit.stories_snapshots_ArmUneEntrepriseAvecDocumentDEntrepriseComplet.html
+++ b/packages/ui/src/components/etape/entreprises-documents-edit.stories_snapshots_ArmUneEntrepriseAvecDocumentDEntrepriseComplet.html
@@ -1,145 +1,172 @@
-<div>
-  <div class="mb-xs">
-    <div class="flex">
-      <h4>nom entreprise</h4>
-    </div>
-    <div>
-      <div class="tablet-blobs">
-        <div class="tablet-blob-1-3 flex flex-center"><a class="mt-s" href="/apiUrl/fichiers/2023-06-03-atf-ueoau" title="Télécharger le document Attestation fiscale - nouvelle fenêtre" target="_blank">Attestation fiscale</a><span><!----></span>
-          <!---->
-        </div>
-        <div class="tablet-blob-2-3">
-          <div class="flex mb-s"><select class="p-s">
-              <option disabled="" value="2023-06-03-atf-ueoau">Attestation fiscale : Attestation sur l'honneur (03-06-2023)</option>
-              <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
-            </select>
-            <div class="flex-right flex flex-center ml-s"><button title="Supprime le document d’entreprise" aria-label="Supprime le document d’entreprise" class="btn-border py-s px-m rnd-xs"><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
-                  <use href="#icon-delete"></use>
-                </svg></button></div>
-          </div>
-        </div>
-      </div>
-    </div>
-    <div>
-      <div class="tablet-blobs">
-        <div class="tablet-blob-1-3 flex flex-center"><a class="mt-s" href="/apiUrl/fichiers/2023-06-23-cur-ueoau" title="Télécharger le document Curriculum vitae - nouvelle fenêtre" target="_blank">Curriculum vitae</a><span><!----></span>
-          <!---->
-        </div>
-        <div class="tablet-blob-2-3">
-          <div class="flex mb-s"><select class="p-s">
-              <option disabled="" value="2023-06-23-cur-ueoau">Curriculum vitae : Jon. Doe (23-06-2023)</option>
-              <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
-            </select>
-            <div class="flex-right flex flex-center ml-s"><button title="Supprime le document d’entreprise" aria-label="Supprime le document d’entreprise" class="btn-border py-s px-m rnd-xs"><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
-                  <use href="#icon-delete"></use>
-                </svg></button></div>
-          </div>
-        </div>
-      </div>
-    </div>
-    <div>
-      <div class="tablet-blobs">
-        <div class="tablet-blob-1-3 flex flex-center"><a class="mt-s" href="/apiUrl/fichiers/2023-06-23-idm-ueoaue" title="Télécharger le document Identification de matériel - nouvelle fenêtre" target="_blank">Identification de matériel</a><span><!----></span>
-          <!---->
-        </div>
-        <div class="tablet-blob-2-3">
-          <div class="flex mb-s"><select class="p-s">
-              <option disabled="" value="2023-06-23-idm-ueoaue">Identification de matériel : Facture pelle (23-06-2023)</option>
-              <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
-            </select>
-            <div class="flex-right flex flex-center ml-s"><button title="Supprime le document d’entreprise" aria-label="Supprime le document d’entreprise" class="btn-border py-s px-m rnd-xs"><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
-                  <use href="#icon-delete"></use>
-                </svg></button></div>
-          </div>
-        </div>
-      </div>
-    </div>
-    <div>
-      <div class="tablet-blobs">
-        <div class="tablet-blob-1-3 flex flex-center"><a class="mt-s" href="/apiUrl/fichiers/2023-06-23-jid-eaoueo" title="Télécharger le document Justificatif d’identité - nouvelle fenêtre" target="_blank">Justificatif d’identité</a><span><!----></span>
-          <!---->
-        </div>
-        <div class="tablet-blob-2-3">
-          <div class="flex mb-s"><select class="p-s">
-              <option disabled="" value="2023-06-23-jid-eaoueo">Justificatif d’identité : Jon. Doe (23-06-2023)</option>
-              <option value="2023-06-23-jid-ueoau">Justificatif d’identité : Arm. Strong (23-06-2023)</option>
-              <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
-            </select>
-            <div class="flex-right flex flex-center ml-s"><button title="Supprime le document d’entreprise" aria-label="Supprime le document d’entreprise" class="btn-border py-s px-m rnd-xs"><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
-                  <use href="#icon-delete"></use>
-                </svg></button></div>
-          </div>
-        </div>
-      </div>
-    </div>
-    <div>
-      <div class="tablet-blobs">
-        <div class="tablet-blob-1-3 flex flex-center"><a class="mt-s" href="/apiUrl/fichiers/2023-06-23-jct-ueoau" title="Télécharger le document Justificatif des capacités techniques - nouvelle fenêtre" target="_blank">Justificatif des capacités techniques</a><span><!----></span>
-          <!---->
-        </div>
-        <div class="tablet-blob-2-3">
-          <div class="flex mb-s"><select class="p-s">
-              <option disabled="" value="2023-06-23-jct-ueoau">Justificatif des capacités techniques : (23-06-2023)</option>
-              <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
-            </select>
-            <div class="flex-right flex flex-center ml-s"><button title="Supprime le document d’entreprise" aria-label="Supprime le document d’entreprise" class="btn-border py-s px-m rnd-xs"><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
-                  <use href="#icon-delete"></use>
-                </svg></button></div>
-          </div>
-        </div>
-      </div>
-    </div>
-    <div>
-      <div class="tablet-blobs">
-        <div class="tablet-blob-1-3 flex flex-center"><a class="mt-s" href="/apiUrl/fichiers/2023-06-08-kbi-ueoau" title="Télécharger le document Kbis - nouvelle fenêtre" target="_blank">Kbis</a><span><!----></span>
-          <!---->
-        </div>
-        <div class="tablet-blob-2-3">
-          <div class="flex mb-s"><select class="p-s">
-              <option disabled="" value="2023-06-08-kbi-ueoau">Kbis : (08-06-2023)</option>
-              <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
-            </select>
-            <div class="flex-right flex flex-center ml-s"><button title="Supprime le document d’entreprise" aria-label="Supprime le document d’entreprise" class="btn-border py-s px-m rnd-xs"><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
-                  <use href="#icon-delete"></use>
-                </svg></button></div>
-          </div>
-        </div>
-      </div>
-    </div>
-    <div>
-      <div class="tablet-blobs">
-        <div class="tablet-blob-1-3 flex flex-center"><a class="mt-s" href="/apiUrl/fichiers/2023-06-23-jcf-uueoau" title="Télécharger le document Justificatif des capacités financières - nouvelle fenêtre" target="_blank">Justificatif des capacités financières</a><span><!----></span>
-          <!---->
-        </div>
-        <div class="tablet-blob-2-3">
-          <div class="flex mb-s"><select class="p-s">
-              <option disabled="" value="2023-06-23-jcf-uueoau">Justificatif des capacités financières : (23-06-2023)</option>
-              <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
-            </select>
-            <div class="flex-right flex flex-center ml-s"><button title="Supprime le document d’entreprise" aria-label="Supprime le document d’entreprise" class="btn-border py-s px-m rnd-xs"><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
-                  <use href="#icon-delete"></use>
-                </svg></button></div>
-          </div>
-        </div>
-      </div>
-    </div>
-    <div>
-      <div class="tablet-blobs">
-        <div class="tablet-blob-1-3">
-          <h5 class="mt-s">Ajouter un document d'entreprise existant</h5>
-        </div>
-        <div class="tablet-blob-2-3"><select class="p-s mb-s">
-            <option disabled="" value="undefined">Sélectionner un type de document d'entreprise</option>
-            <option value="atf">Attestation fiscale</option>
-            <option value="sir">Avis de situation au répertoire Sirene</option>
-            <option value="cur">Curriculum vitae</option>
-            <option value="idm">Identification de matériel</option>
-            <option value="jid">Justificatif d’identité</option>
-            <option value="jct">Justificatif des capacités techniques</option>
-            <option value="kbi">Kbis</option>
-            <option value="jcf">Justificatif des capacités financières</option>
-          </select></div>
-      </div>
+<div class="dsfr">
+  <div>
+    <div class="fr-table fr-mb-0">
+      <table style="display: table;">
+        <caption>nom entreprise</caption>
+        <thead>
+          <tr>
+            <th scope="col">Nom</th>
+            <th scope="col"></th>
+            <th scope="col" style="display: flex; justify-content: end;">Action</th>
+          </tr>
+        </thead>
+        <tbody>
+          <tr>
+            <td>
+              <div style="display: flex; flex-direction: column; align-items: start;"><a class="fr-link" title="Télécharger le document Attestation fiscale - nouvelle fenêtre" href="/apiUrl/download/entrepriseDocuments/2023-06-03-atf-ueoau" target="_blank">Attestation fiscale</a>
+                <!---->
+              </div>
+            </td>
+            <td>
+              <div class="fr-select-group">
+                <!----><select class="fr-select" id="select_271" aria-label="Choix du document pour [object Object]" name="select_271">
+                  <option disabled="" value="2023-06-03-atf-ueoau">Attestation fiscale : Attestation sur l'honneur (03-06-2023)</option>
+                  <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                  <option disabled="" hidden="" value="">Selectionnez une option</option>
+                </select>
+              </div>
+            </td>
+            <td style="text-align: right;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-delete-bin-line fr-ml-1w" title="Supprimer le document d’entreprise Attestation fiscale" aria-label="Supprimer le document d’entreprise Attestation fiscale" type="button">
+                <!---->
+              </button></td>
+          </tr>
+          <tr>
+            <td>
+              <div style="display: flex; flex-direction: column; align-items: start;"><a class="fr-link" title="Télécharger le document Curriculum vitae - nouvelle fenêtre" href="/apiUrl/download/entrepriseDocuments/2023-06-23-cur-ueoau" target="_blank">Curriculum vitae</a>
+                <!---->
+              </div>
+            </td>
+            <td>
+              <div class="fr-select-group">
+                <!----><select class="fr-select" id="select_670" aria-label="Choix du document pour [object Object]" name="select_670">
+                  <option disabled="" value="2023-06-23-cur-ueoau">Curriculum vitae : Jon. Doe (23-06-2023)</option>
+                  <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                  <option disabled="" hidden="" value="">Selectionnez une option</option>
+                </select>
+              </div>
+            </td>
+            <td style="text-align: right;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-delete-bin-line fr-ml-1w" title="Supprimer le document d’entreprise Curriculum vitae" aria-label="Supprimer le document d’entreprise Curriculum vitae" type="button">
+                <!---->
+              </button></td>
+          </tr>
+          <tr>
+            <td>
+              <div style="display: flex; flex-direction: column; align-items: start;"><a class="fr-link" title="Télécharger le document Identification de matériel - nouvelle fenêtre" href="/apiUrl/download/entrepriseDocuments/2023-06-23-idm-ueoaue" target="_blank">Identification de matériel</a>
+                <!---->
+              </div>
+            </td>
+            <td>
+              <div class="fr-select-group">
+                <!----><select class="fr-select" id="select_74" aria-label="Choix du document pour [object Object]" name="select_74">
+                  <option disabled="" value="2023-06-23-idm-ueoaue">Identification de matériel : Facture pelle (23-06-2023)</option>
+                  <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                  <option disabled="" hidden="" value="">Selectionnez une option</option>
+                </select>
+              </div>
+            </td>
+            <td style="text-align: right;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-delete-bin-line fr-ml-1w" title="Supprimer le document d’entreprise Identification de matériel" aria-label="Supprimer le document d’entreprise Identification de matériel" type="button">
+                <!---->
+              </button></td>
+          </tr>
+          <tr>
+            <td>
+              <div style="display: flex; flex-direction: column; align-items: start;"><a class="fr-link" title="Télécharger le document Justificatif d’identité - nouvelle fenêtre" href="/apiUrl/download/entrepriseDocuments/2023-06-23-jid-eaoueo" target="_blank">Justificatif d’identité</a>
+                <!---->
+              </div>
+            </td>
+            <td>
+              <div class="fr-select-group">
+                <!----><select class="fr-select" id="select_878" aria-label="Choix du document pour [object Object]" name="select_878">
+                  <option disabled="" value="2023-06-23-jid-eaoueo">Justificatif d’identité : Jon. Doe (23-06-2023)</option>
+                  <option value="2023-06-23-jid-ueoau">Justificatif d’identité : Arm. Strong (23-06-2023)</option>
+                  <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                  <option disabled="" hidden="" value="">Selectionnez une option</option>
+                </select>
+              </div>
+            </td>
+            <td style="text-align: right;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-delete-bin-line fr-ml-1w" title="Supprimer le document d’entreprise Justificatif d’identité" aria-label="Supprimer le document d’entreprise Justificatif d’identité" type="button">
+                <!---->
+              </button></td>
+          </tr>
+          <tr>
+            <td>
+              <div style="display: flex; flex-direction: column; align-items: start;"><a class="fr-link" title="Télécharger le document Justificatif des capacités techniques - nouvelle fenêtre" href="/apiUrl/download/entrepriseDocuments/2023-06-23-jct-ueoau" target="_blank">Justificatif des capacités techniques</a>
+                <!---->
+              </div>
+            </td>
+            <td>
+              <div class="fr-select-group">
+                <!----><select class="fr-select" id="select_967" aria-label="Choix du document pour [object Object]" name="select_967">
+                  <option disabled="" value="2023-06-23-jct-ueoau">Justificatif des capacités techniques : (23-06-2023)</option>
+                  <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                  <option disabled="" hidden="" value="">Selectionnez une option</option>
+                </select>
+              </div>
+            </td>
+            <td style="text-align: right;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-delete-bin-line fr-ml-1w" title="Supprimer le document d’entreprise Justificatif des capacités techniques" aria-label="Supprimer le document d’entreprise Justificatif des capacités techniques" type="button">
+                <!---->
+              </button></td>
+          </tr>
+          <tr>
+            <td>
+              <div style="display: flex; flex-direction: column; align-items: start;"><a class="fr-link" title="Télécharger le document Kbis - nouvelle fenêtre" href="/apiUrl/download/entrepriseDocuments/2023-06-08-kbi-ueoau" target="_blank">Kbis</a>
+                <!---->
+              </div>
+            </td>
+            <td>
+              <div class="fr-select-group">
+                <!----><select class="fr-select" id="select_25" aria-label="Choix du document pour [object Object]" name="select_25">
+                  <option disabled="" value="2023-06-08-kbi-ueoau">Kbis : (08-06-2023)</option>
+                  <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                  <option disabled="" hidden="" value="">Selectionnez une option</option>
+                </select>
+              </div>
+            </td>
+            <td style="text-align: right;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-delete-bin-line fr-ml-1w" title="Supprimer le document d’entreprise Kbis" aria-label="Supprimer le document d’entreprise Kbis" type="button">
+                <!---->
+              </button></td>
+          </tr>
+          <tr>
+            <td>
+              <div style="display: flex; flex-direction: column; align-items: start;"><a class="fr-link" title="Télécharger le document Justificatif des capacités financières - nouvelle fenêtre" href="/apiUrl/download/entrepriseDocuments/2023-06-23-jcf-uueoau" target="_blank">Justificatif des capacités financières</a>
+                <!---->
+              </div>
+            </td>
+            <td>
+              <div class="fr-select-group">
+                <!----><select class="fr-select" id="select_128" aria-label="Choix du document pour [object Object]" name="select_128">
+                  <option disabled="" value="2023-06-23-jcf-uueoau">Justificatif des capacités financières : (23-06-2023)</option>
+                  <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                  <option disabled="" hidden="" value="">Selectionnez une option</option>
+                </select>
+              </div>
+            </td>
+            <td style="text-align: right;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-delete-bin-line fr-ml-1w" title="Supprimer le document d’entreprise Justificatif des capacités financières" aria-label="Supprimer le document d’entreprise Justificatif des capacités financières" type="button">
+                <!---->
+              </button></td>
+          </tr>
+          <tr>
+            <td>
+              <div class="fr-select-group">
+                <!----><select class="fr-select" id="select_772" aria-label="Ajouter un nouveau type de document" name="select_772">
+                  <option value="atf">Attestation fiscale</option>
+                  <option value="sir">Avis de situation au répertoire Sirene</option>
+                  <option value="cur">Curriculum vitae</option>
+                  <option value="idm">Identification de matériel</option>
+                  <option value="jid">Justificatif d’identité</option>
+                  <option value="jct">Justificatif des capacités techniques</option>
+                  <option value="kbi">Kbis</option>
+                  <option value="jcf">Justificatif des capacités financières</option>
+                  <option disabled="" hidden="" value="">Selectionnez une option</option>
+                </select>
+              </div>
+            </td>
+            <td></td>
+            <td></td>
+          </tr>
+        </tbody>
+      </table>
     </div>
   </div>
+  <!---->
 </div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/entreprises-documents-edit.stories_snapshots_ArmUneEntrepriseSansDocumentDEntreprise.html b/packages/ui/src/components/etape/entreprises-documents-edit.stories_snapshots_ArmUneEntrepriseSansDocumentDEntreprise.html
index 76b340c41b35050fa668a6f6557e478a1fde2416..fd459a263cb9ec8d3909eec60a801b56a0a5a4a9 100644
--- a/packages/ui/src/components/etape/entreprises-documents-edit.stories_snapshots_ArmUneEntrepriseSansDocumentDEntreprise.html
+++ b/packages/ui/src/components/etape/entreprises-documents-edit.stories_snapshots_ArmUneEntrepriseSansDocumentDEntreprise.html
@@ -1,116 +1,159 @@
-<div>
-  <div class="mb-xs">
-    <div class="flex">
-      <h4>nom entreprise</h4>
-    </div>
-    <div>
-      <div class="tablet-blobs">
-        <div class="tablet-blob-1-3 flex flex-center">
-          <h5 class="mt-s">Attestation fiscale</h5><span><!----></span><span class="bold cap-first small ml-xs"><span class="bg-warning py-xxs px-xs rnd-xs color-bg box">Manquant</span></span>
-        </div>
-        <div class="tablet-blob-2-3">
-          <div class="flex mb-s"><select class="p-s">
-              <option value="2023-06-03-atf-ueoau">Attestation fiscale : Attestation sur l'honneur (03-06-2023)</option>
-              <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
-            </select>
-            <!---->
-          </div>
-        </div>
-      </div>
-    </div>
-    <div>
-      <div class="tablet-blobs">
-        <div class="tablet-blob-1-3 flex flex-center">
-          <h5 class="mt-s">Curriculum vitae</h5><span><!----></span><span class="bold cap-first small ml-xs"><span class="bg-warning py-xxs px-xs rnd-xs color-bg box">Manquant</span></span>
-        </div>
-        <div class="tablet-blob-2-3">
-          <div class="flex mb-s"><select class="p-s">
-              <option value="2023-06-23-cur-ueoau">Curriculum vitae : Jon. Doe (23-06-2023)</option>
-              <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
-            </select>
-            <!---->
-          </div>
-        </div>
-      </div>
-    </div>
-    <div>
-      <div class="tablet-blobs">
-        <div class="tablet-blob-1-3 flex flex-center">
-          <h5 class="mt-s">Justificatif d’identité</h5><span><!----></span><span class="bold cap-first small ml-xs"><span class="bg-warning py-xxs px-xs rnd-xs color-bg box">Manquant</span></span>
-        </div>
-        <div class="tablet-blob-2-3">
-          <div class="flex mb-s"><select class="p-s">
-              <option value="2023-06-23-jid-eaoueo">Justificatif d’identité : Jon. Doe (23-06-2023)</option>
-              <option value="2023-06-23-jid-ueoau">Justificatif d’identité : Arm. Strong (23-06-2023)</option>
-              <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
-            </select>
-            <!---->
-          </div>
-        </div>
-      </div>
-    </div>
-    <div>
-      <div class="tablet-blobs">
-        <div class="tablet-blob-1-3 flex flex-center">
-          <h5 class="mt-s">Justificatif des capacités techniques</h5><span><!----></span><span class="bold cap-first small ml-xs"><span class="bg-warning py-xxs px-xs rnd-xs color-bg box">Manquant</span></span>
-        </div>
-        <div class="tablet-blob-2-3">
-          <div class="flex mb-s"><select class="p-s">
-              <option value="2023-06-23-jct-ueoau">Justificatif des capacités techniques : (23-06-2023)</option>
-              <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
-            </select>
-            <!---->
-          </div>
-        </div>
-      </div>
-    </div>
-    <div>
-      <div class="tablet-blobs">
-        <div class="tablet-blob-1-3 flex flex-center">
-          <h5 class="mt-s">Kbis</h5><span><!----></span><span class="bold cap-first small ml-xs"><span class="bg-warning py-xxs px-xs rnd-xs color-bg box">Manquant</span></span>
-        </div>
-        <div class="tablet-blob-2-3">
-          <div class="flex mb-s"><select class="p-s">
-              <option value="2023-06-08-kbi-ueoau">Kbis : (08-06-2023)</option>
-              <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
-            </select>
-            <!---->
-          </div>
-        </div>
-      </div>
-    </div>
-    <div>
-      <div class="tablet-blobs">
-        <div class="tablet-blob-1-3 flex flex-center">
-          <h5 class="mt-s">Justificatif des capacités financières</h5><span><!----></span><span class="bold cap-first small ml-xs"><span class="bg-warning py-xxs px-xs rnd-xs color-bg box">Manquant</span></span>
-        </div>
-        <div class="tablet-blob-2-3">
-          <div class="flex mb-s"><select class="p-s">
-              <option value="2023-06-23-jcf-uueoau">Justificatif des capacités financières : (23-06-2023)</option>
-              <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
-            </select>
-            <!---->
-          </div>
-        </div>
-      </div>
-    </div>
-    <div>
-      <div class="tablet-blobs">
-        <div class="tablet-blob-1-3">
-          <h5 class="mt-s">Ajouter un document d'entreprise existant</h5>
-        </div>
-        <div class="tablet-blob-2-3"><select class="p-s mb-s">
-            <option disabled="" value="undefined">Sélectionner un type de document d'entreprise</option>
-            <option disabled="" value="atf">Attestation fiscale</option>
-            <option value="sir">Avis de situation au répertoire Sirene</option>
-            <option disabled="" value="cur">Curriculum vitae</option>
-            <option value="idm">Identification de matériel</option>
-            <option disabled="" value="jid">Justificatif d’identité</option>
-            <option disabled="" value="jct">Justificatif des capacités techniques</option>
-            <option disabled="" value="kbi">Kbis</option>
-            <option disabled="" value="jcf">Justificatif des capacités financières</option>
-          </select></div>
-      </div>
+<div class="dsfr">
+  <div>
+    <div class="fr-table fr-mb-0">
+      <table style="display: table;">
+        <caption>nom entreprise</caption>
+        <thead>
+          <tr>
+            <th scope="col">Nom</th>
+            <th scope="col"></th>
+            <th scope="col" style="display: flex; justify-content: end;">Action</th>
+          </tr>
+        </thead>
+        <tbody>
+          <tr>
+            <td>
+              <div style="display: flex; flex-direction: column; align-items: start;">
+                <div class="fr-text--md">Attestation fiscale</div>
+                <!---->
+              </div>
+            </td>
+            <td>
+              <div class="fr-select-group">
+                <!----><select class="fr-select" id="select_271" aria-label="Choix du document pour [object Object]" name="select_271">
+                  <option value="2023-06-03-atf-ueoau">Attestation fiscale : Attestation sur l'honneur (03-06-2023)</option>
+                  <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                  <option disabled="" hidden="" value="">Selectionnez une option</option>
+                </select>
+              </div>
+            </td>
+            <td style="text-align: right;">
+              <!---->
+            </td>
+          </tr>
+          <tr>
+            <td>
+              <div style="display: flex; flex-direction: column; align-items: start;">
+                <div class="fr-text--md">Curriculum vitae</div>
+                <!---->
+              </div>
+            </td>
+            <td>
+              <div class="fr-select-group">
+                <!----><select class="fr-select" id="select_670" aria-label="Choix du document pour [object Object]" name="select_670">
+                  <option value="2023-06-23-cur-ueoau">Curriculum vitae : Jon. Doe (23-06-2023)</option>
+                  <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                  <option disabled="" hidden="" value="">Selectionnez une option</option>
+                </select>
+              </div>
+            </td>
+            <td style="text-align: right;">
+              <!---->
+            </td>
+          </tr>
+          <tr>
+            <td>
+              <div style="display: flex; flex-direction: column; align-items: start;">
+                <div class="fr-text--md">Justificatif d’identité</div>
+                <!---->
+              </div>
+            </td>
+            <td>
+              <div class="fr-select-group">
+                <!----><select class="fr-select" id="select_74" aria-label="Choix du document pour [object Object]" name="select_74">
+                  <option value="2023-06-23-jid-eaoueo">Justificatif d’identité : Jon. Doe (23-06-2023)</option>
+                  <option value="2023-06-23-jid-ueoau">Justificatif d’identité : Arm. Strong (23-06-2023)</option>
+                  <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                  <option disabled="" hidden="" value="">Selectionnez une option</option>
+                </select>
+              </div>
+            </td>
+            <td style="text-align: right;">
+              <!---->
+            </td>
+          </tr>
+          <tr>
+            <td>
+              <div style="display: flex; flex-direction: column; align-items: start;">
+                <div class="fr-text--md">Justificatif des capacités techniques</div>
+                <!---->
+              </div>
+            </td>
+            <td>
+              <div class="fr-select-group">
+                <!----><select class="fr-select" id="select_878" aria-label="Choix du document pour [object Object]" name="select_878">
+                  <option value="2023-06-23-jct-ueoau">Justificatif des capacités techniques : (23-06-2023)</option>
+                  <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                  <option disabled="" hidden="" value="">Selectionnez une option</option>
+                </select>
+              </div>
+            </td>
+            <td style="text-align: right;">
+              <!---->
+            </td>
+          </tr>
+          <tr>
+            <td>
+              <div style="display: flex; flex-direction: column; align-items: start;">
+                <div class="fr-text--md">Kbis</div>
+                <!---->
+              </div>
+            </td>
+            <td>
+              <div class="fr-select-group">
+                <!----><select class="fr-select" id="select_967" aria-label="Choix du document pour [object Object]" name="select_967">
+                  <option value="2023-06-08-kbi-ueoau">Kbis : (08-06-2023)</option>
+                  <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                  <option disabled="" hidden="" value="">Selectionnez une option</option>
+                </select>
+              </div>
+            </td>
+            <td style="text-align: right;">
+              <!---->
+            </td>
+          </tr>
+          <tr>
+            <td>
+              <div style="display: flex; flex-direction: column; align-items: start;">
+                <div class="fr-text--md">Justificatif des capacités financières</div>
+                <!---->
+              </div>
+            </td>
+            <td>
+              <div class="fr-select-group">
+                <!----><select class="fr-select" id="select_25" aria-label="Choix du document pour [object Object]" name="select_25">
+                  <option value="2023-06-23-jcf-uueoau">Justificatif des capacités financières : (23-06-2023)</option>
+                  <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                  <option disabled="" hidden="" value="">Selectionnez une option</option>
+                </select>
+              </div>
+            </td>
+            <td style="text-align: right;">
+              <!---->
+            </td>
+          </tr>
+          <tr>
+            <td>
+              <div class="fr-select-group">
+                <!----><select class="fr-select" id="select_128" aria-label="Ajouter un nouveau type de document" name="select_128">
+                  <option value="atf">Attestation fiscale</option>
+                  <option value="sir">Avis de situation au répertoire Sirene</option>
+                  <option value="cur">Curriculum vitae</option>
+                  <option value="idm">Identification de matériel</option>
+                  <option value="jid">Justificatif d’identité</option>
+                  <option value="jct">Justificatif des capacités techniques</option>
+                  <option value="kbi">Kbis</option>
+                  <option value="jcf">Justificatif des capacités financières</option>
+                  <option disabled="" hidden="" value="">Selectionnez une option</option>
+                </select>
+              </div>
+            </td>
+            <td></td>
+            <td></td>
+          </tr>
+        </tbody>
+      </table>
     </div>
   </div>
+  <!---->
 </div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/entreprises-documents-edit.stories_snapshots_AxmDeuxEntreprisesDocumentDEntrepriseComplet.html b/packages/ui/src/components/etape/entreprises-documents-edit.stories_snapshots_AxmDeuxEntreprisesDocumentDEntrepriseComplet.html
index 04182776137235b0fda9c25591ac198e374271cf..07ebada77c31d49a9530f618047906a57c3f0938 100644
--- a/packages/ui/src/components/etape/entreprises-documents-edit.stories_snapshots_AxmDeuxEntreprisesDocumentDEntrepriseComplet.html
+++ b/packages/ui/src/components/etape/entreprises-documents-edit.stories_snapshots_AxmDeuxEntreprisesDocumentDEntrepriseComplet.html
@@ -1,377 +1,449 @@
-<div>
-  <div class="mb-xs">
-    <div class="flex">
-      <h4>nom entreprise</h4>
-    </div>
-    <div>
-      <div class="tablet-blobs">
-        <div class="tablet-blob-1-3 flex flex-center"><a class="mt-s" href="/apiUrl/fichiers/2023-06-03-atf-ueoau" title="Télécharger le document Attestation fiscale - nouvelle fenêtre" target="_blank">Attestation fiscale</a><span><div class="_tooltip_4f6ea8 ml-xs"><h6 class="_tooltip-content_4f6ea8">Attestation sur l’honneur certifiant que le demandeur est en règle au regard de ses obligations fiscales et en matière de paiement de ses cotisations sociales (décret 2001-204, art. 7).</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666"><use href="#icon-help"></use></svg></div></span>
-          <!---->
-        </div>
-        <div class="tablet-blob-2-3">
-          <div class="flex mb-s"><select class="p-s">
-              <option disabled="" value="2023-06-03-atf-ueoau">Attestation fiscale : Attestation sur l'honneur (03-06-2023)</option>
-              <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
-            </select>
-            <div class="flex-right flex flex-center ml-s"><button title="Supprime le document d’entreprise" aria-label="Supprime le document d’entreprise" class="btn-border py-s px-m rnd-xs"><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
-                  <use href="#icon-delete"></use>
-                </svg></button></div>
-          </div>
-        </div>
-      </div>
-    </div>
-    <div>
-      <div class="tablet-blobs">
-        <div class="tablet-blob-1-3 flex flex-center"><a class="mt-s" href="/apiUrl/fichiers/2023-06-23-cur-ueoau" title="Télécharger le document Curriculum vitae - nouvelle fenêtre" target="_blank">Curriculum vitae</a><span><!----></span>
-          <!---->
-        </div>
-        <div class="tablet-blob-2-3">
-          <div class="flex mb-s"><select class="p-s">
-              <option disabled="" value="2023-06-23-cur-ueoau">Curriculum vitae : Jon. Doe (23-06-2023)</option>
-              <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
-            </select>
-            <div class="flex-right flex flex-center ml-s"><button title="Supprime le document d’entreprise" aria-label="Supprime le document d’entreprise" class="btn-border py-s px-m rnd-xs"><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
-                  <use href="#icon-delete"></use>
-                </svg></button></div>
-          </div>
-        </div>
-      </div>
-    </div>
-    <div>
-      <div class="tablet-blobs">
-        <div class="tablet-blob-1-3 flex flex-center"><a class="mt-s" href="/apiUrl/fichiers/2023-06-23-idm-ueoaue" title="Télécharger le document Identification de matériel - nouvelle fenêtre" target="_blank">Identification de matériel</a><span><!----></span>
-          <!---->
-        </div>
-        <div class="tablet-blob-2-3">
-          <div class="flex mb-s"><select class="p-s">
-              <option disabled="" value="2023-06-23-idm-ueoaue">Identification de matériel : Facture pelle (23-06-2023)</option>
-              <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
-            </select>
-            <div class="flex-right flex flex-center ml-s"><button title="Supprime le document d’entreprise" aria-label="Supprime le document d’entreprise" class="btn-border py-s px-m rnd-xs"><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
-                  <use href="#icon-delete"></use>
-                </svg></button></div>
-          </div>
-        </div>
-      </div>
-    </div>
-    <div>
-      <div class="tablet-blobs">
-        <div class="tablet-blob-1-3 flex flex-center"><a class="mt-s" href="/apiUrl/fichiers/2023-06-23-jid-eaoueo" title="Télécharger le document Justificatif d’identité - nouvelle fenêtre" target="_blank">Justificatif d’identité</a><span><div class="_tooltip_4f6ea8 ml-xs"><h6 class="_tooltip-content_4f6ea8">Pièces d'identification du demandeur (personne physique ou société)</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666"><use href="#icon-help"></use></svg></div></span>
-          <!---->
-        </div>
-        <div class="tablet-blob-2-3">
-          <div class="flex mb-s"><select class="p-s">
-              <option disabled="" value="2023-06-23-jid-eaoueo">Justificatif d’identité : Jon. Doe (23-06-2023)</option>
-              <option value="2023-06-23-jid-ueoau">Justificatif d’identité : Arm. Strong (23-06-2023)</option>
-              <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
-            </select>
-            <div class="flex-right flex flex-center ml-s"><button title="Supprime le document d’entreprise" aria-label="Supprime le document d’entreprise" class="btn-border py-s px-m rnd-xs"><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
-                  <use href="#icon-delete"></use>
-                </svg></button></div>
-          </div>
-        </div>
-      </div>
-    </div>
-    <div>
-      <div class="tablet-blobs">
-        <div class="tablet-blob-1-3 flex flex-center"><a class="mt-s" href="/apiUrl/fichiers/2023-06-23-jct-ueoau" title="Télécharger le document Justificatif des capacités techniques - nouvelle fenêtre" target="_blank">Justificatif des capacités techniques</a><span><div class="_tooltip_4f6ea8 ml-xs"><h6 class="_tooltip-content_4f6ea8">La justification du choix de la zone considérée, la situation du périmètre par rapport aux documents d’urbanisme, la situation du périmètre par rapport aux titres miniers et autorisations d’exploitation existants, les activités passées d’orpaillage et leurs conséquences sur les site.</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666"><use href="#icon-help"></use></svg></div></span>
-          <!---->
-        </div>
-        <div class="tablet-blob-2-3">
-          <div class="flex mb-s"><select class="p-s">
-              <option disabled="" value="2023-06-23-jct-ueoau">Justificatif des capacités techniques : (23-06-2023)</option>
-              <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
-            </select>
-            <div class="flex-right flex flex-center ml-s"><button title="Supprime le document d’entreprise" aria-label="Supprime le document d’entreprise" class="btn-border py-s px-m rnd-xs"><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
-                  <use href="#icon-delete"></use>
-                </svg></button></div>
-          </div>
-        </div>
-      </div>
-    </div>
-    <div>
-      <div class="tablet-blobs">
-        <div class="tablet-blob-1-3 flex flex-center"><a class="mt-s" href="/apiUrl/fichiers/2023-06-08-kbi-ueoau" title="Télécharger le document Kbis - nouvelle fenêtre" target="_blank">Kbis</a><span><!----></span>
-          <!---->
-        </div>
-        <div class="tablet-blob-2-3">
-          <div class="flex mb-s"><select class="p-s">
-              <option disabled="" value="2023-06-08-kbi-ueoau">Kbis : (08-06-2023)</option>
-              <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
-            </select>
-            <div class="flex-right flex flex-center ml-s"><button title="Supprime le document d’entreprise" aria-label="Supprime le document d’entreprise" class="btn-border py-s px-m rnd-xs"><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
-                  <use href="#icon-delete"></use>
-                </svg></button></div>
-          </div>
-        </div>
-      </div>
-    </div>
-    <div>
-      <div class="tablet-blobs">
-        <div class="tablet-blob-1-3 flex flex-center"><a class="mt-s" href="/apiUrl/fichiers/2023-06-23-jcf-uueoau" title="Télécharger le document Justificatif des capacités financières - nouvelle fenêtre" target="_blank">Justificatif des capacités financières</a><span><!----></span>
-          <!---->
-        </div>
-        <div class="tablet-blob-2-3">
-          <div class="flex mb-s"><select class="p-s">
-              <option disabled="" value="2023-06-23-jcf-uueoau">Justificatif des capacités financières : (23-06-2023)</option>
-              <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
-            </select>
-            <div class="flex-right flex flex-center ml-s"><button title="Supprime le document d’entreprise" aria-label="Supprime le document d’entreprise" class="btn-border py-s px-m rnd-xs"><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
-                  <use href="#icon-delete"></use>
-                </svg></button></div>
-          </div>
-        </div>
-      </div>
-    </div>
-    <div>
-      <div class="tablet-blobs">
-        <div class="tablet-blob-1-3 flex flex-center">
-          <h5 class="mt-s">Liste des travaux antérieurs</h5><span><div class="_tooltip_4f6ea8 ml-xs"><h6 class="_tooltip-content_4f6ea8">Liste des travaux auxquels le demandeur a participé au cours des 3 dernières années</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666"><use href="#icon-help"></use></svg></div></span><span class="bold cap-first small ml-xs"><span class="bg-warning py-xxs px-xs rnd-xs color-bg box">Manquant</span></span>
-        </div>
-        <div class="tablet-blob-2-3">
-          <div class="flex mb-s"><select class="p-s">
-              <option></option>
-              <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
-            </select>
-            <!---->
-          </div>
-        </div>
-      </div>
-    </div>
-    <div>
-      <div class="tablet-blobs">
-        <div class="tablet-blob-1-3 flex flex-center">
-          <h5 class="mt-s">Justificatif d’adhésion à la charte des bonnes pratiques</h5><span><!----></span><span class="bold cap-first small ml-xs"><span class="bg-warning py-xxs px-xs rnd-xs color-bg box">Manquant</span></span>
-        </div>
-        <div class="tablet-blob-2-3">
-          <div class="flex mb-s"><select class="p-s">
-              <option></option>
-              <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
-            </select>
-            <!---->
-          </div>
-        </div>
-      </div>
-    </div>
-    <div>
-      <div class="tablet-blobs">
-        <div class="tablet-blob-1-3 flex flex-center">
-          <h5 class="mt-s">3 derniers bilans et comptes de résultats</h5><span><div class="_tooltip_4f6ea8 ml-xs"><h6 class="_tooltip-content_4f6ea8">Ces pièces sont demandées au titre de la justification des capacités financières du demandeur (décret 2001-204, art. 7)</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666"><use href="#icon-help"></use></svg></div></span><span class="bold cap-first small ml-xs"><span class="bg-warning py-xxs px-xs rnd-xs color-bg box">Manquant</span></span>
-        </div>
-        <div class="tablet-blob-2-3">
-          <div class="flex mb-s"><select class="p-s">
-              <option></option>
-              <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
-            </select>
-            <!---->
-          </div>
-        </div>
-      </div>
-    </div>
-    <div>
-      <div class="tablet-blobs">
-        <div class="tablet-blob-1-3 flex flex-center">
-          <h5 class="mt-s">Références professionnelles </h5><span><div class="_tooltip_4f6ea8 ml-xs"><h6 class="_tooltip-content_4f6ea8">Références professionnelles du demandeur ou celles des cadres chargés du suivi et de la conduite des travauxCes pièces sont demandées au titre la justification des capacités techniques du demandeur (décret 2001-204, art. 6).
+<div class="dsfr">
+  <div>
+    <div class="fr-table fr-mb-0">
+      <table style="display: table;">
+        <caption>nom entreprise</caption>
+        <thead>
+          <tr>
+            <th scope="col">Nom</th>
+            <th scope="col"></th>
+            <th scope="col" style="display: flex; justify-content: end;">Action</th>
+          </tr>
+        </thead>
+        <tbody>
+          <tr>
+            <td>
+              <div style="display: flex; flex-direction: column; align-items: start;"><a class="fr-link" title="Télécharger le document Attestation fiscale - nouvelle fenêtre" href="/apiUrl/download/entrepriseDocuments/2023-06-03-atf-ueoau" target="_blank">Attestation fiscale</a><span class="fr-text--xs" style="max-width: 300px;">Attestation sur l’honneur certifiant que le demandeur est en règle au regard de ses obligations fiscales et en matière de paiement de ses cotisations sociales (décret 2001-204, art. 7).</span></div>
+            </td>
+            <td>
+              <div class="fr-select-group">
+                <!----><select class="fr-select" id="select_271" aria-label="Choix du document pour [object Object]" name="select_271">
+                  <option disabled="" value="2023-06-03-atf-ueoau">Attestation fiscale : Attestation sur l'honneur (03-06-2023)</option>
+                  <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                  <option disabled="" hidden="" value="">Selectionnez une option</option>
+                </select>
+              </div>
+            </td>
+            <td style="text-align: right;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-delete-bin-line fr-ml-1w" title="Supprimer le document d’entreprise Attestation fiscale" aria-label="Supprimer le document d’entreprise Attestation fiscale" type="button">
+                <!---->
+              </button></td>
+          </tr>
+          <tr>
+            <td>
+              <div style="display: flex; flex-direction: column; align-items: start;"><a class="fr-link" title="Télécharger le document Curriculum vitae - nouvelle fenêtre" href="/apiUrl/download/entrepriseDocuments/2023-06-23-cur-ueoau" target="_blank">Curriculum vitae</a>
+                <!---->
+              </div>
+            </td>
+            <td>
+              <div class="fr-select-group">
+                <!----><select class="fr-select" id="select_670" aria-label="Choix du document pour [object Object]" name="select_670">
+                  <option disabled="" value="2023-06-23-cur-ueoau">Curriculum vitae : Jon. Doe (23-06-2023)</option>
+                  <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                  <option disabled="" hidden="" value="">Selectionnez une option</option>
+                </select>
+              </div>
+            </td>
+            <td style="text-align: right;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-delete-bin-line fr-ml-1w" title="Supprimer le document d’entreprise Curriculum vitae" aria-label="Supprimer le document d’entreprise Curriculum vitae" type="button">
+                <!---->
+              </button></td>
+          </tr>
+          <tr>
+            <td>
+              <div style="display: flex; flex-direction: column; align-items: start;"><a class="fr-link" title="Télécharger le document Identification de matériel - nouvelle fenêtre" href="/apiUrl/download/entrepriseDocuments/2023-06-23-idm-ueoaue" target="_blank">Identification de matériel</a>
+                <!---->
+              </div>
+            </td>
+            <td>
+              <div class="fr-select-group">
+                <!----><select class="fr-select" id="select_74" aria-label="Choix du document pour [object Object]" name="select_74">
+                  <option disabled="" value="2023-06-23-idm-ueoaue">Identification de matériel : Facture pelle (23-06-2023)</option>
+                  <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                  <option disabled="" hidden="" value="">Selectionnez une option</option>
+                </select>
+              </div>
+            </td>
+            <td style="text-align: right;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-delete-bin-line fr-ml-1w" title="Supprimer le document d’entreprise Identification de matériel" aria-label="Supprimer le document d’entreprise Identification de matériel" type="button">
+                <!---->
+              </button></td>
+          </tr>
+          <tr>
+            <td>
+              <div style="display: flex; flex-direction: column; align-items: start;"><a class="fr-link" title="Télécharger le document Justificatif d’identité - nouvelle fenêtre" href="/apiUrl/download/entrepriseDocuments/2023-06-23-jid-eaoueo" target="_blank">Justificatif d’identité</a><span class="fr-text--xs" style="max-width: 300px;">Pièces d'identification du demandeur (personne physique ou société)</span></div>
+            </td>
+            <td>
+              <div class="fr-select-group">
+                <!----><select class="fr-select" id="select_878" aria-label="Choix du document pour [object Object]" name="select_878">
+                  <option disabled="" value="2023-06-23-jid-eaoueo">Justificatif d’identité : Jon. Doe (23-06-2023)</option>
+                  <option value="2023-06-23-jid-ueoau">Justificatif d’identité : Arm. Strong (23-06-2023)</option>
+                  <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                  <option disabled="" hidden="" value="">Selectionnez une option</option>
+                </select>
+              </div>
+            </td>
+            <td style="text-align: right;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-delete-bin-line fr-ml-1w" title="Supprimer le document d’entreprise Justificatif d’identité" aria-label="Supprimer le document d’entreprise Justificatif d’identité" type="button">
+                <!---->
+              </button></td>
+          </tr>
+          <tr>
+            <td>
+              <div style="display: flex; flex-direction: column; align-items: start;"><a class="fr-link" title="Télécharger le document Justificatif des capacités techniques - nouvelle fenêtre" href="/apiUrl/download/entrepriseDocuments/2023-06-23-jct-ueoau" target="_blank">Justificatif des capacités techniques</a><span class="fr-text--xs" style="max-width: 300px;">La justification du choix de la zone considérée, la situation du périmètre par rapport aux documents d’urbanisme, la situation du périmètre par rapport aux titres miniers et autorisations d’exploitation existants, les activités passées d’orpaillage et leurs conséquences sur les site.</span></div>
+            </td>
+            <td>
+              <div class="fr-select-group">
+                <!----><select class="fr-select" id="select_967" aria-label="Choix du document pour [object Object]" name="select_967">
+                  <option disabled="" value="2023-06-23-jct-ueoau">Justificatif des capacités techniques : (23-06-2023)</option>
+                  <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                  <option disabled="" hidden="" value="">Selectionnez une option</option>
+                </select>
+              </div>
+            </td>
+            <td style="text-align: right;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-delete-bin-line fr-ml-1w" title="Supprimer le document d’entreprise Justificatif des capacités techniques" aria-label="Supprimer le document d’entreprise Justificatif des capacités techniques" type="button">
+                <!---->
+              </button></td>
+          </tr>
+          <tr>
+            <td>
+              <div style="display: flex; flex-direction: column; align-items: start;"><a class="fr-link" title="Télécharger le document Kbis - nouvelle fenêtre" href="/apiUrl/download/entrepriseDocuments/2023-06-08-kbi-ueoau" target="_blank">Kbis</a>
+                <!---->
+              </div>
+            </td>
+            <td>
+              <div class="fr-select-group">
+                <!----><select class="fr-select" id="select_25" aria-label="Choix du document pour [object Object]" name="select_25">
+                  <option disabled="" value="2023-06-08-kbi-ueoau">Kbis : (08-06-2023)</option>
+                  <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                  <option disabled="" hidden="" value="">Selectionnez une option</option>
+                </select>
+              </div>
+            </td>
+            <td style="text-align: right;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-delete-bin-line fr-ml-1w" title="Supprimer le document d’entreprise Kbis" aria-label="Supprimer le document d’entreprise Kbis" type="button">
+                <!---->
+              </button></td>
+          </tr>
+          <tr>
+            <td>
+              <div style="display: flex; flex-direction: column; align-items: start;"><a class="fr-link" title="Télécharger le document Justificatif des capacités financières - nouvelle fenêtre" href="/apiUrl/download/entrepriseDocuments/2023-06-23-jcf-uueoau" target="_blank">Justificatif des capacités financières</a>
+                <!---->
+              </div>
+            </td>
+            <td>
+              <div class="fr-select-group">
+                <!----><select class="fr-select" id="select_128" aria-label="Choix du document pour [object Object]" name="select_128">
+                  <option disabled="" value="2023-06-23-jcf-uueoau">Justificatif des capacités financières : (23-06-2023)</option>
+                  <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                  <option disabled="" hidden="" value="">Selectionnez une option</option>
+                </select>
+              </div>
+            </td>
+            <td style="text-align: right;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-delete-bin-line fr-ml-1w" title="Supprimer le document d’entreprise Justificatif des capacités financières" aria-label="Supprimer le document d’entreprise Justificatif des capacités financières" type="button">
+                <!---->
+              </button></td>
+          </tr>
+          <tr>
+            <td>
+              <div style="display: flex; flex-direction: column; align-items: start;">
+                <div class="fr-text--md">Liste des travaux antérieurs</div><span class="fr-text--xs" style="max-width: 300px;">Liste des travaux auxquels le demandeur a participé au cours des 3 dernières années</span>
+              </div>
+            </td>
+            <td>
+              <div class="fr-select-group">
+                <!----><select class="fr-select" id="select_772" aria-label="Choix du document pour [object Object]" name="select_772">
+                  <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                  <option disabled="" hidden="" value="">Selectionnez une option</option>
+                </select>
+              </div>
+            </td>
+            <td style="text-align: right;">
+              <!---->
+            </td>
+          </tr>
+          <tr>
+            <td>
+              <div style="display: flex; flex-direction: column; align-items: start;">
+                <div class="fr-text--md">Justificatif d’adhésion à la charte des bonnes pratiques</div>
+                <!---->
+              </div>
+            </td>
+            <td>
+              <div class="fr-select-group">
+                <!----><select class="fr-select" id="select_453" aria-label="Choix du document pour [object Object]" name="select_453">
+                  <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                  <option disabled="" hidden="" value="">Selectionnez une option</option>
+                </select>
+              </div>
+            </td>
+            <td style="text-align: right;">
+              <!---->
+            </td>
+          </tr>
+          <tr>
+            <td>
+              <div style="display: flex; flex-direction: column; align-items: start;">
+                <div class="fr-text--md">3 derniers bilans et comptes de résultats</div><span class="fr-text--xs" style="max-width: 300px;">Ces pièces sont demandées au titre de la justification des capacités financières du demandeur (décret 2001-204, art. 7)</span>
+              </div>
+            </td>
+            <td>
+              <div class="fr-select-group">
+                <!----><select class="fr-select" id="select_556" aria-label="Choix du document pour [object Object]" name="select_556">
+                  <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                  <option disabled="" hidden="" value="">Selectionnez une option</option>
+                </select>
+              </div>
+            </td>
+            <td style="text-align: right;">
+              <!---->
+            </td>
+          </tr>
+          <tr>
+            <td>
+              <div style="display: flex; flex-direction: column; align-items: start;">
+                <div class="fr-text--md">Références professionnelles </div><span class="fr-text--xs" style="max-width: 300px;">Références professionnelles du demandeur ou celles des cadres chargés du suivi et de la conduite des travauxCes pièces sont demandées au titre la justification des capacités techniques du demandeur (décret 2001-204, art. 6).
  
- S’il s’agit d’une personne morale, références professionnelles du ou des cadres chargés du suivi et de la conduite des travaux</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666"><use href="#icon-help"></use></svg></div></span><span class="bold cap-first small ml-xs"><span class="bg-warning py-xxs px-xs rnd-xs color-bg box">Manquant</span></span>
-        </div>
-        <div class="tablet-blob-2-3">
-          <div class="flex mb-s"><select class="p-s">
-              <option></option>
-              <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
-            </select>
-            <!---->
-          </div>
-        </div>
-      </div>
-    </div>
-    <div>
-      <div class="tablet-blobs">
-        <div class="tablet-blob-1-3 flex flex-center">
-          <h5 class="mt-s">Déclarations bancaires ou cautions appropriées</h5><span><div class="_tooltip_4f6ea8 ml-xs"><h6 class="_tooltip-content_4f6ea8">Ces pièces sont demandées au titre de la justification des capacités financières du demandeur (décret 2001-204, art. 7)</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666"><use href="#icon-help"></use></svg></div></span><span class="bold cap-first small ml-xs"><span class="bg-warning py-xxs px-xs rnd-xs color-bg box">Manquant</span></span>
-        </div>
-        <div class="tablet-blob-2-3">
-          <div class="flex mb-s"><select class="p-s">
-              <option></option>
-              <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
-            </select>
-            <!---->
-          </div>
-        </div>
-      </div>
+ S’il s’agit d’une personne morale, références professionnelles du ou des cadres chargés du suivi et de la conduite des travaux</span>
+              </div>
+            </td>
+            <td>
+              <div class="fr-select-group">
+                <!----><select class="fr-select" id="select_487" aria-label="Choix du document pour [object Object]" name="select_487">
+                  <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                  <option disabled="" hidden="" value="">Selectionnez une option</option>
+                </select>
+              </div>
+            </td>
+            <td style="text-align: right;">
+              <!---->
+            </td>
+          </tr>
+          <tr>
+            <td>
+              <div style="display: flex; flex-direction: column; align-items: start;">
+                <div class="fr-text--md">Déclarations bancaires ou cautions appropriées</div><span class="fr-text--xs" style="max-width: 300px;">Ces pièces sont demandées au titre de la justification des capacités financières du demandeur (décret 2001-204, art. 7)</span>
+              </div>
+            </td>
+            <td>
+              <div class="fr-select-group">
+                <!----><select class="fr-select" id="select_796" aria-label="Choix du document pour [object Object]" name="select_796">
+                  <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                  <option disabled="" hidden="" value="">Selectionnez une option</option>
+                </select>
+              </div>
+            </td>
+            <td style="text-align: right;">
+              <!---->
+            </td>
+          </tr>
+          <tr>
+            <td>
+              <div class="fr-select-group">
+                <!----><select class="fr-select" id="select_216" aria-label="Ajouter un nouveau type de document" name="select_216">
+                  <option value="atf">Attestation fiscale</option>
+                  <option value="sir">Avis de situation au répertoire Sirene</option>
+                  <option value="cur">Curriculum vitae</option>
+                  <option value="idm">Identification de matériel</option>
+                  <option value="jid">Justificatif d’identité</option>
+                  <option value="jct">Justificatif des capacités techniques</option>
+                  <option value="kbi">Kbis</option>
+                  <option value="jcf">Justificatif des capacités financières</option>
+                  <option value="lis">Liste des travaux antérieurs</option>
+                  <option value="jac">Justificatif d’adhésion à la charte des bonnes pratiques</option>
+                  <option value="bil">3 derniers bilans et comptes de résultats</option>
+                  <option value="ref">Références professionnelles </option>
+                  <option value="deb">Déclarations bancaires ou cautions appropriées</option>
+                  <option disabled="" hidden="" value="">Selectionnez une option</option>
+                </select>
+              </div>
+            </td>
+            <td></td>
+            <td></td>
+          </tr>
+        </tbody>
+      </table>
     </div>
-    <div>
-      <div class="tablet-blobs">
-        <div class="tablet-blob-1-3">
-          <h5 class="mt-s">Ajouter un document d'entreprise existant</h5>
-        </div>
-        <div class="tablet-blob-2-3"><select class="p-s mb-s">
-            <option disabled="" value="undefined">Sélectionner un type de document d'entreprise</option>
-            <option value="atf">Attestation fiscale</option>
-            <option value="sir">Avis de situation au répertoire Sirene</option>
-            <option value="cur">Curriculum vitae</option>
-            <option value="idm">Identification de matériel</option>
-            <option value="jid">Justificatif d’identité</option>
-            <option value="jct">Justificatif des capacités techniques</option>
-            <option value="kbi">Kbis</option>
-            <option value="jcf">Justificatif des capacités financières</option>
-            <option disabled="" value="lis">Liste des travaux antérieurs</option>
-            <option disabled="" value="jac">Justificatif d’adhésion à la charte des bonnes pratiques</option>
-            <option disabled="" value="bil">3 derniers bilans et comptes de résultats</option>
-            <option disabled="" value="ref">Références professionnelles </option>
-            <option disabled="" value="deb">Déclarations bancaires ou cautions appropriées</option>
-          </select></div>
-      </div>
-    </div>
-  </div>
-  <div class="mb-xs">
-    <div class="flex">
-      <h4>Autre entreprise</h4>
-    </div>
-    <div>
-      <div class="tablet-blobs">
-        <div class="tablet-blob-1-3 flex flex-center">
-          <h5 class="mt-s">Attestation fiscale</h5><span><div class="_tooltip_4f6ea8 ml-xs"><h6 class="_tooltip-content_4f6ea8">Attestation sur l’honneur certifiant que le demandeur est en règle au regard de ses obligations fiscales et en matière de paiement de ses cotisations sociales (décret 2001-204, art. 7).</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666"><use href="#icon-help"></use></svg></div></span><span class="bold cap-first small ml-xs"><span class="bg-warning py-xxs px-xs rnd-xs color-bg box">Manquant</span></span>
-        </div>
-        <div class="tablet-blob-2-3">
-          <div class="flex mb-s"><select class="p-s">
-              <option></option>
-              <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
-            </select>
-            <!---->
-          </div>
-        </div>
-      </div>
-    </div>
-    <div>
-      <div class="tablet-blobs">
-        <div class="tablet-blob-1-3 flex flex-center">
-          <h5 class="mt-s">Justificatif d’identité</h5><span><div class="_tooltip_4f6ea8 ml-xs"><h6 class="_tooltip-content_4f6ea8">Pièces d'identification du demandeur (personne physique ou société)</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666"><use href="#icon-help"></use></svg></div></span><span class="bold cap-first small ml-xs"><span class="bg-warning py-xxs px-xs rnd-xs color-bg box">Manquant</span></span>
-        </div>
-        <div class="tablet-blob-2-3">
-          <div class="flex mb-s"><select class="p-s">
-              <option></option>
-              <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
-            </select>
-            <!---->
-          </div>
-        </div>
-      </div>
-    </div>
-    <div>
-      <div class="tablet-blobs">
-        <div class="tablet-blob-1-3 flex flex-center">
-          <h5 class="mt-s">Justificatif des capacités techniques</h5><span><div class="_tooltip_4f6ea8 ml-xs"><h6 class="_tooltip-content_4f6ea8">La justification du choix de la zone considérée, la situation du périmètre par rapport aux documents d’urbanisme, la situation du périmètre par rapport aux titres miniers et autorisations d’exploitation existants, les activités passées d’orpaillage et leurs conséquences sur les site.</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666"><use href="#icon-help"></use></svg></div></span><span class="bold cap-first small ml-xs"><span class="bg-warning py-xxs px-xs rnd-xs color-bg box">Manquant</span></span>
-        </div>
-        <div class="tablet-blob-2-3">
-          <div class="flex mb-s"><select class="p-s">
-              <option></option>
-              <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
-            </select>
-            <!---->
-          </div>
-        </div>
-      </div>
-    </div>
-    <div>
-      <div class="tablet-blobs">
-        <div class="tablet-blob-1-3 flex flex-center">
-          <h5 class="mt-s">Liste des travaux antérieurs</h5><span><div class="_tooltip_4f6ea8 ml-xs"><h6 class="_tooltip-content_4f6ea8">Liste des travaux auxquels le demandeur a participé au cours des 3 dernières années</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666"><use href="#icon-help"></use></svg></div></span><span class="bold cap-first small ml-xs"><span class="bg-warning py-xxs px-xs rnd-xs color-bg box">Manquant</span></span>
-        </div>
-        <div class="tablet-blob-2-3">
-          <div class="flex mb-s"><select class="p-s">
-              <option></option>
-              <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
-            </select>
-            <!---->
-          </div>
-        </div>
-      </div>
-    </div>
-    <div>
-      <div class="tablet-blobs">
-        <div class="tablet-blob-1-3 flex flex-center">
-          <h5 class="mt-s">Justificatif d’adhésion à la charte des bonnes pratiques</h5><span><!----></span><span class="bold cap-first small ml-xs"><span class="bg-warning py-xxs px-xs rnd-xs color-bg box">Manquant</span></span>
-        </div>
-        <div class="tablet-blob-2-3">
-          <div class="flex mb-s"><select class="p-s">
-              <option></option>
-              <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
-            </select>
-            <!---->
-          </div>
-        </div>
-      </div>
-    </div>
-    <div>
-      <div class="tablet-blobs">
-        <div class="tablet-blob-1-3 flex flex-center">
-          <h5 class="mt-s">3 derniers bilans et comptes de résultats</h5><span><div class="_tooltip_4f6ea8 ml-xs"><h6 class="_tooltip-content_4f6ea8">Ces pièces sont demandées au titre de la justification des capacités financières du demandeur (décret 2001-204, art. 7)</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666"><use href="#icon-help"></use></svg></div></span><span class="bold cap-first small ml-xs"><span class="bg-warning py-xxs px-xs rnd-xs color-bg box">Manquant</span></span>
-        </div>
-        <div class="tablet-blob-2-3">
-          <div class="flex mb-s"><select class="p-s">
-              <option></option>
-              <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
-            </select>
-            <!---->
-          </div>
-        </div>
-      </div>
-    </div>
-    <div>
-      <div class="tablet-blobs">
-        <div class="tablet-blob-1-3 flex flex-center">
-          <h5 class="mt-s">Références professionnelles </h5><span><div class="_tooltip_4f6ea8 ml-xs"><h6 class="_tooltip-content_4f6ea8">Références professionnelles du demandeur ou celles des cadres chargés du suivi et de la conduite des travauxCes pièces sont demandées au titre la justification des capacités techniques du demandeur (décret 2001-204, art. 6).
+    <div class="fr-table fr-mb-0">
+      <table style="display: table;">
+        <caption>Autre entreprise</caption>
+        <thead>
+          <tr>
+            <th scope="col">Nom</th>
+            <th scope="col"></th>
+            <th scope="col" style="display: flex; justify-content: end;">Action</th>
+          </tr>
+        </thead>
+        <tbody>
+          <tr>
+            <td>
+              <div style="display: flex; flex-direction: column; align-items: start;">
+                <div class="fr-text--md">Attestation fiscale</div><span class="fr-text--xs" style="max-width: 300px;">Attestation sur l’honneur certifiant que le demandeur est en règle au regard de ses obligations fiscales et en matière de paiement de ses cotisations sociales (décret 2001-204, art. 7).</span>
+              </div>
+            </td>
+            <td>
+              <div class="fr-select-group">
+                <!----><select class="fr-select" id="select_482" aria-label="Choix du document pour [object Object]" name="select_482">
+                  <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                  <option disabled="" hidden="" value="">Selectionnez une option</option>
+                </select>
+              </div>
+            </td>
+            <td style="text-align: right;">
+              <!---->
+            </td>
+          </tr>
+          <tr>
+            <td>
+              <div style="display: flex; flex-direction: column; align-items: start;">
+                <div class="fr-text--md">Justificatif d’identité</div><span class="fr-text--xs" style="max-width: 300px;">Pièces d'identification du demandeur (personne physique ou société)</span>
+              </div>
+            </td>
+            <td>
+              <div class="fr-select-group">
+                <!----><select class="fr-select" id="select_585" aria-label="Choix du document pour [object Object]" name="select_585">
+                  <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                  <option disabled="" hidden="" value="">Selectionnez une option</option>
+                </select>
+              </div>
+            </td>
+            <td style="text-align: right;">
+              <!---->
+            </td>
+          </tr>
+          <tr>
+            <td>
+              <div style="display: flex; flex-direction: column; align-items: start;">
+                <div class="fr-text--md">Justificatif des capacités techniques</div><span class="fr-text--xs" style="max-width: 300px;">La justification du choix de la zone considérée, la situation du périmètre par rapport aux documents d’urbanisme, la situation du périmètre par rapport aux titres miniers et autorisations d’exploitation existants, les activités passées d’orpaillage et leurs conséquences sur les site.</span>
+              </div>
+            </td>
+            <td>
+              <div class="fr-select-group">
+                <!----><select class="fr-select" id="select_759" aria-label="Choix du document pour [object Object]" name="select_759">
+                  <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                  <option disabled="" hidden="" value="">Selectionnez une option</option>
+                </select>
+              </div>
+            </td>
+            <td style="text-align: right;">
+              <!---->
+            </td>
+          </tr>
+          <tr>
+            <td>
+              <div style="display: flex; flex-direction: column; align-items: start;">
+                <div class="fr-text--md">Liste des travaux antérieurs</div><span class="fr-text--xs" style="max-width: 300px;">Liste des travaux auxquels le demandeur a participé au cours des 3 dernières années</span>
+              </div>
+            </td>
+            <td>
+              <div class="fr-select-group">
+                <!----><select class="fr-select" id="select_58" aria-label="Choix du document pour [object Object]" name="select_58">
+                  <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                  <option disabled="" hidden="" value="">Selectionnez une option</option>
+                </select>
+              </div>
+            </td>
+            <td style="text-align: right;">
+              <!---->
+            </td>
+          </tr>
+          <tr>
+            <td>
+              <div style="display: flex; flex-direction: column; align-items: start;">
+                <div class="fr-text--md">Justificatif d’adhésion à la charte des bonnes pratiques</div>
+                <!---->
+              </div>
+            </td>
+            <td>
+              <div class="fr-select-group">
+                <!----><select class="fr-select" id="select_661" aria-label="Choix du document pour [object Object]" name="select_661">
+                  <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                  <option disabled="" hidden="" value="">Selectionnez une option</option>
+                </select>
+              </div>
+            </td>
+            <td style="text-align: right;">
+              <!---->
+            </td>
+          </tr>
+          <tr>
+            <td>
+              <div style="display: flex; flex-direction: column; align-items: start;">
+                <div class="fr-text--md">3 derniers bilans et comptes de résultats</div><span class="fr-text--xs" style="max-width: 300px;">Ces pièces sont demandées au titre de la justification des capacités financières du demandeur (décret 2001-204, art. 7)</span>
+              </div>
+            </td>
+            <td>
+              <div class="fr-select-group">
+                <!----><select class="fr-select" id="select_684" aria-label="Choix du document pour [object Object]" name="select_684">
+                  <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                  <option disabled="" hidden="" value="">Selectionnez une option</option>
+                </select>
+              </div>
+            </td>
+            <td style="text-align: right;">
+              <!---->
+            </td>
+          </tr>
+          <tr>
+            <td>
+              <div style="display: flex; flex-direction: column; align-items: start;">
+                <div class="fr-text--md">Références professionnelles </div><span class="fr-text--xs" style="max-width: 300px;">Références professionnelles du demandeur ou celles des cadres chargés du suivi et de la conduite des travauxCes pièces sont demandées au titre la justification des capacités techniques du demandeur (décret 2001-204, art. 6).
  
- S’il s’agit d’une personne morale, références professionnelles du ou des cadres chargés du suivi et de la conduite des travaux</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666"><use href="#icon-help"></use></svg></div></span><span class="bold cap-first small ml-xs"><span class="bg-warning py-xxs px-xs rnd-xs color-bg box">Manquant</span></span>
-        </div>
-        <div class="tablet-blob-2-3">
-          <div class="flex mb-s"><select class="p-s">
-              <option></option>
-              <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
-            </select>
-            <!---->
-          </div>
-        </div>
-      </div>
-    </div>
-    <div>
-      <div class="tablet-blobs">
-        <div class="tablet-blob-1-3 flex flex-center">
-          <h5 class="mt-s">Déclarations bancaires ou cautions appropriées</h5><span><div class="_tooltip_4f6ea8 ml-xs"><h6 class="_tooltip-content_4f6ea8">Ces pièces sont demandées au titre de la justification des capacités financières du demandeur (décret 2001-204, art. 7)</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666"><use href="#icon-help"></use></svg></div></span><span class="bold cap-first small ml-xs"><span class="bg-warning py-xxs px-xs rnd-xs color-bg box">Manquant</span></span>
-        </div>
-        <div class="tablet-blob-2-3">
-          <div class="flex mb-s"><select class="p-s">
-              <option></option>
-              <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
-            </select>
-            <!---->
-          </div>
-        </div>
-      </div>
-    </div>
-    <div>
-      <div class="tablet-blobs">
-        <div class="tablet-blob-1-3">
-          <h5 class="mt-s">Ajouter un document d'entreprise existant</h5>
-        </div>
-        <div class="tablet-blob-2-3"><select class="p-s mb-s">
-            <option disabled="" value="undefined">Sélectionner un type de document d'entreprise</option>
-            <option disabled="" value="atf">Attestation fiscale</option>
-            <option value="sir">Avis de situation au répertoire Sirene</option>
-            <option value="cur">Curriculum vitae</option>
-            <option value="idm">Identification de matériel</option>
-            <option disabled="" value="jid">Justificatif d’identité</option>
-            <option disabled="" value="jct">Justificatif des capacités techniques</option>
-            <option value="kbi">Kbis</option>
-            <option value="jcf">Justificatif des capacités financières</option>
-            <option disabled="" value="lis">Liste des travaux antérieurs</option>
-            <option disabled="" value="jac">Justificatif d’adhésion à la charte des bonnes pratiques</option>
-            <option disabled="" value="bil">3 derniers bilans et comptes de résultats</option>
-            <option disabled="" value="ref">Références professionnelles </option>
-            <option disabled="" value="deb">Déclarations bancaires ou cautions appropriées</option>
-          </select></div>
-      </div>
+ S’il s’agit d’une personne morale, références professionnelles du ou des cadres chargés du suivi et de la conduite des travaux</span>
+              </div>
+            </td>
+            <td>
+              <div class="fr-select-group">
+                <!----><select class="fr-select" id="select_624" aria-label="Choix du document pour [object Object]" name="select_624">
+                  <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                  <option disabled="" hidden="" value="">Selectionnez une option</option>
+                </select>
+              </div>
+            </td>
+            <td style="text-align: right;">
+              <!---->
+            </td>
+          </tr>
+          <tr>
+            <td>
+              <div style="display: flex; flex-direction: column; align-items: start;">
+                <div class="fr-text--md">Déclarations bancaires ou cautions appropriées</div><span class="fr-text--xs" style="max-width: 300px;">Ces pièces sont demandées au titre de la justification des capacités financières du demandeur (décret 2001-204, art. 7)</span>
+              </div>
+            </td>
+            <td>
+              <div class="fr-select-group">
+                <!----><select class="fr-select" id="select_267" aria-label="Choix du document pour [object Object]" name="select_267">
+                  <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                  <option disabled="" hidden="" value="">Selectionnez une option</option>
+                </select>
+              </div>
+            </td>
+            <td style="text-align: right;">
+              <!---->
+            </td>
+          </tr>
+          <tr>
+            <td>
+              <div class="fr-select-group">
+                <!----><select class="fr-select" id="select_119" aria-label="Ajouter un nouveau type de document" name="select_119">
+                  <option value="atf">Attestation fiscale</option>
+                  <option value="sir">Avis de situation au répertoire Sirene</option>
+                  <option value="cur">Curriculum vitae</option>
+                  <option value="idm">Identification de matériel</option>
+                  <option value="jid">Justificatif d’identité</option>
+                  <option value="jct">Justificatif des capacités techniques</option>
+                  <option value="kbi">Kbis</option>
+                  <option value="jcf">Justificatif des capacités financières</option>
+                  <option value="lis">Liste des travaux antérieurs</option>
+                  <option value="jac">Justificatif d’adhésion à la charte des bonnes pratiques</option>
+                  <option value="bil">3 derniers bilans et comptes de résultats</option>
+                  <option value="ref">Références professionnelles </option>
+                  <option value="deb">Déclarations bancaires ou cautions appropriées</option>
+                  <option disabled="" hidden="" value="">Selectionnez une option</option>
+                </select>
+              </div>
+            </td>
+            <td></td>
+            <td></td>
+          </tr>
+        </tbody>
+      </table>
     </div>
   </div>
+  <!---->
 </div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/entreprises-documents-edit.stories_snapshots_Loading.html b/packages/ui/src/components/etape/entreprises-documents-edit.stories_snapshots_Loading.html
index 281c6866c375f1bf0fe276f533667d5b5fd833f0..6594af26495953ec894f7e2e34367c7a711f0598 100644
--- a/packages/ui/src/components/etape/entreprises-documents-edit.stories_snapshots_Loading.html
+++ b/packages/ui/src/components/etape/entreprises-documents-edit.stories_snapshots_Loading.html
@@ -1 +1,6 @@
-<div></div>
\ No newline at end of file
+<div class="dsfr">
+  <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
+    <!---->
+    <div class="_spinner_3306d0"></div>
+  </div>
+</div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/entreprises-documents-edit.tsx b/packages/ui/src/components/etape/entreprises-documents-edit.tsx
index 3c20e56e9b130f6ee3b8725f5d0e37b22f756c1e..0d20d3a77d0dacb981a6116da6a60dff8a999f61 100644
--- a/packages/ui/src/components/etape/entreprises-documents-edit.tsx
+++ b/packages/ui/src/components/etape/entreprises-documents-edit.tsx
@@ -1,11 +1,9 @@
-import { caminoDefineComponent, isEventWithTarget } from '@/utils/vue-tsx-utils'
-import { HelpTooltip } from '../_ui/help-tooltip'
+import { caminoDefineComponent } from '@/utils/vue-tsx-utils'
 import { dateFormat } from '@/utils'
-import { Tag } from '../_ui/tag'
-import { computed, onMounted, ref, watch } from 'vue'
+import { DeepReadonly, FunctionalComponent, computed, onMounted, ref, watch } from 'vue'
 import { EntrepriseDocument, EntrepriseDocumentId, EntrepriseId, entrepriseDocumentIdValidator, isEntrepriseId } from 'camino-common/src/entreprise'
 import { DocumentsTypes, EntrepriseDocumentType, EntrepriseDocumentTypeId } from 'camino-common/src/static/documentsTypes'
-import { getEntries, getKeys, isNotNullNorUndefined, isNullOrUndefined } from 'camino-common/src/typescript-tools'
+import { getEntries, getEntriesHardcore, getKeys, isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty, isNullOrUndefined, map, stringArrayEquals } from 'camino-common/src/typescript-tools'
 import { AddEntrepriseDocumentPopup } from '../entreprise/add-entreprise-document-popup'
 import { AsyncData, getDownloadRestRoute } from '@/api/client-rest'
 import { TitreTypeId } from 'camino-common/src/static/titresTypes'
@@ -14,9 +12,11 @@ import { EtapeTypeId } from 'camino-common/src/static/etapesTypes'
 import { getEntrepriseDocuments } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/entrepriseDocuments'
 import { EtapeId } from 'camino-common/src/etape'
 import { LoadingElement } from '../_ui/functional-loader'
-import { ButtonIcon } from '../_ui/button-icon'
 import { ApiClient } from '@/api/api-client'
 import { Alert } from '../_ui/alert'
+import { DsfrButtonIcon, DsfrLink } from '../_ui/dsfr-button'
+import { DsfrSelect, Item } from '../_ui/dsfr-select'
+import { SelectedEntrepriseDocument } from 'camino-common/src/permissions/etape-form'
 
 type Entreprise = { id: EntrepriseId; nom: string }
 
@@ -26,9 +26,9 @@ interface Props {
     demarcheTypeId: DemarcheTypeId
     etapeTypeId: EtapeTypeId
   }
-  completeUpdate: (etapeEntrepriseDocumentIds: EntrepriseDocumentId[], complete: boolean) => void
-  entreprises: Entreprise[]
-  etapeId: EtapeId
+  completeUpdate: (etapeEntrepriseDocuments: SelectedEntrepriseDocument[]) => void
+  entreprises: DeepReadonly<Entreprise[]>
+  etapeId: EtapeId | null
   apiClient: Pick<ApiClient, 'creerEntrepriseDocument' | 'getEntrepriseDocuments' | 'getEtapeEntrepriseDocuments' | 'uploadTempDocument'>
 }
 
@@ -44,9 +44,12 @@ export const EntrepriseDocumentsEdit = caminoDefineComponent<Props>(['completeUp
   const loadEtapeEntrepriseDocuments = async () => {
     etapeEntrepriseDocumentIds.value = { status: 'LOADING' }
     try {
-      const etapeDocuments = await props.apiClient.getEtapeEntrepriseDocuments(props.etapeId)
-
-      etapeEntrepriseDocumentIds.value = { status: 'LOADED', value: etapeDocuments.map(({ id }) => id) }
+      if (isNotNullNorUndefined(props.etapeId)) {
+        const etapeDocuments = await props.apiClient.getEtapeEntrepriseDocuments(props.etapeId)
+        etapeEntrepriseDocumentIds.value = { status: 'LOADED', value: etapeDocuments.map(({ id }) => id) }
+      } else {
+        etapeEntrepriseDocumentIds.value = { status: 'LOADED', value: [] }
+      }
     } catch (e: any) {
       console.error('error', e)
       etapeEntrepriseDocumentIds.value = {
@@ -80,7 +83,7 @@ export const EntrepriseDocumentsEdit = caminoDefineComponent<Props>(['completeUp
 const InternalEntrepriseDocumentsEdit = caminoDefineComponent<Props & { etapeEntrepriseDocumentIds: EntrepriseDocumentId[] }>(
   ['completeUpdate', 'tde', 'entreprises', 'etapeId', 'apiClient', 'etapeEntrepriseDocumentIds'],
   props => {
-    const entreprisesEntrepriseDocumentsIndex = ref<Record<EntrepriseId, { entreprisedocuments: InnerEntrepriseDocument[] }>>({})
+    const entreprisesEntrepriseDocumentsIndex = ref<Record<EntrepriseId, InnerEntrepriseDocument[]>>({})
     const etapeEntrepriseDocumentIds = ref<EntrepriseDocumentId[]>(props.etapeEntrepriseDocumentIds)
 
     const addPopup = ref<{ open: false } | { open: true; entrepriseId: EntrepriseId; entrepriseDocumentTypeId: EntrepriseDocumentTypeId }>({ open: false })
@@ -104,7 +107,9 @@ const InternalEntrepriseDocumentsEdit = caminoDefineComponent<Props & { etapeEnt
           loadingEntrepriseDocuments[entreprise.id] = await props.apiClient.getEntrepriseDocuments(entreprise.id)
         }
         entrepriseDocuments.value = { status: 'LOADED', value: loadingEntrepriseDocuments }
-        await reset()
+
+        indexReset()
+        entreprisedocumentsReset()
       } catch (e: any) {
         console.error('error', e)
         entrepriseDocuments.value = {
@@ -114,40 +119,13 @@ const InternalEntrepriseDocumentsEdit = caminoDefineComponent<Props & { etapeEnt
       }
     }
 
-    const complete = computed<boolean>(() => {
-      const entreprisedocuments: EntrepriseDocument[] = []
-      const documents = entrepriseDocuments.value
-      if (documents.status === 'LOADED') {
-        props.entreprises.forEach(entreprise => {
-          documents.value[entreprise.id]?.forEach(document => {
-            if (etapeEntrepriseDocumentIds.value.some(id => id === document.id)) {
-              entreprisedocuments.push(document)
-            }
-          })
-        })
-
-        return tdeEntrepriseDocuments.value.every(
-          tdeEntrepriseDocument => tdeEntrepriseDocument.optionnel || entreprisedocuments.find(({ entreprise_document_type_id }) => entreprise_document_type_id === tdeEntrepriseDocument.id)
-        )
-      }
-
-      return false
-    })
-
-    const reset = async () => {
-      indexReset()
-      entreprisedocumentsReset()
-    }
-
     const indexReset = () => {
       const entrepriseDocumentsLoaded = entrepriseDocuments.value
       if (entrepriseDocumentsLoaded.status === 'LOADED') {
         entreprisesEntrepriseDocumentsIndex.value = {}
 
         props.entreprises.forEach(e => {
-          entreprisesEntrepriseDocumentsIndex.value[e.id] = {
-            entreprisedocuments: [],
-          }
+          entreprisesEntrepriseDocumentsIndex.value[e.id] = []
 
           tdeEntrepriseDocuments.value.forEach(type => {
             const documents = entrepriseDocumentsLoaded.value[e.id]?.filter(d => d.entreprise_document_type_id === type.id) ?? []
@@ -157,14 +135,14 @@ const InternalEntrepriseDocumentsEdit = caminoDefineComponent<Props & { etapeEnt
 
             if (entrepriseDocumentIds.length) {
               entrepriseDocumentIds.forEach(id => {
-                entreprisesEntrepriseDocumentsIndex.value[e.id].entreprisedocuments.push({
+                entreprisesEntrepriseDocumentsIndex.value[e.id].push({
                   id,
                   entrepriseDocumentType: type,
                   documents,
                 })
               })
             } else if (!type.optionnel) {
-              entreprisesEntrepriseDocumentsIndex.value[e.id].entreprisedocuments.push({
+              entreprisesEntrepriseDocumentsIndex.value[e.id].push({
                 id: '',
                 entrepriseDocumentType: type,
                 documents,
@@ -175,168 +153,158 @@ const InternalEntrepriseDocumentsEdit = caminoDefineComponent<Props & { etapeEnt
       }
     }
 
-    const entreprisedocumentAdd = (entrepriseId: EntrepriseId, event: Event) => {
-      if (isEventWithTarget(event) && entrepriseDocuments.value.status === 'LOADED') {
-        const typeId = event.target.value
-        const type = tdeEntrepriseDocuments.value.find(jt => jt.id === typeId)
-        const documents = entrepriseDocuments.value.value[entrepriseId]?.filter(d => d.entreprise_document_type_id === typeId) ?? []
-
-        if (type) {
-          entreprisesEntrepriseDocumentsIndex.value[entrepriseId].entreprisedocuments.push({
-            id: '',
-            entrepriseDocumentType: type,
-            documents,
-          })
-        }
-      }
-    }
-
     const completeUpdate = () => {
-      props.completeUpdate(etapeEntrepriseDocumentIds.value, complete.value)
+      props.completeUpdate(
+        getEntriesHardcore(entreprisesEntrepriseDocumentsIndex.value).flatMap(([entrepriseId, innerEntrepriseDocument]) =>
+          innerEntrepriseDocument
+            .filter((document): document is Omit<InnerEntrepriseDocument, 'id'> & { id: EntrepriseDocumentId } => isNotNullNorUndefinedNorEmpty(document.id))
+            .map(innerDocument => ({ entrepriseId, id: innerDocument.id, documentTypeId: innerDocument.entrepriseDocumentType.id }))
+        )
+      )
     }
 
-    const entreprisedocumentsUpdate = (entreprisedocument: InnerEntrepriseDocument, entrepriseId: EntrepriseId, event: Event) => {
-      if (isEventWithTarget(event)) {
-        if (event.target.value === 'newDocument') {
-          addPopup.value = { open: true, entrepriseId, entrepriseDocumentTypeId: entreprisedocument.entrepriseDocumentType.id }
-        } else {
-          entreprisedocument.id = entrepriseDocumentIdValidator.parse(event.target.value)
-          entreprisedocumentsReset()
-          completeUpdate()
-        }
+    const entreprisedocumentsUpdate = (entreprisedocument: InnerEntrepriseDocument, entrepriseId: EntrepriseId) => (documentId: EntrepriseDocumentId | 'newDocument' | null) => {
+      if (documentId === 'newDocument') {
+        addPopup.value = { open: true, entrepriseId, entrepriseDocumentTypeId: entreprisedocument.entrepriseDocumentType.id }
+      } else {
+        entreprisedocument.id = documentId ?? ''
+        entreprisedocumentsReset()
       }
     }
 
     const entreprisedocumentRemove = (entrepriseId: EntrepriseId, index: number) => {
-      const documentToRemove = entreprisesEntrepriseDocumentsIndex.value[entrepriseId].entreprisedocuments[index]
-      const docsOfSameTypeFound = entreprisesEntrepriseDocumentsIndex.value[entrepriseId].entreprisedocuments.filter(
-        ({ entrepriseDocumentType }) => entrepriseDocumentType === documentToRemove.entrepriseDocumentType
-      )
+      const documentToRemove = entreprisesEntrepriseDocumentsIndex.value[entrepriseId][index]
+      const docsOfSameTypeFound = entreprisesEntrepriseDocumentsIndex.value[entrepriseId].filter(({ entrepriseDocumentType }) => entrepriseDocumentType === documentToRemove.entrepriseDocumentType)
       if (docsOfSameTypeFound.length > 1) {
-        entreprisesEntrepriseDocumentsIndex.value[entrepriseId].entreprisedocuments.splice(index, 1)
+        entreprisesEntrepriseDocumentsIndex.value[entrepriseId].splice(index, 1)
       } else {
-        entreprisesEntrepriseDocumentsIndex.value[entrepriseId].entreprisedocuments[index].id = ''
+        entreprisesEntrepriseDocumentsIndex.value[entrepriseId][index].id = ''
       }
 
       entreprisedocumentsReset()
-      completeUpdate()
     }
 
     const entreprisedocumentsReset = () => {
       etapeEntrepriseDocumentIds.value = []
 
       getKeys(entreprisesEntrepriseDocumentsIndex.value, isEntrepriseId).forEach(eId => {
-        entreprisesEntrepriseDocumentsIndex.value[eId].entreprisedocuments.forEach(({ id }) => {
+        entreprisesEntrepriseDocumentsIndex.value[eId].forEach(({ id }) => {
           if (isNullOrUndefined(id) || id === '') return
 
           etapeEntrepriseDocumentIds.value.push(id)
         })
       })
+      completeUpdate()
     }
 
-    watch(() => complete.value, completeUpdate)
     watch(
       () => props.entreprises,
-      async () => {
-        await loadEntrepriseDocuments()
-      },
-      { deep: true }
+      async (old, newValue) => {
+        if (
+          !stringArrayEquals(
+            old.map(({ id }) => id),
+            newValue.map(({ id }) => id)
+          )
+        ) {
+          await loadEntrepriseDocuments()
+        }
+      }
     )
-    watch(() => props.tde, reset, { deep: true })
-
     onMounted(async () => {
       await loadEntrepriseDocuments()
-      completeUpdate()
     })
 
+    const addEntrepriseDocumentType = (entrepriseId: EntrepriseId) => (entrepriseDocumentTypeId: EntrepriseDocumentTypeId | null) => {
+      const entrepriseDocumentType = tdeEntrepriseDocuments.value.find(({ id }) => id === entrepriseDocumentTypeId)
+      if (isNotNullNorUndefined(entrepriseDocumentType)) {
+        const entrepriseDocumentsLoaded = entrepriseDocuments.value
+        if (entrepriseDocumentsLoaded.status === 'LOADED') {
+          const documents = entrepriseDocumentsLoaded.value[entrepriseId]?.filter(d => d.entreprise_document_type_id === entrepriseDocumentTypeId) ?? []
+
+          entreprisesEntrepriseDocumentsIndex.value[entrepriseId].push({ id: '', documents, entrepriseDocumentType })
+        }
+      }
+    }
+
     return () => (
       <>
         {props.entreprises.length ? (
           <div>
             {getEntries(entreprisesEntrepriseDocumentsIndex.value, isEntrepriseId).map(([eId, e]) => (
-              <div key={eId} class="mb-xs">
-                <div class="flex">
-                  <h4>{entreprisesNoms.value[eId]}</h4>
-                </div>
-
-                {e.entreprisedocuments.map((j, index) => (
-                  <div key={j.id}>
-                    <div class="tablet-blobs">
-                      <div class="tablet-blob-1-3 flex flex-center">
-                        {isNotNullNorUndefined(j.id) && j.id !== '' ? (
-                          <a
-                            class="mt-s"
-                            href={getDownloadRestRoute('/fichiers/:documentId', { documentId: j.id })}
-                            title={`Télécharger le document ${j.entrepriseDocumentType.nom} - nouvelle fenêtre`}
-                            target="_blank"
-                          >
-                            {j.entrepriseDocumentType.nom}
-                          </a>
-                        ) : (
-                          <h5 class="mt-s">{j.entrepriseDocumentType.nom}</h5>
-                        )}
-                        <span>
-                          {isNotNullNorUndefined(j.entrepriseDocumentType) && isNotNullNorUndefined(j.entrepriseDocumentType.description) ? (
-                            <HelpTooltip text={j.entrepriseDocumentType.description} class="ml-xs" />
-                          ) : null}
-                        </span>
-                        {isNotNullNorUndefined(j.id) && j.id !== '' ? null : <Tag mini color="bg-warning" class="ml-xs" text="Manquant" />}
-                      </div>
-                      <div class="tablet-blob-2-3">
-                        <div class="flex mb-s">
-                          <select class="p-s" value={j.id} onChange={event => entreprisedocumentsUpdate(j, eId, event)}>
-                            {j.documents.length ? (
-                              <>
-                                {j.documents.map(d => (
-                                  <option key={d.id} value={d.id} disabled={etapeEntrepriseDocumentIds.value.some(id => id === d.id)}>
-                                    {DocumentsTypes[d.entreprise_document_type_id].nom} : {d.description} ({dateFormat(d.date)})
-                                  </option>
-                                ))}
-                              </>
+              <div key={eId} class="fr-table fr-mb-0">
+                <table style={{ display: 'table' }}>
+                  <caption>{entreprisesNoms.value[eId]}</caption>
+                  <thead>
+                    <tr>
+                      <th scope="col">Nom</th>
+                      <th scope="col"></th>
+                      <th scope="col" style={{ display: 'flex', justifyContent: 'end' }}>
+                        Action
+                      </th>
+                    </tr>
+                  </thead>
+
+                  <tbody>
+                    {e.map((j, index) => (
+                      <tr key={j.id}>
+                        <td>
+                          <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'start' }}>
+                            {isNotNullNorUndefined(j.id) && j.id !== '' ? (
+                              <DsfrLink
+                                icon={null}
+                                href={getDownloadRestRoute('/download/entrepriseDocuments/:documentId', { documentId: j.id })}
+                                title={`Télécharger le document ${j.entrepriseDocumentType.nom} - nouvelle fenêtre`}
+                                target="_blank"
+                                label={j.entrepriseDocumentType.nom}
+                              />
                             ) : (
-                              <option></option>
+                              <div class="fr-text--md">{j.entrepriseDocumentType.nom}</div>
                             )}
-                            <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
-                          </select>
-
+                            {isNotNullNorUndefined(j.entrepriseDocumentType.description) ? (
+                              <span class="fr-text--xs" style={{ maxWidth: '300px' }}>
+                                {j.entrepriseDocumentType.description}
+                              </span>
+                            ) : null}
+                          </div>
+                        </td>
+                        <td>
+                          <EntrepriseSelect entrepriseDocuments={j} onEntrepriseDocumentSelect={entreprisedocumentsUpdate(j, eId)} etapeEntrepriseDocumentIds={etapeEntrepriseDocumentIds.value} />
+                        </td>
+                        <td style={{ textAlign: 'right' }}>
                           {isNotNullNorUndefined(j.id) && j.id !== '' ? (
-                            <div class="flex-right flex flex-center ml-s">
-                              <ButtonIcon class="btn-border py-s px-m rnd-xs" onClick={() => entreprisedocumentRemove(eId, index)} icon="delete" title="Supprime le document d’entreprise" />
-                            </div>
+                            <DsfrButtonIcon
+                              icon="fr-icon-delete-bin-line"
+                              class="fr-ml-1w"
+                              title={`Supprimer le document d’entreprise ${j.entrepriseDocumentType.nom}`}
+                              onClick={() => entreprisedocumentRemove(eId, index)}
+                              buttonType="secondary"
+                              buttonSize="sm"
+                            />
                           ) : null}
-                        </div>
-                      </div>
-                    </div>
-                  </div>
-                ))}
-                <div>
-                  <div class="tablet-blobs">
-                    <div class="tablet-blob-1-3">
-                      <h5 class="mt-s">Ajouter un document d'entreprise existant</h5>
-                    </div>
-                    <div class="tablet-blob-2-3">
-                      <select class="p-s mb-s" value="undefined" onChange={event => entreprisedocumentAdd(eId, event)}>
-                        <option value="undefined" disabled>
-                          Sélectionner un type de document d'entreprise
-                        </option>
-                        {tdeEntrepriseDocuments.value.map(jt => (
-                          <option
-                            key={jt.id}
-                            value={jt.id}
-                            disabled={e.entreprisedocuments.some(entreprisedocument => jt.id === entreprisedocument.entrepriseDocumentType.id && entreprisedocument.id === '')}
-                          >
-                            {jt.nom}
-                          </option>
-                        ))}
-                      </select>
-                    </div>
-                  </div>
-                </div>
+                        </td>
+                      </tr>
+                    ))}
+                    {isNotNullNorUndefinedNorEmpty(tdeEntrepriseDocuments.value) ? (
+                      <tr>
+                        <td>
+                          <DsfrSelect
+                            items={map(tdeEntrepriseDocuments.value, ({ id, nom }) => ({ id, label: nom }))}
+                            legend={{ main: 'Ajouter un nouveau type de document', visible: false }}
+                            valueChanged={addEntrepriseDocumentType(eId)}
+                            initialValue={null}
+                          />
+                        </td>
+                        <td></td>
+                        <td></td>
+                      </tr>
+                    ) : null}
+                  </tbody>
+                </table>
               </div>
             ))}
           </div>
         ) : (
-          <Alert title="Aucun titulaire ou amodiataire associé à cette étape." type="warning" small />
+          <Alert class="fr-mt-2w" title="Aucun titulaire ou amodiataire associé à cette étape." type="warning" small />
         )}
         {addPopup.value.open ? (
           <AddEntrepriseDocumentPopup
@@ -350,7 +318,32 @@ const InternalEntrepriseDocumentsEdit = caminoDefineComponent<Props & { etapeEnt
                 const newDocumentId = await props.apiClient.creerEntrepriseDocument(entrepriseId, entrepriseDocumentInput, tempDocumentName)
 
                 etapeEntrepriseDocumentIds.value.push(newDocumentId)
-                await loadEntrepriseDocuments()
+                const documentsToUpdate = entreprisesEntrepriseDocumentsIndex.value[entrepriseId].filter(({ entrepriseDocumentType }) => entrepriseDocumentType.id === entrepriseDocumentInput.typeId)
+
+                if (isNotNullNorUndefined(documentsToUpdate) && documentsToUpdate.length > 0) {
+                  documentsToUpdate.forEach(({ documents }) =>
+                    documents.push({
+                      id: newDocumentId,
+                      description: entrepriseDocumentInput.description,
+                      date: entrepriseDocumentInput.date,
+                      entreprise_document_type_id: entrepriseDocumentInput.typeId,
+                      entreprise_id: entrepriseId,
+                      can_delete_document: true,
+                    })
+                  )
+
+                  if (documentsToUpdate.length === 1) {
+                    documentsToUpdate[0].id = newDocumentId
+                  } else {
+                    const documentNotSet = documentsToUpdate.find(({ id }) => id === '')
+                    if (isNotNullNorUndefined(documentNotSet)) {
+                      documentNotSet.id = newDocumentId
+                    } else {
+                      documentsToUpdate[0].id = newDocumentId
+                    }
+                  }
+                }
+
                 completeUpdate()
 
                 return newDocumentId
@@ -363,3 +356,33 @@ const InternalEntrepriseDocumentsEdit = caminoDefineComponent<Props & { etapeEnt
     )
   }
 )
+
+const EntrepriseSelect: FunctionalComponent<{
+  entrepriseDocuments: InnerEntrepriseDocument
+  etapeEntrepriseDocumentIds: EntrepriseDocumentId[]
+  onEntrepriseDocumentSelect: (id: EntrepriseDocumentId | 'newDocument' | null) => void
+}> = props => {
+  const options: Item<EntrepriseDocumentId | 'newDocument'>[] = [
+    ...props.entrepriseDocuments.documents.map(d => ({
+      id: d.id,
+      label: `${DocumentsTypes[d.entreprise_document_type_id].nom} : ${d.description} (${dateFormat(d.date)})`,
+      disabled: props.etapeEntrepriseDocumentIds.some(id => id === d.id),
+    })),
+    { id: 'newDocument', label: "Ajouter un nouveau document d'entreprise", disabled: false },
+  ]
+
+  const legend = `Choix du document pour ${props.entrepriseDocuments.entrepriseDocumentType}`
+
+  return (
+    <>
+      {isNotNullNorUndefinedNorEmpty(options) ? (
+        <DsfrSelect
+          initialValue={props.entrepriseDocuments.id === '' ? entrepriseDocumentIdValidator.parse('') : props.entrepriseDocuments.id}
+          items={options}
+          legend={{ main: legend, visible: false }}
+          valueChanged={props.onEntrepriseDocumentSelect}
+        />
+      ) : null}
+    </>
+  )
+}
diff --git a/packages/ui/src/components/etape/etape-api-client.ts b/packages/ui/src/components/etape/etape-api-client.ts
index 56b20e09ed9305d67e8c08e79fd65ad8d0c5593c..e0c17f34a6b62a1822b93726b49e36efff89b265 100644
--- a/packages/ui/src/components/etape/etape-api-client.ts
+++ b/packages/ui/src/components/etape/etape-api-client.ts
@@ -1,12 +1,204 @@
+import { apiGraphQLFetch } from '@/api/_client'
 import { deleteWithJson, getWithJson, putWithJson } from '@/api/client-rest'
-import { CaminoDate } from 'camino-common/src/date'
-import { DemarcheId } from 'camino-common/src/demarche'
-import { EtapeId, EtapeTypeEtapeStatutWithMainStep } from 'camino-common/src/etape'
+import { CaminoDate, caminoDateValidator } from 'camino-common/src/date'
+import { DemarcheId, demarcheIdValidator, demarcheSlugValidator } from 'camino-common/src/demarche'
+import { tempDocumentNameValidator } from 'camino-common/src/document'
+import { entrepriseDocumentIdValidator, entrepriseIdValidator } from 'camino-common/src/entreprise'
+import {
+  EtapeId,
+  EtapeIdOrSlug,
+  EtapeTypeEtapeStatutWithMainStep,
+  EtapeWithHeritage,
+  GetEtapeDocumentsByEtapeId,
+  documentComplementaireAslEtapeDocumentModificationValidator,
+  documentComplementaireDaeEtapeDocumentModificationValidator,
+  etapeDocumentIdValidator,
+  etapeDocumentModificationValidator,
+  etapeIdValidator,
+  etapeSlugValidator,
+} from 'camino-common/src/etape'
+import { km2Validator } from 'camino-common/src/number'
+import { featureCollectionForagesValidator, featureCollectionPointsValidator, featureMultiPolygonValidator } from 'camino-common/src/perimetre'
+import { demarcheTypeIdValidator } from 'camino-common/src/static/demarchesTypes'
+import { documentTypeIdValidator } from 'camino-common/src/static/documentsTypes'
+import { etapeStatutIdValidator } from 'camino-common/src/static/etapesStatuts'
+import { EtapeTypeId, etapeTypeIdValidator } from 'camino-common/src/static/etapesTypes'
+import { geoSystemeIdValidator } from 'camino-common/src/static/geoSystemes'
+import { substanceLegaleIdValidator } from 'camino-common/src/static/substancesLegales'
+import { titreTypeIdValidator } from 'camino-common/src/static/titresTypes'
+import { DeepReadonly } from 'camino-common/src/typescript-tools'
+import { titreIdValidator, titreSlugValidator } from 'camino-common/src/validators/titres'
+import { nullToDefault } from 'camino-common/src/zod-tools'
+import gql from 'graphql-tag'
+import { z } from 'zod'
 
+const contenuValidator = z
+  .record(z.string(), z.record(z.string(), z.union([caminoDateValidator, z.string(), z.number(), z.boolean(), z.array(z.string())]).nullable()))
+  .nullable()
+  .transform(nullToDefault({}))
+const dureeValidator = z.number().nullable()
+const entrepriseValidator = z.array(
+  z.object({
+    id: entrepriseIdValidator,
+    operateur: z.boolean().nullable(),
+  })
+)
+
+const defaultHeritageProps = {
+  dateDebut: { actif: false },
+  dateFin: { actif: false },
+  duree: { actif: false },
+  perimetre: { actif: false },
+  substances: { actif: false },
+  titulaires: { actif: false },
+  amodiataires: { actif: false },
+}
+
+const heritagePropsValidator = z
+  .object({
+    duree: z.object({ actif: z.boolean(), etape: z.object({ typeId: etapeTypeIdValidator, date: caminoDateValidator, duree: dureeValidator }).nullable() }),
+    dateDebut: z.object({ actif: z.boolean(), etape: z.object({ typeId: etapeTypeIdValidator, date: caminoDateValidator, dateDebut: caminoDateValidator.nullable() }).nullable() }),
+    dateFin: z.object({ actif: z.boolean(), etape: z.object({ typeId: etapeTypeIdValidator, date: caminoDateValidator, dateFin: caminoDateValidator.nullable() }).nullable() }),
+    substances: z.object({ actif: z.boolean(), etape: z.object({ typeId: etapeTypeIdValidator, date: caminoDateValidator, substances: z.array(substanceLegaleIdValidator) }).nullable() }),
+    titulaires: z.object({ actif: z.boolean(), etape: z.object({ typeId: etapeTypeIdValidator, date: caminoDateValidator, titulaires: entrepriseValidator }).nullable() }),
+    amodiataires: z.object({ actif: z.boolean(), etape: z.object({ typeId: etapeTypeIdValidator, date: caminoDateValidator, amodiataires: entrepriseValidator }).nullable() }),
+    perimetre: z.object({
+      actif: z.boolean(),
+      etape: z
+        .object({
+          typeId: etapeTypeIdValidator,
+          date: caminoDateValidator,
+          geojson4326Perimetre: featureMultiPolygonValidator.nullable(),
+          geojson4326Points: featureCollectionPointsValidator.nullable(),
+          geojsonOriginePoints: featureCollectionPointsValidator.nullable(),
+          geojsonOriginePerimetre: featureMultiPolygonValidator.nullable(),
+          geojsonOrigineGeoSystemeId: geoSystemeIdValidator.nullable(),
+          geojson4326Forages: featureCollectionForagesValidator.nullable(),
+          geojsonOrigineForages: featureCollectionForagesValidator.nullable(),
+          surface: km2Validator.nullable(),
+        })
+        .nullable(),
+    }),
+  })
+  .nullable()
+  .transform(nullToDefault(defaultHeritageProps))
+
+const heritageContenuValidator = z
+  .record(
+    z.string(),
+    z.record(z.string(), z.object({ actif: z.boolean(), etape: z.object({ typeId: etapeTypeIdValidator, date: caminoDateValidator, contenu: contenuValidator }).nullable().optional() }))
+  )
+  .nullable()
+  .transform(nullToDefault({}))
+const heritageValidator = z.object({
+  heritageProps: heritagePropsValidator,
+  heritageContenu: heritageContenuValidator,
+})
+const graphqlEtapeValidator = z.object({
+  id: etapeIdValidator,
+  slug: etapeSlugValidator,
+  titreDemarcheId: demarcheIdValidator,
+  demarche: z.object({
+    slug: demarcheSlugValidator,
+    typeId: demarcheTypeIdValidator,
+    description: z.string().nullable(),
+    titre: z.object({
+      id: titreIdValidator,
+      slug: titreSlugValidator,
+      nom: z.string(),
+      typeId: titreTypeIdValidator,
+    }),
+  }),
+  date: caminoDateValidator,
+  dateDebut: caminoDateValidator.nullable(),
+  dateFin: caminoDateValidator.nullable(),
+  duree: dureeValidator,
+  substances: z.array(substanceLegaleIdValidator),
+  typeId: etapeTypeIdValidator,
+  statutId: etapeStatutIdValidator,
+  titulaires: entrepriseValidator,
+  amodiataires: entrepriseValidator,
+  geojson4326Perimetre: featureMultiPolygonValidator.nullable(),
+  geojson4326Points: featureCollectionPointsValidator.nullable(),
+  geojsonOriginePoints: featureCollectionPointsValidator.nullable(),
+  geojsonOriginePerimetre: featureMultiPolygonValidator.nullable(),
+  geojsonOrigineGeoSystemeId: geoSystemeIdValidator.nullable(),
+  geojson4326Forages: featureCollectionForagesValidator.nullable(),
+  geojsonOrigineForages: featureCollectionForagesValidator.nullable(),
+  surface: km2Validator.nullable(),
+  // Record<string, Record<string, ElementWithValue['value']>>
+  contenu: contenuValidator,
+  notes: z.string().nullable(),
+  heritageProps: heritagePropsValidator,
+  heritageContenu: heritageContenuValidator,
+})
+
+type GraphqlEtape = z.infer<typeof graphqlEtapeValidator>
+
+const graphqlInputHeritagePropValidator = z.object({
+  actif: z.boolean(),
+})
+
+const graphqlInputHeritagePropsValidator = z.object({
+  dateDebut: graphqlInputHeritagePropValidator,
+  dateFin: graphqlInputHeritagePropValidator,
+  duree: graphqlInputHeritagePropValidator,
+  perimetre: graphqlInputHeritagePropValidator,
+  substances: graphqlInputHeritagePropValidator,
+  titulaires: graphqlInputHeritagePropValidator,
+  amodiataires: graphqlInputHeritagePropValidator,
+})
+
+const graphqlEtapeCreationValidator = graphqlEtapeValidator
+  .pick({
+    typeId: true,
+    statutId: true,
+    date: true,
+    duree: true,
+    dateDebut: true,
+    dateFin: true,
+    substances: true,
+    geojson4326Perimetre: true,
+    geojson4326Points: true,
+    geojsonOriginePoints: true,
+    geojsonOriginePerimetre: true,
+    geojsonOrigineForages: true,
+    geojsonOrigineGeoSystemeId: true,
+    titulaires: true,
+    amodiataires: true,
+    notes: true,
+    contenu: true,
+  })
+  .extend({
+    titreDemarcheId: demarcheIdValidator,
+    heritageProps: graphqlInputHeritagePropsValidator,
+    heritageContenu: z.record(z.string(), z.record(z.string(), z.object({ actif: z.boolean() }))),
+    etapeDocuments: z.array(etapeDocumentModificationValidator),
+    entrepriseDocumentIds: z.array(entrepriseDocumentIdValidator),
+  })
+
+type GraphqlEtapeCreation = z.infer<typeof graphqlEtapeCreationValidator>
+
+const graphqlEtapeModificationValidator = graphqlEtapeCreationValidator.extend({
+  id: etapeIdValidator,
+  daeDocument: documentComplementaireDaeEtapeDocumentModificationValidator.nullable(),
+  aslDocument: documentComplementaireAslEtapeDocumentModificationValidator.nullable(),
+})
+type GraphqlEtapeModification = z.infer<typeof graphqlEtapeModificationValidator>
 export interface EtapeApiClient {
   getEtapesTypesEtapesStatuts: (titreDemarcheId: DemarcheId, titreEtapeId: EtapeId | null, date: CaminoDate) => Promise<EtapeTypeEtapeStatutWithMainStep[]>
   deleteEtape: (titreEtapeId: EtapeId) => Promise<void>
   deposeEtape: (titreEtapeId: EtapeId) => Promise<void>
+  getEtapeDocumentsByEtapeId: (etapeId: EtapeId) => Promise<GetEtapeDocumentsByEtapeId>
+  getEtapeHeritagePotentiel: (
+    titreDemarcheId: DemarcheId,
+    date: CaminoDate,
+    typeId: EtapeTypeId,
+    etapeId: EtapeId | null
+  ) => Promise<DeepReadonly<Pick<EtapeWithHeritage, 'heritageProps' | 'heritageContenu'>>>
+  getEtape: (etapeIdOrSlug: EtapeIdOrSlug) => Promise<DeepReadonly<GraphqlEtape>>
+  etapeCreer: (etape: DeepReadonly<GraphqlEtapeCreation>) => Promise<EtapeId>
+  etapeModifier: (etape: DeepReadonly<GraphqlEtapeModification>) => Promise<EtapeId>
 }
 
 export const etapeApiClient: EtapeApiClient = {
@@ -18,4 +210,245 @@ export const etapeApiClient: EtapeApiClient = {
   deposeEtape: async etapeId => {
     await putWithJson('/rest/etapes/:etapeId/depot', { etapeId }, undefined)
   },
+
+  getEtapeDocumentsByEtapeId: async etapeId => getWithJson('/rest/etapes/:etapeId/etapeDocuments', { etapeId }),
+
+  getEtape: async etapeIdOrSlug => {
+    const data = await apiGraphQLFetch(gql`
+      query Etape($id: ID!) {
+        etape(id: $id) {
+          id
+          slug
+          titreDemarcheId
+          demarche {
+            description
+            slug
+            typeId
+            titre {
+              id
+              slug
+              nom
+              typeId
+            }
+          }
+          date
+          dateDebut
+          dateFin
+          duree
+          surface
+          typeId
+          statutId
+          titulaires {
+            id
+            operateur
+          }
+          amodiataires {
+            id
+            operateur
+          }
+          geojson4326Perimetre
+          geojson4326Points
+          geojsonOriginePoints
+          geojsonOriginePerimetre
+          geojsonOrigineGeoSystemeId
+          geojson4326Forages
+          geojsonOrigineForages
+          substances
+          contenu
+          notes
+
+          heritageProps {
+            dateDebut {
+              etape {
+                date
+                typeId
+                dateDebut
+              }
+              actif
+            }
+            dateFin {
+              etape {
+                date
+                typeId
+                dateFin
+              }
+              actif
+            }
+            duree {
+              etape {
+                date
+                typeId
+                duree
+              }
+              actif
+            }
+            perimetre {
+              etape {
+                date
+                typeId
+                geojson4326Perimetre
+                geojson4326Points
+                geojsonOriginePoints
+                geojsonOriginePerimetre
+                geojsonOrigineGeoSystemeId
+                geojson4326Forages
+                geojsonOrigineForages
+                surface
+              }
+              actif
+            }
+            substances {
+              etape {
+                date
+                typeId
+                substances
+              }
+              actif
+            }
+            titulaires {
+              etape {
+                date
+                typeId
+                titulaires {
+                  id
+                  operateur
+                }
+              }
+              actif
+            }
+            amodiataires {
+              etape {
+                date
+                typeId
+                amodiataires {
+                  id
+                  operateur
+                }
+              }
+              actif
+            }
+          }
+
+          heritageContenu
+        }
+      }
+    `)({ id: etapeIdOrSlug })
+    const result = graphqlEtapeValidator.safeParse(data)
+    if (result.success) {
+      return result.data
+    }
+    console.log(result.error.message)
+    return graphqlEtapeValidator.parse(data)
+  },
+  getEtapeHeritagePotentiel: async (titreDemarcheId: DemarcheId, date: CaminoDate, typeId: EtapeTypeId, etapeId: EtapeId | null) => {
+    const data = await apiGraphQLFetch(gql`
+      query EtapeHeritage($titreDemarcheId: ID!, $date: String!, $typeId: ID!, $etapeId: ID) {
+        etapeHeritage(titreDemarcheId: $titreDemarcheId, date: $date, typeId: $typeId, etapeId: $etapeId) {
+          heritageProps {
+            dateDebut {
+              etape {
+                date
+                typeId
+                dateDebut
+              }
+              actif
+            }
+            dateFin {
+              etape {
+                date
+                typeId
+                dateFin
+              }
+              actif
+            }
+            duree {
+              etape {
+                date
+                typeId
+                duree
+              }
+              actif
+            }
+            perimetre {
+              etape {
+                date
+                typeId
+                geojson4326Perimetre
+                geojson4326Points
+                geojsonOriginePoints
+                geojsonOriginePerimetre
+                geojsonOrigineGeoSystemeId
+                geojson4326Forages
+                geojsonOrigineForages
+                surface
+              }
+              actif
+            }
+            substances {
+              etape {
+                date
+                typeId
+                substances
+              }
+              actif
+            }
+            titulaires {
+              etape {
+                date
+                typeId
+                titulaires {
+                  id
+                  operateur
+                }
+              }
+              actif
+            }
+            amodiataires {
+              etape {
+                date
+                typeId
+                amodiataires {
+                  id
+                  operateur
+                }
+              }
+              actif
+            }
+          }
+
+          heritageContenu
+        }
+      }
+    `)({
+      titreDemarcheId,
+      date,
+      typeId,
+      etapeId,
+    })
+    return heritageValidator.parse(data)
+  },
+
+  etapeCreer: async etape => {
+    const result = await apiGraphQLFetch(gql`
+      mutation EtapeCreer($etape: InputEtapeCreation!) {
+        etapeCreer(etape: $etape) {
+          id
+        }
+      }
+    `)({ etape: graphqlEtapeCreationValidator.parse(etape) })
+
+    return result.id
+  },
+
+  etapeModifier: async etape => {
+    const result = await apiGraphQLFetch(gql`
+      mutation EtapeModifier($etape: InputEtapeModification!) {
+        etapeModifier(etape: $etape) {
+          id
+        }
+      }
+    `)({ etape: graphqlEtapeModificationValidator.parse(etape) })
+
+    return result.id
+  },
 }
diff --git a/packages/ui/src/components/etape/etape-documents-edit.stories.tsx b/packages/ui/src/components/etape/etape-documents-edit.stories.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..6aa0bf08401e28a1124efc4eca297a29ecd2f254
--- /dev/null
+++ b/packages/ui/src/components/etape/etape-documents-edit.stories.tsx
@@ -0,0 +1,346 @@
+import { Meta, StoryFn, StoryObj } from '@storybook/vue3'
+import { EtapeDocumentsEdit } from './etape-documents-edit'
+import { EtapeDocument, GetEtapeDocumentsByEtapeId, etapeDocumentIdValidator, etapeIdValidator } from 'camino-common/src/etape'
+import { ApiClient } from '../../api/api-client'
+import { action } from '@storybook/addon-actions'
+import { tempDocumentNameValidator } from 'camino-common/src/document'
+import { testBlankUser } from 'camino-common/src/tests-utils'
+import { useArgs } from '@storybook/preview-api'
+import { entrepriseIdValidator } from 'camino-common/src/entreprise'
+import { caminoDateValidator } from 'camino-common/src/date'
+
+const meta: Meta = {
+  title: 'Components/Etape/EtapeDocumentsEdit',
+  // @ts-ignore
+  component: EtapeDocumentsEdit,
+  decorators: [() => ({ template: '<div class="dsfr"><story/></div>' })],
+}
+export default meta
+
+const documents: EtapeDocument[] = [
+  {
+    id: etapeDocumentIdValidator.parse('id'),
+    etape_document_type_id: 'dep',
+    description: 'Une description',
+    public_lecture: false,
+    entreprises_lecture: false,
+  },
+  {
+    id: etapeDocumentIdValidator.parse('id-car'),
+    etape_document_type_id: 'car',
+    description: 'Une description',
+    public_lecture: false,
+    entreprises_lecture: false,
+  },
+  {
+    id: etapeDocumentIdValidator.parse('id2'),
+    etape_document_type_id: 'doe',
+    description: null,
+    public_lecture: true,
+    entreprises_lecture: true,
+  },
+]
+
+const uploadTempDocumentAction = action('uploadTempDocument')
+const getEtapeDocumentsByEtapeIdAction = action('getEtapeDocumentsByEtapeId')
+
+const apiClient: Pick<ApiClient, 'uploadTempDocument' | 'getEtapeDocumentsByEtapeId'> = {
+  getEtapeDocumentsByEtapeId: etapeId => {
+    getEtapeDocumentsByEtapeIdAction(etapeId)
+
+    return Promise.resolve({ etapeDocuments: documents, asl: null, dae: null })
+  },
+  uploadTempDocument: document => {
+    uploadTempDocumentAction(document)
+
+    return Promise.resolve(tempDocumentNameValidator.parse(new Date().toISOString()))
+  },
+}
+
+const completeUpdateAction = action('completeUpdate')
+
+export const Empty: StoryFn = () => (
+  <EtapeDocumentsEdit
+    apiClient={{ ...apiClient, getEtapeDocumentsByEtapeId: () => Promise.resolve({ etapeDocuments: [], asl: null, dae: null }) }}
+    contenu={{}}
+    etapeId={etapeIdValidator.parse('etapeId')}
+    sdomZoneIds={[]}
+    tde={{ titreTypeId: 'arm', demarcheTypeId: 'oct', etapeTypeId: 'mfr' }}
+    etapeStatutId="fai"
+    completeUpdate={completeUpdateAction}
+    user={{ ...testBlankUser, role: 'super' }}
+  />
+)
+export const Rempli: StoryFn = () => (
+  <EtapeDocumentsEdit
+    apiClient={apiClient}
+    contenu={{}}
+    etapeId={etapeIdValidator.parse('etapeId')}
+    sdomZoneIds={[]}
+    tde={{ titreTypeId: 'arm', demarcheTypeId: 'oct', etapeTypeId: 'mfr' }}
+    etapeStatutId="fai"
+    completeUpdate={completeUpdateAction}
+    user={{ ...testBlankUser, role: 'super' }}
+  />
+)
+
+export const Complet: StoryFn = () => (
+  <EtapeDocumentsEdit
+    apiClient={{
+      ...apiClient,
+      getEtapeDocumentsByEtapeId: () =>
+        Promise.resolve({
+          etapeDocuments: [
+            {
+              id: etapeDocumentIdValidator.parse('id'),
+              etape_document_type_id: 'dep',
+              description: 'Une description',
+              public_lecture: false,
+              entreprises_lecture: false,
+            },
+            {
+              id: etapeDocumentIdValidator.parse('id2'),
+              etape_document_type_id: 'dom',
+              description: 'Une autre description',
+              public_lecture: false,
+              entreprises_lecture: false,
+            },
+            {
+              id: etapeDocumentIdValidator.parse('id3'),
+              etape_document_type_id: 'for',
+              description: null,
+              public_lecture: false,
+              entreprises_lecture: false,
+            },
+            {
+              id: etapeDocumentIdValidator.parse('id4'),
+              etape_document_type_id: 'jpa',
+              description: null,
+              public_lecture: false,
+              entreprises_lecture: false,
+            },
+            {
+              id: etapeDocumentIdValidator.parse('id5'),
+              etape_document_type_id: 'car',
+              description: null,
+              public_lecture: false,
+              entreprises_lecture: false,
+            },
+          ],
+          asl: null,
+          dae: null,
+        }),
+    }}
+    contenu={{}}
+    etapeId={etapeIdValidator.parse('etapeId')}
+    sdomZoneIds={[]}
+    tde={{ titreTypeId: 'arm', demarcheTypeId: 'oct', etapeTypeId: 'mfr' }}
+    etapeStatutId="fai"
+    completeUpdate={completeUpdateAction}
+    user={{ ...testBlankUser, role: 'super' }}
+  />
+)
+
+export const ArmMecanise: StoryFn = () => (
+  <EtapeDocumentsEdit
+    apiClient={apiClient}
+    contenu={{ arm: { mecanise: true } }}
+    etapeId={etapeIdValidator.parse('etapeId')}
+    sdomZoneIds={[]}
+    tde={{ titreTypeId: 'arm', demarcheTypeId: 'oct', etapeTypeId: 'mfr' }}
+    etapeStatutId="fai"
+    completeUpdate={completeUpdateAction}
+    user={{ ...testBlankUser, role: 'super' }}
+  />
+)
+
+export const ArmMecaniseDynamic: StoryObj<{ mecanise: boolean }> = {
+  render: function Component(args: { mecanise: boolean }) {
+    const [, setArgs] = useArgs()
+
+    return () => (
+      <>
+        <button onClick={() => setArgs({ mecanise: !args.mecanise })}> Change la mécanisation </button>
+        <EtapeDocumentsEdit
+          apiClient={apiClient}
+          contenu={{ arm: { mecanise: args.mecanise } }}
+          etapeId={etapeIdValidator.parse('etapeId')}
+          sdomZoneIds={[]}
+          tde={{ titreTypeId: 'arm', demarcheTypeId: 'oct', etapeTypeId: 'mfr' }}
+          etapeStatutId="fai"
+          completeUpdate={completeUpdateAction}
+          user={{ ...testBlankUser, role: 'super' }}
+        />
+      </>
+    )
+  },
+  args: {
+    mecanise: true,
+  },
+}
+
+export const EnConstruction: StoryFn = () => (
+  <EtapeDocumentsEdit
+    apiClient={apiClient}
+    contenu={{ arm: { mecanise: true } }}
+    etapeId={etapeIdValidator.parse('etapeId')}
+    sdomZoneIds={[]}
+    tde={{ titreTypeId: 'arm', demarcheTypeId: 'oct', etapeTypeId: 'mfr' }}
+    etapeStatutId="aco"
+    completeUpdate={completeUpdateAction}
+    user={{ ...testBlankUser, role: 'super' }}
+  />
+)
+export const OctroiAxmUtilisateurSuper: StoryFn = () => (
+  <EtapeDocumentsEdit
+    apiClient={apiClient}
+    contenu={{}}
+    etapeId={etapeIdValidator.parse('etapeId')}
+    sdomZoneIds={[]}
+    tde={{ titreTypeId: 'axm', demarcheTypeId: 'oct', etapeTypeId: 'mfr' }}
+    etapeStatutId="aco"
+    completeUpdate={completeUpdateAction}
+    user={{ ...testBlankUser, role: 'super' }}
+  />
+)
+
+export const OctroiAxmUtilisateurEntreprise: StoryFn = () => (
+  <EtapeDocumentsEdit
+    apiClient={apiClient}
+    contenu={{}}
+    etapeId={etapeIdValidator.parse('etapeId')}
+    sdomZoneIds={[]}
+    tde={{ titreTypeId: 'axm', demarcheTypeId: 'oct', etapeTypeId: 'mfr' }}
+    etapeStatutId="aco"
+    completeUpdate={completeUpdateAction}
+    user={{ ...testBlankUser, role: 'entreprise', entreprises: [{ id: entrepriseIdValidator.parse('idEntreprise1'), nom: 'entreprise 1' }] }}
+  />
+)
+
+export const OctroiAxmUtilisateurEntrepriseComplet: StoryFn = () => (
+  <EtapeDocumentsEdit
+    apiClient={{
+      ...apiClient,
+      getEtapeDocumentsByEtapeId(etapeId) {
+        getEtapeDocumentsByEtapeIdAction(etapeId)
+
+        return Promise.resolve<GetEtapeDocumentsByEtapeId>({
+          etapeDocuments: [
+            {
+              id: etapeDocumentIdValidator.parse('id'),
+              etape_document_type_id: 'dep',
+              description: 'Une description',
+              public_lecture: false,
+              entreprises_lecture: false,
+            },
+            {
+              id: etapeDocumentIdValidator.parse('id2'),
+              etape_document_type_id: 'dom',
+              description: 'Une autre description',
+              public_lecture: false,
+              entreprises_lecture: false,
+            },
+            {
+              id: etapeDocumentIdValidator.parse('id3'),
+              etape_document_type_id: 'for',
+              description: null,
+              public_lecture: false,
+              entreprises_lecture: false,
+            },
+            {
+              id: etapeDocumentIdValidator.parse('id4'),
+              etape_document_type_id: 'jpa',
+              description: null,
+              public_lecture: false,
+              entreprises_lecture: false,
+            },
+            {
+              id: etapeDocumentIdValidator.parse('id5'),
+              etape_document_type_id: 'car',
+              description: null,
+              public_lecture: false,
+              entreprises_lecture: false,
+            },
+          ],
+          dae: {
+            id: etapeDocumentIdValidator.parse('daeId'),
+            date: caminoDateValidator.parse('2023-01-23'),
+            description: 'description',
+            public_lecture: false,
+            entreprises_lecture: true,
+            etape_document_type_id: 'arp',
+            etape_statut_id: 'exe',
+            arrete_prefectoral: '1233232323',
+          },
+          asl: {
+            id: etapeDocumentIdValidator.parse('daeId'),
+            date: caminoDateValidator.parse('2023-01-23'),
+            description: 'description',
+            public_lecture: false,
+            entreprises_lecture: true,
+            etape_document_type_id: 'let',
+            etape_statut_id: 'fav',
+          },
+        })
+      },
+    }}
+    contenu={{}}
+    etapeId={etapeIdValidator.parse('etapeId')}
+    sdomZoneIds={[]}
+    tde={{ titreTypeId: 'axm', demarcheTypeId: 'oct', etapeTypeId: 'mfr' }}
+    etapeStatutId="aco"
+    completeUpdate={completeUpdateAction}
+    user={{ ...testBlankUser, role: 'entreprise', entreprises: [{ id: entrepriseIdValidator.parse('idEntreprise1'), nom: 'entreprise 1' }] }}
+  />
+)
+
+export const SdomZone: StoryFn = () => (
+  <EtapeDocumentsEdit
+    apiClient={apiClient}
+    contenu={{ arm: { mecanise: true } }}
+    etapeId={etapeIdValidator.parse('etapeId')}
+    sdomZoneIds={['1', '2']}
+    tde={{ titreTypeId: 'axm', demarcheTypeId: 'oct', etapeTypeId: 'mfr' }}
+    etapeStatutId="fai"
+    completeUpdate={completeUpdateAction}
+    user={{ ...testBlankUser, role: 'super' }}
+  />
+)
+
+export const PasDeDocumentsObligatoires: StoryFn = () => (
+  <EtapeDocumentsEdit
+    apiClient={apiClient}
+    contenu={{}}
+    etapeId={etapeIdValidator.parse('etapeId')}
+    sdomZoneIds={['1', '2']}
+    tde={{ titreTypeId: 'prm', demarcheTypeId: 'pro', etapeTypeId: 'mfr' }}
+    etapeStatutId="fai"
+    completeUpdate={completeUpdateAction}
+    user={{ ...testBlankUser, role: 'super' }}
+  />
+)
+
+export const Loading: StoryFn = () => (
+  <EtapeDocumentsEdit
+    apiClient={{ ...apiClient, getEtapeDocumentsByEtapeId: () => new Promise(() => ({})) }}
+    contenu={{}}
+    etapeId={etapeIdValidator.parse('etapeId')}
+    sdomZoneIds={[]}
+    tde={{ titreTypeId: 'arm', demarcheTypeId: 'oct', etapeTypeId: 'mfr' }}
+    etapeStatutId="fai"
+    completeUpdate={completeUpdateAction}
+    user={{ ...testBlankUser, role: 'super' }}
+  />
+)
+export const WithError: StoryFn = () => (
+  <EtapeDocumentsEdit
+    apiClient={{ ...apiClient, getEtapeDocumentsByEtapeId: () => Promise.reject(new Error('Une erreur est survenue')) }}
+    contenu={{}}
+    etapeId={etapeIdValidator.parse('etapeId')}
+    sdomZoneIds={[]}
+    tde={{ titreTypeId: 'arm', demarcheTypeId: 'oct', etapeTypeId: 'mfr' }}
+    etapeStatutId="fai"
+    completeUpdate={completeUpdateAction}
+    user={{ ...testBlankUser, role: 'super' }}
+  />
+)
diff --git a/packages/ui/src/components/etape/etape-documents-edit.stories_snapshots_ArmMecanise.html b/packages/ui/src/components/etape/etape-documents-edit.stories_snapshots_ArmMecanise.html
new file mode 100644
index 0000000000000000000000000000000000000000..c435025c7458fa6f6b677e9f72344fdc74dca20e
--- /dev/null
+++ b/packages/ui/src/components/etape/etape-documents-edit.stories_snapshots_ArmMecanise.html
@@ -0,0 +1,98 @@
+<div class="dsfr">
+  <div class="fr-table fr-mb-0">
+    <table style="display: table;">
+      <caption>Documents obligatoires</caption>
+      <thead>
+        <tr>
+          <th scope="col">Nom</th>
+          <th scope="col">Description</th>
+          <th scope="col">Visibilité</th>
+          <th scope="col" style="display: flex; justify-content: end;">Action</th>
+        </tr>
+      </thead>
+      <tbody>
+        <tr>
+          <td>Décision cas par cas</td>
+          <td style="white-space: pre-line;">Une description</td>
+          <td>Visible seulement par les administrations</td>
+          <td>
+            <div style="display: flex; justify-content: end; align-items: center;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-edit-line" title="Modifier le document de Décision cas par cas" aria-label="Modifier le document de Décision cas par cas" type="button">
+                <!---->
+              </button>
+              <!---->
+            </div>
+          </td>
+        </tr>
+        <tr>
+          <td>Documents cartographiques</td>
+          <td style="white-space: pre-line;">Une description</td>
+          <td>Visible seulement par les administrations</td>
+          <td>
+            <div style="display: flex; justify-content: end; align-items: center;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-edit-line" title="Modifier le document de Documents cartographiques" aria-label="Modifier le document de Documents cartographiques" type="button">
+                <!---->
+              </button>
+              <!---->
+            </div>
+          </td>
+        </tr>
+        <tr>
+          <td>Dossier "Loi sur l'eau"</td>
+          <td style="white-space: pre-line;">
+            <!---->
+          </td>
+          <td>Public</td>
+          <td>
+            <div style="display: flex; justify-content: end; align-items: center;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-edit-line" title="Modifier le document de Dossier &quot;Loi sur l'eau&quot;" aria-label="Modifier le document de Dossier &quot;Loi sur l'eau&quot;" type="button">
+                <!---->
+              </button>
+              <!---->
+            </div>
+          </td>
+        </tr>
+        <tr>
+          <td class="fr-label--disabled">Dossier de demande</td>
+          <td>-</td>
+          <td>-</td>
+          <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Dossier de demande" aria-label="Ajouter un document Dossier de demande" type="button">
+              <!---->
+            </button></td>
+        </tr>
+        <tr>
+          <td class="fr-label--disabled">Formulaire de demande</td>
+          <td>-</td>
+          <td>-</td>
+          <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Formulaire de demande" aria-label="Ajouter un document Formulaire de demande" type="button">
+              <!---->
+            </button></td>
+        </tr>
+        <tr>
+          <td class="fr-label--disabled">Justificatif de paiement</td>
+          <td>-</td>
+          <td>-</td>
+          <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Justificatif de paiement" aria-label="Ajouter un document Justificatif de paiement" type="button">
+              <!---->
+            </button></td>
+        </tr>
+      </tbody>
+    </table>
+  </div>
+  <div style="display: flex; flex-direction: column;" class="fr-mt-3w">
+    <div class="fr-table fr-mb-0">
+      <table style="display: table;">
+        <caption>Documents complémentaires</caption>
+        <thead>
+          <tr>
+            <th scope="col">Nom</th>
+            <th scope="col">Description</th>
+            <th scope="col">Visibilité</th>
+            <th scope="col" style="display: flex; justify-content: end;">Action</th>
+          </tr>
+        </thead>
+        <tbody></tbody>
+      </table>
+    </div><button class="fr-btn fr-btn--secondary fr-btn--md fr-icon-add-line fr-btn--icon-right fr-mt-1w" title="Ajouter un document complémentaire" aria-label="Ajouter un document complémentaire" type="button" style="align-self: end;">Ajouter</button>
+  </div>
+  <!---->
+  <!---->
+  <!---->
+</div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/etape-documents-edit.stories_snapshots_ArmMecaniseDynamic.html b/packages/ui/src/components/etape/etape-documents-edit.stories_snapshots_ArmMecaniseDynamic.html
new file mode 100644
index 0000000000000000000000000000000000000000..2a639bb91925d7d3081091e464feb690a0c5ee6b
--- /dev/null
+++ b/packages/ui/src/components/etape/etape-documents-edit.stories_snapshots_ArmMecaniseDynamic.html
@@ -0,0 +1,98 @@
+<div class="dsfr"><button> Change la mécanisation </button>
+  <div class="fr-table fr-mb-0">
+    <table style="display: table;">
+      <caption>Documents obligatoires</caption>
+      <thead>
+        <tr>
+          <th scope="col">Nom</th>
+          <th scope="col">Description</th>
+          <th scope="col">Visibilité</th>
+          <th scope="col" style="display: flex; justify-content: end;">Action</th>
+        </tr>
+      </thead>
+      <tbody>
+        <tr>
+          <td>Décision cas par cas</td>
+          <td style="white-space: pre-line;">Une description</td>
+          <td>Visible seulement par les administrations</td>
+          <td>
+            <div style="display: flex; justify-content: end; align-items: center;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-edit-line" title="Modifier le document de Décision cas par cas" aria-label="Modifier le document de Décision cas par cas" type="button">
+                <!---->
+              </button>
+              <!---->
+            </div>
+          </td>
+        </tr>
+        <tr>
+          <td>Documents cartographiques</td>
+          <td style="white-space: pre-line;">Une description</td>
+          <td>Visible seulement par les administrations</td>
+          <td>
+            <div style="display: flex; justify-content: end; align-items: center;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-edit-line" title="Modifier le document de Documents cartographiques" aria-label="Modifier le document de Documents cartographiques" type="button">
+                <!---->
+              </button>
+              <!---->
+            </div>
+          </td>
+        </tr>
+        <tr>
+          <td>Dossier "Loi sur l'eau"</td>
+          <td style="white-space: pre-line;">
+            <!---->
+          </td>
+          <td>Public</td>
+          <td>
+            <div style="display: flex; justify-content: end; align-items: center;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-edit-line" title="Modifier le document de Dossier &quot;Loi sur l'eau&quot;" aria-label="Modifier le document de Dossier &quot;Loi sur l'eau&quot;" type="button">
+                <!---->
+              </button>
+              <!---->
+            </div>
+          </td>
+        </tr>
+        <tr>
+          <td class="fr-label--disabled">Dossier de demande</td>
+          <td>-</td>
+          <td>-</td>
+          <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Dossier de demande" aria-label="Ajouter un document Dossier de demande" type="button">
+              <!---->
+            </button></td>
+        </tr>
+        <tr>
+          <td class="fr-label--disabled">Formulaire de demande</td>
+          <td>-</td>
+          <td>-</td>
+          <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Formulaire de demande" aria-label="Ajouter un document Formulaire de demande" type="button">
+              <!---->
+            </button></td>
+        </tr>
+        <tr>
+          <td class="fr-label--disabled">Justificatif de paiement</td>
+          <td>-</td>
+          <td>-</td>
+          <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Justificatif de paiement" aria-label="Ajouter un document Justificatif de paiement" type="button">
+              <!---->
+            </button></td>
+        </tr>
+      </tbody>
+    </table>
+  </div>
+  <div style="display: flex; flex-direction: column;" class="fr-mt-3w">
+    <div class="fr-table fr-mb-0">
+      <table style="display: table;">
+        <caption>Documents complémentaires</caption>
+        <thead>
+          <tr>
+            <th scope="col">Nom</th>
+            <th scope="col">Description</th>
+            <th scope="col">Visibilité</th>
+            <th scope="col" style="display: flex; justify-content: end;">Action</th>
+          </tr>
+        </thead>
+        <tbody></tbody>
+      </table>
+    </div><button class="fr-btn fr-btn--secondary fr-btn--md fr-icon-add-line fr-btn--icon-right fr-mt-1w" title="Ajouter un document complémentaire" aria-label="Ajouter un document complémentaire" type="button" style="align-self: end;">Ajouter</button>
+  </div>
+  <!---->
+  <!---->
+  <!---->
+</div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/etape-documents-edit.stories_snapshots_Complet.html b/packages/ui/src/components/etape/etape-documents-edit.stories_snapshots_Complet.html
new file mode 100644
index 0000000000000000000000000000000000000000..043edc1e600c51b3edd2b41e555531b18be56329
--- /dev/null
+++ b/packages/ui/src/components/etape/etape-documents-edit.stories_snapshots_Complet.html
@@ -0,0 +1,103 @@
+<div class="dsfr">
+  <div class="fr-table fr-mb-0">
+    <table style="display: table;">
+      <caption>Documents obligatoires</caption>
+      <thead>
+        <tr>
+          <th scope="col">Nom</th>
+          <th scope="col">Description</th>
+          <th scope="col">Visibilité</th>
+          <th scope="col" style="display: flex; justify-content: end;">Action</th>
+        </tr>
+      </thead>
+      <tbody>
+        <tr>
+          <td>Dossier de demande</td>
+          <td style="white-space: pre-line;">Une autre description</td>
+          <td>Visible seulement par les administrations</td>
+          <td>
+            <div style="display: flex; justify-content: end; align-items: center;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-edit-line" title="Modifier le document de Dossier de demande" aria-label="Modifier le document de Dossier de demande" type="button">
+                <!---->
+              </button>
+              <!---->
+            </div>
+          </td>
+        </tr>
+        <tr>
+          <td>Formulaire de demande</td>
+          <td style="white-space: pre-line;">
+            <!---->
+          </td>
+          <td>Visible seulement par les administrations</td>
+          <td>
+            <div style="display: flex; justify-content: end; align-items: center;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-edit-line" title="Modifier le document de Formulaire de demande" aria-label="Modifier le document de Formulaire de demande" type="button">
+                <!---->
+              </button>
+              <!---->
+            </div>
+          </td>
+        </tr>
+        <tr>
+          <td>Justificatif de paiement</td>
+          <td style="white-space: pre-line;">
+            <!---->
+          </td>
+          <td>Visible seulement par les administrations</td>
+          <td>
+            <div style="display: flex; justify-content: end; align-items: center;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-edit-line" title="Modifier le document de Justificatif de paiement" aria-label="Modifier le document de Justificatif de paiement" type="button">
+                <!---->
+              </button>
+              <!---->
+            </div>
+          </td>
+        </tr>
+        <tr>
+          <td>Documents cartographiques</td>
+          <td style="white-space: pre-line;">
+            <!---->
+          </td>
+          <td>Visible seulement par les administrations</td>
+          <td>
+            <div style="display: flex; justify-content: end; align-items: center;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-edit-line" title="Modifier le document de Documents cartographiques" aria-label="Modifier le document de Documents cartographiques" type="button">
+                <!---->
+              </button>
+              <!---->
+            </div>
+          </td>
+        </tr>
+      </tbody>
+    </table>
+  </div>
+  <div style="display: flex; flex-direction: column;" class="fr-mt-3w">
+    <div class="fr-table fr-mb-0">
+      <table style="display: table;">
+        <caption>Documents complémentaires</caption>
+        <thead>
+          <tr>
+            <th scope="col">Nom</th>
+            <th scope="col">Description</th>
+            <th scope="col">Visibilité</th>
+            <th scope="col" style="display: flex; justify-content: end;">Action</th>
+          </tr>
+        </thead>
+        <tbody>
+          <tr>
+            <td>Décision cas par cas</td>
+            <td style="white-space: pre-line;">Une description</td>
+            <td>Visible seulement par les administrations</td>
+            <td>
+              <div style="display: flex; justify-content: end; align-items: center;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-edit-line" title="Modifier le document de Décision cas par cas" aria-label="Modifier le document de Décision cas par cas" type="button">
+                  <!---->
+                </button>
+                <!---->
+              </div>
+            </td>
+          </tr>
+        </tbody>
+      </table>
+    </div><button class="fr-btn fr-btn--secondary fr-btn--md fr-icon-add-line fr-btn--icon-right fr-mt-1w" title="Ajouter un document complémentaire" aria-label="Ajouter un document complémentaire" type="button" style="align-self: end;">Ajouter</button>
+  </div>
+  <!---->
+  <!---->
+  <!---->
+</div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/etape-documents-edit.stories_snapshots_Empty.html b/packages/ui/src/components/etape/etape-documents-edit.stories_snapshots_Empty.html
new file mode 100644
index 0000000000000000000000000000000000000000..d182f9e61311bec6595cfa5bd3d8c2bb1caaa233
--- /dev/null
+++ b/packages/ui/src/components/etape/etape-documents-edit.stories_snapshots_Empty.html
@@ -0,0 +1,68 @@
+<div class="dsfr">
+  <div class="fr-table fr-mb-0">
+    <table style="display: table;">
+      <caption>Documents obligatoires</caption>
+      <thead>
+        <tr>
+          <th scope="col">Nom</th>
+          <th scope="col">Description</th>
+          <th scope="col">Visibilité</th>
+          <th scope="col" style="display: flex; justify-content: end;">Action</th>
+        </tr>
+      </thead>
+      <tbody>
+        <tr>
+          <td class="fr-label--disabled">Documents cartographiques</td>
+          <td>-</td>
+          <td>-</td>
+          <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Documents cartographiques" aria-label="Ajouter un document Documents cartographiques" type="button">
+              <!---->
+            </button></td>
+        </tr>
+        <tr>
+          <td class="fr-label--disabled">Dossier de demande</td>
+          <td>-</td>
+          <td>-</td>
+          <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Dossier de demande" aria-label="Ajouter un document Dossier de demande" type="button">
+              <!---->
+            </button></td>
+        </tr>
+        <tr>
+          <td class="fr-label--disabled">Formulaire de demande</td>
+          <td>-</td>
+          <td>-</td>
+          <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Formulaire de demande" aria-label="Ajouter un document Formulaire de demande" type="button">
+              <!---->
+            </button></td>
+        </tr>
+        <tr>
+          <td class="fr-label--disabled">Justificatif de paiement</td>
+          <td>-</td>
+          <td>-</td>
+          <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Justificatif de paiement" aria-label="Ajouter un document Justificatif de paiement" type="button">
+              <!---->
+            </button></td>
+        </tr>
+      </tbody>
+    </table>
+  </div>
+  <div style="display: flex; flex-direction: column;" class="fr-mt-3w">
+    <div class="fr-table fr-mb-0">
+      <table style="display: table;">
+        <caption>Documents complémentaires</caption>
+        <thead>
+          <tr>
+            <th scope="col">Nom</th>
+            <th scope="col">Description</th>
+            <th scope="col">Visibilité</th>
+            <th scope="col" style="display: flex; justify-content: end;">Action</th>
+          </tr>
+        </thead>
+        <tbody></tbody>
+      </table>
+    </div><button class="fr-btn fr-btn--secondary fr-btn--md fr-icon-add-line fr-btn--icon-right fr-mt-1w" title="Ajouter un document complémentaire" aria-label="Ajouter un document complémentaire" type="button" style="align-self: end;">Ajouter</button>
+  </div>
+  <!---->
+  <!---->
+  <!---->
+</div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/etape-documents-edit.stories_snapshots_EnConstruction.html b/packages/ui/src/components/etape/etape-documents-edit.stories_snapshots_EnConstruction.html
new file mode 100644
index 0000000000000000000000000000000000000000..c0892157238581000d59c4c06c0f9dacea3647d4
--- /dev/null
+++ b/packages/ui/src/components/etape/etape-documents-edit.stories_snapshots_EnConstruction.html
@@ -0,0 +1,98 @@
+<div class="dsfr">
+  <div class="fr-table fr-mb-0">
+    <table style="display: table;">
+      <caption>Documents obligatoires</caption>
+      <thead>
+        <tr>
+          <th scope="col">Nom</th>
+          <th scope="col">Description</th>
+          <th scope="col">Visibilité</th>
+          <th scope="col" style="display: flex; justify-content: end;">Action</th>
+        </tr>
+      </thead>
+      <tbody>
+        <tr>
+          <td>Décision cas par cas</td>
+          <td style="white-space: pre-line;">Une description</td>
+          <td>Visible seulement par les administrations</td>
+          <td>
+            <div style="display: flex; justify-content: end; align-items: center;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-edit-line" title="Modifier le document de Décision cas par cas" aria-label="Modifier le document de Décision cas par cas" type="button">
+                <!---->
+              </button><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-delete-bin-line fr-ml-1w" title="Supprimer le document de Décision cas par cas" aria-label="Supprimer le document de Décision cas par cas" type="button">
+                <!---->
+              </button></div>
+          </td>
+        </tr>
+        <tr>
+          <td>Documents cartographiques</td>
+          <td style="white-space: pre-line;">Une description</td>
+          <td>Visible seulement par les administrations</td>
+          <td>
+            <div style="display: flex; justify-content: end; align-items: center;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-edit-line" title="Modifier le document de Documents cartographiques" aria-label="Modifier le document de Documents cartographiques" type="button">
+                <!---->
+              </button><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-delete-bin-line fr-ml-1w" title="Supprimer le document de Documents cartographiques" aria-label="Supprimer le document de Documents cartographiques" type="button">
+                <!---->
+              </button></div>
+          </td>
+        </tr>
+        <tr>
+          <td>Dossier "Loi sur l'eau"</td>
+          <td style="white-space: pre-line;">
+            <!---->
+          </td>
+          <td>Public</td>
+          <td>
+            <div style="display: flex; justify-content: end; align-items: center;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-edit-line" title="Modifier le document de Dossier &quot;Loi sur l'eau&quot;" aria-label="Modifier le document de Dossier &quot;Loi sur l'eau&quot;" type="button">
+                <!---->
+              </button><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-delete-bin-line fr-ml-1w" title="Supprimer le document de Dossier &quot;Loi sur l'eau&quot;" aria-label="Supprimer le document de Dossier &quot;Loi sur l'eau&quot;" type="button">
+                <!---->
+              </button></div>
+          </td>
+        </tr>
+        <tr>
+          <td class="fr-label--disabled">Dossier de demande</td>
+          <td>-</td>
+          <td>-</td>
+          <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Dossier de demande" aria-label="Ajouter un document Dossier de demande" type="button">
+              <!---->
+            </button></td>
+        </tr>
+        <tr>
+          <td class="fr-label--disabled">Formulaire de demande</td>
+          <td>-</td>
+          <td>-</td>
+          <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Formulaire de demande" aria-label="Ajouter un document Formulaire de demande" type="button">
+              <!---->
+            </button></td>
+        </tr>
+        <tr>
+          <td class="fr-label--disabled">Justificatif de paiement</td>
+          <td>-</td>
+          <td>-</td>
+          <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Justificatif de paiement" aria-label="Ajouter un document Justificatif de paiement" type="button">
+              <!---->
+            </button></td>
+        </tr>
+      </tbody>
+    </table>
+  </div>
+  <div style="display: flex; flex-direction: column;" class="fr-mt-3w">
+    <div class="fr-table fr-mb-0">
+      <table style="display: table;">
+        <caption>Documents complémentaires</caption>
+        <thead>
+          <tr>
+            <th scope="col">Nom</th>
+            <th scope="col">Description</th>
+            <th scope="col">Visibilité</th>
+            <th scope="col" style="display: flex; justify-content: end;">Action</th>
+          </tr>
+        </thead>
+        <tbody></tbody>
+      </table>
+    </div><button class="fr-btn fr-btn--secondary fr-btn--md fr-icon-add-line fr-btn--icon-right fr-mt-1w" title="Ajouter un document complémentaire" aria-label="Ajouter un document complémentaire" type="button" style="align-self: end;">Ajouter</button>
+  </div>
+  <!---->
+  <!---->
+  <!---->
+</div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/etape-documents-edit.stories_snapshots_Loading.html b/packages/ui/src/components/etape/etape-documents-edit.stories_snapshots_Loading.html
new file mode 100644
index 0000000000000000000000000000000000000000..6594af26495953ec894f7e2e34367c7a711f0598
--- /dev/null
+++ b/packages/ui/src/components/etape/etape-documents-edit.stories_snapshots_Loading.html
@@ -0,0 +1,6 @@
+<div class="dsfr">
+  <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
+    <!---->
+    <div class="_spinner_3306d0"></div>
+  </div>
+</div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/etape-documents-edit.stories_snapshots_OctroiAxmUtilisateurEntreprise.html b/packages/ui/src/components/etape/etape-documents-edit.stories_snapshots_OctroiAxmUtilisateurEntreprise.html
new file mode 100644
index 0000000000000000000000000000000000000000..3951e8cda40ee147a90aa4cd4eb7a2a8da05fd3a
--- /dev/null
+++ b/packages/ui/src/components/etape/etape-documents-edit.stories_snapshots_OctroiAxmUtilisateurEntreprise.html
@@ -0,0 +1,139 @@
+<div class="dsfr">
+  <div class="fr-table fr-mb-0">
+    <table style="display: table;">
+      <caption>Documents obligatoires</caption>
+      <thead>
+        <tr>
+          <th scope="col">Nom</th>
+          <th scope="col">Description</th>
+          <th scope="col">Visibilité</th>
+          <th scope="col" style="display: flex; justify-content: end;">Action</th>
+        </tr>
+      </thead>
+      <tbody>
+        <tr>
+          <td>Documents cartographiques</td>
+          <td style="white-space: pre-line;">Une description</td>
+          <td>Visible seulement par les administrations</td>
+          <td>
+            <div style="display: flex; justify-content: end; align-items: center;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-edit-line" title="Modifier le document de Documents cartographiques" aria-label="Modifier le document de Documents cartographiques" type="button">
+                <!---->
+              </button><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-delete-bin-line fr-ml-1w" title="Supprimer le document de Documents cartographiques" aria-label="Supprimer le document de Documents cartographiques" type="button">
+                <!---->
+              </button></div>
+          </td>
+        </tr>
+        <tr>
+          <td class="fr-label--disabled">Lettre de demande</td>
+          <td>-</td>
+          <td>-</td>
+          <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Lettre de demande" aria-label="Ajouter un document Lettre de demande" type="button">
+              <!---->
+            </button></td>
+        </tr>
+        <tr>
+          <td class="fr-label--disabled">Identification de matériel</td>
+          <td>-</td>
+          <td>-</td>
+          <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Identification de matériel" aria-label="Ajouter un document Identification de matériel" type="button">
+              <!---->
+            </button></td>
+        </tr>
+        <tr>
+          <td class="fr-label--disabled">Mesures prévues pour réhabiliter le site </td>
+          <td>-</td>
+          <td>-</td>
+          <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Mesures prévues pour réhabiliter le site " aria-label="Ajouter un document Mesures prévues pour réhabiliter le site " type="button">
+              <!---->
+            </button></td>
+        </tr>
+        <tr>
+          <td class="fr-label--disabled">Méthodes pour l'exécution des travaux</td>
+          <td>-</td>
+          <td>-</td>
+          <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Méthodes pour l'exécution des travaux" aria-label="Ajouter un document Méthodes pour l'exécution des travaux" type="button">
+              <!---->
+            </button></td>
+        </tr>
+        <tr>
+          <td class="fr-label--disabled">Programme des travaux </td>
+          <td>-</td>
+          <td>-</td>
+          <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Programme des travaux " aria-label="Ajouter un document Programme des travaux " type="button">
+              <!---->
+            </button></td>
+        </tr>
+        <tr>
+          <td class="fr-label--disabled">Schéma de pénétration du massif forestier</td>
+          <td>-</td>
+          <td>-</td>
+          <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Schéma de pénétration du massif forestier" aria-label="Ajouter un document Schéma de pénétration du massif forestier" type="button">
+              <!---->
+            </button></td>
+        </tr>
+        <tr>
+          <td class="fr-label--disabled">Arrêté préfectoral de la mission autorité environnementale</td>
+          <td>-</td>
+          <td>-</td>
+          <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Arrêté préfectoral de la mission autorité environnementale" aria-label="Ajouter un document Arrêté préfectoral de la mission autorité environnementale" type="button">
+              <!---->
+            </button></td>
+        </tr>
+        <tr>
+          <td class="fr-label--disabled">Lettre de la décision du propriétaire du sol</td>
+          <td>-</td>
+          <td>-</td>
+          <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Lettre de la décision du propriétaire du sol" aria-label="Ajouter un document Lettre de la décision du propriétaire du sol" type="button">
+              <!---->
+            </button></td>
+        </tr>
+      </tbody>
+    </table>
+  </div>
+  <div style="display: flex; flex-direction: column;" class="fr-mt-3w">
+    <div class="fr-table fr-mb-0">
+      <table style="display: table;">
+        <caption>Documents complémentaires</caption>
+        <thead>
+          <tr>
+            <th scope="col">Nom</th>
+            <th scope="col">Description</th>
+            <th scope="col">Visibilité</th>
+            <th scope="col" style="display: flex; justify-content: end;">Action</th>
+          </tr>
+        </thead>
+        <tbody>
+          <tr>
+            <td>Décision cas par cas</td>
+            <td style="white-space: pre-line;">Une description</td>
+            <td>Visible seulement par les administrations</td>
+            <td>
+              <div style="display: flex; justify-content: end; align-items: center;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-edit-line" title="Modifier le document de Décision cas par cas" aria-label="Modifier le document de Décision cas par cas" type="button">
+                  <!---->
+                </button><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-delete-bin-line fr-ml-1w" title="Supprimer le document de Décision cas par cas" aria-label="Supprimer le document de Décision cas par cas" type="button">
+                  <!---->
+                </button></div>
+            </td>
+          </tr>
+          <tr>
+            <td>Dossier "Loi sur l'eau"</td>
+            <td style="white-space: pre-line;">
+              <!---->
+            </td>
+            <td>Public</td>
+            <td>
+              <div style="display: flex; justify-content: end; align-items: center;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-edit-line" title="Modifier le document de Dossier &quot;Loi sur l'eau&quot;" aria-label="Modifier le document de Dossier &quot;Loi sur l'eau&quot;" type="button">
+                  <!---->
+                </button><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-delete-bin-line fr-ml-1w" title="Supprimer le document de Dossier &quot;Loi sur l'eau&quot;" aria-label="Supprimer le document de Dossier &quot;Loi sur l'eau&quot;" type="button">
+                  <!---->
+                </button></div>
+            </td>
+          </tr>
+        </tbody>
+      </table>
+    </div><button class="fr-btn fr-btn--secondary fr-btn--md fr-icon-add-line fr-btn--icon-right fr-mt-1w" title="Ajouter un document complémentaire" aria-label="Ajouter un document complémentaire" type="button" style="align-self: end;">Ajouter</button>
+  </div>
+  <!---->
+  <!---->
+  <!---->
+</div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/etape-documents-edit.stories_snapshots_OctroiAxmUtilisateurEntrepriseComplet.html b/packages/ui/src/components/etape/etape-documents-edit.stories_snapshots_OctroiAxmUtilisateurEntrepriseComplet.html
new file mode 100644
index 0000000000000000000000000000000000000000..c67abd526d34f6fb9f043bca58dd3a92babf2e76
--- /dev/null
+++ b/packages/ui/src/components/etape/etape-documents-edit.stories_snapshots_OctroiAxmUtilisateurEntrepriseComplet.html
@@ -0,0 +1,182 @@
+<div class="dsfr">
+  <div class="fr-table fr-mb-0">
+    <table style="display: table;">
+      <caption>Documents obligatoires</caption>
+      <thead>
+        <tr>
+          <th scope="col">Nom</th>
+          <th scope="col">Description</th>
+          <th scope="col">Visibilité</th>
+          <th scope="col" style="display: flex; justify-content: end;">Action</th>
+        </tr>
+      </thead>
+      <tbody>
+        <tr>
+          <td>Documents cartographiques</td>
+          <td style="white-space: pre-line;">
+            <!---->
+          </td>
+          <td>Visible seulement par les administrations</td>
+          <td>
+            <div style="display: flex; justify-content: end; align-items: center;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-edit-line" title="Modifier le document de Documents cartographiques" aria-label="Modifier le document de Documents cartographiques" type="button">
+                <!---->
+              </button><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-delete-bin-line fr-ml-1w" title="Supprimer le document de Documents cartographiques" aria-label="Supprimer le document de Documents cartographiques" type="button">
+                <!---->
+              </button></div>
+          </td>
+        </tr>
+        <tr>
+          <td>Arrêté préfectoral de la mission autorité environnementale</td>
+          <td style="white-space: pre-line;">description
+            - Statut : exempté
+            - Date : 23-01-2023
+            - Arrêté : 1233232323
+          </td>
+          <td>Visible seulement par les entreprises titulaires</td>
+          <td>
+            <div style="display: flex; justify-content: end; align-items: center;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-edit-line" title="Modifier le document de Arrêté préfectoral de la mission autorité environnementale" aria-label="Modifier le document de Arrêté préfectoral de la mission autorité environnementale" type="button">
+                <!---->
+              </button>
+              <!---->
+            </div>
+          </td>
+        </tr>
+        <tr>
+          <td>Lettre de la décision du propriétaire du sol</td>
+          <td style="white-space: pre-line;">description
+            - Statut : favorable
+            - Date : 23-01-2023
+          </td>
+          <td>Visible seulement par les entreprises titulaires</td>
+          <td>
+            <div style="display: flex; justify-content: end; align-items: center;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-edit-line" title="Modifier le document de Lettre de la décision du propriétaire du sol" aria-label="Modifier le document de Lettre de la décision du propriétaire du sol" type="button">
+                <!---->
+              </button>
+              <!---->
+            </div>
+          </td>
+        </tr>
+        <tr>
+          <td class="fr-label--disabled">Lettre de demande</td>
+          <td>-</td>
+          <td>-</td>
+          <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Lettre de demande" aria-label="Ajouter un document Lettre de demande" type="button">
+              <!---->
+            </button></td>
+        </tr>
+        <tr>
+          <td class="fr-label--disabled">Identification de matériel</td>
+          <td>-</td>
+          <td>-</td>
+          <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Identification de matériel" aria-label="Ajouter un document Identification de matériel" type="button">
+              <!---->
+            </button></td>
+        </tr>
+        <tr>
+          <td class="fr-label--disabled">Mesures prévues pour réhabiliter le site </td>
+          <td>-</td>
+          <td>-</td>
+          <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Mesures prévues pour réhabiliter le site " aria-label="Ajouter un document Mesures prévues pour réhabiliter le site " type="button">
+              <!---->
+            </button></td>
+        </tr>
+        <tr>
+          <td class="fr-label--disabled">Méthodes pour l'exécution des travaux</td>
+          <td>-</td>
+          <td>-</td>
+          <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Méthodes pour l'exécution des travaux" aria-label="Ajouter un document Méthodes pour l'exécution des travaux" type="button">
+              <!---->
+            </button></td>
+        </tr>
+        <tr>
+          <td class="fr-label--disabled">Programme des travaux </td>
+          <td>-</td>
+          <td>-</td>
+          <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Programme des travaux " aria-label="Ajouter un document Programme des travaux " type="button">
+              <!---->
+            </button></td>
+        </tr>
+        <tr>
+          <td class="fr-label--disabled">Schéma de pénétration du massif forestier</td>
+          <td>-</td>
+          <td>-</td>
+          <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Schéma de pénétration du massif forestier" aria-label="Ajouter un document Schéma de pénétration du massif forestier" type="button">
+              <!---->
+            </button></td>
+        </tr>
+      </tbody>
+    </table>
+  </div>
+  <div style="display: flex; flex-direction: column;" class="fr-mt-3w">
+    <div class="fr-table fr-mb-0">
+      <table style="display: table;">
+        <caption>Documents complémentaires</caption>
+        <thead>
+          <tr>
+            <th scope="col">Nom</th>
+            <th scope="col">Description</th>
+            <th scope="col">Visibilité</th>
+            <th scope="col" style="display: flex; justify-content: end;">Action</th>
+          </tr>
+        </thead>
+        <tbody>
+          <tr>
+            <td>Décision cas par cas</td>
+            <td style="white-space: pre-line;">Une description</td>
+            <td>Visible seulement par les administrations</td>
+            <td>
+              <div style="display: flex; justify-content: end; align-items: center;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-edit-line" title="Modifier le document de Décision cas par cas" aria-label="Modifier le document de Décision cas par cas" type="button">
+                  <!---->
+                </button><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-delete-bin-line fr-ml-1w" title="Supprimer le document de Décision cas par cas" aria-label="Supprimer le document de Décision cas par cas" type="button">
+                  <!---->
+                </button></div>
+            </td>
+          </tr>
+          <tr>
+            <td>Dossier de demande</td>
+            <td style="white-space: pre-line;">Une autre description</td>
+            <td>Visible seulement par les administrations</td>
+            <td>
+              <div style="display: flex; justify-content: end; align-items: center;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-edit-line" title="Modifier le document de Dossier de demande" aria-label="Modifier le document de Dossier de demande" type="button">
+                  <!---->
+                </button><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-delete-bin-line fr-ml-1w" title="Supprimer le document de Dossier de demande" aria-label="Supprimer le document de Dossier de demande" type="button">
+                  <!---->
+                </button></div>
+            </td>
+          </tr>
+          <tr>
+            <td>Formulaire de demande</td>
+            <td style="white-space: pre-line;">
+              <!---->
+            </td>
+            <td>Visible seulement par les administrations</td>
+            <td>
+              <div style="display: flex; justify-content: end; align-items: center;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-edit-line" title="Modifier le document de Formulaire de demande" aria-label="Modifier le document de Formulaire de demande" type="button">
+                  <!---->
+                </button><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-delete-bin-line fr-ml-1w" title="Supprimer le document de Formulaire de demande" aria-label="Supprimer le document de Formulaire de demande" type="button">
+                  <!---->
+                </button></div>
+            </td>
+          </tr>
+          <tr>
+            <td>Justificatif de paiement</td>
+            <td style="white-space: pre-line;">
+              <!---->
+            </td>
+            <td>Visible seulement par les administrations</td>
+            <td>
+              <div style="display: flex; justify-content: end; align-items: center;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-edit-line" title="Modifier le document de Justificatif de paiement" aria-label="Modifier le document de Justificatif de paiement" type="button">
+                  <!---->
+                </button><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-delete-bin-line fr-ml-1w" title="Supprimer le document de Justificatif de paiement" aria-label="Supprimer le document de Justificatif de paiement" type="button">
+                  <!---->
+                </button></div>
+            </td>
+          </tr>
+        </tbody>
+      </table>
+    </div><button class="fr-btn fr-btn--secondary fr-btn--md fr-icon-add-line fr-btn--icon-right fr-mt-1w" title="Ajouter un document complémentaire" aria-label="Ajouter un document complémentaire" type="button" style="align-self: end;">Ajouter</button>
+  </div>
+  <!---->
+  <!---->
+  <!---->
+</div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/etape-documents-edit.stories_snapshots_OctroiAxmUtilisateurSuper.html b/packages/ui/src/components/etape/etape-documents-edit.stories_snapshots_OctroiAxmUtilisateurSuper.html
new file mode 100644
index 0000000000000000000000000000000000000000..b3e4abff89c9d25a5789465426d08c641bd5b908
--- /dev/null
+++ b/packages/ui/src/components/etape/etape-documents-edit.stories_snapshots_OctroiAxmUtilisateurSuper.html
@@ -0,0 +1,123 @@
+<div class="dsfr">
+  <div class="fr-table fr-mb-0">
+    <table style="display: table;">
+      <caption>Documents obligatoires</caption>
+      <thead>
+        <tr>
+          <th scope="col">Nom</th>
+          <th scope="col">Description</th>
+          <th scope="col">Visibilité</th>
+          <th scope="col" style="display: flex; justify-content: end;">Action</th>
+        </tr>
+      </thead>
+      <tbody>
+        <tr>
+          <td>Documents cartographiques</td>
+          <td style="white-space: pre-line;">Une description</td>
+          <td>Visible seulement par les administrations</td>
+          <td>
+            <div style="display: flex; justify-content: end; align-items: center;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-edit-line" title="Modifier le document de Documents cartographiques" aria-label="Modifier le document de Documents cartographiques" type="button">
+                <!---->
+              </button><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-delete-bin-line fr-ml-1w" title="Supprimer le document de Documents cartographiques" aria-label="Supprimer le document de Documents cartographiques" type="button">
+                <!---->
+              </button></div>
+          </td>
+        </tr>
+        <tr>
+          <td class="fr-label--disabled">Lettre de demande</td>
+          <td>-</td>
+          <td>-</td>
+          <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Lettre de demande" aria-label="Ajouter un document Lettre de demande" type="button">
+              <!---->
+            </button></td>
+        </tr>
+        <tr>
+          <td class="fr-label--disabled">Identification de matériel</td>
+          <td>-</td>
+          <td>-</td>
+          <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Identification de matériel" aria-label="Ajouter un document Identification de matériel" type="button">
+              <!---->
+            </button></td>
+        </tr>
+        <tr>
+          <td class="fr-label--disabled">Mesures prévues pour réhabiliter le site </td>
+          <td>-</td>
+          <td>-</td>
+          <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Mesures prévues pour réhabiliter le site " aria-label="Ajouter un document Mesures prévues pour réhabiliter le site " type="button">
+              <!---->
+            </button></td>
+        </tr>
+        <tr>
+          <td class="fr-label--disabled">Méthodes pour l'exécution des travaux</td>
+          <td>-</td>
+          <td>-</td>
+          <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Méthodes pour l'exécution des travaux" aria-label="Ajouter un document Méthodes pour l'exécution des travaux" type="button">
+              <!---->
+            </button></td>
+        </tr>
+        <tr>
+          <td class="fr-label--disabled">Programme des travaux </td>
+          <td>-</td>
+          <td>-</td>
+          <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Programme des travaux " aria-label="Ajouter un document Programme des travaux " type="button">
+              <!---->
+            </button></td>
+        </tr>
+        <tr>
+          <td class="fr-label--disabled">Schéma de pénétration du massif forestier</td>
+          <td>-</td>
+          <td>-</td>
+          <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Schéma de pénétration du massif forestier" aria-label="Ajouter un document Schéma de pénétration du massif forestier" type="button">
+              <!---->
+            </button></td>
+        </tr>
+      </tbody>
+    </table>
+  </div>
+  <div style="display: flex; flex-direction: column;" class="fr-mt-3w">
+    <div class="fr-table fr-mb-0">
+      <table style="display: table;">
+        <caption>Documents complémentaires</caption>
+        <thead>
+          <tr>
+            <th scope="col">Nom</th>
+            <th scope="col">Description</th>
+            <th scope="col">Visibilité</th>
+            <th scope="col" style="display: flex; justify-content: end;">Action</th>
+          </tr>
+        </thead>
+        <tbody>
+          <tr>
+            <td>Décision cas par cas</td>
+            <td style="white-space: pre-line;">Une description</td>
+            <td>Visible seulement par les administrations</td>
+            <td>
+              <div style="display: flex; justify-content: end; align-items: center;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-edit-line" title="Modifier le document de Décision cas par cas" aria-label="Modifier le document de Décision cas par cas" type="button">
+                  <!---->
+                </button><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-delete-bin-line fr-ml-1w" title="Supprimer le document de Décision cas par cas" aria-label="Supprimer le document de Décision cas par cas" type="button">
+                  <!---->
+                </button></div>
+            </td>
+          </tr>
+          <tr>
+            <td>Dossier "Loi sur l'eau"</td>
+            <td style="white-space: pre-line;">
+              <!---->
+            </td>
+            <td>Public</td>
+            <td>
+              <div style="display: flex; justify-content: end; align-items: center;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-edit-line" title="Modifier le document de Dossier &quot;Loi sur l'eau&quot;" aria-label="Modifier le document de Dossier &quot;Loi sur l'eau&quot;" type="button">
+                  <!---->
+                </button><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-delete-bin-line fr-ml-1w" title="Supprimer le document de Dossier &quot;Loi sur l'eau&quot;" aria-label="Supprimer le document de Dossier &quot;Loi sur l'eau&quot;" type="button">
+                  <!---->
+                </button></div>
+            </td>
+          </tr>
+        </tbody>
+      </table>
+    </div><button class="fr-btn fr-btn--secondary fr-btn--md fr-icon-add-line fr-btn--icon-right fr-mt-1w" title="Ajouter un document complémentaire" aria-label="Ajouter un document complémentaire" type="button" style="align-self: end;">Ajouter</button>
+  </div>
+  <!---->
+  <!---->
+  <!---->
+</div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/etape-documents-edit.stories_snapshots_PasDeDocumentsObligatoires.html b/packages/ui/src/components/etape/etape-documents-edit.stories_snapshots_PasDeDocumentsObligatoires.html
new file mode 100644
index 0000000000000000000000000000000000000000..20d2f0ea5ee1558c02f77a176f86d90b6e312625
--- /dev/null
+++ b/packages/ui/src/components/etape/etape-documents-edit.stories_snapshots_PasDeDocumentsObligatoires.html
@@ -0,0 +1,61 @@
+<div class="dsfr">
+  <!---->
+  <div style="display: flex; flex-direction: column;" class="fr-mt-3w">
+    <div class="fr-table fr-mb-0">
+      <table style="display: table;">
+        <caption>Documents complémentaires</caption>
+        <thead>
+          <tr>
+            <th scope="col">Nom</th>
+            <th scope="col">Description</th>
+            <th scope="col">Visibilité</th>
+            <th scope="col" style="display: flex; justify-content: end;">Action</th>
+          </tr>
+        </thead>
+        <tbody>
+          <tr>
+            <td>Décision cas par cas</td>
+            <td style="white-space: pre-line;">Une description</td>
+            <td>Visible seulement par les administrations</td>
+            <td>
+              <div style="display: flex; justify-content: end; align-items: center;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-edit-line" title="Modifier le document de Décision cas par cas" aria-label="Modifier le document de Décision cas par cas" type="button">
+                  <!---->
+                </button>
+                <!---->
+              </div>
+            </td>
+          </tr>
+          <tr>
+            <td>Documents cartographiques</td>
+            <td style="white-space: pre-line;">Une description</td>
+            <td>Visible seulement par les administrations</td>
+            <td>
+              <div style="display: flex; justify-content: end; align-items: center;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-edit-line" title="Modifier le document de Documents cartographiques" aria-label="Modifier le document de Documents cartographiques" type="button">
+                  <!---->
+                </button>
+                <!---->
+              </div>
+            </td>
+          </tr>
+          <tr>
+            <td>Dossier "Loi sur l'eau"</td>
+            <td style="white-space: pre-line;">
+              <!---->
+            </td>
+            <td>Public</td>
+            <td>
+              <div style="display: flex; justify-content: end; align-items: center;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-edit-line" title="Modifier le document de Dossier &quot;Loi sur l'eau&quot;" aria-label="Modifier le document de Dossier &quot;Loi sur l'eau&quot;" type="button">
+                  <!---->
+                </button>
+                <!---->
+              </div>
+            </td>
+          </tr>
+        </tbody>
+      </table>
+    </div><button class="fr-btn fr-btn--secondary fr-btn--md fr-icon-add-line fr-btn--icon-right fr-mt-1w" title="Ajouter un document complémentaire" aria-label="Ajouter un document complémentaire" type="button" style="align-self: end;">Ajouter</button>
+  </div>
+  <!---->
+  <!---->
+  <!---->
+</div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/etape-documents-edit.stories_snapshots_Rempli.html b/packages/ui/src/components/etape/etape-documents-edit.stories_snapshots_Rempli.html
new file mode 100644
index 0000000000000000000000000000000000000000..e44d0a5aec2304e95205bee47ea4851d7c5ab82d
--- /dev/null
+++ b/packages/ui/src/components/etape/etape-documents-edit.stories_snapshots_Rempli.html
@@ -0,0 +1,99 @@
+<div class="dsfr">
+  <div class="fr-table fr-mb-0">
+    <table style="display: table;">
+      <caption>Documents obligatoires</caption>
+      <thead>
+        <tr>
+          <th scope="col">Nom</th>
+          <th scope="col">Description</th>
+          <th scope="col">Visibilité</th>
+          <th scope="col" style="display: flex; justify-content: end;">Action</th>
+        </tr>
+      </thead>
+      <tbody>
+        <tr>
+          <td>Documents cartographiques</td>
+          <td style="white-space: pre-line;">Une description</td>
+          <td>Visible seulement par les administrations</td>
+          <td>
+            <div style="display: flex; justify-content: end; align-items: center;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-edit-line" title="Modifier le document de Documents cartographiques" aria-label="Modifier le document de Documents cartographiques" type="button">
+                <!---->
+              </button>
+              <!---->
+            </div>
+          </td>
+        </tr>
+        <tr>
+          <td class="fr-label--disabled">Dossier de demande</td>
+          <td>-</td>
+          <td>-</td>
+          <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Dossier de demande" aria-label="Ajouter un document Dossier de demande" type="button">
+              <!---->
+            </button></td>
+        </tr>
+        <tr>
+          <td class="fr-label--disabled">Formulaire de demande</td>
+          <td>-</td>
+          <td>-</td>
+          <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Formulaire de demande" aria-label="Ajouter un document Formulaire de demande" type="button">
+              <!---->
+            </button></td>
+        </tr>
+        <tr>
+          <td class="fr-label--disabled">Justificatif de paiement</td>
+          <td>-</td>
+          <td>-</td>
+          <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Justificatif de paiement" aria-label="Ajouter un document Justificatif de paiement" type="button">
+              <!---->
+            </button></td>
+        </tr>
+      </tbody>
+    </table>
+  </div>
+  <div style="display: flex; flex-direction: column;" class="fr-mt-3w">
+    <div class="fr-table fr-mb-0">
+      <table style="display: table;">
+        <caption>Documents complémentaires</caption>
+        <thead>
+          <tr>
+            <th scope="col">Nom</th>
+            <th scope="col">Description</th>
+            <th scope="col">Visibilité</th>
+            <th scope="col" style="display: flex; justify-content: end;">Action</th>
+          </tr>
+        </thead>
+        <tbody>
+          <tr>
+            <td>Décision cas par cas</td>
+            <td style="white-space: pre-line;">Une description</td>
+            <td>Visible seulement par les administrations</td>
+            <td>
+              <div style="display: flex; justify-content: end; align-items: center;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-edit-line" title="Modifier le document de Décision cas par cas" aria-label="Modifier le document de Décision cas par cas" type="button">
+                  <!---->
+                </button>
+                <!---->
+              </div>
+            </td>
+          </tr>
+          <tr>
+            <td>Dossier "Loi sur l'eau"</td>
+            <td style="white-space: pre-line;">
+              <!---->
+            </td>
+            <td>Public</td>
+            <td>
+              <div style="display: flex; justify-content: end; align-items: center;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-edit-line" title="Modifier le document de Dossier &quot;Loi sur l'eau&quot;" aria-label="Modifier le document de Dossier &quot;Loi sur l'eau&quot;" type="button">
+                  <!---->
+                </button>
+                <!---->
+              </div>
+            </td>
+          </tr>
+        </tbody>
+      </table>
+    </div><button class="fr-btn fr-btn--secondary fr-btn--md fr-icon-add-line fr-btn--icon-right fr-mt-1w" title="Ajouter un document complémentaire" aria-label="Ajouter un document complémentaire" type="button" style="align-self: end;">Ajouter</button>
+  </div>
+  <!---->
+  <!---->
+  <!---->
+</div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/etape-documents-edit.stories_snapshots_SdomZone.html b/packages/ui/src/components/etape/etape-documents-edit.stories_snapshots_SdomZone.html
new file mode 100644
index 0000000000000000000000000000000000000000..1688d6b91d65f53c7f0873e4ffaf1d73a1fdd6f0
--- /dev/null
+++ b/packages/ui/src/components/etape/etape-documents-edit.stories_snapshots_SdomZone.html
@@ -0,0 +1,138 @@
+<div class="dsfr">
+  <div class="fr-table fr-mb-0">
+    <table style="display: table;">
+      <caption>Documents obligatoires</caption>
+      <thead>
+        <tr>
+          <th scope="col">Nom</th>
+          <th scope="col">Description</th>
+          <th scope="col">Visibilité</th>
+          <th scope="col" style="display: flex; justify-content: end;">Action</th>
+        </tr>
+      </thead>
+      <tbody>
+        <tr>
+          <td>Décision cas par cas</td>
+          <td style="white-space: pre-line;">Une description</td>
+          <td>Visible seulement par les administrations</td>
+          <td>
+            <div style="display: flex; justify-content: end; align-items: center;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-edit-line" title="Modifier le document de Décision cas par cas" aria-label="Modifier le document de Décision cas par cas" type="button">
+                <!---->
+              </button>
+              <!---->
+            </div>
+          </td>
+        </tr>
+        <tr>
+          <td>Documents cartographiques</td>
+          <td style="white-space: pre-line;">Une description</td>
+          <td>Visible seulement par les administrations</td>
+          <td>
+            <div style="display: flex; justify-content: end; align-items: center;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-edit-line" title="Modifier le document de Documents cartographiques" aria-label="Modifier le document de Documents cartographiques" type="button">
+                <!---->
+              </button>
+              <!---->
+            </div>
+          </td>
+        </tr>
+        <tr>
+          <td>Dossier "Loi sur l'eau"</td>
+          <td style="white-space: pre-line;">
+            <!---->
+          </td>
+          <td>Public</td>
+          <td>
+            <div style="display: flex; justify-content: end; align-items: center;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-edit-line" title="Modifier le document de Dossier &quot;Loi sur l'eau&quot;" aria-label="Modifier le document de Dossier &quot;Loi sur l'eau&quot;" type="button">
+                <!---->
+              </button>
+              <!---->
+            </div>
+          </td>
+        </tr>
+        <tr>
+          <td class="fr-label--disabled">Lettre de demande</td>
+          <td>-</td>
+          <td>-</td>
+          <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Lettre de demande" aria-label="Ajouter un document Lettre de demande" type="button">
+              <!---->
+            </button></td>
+        </tr>
+        <tr>
+          <td class="fr-label--disabled">Identification de matériel</td>
+          <td>-</td>
+          <td>-</td>
+          <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Identification de matériel" aria-label="Ajouter un document Identification de matériel" type="button">
+              <!---->
+            </button></td>
+        </tr>
+        <tr>
+          <td class="fr-label--disabled">Justification d’existence du gisement</td>
+          <td>-</td>
+          <td>-</td>
+          <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Justification d’existence du gisement" aria-label="Ajouter un document Justification d’existence du gisement" type="button">
+              <!---->
+            </button></td>
+        </tr>
+        <tr>
+          <td class="fr-label--disabled">Mesures prévues pour réhabiliter le site </td>
+          <td>-</td>
+          <td>-</td>
+          <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Mesures prévues pour réhabiliter le site " aria-label="Ajouter un document Mesures prévues pour réhabiliter le site " type="button">
+              <!---->
+            </button></td>
+        </tr>
+        <tr>
+          <td class="fr-label--disabled">Méthodes pour l'exécution des travaux</td>
+          <td>-</td>
+          <td>-</td>
+          <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Méthodes pour l'exécution des travaux" aria-label="Ajouter un document Méthodes pour l'exécution des travaux" type="button">
+              <!---->
+            </button></td>
+        </tr>
+        <tr>
+          <td class="fr-label--disabled">Notice d’impact renforcée</td>
+          <td>-</td>
+          <td>-</td>
+          <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Notice d’impact renforcée" aria-label="Ajouter un document Notice d’impact renforcée" type="button">
+              <!---->
+            </button></td>
+        </tr>
+        <tr>
+          <td class="fr-label--disabled">Programme des travaux </td>
+          <td>-</td>
+          <td>-</td>
+          <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Programme des travaux " aria-label="Ajouter un document Programme des travaux " type="button">
+              <!---->
+            </button></td>
+        </tr>
+        <tr>
+          <td class="fr-label--disabled">Schéma de pénétration du massif forestier</td>
+          <td>-</td>
+          <td>-</td>
+          <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Schéma de pénétration du massif forestier" aria-label="Ajouter un document Schéma de pénétration du massif forestier" type="button">
+              <!---->
+            </button></td>
+        </tr>
+      </tbody>
+    </table>
+  </div>
+  <div style="display: flex; flex-direction: column;" class="fr-mt-3w">
+    <div class="fr-table fr-mb-0">
+      <table style="display: table;">
+        <caption>Documents complémentaires</caption>
+        <thead>
+          <tr>
+            <th scope="col">Nom</th>
+            <th scope="col">Description</th>
+            <th scope="col">Visibilité</th>
+            <th scope="col" style="display: flex; justify-content: end;">Action</th>
+          </tr>
+        </thead>
+        <tbody></tbody>
+      </table>
+    </div><button class="fr-btn fr-btn--secondary fr-btn--md fr-icon-add-line fr-btn--icon-right fr-mt-1w" title="Ajouter un document complémentaire" aria-label="Ajouter un document complémentaire" type="button" style="align-self: end;">Ajouter</button>
+  </div>
+  <!---->
+  <!---->
+  <!---->
+</div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/etape-documents-edit.stories_snapshots_WithError.html b/packages/ui/src/components/etape/etape-documents-edit.stories_snapshots_WithError.html
new file mode 100644
index 0000000000000000000000000000000000000000..1250201be282da7e39dc5c057fc9b06b6fd93a68
--- /dev/null
+++ b/packages/ui/src/components/etape/etape-documents-edit.stories_snapshots_WithError.html
@@ -0,0 +1,12 @@
+<div class="dsfr">
+  <div class=" undefined" style="display: flex; justify-content: center;">
+    <div>
+      <div class="_tooltip_4f6ea8">
+        <h6 class="_tooltip-content_4f6ea8">Une erreur est survenue</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
+          <use href="#icon-error-warning"></use>
+        </svg>
+      </div>
+    </div>
+    <!---->
+  </div>
+</div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/etape-documents-edit.tsx b/packages/ui/src/components/etape/etape-documents-edit.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..a113f48d8e3b9680ff654dd166cca082471af028
--- /dev/null
+++ b/packages/ui/src/components/etape/etape-documents-edit.tsx
@@ -0,0 +1,377 @@
+import {
+  DocumentComplementaireAslEtapeDocumentModification,
+  DocumentComplementaireDaeEtapeDocumentModification,
+  EtapeDocument,
+  EtapeDocumentModification,
+  EtapeId,
+  GetEtapeDocumentsByEtapeId,
+  TempEtapeDocument,
+  documentTypeIdComplementaireObligatoireASL,
+  documentTypeIdComplementaireObligatoireDAE,
+  needAslAndDae,
+} from 'camino-common/src/etape'
+import { DemarcheTypeId } from 'camino-common/src/static/demarchesTypes'
+import { EtapeTypeId } from 'camino-common/src/static/etapesTypes'
+import { TitreTypeId } from 'camino-common/src/static/titresTypes'
+import { ApiClient } from '../../api/api-client'
+import { DeepReadonly, FunctionalComponent, computed, defineComponent, onMounted, ref, watch } from 'vue'
+import { SDOMZoneId } from 'camino-common/src/static/sdom'
+import { isNonEmptyArray, isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty, isNullOrUndefined, NonEmptyArray } from 'camino-common/src/typescript-tools'
+import { DocumentType, DocumentTypeId, DocumentsTypes } from 'camino-common/src/static/documentsTypes'
+import { LoadingElement } from '../_ui/functional-loader'
+import { AsyncData } from '../../api/client-rest'
+import { DsfrButtonIcon } from '../_ui/dsfr-button'
+import { EtapeStatutId, EtapesStatuts } from 'camino-common/src/static/etapesStatuts'
+import { canDeleteEtapeDocument } from 'camino-common/src/permissions/titres-etapes'
+import { getVisibilityLabel } from './etape-documents'
+import { AddEtapeDocumentPopup } from './add-etape-document-popup'
+import { User } from 'camino-common/src/roles'
+import { getDocumentsTypes } from 'camino-common/src/permissions/etape-form'
+import { AddEtapeDaeDocumentPopup } from './add-etape-dae-document-popup'
+import { AddEtapeAslDocumentPopup } from './add-etape-asl-document-popup'
+import { dateFormat } from 'camino-common/src/date'
+
+interface Props {
+  tde: {
+    titreTypeId: TitreTypeId
+    demarcheTypeId: DemarcheTypeId
+    etapeTypeId: EtapeTypeId
+  }
+  etapeStatutId: EtapeStatutId
+  sdomZoneIds: DeepReadonly<SDOMZoneId[]>
+  completeUpdate: (
+    etapeDocuments: (EtapeDocument | TempEtapeDocument)[],
+    daeDocument: DocumentComplementaireDaeEtapeDocumentModification | null,
+    aslDocument: DocumentComplementaireAslEtapeDocumentModification | null
+  ) => void
+  etapeId: EtapeId | null
+  apiClient: Pick<ApiClient, 'uploadTempDocument' | 'getEtapeDocumentsByEtapeId'>
+  contenu: DeepReadonly<{ arm?: { mecanise?: boolean } }>
+  user: User
+}
+
+type WithIndex = { index: number }
+
+type EtapeDocumentModificationWithIndex = EtapeDocumentModification & WithIndex
+export const EtapeDocumentsEdit = defineComponent<Props>(props => {
+  const etapeDocuments = ref<AsyncData<GetEtapeDocumentsByEtapeId>>({ status: 'LOADING' })
+
+  onMounted(async () => {
+    if (isNotNullNorUndefined(props.etapeId)) {
+      etapeDocuments.value = { status: 'LOADING' }
+      try {
+        const result = await props.apiClient.getEtapeDocumentsByEtapeId(props.etapeId)
+
+        etapeDocuments.value = { status: 'LOADED', value: result }
+      } catch (e: any) {
+        console.error('error', e)
+        etapeDocuments.value = {
+          status: 'ERROR',
+          message: e.message ?? "Une erreur s'est produite",
+        }
+      }
+    } else {
+      etapeDocuments.value = { status: 'LOADED', value: { etapeDocuments: [], asl: null, dae: null } }
+    }
+    if (etapeDocuments.value.status === 'LOADED') {
+      props.completeUpdate(etapeDocuments.value.value.etapeDocuments, etapeDocuments.value.value.dae, etapeDocuments.value.value.asl)
+    }
+  })
+
+  return () => <LoadingElement data={etapeDocuments.value} renderItem={items => <EtapeDocumentsLoaded {...items} {...props} />} />
+})
+
+type EtapeDocumentsLoadedProps = GetEtapeDocumentsByEtapeId & Props
+const EtapeDocumentsLoaded = defineComponent<EtapeDocumentsLoadedProps>(props => {
+  const daeDocument = ref<DocumentComplementaireDaeEtapeDocumentModification | null>(props.dae)
+  const aslDocument = ref<DocumentComplementaireAslEtapeDocumentModification | null>(props.asl)
+  const etapeDocuments = ref<EtapeDocumentModificationWithIndex[]>(props.etapeDocuments.map((document, index) => ({ ...document, index })))
+
+  watch(
+    () => [etapeDocuments.value, daeDocument.value, aslDocument.value],
+    () => {
+      props.completeUpdate(etapeDocuments.value, daeDocument.value, aslDocument.value)
+    },
+    { deep: true }
+  )
+
+  const addOrEditPopupOpen = ref<{ open: true; documentTypeIds: NonEmptyArray<DocumentTypeId>; document?: (EtapeDocument | TempEtapeDocument) & WithIndex } | { open: false }>({ open: false })
+
+  const addOrEditDaePopupOpen = ref<boolean>(false)
+  const addOrEditAslPopupOpen = ref<boolean>(false)
+
+  const documentTypes = computed<DocumentType[]>(() => {
+    return getDocumentsTypes({ contenu: props.contenu, typeId: props.tde.etapeTypeId }, props.tde.demarcheTypeId, props.tde.titreTypeId, props.sdomZoneIds)
+  })
+
+  const needAslAndDaeCompute = computed<boolean>(() => {
+    return needAslAndDae(props.tde, props.etapeStatutId, props.user)
+  })
+
+  const completeRequiredDocuments = computed<PropsTable['documents']>(() => {
+    const documents: PropsTable['documents'] = etapeDocuments.value.filter(({ etape_document_type_id }) => documentTypes.value.some(dt => dt.id === etape_document_type_id && !dt.optionnel))
+
+    if (needAslAndDaeCompute.value) {
+      if (isNotNullNorUndefined(daeDocument.value)) {
+        documents.push({
+          ...daeDocument.value,
+          index: 'dae',
+          description: `${daeDocument.value.description}
+- Statut : ${EtapesStatuts[daeDocument.value.etape_statut_id].nom}
+- Date : ${dateFormat(daeDocument.value.date)}
+- Arrêté : ${daeDocument.value.arrete_prefectoral ?? ''}
+`,
+        })
+      }
+      if (isNotNullNorUndefined(aslDocument.value)) {
+        documents.push({
+          ...aslDocument.value,
+          index: 'asl',
+          description: `${aslDocument.value.description}
+        - Statut : ${EtapesStatuts[aslDocument.value.etape_statut_id].nom}
+        - Date : ${dateFormat(aslDocument.value.date)}
+        `,
+        })
+      }
+    }
+
+    return documents
+  })
+  const emptyRequiredDocuments = computed<DocumentTypeId[]>(() => {
+    const documents = documentTypes.value
+      .filter(({ optionnel, id }) => !optionnel && !completeRequiredDocuments.value.some(({ etape_document_type_id }) => etape_document_type_id === id))
+      .map(({ id }) => id)
+
+    if (needAslAndDaeCompute.value) {
+      if (isNullOrUndefined(daeDocument.value)) {
+        documents.push(documentTypeIdComplementaireObligatoireDAE)
+      }
+      if (isNullOrUndefined(aslDocument.value)) {
+        documents.push(documentTypeIdComplementaireObligatoireASL)
+      }
+    }
+
+    return documents
+  })
+  const additionnalDocumentTypeIds = computed<DocumentTypeId[]>(() => {
+    return documentTypes.value.filter(dt => dt.optionnel).map(({ id }) => id)
+  })
+
+  const additionnalDocuments = computed<PropsTable['documents']>(() => {
+    return etapeDocuments.value.filter(({ etape_document_type_id }) => documentTypes.value.some(dt => dt.id === etape_document_type_id && dt.optionnel))
+  })
+  const openAddPopupAdditionnalDocument = () => {
+    if (isNonEmptyArray(additionnalDocumentTypeIds.value)) {
+      addOrEditPopupOpen.value = { open: true, documentTypeIds: additionnalDocumentTypeIds.value }
+    }
+  }
+  const closeAddPopup = (newDocument: EtapeDocumentModification | null) => {
+    if (newDocument !== null && addOrEditPopupOpen.value.open) {
+      const index = addOrEditPopupOpen.value.document?.index
+      if (isNullOrUndefined(index)) {
+        etapeDocuments.value.push({ ...newDocument, index: etapeDocuments.value.length })
+      } else {
+        etapeDocuments.value[index] = { ...newDocument, index }
+      }
+    }
+
+    addOrEditPopupOpen.value = { open: false }
+  }
+
+  const closeAddDaePopup = (newDocument: DocumentComplementaireDaeEtapeDocumentModification | null) => {
+    if (newDocument !== null) {
+      daeDocument.value = newDocument
+    }
+
+    addOrEditDaePopupOpen.value = false
+  }
+
+  const closeAddAslPopup = (newDocument: DocumentComplementaireAslEtapeDocumentModification | null) => {
+    if (newDocument !== null) {
+      aslDocument.value = newDocument
+    }
+
+    addOrEditAslPopupOpen.value = false
+  }
+
+  const addDocument = (documentTypeId: DocumentTypeId) => {
+    if (needAslAndDaeCompute.value && documentTypeId === documentTypeIdComplementaireObligatoireDAE) {
+      addOrEditDaePopupOpen.value = true
+    } else if (needAslAndDaeCompute.value && documentTypeId === documentTypeIdComplementaireObligatoireASL) {
+      addOrEditAslPopupOpen.value = true
+    } else {
+      addOrEditPopupOpen.value = { open: true, documentTypeIds: [documentTypeId] }
+    }
+  }
+  const editDocument = (documentIndex: number | 'asl' | 'dae') => {
+    switch (documentIndex) {
+      case 'asl':
+        addOrEditAslPopupOpen.value = true
+        break
+      case 'dae':
+        addOrEditDaePopupOpen.value = true
+        break
+      default: {
+        const document = etapeDocuments.value[documentIndex]
+        addOrEditPopupOpen.value = { open: true, documentTypeIds: [document.etape_document_type_id], document }
+      }
+    }
+  }
+  const removeDocument = (documentIndex: number) => {
+    etapeDocuments.value.splice(documentIndex, 1)
+  }
+
+  const getNom = (documentTypeId: DocumentTypeId) => {
+    if (needAslAndDaeCompute.value && documentTypeId === documentTypeIdComplementaireObligatoireDAE) {
+      return `${DocumentsTypes[documentTypeIdComplementaireObligatoireDAE].nom} de la mission autorité environnementale`
+    }
+    if (needAslAndDaeCompute.value && documentTypeId === documentTypeIdComplementaireObligatoireASL) {
+      return `${DocumentsTypes[documentTypeIdComplementaireObligatoireASL].nom} de la décision du propriétaire du sol`
+    }
+
+    return DocumentsTypes[documentTypeId].nom
+  }
+
+  return () => (
+    <>
+      {isNotNullNorUndefinedNorEmpty(emptyRequiredDocuments.value) || isNotNullNorUndefinedNorEmpty(completeRequiredDocuments.value) ? (
+        <EtapeDocumentsTable
+          getNom={getNom}
+          add={addDocument}
+          edit={editDocument}
+          delete={removeDocument}
+          caption="Documents obligatoires"
+          emptyRequiredDocuments={emptyRequiredDocuments.value}
+          documents={completeRequiredDocuments.value}
+          etapeStatutId={props.etapeStatutId}
+        />
+      ) : null}
+
+      {isNonEmptyArray(additionnalDocumentTypeIds.value) ? (
+        <>
+          <div style={{ display: 'flex', flexDirection: 'column' }} class="fr-mt-3w">
+            <EtapeDocumentsTable
+              getNom={getNom}
+              add={addDocument}
+              edit={editDocument}
+              delete={removeDocument}
+              caption="Documents complémentaires"
+              emptyRequiredDocuments={[]}
+              documents={additionnalDocuments.value}
+              etapeStatutId={props.etapeStatutId}
+            />
+            <DsfrButtonIcon
+              style={{ alignSelf: 'end' }}
+              class="fr-mt-1w"
+              icon="fr-icon-add-line"
+              buttonType="secondary"
+              title="Ajouter un document complémentaire"
+              label="Ajouter"
+              onClick={openAddPopupAdditionnalDocument}
+            />
+          </div>
+          {addOrEditPopupOpen.value.open ? (
+            <AddEtapeDocumentPopup
+              documentTypeIds={addOrEditPopupOpen.value.documentTypeIds}
+              apiClient={props.apiClient}
+              close={closeAddPopup}
+              user={props.user}
+              initialDocument={addOrEditPopupOpen.value.document}
+            />
+          ) : null}
+          {addOrEditDaePopupOpen.value ? <AddEtapeDaeDocumentPopup apiClient={props.apiClient} close={closeAddDaePopup} initialDocument={daeDocument.value} /> : null}
+
+          {addOrEditAslPopupOpen.value ? <AddEtapeAslDocumentPopup apiClient={props.apiClient} close={closeAddAslPopup} initialDocument={aslDocument.value} /> : null}
+        </>
+      ) : null}
+    </>
+  )
+})
+
+type PropsTable = {
+  caption: string
+  documents: ((EtapeDocument | TempEtapeDocument) & { index: number | 'asl' | 'dae' })[]
+  etapeStatutId: EtapeStatutId | null
+  emptyRequiredDocuments: DocumentTypeId[]
+  getNom: (documentTypeId: DocumentTypeId) => string
+  add: (documentTypeId: DocumentTypeId) => void
+  edit: (documentIndex: number | 'asl' | 'dae') => void
+  delete: (documentIndex: number) => void
+}
+const EtapeDocumentsTable: FunctionalComponent<PropsTable> = (props: PropsTable) => {
+  const deleteDocument = (index: number) => () => {
+    props.delete(index)
+  }
+  const editDocument = (index: number | 'asl' | 'dae') => () => {
+    props.edit(index)
+  }
+
+  return (
+    <div class="fr-table fr-mb-0">
+      <table style={{ display: 'table' }}>
+        <caption>{props.caption}</caption>
+        <thead>
+          <tr>
+            <th scope="col">Nom</th>
+            <th scope="col">Description</th>
+            <th scope="col">Visibilité</th>
+            <th scope="col" style={{ display: 'flex', justifyContent: 'end' }}>
+              Action
+            </th>
+          </tr>
+        </thead>
+        <tbody>
+          {props.documents.map(document => (
+            <tr>
+              <td>{props.getNom(document.etape_document_type_id)}</td>
+              <td style={{ whiteSpace: 'pre-line' }}>{document.description}</td>
+              <td>{getVisibilityLabel(document)}</td>
+              <td>
+                <div style={{ display: 'flex', justifyContent: 'end', alignItems: 'center' }}>
+                  <DsfrButtonIcon
+                    icon="fr-icon-edit-line"
+                    title={`Modifier le document de ${props.getNom(document.etape_document_type_id)}`}
+                    onClick={editDocument(document.index)}
+                    buttonType="secondary"
+                    buttonSize="sm"
+                  />
+                  {canDeleteEtapeDocument(props.etapeStatutId) && document.index !== 'asl' && document.index !== 'dae' ? (
+                    <DsfrButtonIcon
+                      icon="fr-icon-delete-bin-line"
+                      class="fr-ml-1w"
+                      title={`Supprimer le document de ${props.getNom(document.etape_document_type_id)}`}
+                      onClick={deleteDocument(document.index)}
+                      buttonType="secondary"
+                      buttonSize="sm"
+                    />
+                  ) : null}
+                </div>
+              </td>
+            </tr>
+          ))}
+          {props.emptyRequiredDocuments.map(documentTypeId => (
+            <tr>
+              <td class="fr-label--disabled">{props.getNom(documentTypeId)}</td>
+              <td>-</td>
+              <td>-</td>
+              <td style={{ display: 'flex', justifyContent: 'end' }}>
+                <DsfrButtonIcon
+                  icon="fr-icon-add-line"
+                  title={`Ajouter un document ${props.getNom(documentTypeId)}`}
+                  onClick={() => props.add(documentTypeId)}
+                  buttonType="secondary"
+                  buttonSize="sm"
+                />
+              </td>
+            </tr>
+          ))}
+        </tbody>
+      </table>
+    </div>
+  )
+}
+
+// @ts-ignore waiting for https://github.com/vuejs/core/issues/7833
+EtapeDocumentsEdit.props = ['tde', 'completeUpdate', 'etapeId', 'apiClient', 'sdomZoneIds', 'contenu', 'etapeStatutId', 'user']
+// @ts-ignore waiting for https://github.com/vuejs/core/issues/7833
+EtapeDocumentsLoaded.props = ['tde', 'completeUpdate', 'etapeId', 'apiClient', 'sdomZoneIds', 'contenu', 'etapeStatutId', 'user', 'asl', 'dae', 'etapeDocuments']
diff --git a/packages/ui/src/components/etape/etape-documents.stories.tsx b/packages/ui/src/components/etape/etape-documents.stories.tsx
index cb1c4b073107d61604792499c1660d595feba69a..e79bfd5dd6b0be21a6d78c026de3dc902a7512a4 100644
--- a/packages/ui/src/components/etape/etape-documents.stories.tsx
+++ b/packages/ui/src/components/etape/etape-documents.stories.tsx
@@ -1,8 +1,8 @@
 import { Meta, StoryFn } from '@storybook/vue3'
-import { EtapeEntrepriseDocument, documentIdValidator, entrepriseDocumentIdValidator, entrepriseIdValidator } from 'camino-common/src/entreprise'
+import { EtapeEntrepriseDocument, entrepriseDocumentIdValidator, entrepriseIdValidator } from 'camino-common/src/entreprise'
 import { EtapeDocuments } from './etape-documents'
 import { testBlankUser } from 'camino-common/src/tests-utils'
-import { EtapeDocument } from 'camino-common/src/etape'
+import { EtapeDocument, etapeDocumentIdValidator } from 'camino-common/src/etape'
 import { vueRouter } from 'storybook-vue3-router'
 import { toCaminoDate } from 'camino-common/src/date'
 import { EntreprisesByEtapeId } from 'camino-common/src/demarche'
@@ -16,22 +16,22 @@ export default meta
 
 const documents: EtapeDocument[] = [
   {
-    id: documentIdValidator.parse('id'),
-    document_type_id: 'atf',
+    id: etapeDocumentIdValidator.parse('id'),
+    etape_document_type_id: 'atf',
     description: 'Une description',
     public_lecture: false,
     entreprises_lecture: false,
   },
   {
-    id: documentIdValidator.parse('id2'),
-    document_type_id: 'bil',
+    id: etapeDocumentIdValidator.parse('id2'),
+    etape_document_type_id: 'bil',
     description: null,
     public_lecture: true,
     entreprises_lecture: true,
   },
   {
-    id: documentIdValidator.parse('id2'),
-    document_type_id: 'bil',
+    id: etapeDocumentIdValidator.parse('id2'),
+    etape_document_type_id: 'bil',
     description: null,
     public_lecture: false,
     entreprises_lecture: true,
diff --git a/packages/ui/src/components/etape/etape-documents.tsx b/packages/ui/src/components/etape/etape-documents.tsx
index a8948f95a1d47d4d63de6e657f760b9eb6c0a653..84d6dbb097c02e37cc06031e9eec642b85ed4aa1 100644
--- a/packages/ui/src/components/etape/etape-documents.tsx
+++ b/packages/ui/src/components/etape/etape-documents.tsx
@@ -1,9 +1,9 @@
 import { FunctionalComponent } from 'vue'
-import { EtapeDocument } from 'camino-common/src/etape'
+import { EtapeDocument, EtapeDocumentId } from 'camino-common/src/etape'
 import { User, isAdministration, isSuper } from 'camino-common/src/roles'
 import { DocumentTypeId, DocumentsTypes } from 'camino-common/src/static/documentsTypes'
 import { getDownloadRestRoute } from '../../api/client-rest'
-import { DocumentId, EtapeEntrepriseDocument } from 'camino-common/src/entreprise'
+import { EtapeEntrepriseDocument } from 'camino-common/src/entreprise'
 import { EntreprisesByEtapeId } from 'camino-common/src/demarche'
 import { EntrepriseDocumentLink } from '../entreprise/entreprise-documents'
 import { isNullOrUndefinedOrEmpty } from 'camino-common/src/typescript-tools'
@@ -14,19 +14,26 @@ interface Props {
   titulaires: Pick<EntreprisesByEtapeId, 'id' | 'nom'>[]
   user: User
 }
-export const EtapeDocuments: FunctionalComponent<Props> = props => {
-  const getVisibilityLabel = (etapeDocument: EtapeDocument): string => {
-    if (etapeDocument.public_lecture) {
-      return 'Public'
-    }
 
-    if (etapeDocument.entreprises_lecture) {
-      return 'Visible seulement par les entreprises titulaires'
-    }
+export const VisibilityLabel = {
+  public: 'Public',
+  entreprises: 'Visible seulement par les entreprises titulaires',
+  administrations: 'Visible seulement par les administrations',
+}
+
+export const getVisibilityLabel = (etapeDocument: Pick<EtapeDocument, 'public_lecture' | 'entreprises_lecture'>): string => {
+  if (etapeDocument.public_lecture) {
+    return VisibilityLabel.public
+  }
 
-    return 'Visible seulement par les administrations'
+  if (etapeDocument.entreprises_lecture) {
+    return VisibilityLabel.entreprises
   }
 
+  return VisibilityLabel.administrations
+}
+
+export const EtapeDocuments: FunctionalComponent<Props> = props => {
   if (isNullOrUndefinedOrEmpty(props.etapeDocuments) && isNullOrUndefinedOrEmpty(props.entrepriseDocuments)) {
     return null
   }
@@ -47,7 +54,7 @@ export const EtapeDocuments: FunctionalComponent<Props> = props => {
             {props.etapeDocuments.map(item => (
               <tr>
                 <td>
-                  <EtapeDocumentLink documentId={item.id} documentTypeId={item.document_type_id} />
+                  <EtapeDocumentLink documentId={item.id} documentTypeId={item.etape_document_type_id} />
                 </td>
                 <td>{item.description}</td>
                 {isSuper(props.user) || isAdministration(props.user) ? <td>{getVisibilityLabel(item)}</td> : null}
@@ -73,7 +80,7 @@ export const EtapeDocuments: FunctionalComponent<Props> = props => {
   )
 }
 
-type EtapeDocumentLinkProps = { documentId: DocumentId; documentTypeId: DocumentTypeId }
+type EtapeDocumentLinkProps = { documentId: EtapeDocumentId; documentTypeId: DocumentTypeId }
 const EtapeDocumentLink: FunctionalComponent<EtapeDocumentLinkProps> = props => {
   return (
     <a
diff --git a/packages/ui/src/components/etape/etape-edit-form.stories.tsx b/packages/ui/src/components/etape/etape-edit-form.stories.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..89134d9cc881521d8e380a5f2dd99432e0f6ea8d
--- /dev/null
+++ b/packages/ui/src/components/etape/etape-edit-form.stories.tsx
@@ -0,0 +1,244 @@
+import { EtapeEditForm, Props } from './etape-edit-form'
+import { Meta, StoryFn } from '@storybook/vue3'
+import { EtapeId, EtapeWithHeritage, etapeIdValidator } from 'camino-common/src/etape'
+import { Entreprise, EntrepriseDocumentId, EntrepriseId, EtapeEntrepriseDocument, entrepriseDocumentIdValidator, entrepriseIdValidator, newEntrepriseId } from 'camino-common/src/entreprise'
+import { CaminoDate, toCaminoDate } from 'camino-common/src/date'
+import { testBlankUser } from 'camino-common/src/tests-utils'
+import { action } from '@storybook/addon-actions'
+import { DemarcheId, demarcheIdValidator } from 'camino-common/src/demarche'
+import { titreSlugValidator } from 'camino-common/src/validators/titres'
+import { EtapeTypeId } from 'camino-common/src/static/etapesTypes'
+import { FeatureMultiPolygon } from 'camino-common/src/perimetre'
+import { TempDocumentName, tempDocumentNameValidator } from 'camino-common/src/document'
+import { UiEntrepriseDocumentInput } from '../entreprise/entreprise-api-client'
+
+const meta: Meta = {
+  title: 'Components/Etape/Edition',
+  // @ts-ignore
+  component: EtapeEditForm,
+  argTypes: {},
+}
+export default meta
+
+const entreprises: Entreprise[] = [...Array(10)].map((_e, i) => ({ id: entrepriseIdValidator.parse(`entrepriseId${i}`), nom: `Nom de l'entreprise ${i}`, legal_siren: `legal_siren${i}` }))
+
+const heritageProps: EtapeWithHeritage['heritageProps'] = {
+  dateDebut: {
+    actif: false,
+  },
+  dateFin: {
+    actif: false,
+    etape: {
+      date: toCaminoDate('2022-01-01'),
+      typeId: 'mfr',
+      dateFin: toCaminoDate('2022-01-01'),
+    },
+  },
+  duree: {
+    actif: false,
+    etape: {
+      date: toCaminoDate('2022-01-01'),
+      typeId: 'mfr',
+      duree: 12,
+    },
+  },
+  substances: {
+    actif: true,
+    etape: {
+      date: toCaminoDate('2022-01-01'),
+      typeId: 'mfr',
+      substances: ['arge'],
+    },
+  },
+  titulaires: {
+    actif: false,
+  },
+  amodiataires: {
+    actif: true,
+    etape: {
+      date: toCaminoDate('2022-01-01'),
+      typeId: 'mfr',
+      amodiataires: [
+        { id: entreprises[0].id, operateur: false },
+        { id: entreprises[1].id, operateur: false },
+        { id: entreprises[2].id, operateur: false },
+      ],
+    },
+  },
+  perimetre: {
+    actif: false,
+  },
+}
+
+const perimetre: FeatureMultiPolygon = {
+  type: 'Feature',
+  properties: {},
+
+  geometry: {
+    type: 'MultiPolygon',
+    coordinates: [
+      [
+        [
+          [-52.54, 4.22269896902571],
+          [-52.55, 4.22438936251509],
+          [-52.55, 4.24113309117193],
+          [-52.54, 4.22269896902571],
+        ],
+      ],
+    ],
+  },
+}
+
+const etape: Props['etape'] = {
+  id: etapeIdValidator.parse('id'),
+  statutId: 'fai',
+  typeId: 'mfr',
+  contenu: { arm: { mecanise: true, franchissements: 2 } },
+  date: toCaminoDate('2022-02-02'),
+  dateDebut: toCaminoDate('2022-02-02'),
+  dateFin: null,
+  duree: 4,
+  substances: ['arse'],
+  titulaires: [{ id: newEntrepriseId('optionId1'), operateur: true }],
+  amodiataires: [],
+  notes: 'Super notes de cette story',
+  geojson4326Forages: null,
+  geojson4326Perimetre: null,
+  geojson4326Points: null,
+  surface: null,
+  geojsonOriginePerimetre: null,
+  geojsonOriginePoints: null,
+  geojsonOrigineGeoSystemeId: null,
+  geojsonOrigineForages: null,
+  heritageContenu: null,
+  heritageProps: null,
+}
+
+const goToDemarcheAction = action('goToDemarche')
+const deposeEtapeAction = action('deposeEtape')
+const etapeCreerAction = action('etapeCreer')
+const etapeModifierAction = action('etapeModifier')
+const getEtapesTypesEtapesStatutsAction = action('getEtapesTypesEtapesStatuts')
+const getEtapeHeritagePotentielAction = action('getEtapeHeritagePotentiel')
+const geojsonImportAction = action('geojsonImport')
+const uploadTempDocumentAction = action('uploadTempDocumentAction')
+const getGeojsonByGeoSystemeIdAction = action('getGeojsonByGeoSystemeId')
+const getEtapeDocumentsByEtapeIdAction = action('getEtapeDocumentsByEtapeId')
+const getEtapeEntrepriseDocumentsAction = action('getEtapeEntrepriseDocuments')
+const creerEntrepriseDocumentAction = action('creerEntrepriseDocument')
+
+const etapeEditFormApiClient: Props['apiClient'] = {
+  deposeEtape(etapeId) {
+    deposeEtapeAction(etapeId)
+
+    return Promise.resolve(undefined)
+  },
+  etapeCreer(etape) {
+    etapeCreerAction(etape)
+
+    return Promise.resolve(etapeIdValidator.parse('etapeIdSaved'))
+  },
+  etapeModifier(etape) {
+    etapeModifierAction(etape)
+
+    return Promise.resolve(etape.id)
+  },
+  getEntrepriseDocuments() {
+    return Promise.resolve([])
+  },
+  getEtapesTypesEtapesStatuts(demarcheId: DemarcheId, titreEtapeId: EtapeId | null, date: CaminoDate) {
+    getEtapesTypesEtapesStatutsAction(demarcheId, titreEtapeId, date)
+
+    return Promise.resolve([
+      { etapeTypeId: 'mfr', etapeStatutId: 'fai', mainStep: true },
+      { etapeTypeId: 'mfr', etapeStatutId: 'aco', mainStep: true },
+      { etapeTypeId: 'mdp', etapeStatutId: 'fai', mainStep: true },
+    ])
+  },
+  getEtapeHeritagePotentiel(titreDemarcheId: DemarcheId, date: CaminoDate, typeId: EtapeTypeId) {
+    getEtapeHeritagePotentielAction(titreDemarcheId, date, typeId)
+
+    return Promise.resolve({
+      heritageContenu: { arm: { mecanise: { actif: false }, franchissements: { actif: false } } },
+      heritageProps,
+    })
+  },
+  geojsonImport(body, geoSystemeId) {
+    geojsonImportAction(body, geoSystemeId)
+
+    return Promise.reject(new Error('plop'))
+  },
+  geojsonPointsImport(body, geoSystemeId) {
+    geojsonImportAction(body, geoSystemeId)
+
+    return Promise.reject(new Error('plop'))
+  },
+  geojsonForagesImport(body, geoSystemeId) {
+    geojsonImportAction(body, geoSystemeId)
+
+    return Promise.reject(new Error('plop'))
+  },
+  uploadTempDocument(document) {
+    uploadTempDocumentAction(document)
+
+    return Promise.resolve(tempDocumentNameValidator.parse('name'))
+  },
+  getGeojsonByGeoSystemeId(geojson, geoSystemeId) {
+    getGeojsonByGeoSystemeIdAction(geojson, geoSystemeId)
+
+    return Promise.resolve(geojson)
+  },
+  getEtapeDocumentsByEtapeId(etapeId: EtapeId) {
+    getEtapeDocumentsByEtapeIdAction(etapeId)
+
+    return Promise.resolve({ etapeDocuments: [], dae: null, asl: null })
+  },
+  getEtapeEntrepriseDocuments(etapeId: EtapeId): Promise<EtapeEntrepriseDocument[]> {
+    getEtapeEntrepriseDocumentsAction(etapeId)
+
+    return Promise.resolve([])
+  },
+  creerEntrepriseDocument(entrepriseId: EntrepriseId, entrepriseDocumentInput: UiEntrepriseDocumentInput, tempDocumentName: TempDocumentName): Promise<EntrepriseDocumentId> {
+    creerEntrepriseDocumentAction(entrepriseId, entrepriseDocumentInput, tempDocumentName)
+
+    return Promise.resolve(entrepriseDocumentIdValidator.parse('entrepriseDocumentId'))
+  },
+}
+
+export const Default: StoryFn = () => (
+  <EtapeEditForm
+    initTab="points"
+    perimetre={{ sdomZoneIds: [], superposition_alertes: [] }}
+    apiClient={etapeEditFormApiClient}
+    demarcheId={demarcheIdValidator.parse('demarcheId')}
+    demarcheTypeId="oct"
+    titreSlug={titreSlugValidator.parse('titre-slug')}
+    titreTypeId="arm"
+    etape={etape}
+    user={{
+      role: 'super',
+      ...testBlankUser,
+    }}
+    entreprises={entreprises}
+    goToDemarche={goToDemarcheAction}
+  />
+)
+
+export const EtapeModification: StoryFn = () => (
+  <EtapeEditForm
+    initTab="points"
+    apiClient={etapeEditFormApiClient}
+    demarcheId={demarcheIdValidator.parse('demarcheId')}
+    demarcheTypeId="oct"
+    titreSlug={titreSlugValidator.parse('titre-slug')}
+    titreTypeId="cxw"
+    perimetre={{ sdomZoneIds: [], superposition_alertes: [] }}
+    etape={{ ...etape, geojson4326Perimetre: perimetre, geojsonOriginePerimetre: perimetre, geojsonOrigineGeoSystemeId: '4326' }}
+    user={{
+      role: 'super',
+      ...testBlankUser,
+    }}
+    entreprises={entreprises}
+    goToDemarche={goToDemarcheAction}
+  />
+)
diff --git a/packages/ui/src/components/etape/etape-edit-form.stories_snapshots_Default.html b/packages/ui/src/components/etape/etape-edit-form.stories_snapshots_Default.html
new file mode 100644
index 0000000000000000000000000000000000000000..4d888a2d56b21c277c8a644d234e93de07935eaa
--- /dev/null
+++ b/packages/ui/src/components/etape/etape-edit-form.stories_snapshots_Default.html
@@ -0,0 +1,709 @@
+<form class="dsfr">
+  <div>
+    <div class="dsfr">
+      <h2 class="cap-first fr-pt-6w">Informations principales</h2>
+      <!---->
+      <!---->
+    </div>
+    <div>
+      <div class="fr-grid-row">
+        <div class="fr-col-12 fr-col-xl-6">
+          <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_271">Date
+              <!---->
+              <!---->
+            </label><input class="fr-input" name="input_271" id="input_271" type="date">
+            <!---->
+          </div>
+          <div class="fr-mt-2w">
+            <div class="fr-input-group"><label class="fr-label fr-mb-1w" for="select-etape-type">Type *</label>
+              <div id="select-etape-type_wrapper" class="_typeahead_8eddf1 dsfr">
+                <div class="flex"><input id="select-etape-type" type="text" name="select-etape-type" disabled="" class="_typeahead-input_8eddf1 fr-input" placeholder="" autocomplete="off"></div>
+                <!---->
+              </div>
+            </div>
+            <div class="fr-select-group"><label class="fr-label" for="select-etape-statut-id">Statut *
+                <!---->
+              </label><select class="fr-select" id="select-etape-statut-id" aria-label="Statut" name="select-etape-statut-id">
+                <option disabled="" value="fai">fait</option>
+                <option value="aco">en construction</option>
+                <option disabled="" hidden="" value="">Selectionnez une option</option>
+              </select></div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+  <div gotodemarche="function(...args){let channel=import_preview_api.addons.getChannel(),id=(0,import_uuid.v4)(),minDepth=5,serializedArgs=args.map(serializeArg),normalizedArgs=args.length>1?serializedArgs:serializedArgs[0],actionDisplayToEmit={id,count:0,data:{name,args:normalizedArgs},options:{...actionOptions,maxDepth:minDepth+(actionOptions.depth||3),allowFunction:actionOptions.allowFunction||!1}};channel.emit(EVENT_ID,actionDisplayToEmit)}">
+    <div>
+      <div class="dsfr">
+        <h2 class="cap-first fr-pt-6w">Propriétés</h2>
+        <!---->
+        <!---->
+      </div>
+      <div>
+        <div class="fr-grid-row">
+          <div class="fr-col-12 fr-col-xl-6">
+            <!---->
+            <!---->
+            <!---->
+            <div class="fr-input-group"><label class="fr-label" for="filters_autocomplete_titulaires">
+                <h6>Titulaires</h6>
+              </label>
+              <div class="mb-s">
+                <div id="filters_autocomplete_titulaires_wrapper" class="_typeahead_8eddf1 dsfr">
+                  <div style="display: flex; max-height: unset; flex-wrap: wrap; gap: 8px; outline-offset: 2px; outline-width: 2px; outline-color: rgb(10, 118, 246);" class="fr-input _fake-input_8eddf1"><input id="filters_autocomplete_titulaires" type="text" name="filters_autocomplete_titulaires" class="_typeahead-input_8eddf1" style="outline: none;" placeholder="titulaires" autocomplete="off"></div>
+                  <!---->
+                </div>
+                <!---->
+              </div>
+            </div>
+            <!---->
+            <div>
+              <h6>Substances</h6>
+              <div class="mb-s">
+                <div>
+                  <p class="fr-tag fr-tag--md fr-mr-1w" title="Argent" aria-label="Argent">Argent</p>
+                </div>
+                <div class="dsfr">
+                  <div class="fr-toggle"><input type="checkbox" class="fr-toggle__input" id="toggle_670"><label class="fr-toggle__label" for="toggle_670" data-fr-checked-label="Activé" data-fr-unchecked-label="Désactivé"><span class=" fr-ml-4w">Hériter de l’étape "Demande" du 01-01-2022</span></label>
+                    <!---->
+                  </div>
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div>
+      <div class="dsfr">
+        <h2 class="cap-first fr-pt-6w">Propriétés spécifiques</h2>
+        <!---->
+        <div class="fr-alert fr-alert--info fr-alert--sm">
+          <p>Ce bloc permet de savoir si la prospection est mécanisée ou non et s’il y a des franchissements de cours d’eau (si oui, combien ?)</p>
+        </div>
+      </div>
+      <div>
+        <div class="fr-grid-row">
+          <div class="fr-col-12 fr-col-xl-6">
+            <div>
+              <h3>Caractéristiques ARM</h3>
+              <div class="mb-s">
+                <div>
+                  <fieldset class="fr-fieldset" id="mecanise" aria-labelledby="mecanise-legend">
+                    <legend class="fr-fieldset__legend--regular fr-fieldset__legend" id="mecanise-legend">Prospection mécanisée *
+                      <!---->
+                    </legend>
+                    <div class="fr-fieldset__element">
+                      <div class="fr-radio-group"><input type="radio" id="mecanise-0" name="mecanise"><label class="fr-label" for="mecanise-0">Oui
+                          <!---->
+                        </label></div>
+                    </div>
+                    <div class="fr-fieldset__element">
+                      <div class="fr-radio-group"><input type="radio" id="mecanise-1" name="mecanise"><label class="fr-label" for="mecanise-1">Non
+                          <!---->
+                        </label></div>
+                    </div>
+                  </fieldset>
+                </div>
+                <!---->
+              </div>
+              <div class="mb-s">
+                <div>
+                  <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_74">Franchissements de cours d'eau
+                      <!----><span class="fr-hint-text">Nombre de franchissements de cours d'eau</span>
+                    </label><input class="fr-input" name="input_74" id="input_74" type="number" min="0">
+                    <!---->
+                  </div>
+                </div>
+                <!---->
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div>
+      <div class="dsfr">
+        <h2 class="cap-first fr-pt-6w">Périmètre</h2>
+        <p style="z-index: unset; margin-bottom: 0px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;" class="fr-badge fr-badge--sm fr-badge--error fr-badge--no-icon" title="Incomplet" aria-label="Incomplet">Incomplet</p>
+        <!---->
+      </div>
+      <div>
+        <div>
+          <div class="mb-s">
+            <div><button class="fr-btn fr-btn--primary fr-btn--md" title="Importer un périmètre" aria-label="Importer un périmètre" type="button">Importer un périmètre</button>
+              <!---->
+              <!---->
+              <!---->
+            </div>
+            <!---->
+          </div>
+          <!---->
+          <!---->
+          <!---->
+        </div>
+      </div>
+    </div>
+    <div>
+      <div class="dsfr">
+        <h2 class="cap-first fr-pt-6w">Liste des documents</h2>
+        <p style="z-index: unset; margin-bottom: 0px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;" class="fr-badge fr-badge--sm fr-badge--error fr-badge--no-icon" title="Incomplet" aria-label="Incomplet">Incomplet</p>
+        <!---->
+      </div>
+      <div>
+        <div class="fr-table fr-mb-0">
+          <table style="display: table;">
+            <caption>Documents obligatoires</caption>
+            <thead>
+              <tr>
+                <th scope="col">Nom</th>
+                <th scope="col">Description</th>
+                <th scope="col">Visibilité</th>
+                <th scope="col" style="display: flex; justify-content: end;">Action</th>
+              </tr>
+            </thead>
+            <tbody>
+              <tr>
+                <td class="fr-label--disabled">Documents cartographiques</td>
+                <td>-</td>
+                <td>-</td>
+                <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Documents cartographiques" aria-label="Ajouter un document Documents cartographiques" type="button">
+                    <!---->
+                  </button></td>
+              </tr>
+              <tr>
+                <td class="fr-label--disabled">Décision cas par cas</td>
+                <td>-</td>
+                <td>-</td>
+                <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Décision cas par cas" aria-label="Ajouter un document Décision cas par cas" type="button">
+                    <!---->
+                  </button></td>
+              </tr>
+              <tr>
+                <td class="fr-label--disabled">Dossier "Loi sur l'eau"</td>
+                <td>-</td>
+                <td>-</td>
+                <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Dossier &quot;Loi sur l'eau&quot;" aria-label="Ajouter un document Dossier &quot;Loi sur l'eau&quot;" type="button">
+                    <!---->
+                  </button></td>
+              </tr>
+              <tr>
+                <td class="fr-label--disabled">Dossier de demande</td>
+                <td>-</td>
+                <td>-</td>
+                <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Dossier de demande" aria-label="Ajouter un document Dossier de demande" type="button">
+                    <!---->
+                  </button></td>
+              </tr>
+              <tr>
+                <td class="fr-label--disabled">Formulaire de demande</td>
+                <td>-</td>
+                <td>-</td>
+                <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Formulaire de demande" aria-label="Ajouter un document Formulaire de demande" type="button">
+                    <!---->
+                  </button></td>
+              </tr>
+              <tr>
+                <td class="fr-label--disabled">Justificatif de paiement</td>
+                <td>-</td>
+                <td>-</td>
+                <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Justificatif de paiement" aria-label="Ajouter un document Justificatif de paiement" type="button">
+                    <!---->
+                  </button></td>
+              </tr>
+            </tbody>
+          </table>
+        </div>
+        <div style="display: flex; flex-direction: column;" class="fr-mt-3w">
+          <div class="fr-table fr-mb-0">
+            <table style="display: table;">
+              <caption>Documents complémentaires</caption>
+              <thead>
+                <tr>
+                  <th scope="col">Nom</th>
+                  <th scope="col">Description</th>
+                  <th scope="col">Visibilité</th>
+                  <th scope="col" style="display: flex; justify-content: end;">Action</th>
+                </tr>
+              </thead>
+              <tbody></tbody>
+            </table>
+          </div><button class="fr-btn fr-btn--secondary fr-btn--md fr-icon-add-line fr-btn--icon-right fr-mt-1w" title="Ajouter un document complémentaire" aria-label="Ajouter un document complémentaire" type="button" style="align-self: end;">Ajouter</button>
+        </div>
+        <!---->
+        <!---->
+        <!---->
+      </div>
+    </div>
+    <div>
+      <div class="dsfr">
+        <h2 class="cap-first fr-pt-6w">Documents d’entreprise</h2>
+        <p style="z-index: unset; margin-bottom: 0px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;" class="fr-badge fr-badge--sm fr-badge--error fr-badge--no-icon" title="Incomplet" aria-label="Incomplet">Incomplet</p>
+        <div class="fr-alert fr-alert--info fr-alert--sm">
+          <p>Les documents d’entreprise sont des documents propres à l'entreprise, et pourront être réutilisés pour la création d'un autre dossier et mis à jour si nécessaire. Ces documents d’entreprise sont consultables dans la fiche entreprise de votre société. Cette section permet de protéger et de centraliser les informations d'ordre privé relatives à la société et à son personnel.</p>
+        </div>
+      </div>
+      <div>
+        <div>
+          <div class="fr-table fr-mb-0">
+            <table style="display: table;">
+              <caption>Nom de l'entreprise 0</caption>
+              <thead>
+                <tr>
+                  <th scope="col">Nom</th>
+                  <th scope="col"></th>
+                  <th scope="col" style="display: flex; justify-content: end;">Action</th>
+                </tr>
+              </thead>
+              <tbody>
+                <tr>
+                  <td>
+                    <div style="display: flex; flex-direction: column; align-items: start;">
+                      <div class="fr-text--md">Attestation fiscale</div>
+                      <!---->
+                    </div>
+                  </td>
+                  <td>
+                    <div class="fr-select-group">
+                      <!----><select class="fr-select" id="select_967" aria-label="Choix du document pour [object Object]" name="select_967">
+                        <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                        <option disabled="" hidden="" value="">Selectionnez une option</option>
+                      </select>
+                    </div>
+                  </td>
+                  <td style="text-align: right;">
+                    <!---->
+                  </td>
+                </tr>
+                <tr>
+                  <td>
+                    <div style="display: flex; flex-direction: column; align-items: start;">
+                      <div class="fr-text--md">Curriculum vitae</div>
+                      <!---->
+                    </div>
+                  </td>
+                  <td>
+                    <div class="fr-select-group">
+                      <!----><select class="fr-select" id="select_25" aria-label="Choix du document pour [object Object]" name="select_25">
+                        <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                        <option disabled="" hidden="" value="">Selectionnez une option</option>
+                      </select>
+                    </div>
+                  </td>
+                  <td style="text-align: right;">
+                    <!---->
+                  </td>
+                </tr>
+                <tr>
+                  <td>
+                    <div style="display: flex; flex-direction: column; align-items: start;">
+                      <div class="fr-text--md">Justificatif d’identité</div>
+                      <!---->
+                    </div>
+                  </td>
+                  <td>
+                    <div class="fr-select-group">
+                      <!----><select class="fr-select" id="select_128" aria-label="Choix du document pour [object Object]" name="select_128">
+                        <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                        <option disabled="" hidden="" value="">Selectionnez une option</option>
+                      </select>
+                    </div>
+                  </td>
+                  <td style="text-align: right;">
+                    <!---->
+                  </td>
+                </tr>
+                <tr>
+                  <td>
+                    <div style="display: flex; flex-direction: column; align-items: start;">
+                      <div class="fr-text--md">Justificatif des capacités techniques</div>
+                      <!---->
+                    </div>
+                  </td>
+                  <td>
+                    <div class="fr-select-group">
+                      <!----><select class="fr-select" id="select_772" aria-label="Choix du document pour [object Object]" name="select_772">
+                        <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                        <option disabled="" hidden="" value="">Selectionnez une option</option>
+                      </select>
+                    </div>
+                  </td>
+                  <td style="text-align: right;">
+                    <!---->
+                  </td>
+                </tr>
+                <tr>
+                  <td>
+                    <div style="display: flex; flex-direction: column; align-items: start;">
+                      <div class="fr-text--md">Kbis</div>
+                      <!---->
+                    </div>
+                  </td>
+                  <td>
+                    <div class="fr-select-group">
+                      <!----><select class="fr-select" id="select_453" aria-label="Choix du document pour [object Object]" name="select_453">
+                        <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                        <option disabled="" hidden="" value="">Selectionnez une option</option>
+                      </select>
+                    </div>
+                  </td>
+                  <td style="text-align: right;">
+                    <!---->
+                  </td>
+                </tr>
+                <tr>
+                  <td>
+                    <div style="display: flex; flex-direction: column; align-items: start;">
+                      <div class="fr-text--md">Justificatif des capacités financières</div>
+                      <!---->
+                    </div>
+                  </td>
+                  <td>
+                    <div class="fr-select-group">
+                      <!----><select class="fr-select" id="select_556" aria-label="Choix du document pour [object Object]" name="select_556">
+                        <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                        <option disabled="" hidden="" value="">Selectionnez une option</option>
+                      </select>
+                    </div>
+                  </td>
+                  <td style="text-align: right;">
+                    <!---->
+                  </td>
+                </tr>
+                <tr>
+                  <td>
+                    <div class="fr-select-group">
+                      <!----><select class="fr-select" id="select_487" aria-label="Ajouter un nouveau type de document" name="select_487">
+                        <option value="atf">Attestation fiscale</option>
+                        <option value="sir">Avis de situation au répertoire Sirene</option>
+                        <option value="cur">Curriculum vitae</option>
+                        <option value="idm">Identification de matériel</option>
+                        <option value="jid">Justificatif d’identité</option>
+                        <option value="jct">Justificatif des capacités techniques</option>
+                        <option value="kbi">Kbis</option>
+                        <option value="jcf">Justificatif des capacités financières</option>
+                        <option disabled="" hidden="" value="">Selectionnez une option</option>
+                      </select>
+                    </div>
+                  </td>
+                  <td></td>
+                  <td></td>
+                </tr>
+              </tbody>
+            </table>
+          </div>
+          <div class="fr-table fr-mb-0">
+            <table style="display: table;">
+              <caption>Nom de l'entreprise 1</caption>
+              <thead>
+                <tr>
+                  <th scope="col">Nom</th>
+                  <th scope="col"></th>
+                  <th scope="col" style="display: flex; justify-content: end;">Action</th>
+                </tr>
+              </thead>
+              <tbody>
+                <tr>
+                  <td>
+                    <div style="display: flex; flex-direction: column; align-items: start;">
+                      <div class="fr-text--md">Attestation fiscale</div>
+                      <!---->
+                    </div>
+                  </td>
+                  <td>
+                    <div class="fr-select-group">
+                      <!----><select class="fr-select" id="select_796" aria-label="Choix du document pour [object Object]" name="select_796">
+                        <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                        <option disabled="" hidden="" value="">Selectionnez une option</option>
+                      </select>
+                    </div>
+                  </td>
+                  <td style="text-align: right;">
+                    <!---->
+                  </td>
+                </tr>
+                <tr>
+                  <td>
+                    <div style="display: flex; flex-direction: column; align-items: start;">
+                      <div class="fr-text--md">Curriculum vitae</div>
+                      <!---->
+                    </div>
+                  </td>
+                  <td>
+                    <div class="fr-select-group">
+                      <!----><select class="fr-select" id="select_216" aria-label="Choix du document pour [object Object]" name="select_216">
+                        <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                        <option disabled="" hidden="" value="">Selectionnez une option</option>
+                      </select>
+                    </div>
+                  </td>
+                  <td style="text-align: right;">
+                    <!---->
+                  </td>
+                </tr>
+                <tr>
+                  <td>
+                    <div style="display: flex; flex-direction: column; align-items: start;">
+                      <div class="fr-text--md">Justificatif d’identité</div>
+                      <!---->
+                    </div>
+                  </td>
+                  <td>
+                    <div class="fr-select-group">
+                      <!----><select class="fr-select" id="select_482" aria-label="Choix du document pour [object Object]" name="select_482">
+                        <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                        <option disabled="" hidden="" value="">Selectionnez une option</option>
+                      </select>
+                    </div>
+                  </td>
+                  <td style="text-align: right;">
+                    <!---->
+                  </td>
+                </tr>
+                <tr>
+                  <td>
+                    <div style="display: flex; flex-direction: column; align-items: start;">
+                      <div class="fr-text--md">Justificatif des capacités techniques</div>
+                      <!---->
+                    </div>
+                  </td>
+                  <td>
+                    <div class="fr-select-group">
+                      <!----><select class="fr-select" id="select_585" aria-label="Choix du document pour [object Object]" name="select_585">
+                        <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                        <option disabled="" hidden="" value="">Selectionnez une option</option>
+                      </select>
+                    </div>
+                  </td>
+                  <td style="text-align: right;">
+                    <!---->
+                  </td>
+                </tr>
+                <tr>
+                  <td>
+                    <div style="display: flex; flex-direction: column; align-items: start;">
+                      <div class="fr-text--md">Kbis</div>
+                      <!---->
+                    </div>
+                  </td>
+                  <td>
+                    <div class="fr-select-group">
+                      <!----><select class="fr-select" id="select_759" aria-label="Choix du document pour [object Object]" name="select_759">
+                        <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                        <option disabled="" hidden="" value="">Selectionnez une option</option>
+                      </select>
+                    </div>
+                  </td>
+                  <td style="text-align: right;">
+                    <!---->
+                  </td>
+                </tr>
+                <tr>
+                  <td>
+                    <div style="display: flex; flex-direction: column; align-items: start;">
+                      <div class="fr-text--md">Justificatif des capacités financières</div>
+                      <!---->
+                    </div>
+                  </td>
+                  <td>
+                    <div class="fr-select-group">
+                      <!----><select class="fr-select" id="select_58" aria-label="Choix du document pour [object Object]" name="select_58">
+                        <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                        <option disabled="" hidden="" value="">Selectionnez une option</option>
+                      </select>
+                    </div>
+                  </td>
+                  <td style="text-align: right;">
+                    <!---->
+                  </td>
+                </tr>
+                <tr>
+                  <td>
+                    <div class="fr-select-group">
+                      <!----><select class="fr-select" id="select_661" aria-label="Ajouter un nouveau type de document" name="select_661">
+                        <option value="atf">Attestation fiscale</option>
+                        <option value="sir">Avis de situation au répertoire Sirene</option>
+                        <option value="cur">Curriculum vitae</option>
+                        <option value="idm">Identification de matériel</option>
+                        <option value="jid">Justificatif d’identité</option>
+                        <option value="jct">Justificatif des capacités techniques</option>
+                        <option value="kbi">Kbis</option>
+                        <option value="jcf">Justificatif des capacités financières</option>
+                        <option disabled="" hidden="" value="">Selectionnez une option</option>
+                      </select>
+                    </div>
+                  </td>
+                  <td></td>
+                  <td></td>
+                </tr>
+              </tbody>
+            </table>
+          </div>
+          <div class="fr-table fr-mb-0">
+            <table style="display: table;">
+              <caption>Nom de l'entreprise 2</caption>
+              <thead>
+                <tr>
+                  <th scope="col">Nom</th>
+                  <th scope="col"></th>
+                  <th scope="col" style="display: flex; justify-content: end;">Action</th>
+                </tr>
+              </thead>
+              <tbody>
+                <tr>
+                  <td>
+                    <div style="display: flex; flex-direction: column; align-items: start;">
+                      <div class="fr-text--md">Attestation fiscale</div>
+                      <!---->
+                    </div>
+                  </td>
+                  <td>
+                    <div class="fr-select-group">
+                      <!----><select class="fr-select" id="select_684" aria-label="Choix du document pour [object Object]" name="select_684">
+                        <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                        <option disabled="" hidden="" value="">Selectionnez une option</option>
+                      </select>
+                    </div>
+                  </td>
+                  <td style="text-align: right;">
+                    <!---->
+                  </td>
+                </tr>
+                <tr>
+                  <td>
+                    <div style="display: flex; flex-direction: column; align-items: start;">
+                      <div class="fr-text--md">Curriculum vitae</div>
+                      <!---->
+                    </div>
+                  </td>
+                  <td>
+                    <div class="fr-select-group">
+                      <!----><select class="fr-select" id="select_624" aria-label="Choix du document pour [object Object]" name="select_624">
+                        <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                        <option disabled="" hidden="" value="">Selectionnez une option</option>
+                      </select>
+                    </div>
+                  </td>
+                  <td style="text-align: right;">
+                    <!---->
+                  </td>
+                </tr>
+                <tr>
+                  <td>
+                    <div style="display: flex; flex-direction: column; align-items: start;">
+                      <div class="fr-text--md">Justificatif d’identité</div>
+                      <!---->
+                    </div>
+                  </td>
+                  <td>
+                    <div class="fr-select-group">
+                      <!----><select class="fr-select" id="select_267" aria-label="Choix du document pour [object Object]" name="select_267">
+                        <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                        <option disabled="" hidden="" value="">Selectionnez une option</option>
+                      </select>
+                    </div>
+                  </td>
+                  <td style="text-align: right;">
+                    <!---->
+                  </td>
+                </tr>
+                <tr>
+                  <td>
+                    <div style="display: flex; flex-direction: column; align-items: start;">
+                      <div class="fr-text--md">Justificatif des capacités techniques</div>
+                      <!---->
+                    </div>
+                  </td>
+                  <td>
+                    <div class="fr-select-group">
+                      <!----><select class="fr-select" id="select_119" aria-label="Choix du document pour [object Object]" name="select_119">
+                        <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                        <option disabled="" hidden="" value="">Selectionnez une option</option>
+                      </select>
+                    </div>
+                  </td>
+                  <td style="text-align: right;">
+                    <!---->
+                  </td>
+                </tr>
+                <tr>
+                  <td>
+                    <div style="display: flex; flex-direction: column; align-items: start;">
+                      <div class="fr-text--md">Kbis</div>
+                      <!---->
+                    </div>
+                  </td>
+                  <td>
+                    <div class="fr-select-group">
+                      <!----><select class="fr-select" id="select_827" aria-label="Choix du document pour [object Object]" name="select_827">
+                        <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                        <option disabled="" hidden="" value="">Selectionnez une option</option>
+                      </select>
+                    </div>
+                  </td>
+                  <td style="text-align: right;">
+                    <!---->
+                  </td>
+                </tr>
+                <tr>
+                  <td>
+                    <div style="display: flex; flex-direction: column; align-items: start;">
+                      <div class="fr-text--md">Justificatif des capacités financières</div>
+                      <!---->
+                    </div>
+                  </td>
+                  <td>
+                    <div class="fr-select-group">
+                      <!----><select class="fr-select" id="select_173" aria-label="Choix du document pour [object Object]" name="select_173">
+                        <option value="newDocument">Ajouter un nouveau document d'entreprise</option>
+                        <option disabled="" hidden="" value="">Selectionnez une option</option>
+                      </select>
+                    </div>
+                  </td>
+                  <td style="text-align: right;">
+                    <!---->
+                  </td>
+                </tr>
+                <tr>
+                  <td>
+                    <div class="fr-select-group">
+                      <!----><select class="fr-select" id="select_211" aria-label="Ajouter un nouveau type de document" name="select_211">
+                        <option value="atf">Attestation fiscale</option>
+                        <option value="sir">Avis de situation au répertoire Sirene</option>
+                        <option value="cur">Curriculum vitae</option>
+                        <option value="idm">Identification de matériel</option>
+                        <option value="jid">Justificatif d’identité</option>
+                        <option value="jct">Justificatif des capacités techniques</option>
+                        <option value="kbi">Kbis</option>
+                        <option value="jcf">Justificatif des capacités financières</option>
+                        <option disabled="" hidden="" value="">Selectionnez une option</option>
+                      </select>
+                    </div>
+                  </td>
+                  <td></td>
+                  <td></td>
+                </tr>
+              </tbody>
+            </table>
+          </div>
+        </div>
+        <!---->
+      </div>
+    </div>
+    <div class="fr-input-group fr-mt-2w"><label class="fr-label" for="textarea_878">Notes
+        <!---->
+        <!---->
+      </label><textarea class="fr-input" name="textarea_878" id="textarea_878"></textarea></div>
+  </div>
+  <div class="fr-mt-2w fr-pt-2w fr-pb-2w" style="position: sticky; bottom: 0px; z-index: 100000; background: white;">
+    <div style="display: flex; flex-direction: column;">
+      <!---->
+      <div style="display: flex; justify-content: end; align-items: center;" class="fr-mt-2w">
+        <!----><button class="fr-btn fr-btn--primary fr-btn--md fr-ml-2w" disabled="" title="Enregistrer l'étape" aria-label="Enregistrer l'étape" type="submit">Enregistrer l'étape</button>
+        <!---->
+      </div>
+    </div>
+  </div>
+  <!---->
+</form>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/etape-edit-form.stories_snapshots_EtapeModification.html b/packages/ui/src/components/etape/etape-edit-form.stories_snapshots_EtapeModification.html
new file mode 100644
index 0000000000000000000000000000000000000000..fa97d5e78668061721b1df4b7f1dbdf70f94ae0b
--- /dev/null
+++ b/packages/ui/src/components/etape/etape-edit-form.stories_snapshots_EtapeModification.html
@@ -0,0 +1,442 @@
+<form class="dsfr">
+  <div>
+    <div class="dsfr">
+      <h2 class="cap-first fr-pt-6w">Informations principales</h2>
+      <!---->
+      <!---->
+    </div>
+    <div>
+      <div class="fr-grid-row">
+        <div class="fr-col-12 fr-col-xl-6">
+          <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_271">Date
+              <!---->
+              <!---->
+            </label><input class="fr-input" name="input_271" id="input_271" type="date">
+            <!---->
+          </div>
+          <div class="fr-mt-2w">
+            <div class="fr-input-group"><label class="fr-label fr-mb-1w" for="select-etape-type">Type *</label>
+              <div id="select-etape-type_wrapper" class="_typeahead_8eddf1 dsfr">
+                <div class="flex"><input id="select-etape-type" type="text" name="select-etape-type" disabled="" class="_typeahead-input_8eddf1 fr-input" placeholder="" autocomplete="off"></div>
+                <!---->
+              </div>
+            </div>
+            <div class="fr-select-group"><label class="fr-label" for="select-etape-statut-id">Statut *
+                <!---->
+              </label><select class="fr-select" id="select-etape-statut-id" aria-label="Statut" name="select-etape-statut-id">
+                <option disabled="" value="fai">fait</option>
+                <option value="aco">en construction</option>
+                <option disabled="" hidden="" value="">Selectionnez une option</option>
+              </select></div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+  <div gotodemarche="function(...args){let channel=import_preview_api.addons.getChannel(),id=(0,import_uuid.v4)(),minDepth=5,serializedArgs=args.map(serializeArg),normalizedArgs=args.length>1?serializedArgs:serializedArgs[0],actionDisplayToEmit={id,count:0,data:{name,args:normalizedArgs},options:{...actionOptions,maxDepth:minDepth+(actionOptions.depth||3),allowFunction:actionOptions.allowFunction||!1}};channel.emit(EVENT_ID,actionDisplayToEmit)}">
+    <div>
+      <div class="dsfr">
+        <h2 class="cap-first fr-pt-6w">Propriétés</h2>
+        <!---->
+        <!---->
+      </div>
+      <div>
+        <div class="fr-grid-row">
+          <div class="fr-col-12 fr-col-xl-6">
+            <div class="mb-s">
+              <div style="display: flex;">
+                <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_670">Durée (années)
+                    <!---->
+                    <!---->
+                  </label><input class="fr-input" name="input_670" id="input_670" type="number">
+                  <!---->
+                </div>
+                <div class="fr-input-group fr-ml-2w" style="margin-bottom: 0px;"><label class="fr-label" for="input_74">Durée (mois)
+                    <!---->
+                    <!---->
+                  </label><input class="fr-input" name="input_74" id="input_74" type="number">
+                  <!---->
+                </div>
+              </div>
+              <div class="dsfr">
+                <div class="fr-toggle"><input type="checkbox" class="fr-toggle__input" id="toggle_878"><label class="fr-toggle__label" for="toggle_878" data-fr-checked-label="Activé" data-fr-unchecked-label="Désactivé"><span class=" fr-ml-4w">Hériter de l’étape "Demande" du 01-01-2022</span></label>
+                  <!---->
+                </div>
+              </div>
+            </div>
+            <div class="mb-s">
+              <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_967">Date de début
+                  <!---->
+                  <!---->
+                </label><input class="fr-input" name="input_967" id="input_967" type="date">
+                <!---->
+              </div>
+              <!---->
+            </div>
+            <div class="mb-s">
+              <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_25">Date d’échéance
+                  <!---->
+                  <!---->
+                </label><input class="fr-input" name="input_25" id="input_25" type="date">
+                <!---->
+              </div>
+              <div class="dsfr">
+                <div class="fr-toggle"><input type="checkbox" class="fr-toggle__input" id="toggle_128"><label class="fr-toggle__label" for="toggle_128" data-fr-checked-label="Activé" data-fr-unchecked-label="Désactivé"><span class=" fr-ml-4w">Hériter de l’étape "Demande" du 01-01-2022</span></label>
+                  <!---->
+                </div>
+              </div>
+            </div>
+            <div class="fr-input-group"><label class="fr-label" for="filters_autocomplete_titulaires">
+                <h6>Titulaires</h6>
+              </label>
+              <div class="mb-s">
+                <div id="filters_autocomplete_titulaires_wrapper" class="_typeahead_8eddf1 dsfr">
+                  <div style="display: flex; max-height: unset; flex-wrap: wrap; gap: 8px; outline-offset: 2px; outline-width: 2px; outline-color: rgb(10, 118, 246);" class="fr-input _fake-input_8eddf1"><input id="filters_autocomplete_titulaires" type="text" name="filters_autocomplete_titulaires" class="_typeahead-input_8eddf1" style="outline: none;" placeholder="titulaires" autocomplete="off"></div>
+                  <!---->
+                </div>
+                <!---->
+              </div>
+            </div>
+            <div class="fr-input-group"><label class="fr-label" for="filters_autocomplete_amodiataires">
+                <h6>Amodiataires</h6>
+              </label>
+              <div class="mb-s">
+                <div>
+                  <div>
+                    <p class="fr-tag fr-tag--md fr-mr-1w" title="Nom de l'entreprise 0" aria-label="Nom de l'entreprise 0">Nom de l'entreprise 0</p>
+                    <p class="fr-tag fr-tag--md fr-mr-1w" title="Nom de l'entreprise 1" aria-label="Nom de l'entreprise 1">Nom de l'entreprise 1</p>
+                    <p class="fr-tag fr-tag--md fr-mr-1w" title="Nom de l'entreprise 2" aria-label="Nom de l'entreprise 2">Nom de l'entreprise 2</p>
+                  </div>
+                </div>
+                <div class="dsfr">
+                  <div class="fr-toggle"><input type="checkbox" class="fr-toggle__input" id="toggle_772"><label class="fr-toggle__label" for="toggle_772" data-fr-checked-label="Activé" data-fr-unchecked-label="Désactivé"><span class=" fr-ml-4w">Hériter de l’étape "Demande" du 01-01-2022</span></label>
+                    <!---->
+                  </div>
+                </div>
+              </div>
+            </div>
+            <div>
+              <h6>Substances</h6>
+              <div class="mb-s">
+                <div>
+                  <p class="fr-tag fr-tag--md fr-mr-1w" title="Argent" aria-label="Argent">Argent</p>
+                </div>
+                <div class="dsfr">
+                  <div class="fr-toggle"><input type="checkbox" class="fr-toggle__input" id="toggle_453"><label class="fr-toggle__label" for="toggle_453" data-fr-checked-label="Activé" data-fr-unchecked-label="Désactivé"><span class=" fr-ml-4w">Hériter de l’étape "Demande" du 01-01-2022</span></label>
+                    <!---->
+                  </div>
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div>
+      <div class="dsfr">
+        <h2 class="cap-first fr-pt-6w">Propriétés spécifiques</h2>
+        <!---->
+        <!---->
+      </div>
+      <div>
+        <div class="fr-grid-row">
+          <div class="fr-col-12 fr-col-xl-6">
+            <div>
+              <h3>Propriétés de la concession</h3>
+              <div class="mb-s">
+                <div>
+                  <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_556">Volume
+                      <!---->
+                      <!---->
+                    </label><input class="fr-input" name="input_556" id="input_556" type="number" min="0">
+                    <!---->
+                  </div>
+                </div>
+                <!---->
+              </div>
+              <div class="mb-s">
+                <div>
+                  <div class="fr-select-group"><label class="fr-label" for="select_487">Unité du volume
+                      <!---->
+                    </label><select class="fr-select" id="select_487" aria-label="Unité du volume" name="select_487">
+                      <option value="deg">degré</option>
+                      <option value="gon">grade</option>
+                      <option value="km3">kilomètre cube</option>
+                      <option value="m3a">mètre cube par an</option>
+                      <option value="m3x">mètre cube</option>
+                      <option value="met">mètre</option>
+                      <option value="mgr">gramme</option>
+                      <option value="mkc">quintal</option>
+                      <option value="mkg">kilogramme</option>
+                      <option value="mtc">centaine de tonnes</option>
+                      <option value="mtk">millier de tonnes</option>
+                      <option value="mtt">tonne</option>
+                      <option value="txa">tonnes par an</option>
+                      <option value="vmd">100 000 mètres cubes</option>
+                      <option disabled="" hidden="" value="">Selectionnez une option</option>
+                    </select></div>
+                </div>
+                <!---->
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div>
+      <div class="dsfr">
+        <h2 class="cap-first fr-pt-6w">Périmètre</h2>
+        <!---->
+        <!---->
+      </div>
+      <div>
+        <div>
+          <div class="mb-s">
+            <div><button class="fr-btn fr-btn--primary fr-btn--md" title="Importer un périmètre" aria-label="Importer un périmètre" type="button">Importer un périmètre</button><button class="fr-btn fr-btn--secondary fr-btn--md fr-ml-2w" title="Éditer les points" aria-label="Éditer les points" type="button">Éditer les points</button>
+              <!---->
+              <!---->
+              <div class="fr-mt-2w">
+                <div class="dsfr">
+                  <div class="fr-tabs">
+                    <ul class="fr-tabs__list" role="tablist" aria-label="Affichage des titres en vue carte ou tableau">
+                      <li role="presentation"><button id="tabpanel-carte-796" class="fr-tabs__tab fr-icon-earth-fill fr-tabs__tab--icon-left" tabindex="-1" role="tab" aria-label="Carte" aria-selected="false" aria-controls="tabpanel-carte-796-panel">Carte</button></li>
+                      <li role="presentation"><button id="tabpanel-points-796" class="fr-tabs__tab fr-icon-list-unordered fr-tabs__tab--icon-left" tabindex="0" role="tab" aria-label="Tableau" aria-selected="true" aria-controls="tabpanel-points-796-panel">Tableau</button></li>
+                    </ul>
+                    <div id="tabpanel-carte-796-panel" class="fr-tabs__panel" role="tabpanel" aria-labelledby="tabpanel-carte-796" tabindex="0">
+                      <!---->
+                    </div>
+                    <div id="tabpanel-points-796-panel" class="fr-tabs__panel fr-tabs__panel--selected" role="tabpanel" aria-labelledby="tabpanel-points-796" tabindex="0">
+                      <div style="display: flex; flex-direction: column;">
+                        <div id="typeahead_216_wrapper" class="_typeahead_8eddf1 dsfr">
+                          <div class="flex"><input id="typeahead_216" type="text" name="typeahead_216" disabled="" class="_typeahead-input_8eddf1 fr-input" placeholder="" autocomplete="off"></div>
+                          <!---->
+                        </div>
+                        <div style="display: flex; flex-direction: column;">
+                          <div style="overflow-x: auto;" class="fr-mb-1w">
+                            <div class="fr-table">
+                              <table style="display: table;">
+                                <caption></caption>
+                                <thead>
+                                  <tr>
+                                    <th scope="col" class="nowrap">
+                                      <div class="fr-text--md">Nom du point</div>
+                                    </th>
+                                    <th scope="col" class="nowrap">
+                                      <div class="fr-text--md">Description</div>
+                                    </th>
+                                    <th scope="col" class="nowrap">
+                                      <div class="fr-text--md">Longitude</div>
+                                    </th>
+                                    <th scope="col" class="nowrap">
+                                      <div class="fr-text--md">Latitude</div>
+                                    </th>
+                                    <th scope="col" class="nowrap">
+                                      <div class="fr-text--md">Longitude (E)</div>
+                                    </th>
+                                    <th scope="col" class="nowrap">
+                                      <div class="fr-text--md">Latitude (N)</div>
+                                    </th>
+                                  </tr>
+                                </thead>
+                                <tbody>
+                                  <tr>
+                                    <td class=""><span class="">A</span></td>
+                                    <td class=""><span class="">Polygone 1</span></td>
+                                    <td class=""><span class="">-52.54</span></td>
+                                    <td class=""><span class="">4.22269896902571</span></td>
+                                    <td class=""><span class="">-52°32,4'</span></td>
+                                    <td class=""><span class="">4°13,362'</span></td>
+                                  </tr>
+                                  <tr>
+                                    <td class=""><span class="">B</span></td>
+                                    <td class=""><span class="">Polygone 1</span></td>
+                                    <td class=""><span class="">-52.55</span></td>
+                                    <td class=""><span class="">4.22438936251509</span></td>
+                                    <td class=""><span class="">-52°33'</span></td>
+                                    <td class=""><span class="">4°13,463'</span></td>
+                                  </tr>
+                                  <tr>
+                                    <td class=""><span class="">C</span></td>
+                                    <td class=""><span class="">Polygone 1</span></td>
+                                    <td class=""><span class="">-52.55</span></td>
+                                    <td class=""><span class="">4.24113309117193</span></td>
+                                    <td class=""><span class="">-52°33'</span></td>
+                                    <td class=""><span class="">4°14,468'</span></td>
+                                  </tr>
+                                </tbody>
+                              </table>
+                            </div>
+                          </div><a class="fr-btn fr-btn--secondary fr-btn--icon-right fr-icon-download-line" title="Télécharge les points au format csv" href="data:text/csv;charset=utf-8,nom;description;longitude;latitude;x_deg;y_deg%0AA;Polygone%201;-52.54;4.22269896902571;-52%C2%B032,4';4%C2%B013,362'%0AB;Polygone%201;-52.55;4.22438936251509;-52%C2%B033';4%C2%B013,463'%0AC;Polygone%201;-52.55;4.24113309117193;-52%C2%B033';4%C2%B014,468'" download="points-titre-slug.csv" style="align-self: end;">.csv</a>
+                        </div>
+                        <!---->
+                      </div>
+                    </div>
+                  </div>
+                </div>
+                <!---->
+              </div>
+            </div>
+            <!---->
+          </div>
+          <!---->
+          <!---->
+          <!---->
+        </div>
+      </div>
+    </div>
+    <div>
+      <div class="dsfr">
+        <h2 class="cap-first fr-pt-6w">Liste des documents</h2>
+        <!---->
+        <!---->
+      </div>
+      <div>
+        <!---->
+        <div style="display: flex; flex-direction: column;" class="fr-mt-3w">
+          <div class="fr-table fr-mb-0">
+            <table style="display: table;">
+              <caption>Documents complémentaires</caption>
+              <thead>
+                <tr>
+                  <th scope="col">Nom</th>
+                  <th scope="col">Description</th>
+                  <th scope="col">Visibilité</th>
+                  <th scope="col" style="display: flex; justify-content: end;">Action</th>
+                </tr>
+              </thead>
+              <tbody></tbody>
+            </table>
+          </div><button class="fr-btn fr-btn--secondary fr-btn--md fr-icon-add-line fr-btn--icon-right fr-mt-1w" title="Ajouter un document complémentaire" aria-label="Ajouter un document complémentaire" type="button" style="align-self: end;">Ajouter</button>
+        </div>
+        <!---->
+        <!---->
+        <!---->
+      </div>
+    </div>
+    <div>
+      <div class="dsfr">
+        <h2 class="cap-first fr-pt-6w">Documents d’entreprise</h2>
+        <!---->
+        <!---->
+      </div>
+      <div>
+        <div>
+          <div class="fr-table fr-mb-0">
+            <table style="display: table;">
+              <caption>Nom de l'entreprise 0</caption>
+              <thead>
+                <tr>
+                  <th scope="col">Nom</th>
+                  <th scope="col"></th>
+                  <th scope="col" style="display: flex; justify-content: end;">Action</th>
+                </tr>
+              </thead>
+              <tbody>
+                <tr>
+                  <td>
+                    <div class="fr-select-group">
+                      <!----><select class="fr-select" id="select_585" aria-label="Ajouter un nouveau type de document" name="select_585">
+                        <option value="atf">Attestation fiscale</option>
+                        <option value="sir">Avis de situation au répertoire Sirene</option>
+                        <option value="cur">Curriculum vitae</option>
+                        <option value="idm">Identification de matériel</option>
+                        <option value="jid">Justificatif d’identité</option>
+                        <option value="jct">Justificatif des capacités techniques</option>
+                        <option value="kbi">Kbis</option>
+                        <option value="jcf">Justificatif des capacités financières</option>
+                        <option disabled="" hidden="" value="">Selectionnez une option</option>
+                      </select>
+                    </div>
+                  </td>
+                  <td></td>
+                  <td></td>
+                </tr>
+              </tbody>
+            </table>
+          </div>
+          <div class="fr-table fr-mb-0">
+            <table style="display: table;">
+              <caption>Nom de l'entreprise 1</caption>
+              <thead>
+                <tr>
+                  <th scope="col">Nom</th>
+                  <th scope="col"></th>
+                  <th scope="col" style="display: flex; justify-content: end;">Action</th>
+                </tr>
+              </thead>
+              <tbody>
+                <tr>
+                  <td>
+                    <div class="fr-select-group">
+                      <!----><select class="fr-select" id="select_759" aria-label="Ajouter un nouveau type de document" name="select_759">
+                        <option value="atf">Attestation fiscale</option>
+                        <option value="sir">Avis de situation au répertoire Sirene</option>
+                        <option value="cur">Curriculum vitae</option>
+                        <option value="idm">Identification de matériel</option>
+                        <option value="jid">Justificatif d’identité</option>
+                        <option value="jct">Justificatif des capacités techniques</option>
+                        <option value="kbi">Kbis</option>
+                        <option value="jcf">Justificatif des capacités financières</option>
+                        <option disabled="" hidden="" value="">Selectionnez une option</option>
+                      </select>
+                    </div>
+                  </td>
+                  <td></td>
+                  <td></td>
+                </tr>
+              </tbody>
+            </table>
+          </div>
+          <div class="fr-table fr-mb-0">
+            <table style="display: table;">
+              <caption>Nom de l'entreprise 2</caption>
+              <thead>
+                <tr>
+                  <th scope="col">Nom</th>
+                  <th scope="col"></th>
+                  <th scope="col" style="display: flex; justify-content: end;">Action</th>
+                </tr>
+              </thead>
+              <tbody>
+                <tr>
+                  <td>
+                    <div class="fr-select-group">
+                      <!----><select class="fr-select" id="select_58" aria-label="Ajouter un nouveau type de document" name="select_58">
+                        <option value="atf">Attestation fiscale</option>
+                        <option value="sir">Avis de situation au répertoire Sirene</option>
+                        <option value="cur">Curriculum vitae</option>
+                        <option value="idm">Identification de matériel</option>
+                        <option value="jid">Justificatif d’identité</option>
+                        <option value="jct">Justificatif des capacités techniques</option>
+                        <option value="kbi">Kbis</option>
+                        <option value="jcf">Justificatif des capacités financières</option>
+                        <option disabled="" hidden="" value="">Selectionnez une option</option>
+                      </select>
+                    </div>
+                  </td>
+                  <td></td>
+                  <td></td>
+                </tr>
+              </tbody>
+            </table>
+          </div>
+        </div>
+        <!---->
+      </div>
+    </div>
+    <div class="fr-input-group fr-mt-2w"><label class="fr-label" for="textarea_482">Notes
+        <!---->
+        <!---->
+      </label><textarea class="fr-input" name="textarea_482" id="textarea_482"></textarea></div>
+  </div>
+  <div class="fr-mt-2w fr-pt-2w fr-pb-2w" style="position: sticky; bottom: 0px; z-index: 100000; background: white;">
+    <div style="display: flex; flex-direction: column;">
+      <!---->
+      <div style="display: flex; justify-content: end; align-items: center;" class="fr-mt-2w">
+        <!----><button class="fr-btn fr-btn--primary fr-btn--md fr-ml-2w" title="Enregistrer l'étape" aria-label="Enregistrer l'étape" type="submit">Enregistrer l'étape</button>
+        <!---->
+      </div>
+    </div>
+  </div>
+  <!---->
+</form>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/etape-edit-form.stories_snapshots_etapeEditFormApiClient.html b/packages/ui/src/components/etape/etape-edit-form.stories_snapshots_etapeEditFormApiClient.html
new file mode 100644
index 0000000000000000000000000000000000000000..aec6816a60093d7aae6b6bdaf1cae170f29f4372
--- /dev/null
+++ b/packages/ui/src/components/etape/etape-edit-form.stories_snapshots_etapeEditFormApiClient.html
@@ -0,0 +1,7 @@
+<div class="dsfr">
+  <!---->
+  <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+    <!---->
+    <div class="_spinner_3306d0"></div>
+  </div>
+</div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/etape-edit-form.tsx b/packages/ui/src/components/etape/etape-edit-form.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..b1d8a1d92128773e800c0facb5897b2700262038
--- /dev/null
+++ b/packages/ui/src/components/etape/etape-edit-form.tsx
@@ -0,0 +1,517 @@
+import { DeepReadonly, computed, defineComponent, onMounted, ref } from 'vue'
+import { Bloc } from './bloc'
+import { EtapeFondamentaleEdit, FondamentalesEdit } from './fondamentales-edit'
+import { PerimetreEdit } from './perimetre-edit'
+import { EntrepriseDocumentsEdit } from './entreprises-documents-edit'
+import { EtapeDocumentsEdit } from './etape-documents-edit'
+import { ApiClient } from '../../api/api-client'
+import { User } from 'camino-common/src/roles'
+import {
+  DocumentComplementaireAslEtapeDocumentModification,
+  DocumentComplementaireDaeEtapeDocumentModification,
+  Etape,
+  EtapeDocument,
+  EtapeId,
+  EtapePropsFromHeritagePropName,
+  EtapeWithHeritage,
+  HeritageProp,
+  TempEtapeDocument,
+  flattenEtapeWithHeritage,
+} from 'camino-common/src/etape'
+import { DemarcheTypeId } from 'camino-common/src/static/demarchesTypes'
+import { TitreTypeId } from 'camino-common/src/static/titresTypes'
+import { TitreSlug } from 'camino-common/src/validators/titres'
+import { SDOMZoneIds, SDOMZones } from 'camino-common/src/static/sdom'
+import { Nullable, isNotNullNorUndefined } from 'camino-common/src/typescript-tools'
+import { Entreprise } from 'camino-common/src/entreprise'
+import { AsyncData } from '../../api/client-rest'
+import { DemarcheId } from 'camino-common/src/demarche'
+import { useState } from '@/utils/vue-tsx-utils'
+import { DateTypeEdit, EtapeDateTypeEdit, dateTypeStepIsComplete, dateTypeStepIsVisible } from './date-type-edit'
+import { FeatureCollectionForages, FeatureCollectionPoints, GeojsonInformations, PerimetreInformations } from 'camino-common/src/perimetre'
+import { LoadingElement } from '../_ui/functional-loader'
+import { SectionsEdit, SectionsEditEtape } from './sections-edit'
+import { DsfrTextarea } from '../_ui/dsfr-textarea'
+import {
+  SelectedEntrepriseDocument,
+  entrepriseDocumentsStepIsComplete,
+  entrepriseDocumentsStepIsVisible,
+  etapeDocumentsStepIsComplete,
+  etapeDocumentsStepIsVisible,
+  fondamentaleStepIsComplete,
+  fondamentaleStepIsVisible,
+  perimetreStepIsComplete,
+  perimetreStepIsVisible,
+  sectionsStepIsComplete,
+  sectionsStepIsVisible,
+} from 'camino-common/src/permissions/etape-form'
+import { EtapeAlerte, PureFormSaveBtn } from './pure-form-save-btn'
+import { TitresStatuts } from 'camino-common/src/static/titresStatuts'
+import { DeposeEtapePopup } from '../demarche/depose-etape-popup'
+
+export type Props = {
+  etape: DeepReadonly<Etape & Pick<Nullable<EtapeWithHeritage>, 'heritageContenu' | 'heritageProps'>>
+  demarcheId: DemarcheId
+  demarcheTypeId: DemarcheTypeId
+  titreTypeId: TitreTypeId
+  titreSlug: TitreSlug
+  user: User
+  entreprises: DeepReadonly<Entreprise[]>
+  perimetre: DeepReadonly<PerimetreInformations>
+  initTab?: 'points' | 'carte'
+  goToDemarche: (demarcheId: DemarcheId) => void
+  apiClient: Pick<
+    ApiClient,
+    | 'getEntrepriseDocuments'
+    | 'getEtapesTypesEtapesStatuts'
+    | 'getEtapeHeritagePotentiel'
+    | 'uploadTempDocument'
+    | 'geojsonImport'
+    | 'getGeojsonByGeoSystemeId'
+    | 'geojsonPointsImport'
+    | 'geojsonForagesImport'
+    | 'getEtapeDocumentsByEtapeId'
+    | 'getEtapeEntrepriseDocuments'
+    | 'creerEntrepriseDocument'
+    | 'etapeCreer'
+    | 'etapeModifier'
+    | 'deposeEtape'
+  >
+}
+
+type EtapeEditFormDocuments = DeepReadonly<{
+  etapeDocuments: (EtapeDocument | TempEtapeDocument)[]
+  entrepriseDocuments: SelectedEntrepriseDocument[]
+  daeDocument: DocumentComplementaireDaeEtapeDocumentModification | null
+  aslDocument: DocumentComplementaireAslEtapeDocumentModification | null
+}>
+
+type Heritage = DeepReadonly<Pick<EtapeWithHeritage, 'heritageProps' | 'heritageContenu' | 'date' | 'typeId' | 'statutId'>>
+export const EtapeEditForm = defineComponent<Props>(props => {
+  const [etape, setEtape] = useState(props.etape)
+  const [heritage, setHeritage] = useState<DeepReadonly<Heritage> | null>(null)
+  const [perimetreInfos, setPerimetreInfos] = useState<DeepReadonly<PerimetreInformations>>(props.perimetre)
+
+  const [documents, setDocuments] = useState<EtapeEditFormDocuments>({
+    etapeDocuments: [],
+    entrepriseDocuments: [],
+    daeDocument: null,
+    aslDocument: null,
+  })
+  const heritageData = ref<AsyncData<Heritage>>({ status: 'LOADING' })
+
+  onMounted(async () => {
+    if (
+      isNotNullNorUndefined(props.etape.id) &&
+      isNotNullNorUndefined(props.etape.date) &&
+      isNotNullNorUndefined(props.etape.typeId) &&
+      isNotNullNorUndefined(props.etape.statutId) &&
+      isNotNullNorUndefined(props.etape.heritageContenu) &&
+      isNotNullNorUndefined(props.etape.heritageProps)
+    ) {
+      const heritageComplete = {
+        date: props.etape.date,
+        typeId: props.etape.typeId,
+        statutId: props.etape.statutId,
+        heritageProps: props.etape.heritageProps,
+        heritageContenu: props.etape.heritageContenu,
+      }
+      setHeritage(heritageComplete)
+      heritageData.value = { status: 'LOADED', value: heritageComplete }
+    } else {
+      await reloadHeritage(props.demarcheId, etape.value)
+    }
+  })
+
+  const reloadHeritage = async (demarcheId: DemarcheId, etape: Pick<Etape, 'date' | 'typeId' | 'statutId' | 'id'>) => {
+    if (isNotNullNorUndefined(etape.date) && isNotNullNorUndefined(etape.typeId) && isNotNullNorUndefined(etape.statutId)) {
+      try {
+        heritageData.value = { status: 'LOADING' }
+        const value = await props.apiClient.getEtapeHeritagePotentiel(demarcheId, etape.date, etape.typeId, etape.id)
+        const heritageComplete = { ...value, date: etape.date, typeId: etape.typeId, statutId: etape.statutId }
+        setHeritage(heritageComplete)
+        heritageData.value = { status: 'LOADED', value: heritageComplete }
+      } catch (e: any) {
+        console.error('error', e)
+        heritageData.value = {
+          status: 'ERROR',
+          message: e.message ?? "Une erreur s'est produite",
+        }
+      }
+    }
+  }
+
+  const dateTypeCompleteUpdate = async (etapeDateType: EtapeDateTypeEdit) => {
+    if (isNotNullNorUndefined(etapeDateType.typeId) && isNotNullNorUndefined(etapeDateType.statutId)) {
+      setEtape({ ...etape.value, date: etapeDateType.date, typeId: etapeDateType.typeId, statutId: etapeDateType.statutId })
+      await reloadHeritage(props.demarcheId, etapeDateType)
+    }
+  }
+
+  const stepInternalIsVisible = computed<boolean>(() => {
+    return heritageData.value.status === 'LOADED'
+  })
+
+  const setEtapeAndDocument = (etape: DeepReadonly<EtapeWithHeritage>, documents: EtapeEditFormDocuments) => {
+    setEtape(etape)
+    setHeritage(etape)
+    setDocuments(documents)
+  }
+
+  const alertes = computed<EtapeAlerte[]>(() => {
+    const alertes: EtapeAlerte[] = []
+    if (isNotNullNorUndefined(perimetreInfos.value) && heritageData.value.status === 'LOADED') {
+      if (perimetreInfos.value.superposition_alertes.length > 0) {
+        alertes.push(
+          ...perimetreInfos.value.superposition_alertes.map(t => ({
+            message: `Le titre ${t.nom} au statut « ${isNotNullNorUndefined(t.titre_statut_id) ? TitresStatuts[t.titre_statut_id].nom : ''} » est superposé à ce titre`,
+            url: `/titres/${t.slug}`,
+          }))
+        )
+      }
+
+      // si c’est une demande d’AXM, on doit afficher une alerte si on est en zone 0 ou 1 du Sdom
+      if (['mfr', 'mcr'].includes(heritageData.value.value.typeId) && props.titreTypeId === 'axm') {
+        const zoneId = perimetreInfos.value.sdomZoneIds.find(id => [SDOMZoneIds.Zone0, SDOMZoneIds.Zone0Potentielle, SDOMZoneIds.Zone1].includes(id))
+        if (zoneId) {
+          alertes.push({ message: `Le périmètre renseigné est dans une zone du Sdom interdite à l’exploitation minière : ${SDOMZones[zoneId].nom}` })
+        }
+      }
+    }
+
+    return alertes
+  })
+
+  const demandeEnConstruction = computed<boolean>(() => {
+    if (heritageData.value.status === 'LOADED') {
+      return heritageData.value.value.typeId === 'mfr' && heritageData.value.value.statutId === 'aco'
+    }
+
+    return false
+  })
+
+  const canSave = computed<boolean>(() => {
+    return (dateTypeStepIsComplete(etape.value, props.user) && demandeEnConstruction.value) || canDepose.value
+  })
+
+  const canDepose = computed<boolean>(() => {
+    if (isNotNullNorUndefined(heritage.value)) {
+      const etapeFlattened = flattenEtapeWithHeritage(props.titreTypeId, props.demarcheTypeId, etape.value, heritage.value)
+
+      return (
+        dateTypeStepIsComplete(etape.value, props.user) &&
+        fondamentaleStepIsComplete(etapeFlattened, props.demarcheTypeId, props.titreTypeId) &&
+        sectionsStepIsComplete(etapeFlattened, props.demarcheTypeId, props.titreTypeId) &&
+        perimetreStepIsComplete(etapeFlattened) &&
+        etapeDocumentsStepIsComplete(
+          etapeFlattened,
+          props.demarcheTypeId,
+          props.titreTypeId,
+          documents.value.etapeDocuments,
+          props.perimetre.sdomZoneIds,
+          documents.value.daeDocument,
+          documents.value.aslDocument,
+          props.user
+        ) &&
+        entrepriseDocumentsStepIsComplete(etapeFlattened, props.demarcheTypeId, props.titreTypeId, documents.value.entrepriseDocuments)
+      )
+    }
+
+    return false
+  })
+
+  const save = async () => {
+    if (canSave.value && isNotNullNorUndefined(heritage.value)) {
+      let etapeId: EtapeId | null
+      if (isNotNullNorUndefined(props.etape.id)) {
+        etapeId = await props.apiClient.etapeModifier({
+          ...etape.value,
+          ...heritage.value,
+          id: props.etape.id,
+          titreDemarcheId: props.demarcheId,
+          ...documents.value,
+          entrepriseDocumentIds: documents.value.entrepriseDocuments.map(({ id }) => id),
+        })
+      } else {
+        etapeId = await props.apiClient.etapeCreer({
+          ...etape.value,
+          ...heritage.value,
+          titreDemarcheId: props.demarcheId,
+          ...documents.value,
+          entrepriseDocumentIds: documents.value.entrepriseDocuments.map(({ id }) => id),
+        })
+      }
+
+      return etapeId
+    }
+
+    return null
+  }
+
+  const saveAndReroute = async () => {
+    const etapeId = await save()
+    if (isNotNullNorUndefined(etapeId)) {
+      props.goToDemarche(props.demarcheId)
+    }
+  }
+
+  const etapeIdToDepose = ref<EtapeId | null>(null)
+  const depose = async () => {
+    if (canDepose.value) {
+      const etapeId = await save()
+      etapeIdToDepose.value = etapeId
+    }
+  }
+
+  const closeDeposePopup = () => {
+    etapeIdToDepose.value = null
+  }
+
+  return () => (
+    <form class="dsfr" onSubmit={e => e.preventDefault()}>
+      {dateTypeStepIsVisible(props.user) ? (
+        <Bloc step={{ name: 'Informations principales', help: null }} complete={dateTypeStepIsComplete(etape.value, props.user)}>
+          <DateTypeEdit etape={props.etape} apiClient={props.apiClient} completeUpdate={dateTypeCompleteUpdate} demarcheId={props.demarcheId} />
+        </Bloc>
+      ) : null}
+      {stepInternalIsVisible.value ? (
+        <LoadingElement
+          data={heritageData.value}
+          renderItem={item => (
+            <>
+              <EtapeEditFormInternal
+                {...props}
+                etape={isNotNullNorUndefined(heritage.value) ? { ...etape.value, ...heritage.value } : { ...etape.value, ...item }}
+                documents={documents.value}
+                setEtape={setEtapeAndDocument}
+                alertesUpdate={setPerimetreInfos}
+              />
+              <PureFormSaveBtn
+                class="fr-mt-2w fr-pt-2w fr-pb-2w"
+                style={{ position: 'sticky', bottom: 0, background: 'white', zIndex: 100000 }}
+                alertes={alertes.value}
+                canSave={canSave.value}
+                canDepose={canDepose.value}
+                showDepose={item.typeId === 'mfr' && item.statutId === 'aco'}
+                save={saveAndReroute}
+                depose={depose}
+              />
+              {isNotNullNorUndefined(etapeIdToDepose.value) ? (
+                <DeposeEtapePopup
+                  close={closeDeposePopup}
+                  apiClient={{
+                    ...props.apiClient,
+                    deposeEtape: async titreEtapeId => {
+                      await props.apiClient.deposeEtape(titreEtapeId)
+                      props.goToDemarche(props.demarcheId)
+                    },
+                  }}
+                  id={etapeIdToDepose.value}
+                />
+              ) : null}
+            </>
+          )}
+        />
+      ) : null}
+    </form>
+  )
+})
+
+const EtapeEditFormInternal = defineComponent<
+  {
+    etape: DeepReadonly<EtapeWithHeritage>
+    documents: EtapeEditFormDocuments
+    setEtape: (etape: DeepReadonly<EtapeWithHeritage>, documents: EtapeEditFormDocuments) => void
+    alertesUpdate: (alertes: PerimetreInformations) => void
+  } & Omit<Props, 'etape'>
+>(props => {
+  const etapeFlattened = computed<DeepReadonly<EtapeWithHeritage>>(() => {
+    return flattenEtapeWithHeritage(props.titreTypeId, props.demarcheTypeId, props.etape, props.etape)
+  })
+
+  const documentsCompleteUpdate = (
+    etapeDocuments: (EtapeDocument | TempEtapeDocument)[],
+    daeDocument: DocumentComplementaireDaeEtapeDocumentModification | null,
+    aslDocument: DocumentComplementaireAslEtapeDocumentModification | null
+  ) => {
+    props.setEtape(etapeFlattened.value, {
+      ...props.documents,
+      etapeDocuments,
+      daeDocument,
+      aslDocument,
+    })
+  }
+
+  const entrepriseDocumentsCompleteUpdate = (entrepriseDocuments: DeepReadonly<SelectedEntrepriseDocument[]>) => {
+    props.setEtape(etapeFlattened.value, { ...props.documents, entrepriseDocuments })
+  }
+
+  const onEtapePerimetreChange = (perimetreInfos: GeojsonInformations) => {
+    props.setEtape(
+      {
+        ...etapeFlattened.value,
+        geojson4326Perimetre: perimetreInfos.geojson4326_perimetre,
+        geojson4326Points: perimetreInfos.geojson4326_points,
+        geojsonOriginePerimetre: perimetreInfos.geojson_origine_perimetre,
+        geojsonOriginePoints: perimetreInfos.geojson_origine_points,
+        geojsonOrigineGeoSystemeId: perimetreInfos.geojson_origine_geo_systeme_id,
+      },
+      props.documents
+    )
+
+    props.alertesUpdate({ superposition_alertes: perimetreInfos.superposition_alertes, sdomZoneIds: perimetreInfos.sdomZoneIds })
+  }
+
+  const onEtapePerimetreHeritageChange = (perimetre: DeepReadonly<HeritageProp<Pick<EtapeWithHeritage, 'typeId' | 'date' | EtapePropsFromHeritagePropName<'perimetre'>>>>) => {
+    props.setEtape(
+      {
+        ...props.etape,
+        heritageProps: { ...props.etape.heritageProps, perimetre },
+      },
+      props.documents
+    )
+  }
+  const onEtapePointsChange = (geojson4326Points: FeatureCollectionPoints, geojsonOriginePoints: FeatureCollectionPoints) => {
+    props.setEtape({ ...etapeFlattened.value, geojson4326Points, geojsonOriginePoints }, props.documents)
+  }
+  const onEtapeForagesChange = (geojson4326Forages: FeatureCollectionForages, geojsonOrigineForages: FeatureCollectionForages) => {
+    props.setEtape({ ...etapeFlattened.value, geojson4326Forages, geojsonOrigineForages }, props.documents)
+  }
+
+  const sectionCompleteUpdate = (sectionsEtape: SectionsEditEtape) => {
+    props.setEtape({ ...etapeFlattened.value, contenu: sectionsEtape.contenu, heritageContenu: sectionsEtape.heritageContenu }, props.documents)
+  }
+
+  const onUpdateNotes = (notes: string) => {
+    props.setEtape({ ...etapeFlattened.value, notes }, props.documents)
+  }
+
+  const fondamentalesCompleteUpdate = (etapeFondamentale: DeepReadonly<EtapeFondamentaleEdit>) => {
+    props.setEtape({ ...props.etape, ...etapeFondamentale }, props.documents)
+  }
+
+  const titulairesAndAmodiataires = computed<Entreprise[]>(() => {
+    const titulaireIds = props.etape.titulaires.map(({ id }) => id)
+    const amodiatairesIds = props.etape.amodiataires.map(({ id }) => id)
+
+    return props.entreprises.filter(({ id }) => titulaireIds.includes(id) || amodiatairesIds.includes(id))
+  })
+
+  const isHelpVisible = computed<boolean>(() => {
+    return props.etape.typeId === 'mfr' && ['arm', 'axm'].includes(props.titreTypeId)
+  })
+
+  return () => (
+    <div>
+      {fondamentaleStepIsVisible(etapeFlattened.value.typeId) ? (
+        <Bloc step={{ name: 'Propriétés', help: null }} complete={fondamentaleStepIsComplete(etapeFlattened.value, props.demarcheTypeId, props.titreTypeId)}>
+          <FondamentalesEdit
+            etape={etapeFlattened.value}
+            demarcheTypeId={props.demarcheTypeId}
+            titreTypeId={props.titreTypeId}
+            user={props.user}
+            entreprises={props.entreprises}
+            completeUpdate={fondamentalesCompleteUpdate}
+          />
+        </Bloc>
+      ) : null}
+
+      {sectionsStepIsVisible(etapeFlattened.value, props.demarcheTypeId, props.titreTypeId) ? (
+        <Bloc
+          step={{
+            name: 'Propriétés spécifiques',
+            help: isHelpVisible.value ? 'Ce bloc permet de savoir si la prospection est mécanisée ou non et s’il y a des franchissements de cours d’eau (si oui, combien ?)' : null,
+          }}
+          complete={sectionsStepIsComplete(etapeFlattened.value, props.demarcheTypeId, props.titreTypeId)}
+        >
+          <SectionsEdit etape={etapeFlattened.value} titreTypeId={props.titreTypeId} demarcheTypeId={props.demarcheTypeId} completeUpdate={sectionCompleteUpdate} />
+        </Bloc>
+      ) : null}
+
+      {perimetreStepIsVisible(etapeFlattened.value) ? (
+        <Bloc step={{ name: 'Périmètre', help: null }} complete={perimetreStepIsComplete(etapeFlattened.value)}>
+          <PerimetreEdit
+            etape={etapeFlattened.value}
+            titreTypeId={props.titreTypeId}
+            titreSlug={props.titreSlug}
+            apiClient={props.apiClient}
+            initTab={props.initTab}
+            onEtapeChange={onEtapePerimetreChange}
+            onPointsChange={onEtapePointsChange}
+            onForagesChange={onEtapeForagesChange}
+            onHeritageChange={onEtapePerimetreHeritageChange}
+          />
+        </Bloc>
+      ) : null}
+
+      {etapeDocumentsStepIsVisible(etapeFlattened.value, props.demarcheTypeId, props.titreTypeId) ? (
+        <Bloc
+          step={{ name: 'Liste des documents', help: null }}
+          complete={etapeDocumentsStepIsComplete(
+            etapeFlattened.value,
+            props.demarcheTypeId,
+            props.titreTypeId,
+            props.documents.etapeDocuments,
+            props.perimetre.sdomZoneIds,
+            props.documents.daeDocument,
+            props.documents.aslDocument,
+            props.user
+          )}
+        >
+          <EtapeDocumentsEdit
+            apiClient={props.apiClient}
+            tde={{ titreTypeId: props.titreTypeId, demarcheTypeId: props.demarcheTypeId, etapeTypeId: etapeFlattened.value.typeId }}
+            etapeId={etapeFlattened.value.id}
+            completeUpdate={documentsCompleteUpdate}
+            sdomZoneIds={props.perimetre.sdomZoneIds}
+            user={props.user}
+            contenu={etapeFlattened.value.contenu}
+            etapeStatutId={etapeFlattened.value.statutId}
+          />
+        </Bloc>
+      ) : null}
+
+      {entrepriseDocumentsStepIsVisible(etapeFlattened.value, props.demarcheTypeId, props.titreTypeId) ? (
+        <Bloc
+          step={{
+            name: 'Documents d’entreprise',
+            help: isHelpVisible.value
+              ? "Les documents d’entreprise sont des documents propres à l'entreprise, et pourront être réutilisés pour la création d'un autre dossier et mis à jour si nécessaire. Ces documents d’entreprise sont consultables dans la fiche entreprise de votre société. Cette section permet de protéger et de centraliser les informations d'ordre privé relatives à la société et à son personnel."
+              : null,
+          }}
+          complete={entrepriseDocumentsStepIsComplete(etapeFlattened.value, props.demarcheTypeId, props.titreTypeId, props.documents.entrepriseDocuments)}
+        >
+          <EntrepriseDocumentsEdit
+            entreprises={titulairesAndAmodiataires.value}
+            apiClient={props.apiClient}
+            tde={{ titreTypeId: props.titreTypeId, demarcheTypeId: props.demarcheTypeId, etapeTypeId: etapeFlattened.value.typeId }}
+            etapeId={props.etape.id}
+            completeUpdate={entrepriseDocumentsCompleteUpdate}
+          />
+        </Bloc>
+      ) : null}
+
+      <DsfrTextarea initialValue={props.etape.notes} class="fr-mt-2w" legend={{ main: 'Notes' }} valueChanged={onUpdateNotes} />
+    </div>
+  )
+})
+
+// @ts-ignore waiting for https://github.com/vuejs/core/issues/7833
+EtapeEditForm.props = ['etape', 'demarcheId', 'demarcheTypeId', 'titreTypeId', 'titreSlug', 'user', 'perimetre', 'entreprises', 'apiClient', 'initTab', 'goToDemarche']
+
+// @ts-ignore waiting for https://github.com/vuejs/core/issues/7833
+EtapeEditFormInternal.props = [
+  'etape',
+  'demarcheId',
+  'demarcheTypeId',
+  'titreTypeId',
+  'titreSlug',
+  'user',
+  'perimetre',
+  'entreprises',
+  'apiClient',
+  'alertesUpdate',
+  'initTab',
+  'setEtape',
+  'documents',
+]
diff --git a/packages/ui/src/components/etape/fondamentales-edit.stories.ts b/packages/ui/src/components/etape/fondamentales-edit.stories.ts
deleted file mode 100644
index c995bc5dc40dd3747264727650ba316005ebc881..0000000000000000000000000000000000000000
--- a/packages/ui/src/components/etape/fondamentales-edit.stories.ts
+++ /dev/null
@@ -1,198 +0,0 @@
-import { FondamentalesEdit, Props } from './fondamentales-edit'
-import { Meta, StoryFn } from '@storybook/vue3'
-import { EtapeFondamentale, etapeIdValidator } from 'camino-common/src/etape'
-import { newEntrepriseId } from 'camino-common/src/entreprise'
-import { toCaminoDate } from 'camino-common/src/date'
-import { testBlankUser } from 'camino-common/src/tests-utils'
-
-const meta: Meta = {
-  title: 'Components/Etape/FondamentalesEdit',
-  component: FondamentalesEdit,
-  argTypes: {},
-}
-export default meta
-
-const etape: EtapeFondamentale = {
-  id: etapeIdValidator.parse('id'),
-  typeId: 'mfr',
-  contenu: {},
-  date: toCaminoDate('2022-02-02'),
-  dateDebut: toCaminoDate('2022-02-02'),
-  dateFin: undefined,
-  duree: 4,
-  substances: ['arse'],
-  titulaires: [{ id: newEntrepriseId('optionId1'), operateur: true }],
-  amodiataires: [],
-  notes: null,
-  heritageProps: {
-    dateDebut: {
-      actif: false,
-    },
-    dateFin: {
-      actif: false,
-    },
-    duree: {
-      actif: false,
-    },
-    substances: {
-      actif: true,
-      etape: {
-        date: toCaminoDate('2022-01-01'),
-        typeId: 'mfr',
-        substances: ['arge'],
-        titulaires: [],
-        amodiataires: [],
-        dateDebut: null,
-        dateFin: undefined,
-        duree: undefined,
-      },
-    },
-    titulaires: {
-      actif: false,
-    },
-    amodiataires: {
-      actif: false,
-    },
-    perimetre: {
-      actif: false,
-    },
-  },
-}
-const Template: StoryFn<Props> = (args: Props) => ({
-  components: { FondamentalesEdit },
-  setup() {
-    return { args }
-  },
-  data: () => ({ etapeData: {} }),
-  watch: {
-    args: {
-      handler: function (newValue) {
-        this.etapeData = newValue.etape
-      },
-      immediate: true,
-    },
-  },
-  template: '<FondamentalesEdit v-bind="args" :etape="etapeData"/>',
-})
-
-export const ArmDemandeONF = Template.bind(
-  {},
-  {
-    etape,
-    demarcheTypeId: 'oct',
-    titreTypeId: 'arm',
-    user: {
-      role: 'admin',
-      administrationId: 'ope-onf-973-01',
-      ...testBlankUser,
-    },
-    entreprises: [
-      {
-        id: newEntrepriseId('optionId1'),
-        nom: 'optionNom1',
-        legal_siren: null,
-      },
-    ],
-  }
-)
-
-export const ArmDemandeOperateur = Template.bind(
-  {},
-  {
-    etape,
-    demarcheTypeId: 'oct',
-    titreTypeId: 'arm',
-    user: { role: 'entreprise', entreprises: [], ...testBlankUser },
-    entreprises: [
-      {
-        id: newEntrepriseId('optionId1'),
-        nom: 'optionNom1',
-        legal_siren: null,
-      },
-    ],
-  }
-)
-
-export const ArmJorfONF = Template.bind(
-  {},
-  {
-    etape: { ...etape, typeId: 'dpu' },
-    demarcheTypeId: 'oct',
-    titreTypeId: 'arm',
-    user: {
-      role: 'admin',
-      administrationId: 'ope-onf-973-01',
-      ...testBlankUser,
-    },
-    entreprises: [
-      {
-        id: newEntrepriseId('optionId1'),
-        nom: 'optionNom1',
-        legal_siren: null,
-      },
-    ],
-  }
-)
-
-export const AxmDemandeONF = Template.bind(
-  {},
-  {
-    etape,
-    demarcheTypeId: 'oct',
-    titreTypeId: 'axm',
-    user: {
-      role: 'admin',
-      administrationId: 'ope-onf-973-01',
-      ...testBlankUser,
-    },
-    entreprises: [
-      {
-        id: newEntrepriseId('optionId1'),
-        nom: 'optionNom1',
-        legal_siren: null,
-      },
-    ],
-  }
-)
-
-export const PrmDemandeONF = Template.bind(
-  {},
-  {
-    etape,
-    demarcheTypeId: 'oct',
-    titreTypeId: 'prm',
-    user: {
-      role: 'admin',
-      administrationId: 'ope-onf-973-01',
-      ...testBlankUser,
-    },
-    entreprises: [
-      {
-        id: newEntrepriseId('optionId1'),
-        nom: 'optionNom1',
-        legal_siren: null,
-      },
-    ],
-  }
-)
-
-export const PrmDeplacementDePerimetreONF = Template.bind(
-  {},
-  {
-    etape,
-    demarcheTypeId: 'dep',
-    titreTypeId: 'prm',
-    user: {
-      role: 'admin',
-      administrationId: 'ope-onf-973-01',
-      ...testBlankUser,
-    },
-    entreprises: [
-      {
-        id: newEntrepriseId('optionId1'),
-        nom: 'optionNom1',
-        legal_siren: null,
-      },
-    ],
-  }
-)
diff --git a/packages/ui/src/components/etape/fondamentales-edit.stories.tsx b/packages/ui/src/components/etape/fondamentales-edit.stories.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..d30a1e68d0ed2cb81aed871fb641a891ea396e7d
--- /dev/null
+++ b/packages/ui/src/components/etape/fondamentales-edit.stories.tsx
@@ -0,0 +1,169 @@
+import { FondamentalesEdit } from './fondamentales-edit'
+import { Meta, StoryFn } from '@storybook/vue3'
+import { EtapeWithHeritage, etapeIdValidator } from 'camino-common/src/etape'
+import { newEntrepriseId } from 'camino-common/src/entreprise'
+import { toCaminoDate } from 'camino-common/src/date'
+import { testBlankUser } from 'camino-common/src/tests-utils'
+import { action } from '@storybook/addon-actions'
+
+const meta: Meta = {
+  title: 'Components/Etape/FondamentalesEdit',
+  component: FondamentalesEdit,
+  argTypes: {},
+  decorators: [() => ({ template: '<div class="dsfr"><story/></div>' })],
+}
+export default meta
+
+const etape: EtapeWithHeritage = {
+  id: etapeIdValidator.parse('id'),
+  heritageContenu: {},
+  statutId: 'aco',
+  typeId: 'mfr',
+  contenu: {},
+  date: toCaminoDate('2022-02-02'),
+  dateDebut: toCaminoDate('2022-02-02'),
+  dateFin: null,
+  duree: 4,
+  substances: ['arse'],
+  titulaires: [{ id: newEntrepriseId('optionId1'), operateur: true }],
+  amodiataires: [],
+  notes: null,
+  geojson4326Forages: null,
+  geojson4326Perimetre: null,
+  geojson4326Points: null,
+  surface: null,
+  geojsonOriginePerimetre: null,
+  geojsonOriginePoints: null,
+  geojsonOrigineGeoSystemeId: null,
+  geojsonOrigineForages: null,
+  heritageProps: {
+    dateDebut: {
+      actif: false,
+    },
+    dateFin: {
+      actif: false,
+    },
+    duree: {
+      actif: false,
+      etape: {
+        date: toCaminoDate('2022-01-01'),
+        typeId: 'mfr',
+        duree: 12,
+      },
+    },
+    substances: {
+      actif: true,
+      etape: {
+        date: toCaminoDate('2022-01-01'),
+        typeId: 'mfr',
+        substances: ['arge'],
+      },
+    },
+    titulaires: {
+      actif: false,
+    },
+    amodiataires: {
+      actif: false,
+    },
+    perimetre: {
+      actif: false,
+    },
+  },
+}
+
+const entreprises = [
+  {
+    id: newEntrepriseId('optionId1'),
+    nom: 'optionNom1',
+    legal_siren: null,
+  },
+  {
+    id: newEntrepriseId('optionId2'),
+    nom: 'optionNom2',
+    legal_siren: null,
+  },
+  {
+    id: newEntrepriseId('optionId3'),
+    nom: 'optionNom3',
+    legal_siren: null,
+  },
+]
+
+const completeUpdate = action('completeUpdate')
+
+export const AxmDemandeSuper: StoryFn = () => (
+  <FondamentalesEdit
+    etape={etape}
+    completeUpdate={completeUpdate}
+    demarcheTypeId="oct"
+    titreTypeId="axm"
+    user={{
+      role: 'super',
+      ...testBlankUser,
+    }}
+    entreprises={entreprises}
+  />
+)
+
+export const ArmDemandeONF: StoryFn = () => (
+  <FondamentalesEdit
+    etape={etape}
+    completeUpdate={completeUpdate}
+    demarcheTypeId="oct"
+    titreTypeId="arm"
+    user={{
+      role: 'admin',
+      administrationId: 'ope-onf-973-01',
+      ...testBlankUser,
+    }}
+    entreprises={entreprises}
+  />
+)
+
+export const ArmDemandeOperateur: StoryFn = () => (
+  <FondamentalesEdit etape={etape} completeUpdate={completeUpdate} demarcheTypeId="oct" titreTypeId="arm" user={{ role: 'entreprise', entreprises: [], ...testBlankUser }} entreprises={entreprises} />
+)
+
+export const ArmJorfONF: StoryFn = () => (
+  <FondamentalesEdit
+    etape={{ ...etape, typeId: 'dpu' }}
+    completeUpdate={completeUpdate}
+    demarcheTypeId="oct"
+    titreTypeId="arm"
+    user={{ role: 'admin', administrationId: 'ope-onf-973-01', ...testBlankUser }}
+    entreprises={entreprises}
+  />
+)
+
+export const AxmDemandeONF: StoryFn = () => (
+  <FondamentalesEdit
+    etape={etape}
+    completeUpdate={completeUpdate}
+    demarcheTypeId="oct"
+    titreTypeId="axm"
+    user={{ role: 'admin', administrationId: 'ope-onf-973-01', ...testBlankUser }}
+    entreprises={entreprises}
+  />
+)
+
+export const PrmDemandeONF: StoryFn = () => (
+  <FondamentalesEdit
+    etape={etape}
+    completeUpdate={completeUpdate}
+    demarcheTypeId="oct"
+    titreTypeId="prm"
+    user={{ role: 'admin', administrationId: 'ope-onf-973-01', ...testBlankUser }}
+    entreprises={entreprises}
+  />
+)
+
+export const PrmDeplacementDePerimetreONF: StoryFn = () => (
+  <FondamentalesEdit
+    etape={etape}
+    completeUpdate={completeUpdate}
+    demarcheTypeId="dep"
+    titreTypeId="prm"
+    user={{ role: 'admin', administrationId: 'ope-onf-973-01', ...testBlankUser }}
+    entreprises={entreprises}
+  />
+)
diff --git a/packages/ui/src/components/etape/fondamentales-edit.stories_snapshots_ArmDemandeONF.html b/packages/ui/src/components/etape/fondamentales-edit.stories_snapshots_ArmDemandeONF.html
index 679d4238c91c5962b143010dd265b59631043796..0df9dce8cd07761a54ea66b5f7319dd81578b47c 100644
--- a/packages/ui/src/components/etape/fondamentales-edit.stories_snapshots_ArmDemandeONF.html
+++ b/packages/ui/src/components/etape/fondamentales-edit.stories_snapshots_ArmDemandeONF.html
@@ -1,37 +1,32 @@
-<div>
-  <!---->
-  <!---->
-  <!---->
-  <h3 class="mb-s">Titulaires</h3>
-  <p class="h6 italic">Optionnel</p>
-  <div class="mb-s">
-    <div>
-      <div>
-        <div class="flex mb-s flex-center">
-          <div class="h4" style="flex: 0 1 15em;">optionNom1</div><label style="flex-basis: auto; user-select: none;"><input type="checkbox" class="mr-xs">Opérateur</label><button title="Supprime l’entreprise" aria-label="Supprime l’entreprise" class="btn py-s px-m rnd-xs"><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
-              <use href="#icon-minus"></use>
-            </svg></button>
+<div class="dsfr">
+  <div class="fr-grid-row">
+    <div class="fr-col-12 fr-col-xl-6">
+      <!---->
+      <!---->
+      <!---->
+      <div class="fr-input-group"><label class="fr-label" for="filters_autocomplete_titulaires">
+          <h6>Titulaires</h6>
+        </label>
+        <div class="mb-s">
+          <div id="filters_autocomplete_titulaires_wrapper" class="_typeahead_8eddf1 dsfr">
+            <div style="display: flex; max-height: unset; flex-wrap: wrap; gap: 8px; outline-offset: 2px; outline-width: 2px; outline-color: rgb(10, 118, 246);" class="fr-input _fake-input_8eddf1"><button class="fr-tag fr-tag--sm fr-tag--dismiss" title="optionNom1">optionNom1</button><input id="filters_autocomplete_titulaires" type="text" name="filters_autocomplete_titulaires" class="_typeahead-input_8eddf1" style="outline: none;" placeholder="titulaires" autocomplete="off"></div>
+            <!---->
+          </div>
+          <!---->
         </div>
       </div>
-      <div id="autocomplete_entreprise_wrapper" class="_typeahead_8eddf1 dsfr">
-        <div class="flex"><input id="autocomplete_entreprise" type="text" name="autocomplete_entreprise" class="_typeahead-input_8eddf1 fr-input" placeholder="Sélectionner un titulaire" autocomplete="off"></div>
-        <!---->
-      </div>
-    </div>
-    <!---->
-  </div>
-  <!---->
-  <div>
-    <h3 class="mb-s">Substances</h3>
-    <div class="mb-s">
+      <!---->
       <div>
-        <ul class="list-inline mb-s">
-          <li class="mr-xs mb-xs"><span class="bold cap-first small lh-2"><span class="bg-neutral py-xs px-s rnd-xs color-bg box">argent</span></span></li>
-        </ul>
-      </div>
-      <div class="dsfr">
-        <div class="fr-toggle"><input type="checkbox" class="fr-toggle__input" aria-describedby="toggle-toggle_271-hint-text" id="toggle_271"><label class="fr-toggle__label" for="toggle_271" data-fr-checked-label="Activé" data-fr-unchecked-label="Désactivé"><span class=" fr-ml-4w">Hériter de l’étape précédente</span></label>
-          <p class="fr-hint-text" id="toggle-toggle_271-hint-text">Hérité de : Demande (01-01-2022)</p>
+        <h6>Substances</h6>
+        <div class="mb-s">
+          <div>
+            <p class="fr-tag fr-tag--md fr-mr-1w" title="Argent" aria-label="Argent">Argent</p>
+          </div>
+          <div class="dsfr">
+            <div class="fr-toggle"><input type="checkbox" class="fr-toggle__input" id="toggle_271"><label class="fr-toggle__label" for="toggle_271" data-fr-checked-label="Activé" data-fr-unchecked-label="Désactivé"><span class=" fr-ml-4w">Hériter de l’étape "Demande" du 01-01-2022</span></label>
+              <!---->
+            </div>
+          </div>
         </div>
       </div>
     </div>
diff --git a/packages/ui/src/components/etape/fondamentales-edit.stories_snapshots_ArmDemandeOperateur.html b/packages/ui/src/components/etape/fondamentales-edit.stories_snapshots_ArmDemandeOperateur.html
index e291a45078a5c2cd840ffb6023012e2576d43da9..ba82ea37183621f79dbf8086d33a76d5ebb157a2 100644
--- a/packages/ui/src/components/etape/fondamentales-edit.stories_snapshots_ArmDemandeOperateur.html
+++ b/packages/ui/src/components/etape/fondamentales-edit.stories_snapshots_ArmDemandeOperateur.html
@@ -1,20 +1,22 @@
-<div>
-  <!---->
-  <!---->
-  <!---->
-  <!---->
-  <!---->
-  <div>
-    <h3 class="mb-s">Substances</h3>
-    <div class="mb-s">
+<div class="dsfr">
+  <div class="fr-grid-row">
+    <div class="fr-col-12 fr-col-xl-6">
+      <!---->
+      <!---->
+      <!---->
+      <!---->
+      <!---->
       <div>
-        <ul class="list-inline mb-s">
-          <li class="mr-xs mb-xs"><span class="bold cap-first small lh-2"><span class="bg-neutral py-xs px-s rnd-xs color-bg box">argent</span></span></li>
-        </ul>
-      </div>
-      <div class="dsfr">
-        <div class="fr-toggle"><input type="checkbox" class="fr-toggle__input" aria-describedby="toggle-toggle_271-hint-text" id="toggle_271"><label class="fr-toggle__label" for="toggle_271" data-fr-checked-label="Activé" data-fr-unchecked-label="Désactivé"><span class=" fr-ml-4w">Hériter de l’étape précédente</span></label>
-          <p class="fr-hint-text" id="toggle-toggle_271-hint-text">Hérité de : Demande (01-01-2022)</p>
+        <h6>Substances</h6>
+        <div class="mb-s">
+          <div>
+            <p class="fr-tag fr-tag--md fr-mr-1w" title="Argent" aria-label="Argent">Argent</p>
+          </div>
+          <div class="dsfr">
+            <div class="fr-toggle"><input type="checkbox" class="fr-toggle__input" id="toggle_271"><label class="fr-toggle__label" for="toggle_271" data-fr-checked-label="Activé" data-fr-unchecked-label="Désactivé"><span class=" fr-ml-4w">Hériter de l’étape "Demande" du 01-01-2022</span></label>
+              <!---->
+            </div>
+          </div>
         </div>
       </div>
     </div>
diff --git a/packages/ui/src/components/etape/fondamentales-edit.stories_snapshots_ArmJorfONF.html b/packages/ui/src/components/etape/fondamentales-edit.stories_snapshots_ArmJorfONF.html
index 672498c2cd152a35d5c77154c65f6e2ef528d3b0..bcc086f28dd824deaaa47a38e6f79ca0dcb8c4f8 100644
--- a/packages/ui/src/components/etape/fondamentales-edit.stories_snapshots_ArmJorfONF.html
+++ b/packages/ui/src/components/etape/fondamentales-edit.stories_snapshots_ArmJorfONF.html
@@ -1,91 +1,48 @@
-<div>
-  <!---->
-  <div class="tablet-blobs">
-    <div class="tablet-blob-1-3 tablet-pt-s pb-s">
-      <h5 class="mb-0">Date de début</h5>
-      <p class="h6 italic mb-0">Optionnel</p>
-    </div>
-    <div class="mb-s tablet-blob-2-3">
-      <div class="blobs-mini mb-s">
-        <div class="blob-mini-1-3"><input type="number" min="1" max="31" placeholder="jour" class="text-right p-s"></div>
-        <div class="blob-mini-1-3"><select class="mr-s p-s">
-            <option disabled="" hidden="" value="null">mois</option>
-            <option value="1">janvier</option>
-            <option value="2">février</option>
-            <option value="3">mars</option>
-            <option value="4">avril</option>
-            <option value="5">mai</option>
-            <option value="6">juin</option>
-            <option value="7">juillet</option>
-            <option value="8">aout</option>
-            <option value="9">septembre</option>
-            <option value="10">octobre</option>
-            <option value="11">novembre</option>
-            <option value="12">décembre</option>
-          </select></div>
-        <div class="blob-mini-1-3"><input type="number" min="1750" max="2099" placeholder="année" class="text-right p-s"></div>
-      </div>
+<div class="dsfr">
+  <div class="fr-grid-row">
+    <div class="fr-col-12 fr-col-xl-6">
       <!---->
-    </div>
-  </div>
-  <div class="tablet-blobs">
-    <div class="tablet-blob-1-3 tablet-pt-s pb-s">
-      <h5 class="mb-0">Date d'échéance</h5>
-      <p class="h6 italic mb-0">Optionnel</p>
-    </div>
-    <div class="mb-s tablet-blob-2-3">
-      <div class="blobs-mini mb-s">
-        <div class="blob-mini-1-3"><input type="number" min="1" max="31" placeholder="jour" class="text-right p-s"></div>
-        <div class="blob-mini-1-3"><select class="mr-s p-s">
-            <option disabled="" hidden="" value="null">mois</option>
-            <option value="1">janvier</option>
-            <option value="2">février</option>
-            <option value="3">mars</option>
-            <option value="4">avril</option>
-            <option value="5">mai</option>
-            <option value="6">juin</option>
-            <option value="7">juillet</option>
-            <option value="8">aout</option>
-            <option value="9">septembre</option>
-            <option value="10">octobre</option>
-            <option value="11">novembre</option>
-            <option value="12">décembre</option>
-          </select></div>
-        <div class="blob-mini-1-3"><input type="number" min="1750" max="2099" placeholder="année" class="text-right p-s"></div>
-      </div>
-      <!---->
-    </div>
-  </div>
-  <h3 class="mb-s">Titulaires</h3>
-  <p class="h6 italic">Optionnel</p>
-  <div class="mb-s">
-    <div>
-      <div>
-        <div class="flex mb-s flex-center">
-          <div class="h4" style="flex: 0 1 15em;">optionNom1</div><label style="flex-basis: auto; user-select: none;"><input type="checkbox" class="mr-xs">Opérateur</label><button title="Supprime l’entreprise" aria-label="Supprime l’entreprise" class="btn py-s px-m rnd-xs"><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
-              <use href="#icon-minus"></use>
-            </svg></button>
+      <div class="mb-s">
+        <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_271">Date de début
+            <!---->
+            <!---->
+          </label><input class="fr-input" name="input_271" id="input_271" type="date">
+          <!---->
         </div>
+        <!---->
       </div>
-      <div id="autocomplete_entreprise_wrapper" class="_typeahead_8eddf1 dsfr">
-        <div class="flex"><input id="autocomplete_entreprise" type="text" name="autocomplete_entreprise" class="_typeahead-input_8eddf1 fr-input" placeholder="Sélectionner un titulaire" autocomplete="off"></div>
+      <div class="mb-s">
+        <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_670">Date d’échéance
+            <!---->
+            <!---->
+          </label><input class="fr-input" name="input_670" id="input_670" type="date">
+          <!---->
+        </div>
         <!---->
       </div>
-    </div>
-    <!---->
-  </div>
-  <!---->
-  <div>
-    <h3 class="mb-s">Substances</h3>
-    <div class="mb-s">
-      <div>
-        <ul class="list-inline mb-s">
-          <li class="mr-xs mb-xs"><span class="bold cap-first small lh-2"><span class="bg-neutral py-xs px-s rnd-xs color-bg box">argent</span></span></li>
-        </ul>
+      <div class="fr-input-group"><label class="fr-label" for="filters_autocomplete_titulaires">
+          <h6>Titulaires</h6>
+        </label>
+        <div class="mb-s">
+          <div id="filters_autocomplete_titulaires_wrapper" class="_typeahead_8eddf1 dsfr">
+            <div style="display: flex; max-height: unset; flex-wrap: wrap; gap: 8px; outline-offset: 2px; outline-width: 2px; outline-color: rgb(10, 118, 246);" class="fr-input _fake-input_8eddf1"><button class="fr-tag fr-tag--sm fr-tag--dismiss" title="optionNom1">optionNom1</button><input id="filters_autocomplete_titulaires" type="text" name="filters_autocomplete_titulaires" class="_typeahead-input_8eddf1" style="outline: none;" placeholder="titulaires" autocomplete="off"></div>
+            <!---->
+          </div>
+          <!---->
+        </div>
       </div>
-      <div class="dsfr">
-        <div class="fr-toggle"><input type="checkbox" class="fr-toggle__input" aria-describedby="toggle-toggle_271-hint-text" id="toggle_271"><label class="fr-toggle__label" for="toggle_271" data-fr-checked-label="Activé" data-fr-unchecked-label="Désactivé"><span class=" fr-ml-4w">Hériter de l’étape précédente</span></label>
-          <p class="fr-hint-text" id="toggle-toggle_271-hint-text">Hérité de : Demande (01-01-2022)</p>
+      <!---->
+      <div>
+        <h6>Substances</h6>
+        <div class="mb-s">
+          <div>
+            <p class="fr-tag fr-tag--md fr-mr-1w" title="Argent" aria-label="Argent">Argent</p>
+          </div>
+          <div class="dsfr">
+            <div class="fr-toggle"><input type="checkbox" class="fr-toggle__input" id="toggle_74"><label class="fr-toggle__label" for="toggle_74" data-fr-checked-label="Activé" data-fr-unchecked-label="Désactivé"><span class=" fr-ml-4w">Hériter de l’étape "Demande" du 01-01-2022</span></label>
+              <!---->
+            </div>
+          </div>
         </div>
       </div>
     </div>
diff --git a/packages/ui/src/components/etape/fondamentales-edit.stories_snapshots_AxmDemandeONF.html b/packages/ui/src/components/etape/fondamentales-edit.stories_snapshots_AxmDemandeONF.html
index 28f60517cb5cd7008ddcdf7f978475479033cf55..6ae8699bee5c08a2e4e5c94540bc767b817ebee6 100644
--- a/packages/ui/src/components/etape/fondamentales-edit.stories_snapshots_AxmDemandeONF.html
+++ b/packages/ui/src/components/etape/fondamentales-edit.stories_snapshots_AxmDemandeONF.html
@@ -1,49 +1,52 @@
-<div>
-  <div class="tablet-blobs">
-    <div class="tablet-blob-1-3 tablet-pt-s pb-s">
-      <h5 class="mb-0">Durée (années / mois)</h5>
-      <!---->
-    </div>
-    <div class="mb-s tablet-blob-2-3">
-      <div class="blobs-mini">
-        <div class="blob-mini-1-2"><input placeholder="années" type="text" pattern="([0-9]{1,3}[\s]?)*([.,][0-9]*)?" class="p-s text-right py-s mb-s"></div>
-        <div class="blob-mini-1-2"><input placeholder="mois" type="text" pattern="([0-9]{1,3}[\s]?)*([.,][0-9]*)?" class="p-s text-right p-s"></div>
+<div class="dsfr">
+  <div class="fr-grid-row">
+    <div class="fr-col-12 fr-col-xl-6">
+      <div class="mb-s">
+        <div style="display: flex;">
+          <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_271">Durée (années) *
+              <!---->
+              <!---->
+            </label><input class="fr-input" name="input_271" id="input_271" type="number">
+            <!---->
+          </div>
+          <div class="fr-input-group fr-ml-2w" style="margin-bottom: 0px;"><label class="fr-label" for="input_670">Durée (mois) *
+              <!---->
+              <!---->
+            </label><input class="fr-input" name="input_670" id="input_670" type="number">
+            <!---->
+          </div>
+        </div>
+        <div class="dsfr">
+          <div class="fr-toggle"><input type="checkbox" class="fr-toggle__input" id="toggle_74"><label class="fr-toggle__label" for="toggle_74" data-fr-checked-label="Activé" data-fr-unchecked-label="Désactivé"><span class=" fr-ml-4w">Hériter de l’étape "Demande" du 01-01-2022</span></label>
+            <!---->
+          </div>
+        </div>
       </div>
       <!---->
-    </div>
-  </div>
-  <!---->
-  <!---->
-  <h3 class="mb-s">Titulaires</h3>
-  <p class="h6 italic">Optionnel</p>
-  <div class="mb-s">
-    <div>
-      <div>
-        <div class="flex mb-s flex-center">
-          <div class="h4" style="flex: 0 1 15em;">optionNom1</div><label style="flex-basis: auto; user-select: none;"><input type="checkbox" class="mr-xs">Opérateur</label><button title="Supprime l’entreprise" aria-label="Supprime l’entreprise" class="btn py-s px-m rnd-xs"><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
-              <use href="#icon-minus"></use>
-            </svg></button>
+      <!---->
+      <div class="fr-input-group"><label class="fr-label" for="filters_autocomplete_titulaires">
+          <h6>Titulaires</h6>
+        </label>
+        <div class="mb-s">
+          <div id="filters_autocomplete_titulaires_wrapper" class="_typeahead_8eddf1 dsfr">
+            <div style="display: flex; max-height: unset; flex-wrap: wrap; gap: 8px; outline-offset: 2px; outline-width: 2px; outline-color: rgb(10, 118, 246);" class="fr-input _fake-input_8eddf1"><button class="fr-tag fr-tag--sm fr-tag--dismiss" title="optionNom1">optionNom1</button><input id="filters_autocomplete_titulaires" type="text" name="filters_autocomplete_titulaires" class="_typeahead-input_8eddf1" style="outline: none;" placeholder="titulaires" autocomplete="off"></div>
+            <!---->
+          </div>
+          <!---->
         </div>
       </div>
-      <div id="autocomplete_entreprise_wrapper" class="_typeahead_8eddf1 dsfr">
-        <div class="flex"><input id="autocomplete_entreprise" type="text" name="autocomplete_entreprise" class="_typeahead-input_8eddf1 fr-input" placeholder="Sélectionner un titulaire" autocomplete="off"></div>
-        <!---->
-      </div>
-    </div>
-    <!---->
-  </div>
-  <!---->
-  <div>
-    <h3 class="mb-s">Substances</h3>
-    <div class="mb-s">
+      <!---->
       <div>
-        <ul class="list-inline mb-s">
-          <li class="mr-xs mb-xs"><span class="bold cap-first small lh-2"><span class="bg-neutral py-xs px-s rnd-xs color-bg box">argent</span></span></li>
-        </ul>
-      </div>
-      <div class="dsfr">
-        <div class="fr-toggle"><input type="checkbox" class="fr-toggle__input" aria-describedby="toggle-toggle_271-hint-text" id="toggle_271"><label class="fr-toggle__label" for="toggle_271" data-fr-checked-label="Activé" data-fr-unchecked-label="Désactivé"><span class=" fr-ml-4w">Hériter de l’étape précédente</span></label>
-          <p class="fr-hint-text" id="toggle-toggle_271-hint-text">Hérité de : Demande (01-01-2022)</p>
+        <h6>Substances</h6>
+        <div class="mb-s">
+          <div>
+            <p class="fr-tag fr-tag--md fr-mr-1w" title="Argent" aria-label="Argent">Argent</p>
+          </div>
+          <div class="dsfr">
+            <div class="fr-toggle"><input type="checkbox" class="fr-toggle__input" id="toggle_878"><label class="fr-toggle__label" for="toggle_878" data-fr-checked-label="Activé" data-fr-unchecked-label="Désactivé"><span class=" fr-ml-4w">Hériter de l’étape "Demande" du 01-01-2022</span></label>
+              <!---->
+            </div>
+          </div>
         </div>
       </div>
     </div>
diff --git a/packages/ui/src/components/etape/fondamentales-edit.stories_snapshots_AxmDemandeSuper.html b/packages/ui/src/components/etape/fondamentales-edit.stories_snapshots_AxmDemandeSuper.html
new file mode 100644
index 0000000000000000000000000000000000000000..6ae8699bee5c08a2e4e5c94540bc767b817ebee6
--- /dev/null
+++ b/packages/ui/src/components/etape/fondamentales-edit.stories_snapshots_AxmDemandeSuper.html
@@ -0,0 +1,54 @@
+<div class="dsfr">
+  <div class="fr-grid-row">
+    <div class="fr-col-12 fr-col-xl-6">
+      <div class="mb-s">
+        <div style="display: flex;">
+          <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_271">Durée (années) *
+              <!---->
+              <!---->
+            </label><input class="fr-input" name="input_271" id="input_271" type="number">
+            <!---->
+          </div>
+          <div class="fr-input-group fr-ml-2w" style="margin-bottom: 0px;"><label class="fr-label" for="input_670">Durée (mois) *
+              <!---->
+              <!---->
+            </label><input class="fr-input" name="input_670" id="input_670" type="number">
+            <!---->
+          </div>
+        </div>
+        <div class="dsfr">
+          <div class="fr-toggle"><input type="checkbox" class="fr-toggle__input" id="toggle_74"><label class="fr-toggle__label" for="toggle_74" data-fr-checked-label="Activé" data-fr-unchecked-label="Désactivé"><span class=" fr-ml-4w">Hériter de l’étape "Demande" du 01-01-2022</span></label>
+            <!---->
+          </div>
+        </div>
+      </div>
+      <!---->
+      <!---->
+      <div class="fr-input-group"><label class="fr-label" for="filters_autocomplete_titulaires">
+          <h6>Titulaires</h6>
+        </label>
+        <div class="mb-s">
+          <div id="filters_autocomplete_titulaires_wrapper" class="_typeahead_8eddf1 dsfr">
+            <div style="display: flex; max-height: unset; flex-wrap: wrap; gap: 8px; outline-offset: 2px; outline-width: 2px; outline-color: rgb(10, 118, 246);" class="fr-input _fake-input_8eddf1"><button class="fr-tag fr-tag--sm fr-tag--dismiss" title="optionNom1">optionNom1</button><input id="filters_autocomplete_titulaires" type="text" name="filters_autocomplete_titulaires" class="_typeahead-input_8eddf1" style="outline: none;" placeholder="titulaires" autocomplete="off"></div>
+            <!---->
+          </div>
+          <!---->
+        </div>
+      </div>
+      <!---->
+      <div>
+        <h6>Substances</h6>
+        <div class="mb-s">
+          <div>
+            <p class="fr-tag fr-tag--md fr-mr-1w" title="Argent" aria-label="Argent">Argent</p>
+          </div>
+          <div class="dsfr">
+            <div class="fr-toggle"><input type="checkbox" class="fr-toggle__input" id="toggle_878"><label class="fr-toggle__label" for="toggle_878" data-fr-checked-label="Activé" data-fr-unchecked-label="Désactivé"><span class=" fr-ml-4w">Hériter de l’étape "Demande" du 01-01-2022</span></label>
+              <!---->
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/fondamentales-edit.stories_snapshots_PrmDemandeONF.html b/packages/ui/src/components/etape/fondamentales-edit.stories_snapshots_PrmDemandeONF.html
index 199920d814d29dbaac03c4ea3c9ed07c58746c61..ae46838deb989a62195401620377542a0b1b802b 100644
--- a/packages/ui/src/components/etape/fondamentales-edit.stories_snapshots_PrmDemandeONF.html
+++ b/packages/ui/src/components/etape/fondamentales-edit.stories_snapshots_PrmDemandeONF.html
@@ -1,113 +1,78 @@
-<div>
-  <div class="tablet-blobs">
-    <div class="tablet-blob-1-3 tablet-pt-s pb-s">
-      <h5 class="mb-0">Durée (années / mois)</h5>
-      <p class="h6 italic mb-0">Optionnel</p>
-    </div>
-    <div class="mb-s tablet-blob-2-3">
-      <div class="blobs-mini">
-        <div class="blob-mini-1-2"><input placeholder="années" type="text" pattern="([0-9]{1,3}[\s]?)*([.,][0-9]*)?" class="p-s text-right py-s mb-s"></div>
-        <div class="blob-mini-1-2"><input placeholder="mois" type="text" pattern="([0-9]{1,3}[\s]?)*([.,][0-9]*)?" class="p-s text-right p-s"></div>
-      </div>
-      <!---->
-    </div>
-  </div>
-  <div class="tablet-blobs">
-    <div class="tablet-blob-1-3 tablet-pt-s pb-s">
-      <h5 class="mb-0">Date de début</h5>
-      <p class="h6 italic mb-0">Optionnel</p>
-    </div>
-    <div class="mb-s tablet-blob-2-3">
-      <div class="blobs-mini mb-s">
-        <div class="blob-mini-1-3"><input type="number" min="1" max="31" placeholder="jour" class="text-right p-s"></div>
-        <div class="blob-mini-1-3"><select class="mr-s p-s">
-            <option disabled="" hidden="" value="null">mois</option>
-            <option value="1">janvier</option>
-            <option value="2">février</option>
-            <option value="3">mars</option>
-            <option value="4">avril</option>
-            <option value="5">mai</option>
-            <option value="6">juin</option>
-            <option value="7">juillet</option>
-            <option value="8">aout</option>
-            <option value="9">septembre</option>
-            <option value="10">octobre</option>
-            <option value="11">novembre</option>
-            <option value="12">décembre</option>
-          </select></div>
-        <div class="blob-mini-1-3"><input type="number" min="1750" max="2099" placeholder="année" class="text-right p-s"></div>
-      </div>
-      <!---->
-    </div>
-  </div>
-  <div class="tablet-blobs">
-    <div class="tablet-blob-1-3 tablet-pt-s pb-s">
-      <h5 class="mb-0">Date d'échéance</h5>
-      <p class="h6 italic mb-0">Optionnel</p>
-    </div>
-    <div class="mb-s tablet-blob-2-3">
-      <div class="blobs-mini mb-s">
-        <div class="blob-mini-1-3"><input type="number" min="1" max="31" placeholder="jour" class="text-right p-s"></div>
-        <div class="blob-mini-1-3"><select class="mr-s p-s">
-            <option disabled="" hidden="" value="null">mois</option>
-            <option value="1">janvier</option>
-            <option value="2">février</option>
-            <option value="3">mars</option>
-            <option value="4">avril</option>
-            <option value="5">mai</option>
-            <option value="6">juin</option>
-            <option value="7">juillet</option>
-            <option value="8">aout</option>
-            <option value="9">septembre</option>
-            <option value="10">octobre</option>
-            <option value="11">novembre</option>
-            <option value="12">décembre</option>
-          </select></div>
-        <div class="blob-mini-1-3"><input type="number" min="1750" max="2099" placeholder="année" class="text-right p-s"></div>
-      </div>
-      <!---->
-    </div>
-  </div>
-  <h3 class="mb-s">Titulaires</h3>
-  <p class="h6 italic">Optionnel</p>
-  <div class="mb-s">
-    <div>
-      <div>
-        <div class="flex mb-s flex-center">
-          <div class="h4" style="flex: 0 1 15em;">optionNom1</div><label style="flex-basis: auto; user-select: none;"><input type="checkbox" class="mr-xs">Opérateur</label><button title="Supprime l’entreprise" aria-label="Supprime l’entreprise" class="btn py-s px-m rnd-xs"><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
-              <use href="#icon-minus"></use>
-            </svg></button>
+<div class="dsfr">
+  <div class="fr-grid-row">
+    <div class="fr-col-12 fr-col-xl-6">
+      <div class="mb-s">
+        <div style="display: flex;">
+          <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_271">Durée (années)
+              <!---->
+              <!---->
+            </label><input class="fr-input" name="input_271" id="input_271" type="number">
+            <!---->
+          </div>
+          <div class="fr-input-group fr-ml-2w" style="margin-bottom: 0px;"><label class="fr-label" for="input_670">Durée (mois)
+              <!---->
+              <!---->
+            </label><input class="fr-input" name="input_670" id="input_670" type="number">
+            <!---->
+          </div>
+        </div>
+        <div class="dsfr">
+          <div class="fr-toggle"><input type="checkbox" class="fr-toggle__input" id="toggle_74"><label class="fr-toggle__label" for="toggle_74" data-fr-checked-label="Activé" data-fr-unchecked-label="Désactivé"><span class=" fr-ml-4w">Hériter de l’étape "Demande" du 01-01-2022</span></label>
+            <!---->
+          </div>
         </div>
       </div>
-      <div id="autocomplete_entreprise_wrapper" class="_typeahead_8eddf1 dsfr">
-        <div class="flex"><input id="autocomplete_entreprise" type="text" name="autocomplete_entreprise" class="_typeahead-input_8eddf1 fr-input" placeholder="Sélectionner un titulaire" autocomplete="off"></div>
+      <div class="mb-s">
+        <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_878">Date de début
+            <!---->
+            <!---->
+          </label><input class="fr-input" name="input_878" id="input_878" type="date">
+          <!---->
+        </div>
         <!---->
       </div>
-    </div>
-    <!---->
-  </div>
-  <h3 class="mb-s">Amodiataires</h3>
-  <p class="h6 italic">Optionnel</p>
-  <div class="mb-s">
-    <div>
-      <div id="autocomplete_entreprise_wrapper" class="_typeahead_8eddf1 dsfr">
-        <div class="flex"><input id="autocomplete_entreprise" type="text" name="autocomplete_entreprise" class="_typeahead-input_8eddf1 fr-input" placeholder="Sélectionner un amodiataire" autocomplete="off"></div>
+      <div class="mb-s">
+        <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_967">Date d’échéance
+            <!---->
+            <!---->
+          </label><input class="fr-input" name="input_967" id="input_967" type="date">
+          <!---->
+        </div>
         <!---->
       </div>
-    </div>
-    <!---->
-  </div>
-  <div>
-    <h3 class="mb-s">Substances</h3>
-    <div class="mb-s">
-      <div>
-        <ul class="list-inline mb-s">
-          <li class="mr-xs mb-xs"><span class="bold cap-first small lh-2"><span class="bg-neutral py-xs px-s rnd-xs color-bg box">argent</span></span></li>
-        </ul>
+      <div class="fr-input-group"><label class="fr-label" for="filters_autocomplete_titulaires">
+          <h6>Titulaires</h6>
+        </label>
+        <div class="mb-s">
+          <div id="filters_autocomplete_titulaires_wrapper" class="_typeahead_8eddf1 dsfr">
+            <div style="display: flex; max-height: unset; flex-wrap: wrap; gap: 8px; outline-offset: 2px; outline-width: 2px; outline-color: rgb(10, 118, 246);" class="fr-input _fake-input_8eddf1"><button class="fr-tag fr-tag--sm fr-tag--dismiss" title="optionNom1">optionNom1</button><input id="filters_autocomplete_titulaires" type="text" name="filters_autocomplete_titulaires" class="_typeahead-input_8eddf1" style="outline: none;" placeholder="titulaires" autocomplete="off"></div>
+            <!---->
+          </div>
+          <!---->
+        </div>
       </div>
-      <div class="dsfr">
-        <div class="fr-toggle"><input type="checkbox" class="fr-toggle__input" aria-describedby="toggle-toggle_271-hint-text" id="toggle_271"><label class="fr-toggle__label" for="toggle_271" data-fr-checked-label="Activé" data-fr-unchecked-label="Désactivé"><span class=" fr-ml-4w">Hériter de l’étape précédente</span></label>
-          <p class="fr-hint-text" id="toggle-toggle_271-hint-text">Hérité de : Demande (01-01-2022)</p>
+      <div class="fr-input-group"><label class="fr-label" for="filters_autocomplete_amodiataires">
+          <h6>Amodiataires</h6>
+        </label>
+        <div class="mb-s">
+          <div id="filters_autocomplete_amodiataires_wrapper" class="_typeahead_8eddf1 dsfr">
+            <div style="display: flex; max-height: unset; flex-wrap: wrap; gap: 8px; outline-offset: 2px; outline-width: 2px; outline-color: rgb(10, 118, 246);" class="fr-input _fake-input_8eddf1"><input id="filters_autocomplete_amodiataires" type="text" name="filters_autocomplete_amodiataires" class="_typeahead-input_8eddf1" style="outline: none;" placeholder="amodiataires" autocomplete="off"></div>
+            <!---->
+          </div>
+          <!---->
+        </div>
+      </div>
+      <div>
+        <h6>Substances</h6>
+        <div class="mb-s">
+          <div>
+            <p class="fr-tag fr-tag--md fr-mr-1w" title="Argent" aria-label="Argent">Argent</p>
+          </div>
+          <div class="dsfr">
+            <div class="fr-toggle"><input type="checkbox" class="fr-toggle__input" id="toggle_25"><label class="fr-toggle__label" for="toggle_25" data-fr-checked-label="Activé" data-fr-unchecked-label="Désactivé"><span class=" fr-ml-4w">Hériter de l’étape "Demande" du 01-01-2022</span></label>
+              <!---->
+            </div>
+          </div>
         </div>
       </div>
     </div>
diff --git a/packages/ui/src/components/etape/fondamentales-edit.stories_snapshots_PrmDeplacementDePerimetreONF.html b/packages/ui/src/components/etape/fondamentales-edit.stories_snapshots_PrmDeplacementDePerimetreONF.html
index 777310a5a5b937de3f05f3a5404e28bb4f88520f..c015fce487116b475aa085d2c78a25369f001f3f 100644
--- a/packages/ui/src/components/etape/fondamentales-edit.stories_snapshots_PrmDeplacementDePerimetreONF.html
+++ b/packages/ui/src/components/etape/fondamentales-edit.stories_snapshots_PrmDeplacementDePerimetreONF.html
@@ -1,47 +1,42 @@
-<div>
-  <!---->
-  <!---->
-  <!---->
-  <h3 class="mb-s">Titulaires</h3>
-  <p class="h6 italic">Optionnel</p>
-  <div class="mb-s">
-    <div>
-      <div>
-        <div class="flex mb-s flex-center">
-          <div class="h4" style="flex: 0 1 15em;">optionNom1</div><label style="flex-basis: auto; user-select: none;"><input type="checkbox" class="mr-xs">Opérateur</label><button title="Supprime l’entreprise" aria-label="Supprime l’entreprise" class="btn py-s px-m rnd-xs"><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
-              <use href="#icon-minus"></use>
-            </svg></button>
+<div class="dsfr">
+  <div class="fr-grid-row">
+    <div class="fr-col-12 fr-col-xl-6">
+      <!---->
+      <!---->
+      <!---->
+      <div class="fr-input-group"><label class="fr-label" for="filters_autocomplete_titulaires">
+          <h6>Titulaires</h6>
+        </label>
+        <div class="mb-s">
+          <div id="filters_autocomplete_titulaires_wrapper" class="_typeahead_8eddf1 dsfr">
+            <div style="display: flex; max-height: unset; flex-wrap: wrap; gap: 8px; outline-offset: 2px; outline-width: 2px; outline-color: rgb(10, 118, 246);" class="fr-input _fake-input_8eddf1"><button class="fr-tag fr-tag--sm fr-tag--dismiss" title="optionNom1">optionNom1</button><input id="filters_autocomplete_titulaires" type="text" name="filters_autocomplete_titulaires" class="_typeahead-input_8eddf1" style="outline: none;" placeholder="titulaires" autocomplete="off"></div>
+            <!---->
+          </div>
+          <!---->
         </div>
       </div>
-      <div id="autocomplete_entreprise_wrapper" class="_typeahead_8eddf1 dsfr">
-        <div class="flex"><input id="autocomplete_entreprise" type="text" name="autocomplete_entreprise" class="_typeahead-input_8eddf1 fr-input" placeholder="Sélectionner un titulaire" autocomplete="off"></div>
-        <!---->
-      </div>
-    </div>
-    <!---->
-  </div>
-  <h3 class="mb-s">Amodiataires</h3>
-  <p class="h6 italic">Optionnel</p>
-  <div class="mb-s">
-    <div>
-      <div id="autocomplete_entreprise_wrapper" class="_typeahead_8eddf1 dsfr">
-        <div class="flex"><input id="autocomplete_entreprise" type="text" name="autocomplete_entreprise" class="_typeahead-input_8eddf1 fr-input" placeholder="Sélectionner un amodiataire" autocomplete="off"></div>
-        <!---->
+      <div class="fr-input-group"><label class="fr-label" for="filters_autocomplete_amodiataires">
+          <h6>Amodiataires</h6>
+        </label>
+        <div class="mb-s">
+          <div id="filters_autocomplete_amodiataires_wrapper" class="_typeahead_8eddf1 dsfr">
+            <div style="display: flex; max-height: unset; flex-wrap: wrap; gap: 8px; outline-offset: 2px; outline-width: 2px; outline-color: rgb(10, 118, 246);" class="fr-input _fake-input_8eddf1"><input id="filters_autocomplete_amodiataires" type="text" name="filters_autocomplete_amodiataires" class="_typeahead-input_8eddf1" style="outline: none;" placeholder="amodiataires" autocomplete="off"></div>
+            <!---->
+          </div>
+          <!---->
+        </div>
       </div>
-    </div>
-    <!---->
-  </div>
-  <div>
-    <h3 class="mb-s">Substances</h3>
-    <div class="mb-s">
       <div>
-        <ul class="list-inline mb-s">
-          <li class="mr-xs mb-xs"><span class="bold cap-first small lh-2"><span class="bg-neutral py-xs px-s rnd-xs color-bg box">argent</span></span></li>
-        </ul>
-      </div>
-      <div class="dsfr">
-        <div class="fr-toggle"><input type="checkbox" class="fr-toggle__input" aria-describedby="toggle-toggle_271-hint-text" id="toggle_271"><label class="fr-toggle__label" for="toggle_271" data-fr-checked-label="Activé" data-fr-unchecked-label="Désactivé"><span class=" fr-ml-4w">Hériter de l’étape précédente</span></label>
-          <p class="fr-hint-text" id="toggle-toggle_271-hint-text">Hérité de : Demande (01-01-2022)</p>
+        <h6>Substances</h6>
+        <div class="mb-s">
+          <div>
+            <p class="fr-tag fr-tag--md fr-mr-1w" title="Argent" aria-label="Argent">Argent</p>
+          </div>
+          <div class="dsfr">
+            <div class="fr-toggle"><input type="checkbox" class="fr-toggle__input" id="toggle_271"><label class="fr-toggle__label" for="toggle_271" data-fr-checked-label="Activé" data-fr-unchecked-label="Désactivé"><span class=" fr-ml-4w">Hériter de l’étape "Demande" du 01-01-2022</span></label>
+              <!---->
+            </div>
+          </div>
         </div>
       </div>
     </div>
diff --git a/packages/ui/src/components/etape/fondamentales-edit.tsx b/packages/ui/src/components/etape/fondamentales-edit.tsx
index 8a45b0a57b178755069ecf3368221809c7fcd12d..f019e7e3a2a2411bdc56f0039549bdbf6f63c843 100644
--- a/packages/ui/src/components/etape/fondamentales-edit.tsx
+++ b/packages/ui/src/components/etape/fondamentales-edit.tsx
@@ -1,80 +1,106 @@
-import { caminoDefineComponent } from '@/utils/vue-tsx-utils'
-import { dateFormat } from '../../utils/index'
-import { Tag } from '../_ui/tag'
-import { InputDate } from '../_ui/input-date'
-import { InputNumber } from '../_ui/input-number'
+import { caminoDefineComponent, useState } from '@/utils/vue-tsx-utils'
+import { DsfrTag } from '../_ui/tag'
 import { HeritageEdit } from './heritage-edit'
-import { PropDuree } from './prop-duree'
 import { AutocompleteEntreprise } from './autocomplete-entreprise'
 import { CaminoDate } from 'camino-common/src/date'
 import { SubstancesEdit } from './substances-edit'
 import { dureeOptionalCheck as titreEtapesDureeOptionalCheck, canEditAmodiataires, canEditTitulaires, canEditDuree, canEditDates } from 'camino-common/src/permissions/titres-etapes'
 
-import { EtapeEntreprise, EtapeFondamentale } from 'camino-common/src/etape'
+import { EtapeEntreprise, EtapeWithHeritage, HeritageProp } from 'camino-common/src/etape'
 import { DomaineId } from 'camino-common/src/static/domaines'
 import { DemarcheTypeId } from 'camino-common/src/static/demarchesTypes'
 import { getDomaineId, TitreTypeId } from 'camino-common/src/static/titresTypes'
-import { ETAPES_TYPES } from 'camino-common/src/static/etapesTypes'
-import { watch, computed, ref } from 'vue'
-import { Entreprise, EntrepriseId } from 'camino-common/src/entreprise'
+import { watch, computed, ref, DeepReadonly } from 'vue'
+import { Entreprise } from 'camino-common/src/entreprise'
 import { User } from 'camino-common/src/roles'
-import { isNotNullNorUndefined } from 'camino-common/src/typescript-tools'
+import { isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools'
+import { SubstanceLegaleId } from 'camino-common/src/static/substancesLegales'
+import { DsfrInput } from '../_ui/dsfr-input'
 
-export interface Props {
-  etape: EtapeFondamentale
+export type EtapeFondamentaleEdit = Pick<EtapeWithHeritage, 'typeId' | 'dateDebut' | 'dateFin' | 'duree' | 'titulaires' | 'amodiataires' | 'substances' | 'duree' | 'heritageProps'>
+interface Props {
+  etape: DeepReadonly<EtapeFondamentaleEdit>
   demarcheTypeId: DemarcheTypeId
   titreTypeId: TitreTypeId
   user: User
-  entreprises: Entreprise[]
+  entreprises: DeepReadonly<Entreprise[]>
+  completeUpdate: (etape: Props['etape']) => void
 }
-export const FondamentalesEdit = caminoDefineComponent<Props>(['etape', 'demarcheTypeId', 'titreTypeId', 'user', 'entreprises'], (props, context) => {
-  const ans = ref<number>(isNotNullNorUndefined(props.etape.duree) && props.etape.duree > 0 ? Math.floor(props.etape.duree / 12) : 0)
-  const mois = ref<number>(isNotNullNorUndefined(props.etape.duree) && props.etape.duree > 0 ? Math.floor(props.etape.duree % 12) : 0)
 
-  const entreprisesDisabled = computed<EntrepriseId[]>(() => [...props.etape.amodiataires, ...props.etape.titulaires].map(({ id }) => id))
+const dureeToAns = (duree: number | null | undefined) => {
+  return isNotNullNorUndefined(duree) && duree > 0 ? Math.floor(duree / 12) : 0
+}
+const dureeToMois = (duree: number | null | undefined) => {
+  return isNotNullNorUndefined(duree) && duree > 0 ? Math.floor(duree % 12) : 0
+}
+
+export const FondamentalesEdit = caminoDefineComponent<Props>(['etape', 'demarcheTypeId', 'titreTypeId', 'user', 'entreprises', 'completeUpdate'], props => {
+  const [editedEtape, setEditedEtape] = useState(props.etape)
+
+  const ans = ref<number>(dureeToAns(editedEtape.value.duree))
+  const mois = ref<number>(dureeToMois(editedEtape.value.duree))
+  // // TODO 2024-04-03 ceci devrait disparaitre le jour où on retravaille l'héritage props
+  // watch(() => props.etape, () => {
+  //   editedEtape.value = props.etape
+  // })
 
-  const dateDebutChanged = (date: CaminoDate | null) => {
-    props.etape.dateDebut = date
+  const dateDebutChanged = (dateDebut: CaminoDate | null) => {
+    setEditedEtape({ ...editedEtape.value, dateDebut })
   }
 
-  const dateFinChanged = (date: CaminoDate | null) => {
-    props.etape.dateFin = date
+  const dateFinChanged = (dateFin: CaminoDate | null) => {
+    setEditedEtape({ ...editedEtape.value, dateFin })
+  }
+  const substancesChanged = (substances: DeepReadonly<SubstanceLegaleId[]>) => {
+    setEditedEtape({ ...editedEtape.value, substances })
+  }
+  const updateSubstancesHeritage = (substancesHeritage: DeepReadonly<HeritageProp<Pick<EtapeWithHeritage, 'substances' | 'date' | 'typeId'>>>) => {
+    setEditedEtape({ ...editedEtape.value, heritageProps: { ...editedEtape.value.heritageProps, substances: substancesHeritage } })
   }
 
-  const domaineId = computed<DomaineId>(() => getDomaineId(props.titreTypeId))
+  const updateDureeHeritage = (dureeHeritage: DeepReadonly<HeritageProp<Pick<EtapeWithHeritage, 'duree' | 'typeId' | 'date'>>>) => {
+    setEditedEtape({ ...editedEtape.value, heritageProps: { ...editedEtape.value.heritageProps, duree: dureeHeritage } })
+  }
+  const updateDateDebutHeritage = (dateDebutHeritage: DeepReadonly<HeritageProp<Pick<EtapeWithHeritage, 'dateDebut' | 'typeId' | 'date'>>>) => {
+    setEditedEtape({ ...editedEtape.value, heritageProps: { ...editedEtape.value.heritageProps, dateDebut: dateDebutHeritage } })
+  }
+  const updateDateFinHeritage = (dateFinHeritage: DeepReadonly<HeritageProp<Pick<EtapeWithHeritage, 'dateFin' | 'typeId' | 'date'>>>) => {
+    setEditedEtape({ ...editedEtape.value, heritageProps: { ...editedEtape.value.heritageProps, dateFin: dateFinHeritage } })
+  }
+  const updateTitulairesHeritage = (titulairesHeritage: DeepReadonly<HeritageProp<Pick<EtapeWithHeritage, 'titulaires' | 'typeId' | 'date'>>>) => {
+    setEditedEtape({ ...editedEtape.value, heritageProps: { ...editedEtape.value.heritageProps, titulaires: titulairesHeritage } })
+  }
+  const updateAmodiatairesHeritage = (amodiatairesHeritage: DeepReadonly<HeritageProp<Pick<EtapeWithHeritage, 'amodiataires' | 'typeId' | 'date'>>>) => {
+    setEditedEtape({ ...editedEtape.value, heritageProps: { ...editedEtape.value.heritageProps, amodiataires: amodiatairesHeritage } })
+  }
 
   const dureeOptionalCheck = computed<boolean>(() => {
-    return titreEtapesDureeOptionalCheck(props.etape.typeId, props.demarcheTypeId, props.titreTypeId)
+    return titreEtapesDureeOptionalCheck(editedEtape.value.typeId, props.demarcheTypeId, props.titreTypeId)
   })
 
-  const complete = computed<boolean>(() => {
-    return props.etape.typeId !== ETAPES_TYPES.demande || (props.etape.substances?.filter(substanceId => !!substanceId)?.length > 0 && (dureeOptionalCheck.value || !!ans.value || !!mois.value))
-  })
-
-  const completeUpdate = () => {
-    context.emit('complete-update', complete.value)
-  }
-
   watch(
-    () => complete.value,
-    () => completeUpdate(),
-    { immediate: true }
+    () => editedEtape.value,
+    () => {
+      props.completeUpdate(editedEtape.value)
+    }
   )
 
-  const titulairesUpdate = (titulaires: EtapeEntreprise[]) => {
+  const domaineId = computed<DomaineId>(() => getDomaineId(props.titreTypeId))
+
+  const titulairesUpdate = (titulaires: DeepReadonly<EtapeEntreprise[]>) => {
     const newTitulaires = titulaires.map(titulaire => ({
       id: titulaire.id,
       operateur: titulaire.operateur,
     }))
-    props.etape.titulaires.splice(0, props.etape.titulaires.length, ...newTitulaires)
+    setEditedEtape({ ...editedEtape.value, titulaires: newTitulaires })
   }
 
-  const amodiatairesUpdate = (amodiataires: EtapeEntreprise[]) => {
+  const amodiatairesUpdate = (amodiataires: DeepReadonly<EtapeEntreprise[]>) => {
     const newAmodiataires = amodiataires.map(amodiataire => ({
       id: amodiataire.id,
       operateur: amodiataire.operateur,
     }))
-    props.etape.amodiataires.splice(0, props.etape.amodiataires.length, ...newAmodiataires)
+    setEditedEtape({ ...editedEtape.value, amodiataires: newAmodiataires })
   }
 
   const getEntrepriseNom = (etapeEntreprise: EtapeEntreprise): string => {
@@ -88,159 +114,157 @@ export const FondamentalesEdit = caminoDefineComponent<Props>(['etape', 'demarch
   }
 
   const updateDuree = (): void => {
-    props.etape.duree = mois.value + ans.value * 12
+    setEditedEtape({ ...editedEtape.value, duree: mois.value + ans.value * 12 })
   }
 
-  return () => (
-    <div>
-      {canEditDuree(props.titreTypeId, props.demarcheTypeId) ? (
-        <div class="tablet-blobs">
-          <div class="tablet-blob-1-3 tablet-pt-s pb-s">
-            <h5 class="mb-0">Durée (années / mois)</h5>
-            {dureeOptionalCheck.value ? <p class="h6 italic mb-0">Optionnel</p> : null}
-          </div>
+  const updateAnsDuree = (value: number | null) => {
+    ans.value = value ?? 0
+    updateDuree()
+  }
+  const updateMoisDuree = (value: number | null) => {
+    mois.value = value ?? 0
+    updateDuree()
+  }
 
+  return () => (
+    <div class="fr-grid-row">
+      <div class="fr-col-12 fr-col-xl-6">
+        {canEditDuree(props.titreTypeId, props.demarcheTypeId) ? (
           <HeritageEdit
-            prop={props.etape.heritageProps.duree}
-            class="tablet-blob-2-3"
+            updateHeritage={updateDureeHeritage}
+            hasHeritage={isNotNullNorUndefined(editedEtape.value.heritageProps.duree.etape?.duree)}
+            prop={editedEtape.value.heritageProps.duree}
             propId="duree"
             write={() => (
-              <>
-                <div class="blobs-mini">
-                  <div class="blob-mini-1-2">
-                    <InputNumber
-                      initialValue={ans.value}
-                      integer={true}
-                      placeholder="années"
-                      class="py-s mb-s"
-                      numberChanged={value => {
-                        ans.value = value ?? 0
-                        updateDuree()
-                      }}
-                    />
-                  </div>
-                  <div class="blob-mini-1-2">
-                    <InputNumber
-                      initialValue={mois.value}
-                      integer={true}
-                      placeholder="mois"
-                      class="p-s"
-                      numberChanged={value => {
-                        mois.value = value ?? 0
-                        updateDuree()
-                      }}
-                    />
-                  </div>
-                </div>
-              </>
+              <div style={{ display: 'flex' }}>
+                <DsfrInput legend={{ main: `Durée (années)${!dureeOptionalCheck.value ? ' *' : ''}` }} type={{ type: 'number' }} valueChanged={updateAnsDuree} initialValue={ans.value} />
+                <DsfrInput
+                  legend={{ main: `Durée (mois)${!dureeOptionalCheck.value ? ' *' : ''}` }}
+                  type={{ type: 'number' }}
+                  valueChanged={updateMoisDuree}
+                  initialValue={mois.value}
+                  class="fr-ml-2w"
+                />
+              </div>
             )}
             read={heritagePropEtape => (
-              <div class="border p-s mb-s bold">
-                <PropDuree duree={heritagePropEtape?.duree} />
+              <div style={{ display: 'flex' }}>
+                <DsfrInput
+                  legend={{ main: `Durée (années)${!dureeOptionalCheck.value ? ' *' : ''}` }}
+                  type={{ type: 'number' }}
+                  valueChanged={() => {}}
+                  disabled={true}
+                  initialValue={dureeToAns(heritagePropEtape?.duree)}
+                />
+                <DsfrInput
+                  legend={{ main: `Durée (mois)${!dureeOptionalCheck.value ? ' *' : ''}` }}
+                  type={{ type: 'number' }}
+                  valueChanged={() => {}}
+                  initialValue={dureeToMois(heritagePropEtape?.duree)}
+                  disabled={true}
+                  class="fr-ml-2w"
+                />
               </div>
             )}
           />
-        </div>
-      ) : null}
-
-      {canEditDates(props.titreTypeId, props.demarcheTypeId, props.etape.typeId, props.user) ? (
-        <>
-          <div class="tablet-blobs">
-            <div class="tablet-blob-1-3 tablet-pt-s pb-s">
-              <h5 class="mb-0">Date de début</h5>
-              <p class="h6 italic mb-0">Optionnel</p>
-            </div>
-            <HeritageEdit
-              prop={props.etape.heritageProps.dateDebut}
-              class="tablet-blob-2-3"
-              propId="dateDebut"
-              write={() => <InputDate initialValue={props.etape.dateDebut} dateChanged={dateDebutChanged} class="mb-s" />}
-              read={heritagePropEtape => <div class="border p-s mb-s bold">{dateFormat(heritagePropEtape?.dateDebut)}</div>}
-            />
-          </div>
-        </>
-      ) : null}
-
-      {canEditDates(props.titreTypeId, props.demarcheTypeId, props.etape.typeId, props.user) ? (
-        <>
-          <div class="tablet-blobs">
-            <div class="tablet-blob-1-3 tablet-pt-s pb-s">
-              <h5 class="mb-0">Date d'échéance</h5>
-              <p class="h6 italic mb-0">Optionnel</p>
-            </div>
-            <HeritageEdit
-              prop={props.etape.heritageProps.dateFin}
-              class="tablet-blob-2-3"
-              propId="dateFin"
-              write={() => <InputDate initialValue={props.etape.dateFin} dateChanged={dateFinChanged} class="mb-s" />}
-              read={heritagePropEtape => <div class="border p-s mb-s bold">{dateFormat(heritagePropEtape?.dateFin)}</div>}
-            />
-          </div>
-        </>
-      ) : null}
-
-      {canEditTitulaires(props.titreTypeId, props.user) ? (
-        <>
-          <h3 class="mb-s">Titulaires</h3>
-          <p class="h6 italic">Optionnel</p>
+        ) : null}
+
+        {canEditDates(props.titreTypeId, props.demarcheTypeId, editedEtape.value.typeId, props.user) ? (
           <HeritageEdit
-            prop={props.etape.heritageProps.titulaires}
-            propId="titulaires"
-            write={() => (
-              <AutocompleteEntreprise
-                allEntities={props.entreprises}
-                selectedEntities={props.etape.titulaires}
-                nonSelectableEntities={entreprisesDisabled.value}
-                placeholder="Sélectionner un titulaire"
-                onEntreprisesUpdate={titulairesUpdate}
-              />
-            )}
-            read={heritagePropEtape => (
-              <ul class="list-prefix">
-                {heritagePropEtape?.titulaires.map(t => (
-                  <li key={t.id}>
-                    {getEntrepriseNom(t)}
-                    {t.operateur ? <Tag mini={true} color="bg-info" class="ml-xs" text="Opérateur" /> : null}
-                  </li>
-                ))}
-              </ul>
-            )}
+            updateHeritage={updateDateDebutHeritage}
+            prop={editedEtape.value.heritageProps.dateDebut}
+            propId="dateDebut"
+            hasHeritage={isNotNullNorUndefined(editedEtape.value.heritageProps.dateDebut.etape?.dateDebut)}
+            write={() => <DsfrInput type={{ type: 'date' }} legend={{ main: 'Date de début' }} initialValue={props.etape.dateDebut} valueChanged={dateDebutChanged} />}
+            read={heritagePropEtape => <DsfrInput type={{ type: 'date' }} legend={{ main: 'Date de début' }} initialValue={heritagePropEtape?.dateDebut} valueChanged={() => {}} disabled={true} />}
           />
-        </>
-      ) : null}
-
-      {canEditAmodiataires(props.titreTypeId, props.user) ? (
-        <>
-          <h3 class="mb-s">Amodiataires</h3>
-          <p class="h6 italic">Optionnel</p>
+        ) : null}
 
+        {canEditDates(props.titreTypeId, props.demarcheTypeId, editedEtape.value.typeId, props.user) ? (
           <HeritageEdit
-            prop={props.etape.heritageProps.amodiataires}
-            propId="amodiataires"
-            write={() => (
-              <AutocompleteEntreprise
-                allEntities={props.entreprises}
-                selectedEntities={props.etape.amodiataires}
-                nonSelectableEntities={entreprisesDisabled.value}
-                placeholder="Sélectionner un amodiataire"
-                onEntreprisesUpdate={amodiatairesUpdate}
-              />
-            )}
-            read={heritagePropEtape => (
-              <ul class="list-prefix">
-                {heritagePropEtape?.amodiataires.map(t => (
-                  <li key={t.id}>
-                    {getEntrepriseNom(t)}
-                    {t.operateur ? <Tag mini={true} color="bg-info" class="ml-xs" text="Opérateur" /> : null}
-                  </li>
-                ))}
-              </ul>
-            )}
+            updateHeritage={updateDateFinHeritage}
+            prop={editedEtape.value.heritageProps.dateFin}
+            propId="dateFin"
+            hasHeritage={isNotNullNorUndefined(editedEtape.value.heritageProps.dateFin.etape?.dateFin)}
+            write={() => <DsfrInput type={{ type: 'date' }} legend={{ main: 'Date d’échéance' }} initialValue={props.etape.dateFin} valueChanged={dateFinChanged} />}
+            read={heritagePropEtape => <DsfrInput type={{ type: 'date' }} legend={{ main: 'Date d’échéance' }} initialValue={heritagePropEtape?.dateFin} valueChanged={() => {}} disabled={true} />}
           />
-        </>
-      ) : null}
+        ) : null}
+
+        {canEditTitulaires(props.titreTypeId, props.user) ? (
+          <>
+            <div class="fr-input-group">
+              <label class="fr-label" for="filters_autocomplete_titulaires">
+                <h6>Titulaires</h6>
+              </label>
+
+              <HeritageEdit
+                updateHeritage={updateTitulairesHeritage}
+                prop={editedEtape.value.heritageProps.titulaires}
+                propId="titulaires"
+                hasHeritage={isNotNullNorUndefinedNorEmpty(editedEtape.value.heritageProps.titulaires.etape?.titulaires)}
+                write={() => (
+                  <AutocompleteEntreprise
+                    allEntities={props.entreprises}
+                    selectedEntities={editedEtape.value.titulaires}
+                    nonSelectableEntities={editedEtape.value.amodiataires.map(({ id }) => id)}
+                    name="titulaires"
+                    onEntreprisesUpdate={titulairesUpdate}
+                  />
+                )}
+                read={heritagePropEtape => (
+                  <div>
+                    {heritagePropEtape?.titulaires.map(t => (
+                      <DsfrTag key={t.id} class="fr-mr-1w" ariaLabel={getEntrepriseNom(t)} />
+                    ))}
+                  </div>
+                )}
+              />
+            </div>
+          </>
+        ) : null}
+
+        {canEditAmodiataires(props.titreTypeId, props.user) ? (
+          <>
+            <div class="fr-input-group">
+              <label class="fr-label" for="filters_autocomplete_amodiataires">
+                <h6>Amodiataires</h6>
+              </label>
+
+              <HeritageEdit
+                updateHeritage={updateAmodiatairesHeritage}
+                prop={editedEtape.value.heritageProps.amodiataires}
+                hasHeritage={isNotNullNorUndefinedNorEmpty(editedEtape.value.heritageProps.amodiataires.etape?.amodiataires)}
+                propId="amodiataires"
+                write={() => (
+                  <AutocompleteEntreprise
+                    allEntities={props.entreprises}
+                    selectedEntities={editedEtape.value.amodiataires}
+                    nonSelectableEntities={editedEtape.value.titulaires.map(({ id }) => id)}
+                    name="amodiataires"
+                    onEntreprisesUpdate={amodiatairesUpdate}
+                  />
+                )}
+                read={heritagePropEtape => (
+                  <div>
+                    {heritagePropEtape?.amodiataires.map(t => (
+                      <DsfrTag key={t.id} class="fr-mr-1w" ariaLabel={getEntrepriseNom(t)} />
+                    ))}
+                  </div>
+                )}
+              />
+            </div>
+          </>
+        ) : null}
 
-      <SubstancesEdit substances={props.etape.substances} heritageProps={props.etape.heritageProps} domaineId={domaineId.value} />
+        <SubstancesEdit
+          substances={props.etape.substances}
+          heritageSubstances={props.etape.heritageProps.substances}
+          domaineId={domaineId.value}
+          updateHeritage={updateSubstancesHeritage}
+          updateSubstances={substancesChanged}
+        />
+      </div>
     </div>
   )
 })
diff --git a/packages/ui/src/components/etape/heritage-edit.stories.tsx b/packages/ui/src/components/etape/heritage-edit.stories.tsx
index b6ac3519977f9aa911c206c574de36d9c7024d10..aa89052e620cc995360d311dbaa6ffc4ff955557 100644
--- a/packages/ui/src/components/etape/heritage-edit.stories.tsx
+++ b/packages/ui/src/components/etape/heritage-edit.stories.tsx
@@ -12,11 +12,14 @@ const meta: Meta = {
 export default meta
 
 const dateChangedAction = action('dateChanged')
+const updateHeritage = action('updateHeritage')
 
 export const HeritageDisabled: StoryFn = () => (
   <HeritageEdit
+    updateHeritage={updateHeritage}
     prop={{ actif: false, etape: { date: toCaminoDate('2024-01-01'), typeId: 'mfr', dateDebut: toCaminoDate('2022-01-01') } }}
     propId="dateDebut"
+    hasHeritage={true}
     write={() => <InputDate dateChanged={dateChangedAction} class="mb-s" />}
     read={heritagePropEtape => <div class="border p-s mb-s bold">{heritagePropEtape?.dateDebut !== undefined ? dateFormat(heritagePropEtape.dateDebut) : 'Pas de date'}</div>}
   />
@@ -24,13 +27,33 @@ export const HeritageDisabled: StoryFn = () => (
 
 export const HeritageEnabled: StoryFn = () => (
   <HeritageEdit
+    updateHeritage={updateHeritage}
     prop={{ actif: true, etape: { date: toCaminoDate('2024-01-01'), typeId: 'mfr', dateDebut: toCaminoDate('2022-01-01') } }}
     propId="dateDebut"
+    hasHeritage={true}
+    write={() => <InputDate dateChanged={dateChangedAction} class="mb-s" />}
+    read={heritagePropEtape => <div class="border p-s mb-s bold">{heritagePropEtape?.dateDebut !== undefined ? dateFormat(heritagePropEtape.dateDebut) : 'Pas de date'}</div>}
+  />
+)
+
+export const HeritageEnabledWithoutValue: StoryFn = () => (
+  <HeritageEdit
+    updateHeritage={updateHeritage}
+    prop={{ actif: true, etape: { date: toCaminoDate('2024-01-01'), typeId: 'mfr', dateDebut: null } }}
+    propId="dateDebut"
+    hasHeritage={false}
     write={() => <InputDate dateChanged={dateChangedAction} class="mb-s" />}
     read={heritagePropEtape => <div class="border p-s mb-s bold">{heritagePropEtape?.dateDebut !== undefined ? dateFormat(heritagePropEtape.dateDebut) : 'Pas de date'}</div>}
   />
 )
 
 export const NoHeritage: StoryFn = () => (
-  <HeritageEdit prop={{ actif: false }} propId="dateDebut" write={() => <InputDate dateChanged={dateChangedAction} class="mb-s" />} read={() => <div class="border p-s mb-s bold">Pas de date</div>} />
+  <HeritageEdit
+    updateHeritage={updateHeritage}
+    prop={{ actif: false }}
+    propId="dateDebut"
+    hasHeritage={false}
+    write={() => <InputDate dateChanged={dateChangedAction} class="mb-s" />}
+    read={() => <div class="border p-s mb-s bold">Pas de date</div>}
+  />
 )
diff --git a/packages/ui/src/components/etape/heritage-edit.stories_snapshots_HeritageDisabled.html b/packages/ui/src/components/etape/heritage-edit.stories_snapshots_HeritageDisabled.html
index 2cf44690c153197ca829c620427c06f9b2f8c268..6accf52427ebddae401ed49dff6d116c6e60c651 100644
--- a/packages/ui/src/components/etape/heritage-edit.stories_snapshots_HeritageDisabled.html
+++ b/packages/ui/src/components/etape/heritage-edit.stories_snapshots_HeritageDisabled.html
@@ -19,7 +19,7 @@
     <div class="blob-mini-1-3"><input type="number" min="1750" max="2099" placeholder="année" class="text-right p-s"></div>
   </div>
   <div class="dsfr">
-    <div class="fr-toggle"><input type="checkbox" class="fr-toggle__input" id="toggle_271"><label class="fr-toggle__label" for="toggle_271" data-fr-checked-label="Activé" data-fr-unchecked-label="Désactivé"><span class=" fr-ml-4w">Hériter de l’étape précédente</span></label>
+    <div class="fr-toggle"><input type="checkbox" class="fr-toggle__input" id="toggle_271"><label class="fr-toggle__label" for="toggle_271" data-fr-checked-label="Activé" data-fr-unchecked-label="Désactivé"><span class=" fr-ml-4w">Hériter de l’étape "Demande" du 01-01-2024</span></label>
       <!---->
     </div>
   </div>
diff --git a/packages/ui/src/components/etape/heritage-edit.stories_snapshots_HeritageEnabled.html b/packages/ui/src/components/etape/heritage-edit.stories_snapshots_HeritageEnabled.html
index 2b1678a9e11cb6c9f25d192d6a68ef4e4fb35f6a..8a54c5c0b49e85c03e91a0f3fad4b07b5e6a5294 100644
--- a/packages/ui/src/components/etape/heritage-edit.stories_snapshots_HeritageEnabled.html
+++ b/packages/ui/src/components/etape/heritage-edit.stories_snapshots_HeritageEnabled.html
@@ -3,8 +3,8 @@
     <div class="border p-s mb-s bold">01-01-2022</div>
   </div>
   <div class="dsfr">
-    <div class="fr-toggle"><input type="checkbox" class="fr-toggle__input" aria-describedby="toggle-toggle_271-hint-text" id="toggle_271"><label class="fr-toggle__label" for="toggle_271" data-fr-checked-label="Activé" data-fr-unchecked-label="Désactivé"><span class=" fr-ml-4w">Hériter de l’étape précédente</span></label>
-      <p class="fr-hint-text" id="toggle-toggle_271-hint-text">Hérité de : Demande (01-01-2024)</p>
+    <div class="fr-toggle"><input type="checkbox" class="fr-toggle__input" id="toggle_271"><label class="fr-toggle__label" for="toggle_271" data-fr-checked-label="Activé" data-fr-unchecked-label="Désactivé"><span class=" fr-ml-4w">Hériter de l’étape "Demande" du 01-01-2024</span></label>
+      <!---->
     </div>
   </div>
 </div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/heritage-edit.stories_snapshots_HeritageEnabledWithoutValue.html b/packages/ui/src/components/etape/heritage-edit.stories_snapshots_HeritageEnabledWithoutValue.html
new file mode 100644
index 0000000000000000000000000000000000000000..66d81bacab20bac3d57c22feeb75dd86594880b3
--- /dev/null
+++ b/packages/ui/src/components/etape/heritage-edit.stories_snapshots_HeritageEnabledWithoutValue.html
@@ -0,0 +1,10 @@
+<div class="mb-s">
+  <div>
+    <div class="border p-s mb-s">Non renseigné</div>
+  </div>
+  <div class="dsfr">
+    <div class="fr-toggle"><input type="checkbox" class="fr-toggle__input" id="toggle_271"><label class="fr-toggle__label" for="toggle_271" data-fr-checked-label="Activé" data-fr-unchecked-label="Désactivé"><span class=" fr-ml-4w">Hériter de l’étape "Demande" du 01-01-2024</span></label>
+      <!---->
+    </div>
+  </div>
+</div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/heritage-edit.tsx b/packages/ui/src/components/etape/heritage-edit.tsx
index 2e857b22276971218a937dcc73c8fd6c2458164a..7643ab09cc16e67a8281b0689680d485037193a7 100644
--- a/packages/ui/src/components/etape/heritage-edit.tsx
+++ b/packages/ui/src/components/etape/heritage-edit.tsx
@@ -1,43 +1,45 @@
-import { hasValeurCheck } from '@/utils/contenu'
 import { dateFormat } from '@/utils'
-import { HTMLAttributes, computed, defineComponent } from 'vue'
-import { HeritageProp } from 'camino-common/src/etape'
-import { EtapeHeritage } from './heritage-edit.types'
-import { EtapeHeritageProps, mappingHeritagePropsNameEtapePropsName } from 'camino-common/src/heritage'
+import { DeepReadonly, HTMLAttributes, defineComponent } from 'vue'
+import { EtapeWithHeritage, HeritageProp } from 'camino-common/src/etape'
+import { MappingHeritagePropsNameEtapePropsName } from 'camino-common/src/heritage'
 import { isNotNullNorUndefined } from 'camino-common/src/typescript-tools'
 import { DsfrToggle } from '../_ui/dsfr-toggle'
 import { EtapesTypes } from 'camino-common/src/static/etapesTypes'
 import { capitalize } from 'camino-common/src/strings'
 
-type Props<P extends EtapeHeritageProps, T extends EtapeHeritage> = {
-  prop: HeritageProp<T>
+type EtapeHeritageEdit = Pick<EtapeWithHeritage, 'typeId' | 'date'>
+type Props<P extends keyof MappingHeritagePropsNameEtapePropsName, T extends EtapeHeritageEdit> = {
+  prop: DeepReadonly<HeritageProp<T>>
   propId: P
+  hasHeritage: boolean
   write: () => JSX.Element
-  read: (heritagePropEtape: T | undefined) => JSX.Element
+  read: (heritagePropEtape?: DeepReadonly<T>) => JSX.Element
+
   class?: HTMLAttributes['class']
+  updateHeritage: (update: Props<P, T>['prop']) => void
 }
-export const HeritageEdit = defineComponent(<P extends EtapeHeritageProps, T extends EtapeHeritage>(props: Props<P, T>) => {
-  const hasHeritage = computed<boolean>(() => {
-    return mappingHeritagePropsNameEtapePropsName[props.propId].some(field => hasValeurCheck(field, props.prop.etape))
-  })
 
-  const legendHint = computed<string | undefined>(() => {
-    return props.prop.actif ? `Hérité de : ${capitalize(EtapesTypes[props.prop.etape.typeId].nom)} (${dateFormat(props.prop.etape?.date)})` : undefined
-  })
+export const HeritageEdit = defineComponent(<P extends keyof MappingHeritagePropsNameEtapePropsName, T extends EtapeHeritageEdit>(props: Props<P, T>) => {
+  const updateHeritage = () => {
+    const etape = props.prop.etape
+    const newHeritage = !props.prop.actif
+    if (!newHeritage) {
+      props.updateHeritage({ etape, actif: newHeritage })
+    } else if (isNotNullNorUndefined(etape)) {
+      props.updateHeritage({ etape, actif: newHeritage })
+    }
+  }
 
   return () => (
     <div class={['mb-s', props.class]}>
-      {!props.prop.actif ? props.write() : <div>{hasHeritage.value ? props.read(props.prop.etape) : <div class="border p-s mb-s">Non renseigné</div>}</div>}
+      {!props.prop.actif ? props.write() : <div>{props.hasHeritage && isNotNullNorUndefined(props.prop.etape) ? props.read(props.prop.etape) : <div class="border p-s mb-s">Non renseigné</div>}</div>}
 
       {isNotNullNorUndefined(props.prop.etape) ? (
         <div class="dsfr">
           <DsfrToggle
             initialValue={props.prop.actif}
-            valueChanged={() => {
-              props.prop.actif = !props.prop.actif
-            }}
-            legendLabel="Hériter de l’étape précédente"
-            legendHint={legendHint.value}
+            valueChanged={updateHeritage}
+            legendLabel={`Hériter de l’étape "${capitalize(EtapesTypes[props.prop.etape.typeId].nom)}" du ${dateFormat(props.prop.etape.date)}`}
           />
         </div>
       ) : null}
@@ -46,4 +48,4 @@ export const HeritageEdit = defineComponent(<P extends EtapeHeritageProps, T ext
 })
 
 // @ts-ignore waiting for https://github.com/vuejs/core/issues/7833
-HeritageEdit.props = ['prop', 'propId', 'write', 'read', 'display', 'class']
+HeritageEdit.props = ['prop', 'propId', 'write', 'read', 'display', 'class', 'updateHeritage', 'hasHeritage']
diff --git a/packages/ui/src/components/etape/heritage-edit.types.ts b/packages/ui/src/components/etape/heritage-edit.types.ts
deleted file mode 100644
index 01c78a12536be192fc934911317cfb1d3ef11ec3..0000000000000000000000000000000000000000
--- a/packages/ui/src/components/etape/heritage-edit.types.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-import { CaminoDate } from 'camino-common/src/date'
-import { EtapeHeritageProps } from 'camino-common/src/heritage'
-import { EtapeTypeId } from 'camino-common/src/static/etapesTypes'
-
-// TODO 2023-03-15 ça ne marche pas tel quel en tsx, à revoir plus tard, cette modification est au milieu de l'update des dépendances, donc j'ai laissé comme ça
-// TODO 2022-11-16 ça devrait être cette définition, cf heritage-edit
-// export type EtapeHeritage<
-//   T extends EtapeHeritageProps
-// > = {
-//   type: { nom: string }
-//   date: CaminoDate
-// } & Record<T, unknown>
-
-export type EtapeHeritage = {
-  typeId: EtapeTypeId
-  date: CaminoDate
-} & { [k in EtapeHeritageProps]?: unknown }
diff --git a/packages/ui/src/components/etape/perimetre-edit.stories.tsx b/packages/ui/src/components/etape/perimetre-edit.stories.tsx
index 9e35f19aee45fd18678af62ba94928c97817721f..c8de15a5e6676510af14b05388d0948778a66f03 100644
--- a/packages/ui/src/components/etape/perimetre-edit.stories.tsx
+++ b/packages/ui/src/components/etape/perimetre-edit.stories.tsx
@@ -21,10 +21,10 @@ export default meta
 const geojsonImportAction = action('geojsonImport')
 const uploadTempDocumentAction = action('uploadTempDocumentAction')
 const getGeojsonByGeoSystemeIdAction = action('getGeojsonByGeoSystemeId')
-const completeUpdateAction = action('completeUpdate')
 const onEtapeChangeAction = action('onEtapeChange')
 const onPointsChangeAction = action('onPointsChange')
 const onForagesChangeAction = action('onForagesChange')
+const onHeritageChangeAction = action('onHeritageChange')
 
 const perimetre: FeatureMultiPolygon = {
   type: 'Feature',
@@ -73,10 +73,6 @@ const apiClient: Pick<ApiClient, 'uploadTempDocument' | 'geojsonImport' | 'getGe
   },
 }
 
-const completeUpdate = (value: boolean) => {
-  completeUpdateAction(value)
-}
-
 const onEtapeChange = (geojsonInformations: GeojsonInformations) => {
   onEtapeChangeAction(geojsonInformations)
 }
@@ -86,6 +82,9 @@ const onPointsChange = (geojson4326Points: FeatureCollectionPoints) => {
 const onForagesChange = (geojson4326Forages: FeatureCollectionForages) => {
   onForagesChangeAction(geojson4326Forages)
 }
+const onHeritageChange = (heritage: Props['etape']['heritageProps']['perimetre']) => {
+  onHeritageChangeAction(heritage)
+}
 const etapeNoHeritage: Props['etape'] = {
   typeId: 'mfr',
   heritageProps: { perimetre: { actif: false } },
@@ -107,21 +106,36 @@ export const EmptyNoHeritage: StoryFn = () => (
     etape={etapeNoHeritage}
     titreTypeId="arm"
     titreSlug={titreSlug}
-    completeUpdate={completeUpdate}
     onEtapeChange={onEtapeChange}
     onPointsChange={onPointsChange}
     onForagesChange={onForagesChange}
+    onHeritageChange={onHeritageChange}
   />
 )
 const etapeEmptyHeritage: Props['etape'] = {
   ...etapeNoHeritage,
   typeId: 'dpu',
-  heritageProps: { perimetre: { actif: true, etape: { date: toCaminoDate('2023-01-01'), typeId: EtapesTypes.mfr.id, geojson4326Perimetre: null, geojson4326Points: null, surface: null } } },
+  heritageProps: {
+    perimetre: {
+      actif: true,
+      etape: {
+        date: toCaminoDate('2023-01-01'),
+        typeId: EtapesTypes.mfr.id,
+        geojson4326Perimetre: null,
+        geojson4326Points: null,
+        geojsonOriginePerimetre: null,
+        geojsonOriginePoints: null,
+        geojsonOrigineGeoSystemeId: null,
+        geojson4326Forages: null,
+        geojsonOrigineForages: null,
+        surface: null,
+      },
+    },
+  },
 }
 export const EmptyHeritage: StoryFn = () => (
   <PerimetreEdit
     initTab="points"
-    completeUpdate={completeUpdate}
     onEtapeChange={onEtapeChange}
     apiClient={apiClient}
     etape={etapeEmptyHeritage}
@@ -129,6 +143,7 @@ export const EmptyHeritage: StoryFn = () => (
     titreSlug={titreSlug}
     onPointsChange={onPointsChange}
     onForagesChange={onForagesChange}
+    onHeritageChange={onHeritageChange}
   />
 )
 
@@ -146,6 +161,8 @@ const etapeHeritage: Props['etape'] = {
         geojsonOriginePerimetre: perimetre,
         geojsonOriginePoints: null,
         geojsonOrigineGeoSystemeId: '4326',
+        geojson4326Forages: null,
+        geojsonOrigineForages: null,
       },
     },
   },
@@ -153,7 +170,6 @@ const etapeHeritage: Props['etape'] = {
 export const Heritage: StoryFn = () => (
   <PerimetreEdit
     initTab="points"
-    completeUpdate={completeUpdate}
     onEtapeChange={onEtapeChange}
     apiClient={apiClient}
     etape={etapeHeritage}
@@ -161,6 +177,7 @@ export const Heritage: StoryFn = () => (
     titreSlug={titreSlug}
     onPointsChange={onPointsChange}
     onForagesChange={onForagesChange}
+    onHeritageChange={onHeritageChange}
   />
 )
 
@@ -176,7 +193,6 @@ const etape: Props['etape'] = {
 export const FilledNoHeritage: StoryFn = () => (
   <PerimetreEdit
     initTab="points"
-    completeUpdate={completeUpdate}
     onEtapeChange={onEtapeChange}
     apiClient={apiClient}
     etape={etape}
@@ -184,6 +200,7 @@ export const FilledNoHeritage: StoryFn = () => (
     titreSlug={titreSlug}
     onPointsChange={onPointsChange}
     onForagesChange={onForagesChange}
+    onHeritageChange={onHeritageChange}
   />
 )
 
@@ -199,7 +216,6 @@ const etapeLegacy: Props['etape'] = {
 export const LegacyGeoSysteme: StoryFn = () => (
   <PerimetreEdit
     initTab="points"
-    completeUpdate={completeUpdate}
     onEtapeChange={onEtapeChange}
     apiClient={apiClient}
     etape={etapeLegacy}
@@ -207,6 +223,7 @@ export const LegacyGeoSysteme: StoryFn = () => (
     titreSlug={titreSlug}
     onPointsChange={onPointsChange}
     onForagesChange={onForagesChange}
+    onHeritageChange={onHeritageChange}
   />
 )
 
@@ -303,7 +320,6 @@ const etapeWithForages: Props['etape'] = {
 export const WithForages: StoryFn = () => (
   <PerimetreEdit
     initTab="points"
-    completeUpdate={completeUpdate}
     onEtapeChange={onEtapeChange}
     apiClient={apiClient}
     etape={etapeWithForages}
@@ -311,5 +327,6 @@ export const WithForages: StoryFn = () => (
     titreSlug={titreSlug}
     onPointsChange={onPointsChange}
     onForagesChange={onForagesChange}
+    onHeritageChange={onHeritageChange}
   />
 )
diff --git a/packages/ui/src/components/etape/perimetre-edit.stories_snapshots_EmptyHeritage.html b/packages/ui/src/components/etape/perimetre-edit.stories_snapshots_EmptyHeritage.html
index d34aa75194f2c8f7fa25a2983e50c74f0699a55d..0b0f83859c423c06283a75cb3ab2819fb28efcb8 100644
--- a/packages/ui/src/components/etape/perimetre-edit.stories_snapshots_EmptyHeritage.html
+++ b/packages/ui/src/components/etape/perimetre-edit.stories_snapshots_EmptyHeritage.html
@@ -1,12 +1,12 @@
 <div class="dsfr">
-  <div class="dsfr">
+  <div>
     <div class="mb-s">
       <div>
         <div class="border p-s mb-s">Non renseigné</div>
       </div>
       <div class="dsfr">
-        <div class="fr-toggle"><input type="checkbox" class="fr-toggle__input" aria-describedby="toggle-toggle_271-hint-text" id="toggle_271"><label class="fr-toggle__label" for="toggle_271" data-fr-checked-label="Activé" data-fr-unchecked-label="Désactivé"><span class=" fr-ml-4w">Hériter de l’étape précédente</span></label>
-          <p class="fr-hint-text" id="toggle-toggle_271-hint-text">Hérité de : Demande (01-01-2023)</p>
+        <div class="fr-toggle"><input type="checkbox" class="fr-toggle__input" id="toggle_271"><label class="fr-toggle__label" for="toggle_271" data-fr-checked-label="Activé" data-fr-unchecked-label="Désactivé"><span class=" fr-ml-4w">Hériter de l’étape "Demande" du 01-01-2023</span></label>
+          <!---->
         </div>
       </div>
     </div>
diff --git a/packages/ui/src/components/etape/perimetre-edit.stories_snapshots_EmptyNoHeritage.html b/packages/ui/src/components/etape/perimetre-edit.stories_snapshots_EmptyNoHeritage.html
index eadec65cca38d65cf7f61de6fe5de17c87e84e69..865a98048c812d69f0190179a52512d9c50feabb 100644
--- a/packages/ui/src/components/etape/perimetre-edit.stories_snapshots_EmptyNoHeritage.html
+++ b/packages/ui/src/components/etape/perimetre-edit.stories_snapshots_EmptyNoHeritage.html
@@ -1,5 +1,5 @@
 <div class="dsfr">
-  <div class="dsfr">
+  <div>
     <div class="mb-s">
       <div><button class="fr-btn fr-btn--primary fr-btn--md" title="Importer un périmètre" aria-label="Importer un périmètre" type="button">Importer un périmètre</button>
         <!---->
diff --git a/packages/ui/src/components/etape/perimetre-edit.stories_snapshots_FilledNoHeritage.html b/packages/ui/src/components/etape/perimetre-edit.stories_snapshots_FilledNoHeritage.html
index e5c7158346dacfa97f57b9bd0ec0046a38934bcc..0ae5a3c72fc07d3597bddb1e6c59675f8a4f27c1 100644
--- a/packages/ui/src/components/etape/perimetre-edit.stories_snapshots_FilledNoHeritage.html
+++ b/packages/ui/src/components/etape/perimetre-edit.stories_snapshots_FilledNoHeritage.html
@@ -1,5 +1,5 @@
 <div class="dsfr">
-  <div class="dsfr">
+  <div>
     <div class="mb-s">
       <div><button class="fr-btn fr-btn--primary fr-btn--md" title="Importer un périmètre" aria-label="Importer un périmètre" type="button">Importer un périmètre</button><button class="fr-btn fr-btn--secondary fr-btn--md fr-ml-2w" title="Éditer les points" aria-label="Éditer les points" type="button">Éditer les points</button>
         <!---->
diff --git a/packages/ui/src/components/etape/perimetre-edit.stories_snapshots_Heritage.html b/packages/ui/src/components/etape/perimetre-edit.stories_snapshots_Heritage.html
index ed2b8fcfc617da9fdf81b510f3c2a5d7e9a3beb9..6197920a1e247e85ddae4b9c506761116febb186 100644
--- a/packages/ui/src/components/etape/perimetre-edit.stories_snapshots_Heritage.html
+++ b/packages/ui/src/components/etape/perimetre-edit.stories_snapshots_Heritage.html
@@ -1,5 +1,5 @@
 <div class="dsfr">
-  <div class="dsfr">
+  <div>
     <div class="mb-s">
       <div>
         <div>
@@ -84,8 +84,8 @@
         </div>
       </div>
       <div class="dsfr">
-        <div class="fr-toggle"><input type="checkbox" class="fr-toggle__input" aria-describedby="toggle-toggle_74-hint-text" id="toggle_74"><label class="fr-toggle__label" for="toggle_74" data-fr-checked-label="Activé" data-fr-unchecked-label="Désactivé"><span class=" fr-ml-4w">Hériter de l’étape précédente</span></label>
-          <p class="fr-hint-text" id="toggle-toggle_74-hint-text">Hérité de : Demande (01-01-2023)</p>
+        <div class="fr-toggle"><input type="checkbox" class="fr-toggle__input" id="toggle_74"><label class="fr-toggle__label" for="toggle_74" data-fr-checked-label="Activé" data-fr-unchecked-label="Désactivé"><span class=" fr-ml-4w">Hériter de l’étape "Demande" du 01-01-2023</span></label>
+          <!---->
         </div>
       </div>
     </div>
diff --git a/packages/ui/src/components/etape/perimetre-edit.stories_snapshots_LegacyGeoSysteme.html b/packages/ui/src/components/etape/perimetre-edit.stories_snapshots_LegacyGeoSysteme.html
index e5c7158346dacfa97f57b9bd0ec0046a38934bcc..0ae5a3c72fc07d3597bddb1e6c59675f8a4f27c1 100644
--- a/packages/ui/src/components/etape/perimetre-edit.stories_snapshots_LegacyGeoSysteme.html
+++ b/packages/ui/src/components/etape/perimetre-edit.stories_snapshots_LegacyGeoSysteme.html
@@ -1,5 +1,5 @@
 <div class="dsfr">
-  <div class="dsfr">
+  <div>
     <div class="mb-s">
       <div><button class="fr-btn fr-btn--primary fr-btn--md" title="Importer un périmètre" aria-label="Importer un périmètre" type="button">Importer un périmètre</button><button class="fr-btn fr-btn--secondary fr-btn--md fr-ml-2w" title="Éditer les points" aria-label="Éditer les points" type="button">Éditer les points</button>
         <!---->
diff --git a/packages/ui/src/components/etape/perimetre-edit.stories_snapshots_WithForages.html b/packages/ui/src/components/etape/perimetre-edit.stories_snapshots_WithForages.html
index d5f739c1e9b1d8e98621f07f12acb7d13d92c638..a1337a7260354ec6c3f39a33d8fe3e56167c9ac3 100644
--- a/packages/ui/src/components/etape/perimetre-edit.stories_snapshots_WithForages.html
+++ b/packages/ui/src/components/etape/perimetre-edit.stories_snapshots_WithForages.html
@@ -1,5 +1,5 @@
 <div class="dsfr">
-  <div class="dsfr">
+  <div>
     <div class="mb-s">
       <div><button class="fr-btn fr-btn--primary fr-btn--md" title="Importer un périmètre" aria-label="Importer un périmètre" type="button">Importer un périmètre</button><button class="fr-btn fr-btn--secondary fr-btn--md fr-ml-2w" title="Éditer les points" aria-label="Éditer les points" type="button">Éditer les points</button><button class="fr-btn fr-btn--secondary fr-btn--md fr-ml-2w" title="Éditer les forages" aria-label="Éditer les forages" type="button">Éditer les forages</button>
         <!---->
diff --git a/packages/ui/src/components/etape/perimetre-edit.tsx b/packages/ui/src/components/etape/perimetre-edit.tsx
index a54161d768540bb6aa2c0d5cc7ebb9d8db909967..c6bfb742ecba7f4627daca3e3a245e17e7622486 100644
--- a/packages/ui/src/components/etape/perimetre-edit.tsx
+++ b/packages/ui/src/components/etape/perimetre-edit.tsx
@@ -1,6 +1,6 @@
 import { HeritageEdit } from './heritage-edit'
 import { PerimetreImportPopup } from './perimetre-import-popup'
-import { FunctionalComponent, HTMLAttributes, computed, defineComponent, onMounted, ref, watch } from 'vue'
+import { DeepReadonly, FunctionalComponent, HTMLAttributes, defineComponent, ref } from 'vue'
 import { DsfrButton } from '../_ui/dsfr-button'
 import { ApiClient } from '@/api/api-client'
 import { EtapeTypeId } from 'camino-common/src/static/etapesTypes'
@@ -10,7 +10,7 @@ import { DsfrPerimetre } from '../_common/dsfr-perimetre'
 import { TitreSlug } from 'camino-common/src/validators/titres'
 import { Alert } from '../_ui/alert'
 import { KM2 } from 'camino-common/src/number'
-import { EtapeWithHeritage, EtapeFondamentale } from 'camino-common/src/etape'
+import { EtapePropsFromHeritagePropName, HeritageProp, EtapeWithHeritage } from 'camino-common/src/etape'
 import { isNotNullNorUndefined } from 'camino-common/src/typescript-tools'
 import { PointsImportPopup } from './points-import-popup'
 import { GeoSystemeId } from 'camino-common/src/static/geoSystemes'
@@ -19,39 +19,24 @@ import { canHaveForages } from 'camino-common/src/permissions/titres'
 
 export interface Props {
   apiClient: Pick<ApiClient, 'uploadTempDocument' | 'geojsonImport' | 'getGeojsonByGeoSystemeId' | 'geojsonPointsImport' | 'geojsonForagesImport'>
-  etape: {
+  etape: DeepReadonly<{
     typeId: EtapeTypeId
     heritageProps: {
-      perimetre: EtapeWithHeritage<
-        'perimetre',
-        Pick<
-          EtapeFondamentale,
-          | 'geojson4326Perimetre'
-          | 'surface'
-          | 'geojson4326Points'
-          | 'typeId'
-          | 'date'
-          | 'geojsonOriginePerimetre'
-          | 'geojsonOriginePoints'
-          | 'geojsonOrigineGeoSystemeId'
-          | 'geojsonOrigineForages'
-          | 'geojson4326Forages'
-        >
-      >['heritageProps']['perimetre']
+      perimetre: HeritageProp<Pick<EtapeWithHeritage, 'typeId' | 'date' | EtapePropsFromHeritagePropName<'perimetre'>>>
     }
-    geojson4326Perimetre: FeatureMultiPolygon | null
-    geojson4326Points: FeatureCollectionPoints | null
+    geojson4326Perimetre: FeatureMultiPolygon | null | undefined
+    geojson4326Points: FeatureCollectionPoints | null | undefined
     geojsonOriginePerimetre: FeatureMultiPolygon | null | undefined
-    geojsonOriginePoints: FeatureCollectionPoints | null
-    geojson4326Forages: FeatureCollectionForages | null
-    geojsonOrigineForages: FeatureCollectionForages | null
-    geojsonOrigineGeoSystemeId: GeoSystemeId | null
-    surface: KM2 | null
-  }
+    geojsonOriginePoints: FeatureCollectionPoints | null | undefined
+    geojson4326Forages: FeatureCollectionForages | null | undefined
+    geojsonOrigineForages: FeatureCollectionForages | null | undefined
+    geojsonOrigineGeoSystemeId: GeoSystemeId | null | undefined
+    surface: KM2 | null | undefined
+  }>
   titreTypeId: TitreTypeId
   titreSlug: TitreSlug
-  completeUpdate: (complete: boolean) => void
   onEtapeChange: (geojsonInformations: GeojsonInformations) => void
+  onHeritageChange: (heritage: Props['etape']['heritageProps']['perimetre']) => void
   onPointsChange: (geojson4326Points: FeatureCollectionPoints, geojsonOriginePoints: FeatureCollectionPoints) => void
   onForagesChange: (geojson4326Forages: FeatureCollectionForages, geojsonOrigineForages: FeatureCollectionForages) => void
   initTab?: 'points' | 'carte'
@@ -59,15 +44,7 @@ export interface Props {
 
 type DisplayPerimetreProps = {
   apiClient: Pick<ApiClient, 'getGeojsonByGeoSystemeId'>
-  etape: {
-    geojson4326Perimetre: FeatureMultiPolygon | null | undefined
-    geojson4326Points: FeatureCollectionPoints | null
-    geojsonOriginePerimetre: FeatureMultiPolygon | null | undefined
-    geojsonOriginePoints: FeatureCollectionPoints | null
-    geojson4326Forages: FeatureCollectionForages | null
-    geojsonOrigineForages: FeatureCollectionForages | null
-    geojsonOrigineGeoSystemeId: GeoSystemeId | null
-  }
+  etape: Props['etape']
   surface: KM2 | null
   titreSlug: TitreSlug
   titreTypeId: TitreTypeId
@@ -83,13 +60,13 @@ const DisplayPerimetre: FunctionalComponent<DisplayPerimetreProps> = props => {
           calculateNeighbours={false}
           apiClient={props.apiClient}
           perimetre={{
-            geojson4326_points: props.etape.geojson4326Points,
+            geojson4326_points: props.etape.geojson4326Points ?? null,
             geojson4326_perimetre: props.etape.geojson4326Perimetre,
             geojson_origine_perimetre: props.etape.geojsonOriginePerimetre,
-            geojson_origine_points: props.etape.geojsonOriginePoints,
+            geojson_origine_points: props.etape.geojsonOriginePoints ?? null,
             geojson_origine_geo_systeme_id: props.etape.geojsonOrigineGeoSystemeId,
-            geojson4326_forages: props.etape.geojson4326Forages,
-            geojson_origine_forages: props.etape.geojsonOrigineForages,
+            geojson4326_forages: props.etape.geojson4326Forages ?? null,
+            geojson_origine_forages: props.etape.geojsonOrigineForages ?? null,
           }}
           titreSlug={props.titreSlug}
           titreTypeId={props.titreTypeId}
@@ -110,20 +87,10 @@ export const PerimetreEdit = defineComponent<Props>(props => {
   const importForagesPopup = ref<boolean>(false)
   const importError = ref<boolean>(false)
 
-  const complete = computed(() => {
-    return props.etape.typeId !== 'mfr' || props.etape.geojson4326Perimetre !== null
-  })
-
-  const completeUpdate = () => {
-    props.completeUpdate(complete.value)
+  const updateHeritage = (heritage: Props['etape']['heritageProps']['perimetre']) => {
+    props.onHeritageChange(heritage)
   }
 
-  watch(complete, () => completeUpdate())
-
-  onMounted(() => {
-    completeUpdate()
-  })
-
   const openPerimetrePopup = () => {
     importPerimetrePopup.value = true
   }
@@ -146,7 +113,7 @@ export const PerimetreEdit = defineComponent<Props>(props => {
     importForagesPopup.value = false
   }
 
-  const surface = ref<KM2 | null>(props.etape.surface)
+  const surface = ref<KM2 | null>(props.etape.surface ?? null)
 
   const result = (value: GeojsonInformations | Error) => {
     if ('geojson4326_perimetre' in value) {
@@ -180,9 +147,11 @@ export const PerimetreEdit = defineComponent<Props>(props => {
   }
 
   return () => (
-    <div class="dsfr">
+    <div>
       <HeritageEdit
         prop={props.etape.heritageProps.perimetre}
+        updateHeritage={updateHeritage}
+        hasHeritage={isNotNullNorUndefined(props.etape.heritageProps.perimetre.etape?.geojson4326Perimetre)}
         propId="perimetre"
         write={() => (
           <div>
@@ -242,4 +211,4 @@ export const PerimetreEdit = defineComponent<Props>(props => {
 })
 
 // @ts-ignore waiting for https://github.com/vuejs/core/issues/7833
-PerimetreEdit.props = ['etape', 'apiClient', 'titreTypeId', 'titreSlug', 'completeUpdate', 'onEtapeChange', 'initTab', 'onPointsChange', 'onForagesChange']
+PerimetreEdit.props = ['etape', 'apiClient', 'titreTypeId', 'titreSlug', 'onEtapeChange', 'initTab', 'onPointsChange', 'onForagesChange', 'onHeritageChange']
diff --git a/packages/ui/src/components/etape/pure-form-save-btn.stories.ts b/packages/ui/src/components/etape/pure-form-save-btn.stories.ts
deleted file mode 100644
index 566aace869d7ec963592e7712cc5e93fb7a63043..0000000000000000000000000000000000000000
--- a/packages/ui/src/components/etape/pure-form-save-btn.stories.ts
+++ /dev/null
@@ -1,67 +0,0 @@
-import PureFormSaveBtn from './pure-form-save-btn.vue'
-import { Meta, StoryFn } from '@storybook/vue3'
-import { action } from '@storybook/addon-actions'
-
-const meta: Meta = {
-  title: 'Components/Etape/FormSaveBtn',
-  component: PureFormSaveBtn,
-  argTypes: {},
-}
-export default meta
-
-type Props = {
-  alertes?: { message: string; url: string }[]
-  canSave: boolean
-  canDepose: boolean
-  showDepose: boolean
-}
-const Template: StoryFn<Props> = (args: Props) => ({
-  components: { PureFormSaveBtn },
-  setup() {
-    return { args }
-  },
-  template: '<PureFormSaveBtn v-bind="args" @save="onSave" @depose="onDepose" />',
-  methods: {
-    onSave: action('save'),
-    onDepose: action('depose'),
-  },
-})
-
-export const DemandeEnConstructionIncomplete = Template.bind({})
-DemandeEnConstructionIncomplete.args = {
-  canSave: true,
-  showDepose: true,
-  canDepose: false,
-  alertes: [{ message: 'alerte', url: 'google.com' }],
-}
-
-export const DemandeEnConstructionComplete = Template.bind({})
-DemandeEnConstructionComplete.args = {
-  canSave: true,
-  showDepose: true,
-  canDepose: true,
-  alertes: [{ message: 'alerte', url: 'google.com' }],
-}
-
-export const CompletudeDeLaDemandeImcomplete = Template.bind({})
-CompletudeDeLaDemandeImcomplete.args = {
-  canSave: false,
-  showDepose: false,
-  canDepose: true,
-  alertes: [{ message: 'alerte', url: 'google.com' }],
-}
-
-export const CompletudeDeLaDemandeComplete = Template.bind({})
-CompletudeDeLaDemandeComplete.args = {
-  canSave: true,
-  showDepose: false,
-  canDepose: true,
-  alertes: [{ message: 'alerte', url: 'google.com' }],
-}
-
-export const SansMessage = Template.bind({})
-SansMessage.args = {
-  canSave: true,
-  showDepose: true,
-  canDepose: true,
-}
diff --git a/packages/ui/src/components/etape/pure-form-save-btn.stories.tsx b/packages/ui/src/components/etape/pure-form-save-btn.stories.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..a48b82c059ff09a3030310eb8606ad23eb22af0b
--- /dev/null
+++ b/packages/ui/src/components/etape/pure-form-save-btn.stories.tsx
@@ -0,0 +1,66 @@
+import { PureFormSaveBtn } from './pure-form-save-btn'
+import { Meta, StoryFn } from '@storybook/vue3'
+import { action } from '@storybook/addon-actions'
+
+const meta: Meta = {
+  title: 'Components/Etape/FormSaveBtn',
+  // @ts-ignore
+  component: PureFormSaveBtn,
+  decorators: [() => ({ template: '<div class="dsfr"><story/></div>' })],
+}
+export default meta
+
+const onSaveAction = action('onSave')
+const onDeposeAction = action('onDepose')
+
+const onSave = () => {
+  return new Promise<void>(resolve =>
+    setTimeout(() => {
+      onSaveAction()
+      resolve(undefined)
+    }, 1000)
+  )
+}
+const onDepose = () => {
+  return new Promise<void>(resolve =>
+    setTimeout(() => {
+      onDeposeAction()
+      resolve(undefined)
+    }, 1000)
+  )
+}
+export const DemandeEnConstructionIncomplete: StoryFn = () => (
+  <PureFormSaveBtn
+    canSave={true}
+    showDepose={true}
+    canDepose={false}
+    alertes={[
+      { message: 'Superposition', url: '' },
+      { message: 'alerte', url: 'google.com' },
+    ]}
+    save={onSave}
+    depose={onDepose}
+  />
+)
+
+export const DemandeEnConstructionComplete: StoryFn = () => (
+  <PureFormSaveBtn canSave={true} showDepose={true} canDepose={true} alertes={[{ message: 'alerte', url: 'google.com' }]} save={onSave} depose={onDepose} />
+)
+
+export const CompletudeDeLaDemandeImcomplete: StoryFn = () => (
+  <PureFormSaveBtn canSave={false} showDepose={false} canDepose={true} alertes={[{ message: 'alerte', url: 'google.com' }]} save={onSave} depose={onDepose} />
+)
+
+export const CompletudeDeLaDemandeComplete: StoryFn = () => (
+  <PureFormSaveBtn canSave={true} showDepose={false} canDepose={true} alertes={[{ message: 'alerte', url: 'google.com' }]} save={onSave} depose={onDepose} />
+)
+
+export const SansMessage: StoryFn = () => <PureFormSaveBtn alertes={[]} canSave={true} showDepose={true} canDepose={true} save={onSave} depose={onDepose} />
+
+export const WithError: StoryFn = () => (
+  <PureFormSaveBtn alertes={[]} canSave={true} showDepose={true} canDepose={true} save={onSave} depose={onDepose} initialContext={{ status: 'ERROR', message: 'Une erreur sauvage apparait' }} />
+)
+
+export const EnregistrementEnCours: StoryFn = () => (
+  <PureFormSaveBtn alertes={[]} canSave={true} showDepose={true} canDepose={true} save={onSave} depose={onDepose} initialContext={{ status: 'LOADING' }} />
+)
diff --git a/packages/ui/src/components/etape/pure-form-save-btn.stories_snapshots_CompletudeDeLaDemandeComplete.html b/packages/ui/src/components/etape/pure-form-save-btn.stories_snapshots_CompletudeDeLaDemandeComplete.html
index 848c72dd325fbfc7a736464ae166ef7855e13cc8..8ad80063bf9108352a398208b32921def3e2eee4 100644
--- a/packages/ui/src/components/etape/pure-form-save-btn.stories_snapshots_CompletudeDeLaDemandeComplete.html
+++ b/packages/ui/src/components/etape/pure-form-save-btn.stories_snapshots_CompletudeDeLaDemandeComplete.html
@@ -1,15 +1,14 @@
-<div class="flex flex-direction-column full-x">
-  <ul class="bg-warning color-bg list-none p-s bold">
-    <li class="flex">alerte <a href="google.com" target="_blank" class="ml-s"><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
-          <use href="#icon-external-link"></use>
-        </svg></a></li>
-  </ul>
-  <div class="tablet-blobs mr-xxs">
-    <div class="tablet-blob-1-3"></div>
-    <div class="tablet-blob-1-3"></div>
-    <div class="tablet-blob-1-3"><button class="btn btn-primary">Enregistrer</button></div>
-    <div class="tablet-blob-1-3">
-      <!--v-if-->
+<div class="dsfr">
+  <div>
+    <div style="display: flex; flex-direction: column;">
+      <div class="fr-alert fr-alert--warning fr-alert--sm">
+        <p><a class="fr-link" title="alerte" href="google.com" target="_blank">alerte</a></p>
+      </div>
+      <!---->
+      <div style="display: flex; justify-content: end; align-items: center;" class="fr-mt-2w">
+        <!----><button class="fr-btn fr-btn--primary fr-btn--md fr-ml-2w" title="Enregistrer l'étape" aria-label="Enregistrer l'étape" type="submit">Enregistrer l'étape</button>
+        <!---->
+      </div>
     </div>
   </div>
 </div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/pure-form-save-btn.stories_snapshots_CompletudeDeLaDemandeImcomplete.html b/packages/ui/src/components/etape/pure-form-save-btn.stories_snapshots_CompletudeDeLaDemandeImcomplete.html
index fc685062ab3c8b31dfb3270fe99d4f5cc536b8a8..d387a3fd2ff6a37e3531cfa055b0252d01f0c0eb 100644
--- a/packages/ui/src/components/etape/pure-form-save-btn.stories_snapshots_CompletudeDeLaDemandeImcomplete.html
+++ b/packages/ui/src/components/etape/pure-form-save-btn.stories_snapshots_CompletudeDeLaDemandeImcomplete.html
@@ -1,15 +1,14 @@
-<div class="flex flex-direction-column full-x">
-  <ul class="bg-warning color-bg list-none p-s bold">
-    <li class="flex">alerte <a href="google.com" target="_blank" class="ml-s"><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
-          <use href="#icon-external-link"></use>
-        </svg></a></li>
-  </ul>
-  <div class="tablet-blobs mr-xxs">
-    <div class="tablet-blob-1-3"></div>
-    <div class="tablet-blob-1-3"></div>
-    <div class="tablet-blob-1-3"><button class="btn btn-primary" disabled="">Enregistrer</button></div>
-    <div class="tablet-blob-1-3">
-      <!--v-if-->
+<div class="dsfr">
+  <div>
+    <div style="display: flex; flex-direction: column;">
+      <div class="fr-alert fr-alert--warning fr-alert--sm">
+        <p><a class="fr-link" title="alerte" href="google.com" target="_blank">alerte</a></p>
+      </div>
+      <!---->
+      <div style="display: flex; justify-content: end; align-items: center;" class="fr-mt-2w">
+        <!----><button class="fr-btn fr-btn--primary fr-btn--md fr-ml-2w" disabled="" title="Enregistrer l'étape" aria-label="Enregistrer l'étape" type="submit">Enregistrer l'étape</button>
+        <!---->
+      </div>
     </div>
   </div>
 </div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/pure-form-save-btn.stories_snapshots_DemandeEnConstructionComplete.html b/packages/ui/src/components/etape/pure-form-save-btn.stories_snapshots_DemandeEnConstructionComplete.html
index 430b6bb2619647caa20e717eafe57d00046b4ee2..5687ecccb14a996b9a2647c68b50075de6d3912c 100644
--- a/packages/ui/src/components/etape/pure-form-save-btn.stories_snapshots_DemandeEnConstructionComplete.html
+++ b/packages/ui/src/components/etape/pure-form-save-btn.stories_snapshots_DemandeEnConstructionComplete.html
@@ -1,13 +1,13 @@
-<div class="flex flex-direction-column full-x">
-  <ul class="bg-warning color-bg list-none p-s bold">
-    <li class="flex">alerte <a href="google.com" target="_blank" class="ml-s"><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
-          <use href="#icon-external-link"></use>
-        </svg></a></li>
-  </ul>
-  <div class="tablet-blobs mr-xxs">
-    <div class="tablet-blob-1-3"></div>
-    <!--v-if-->
-    <div class="tablet-blob-1-3"><button class="btn btn-secondary">Enregistrer</button></div>
-    <div class="tablet-blob-1-3"><button class="btn btn-primary">Enregistrer et déposer</button></div>
+<div class="dsfr">
+  <div>
+    <div style="display: flex; flex-direction: column;">
+      <div class="fr-alert fr-alert--warning fr-alert--sm">
+        <p><a class="fr-link" title="alerte" href="google.com" target="_blank">alerte</a></p>
+      </div>
+      <!---->
+      <div style="display: flex; justify-content: end; align-items: center;" class="fr-mt-2w">
+        <!----><button class="fr-btn fr-btn--secondary fr-btn--md fr-ml-2w" title="Enregistrer l'étape" aria-label="Enregistrer l'étape" type="button">Enregistrer l'étape</button><button class="fr-btn fr-btn--primary fr-btn--md fr-ml-2w" title="Enregistrer puis déposer l'étape" aria-label="Enregistrer puis déposer l'étape" type="submit">Enregistrer puis déposer l'étape</button>
+      </div>
+    </div>
   </div>
 </div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/pure-form-save-btn.stories_snapshots_DemandeEnConstructionIncomplete.html b/packages/ui/src/components/etape/pure-form-save-btn.stories_snapshots_DemandeEnConstructionIncomplete.html
index 2a09958cbd7a4e8b30f0084f60aaca319acca7dc..4e34f052c3477857db6c306603f832801bd3f9c1 100644
--- a/packages/ui/src/components/etape/pure-form-save-btn.stories_snapshots_DemandeEnConstructionIncomplete.html
+++ b/packages/ui/src/components/etape/pure-form-save-btn.stories_snapshots_DemandeEnConstructionIncomplete.html
@@ -1,13 +1,16 @@
-<div class="flex flex-direction-column full-x">
-  <ul class="bg-warning color-bg list-none p-s bold">
-    <li class="flex">alerte <a href="google.com" target="_blank" class="ml-s"><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
-          <use href="#icon-external-link"></use>
-        </svg></a></li>
-  </ul>
-  <div class="tablet-blobs mr-xxs">
-    <div class="tablet-blob-1-3"></div>
-    <!--v-if-->
-    <div class="tablet-blob-1-3"><button class="btn btn-secondary">Enregistrer</button></div>
-    <div class="tablet-blob-1-3"><button class="btn btn-primary" disabled="">Enregistrer et déposer</button></div>
+<div class="dsfr">
+  <div>
+    <div style="display: flex; flex-direction: column;">
+      <div class="fr-alert fr-alert--warning fr-alert--sm">
+        <p>Superposition</p>
+      </div>
+      <div class="fr-alert fr-alert--warning fr-alert--sm">
+        <p><a class="fr-link" title="alerte" href="google.com" target="_blank">alerte</a></p>
+      </div>
+      <!---->
+      <div style="display: flex; justify-content: end; align-items: center;" class="fr-mt-2w">
+        <!----><button class="fr-btn fr-btn--secondary fr-btn--md fr-ml-2w" title="Enregistrer l'étape" aria-label="Enregistrer l'étape" type="button">Enregistrer l'étape</button><button class="fr-btn fr-btn--primary fr-btn--md fr-ml-2w" disabled="" title="Enregistrer puis déposer l'étape" aria-label="Enregistrer puis déposer l'étape" type="submit">Enregistrer puis déposer l'étape</button>
+      </div>
+    </div>
   </div>
 </div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/pure-form-save-btn.stories_snapshots_EnregistrementEnCours.html b/packages/ui/src/components/etape/pure-form-save-btn.stories_snapshots_EnregistrementEnCours.html
new file mode 100644
index 0000000000000000000000000000000000000000..bfc1ded98a8a83b6db9d2b53fd6ce688d5552b39
--- /dev/null
+++ b/packages/ui/src/components/etape/pure-form-save-btn.stories_snapshots_EnregistrementEnCours.html
@@ -0,0 +1,13 @@
+<div class="dsfr">
+  <div>
+    <div style="display: flex; flex-direction: column;">
+      <!---->
+      <div style="display: flex; justify-content: end; align-items: center;" class="fr-mt-2w">
+        <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
+          <!---->
+          <div class="_spinner_3306d0"></div>
+        </div><button class="fr-btn fr-btn--secondary fr-btn--md fr-ml-2w" disabled="" title="Enregistrer l'étape" aria-label="Enregistrer l'étape" type="button">Enregistrer l'étape</button><button class="fr-btn fr-btn--primary fr-btn--md fr-ml-2w" disabled="" title="Enregistrer puis déposer l'étape" aria-label="Enregistrer puis déposer l'étape" type="submit">Enregistrer puis déposer l'étape</button>
+      </div>
+    </div>
+  </div>
+</div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/pure-form-save-btn.stories_snapshots_SansMessage.html b/packages/ui/src/components/etape/pure-form-save-btn.stories_snapshots_SansMessage.html
index 3b47c8716843fc297e51e291747d49c157561a14..d4a6d39d3d407d33a30a970244278616a9c6e928 100644
--- a/packages/ui/src/components/etape/pure-form-save-btn.stories_snapshots_SansMessage.html
+++ b/packages/ui/src/components/etape/pure-form-save-btn.stories_snapshots_SansMessage.html
@@ -1,9 +1,10 @@
-<div class="flex flex-direction-column full-x">
-  <!--v-if-->
-  <div class="tablet-blobs mr-xxs">
-    <div class="tablet-blob-1-3"></div>
-    <!--v-if-->
-    <div class="tablet-blob-1-3"><button class="btn btn-secondary">Enregistrer</button></div>
-    <div class="tablet-blob-1-3"><button class="btn btn-primary">Enregistrer et déposer</button></div>
+<div class="dsfr">
+  <div>
+    <div style="display: flex; flex-direction: column;">
+      <!---->
+      <div style="display: flex; justify-content: end; align-items: center;" class="fr-mt-2w">
+        <!----><button class="fr-btn fr-btn--secondary fr-btn--md fr-ml-2w" title="Enregistrer l'étape" aria-label="Enregistrer l'étape" type="button">Enregistrer l'étape</button><button class="fr-btn fr-btn--primary fr-btn--md fr-ml-2w" title="Enregistrer puis déposer l'étape" aria-label="Enregistrer puis déposer l'étape" type="submit">Enregistrer puis déposer l'étape</button>
+      </div>
+    </div>
   </div>
 </div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/pure-form-save-btn.stories_snapshots_WithError.html b/packages/ui/src/components/etape/pure-form-save-btn.stories_snapshots_WithError.html
new file mode 100644
index 0000000000000000000000000000000000000000..c1a569a8d7b851a59a21a329a819fcb3a008188e
--- /dev/null
+++ b/packages/ui/src/components/etape/pure-form-save-btn.stories_snapshots_WithError.html
@@ -0,0 +1,12 @@
+<div class="dsfr">
+  <div>
+    <div style="display: flex; flex-direction: column;">
+      <div class="fr-alert fr-alert--error fr-alert--sm">
+        <p>Une erreur sauvage apparait</p>
+      </div>
+      <div style="display: flex; justify-content: end; align-items: center;" class="fr-mt-2w">
+        <!----><button class="fr-btn fr-btn--secondary fr-btn--md fr-ml-2w" title="Enregistrer l'étape" aria-label="Enregistrer l'étape" type="button">Enregistrer l'étape</button><button class="fr-btn fr-btn--primary fr-btn--md fr-ml-2w" title="Enregistrer puis déposer l'étape" aria-label="Enregistrer puis déposer l'étape" type="submit">Enregistrer puis déposer l'étape</button>
+      </div>
+    </div>
+  </div>
+</div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/pure-form-save-btn.tsx b/packages/ui/src/components/etape/pure-form-save-btn.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..66e461eb350afc8e5e8ebb9f4f0c40c8e344e5fb
--- /dev/null
+++ b/packages/ui/src/components/etape/pure-form-save-btn.tsx
@@ -0,0 +1,104 @@
+import { isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools'
+import { HTMLAttributes, defineComponent, ref } from 'vue'
+import { Alert } from '../_ui/alert'
+import { DsfrButton, DsfrLink } from '../_ui/dsfr-button'
+import { AsyncData } from '@/api/client-rest'
+import { LoadingElement } from '../_ui/functional-loader'
+
+export type EtapeAlerte = { message: string; url?: string }
+type Props = {
+  alertes: EtapeAlerte[]
+  canSave: boolean
+  canDepose: boolean
+  showDepose: boolean
+  initialContext?: AsyncData<undefined>
+  save: () => Promise<void>
+  depose: () => Promise<void>
+} & Pick<HTMLAttributes, 'class' | 'style'>
+export const PureFormSaveBtn = defineComponent<Props>(props => {
+  const saveContext = ref<AsyncData<undefined>>(isNotNullNorUndefined(props.initialContext) ? props.initialContext : { status: 'LOADED', value: undefined })
+
+  const save = async () => {
+    saveContext.value = { status: 'LOADING' }
+    try {
+      await props.save()
+      saveContext.value = { status: 'LOADED', value: undefined }
+    } catch (e: any) {
+      console.error('error', e)
+      saveContext.value = {
+        status: 'ERROR',
+        message: e.message ?? "Une erreur s'est produite",
+      }
+    }
+  }
+  const depose = async () => {
+    saveContext.value = { status: 'LOADING' }
+    try {
+      await props.depose()
+      saveContext.value = { status: 'LOADED', value: undefined }
+    } catch (e: any) {
+      console.error('error', e)
+      saveContext.value = {
+        status: 'ERROR',
+        message: e.message ?? "Une erreur s'est produite",
+      }
+    }
+  }
+
+  return () => (
+    <div class={props.class} style={props.style}>
+      <div style={{ display: 'flex', flexDirection: 'column' }}>
+        {props.alertes?.map(alerte => (
+          <Alert
+            key={alerte.message}
+            small={true}
+            type="warning"
+            title={
+              <>
+                {isNotNullNorUndefinedNorEmpty(alerte.url) ? (
+                  <DsfrLink disabled={false} icon={null} title={alerte.message} href={alerte.url} target="_blank">
+                    {alerte.url}
+                  </DsfrLink>
+                ) : (
+                  alerte.message
+                )}
+              </>
+            }
+          />
+        ))}
+
+        {saveContext.value.status === 'ERROR' ? <Alert small={true} type="error" title={saveContext.value.message} /> : null}
+
+        <div style={{ display: 'flex', justifyContent: 'end', alignItems: 'center' }} class="fr-mt-2w">
+          {saveContext.value.status !== 'ERROR' ? <LoadingElement data={saveContext.value} renderItem={() => null} /> : null}
+
+          <DsfrButton
+            buttonType={props.showDepose ? 'secondary' : 'primary'}
+            class="fr-ml-2w"
+            type={props.showDepose ? 'button' : 'submit'}
+            disabled={!props.canSave || saveContext.value.status === 'LOADING'}
+            onClick={save}
+            title="Enregistrer l'étape"
+          >
+            Enregistrer
+          </DsfrButton>
+          {props.showDepose ? (
+            <DsfrButton
+              buttonType="primary"
+              type="submit"
+              class="fr-ml-2w"
+              title="Enregistrer puis déposer l'étape"
+              disabled={!props.canDepose || saveContext.value.status === 'LOADING'}
+              onClick={depose}
+            >
+              Enregistrer et déposer
+            </DsfrButton>
+          ) : null}
+        </div>
+      </div>
+    </div>
+  )
+})
+
+// @ts-ignore waiting for https://github.com/vuejs/core/issues/7833
+PureFormSaveBtn.props = ['alertes', 'canSave', 'canDepose', 'showDepose', 'save', 'depose', 'class', 'style', 'initialContext']
diff --git a/packages/ui/src/components/etape/pure-form-save-btn.vue b/packages/ui/src/components/etape/pure-form-save-btn.vue
deleted file mode 100644
index dfd9e16f247447394741531057a3301a15741e33..0000000000000000000000000000000000000000
--- a/packages/ui/src/components/etape/pure-form-save-btn.vue
+++ /dev/null
@@ -1,38 +0,0 @@
-<template>
-  <div class="flex flex-direction-column full-x">
-    <ul v-if="alertes && alertes.length" class="bg-warning color-bg list-none p-s bold">
-      <li v-for="alerte in alertes" :key="alerte.message" class="flex">
-        {{ alerte.message }}
-        <a v-if="alerte.url" :href="alerte.url" target="_blank" class="ml-s">
-          <Icon name="external-link" size="M" title="Détail de l’alerte - nouvelle fenêtre" aria-hidden="true" />
-        </a>
-      </li>
-    </ul>
-    <div class="tablet-blobs mr-xxs">
-      <div class="tablet-blob-1-3"></div>
-      <div v-if="!showDepose" class="tablet-blob-1-3"></div>
-      <div class="tablet-blob-1-3">
-        <button class="btn" :class="[showDepose ? 'btn-secondary' : 'btn-primary']" :disabled="!canSave" @click="emit('save')">Enregistrer</button>
-      </div>
-      <div class="tablet-blob-1-3">
-        <button v-if="showDepose" class="btn btn-primary" :disabled="!canDepose" @click="emit('depose')">Enregistrer et déposer</button>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script lang="ts" setup>
-import { Icon } from '@/components/_ui/icon'
-
-defineProps<{
-  alertes?: { message: string; url: string }[]
-  canSave: boolean
-  canDepose: boolean
-  showDepose: boolean
-}>()
-
-const emit = defineEmits<{
-  (e: 'save'): void
-  (e: 'depose'): void
-}>()
-</script>
diff --git a/packages/ui/src/components/etape/section-element-edit.vue b/packages/ui/src/components/etape/section-element-edit.vue
deleted file mode 100644
index de4029e869283d732f857b1ce346e34a73f5bda9..0000000000000000000000000000000000000000
--- a/packages/ui/src/components/etape/section-element-edit.vue
+++ /dev/null
@@ -1,67 +0,0 @@
-<template>
-  <div>
-    <div class="tablet-blobs">
-      <div v-if="element.nom" class="tablet-blob-1-3 tablet-pt-s pb-s">
-        <h5 class="mb-0">
-          <span class="cap-first">{{ element.nom }}</span>
-        </h5>
-        <p v-if="element.optionnel" class="h6 italic mb-0">Optionnel</p>
-      </div>
-
-      <SectionElementHeritageEdit
-        v-model:prop="heritage[element.id]"
-        class="mb"
-        :class="{
-          'tablet-blob-2-3': element.nom,
-          'tablet-blob-1': !element.nom,
-        }"
-        :propId="element.id"
-        :sectionId="sectionId"
-        :isArray="element.type === 'checkboxes'"
-      >
-        <template #write>
-          <SectionElementEdit :contenu="contenu" class="mb-s" :element="element" @update:contenu="newValue => $emit('update:contenu', newValue)" />
-        </template>
-        <template #read>
-          <p class="pt-s py-xs mb-0">
-            {{ valeur }}
-          </p>
-        </template>
-
-        <!-- eslint-disable vue/no-v-html -->
-        <p v-if="element.description" class="h6" v-html="element.description" />
-      </SectionElementHeritageEdit>
-    </div>
-  </div>
-</template>
-
-<script>
-import { valeurFind, hasValeurCheck } from '@/utils/contenu'
-import SectionElementEdit from '../_common/section-element-input-edit.vue'
-import SectionElementHeritageEdit from './section-element-heritage-edit.vue'
-
-export default {
-  components: {
-    SectionElementEdit,
-    SectionElementHeritageEdit,
-  },
-
-  props: {
-    contenu: { type: Object, required: true },
-    element: { type: Object, required: true },
-    heritage: { type: Object, required: true },
-    sectionId: { type: String, required: true },
-  },
-  emits: ['update:contenu'],
-
-  computed: {
-    hasValeur() {
-      return hasValeurCheck(this.element.id, this.contenu)
-    },
-
-    valeur() {
-      return valeurFind(this.element, this.heritage[this.element.id].etape.contenu[this.sectionId])
-    },
-  },
-}
-</script>
diff --git a/packages/ui/src/components/etape/section-element-heritage-edit.vue b/packages/ui/src/components/etape/section-element-heritage-edit.vue
deleted file mode 100644
index dbf99f27d1b93b1e11d41e5576c4aac720ddf202..0000000000000000000000000000000000000000
--- a/packages/ui/src/components/etape/section-element-heritage-edit.vue
+++ /dev/null
@@ -1,40 +0,0 @@
-<template>
-  <div class="mb-s">
-    <slot v-if="!prop.actif" name="write" />
-    <div v-else>
-      <slot v-if="hasHeritage" name="read" :heritagePropEtape="prop.etape" />
-      <div v-else class="border p-s mb-s">Non renseigné</div>
-      <p class="h6 italic mb-s">
-        Hérité de :
-        <span class="cap-first">{{ EtapesTypes[prop.etape.typeId].nom }}</span> ({{ dateFormat(prop.etape.date) }})
-      </p>
-    </div>
-    <slot />
-    <button v-if="prop.etape" class="btn full-x rnd-xs py-s px-m small mb-s" @click="prop.actif = !prop.actif">
-      {{ buttonText }}
-    </button>
-  </div>
-</template>
-
-<script setup lang="ts">
-import { hasValeurCheck } from '@/utils/contenu'
-import { dateFormat } from '@/utils'
-import { computed } from 'vue'
-import { Etape, HeritageProp } from 'camino-common/src/etape'
-import { EtapesTypes } from 'camino-common/src/static/etapesTypes'
-
-// TODO 2022-11-14 surement à merger avec heritage-edit.vue
-const props = defineProps<{
-  prop: HeritageProp<Etape>
-  propId: string
-  sectionId: string
-}>()
-
-const buttonText = computed<string>(() => (props.prop.actif ? 'Modifier' : `Hériter de l'étape précédente`))
-
-const hasHeritage = computed<boolean>(() => {
-  const contenu = props.prop.etape && props.prop.etape.contenu && props.prop.etape.contenu[props.sectionId]
-
-  return hasValeurCheck(props.propId, contenu)
-})
-</script>
diff --git a/packages/ui/src/components/etape/section-element-with-value-edit.tsx b/packages/ui/src/components/etape/section-element-with-value-edit.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..141445db45e2f90eb18f65937abcaa9187cac25d
--- /dev/null
+++ b/packages/ui/src/components/etape/section-element-with-value-edit.tsx
@@ -0,0 +1,35 @@
+import { DeepReadonly, FunctionalComponent } from 'vue'
+import { EtapeWithHeritage, HeritageProp } from 'camino-common/src/etape'
+import { isNotNullNorUndefined } from 'camino-common/src/typescript-tools'
+import { ElementWithValue } from 'camino-common/src/sections'
+import { HeritageEdit } from './heritage-edit'
+import { SectionElement } from '../_common/new-section-element'
+import { SectionElementEdit } from '../_common/new-sections-edit'
+
+export type ElementHeritage = DeepReadonly<HeritageProp<Pick<EtapeWithHeritage, 'contenu' | 'typeId' | 'date'>>>
+type Props = {
+  sectionId: string
+  elementWithValue: DeepReadonly<ElementWithValue>
+  elementHeritage: ElementHeritage
+  updateElement: (element: Props['elementWithValue']) => void
+  updateHeritage: (etape: Props['elementHeritage']) => void
+}
+export const SectionElementWithValueEdit: FunctionalComponent<Props> = props => {
+  const read = (etape?: DeepReadonly<Pick<EtapeWithHeritage, 'contenu' | 'typeId' | 'date'>>) => {
+    if (isNotNullNorUndefined(etape)) {
+      // @ts-ignore regarder si on peut narrow l'élément value
+      return <SectionElement element={{ ...props.elementWithValue, value: etape.contenu[props.sectionId]?.[props.elementWithValue.id] }} />
+    } else {
+      return <></>
+    }
+  }
+
+  const write = () => {
+    return <SectionElementEdit element={props.elementWithValue} onValueChange={props.updateElement} />
+  }
+
+  const heritageValue = props.elementHeritage.etape?.contenu?.[props.sectionId]?.[props.elementWithValue.id]
+  const hasHeritageValue: boolean = isNotNullNorUndefined(heritageValue) && (!Array.isArray(heritageValue) || heritageValue.length > 0)
+
+  return <HeritageEdit prop={props.elementHeritage} hasHeritage={hasHeritageValue} propId="contenu" read={read} write={write} updateHeritage={props.updateHeritage} />
+}
diff --git a/packages/ui/src/components/etape/sections-edit.stories.tsx b/packages/ui/src/components/etape/sections-edit.stories.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..ccc7efcaf6f99fdc996a4bd4afc3873feccdfe00
--- /dev/null
+++ b/packages/ui/src/components/etape/sections-edit.stories.tsx
@@ -0,0 +1,128 @@
+import { SectionsEdit } from './sections-edit'
+import { Meta, StoryFn } from '@storybook/vue3'
+import { action } from '@storybook/addon-actions'
+import { toCaminoDate } from 'camino-common/src/date'
+
+const meta: Meta = {
+  title: 'Components/Etape/SectionsEdit',
+  // @ts-ignore
+  component: SectionsEdit,
+  decorators: [() => ({ template: '<div class="dsfr"><story/></div>' })],
+}
+export default meta
+
+const completeUpdate = action('completeUpdate')
+
+export const SansHeritage: StoryFn = () => (
+  <SectionsEdit
+    completeUpdate={completeUpdate}
+    demarcheTypeId="oct"
+    titreTypeId="arm"
+    etape={{
+      typeId: 'mfr',
+      heritageContenu: {},
+      contenu: { arm: { mecanise: true } },
+    }}
+  />
+)
+
+export const AvecHeritageActif: StoryFn = () => (
+  <SectionsEdit
+    completeUpdate={completeUpdate}
+    demarcheTypeId="oct"
+    titreTypeId="arm"
+    etape={{
+      typeId: 'mod',
+      heritageContenu: {
+        arm: {
+          mecanise: {
+            actif: true,
+            etape: {
+              typeId: 'mfr',
+              date: toCaminoDate('2024-01-01'),
+              contenu: { arm: { mecanise: true } },
+            },
+          },
+          franchissements: {
+            actif: true,
+            etape: {
+              typeId: 'mfr',
+              date: toCaminoDate('2024-01-01'),
+              contenu: { arm: { franchissements: 2 } },
+            },
+          },
+        },
+      },
+      contenu: {},
+    }}
+  />
+)
+
+export const AvecHeritage: StoryFn = () => (
+  <SectionsEdit
+    completeUpdate={completeUpdate}
+    demarcheTypeId="oct"
+    titreTypeId="arm"
+    etape={{
+      typeId: 'mod',
+      heritageContenu: {
+        arm: {
+          mecanise: {
+            actif: false,
+            etape: {
+              typeId: 'mfr',
+              date: toCaminoDate('2024-01-01'),
+              contenu: { arm: { mecanise: true } },
+            },
+          },
+          franchissements: {
+            actif: false,
+            etape: {
+              typeId: 'mfr',
+              date: toCaminoDate('2024-01-01'),
+              contenu: { arm: { franchissements: 2 } },
+            },
+          },
+        },
+      },
+      contenu: { arm: { mecanise: false } },
+    }}
+  />
+)
+
+export const DecisionJorf: StoryFn = () => (
+  <SectionsEdit
+    completeUpdate={completeUpdate}
+    demarcheTypeId="pro"
+    titreTypeId="pcc"
+    etape={{
+      typeId: 'dpu',
+      heritageContenu: {
+        publication: {
+          jorf: {
+            actif: true,
+            etape: {
+              typeId: 'dex',
+              date: toCaminoDate('2000-05-16'),
+              contenu: {},
+            },
+          },
+          nor: {
+            actif: true,
+            etape: {
+              typeId: 'dex',
+              date: toCaminoDate('2000-05-16'),
+              contenu: {},
+            },
+          },
+        },
+      },
+      contenu: {
+        publication: {
+          nor: 'ECOI0000235A',
+          jorf: 'JORFTEXT000000399877',
+        },
+      },
+    }}
+  />
+)
diff --git a/packages/ui/src/components/etape/sections-edit.stories_snapshots_AvecHeritage.html b/packages/ui/src/components/etape/sections-edit.stories_snapshots_AvecHeritage.html
new file mode 100644
index 0000000000000000000000000000000000000000..0f419c1a339c0b08d2ce8b98eb5b43ad579e48fe
--- /dev/null
+++ b/packages/ui/src/components/etape/sections-edit.stories_snapshots_AvecHeritage.html
@@ -0,0 +1,47 @@
+<div class="dsfr">
+  <div class="fr-grid-row">
+    <div class="fr-col-12 fr-col-xl-6">
+      <div>
+        <h3>Caractéristiques ARM</h3>
+        <div class="mb-s">
+          <div>
+            <fieldset class="fr-fieldset" id="mecanise" aria-labelledby="mecanise-legend">
+              <legend class="fr-fieldset__legend--regular fr-fieldset__legend" id="mecanise-legend">Prospection mécanisée *
+                <!---->
+              </legend>
+              <div class="fr-fieldset__element">
+                <div class="fr-radio-group"><input type="radio" id="mecanise-0" name="mecanise"><label class="fr-label" for="mecanise-0">Oui
+                    <!---->
+                  </label></div>
+              </div>
+              <div class="fr-fieldset__element">
+                <div class="fr-radio-group"><input type="radio" id="mecanise-1" name="mecanise"><label class="fr-label" for="mecanise-1">Non
+                    <!---->
+                  </label></div>
+              </div>
+            </fieldset>
+          </div>
+          <div class="dsfr">
+            <div class="fr-toggle"><input type="checkbox" class="fr-toggle__input" id="toggle_271"><label class="fr-toggle__label" for="toggle_271" data-fr-checked-label="Activé" data-fr-unchecked-label="Désactivé"><span class=" fr-ml-4w">Hériter de l’étape "Demande" du 01-01-2024</span></label>
+              <!---->
+            </div>
+          </div>
+        </div>
+        <div class="mb-s">
+          <div>
+            <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_670">Franchissements de cours d'eau
+                <!----><span class="fr-hint-text">Nombre de franchissements de cours d'eau</span>
+              </label><input class="fr-input" name="input_670" id="input_670" type="number" min="0">
+              <!---->
+            </div>
+          </div>
+          <div class="dsfr">
+            <div class="fr-toggle"><input type="checkbox" class="fr-toggle__input" id="toggle_74"><label class="fr-toggle__label" for="toggle_74" data-fr-checked-label="Activé" data-fr-unchecked-label="Désactivé"><span class=" fr-ml-4w">Hériter de l’étape "Demande" du 01-01-2024</span></label>
+              <!---->
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/sections-edit.stories_snapshots_AvecHeritageActif.html b/packages/ui/src/components/etape/sections-edit.stories_snapshots_AvecHeritageActif.html
new file mode 100644
index 0000000000000000000000000000000000000000..1e1b1090be1fb39348773826b47831e1e7bcce48
--- /dev/null
+++ b/packages/ui/src/components/etape/sections-edit.stories_snapshots_AvecHeritageActif.html
@@ -0,0 +1,49 @@
+<div class="dsfr">
+  <div class="fr-grid-row">
+    <div class="fr-col-12 fr-col-xl-6">
+      <div>
+        <h3>Caractéristiques ARM</h3>
+        <div class="mb-s">
+          <div>
+            <div class="tablet-blobs">
+              <div class="tablet-blob-1-4">
+                <h5>Prospection mécanisée</h5>
+              </div>
+              <div class="tablet-blob-3-4">
+                <p class="cap-first ">Oui
+                  <!---->
+                </p>
+                <!---->
+              </div>
+            </div>
+          </div>
+          <div class="dsfr">
+            <div class="fr-toggle"><input type="checkbox" class="fr-toggle__input" id="toggle_271"><label class="fr-toggle__label" for="toggle_271" data-fr-checked-label="Activé" data-fr-unchecked-label="Désactivé"><span class=" fr-ml-4w">Hériter de l’étape "Demande" du 01-01-2024</span></label>
+              <!---->
+            </div>
+          </div>
+        </div>
+        <div class="mb-s">
+          <div>
+            <div class="tablet-blobs">
+              <div class="tablet-blob-1-4">
+                <h5>Franchissements de cours d'eau</h5>
+              </div>
+              <div class="tablet-blob-3-4">
+                <p class="cap-first mb-s">2
+                  <!---->
+                </p>
+                <p class="h6"><span>Nombre de franchissements de cours d'eau</span></p>
+              </div>
+            </div>
+          </div>
+          <div class="dsfr">
+            <div class="fr-toggle"><input type="checkbox" class="fr-toggle__input" id="toggle_670"><label class="fr-toggle__label" for="toggle_670" data-fr-checked-label="Activé" data-fr-unchecked-label="Désactivé"><span class=" fr-ml-4w">Hériter de l’étape "Demande" du 01-01-2024</span></label>
+              <!---->
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/sections-edit.stories_snapshots_DecisionJorf.html b/packages/ui/src/components/etape/sections-edit.stories_snapshots_DecisionJorf.html
new file mode 100644
index 0000000000000000000000000000000000000000..367ca0f894057a8625d419af77c33b8c624d328b
--- /dev/null
+++ b/packages/ui/src/components/etape/sections-edit.stories_snapshots_DecisionJorf.html
@@ -0,0 +1,29 @@
+<div class="dsfr">
+  <div class="fr-grid-row">
+    <div class="fr-col-12 fr-col-xl-6">
+      <div>
+        <h3>Références Légifrance</h3>
+        <div class="mb-s">
+          <div>
+            <div class="border p-s mb-s">Non renseigné</div>
+          </div>
+          <div class="dsfr">
+            <div class="fr-toggle"><input type="checkbox" class="fr-toggle__input" id="toggle_271"><label class="fr-toggle__label" for="toggle_271" data-fr-checked-label="Activé" data-fr-unchecked-label="Désactivé"><span class=" fr-ml-4w">Hériter de l’étape "Décision de l'administration" du 16-05-2000</span></label>
+              <!---->
+            </div>
+          </div>
+        </div>
+        <div class="mb-s">
+          <div>
+            <div class="border p-s mb-s">Non renseigné</div>
+          </div>
+          <div class="dsfr">
+            <div class="fr-toggle"><input type="checkbox" class="fr-toggle__input" id="toggle_670"><label class="fr-toggle__label" for="toggle_670" data-fr-checked-label="Activé" data-fr-unchecked-label="Désactivé"><span class=" fr-ml-4w">Hériter de l’étape "Décision de l'administration" du 16-05-2000</span></label>
+              <!---->
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/sections-edit.stories_snapshots_SansHeritage.html b/packages/ui/src/components/etape/sections-edit.stories_snapshots_SansHeritage.html
new file mode 100644
index 0000000000000000000000000000000000000000..768bc6dc2a0f89fa47138dfd12d0090ce22462d4
--- /dev/null
+++ b/packages/ui/src/components/etape/sections-edit.stories_snapshots_SansHeritage.html
@@ -0,0 +1,39 @@
+<div class="dsfr">
+  <div class="fr-grid-row">
+    <div class="fr-col-12 fr-col-xl-6">
+      <div>
+        <h3>Caractéristiques ARM</h3>
+        <div class="mb-s">
+          <div>
+            <fieldset class="fr-fieldset" id="mecanise" aria-labelledby="mecanise-legend">
+              <legend class="fr-fieldset__legend--regular fr-fieldset__legend" id="mecanise-legend">Prospection mécanisée *
+                <!---->
+              </legend>
+              <div class="fr-fieldset__element">
+                <div class="fr-radio-group"><input type="radio" id="mecanise-0" name="mecanise"><label class="fr-label" for="mecanise-0">Oui
+                    <!---->
+                  </label></div>
+              </div>
+              <div class="fr-fieldset__element">
+                <div class="fr-radio-group"><input type="radio" id="mecanise-1" name="mecanise"><label class="fr-label" for="mecanise-1">Non
+                    <!---->
+                  </label></div>
+              </div>
+            </fieldset>
+          </div>
+          <!---->
+        </div>
+        <div class="mb-s">
+          <div>
+            <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_271">Franchissements de cours d'eau
+                <!----><span class="fr-hint-text">Nombre de franchissements de cours d'eau</span>
+              </label><input class="fr-input" name="input_271" id="input_271" type="number" min="0">
+              <!---->
+            </div>
+          </div>
+          <!---->
+        </div>
+      </div>
+    </div>
+  </div>
+</div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/sections-edit.tsx b/packages/ui/src/components/etape/sections-edit.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..49c9756fc27c69ebd061c61aef46e108071c5495
--- /dev/null
+++ b/packages/ui/src/components/etape/sections-edit.tsx
@@ -0,0 +1,85 @@
+import { DeepReadonly, computed, defineComponent, watch } from 'vue'
+import { TitreTypeId } from 'camino-common/src/static/titresTypes'
+import { DemarcheTypeId } from 'camino-common/src/static/demarchesTypes'
+import { EtapeWithHeritage, HeritageContenu } from 'camino-common/src/etape'
+import { getSections, getSectionsWithValue } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sections'
+import { isNotNullNorUndefinedNorEmpty, isNullOrUndefined } from 'camino-common/src/typescript-tools'
+import { useState } from '../../utils/vue-tsx-utils'
+import { ElementWithValue, SectionWithValue } from 'camino-common/src/sections'
+import { ElementHeritage, SectionElementWithValueEdit } from './section-element-with-value-edit'
+
+export type SectionsEditEtape = DeepReadonly<Pick<EtapeWithHeritage, 'typeId' | 'heritageContenu' | 'contenu'>>
+type Props = {
+  titreTypeId: TitreTypeId
+  demarcheTypeId: DemarcheTypeId
+  etape: SectionsEditEtape
+  completeUpdate: (etape: Props['etape']) => void
+}
+
+export const SectionsEdit = defineComponent<Props>(props => {
+  const [editedEtape, setEditedEtape] = useState(props.etape)
+
+  const updateElement = (sectionId: string) => (element: DeepReadonly<ElementWithValue>) => {
+    setEditedEtape({ ...editedEtape.value, contenu: { ...editedEtape.value.contenu, [sectionId]: { ...editedEtape.value.contenu[sectionId], [element.id]: element.value } } })
+  }
+  const updateHeritage = (sectionId: string, elementId: string) => (heritage: ElementHeritage) => {
+    setEditedEtape({ ...editedEtape.value, heritageContenu: { ...editedEtape.value.heritageContenu, [sectionId]: { ...editedEtape.value.heritageContenu[sectionId], [elementId]: heritage } } })
+  }
+
+  const sections = computed(() => {
+    return getSections(props.titreTypeId, props.demarcheTypeId, props.etape.typeId)
+  })
+
+  const sectionsWithValue = computed<SectionWithValue[]>(() => {
+    return getSectionsWithValue(sections.value, editedEtape.value.contenu)
+  })
+
+  watch(
+    () => editedEtape.value,
+    () => {
+      props.completeUpdate(editedEtape.value)
+    }
+  )
+
+  const heritageContenu = computed<DeepReadonly<HeritageContenu>>(() => {
+    let heritage: DeepReadonly<HeritageContenu> = { ...editedEtape.value.heritageContenu }
+    for (const section of sectionsWithValue.value) {
+      if (isNullOrUndefined(heritage[section.id])) {
+        heritage = { ...heritage, [section.id]: {} }
+      }
+      for (const element of section.elements) {
+        if (isNullOrUndefined(heritage[section.id][element.id])) {
+          heritage = { ...heritage, [section.id]: { ...heritage[section.id], [element.id]: { actif: false } } }
+        }
+      }
+    }
+
+    return heritage
+  })
+
+  return () => (
+    <div class="fr-grid-row">
+      <div class="fr-col-12 fr-col-xl-6">
+        {sectionsWithValue.value.map(sectionWithValue => (
+          <div key={sectionWithValue.id}>
+            {isNotNullNorUndefinedNorEmpty(sectionWithValue.nom) ? <h3>{sectionWithValue.nom}</h3> : null}
+
+            {sectionWithValue.elements.map(elementWithValue => (
+              <SectionElementWithValueEdit
+                key={elementWithValue.id}
+                elementWithValue={elementWithValue}
+                elementHeritage={heritageContenu.value[sectionWithValue.id][elementWithValue.id]}
+                sectionId={sectionWithValue.id}
+                updateElement={updateElement(sectionWithValue.id)}
+                updateHeritage={updateHeritage(sectionWithValue.id, elementWithValue.id)}
+              />
+            ))}
+          </div>
+        ))}
+      </div>
+    </div>
+  )
+})
+
+// @ts-ignore waiting for https://github.com/vuejs/core/issues/7833
+SectionsEdit.props = ['etape', 'titreTypeId', 'demarcheTypeId', 'completeUpdate']
diff --git a/packages/ui/src/components/etape/sections-edit.vue b/packages/ui/src/components/etape/sections-edit.vue
deleted file mode 100644
index d2b0c57d451fea1a98562af0c1941c8d4dfc5da9..0000000000000000000000000000000000000000
--- a/packages/ui/src/components/etape/sections-edit.vue
+++ /dev/null
@@ -1,61 +0,0 @@
-<template>
-  <div>
-    <div v-for="s in sections" :key="s.id">
-      <h3 v-if="s.nom">{{ s.nom }}</h3>
-
-      <SectionElementEdit v-for="e in s.elements" :key="e.id" v-model:contenu="contenu[s.id]" :element="e" :heritage="etape.heritageContenu[s.id]" :sectionId="s.id" />
-    </div>
-  </div>
-</template>
-
-<script>
-import { elementContenuBuild, contenuBuild, contenuCompleteCheck } from '@/utils/contenu'
-import SectionElementEdit from './section-element-edit.vue'
-
-export default {
-  components: {
-    SectionElementEdit,
-  },
-
-  props: {
-    sections: { type: Array, required: true },
-    etape: { type: Object, required: true },
-  },
-
-  emits: ['complete-update', 'sections-update'],
-  data() {
-    return {
-      contenu: {},
-    }
-  },
-
-  computed: {
-    complete() {
-      return contenuCompleteCheck(this.sections, this.contenu)
-    },
-  },
-
-  watch: {
-    contenu: {
-      handler: function (contenu) {
-        this.etape.contenu = elementContenuBuild(this.sections, contenu)
-        this.$emit('sections-update')
-      },
-      deep: true,
-    },
-
-    complete: 'completeUpdate',
-  },
-
-  created() {
-    this.contenu = contenuBuild(this.sections, this.etape.contenu)
-    this.completeUpdate()
-  },
-
-  methods: {
-    completeUpdate() {
-      this.$emit('complete-update', this.complete)
-    },
-  },
-}
-</script>
diff --git a/packages/ui/src/components/etape/substances-edit.stories.ts b/packages/ui/src/components/etape/substances-edit.stories.ts
deleted file mode 100644
index df4a02cd5b8f1ba5e8a081a091c36b9a765319ed..0000000000000000000000000000000000000000
--- a/packages/ui/src/components/etape/substances-edit.stories.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-import { SubstancesEdit, Props } from './substances-edit'
-import { Meta, StoryFn } from '@storybook/vue3'
-import { toCaminoDate } from 'camino-common/src/date'
-import { SubstancesLegale } from 'camino-common/src/static/substancesLegales'
-
-const meta: Meta = {
-  title: 'Components/Etape/SubstancesEdit',
-  component: SubstancesEdit,
-  argTypes: {},
-}
-export default meta
-
-const Template: StoryFn<Props> = (args: Props) => ({
-  components: { SubstancesEdit },
-  setup() {
-    return { args }
-  },
-  data: () => ({
-    substances: ['auru'],
-  }),
-  template: `<SubstancesEdit  v-bind="args" :substances='substances'/>`,
-})
-const heritageProps: Props['heritageProps']['substances'] = {
-  actif: true,
-  etape: {
-    substances: [SubstancesLegale.auru.id],
-    date: toCaminoDate('2020-01-01'),
-    typeId: 'mfr',
-  },
-}
-export const SansHeritage = Template.bind({})
-SansHeritage.args = {
-  domaineId: 'm',
-  heritageProps: { substances: { ...heritageProps, actif: false } },
-}
-
-export const AvecHeritage = Template.bind({})
-AvecHeritage.args = {
-  domaineId: 'm',
-  heritageProps: { substances: { ...heritageProps } },
-}
diff --git a/packages/ui/src/components/etape/substances-edit.stories.tsx b/packages/ui/src/components/etape/substances-edit.stories.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..21d864e620c619292c3dc2f028371beb9390650e
--- /dev/null
+++ b/packages/ui/src/components/etape/substances-edit.stories.tsx
@@ -0,0 +1,43 @@
+import { action } from '@storybook/addon-actions'
+import { SubstancesEdit, Props } from './substances-edit'
+import { Meta, StoryFn } from '@storybook/vue3'
+import { toCaminoDate } from 'camino-common/src/date'
+import { SubstancesLegale } from 'camino-common/src/static/substancesLegales'
+
+const meta: Meta = {
+  title: 'Components/Etape/SubstancesEdit',
+  component: SubstancesEdit,
+  argTypes: { heritageProps: { actif: true } },
+  args: { heritageProps: { actif: true } },
+  decorators: [() => ({ template: '<div class="dsfr"><story/></div>' })],
+}
+export default meta
+
+const updateSubstancesAction = action('updateSubstances')
+const updateHeritage = action('updateHeritage')
+
+const heritageProps: Props['heritageSubstances'] = {
+  actif: true,
+  etape: {
+    substances: [SubstancesLegale.auru.id, SubstancesLegale.arge.id],
+    date: toCaminoDate('2020-01-01'),
+    typeId: 'mfr',
+  },
+}
+export const SansHeritage: StoryFn = () => (
+  <SubstancesEdit
+    substances={[SubstancesLegale.auru.id]}
+    updateHeritage={updateHeritage}
+    updateSubstances={updateSubstancesAction}
+    domaineId="m"
+    heritageSubstances={{ ...heritageProps, actif: false }}
+  />
+)
+
+export const AvecHeritage: StoryFn = () => (
+  <SubstancesEdit substances={[SubstancesLegale.auru.id]} updateHeritage={updateHeritage} updateSubstances={updateSubstancesAction} domaineId="m" heritageSubstances={{ ...heritageProps }} />
+)
+
+export const SansSubstance: StoryFn = () => (
+  <SubstancesEdit substances={[]} updateHeritage={updateHeritage} updateSubstances={updateSubstancesAction} domaineId="m" heritageSubstances={{ actif: false }} />
+)
diff --git a/packages/ui/src/components/etape/substances-edit.stories_snapshots_AvecHeritage.html b/packages/ui/src/components/etape/substances-edit.stories_snapshots_AvecHeritage.html
index 81df715fb58eb08ed72ad5b648999e777aaa7538..9c9f1f2567690f21e6a0891d62758a3522182bde 100644
--- a/packages/ui/src/components/etape/substances-edit.stories_snapshots_AvecHeritage.html
+++ b/packages/ui/src/components/etape/substances-edit.stories_snapshots_AvecHeritage.html
@@ -1,14 +1,15 @@
-<div>
-  <h3 class="mb-s">Substances</h3>
-  <div class="mb-s">
-    <div>
-      <ul class="list-inline mb-s">
-        <li class="mr-xs mb-xs"><span class="bold cap-first small lh-2"><span class="bg-neutral py-xs px-s rnd-xs color-bg box">or</span></span></li>
-      </ul>
-    </div>
-    <div class="dsfr">
-      <div class="fr-toggle"><input type="checkbox" class="fr-toggle__input" aria-describedby="toggle-toggle_271-hint-text" id="toggle_271"><label class="fr-toggle__label" for="toggle_271" data-fr-checked-label="Activé" data-fr-unchecked-label="Désactivé"><span class=" fr-ml-4w">Hériter de l’étape précédente</span></label>
-        <p class="fr-hint-text" id="toggle-toggle_271-hint-text">Hérité de : Demande (01-01-2020)</p>
+<div class="dsfr">
+  <div>
+    <h6>Substances</h6>
+    <div class="mb-s">
+      <div>
+        <p class="fr-tag fr-tag--md fr-mr-1w" title="Or" aria-label="Or">Or</p>
+        <p class="fr-tag fr-tag--md fr-mr-1w" title="Argent" aria-label="Argent">Argent</p>
+      </div>
+      <div class="dsfr">
+        <div class="fr-toggle"><input type="checkbox" class="fr-toggle__input" id="toggle_271"><label class="fr-toggle__label" for="toggle_271" data-fr-checked-label="Activé" data-fr-unchecked-label="Désactivé"><span class=" fr-ml-4w">Hériter de l’étape "Demande" du 01-01-2020</span></label>
+          <!---->
+        </div>
       </div>
     </div>
   </div>
diff --git a/packages/ui/src/components/etape/substances-edit.stories_snapshots_SansHeritage.html b/packages/ui/src/components/etape/substances-edit.stories_snapshots_SansHeritage.html
index 0e72a08a7b6414eb3cf0969558e2993e3d5de1eb..bbf9e9b1c341c7961574b20ca882a9f3590f4ce3 100644
--- a/packages/ui/src/components/etape/substances-edit.stories_snapshots_SansHeritage.html
+++ b/packages/ui/src/components/etape/substances-edit.stories_snapshots_SansHeritage.html
@@ -1,108 +1,27 @@
-<div>
-  <h3 class="mb-s">Substances</h3>
-  <div class="mb-s">
-    <div>
-      <div class="flex mb-s"><select class="p-s mr-s">
-          <option value="kals">alun</option>
-          <option value="anti">antimoine</option>
-          <option value="arge">argent</option>
-          <option value="arse">arsenic</option>
-          <option value="trxx">autres éléments de terres rares</option>
-          <option value="aloh">bauxite</option>
-          <option value="bery">béryllium</option>
-          <option value="bism">bismuth</option>
-          <option value="cadm">cadmium</option>
-          <option value="hydm">calcaires bitumineux</option>
-          <option value="ceri">cérium</option>
-          <option value="cesi">césium</option>
-          <option value="chro">chrome</option>
-          <option value="coba">cobalt</option>
-          <option value="cuiv">cuivre</option>
-          <option value="diam">diamant</option>
-          <option value="dysp">dysprosium</option>
-          <option value="erbi">erbium</option>
-          <option value="etai">étain</option>
-          <option value="euro">europium</option>
-          <option value="ferx">fer</option>
-          <option value="fluo">fluorine</option>
-          <option value="gado">gadolinium</option>
-          <option value="gall">gallium</option>
-          <option value="coox">gaz carbonique</option>
-          <option value="germ">germanium</option>
-          <option value="grap">graphite</option>
-          <option value="hafn">hafnium</option>
-          <option value="heli">hélium</option>
-          <option value="holm">holmium</option>
-          <option value="hydrog">hydrogène</option>
-          <option value="indi">indium</option>
-          <option value="irid">iridium</option>
-          <option value="lant">lanthane</option>
-          <option value="lith">lithium</option>
-          <option value="lute">lutécium</option>
-          <option value="mang">manganèse</option>
-          <option value="merc">mercure</option>
-          <option value="meco">métaux connexes</option>
-          <option value="meba">métaux de base</option>
-          <option value="plax">métaux de la mine du platine</option>
-          <option value="mepr">métaux précieux</option>
-          <option value="mais">minerais</option>
-          <option value="moly">molybdène</option>
-          <option value="neod">néodyme</option>
-          <option value="nick">nickel</option>
-          <option value="niob">niobium</option>
-          <option value="oooo">non précisée(s)</option>
-          <option disabled="" value="auru">or</option>
-          <option value="osmi">osmium</option>
-          <option value="pall">palladium</option>
-          <option value="phos">phosphates</option>
-          <option value="pipe">pierres précieuses</option>
-          <option value="plat">platine</option>
-          <option value="plom">plomb</option>
-          <option value="pras">praséodyme</option>
-          <option value="prom">prométhium</option>
-          <option value="selp">puits d'eau salée</option>
-          <option value="pyri">pyrite</option>
-          <option value="rhen">rhénium</option>
-          <option value="rhod">rhodium</option>
-          <option value="rubi">rubidium</option>
-          <option value="ruth">ruthénium</option>
-          <option value="sama">samarium</option>
-          <option value="scan">scandium</option>
-          <option value="selx">sel</option>
-          <option value="selg">sel gemme</option>
-          <option value="sele">sélénium</option>
-          <option value="sels">sels</option>
-          <option value="kclx">sels de potassium</option>
-          <option value="nacl">sels de sodium</option>
-          <option value="souf">soufre</option>
-          <option value="selh">sources d'eau salée</option>
-          <option value="scoc">substances connexes</option>
-          <option value="soxx">sulfates autres que les sulfates alcalino-terreux</option>
-          <option value="tant">tantale</option>
-          <option value="tell">tellure</option>
-          <option value="terb">terbium</option>
-          <option value="thal">thallium</option>
-          <option value="thul">thulium</option>
-          <option value="tita">titane</option>
-          <option value="tmas">tous métaux associés</option>
-          <option value="wolf">tungstène</option>
-          <option value="vana">vanadium</option>
-          <option value="ytte">ytterbium</option>
-          <option value="ytri">yttrium</option>
-          <option value="zinc">zinc</option>
-          <option value="zirc">zirconium</option>
-        </select>
-        <!---->
-        <!----><button title="Supprimer la substance" aria-label="Supprimer la substance" class="btn py-s px-m rnd-r-xs rnd-l-xs"><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
-            <use href="#icon-minus"></use>
-          </svg></button>
+<div class="dsfr">
+  <div>
+    <h6>Substances</h6>
+    <div class="mb-s">
+      <div style="display: flex; flex-direction: column;">
+        <div>
+          <div style="display: flex;" class="fr-mt-2w">
+            <div id="typeahead_271_wrapper" class="_typeahead_8eddf1 dsfr">
+              <div class="flex"><input id="typeahead_271" type="text" name="typeahead_271" class="_typeahead-input_8eddf1 fr-input" placeholder="" autocomplete="off"></div>
+              <!---->
+            </div>
+            <!---->
+            <!----><button class="fr-btn fr-btn--secondary fr-btn--md fr-icon-delete-bin-line fr-ml-2w" title="Supprimer la substance or" aria-label="Supprimer la substance or" type="button">
+              <!---->
+            </button>
+          </div>
+        </div><button class="fr-btn fr-btn--primary fr-btn--md fr-icon-add-line fr-mt-2w" title="Ajouter une substance" aria-label="Ajouter une substance" type="button" style="align-self: end;">
+          <!---->
+        </button>
       </div>
-    </div><button title="Ajouter une substance" aria-label="Ajouter une substance" class="btn small rnd-xs py-s px-m full-x flex mb-s"><span class="mt-xxs">Ajouter une substance</span><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class="flex-right">
-        <use href="#icon-plus"></use>
-      </svg></button>
-    <div class="dsfr">
-      <div class="fr-toggle"><input type="checkbox" class="fr-toggle__input" id="toggle_271"><label class="fr-toggle__label" for="toggle_271" data-fr-checked-label="Activé" data-fr-unchecked-label="Désactivé"><span class=" fr-ml-4w">Hériter de l’étape précédente</span></label>
-        <!---->
+      <div class="dsfr">
+        <div class="fr-toggle"><input type="checkbox" class="fr-toggle__input" id="toggle_670"><label class="fr-toggle__label" for="toggle_670" data-fr-checked-label="Activé" data-fr-unchecked-label="Désactivé"><span class=" fr-ml-4w">Hériter de l’étape "Demande" du 01-01-2020</span></label>
+          <!---->
+        </div>
       </div>
     </div>
   </div>
diff --git a/packages/ui/src/components/etape/substances-edit.stories_snapshots_SansSubstance.html b/packages/ui/src/components/etape/substances-edit.stories_snapshots_SansSubstance.html
new file mode 100644
index 0000000000000000000000000000000000000000..09b2bc741b4c903f51eff18e16e923f6920c1b8f
--- /dev/null
+++ b/packages/ui/src/components/etape/substances-edit.stories_snapshots_SansSubstance.html
@@ -0,0 +1,23 @@
+<div class="dsfr">
+  <div>
+    <h6>Substances</h6>
+    <div class="mb-s">
+      <div style="display: flex; flex-direction: column;">
+        <div>
+          <div style="display: flex;" class="fr-mt-2w">
+            <div id="typeahead_271_wrapper" class="_typeahead_8eddf1 dsfr">
+              <div class="flex"><input id="typeahead_271" type="text" name="typeahead_271" class="_typeahead-input_8eddf1 fr-input" placeholder="" autocomplete="off"></div>
+              <!---->
+            </div>
+            <!---->
+            <!----><button class="fr-btn fr-btn--secondary fr-btn--md fr-icon-delete-bin-line fr-ml-2w" title="Supprimer la substance " aria-label="Supprimer la substance " type="button">
+              <!---->
+            </button>
+          </div>
+        </div>
+        <!---->
+      </div>
+      <!---->
+    </div>
+  </div>
+</div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/substances-edit.tsx b/packages/ui/src/components/etape/substances-edit.tsx
index 7aeb42e12700bc224bf768969a71bc2ae35327b5..7c0f38d2213739010f5f714d6319008d3df3d9ec 100644
--- a/packages/ui/src/components/etape/substances-edit.tsx
+++ b/packages/ui/src/components/etape/substances-edit.tsx
@@ -1,103 +1,169 @@
-import { caminoDefineComponent } from '@/utils/vue-tsx-utils'
-import { SubstancesLegales, SubstancesLegale, SubstanceLegaleId, SubstanceLegale } from 'camino-common/src/static/substancesLegales'
-import { computed } from 'vue'
+import { caminoDefineComponent, useState } from '@/utils/vue-tsx-utils'
+import { SubstancesLegales, SubstancesLegale, SubstanceLegaleId } from 'camino-common/src/static/substancesLegales'
+import { DeepReadonly, computed, watch } from 'vue'
 import { HeritageEdit } from '@/components/etape/heritage-edit'
-import { TagList } from '@/components/_ui/tag-list'
-import { Icon } from '@/components/_ui/icon'
 import { DomaineId } from 'camino-common/src/static/domaines'
-import { EtapeFondamentale, EtapeWithHeritage } from 'camino-common/src/etape'
-import { ButtonIcon } from '../_ui/button-icon'
-import { Button } from '../_ui/button'
+import { EtapePropsFromHeritagePropName, EtapeWithHeritage, HeritageProp } from 'camino-common/src/etape'
+import { isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty, isNullOrUndefinedOrEmpty } from 'camino-common/src/typescript-tools'
+import { DsfrButtonIcon } from '../_ui/dsfr-button'
+import { SubstanceLegaleTypeahead } from '../_common/substance-legale-typeahead'
+import { DsfrTag } from '../_ui/tag'
+import { capitalize } from 'camino-common/src/strings'
 
 export type Props = {
-  substances: (SubstanceLegaleId | undefined)[]
-  heritageProps: EtapeWithHeritage<'substances', Pick<EtapeFondamentale, 'substances' | 'typeId' | 'date'>>['heritageProps']
+  substances: DeepReadonly<SubstanceLegaleId[]>
+  heritageSubstances: DeepReadonly<HeritageProp<Pick<EtapeWithHeritage, 'typeId' | 'date' | EtapePropsFromHeritagePropName<'substances'>>>>
   domaineId: DomaineId
+  updateSubstances: (substances: DeepReadonly<SubstanceLegaleId[]>) => void
+  updateHeritage: (subtances: Props['heritageSubstances']) => void
 }
-export const SubstancesEdit = caminoDefineComponent<Props>(['substances', 'heritageProps', 'domaineId'], props => {
-  const substancesLength = computed<number>(() => props.substances?.filter(substanceId => substanceId).length)
+export const SubstancesEdit = caminoDefineComponent<Props>(['substances', 'heritageSubstances', 'domaineId', 'updateSubstances', 'updateHeritage'], props => {
+  const [editedSubstances, setEditedSubstances] = useState<DeepReadonly<(SubstanceLegaleId | undefined)[]>>(isNullOrUndefinedOrEmpty(props.substances) ? [undefined] : props.substances)
+  const [heritageActif, setHeritageActif] = useState<Props['heritageSubstances']>(props.heritageSubstances)
 
-  const substancesByDomaine = computed<SubstanceLegale[]>(() => SubstancesLegales.filter(({ domaineIds }) => domaineIds.includes(props.domaineId)).sort((a, b) => a.nom.localeCompare(b.nom)))
+  const substancesLength = computed<number>(() => editedSubstances.value.filter(substanceId => substanceId).length)
+
+  const updateHeritage = (actif: Props['heritageSubstances']) => {
+    setHeritageActif(actif)
+    props.updateHeritage(actif)
+  }
+
+  watch(
+    () => editedSubstances.value,
+    () => {
+      props.updateSubstances(editedSubstances.value.filter(isNotNullNorUndefined))
+    },
+    { deep: true }
+  )
+
+  const substancesToDisplay = computed<SubstanceLegaleId[]>(() => {
+    return SubstancesLegales.filter(({ domaineIds }) => domaineIds.includes(props.domaineId))
+      .sort((a, b) => a.nom.localeCompare(b.nom))
+      .filter(({ id }) => !editedSubstances.value.some(substanceId => substanceId === id))
+      .map(({ id }) => id)
+  })
 
   const substanceNoms = computed<string[]>(() => {
-    return props.heritageProps.substances.etape?.substances.filter((substanceId): substanceId is SubstanceLegaleId => !!substanceId).map(substanceId => SubstancesLegale[substanceId].nom) || []
+    return props.heritageSubstances.etape?.substances.filter((substanceId): substanceId is SubstanceLegaleId => !!substanceId).map(substanceId => SubstancesLegale[substanceId].nom) || []
   })
 
   const substanceAdd = (): void => {
-    props.substances.push(undefined)
+    setEditedSubstances([...editedSubstances.value, undefined])
   }
 
-  const substanceRemove = (index: number): SubstanceLegaleId | undefined => {
-    return props.substances.splice(index, 1)[0]
+  const substanceRemove = (index: number) => (): void => {
+    setEditedSubstances(editedSubstances.value.filter((_, myIndex) => index !== myIndex))
   }
 
-  const substanceMoveDown = (index: number): void => {
-    const substance = substanceRemove(index)
-    props.substances.splice(index + 1, 0, substance)
+  const substanceMoveDown = (index: number) => () => {
+    const mySubstance = editedSubstances.value[index]
+    const myPrevious = editedSubstances.value[index + 1]
+
+    setEditedSubstances(
+      editedSubstances.value.map((substance, myIndex) => {
+        if (myIndex === index) {
+          return myPrevious
+        } else if (myIndex === index + 1) {
+          return mySubstance
+        }
+
+        return substance
+      })
+    )
   }
 
-  const substanceMoveUp = (index: number): void => {
-    const substance = substanceRemove(index)
-    props.substances.splice(index - 1, 0, substance)
+  const substanceMoveUp = (index: number) => () => {
+    const mySubstance = editedSubstances.value[index]
+    const myPrevious = editedSubstances.value[index - 1]
+
+    setEditedSubstances(
+      editedSubstances.value.map((substance, myIndex) => {
+        if (myIndex === index) {
+          return myPrevious
+        } else if (myIndex === index - 1) {
+          return mySubstance
+        }
+
+        return substance
+      })
+    )
+  }
+
+  const substanceUpdate = (index: number) => (id: SubstanceLegaleId | null) => {
+    if (id !== null) {
+      setEditedSubstances(
+        editedSubstances.value.map((substance, myIndex) => {
+          if (myIndex === index) {
+            return id
+          }
+
+          return substance
+        })
+      )
+    }
   }
 
   return () => (
     <div>
-      <h3 class="mb-s">Substances</h3>
+      <h6>Substances</h6>
       <HeritageEdit
-        prop={props.heritageProps.substances}
+        prop={heritageActif.value}
         propId="substances"
+        hasHeritage={isNotNullNorUndefinedNorEmpty(heritageActif.value.etape?.substances)}
         write={() => (
-          <>
-            {props.substances.map((_substance, n) => (
-              <div key={n}>
-                <div class="flex mb-s">
-                  <select v-model={props.substances[n]} class="p-s mr-s">
-                    {substancesByDomaine.value.map(s => (
-                      <option key={s.id} value={s.id} disabled={props.substances.some(substanceId => substanceId === s.id)}>
-                        {s.nom}
-                      </option>
-                    ))}
-                  </select>
+          <div style={{ display: 'flex', flexDirection: 'column' }}>
+            {editedSubstances.value.map((substance, n) => (
+              <div key={substance ?? ''}>
+                <div style={{ display: 'flex' }} class="fr-mt-2w">
+                  <SubstanceLegaleTypeahead
+                    initialValue={substance}
+                    substanceLegaleIds={isNotNullNorUndefined(substance) ? [...substancesToDisplay.value, substance] : substancesToDisplay.value}
+                    substanceLegaleSelected={substanceUpdate(n)}
+                  />
                   {substancesLength.value && n + 1 < substancesLength.value ? (
-                    <ButtonIcon class="btn-border py-s px-m rnd-l-xs" onClick={() => substanceMoveDown(n)} title="Diminuer l’importance de la substance" icon="move-down" />
+                    <DsfrButtonIcon
+                      onClick={substanceMoveDown(n)}
+                      title={`Diminuer l’importance de la substance ${isNotNullNorUndefined(substance) ? SubstancesLegale[substance].nom : ''}`}
+                      buttonType="secondary"
+                      class="fr-ml-2w"
+                      icon="fr-icon-arrow-down-fill"
+                    />
                   ) : null}
 
-                  {substancesLength.value && n > 0 && props.substances[n] ? (
-                    <ButtonIcon
-                      class={['btn-border', 'py-s', 'px-m', !(substancesLength.value && n + 1 < substancesLength.value) ? 'rnd-l-xs' : null]}
-                      onClick={() => substanceMoveUp(n)}
-                      title="Augmenter l’importance de la substances"
-                      icon="move-up"
+                  {substancesLength.value && n > 0 && isNotNullNorUndefined(substance) ? (
+                    <DsfrButtonIcon
+                      onClick={substanceMoveUp(n)}
+                      title={`Augmenter l’importance de la substance ${SubstancesLegale[substance].nom}`}
+                      buttonType="secondary"
+                      icon="fr-icon-arrow-up-fill"
+                      class="fr-ml-2w"
                     />
                   ) : null}
 
-                  <ButtonIcon
-                    class={['btn', 'py-s', 'px-m', 'rnd-r-xs', !props.substances[n] || substancesLength.value === 1 ? 'rnd-l-xs' : null]}
-                    onClick={() => substanceRemove(n)}
-                    title="Supprimer la substance"
-                    icon="minus"
+                  <DsfrButtonIcon
+                    onClick={substanceRemove(n)}
+                    title={`Supprimer la substance ${isNotNullNorUndefined(substance) ? SubstancesLegale[substance].nom : ''}`}
+                    buttonType="secondary"
+                    icon="fr-icon-delete-bin-line"
+                    class="fr-ml-2w"
                   />
                 </div>
               </div>
             ))}
 
-            {props.substances?.every(substanceId => !!substanceId) ? (
-              <Button
-                class="btn small rnd-xs py-s px-m full-x flex mb-s"
-                onClick={substanceAdd}
-                title="Ajouter une substance"
-                render={() => (
-                  <>
-                    <span class="mt-xxs">Ajouter une substance</span>
-                    <Icon name="plus" size="M" class="flex-right" aria-hidden="true" />
-                  </>
-                )}
-              />
+            {editedSubstances.value.every(substanceId => isNotNullNorUndefined(substanceId)) ? (
+              <DsfrButtonIcon onClick={substanceAdd} buttonType="primary" icon="fr-icon-add-line" title="Ajouter une substance" class="fr-mt-2w" style={{ alignSelf: 'end' }} />
             ) : null}
+          </div>
+        )}
+        read={() => (
+          <>
+            {substanceNoms.value.map(sub => (
+              <DsfrTag class="fr-mr-1w" ariaLabel={capitalize(sub)} />
+            ))}
           </>
         )}
-        read={() => <TagList class="mb-s" elements={substanceNoms.value} />}
+        updateHeritage={updateHeritage}
       />
     </div>
   )
diff --git a/packages/ui/src/components/etape/type-edit.stories.tsx b/packages/ui/src/components/etape/type-edit.stories.tsx
index 96a985155242bc618bd5c2fc0ec9220d61dc0d27..93e05e15b2a5197f440fed6d2010ac56287671b0 100644
--- a/packages/ui/src/components/etape/type-edit.stories.tsx
+++ b/packages/ui/src/components/etape/type-edit.stories.tsx
@@ -10,6 +10,7 @@ import { EtapeApiClient } from './etape-api-client'
 const meta: Meta = {
   title: 'Components/Etape/TypeEdit',
   component: TypeEdit,
+  decorators: [() => ({ template: '<div class="dsfr"><story/></div>' })],
 }
 export default meta
 
@@ -25,16 +26,15 @@ const apiClientMock: Pick<EtapeApiClient, 'getEtapesTypesEtapesStatuts'> = {
     ])
   },
 }
-// TODO 2023-01-09: changer la notion de etapeIsDemandeEnConstruction qui devrait être géree par le composant type-edit directement
 export const Simple: StoryFn = () => (
   <TypeEdit
     onEtapeChange={onEtapeChange}
-    etapeDate={toCaminoDate('2022-01-01')}
     demarcheId={demarcheIdValidator.parse('demarcheID')}
     apiClient={apiClientMock}
     etape={{
       statutId: ETAPES_STATUTS.FAIT,
       typeId: ETAPES_TYPES.demande,
+      date: toCaminoDate('2022-01-01'),
     }}
   />
 )
@@ -42,12 +42,12 @@ export const Simple: StoryFn = () => (
 export const DemandeAvecUnSeulStatut: StoryFn = () => (
   <TypeEdit
     onEtapeChange={onEtapeChange}
-    etapeDate={toCaminoDate('2022-01-01')}
     apiClient={apiClientMock}
     demarcheId={demarcheIdValidator.parse('demarcheID')}
     etape={{
       statutId: null,
       typeId: ETAPES_TYPES.classementSansSuite,
+      date: toCaminoDate('2022-01-01'),
     }}
   />
 )
@@ -55,12 +55,12 @@ export const DemandeAvecUnSeulStatut: StoryFn = () => (
 export const DemandeSansStatut: StoryFn = () => (
   <TypeEdit
     onEtapeChange={onEtapeChange}
-    etapeDate={toCaminoDate('2022-01-01')}
     apiClient={apiClientMock}
     demarcheId={demarcheIdValidator.parse('demarcheID')}
     etape={{
       statutId: null,
       typeId: ETAPES_TYPES.demande,
+      date: toCaminoDate('2022-01-01'),
     }}
   />
 )
@@ -68,12 +68,12 @@ export const DemandeSansStatut: StoryFn = () => (
 export const DemandeEnConstruction: StoryFn = () => (
   <TypeEdit
     onEtapeChange={onEtapeChange}
-    etapeDate={toCaminoDate('2022-01-01')}
     apiClient={apiClientMock}
     demarcheId={demarcheIdValidator.parse('demarcheID')}
     etape={{
       statutId: ETAPES_STATUTS.EN_CONSTRUCTION,
       typeId: ETAPES_TYPES.demande,
+      date: toCaminoDate('2022-01-01'),
     }}
   />
 )
@@ -81,12 +81,12 @@ export const DemandeEnConstruction: StoryFn = () => (
 export const NouvelleDemande: StoryFn = () => (
   <TypeEdit
     onEtapeChange={onEtapeChange}
-    etapeDate={toCaminoDate('2022-01-01')}
     apiClient={apiClientMock}
     demarcheId={demarcheIdValidator.parse('demarcheID')}
     etape={{
       statutId: null,
       typeId: null,
+      date: toCaminoDate('2022-01-01'),
     }}
   />
 )
@@ -94,7 +94,6 @@ export const NouvelleDemande: StoryFn = () => (
 export const Empty: StoryFn = () => (
   <TypeEdit
     onEtapeChange={onEtapeChange}
-    etapeDate={toCaminoDate('2022-01-01')}
     apiClient={{
       getEtapesTypesEtapesStatuts: () => {
         return Promise.resolve([])
@@ -104,6 +103,7 @@ export const Empty: StoryFn = () => (
     etape={{
       statutId: null,
       typeId: null,
+      date: toCaminoDate('2022-01-01'),
     }}
   />
 )
@@ -111,7 +111,6 @@ export const Empty: StoryFn = () => (
 export const NoEtape: StoryFn = () => (
   <TypeEdit
     onEtapeChange={onEtapeChange}
-    etapeDate={toCaminoDate('2022-01-01')}
     apiClient={{
       getEtapesTypesEtapesStatuts: () => {
         return Promise.resolve([])
@@ -121,6 +120,7 @@ export const NoEtape: StoryFn = () => (
     etape={{
       statutId: null,
       typeId: 'mfr',
+      date: toCaminoDate('2022-01-01'),
     }}
   />
 )
@@ -128,7 +128,6 @@ export const NoEtape: StoryFn = () => (
 export const SelectedEtapeNotPossible: StoryFn = () => (
   <TypeEdit
     onEtapeChange={onEtapeChange}
-    etapeDate={toCaminoDate('2022-01-01')}
     apiClient={{
       getEtapesTypesEtapesStatuts: () => {
         return Promise.resolve([{ etapeTypeId: 'mcd', etapeStatutId: 'fai', mainStep: false }])
@@ -138,6 +137,7 @@ export const SelectedEtapeNotPossible: StoryFn = () => (
     etape={{
       statutId: null,
       typeId: 'mfr',
+      date: toCaminoDate('2022-01-01'),
     }}
   />
 )
@@ -145,12 +145,12 @@ export const SelectedEtapeNotPossible: StoryFn = () => (
 export const Loading: StoryFn = () => (
   <TypeEdit
     onEtapeChange={onEtapeChange}
-    etapeDate={toCaminoDate('2022-01-01')}
     apiClient={{ getEtapesTypesEtapesStatuts: () => new Promise(() => ({})) }}
     demarcheId={demarcheIdValidator.parse('demarcheID')}
     etape={{
       statutId: null,
       typeId: null,
+      date: toCaminoDate('2022-01-01'),
     }}
   />
 )
@@ -158,12 +158,12 @@ export const Loading: StoryFn = () => (
 export const WithError: StoryFn = () => (
   <TypeEdit
     onEtapeChange={onEtapeChange}
-    etapeDate={toCaminoDate('2022-01-01')}
     apiClient={{ getEtapesTypesEtapesStatuts: () => Promise.reject(new Error('Cassé')) }}
     demarcheId={demarcheIdValidator.parse('demarcheID')}
     etape={{
       statutId: null,
       typeId: null,
+      date: toCaminoDate('2022-01-01'),
     }}
   />
 )
diff --git a/packages/ui/src/components/etape/type-edit.stories_snapshots_DemandeAvecUnSeulStatut.html b/packages/ui/src/components/etape/type-edit.stories_snapshots_DemandeAvecUnSeulStatut.html
index 0f0eb24c8b379bb0cf7be4728ea628288e319157..3fb23c1be1a21d1c98e6d325ae09f8f101879480 100644
--- a/packages/ui/src/components/etape/type-edit.stories_snapshots_DemandeAvecUnSeulStatut.html
+++ b/packages/ui/src/components/etape/type-edit.stories_snapshots_DemandeAvecUnSeulStatut.html
@@ -1,22 +1,16 @@
-<div class="tablet-blobs">
-  <div class="tablet-blob-1-3 tablet-pt-s pb-s">
-    <h5>Type</h5>
-  </div>
-  <div class="mb tablet-blob-2-3">
-    <div id="select-etape-type_wrapper" class="_typeahead_8eddf1 dsfr">
-      <div class="flex"><input id="select-etape-type" type="text" name="select-etape-type" disabled="" class="_typeahead-input_8eddf1 fr-input" placeholder="" autocomplete="off"></div>
-      <!---->
-    </div>
-  </div>
-</div>
-<div>
-  <div class="tablet-blobs">
-    <div class="tablet-blob-1-3 tablet-pt-s pb-s">
-      <h5>Statut</h5>
+<div class="dsfr">
+  <div>
+    <div class="fr-input-group"><label class="fr-label fr-mb-1w" for="select-etape-type">Type *</label>
+      <div id="select-etape-type_wrapper" class="_typeahead_8eddf1 dsfr">
+        <div class="flex"><input id="select-etape-type" type="text" name="select-etape-type" disabled="" class="_typeahead-input_8eddf1 fr-input" placeholder="" autocomplete="off"></div>
+        <!---->
+      </div>
     </div>
-    <div class="mb tablet-blob-2-3"><select class="p-s">
+    <div class="fr-select-group"><label class="fr-label" for="select-etape-statut-id">Statut *
         <!---->
+      </label><select class="fr-select" id="select-etape-statut-id" aria-label="Statut" name="select-etape-statut-id">
         <option value="fai">fait</option>
+        <option disabled="" hidden="" value="">Selectionnez une option</option>
       </select></div>
   </div>
 </div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/type-edit.stories_snapshots_DemandeEnConstruction.html b/packages/ui/src/components/etape/type-edit.stories_snapshots_DemandeEnConstruction.html
index 14f172c38679d232bd9a3c68f15c22365b99f63c..34990b83f519ec3f496dc31a32e968487b7fed83 100644
--- a/packages/ui/src/components/etape/type-edit.stories_snapshots_DemandeEnConstruction.html
+++ b/packages/ui/src/components/etape/type-edit.stories_snapshots_DemandeEnConstruction.html
@@ -1,11 +1,11 @@
-<div class="tablet-blobs">
-  <div class="tablet-blob-1-3 tablet-pt-s pb-s">
-    <h5>Type</h5>
-  </div>
-  <div class="mb tablet-blob-2-3">
-    <div id="select-etape-type_wrapper" class="_typeahead_8eddf1 dsfr">
-      <div class="flex"><input id="select-etape-type" type="text" name="select-etape-type" disabled="" class="_typeahead-input_8eddf1 fr-input" placeholder="" autocomplete="off"></div>
-      <!---->
+<div class="dsfr">
+  <div>
+    <div class="fr-input-group"><label class="fr-label fr-mb-1w" for="select-etape-type">Type *</label>
+      <div id="select-etape-type_wrapper" class="_typeahead_8eddf1 dsfr">
+        <div class="flex"><input id="select-etape-type" type="text" name="select-etape-type" disabled="" class="_typeahead-input_8eddf1 fr-input" placeholder="" autocomplete="off"></div>
+        <!---->
+      </div>
     </div>
+    <!---->
   </div>
 </div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/type-edit.stories_snapshots_DemandeSansStatut.html b/packages/ui/src/components/etape/type-edit.stories_snapshots_DemandeSansStatut.html
index e9c51140ee4e3b22ada304b80fe8fadcb97634c8..62f1901132afcd3244afd8e7a0bbf7f874508de9 100644
--- a/packages/ui/src/components/etape/type-edit.stories_snapshots_DemandeSansStatut.html
+++ b/packages/ui/src/components/etape/type-edit.stories_snapshots_DemandeSansStatut.html
@@ -1,23 +1,17 @@
-<div class="tablet-blobs">
-  <div class="tablet-blob-1-3 tablet-pt-s pb-s">
-    <h5>Type</h5>
-  </div>
-  <div class="mb tablet-blob-2-3">
-    <div id="select-etape-type_wrapper" class="_typeahead_8eddf1 dsfr">
-      <div class="flex"><input id="select-etape-type" type="text" name="select-etape-type" disabled="" class="_typeahead-input_8eddf1 fr-input" placeholder="" autocomplete="off"></div>
-      <!---->
-    </div>
-  </div>
-</div>
-<div>
-  <div class="tablet-blobs">
-    <div class="tablet-blob-1-3 tablet-pt-s pb-s">
-      <h5>Statut</h5>
+<div class="dsfr">
+  <div>
+    <div class="fr-input-group"><label class="fr-label fr-mb-1w" for="select-etape-type">Type *</label>
+      <div id="select-etape-type_wrapper" class="_typeahead_8eddf1 dsfr">
+        <div class="flex"><input id="select-etape-type" type="text" name="select-etape-type" disabled="" class="_typeahead-input_8eddf1 fr-input" placeholder="" autocomplete="off"></div>
+        <!---->
+      </div>
     </div>
-    <div class="mb tablet-blob-2-3"><select class="p-s">
-        <option></option>
+    <div class="fr-select-group"><label class="fr-label" for="select-etape-statut-id">Statut *
+        <!---->
+      </label><select class="fr-select" id="select-etape-statut-id" aria-label="Statut" name="select-etape-statut-id">
         <option value="fai">fait</option>
         <option value="aco">en construction</option>
+        <option disabled="" hidden="" value="">Selectionnez une option</option>
       </select></div>
   </div>
 </div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/type-edit.stories_snapshots_Empty.html b/packages/ui/src/components/etape/type-edit.stories_snapshots_Empty.html
index f2c3799e9be1124546e2716baec81c99f1fd6ecc..49aba7287eb82ebab110d233c3dde35f1ea46b5d 100644
--- a/packages/ui/src/components/etape/type-edit.stories_snapshots_Empty.html
+++ b/packages/ui/src/components/etape/type-edit.stories_snapshots_Empty.html
@@ -1,8 +1,5 @@
-<div class="dsfr tablet-blobs">
-  <div class="tablet-blob-1-3"></div>
-  <div class="mb tablet-blob-2-3">
-    <div class="fr-alert fr-alert--warning">
-      <h3 class="fr-alert__title">Il n’y a aucune étape possible à cette date.</h3>Veuillez modifier la date pour pouvoir choisir une étape.
-    </div>
+<div class="dsfr">
+  <div class="fr-alert fr-alert--warning fr-mt-2w">
+    <h3 class="fr-alert__title">Il n’y a aucune étape possible à cette date.</h3>Veuillez modifier la date pour pouvoir choisir une étape.
   </div>
 </div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/type-edit.stories_snapshots_Loading.html b/packages/ui/src/components/etape/type-edit.stories_snapshots_Loading.html
index 285c4a7bdef28476721ac63ae939fce06668ca8c..6594af26495953ec894f7e2e34367c7a711f0598 100644
--- a/packages/ui/src/components/etape/type-edit.stories_snapshots_Loading.html
+++ b/packages/ui/src/components/etape/type-edit.stories_snapshots_Loading.html
@@ -1,4 +1,6 @@
-<div class="_top-level_3306d0" style="display: flex; justify-content: center;">
-  <!---->
-  <div class="_spinner_3306d0"></div>
+<div class="dsfr">
+  <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
+    <!---->
+    <div class="_spinner_3306d0"></div>
+  </div>
 </div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/type-edit.stories_snapshots_NoEtape.html b/packages/ui/src/components/etape/type-edit.stories_snapshots_NoEtape.html
index d5eb357bead8d6ef903952cfbac04672c4bdd567..a0bcfedc61e37446d4245928ab664b5c057ff98a 100644
--- a/packages/ui/src/components/etape/type-edit.stories_snapshots_NoEtape.html
+++ b/packages/ui/src/components/etape/type-edit.stories_snapshots_NoEtape.html
@@ -1,8 +1,5 @@
-<div class="dsfr tablet-blobs">
-  <div class="tablet-blob-1-3"></div>
-  <div class="mb tablet-blob-2-3">
-    <div class="fr-alert fr-alert--warning">
-      <h3 class="fr-alert__title">L'étape demande n'est pas possible à cette date</h3>Veuillez modifier la date pour pouvoir choisir une étape.
-    </div>
+<div class="dsfr">
+  <div class="fr-alert fr-alert--warning fr-mt-2w">
+    <h3 class="fr-alert__title">L'étape demande n'est pas possible à cette date</h3>Veuillez modifier la date pour pouvoir choisir une étape.
   </div>
 </div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/type-edit.stories_snapshots_NouvelleDemande.html b/packages/ui/src/components/etape/type-edit.stories_snapshots_NouvelleDemande.html
index 43fa713638ab560986ad09ff4a57228a416d9532..3c0734249935f2fb04bfa13b5adbeaf178c27149 100644
--- a/packages/ui/src/components/etape/type-edit.stories_snapshots_NouvelleDemande.html
+++ b/packages/ui/src/components/etape/type-edit.stories_snapshots_NouvelleDemande.html
@@ -1,11 +1,11 @@
-<div class="tablet-blobs">
-  <div class="tablet-blob-1-3 tablet-pt-s pb-s">
-    <h5>Type</h5>
-  </div>
-  <div class="mb tablet-blob-2-3">
-    <div id="select-etape-type_wrapper" class="_typeahead_8eddf1 dsfr">
-      <div class="flex"><input id="select-etape-type" type="text" name="select-etape-type" class="_typeahead-input_8eddf1 fr-input" placeholder="" autocomplete="off"></div>
-      <!---->
+<div class="dsfr">
+  <div>
+    <div class="fr-input-group"><label class="fr-label fr-mb-1w" for="select-etape-type">Type *</label>
+      <div id="select-etape-type_wrapper" class="_typeahead_8eddf1 dsfr">
+        <div class="flex"><input id="select-etape-type" type="text" name="select-etape-type" class="_typeahead-input_8eddf1 fr-input" placeholder="" autocomplete="off"></div>
+        <!---->
+      </div>
     </div>
+    <!---->
   </div>
 </div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/type-edit.stories_snapshots_SelectedEtapeNotPossible.html b/packages/ui/src/components/etape/type-edit.stories_snapshots_SelectedEtapeNotPossible.html
index d5eb357bead8d6ef903952cfbac04672c4bdd567..a0bcfedc61e37446d4245928ab664b5c057ff98a 100644
--- a/packages/ui/src/components/etape/type-edit.stories_snapshots_SelectedEtapeNotPossible.html
+++ b/packages/ui/src/components/etape/type-edit.stories_snapshots_SelectedEtapeNotPossible.html
@@ -1,8 +1,5 @@
-<div class="dsfr tablet-blobs">
-  <div class="tablet-blob-1-3"></div>
-  <div class="mb tablet-blob-2-3">
-    <div class="fr-alert fr-alert--warning">
-      <h3 class="fr-alert__title">L'étape demande n'est pas possible à cette date</h3>Veuillez modifier la date pour pouvoir choisir une étape.
-    </div>
+<div class="dsfr">
+  <div class="fr-alert fr-alert--warning fr-mt-2w">
+    <h3 class="fr-alert__title">L'étape demande n'est pas possible à cette date</h3>Veuillez modifier la date pour pouvoir choisir une étape.
   </div>
 </div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/type-edit.stories_snapshots_Simple.html b/packages/ui/src/components/etape/type-edit.stories_snapshots_Simple.html
index 89be386b2a1e52bc26d2373f97ebecfbc80a369d..fc807bcfcd2a38d509641586911f50acd5090c94 100644
--- a/packages/ui/src/components/etape/type-edit.stories_snapshots_Simple.html
+++ b/packages/ui/src/components/etape/type-edit.stories_snapshots_Simple.html
@@ -1,23 +1,17 @@
-<div class="tablet-blobs">
-  <div class="tablet-blob-1-3 tablet-pt-s pb-s">
-    <h5>Type</h5>
-  </div>
-  <div class="mb tablet-blob-2-3">
-    <div id="select-etape-type_wrapper" class="_typeahead_8eddf1 dsfr">
-      <div class="flex"><input id="select-etape-type" type="text" name="select-etape-type" disabled="" class="_typeahead-input_8eddf1 fr-input" placeholder="" autocomplete="off"></div>
-      <!---->
-    </div>
-  </div>
-</div>
-<div>
-  <div class="tablet-blobs">
-    <div class="tablet-blob-1-3 tablet-pt-s pb-s">
-      <h5>Statut</h5>
+<div class="dsfr">
+  <div>
+    <div class="fr-input-group"><label class="fr-label fr-mb-1w" for="select-etape-type">Type *</label>
+      <div id="select-etape-type_wrapper" class="_typeahead_8eddf1 dsfr">
+        <div class="flex"><input id="select-etape-type" type="text" name="select-etape-type" disabled="" class="_typeahead-input_8eddf1 fr-input" placeholder="" autocomplete="off"></div>
+        <!---->
+      </div>
     </div>
-    <div class="mb tablet-blob-2-3"><select class="p-s">
+    <div class="fr-select-group"><label class="fr-label" for="select-etape-statut-id">Statut *
         <!---->
+      </label><select class="fr-select" id="select-etape-statut-id" aria-label="Statut" name="select-etape-statut-id">
         <option disabled="" value="fai">fait</option>
         <option value="aco">en construction</option>
+        <option disabled="" hidden="" value="">Selectionnez une option</option>
       </select></div>
   </div>
 </div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/type-edit.stories_snapshots_WithError.html b/packages/ui/src/components/etape/type-edit.stories_snapshots_WithError.html
index 600823e81d3bc1c98dd870af20ae08192fcf32ac..2fe8f6e9df8404e56773e6a03a91fa5a518ed92c 100644
--- a/packages/ui/src/components/etape/type-edit.stories_snapshots_WithError.html
+++ b/packages/ui/src/components/etape/type-edit.stories_snapshots_WithError.html
@@ -1,10 +1,12 @@
-<div class="" style="display: flex; justify-content: center;">
-  <div>
-    <div class="_tooltip_4f6ea8">
-      <h6 class="_tooltip-content_4f6ea8">Cassé</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
-        <use href="#icon-error-warning"></use>
-      </svg>
+<div class="dsfr">
+  <div class=" undefined" style="display: flex; justify-content: center;">
+    <div>
+      <div class="_tooltip_4f6ea8">
+        <h6 class="_tooltip-content_4f6ea8">Cassé</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
+          <use href="#icon-error-warning"></use>
+        </svg>
+      </div>
     </div>
+    <!---->
   </div>
-  <!---->
 </div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/type-edit.tsx b/packages/ui/src/components/etape/type-edit.tsx
index aeef0e31b5597f4aab8e090f5cde0780d51973db..8c6319e0c5e8ab34c85b34e45d1d3ab48f6c84e4 100644
--- a/packages/ui/src/components/etape/type-edit.tsx
+++ b/packages/ui/src/components/etape/type-edit.tsx
@@ -1,64 +1,45 @@
-import { EtapesStatuts, EtapeStatutId, ETAPES_STATUTS, isStatut } from 'camino-common/src/static/etapesStatuts'
+import { EtapesStatuts, EtapeStatutId, ETAPES_STATUTS } from 'camino-common/src/static/etapesStatuts'
 import { EtapesTypes, ETAPES_TYPES, EtapeType, EtapeTypeId } from 'camino-common/src/static/etapesTypes'
-import { computed, ref, FunctionalComponent, watch } from 'vue'
-import { caminoDefineComponent, isEventWithTarget } from '@/utils/vue-tsx-utils'
+import { computed, ref, FunctionalComponent, watch, HTMLAttributes } from 'vue'
+import { caminoDefineComponent } from '@/utils/vue-tsx-utils'
 import { DemarcheId } from 'camino-common/src/demarche'
 import { EtapeApiClient } from './etape-api-client'
 import { CaminoDate } from 'camino-common/src/date'
 import { EtapeId, EtapeTypeEtapeStatutWithMainStep } from 'camino-common/src/etape'
 import { AsyncData } from '@/api/client-rest'
 import { LoadingElement } from '../_ui/functional-loader'
-import { isNotNullNorUndefined, isNullOrUndefinedOrEmpty, onlyUnique } from 'camino-common/src/typescript-tools'
+import { NonEmptyArray, isNonEmptyArray, isNotNullNorUndefined, isNullOrUndefinedOrEmpty, map, onlyUnique } from 'camino-common/src/typescript-tools'
 import { Alert } from '../_ui/alert'
 import { TypeAheadSingle } from '../_ui/typeahead-single'
+import { DsfrSelect, Item } from '../_ui/dsfr-select'
 
 type Props = {
   etape: {
     statutId: EtapeStatutId | null
     typeId: EtapeTypeId | null
     id?: EtapeId | null
+    date: CaminoDate
   }
-  etapeDate: CaminoDate
   demarcheId: DemarcheId
   apiClient: Pick<EtapeApiClient, 'getEtapesTypesEtapesStatuts'>
   onEtapeChange: (statutId: EtapeStatutId | null, typeId: EtapeTypeId | null) => void
-}
+} & Pick<HTMLAttributes, 'class'>
 
 interface SelectStatutProps {
   statutId: EtapeStatutId | null
-  statutIds: EtapeStatutId[]
+  statutIds: NonEmptyArray<EtapeStatutId>
   onStatutChange: (statutId: EtapeStatutId | null) => void
 }
 
-const SelectStatut: FunctionalComponent<SelectStatutProps> = (props: SelectStatutProps): JSX.Element => {
-  const etapeStatutIdSelected: EtapeStatutId | null = props.statutId
+const SelectStatut: FunctionalComponent<SelectStatutProps> = (props: SelectStatutProps): JSX.Element | null => {
+  const items: NonEmptyArray<Item<EtapeStatutId>> = map(props.statutIds, statutId => ({ id: statutId, label: EtapesStatuts[statutId].nom, disabled: props.statutId === statutId }))
 
-  return (
-    <div>
-      <div class="tablet-blobs">
-        <div class="tablet-blob-1-3 tablet-pt-s pb-s">
-          <h5>Statut</h5>
-        </div>
-        <div class="mb tablet-blob-2-3">
-          <select onChange={event => props.onStatutChange(isEventWithTarget(event) && isStatut(event.target.value) ? event.target.value : null)} class="p-s">
-            {props.statutIds.length > 1 && etapeStatutIdSelected === null ? <option value={null} selected={true}></option> : null}
-            {props.statutIds.map(etapeStatutId => {
-              const etapeStatut = EtapesStatuts[etapeStatutId]
+  const initialValue = isNotNullNorUndefined(props.statutId) ? props.statutId : props.statutIds.length === 1 ? props.statutIds[0] : null
 
-              return (
-                <option key={etapeStatut.id} value={etapeStatut.id} selected={etapeStatutIdSelected === etapeStatut.id} disabled={etapeStatutIdSelected === etapeStatut.id}>
-                  {etapeStatut.nom}
-                </option>
-              )
-            })}
-          </select>
-        </div>
-      </div>
-    </div>
-  )
+  return <DsfrSelect initialValue={initialValue} items={items} legend={{ main: 'Statut' }} required={true} id="select-etape-statut-id" valueChanged={props.onStatutChange} />
 }
 
-export const TypeEdit = caminoDefineComponent<Props>(['etape', 'etapeDate', 'demarcheId', 'apiClient', 'onEtapeChange'], props => {
+export const TypeEdit = caminoDefineComponent<Props>(['etape', 'apiClient', 'onEtapeChange', 'demarcheId', 'class'], props => {
   const etapeTypeSearch = ref<string>('')
   const etapeTypeId = ref<EtapeTypeId | null>(props.etape.typeId ?? null)
   const etapeStatutId = ref<EtapeStatutId | null>(props.etape.statutId)
@@ -66,7 +47,7 @@ export const TypeEdit = caminoDefineComponent<Props>(['etape', 'etapeDate', 'dem
   const possibleEtapes = ref<AsyncData<EtapeTypeEtapeStatutWithMainStep[]>>({ status: 'LOADING' })
   const possibleStatuts = ref<EtapeStatutId[]>([])
   watch(
-    () => props.etapeDate,
+    () => props.etape.date,
     async newEtapeDate => {
       try {
         possibleEtapes.value = { status: 'LOADED', value: await props.apiClient.getEtapesTypesEtapesStatuts(props.demarcheId, props.etape?.id ?? null, newEtapeDate) }
@@ -110,54 +91,52 @@ export const TypeEdit = caminoDefineComponent<Props>(['etape', 'etapeDate', 'dem
 
   return () => (
     <LoadingElement
+      class={props.class}
       data={possibleEtapes.value}
       renderItem={items => (
         <>
           {noItemsText.value === null ? (
-            <>
-              <div class="tablet-blobs">
-                <div class="tablet-blob-1-3 tablet-pt-s pb-s">
-                  <h5>Type</h5>
-                </div>
-                <div class="mb tablet-blob-2-3">
-                  <TypeAheadSingle
-                    overrideItem={etapeTypeExistante.value}
-                    disabled={isNotNullNorUndefined(props.etape.typeId)}
-                    props={{
-                      id: 'select-etape-type',
-                      placeholder: '',
-                      items: [...items]
-                        .sort((a, _b) => (a.mainStep ? -1 : 1))
-                        .map(({ etapeTypeId }) => EtapesTypes[etapeTypeId])
-                        .filter(({ nom }) => {
-                          return nom.toLowerCase().includes(etapeTypeSearch.value)
-                        })
-                        .filter(onlyUnique),
-                      minInputLength: 0,
-                      itemKey: 'id',
-                      itemChipLabel: item => item.nom,
-                      displayItemInList: item => displayItemInList(item, items),
-                      onSelectItem: (type: EtapeType | undefined) => {
-                        if (type) {
-                          etapeTypeSearch.value = ''
-                          possibleStatuts.value = items.filter(({ etapeTypeId }) => etapeTypeId === type.id).map(({ etapeStatutId }) => etapeStatutId)
-                          if (possibleStatuts.value.length === 1) {
-                            etapeStatutId.value = possibleStatuts.value[0]
-                          } else {
-                            etapeStatutId.value = null
-                          }
-
-                          etapeTypeId.value = type.id
-                          props.onEtapeChange(etapeStatutId.value, etapeTypeId.value)
+            <div class={props.class}>
+              <div class="fr-input-group">
+                <label class="fr-label fr-mb-1w" for="select-etape-type">
+                  Type *
+                </label>
+                <TypeAheadSingle
+                  overrideItem={etapeTypeExistante.value}
+                  disabled={isNotNullNorUndefined(etapeTypeId.value)}
+                  props={{
+                    id: 'select-etape-type',
+                    placeholder: '',
+                    items: [...items]
+                      .sort((a, _b) => (a.mainStep ? -1 : 1))
+                      .map(({ etapeTypeId }) => EtapesTypes[etapeTypeId])
+                      .filter(({ nom }) => {
+                        return nom.toLowerCase().includes(etapeTypeSearch.value)
+                      })
+                      .filter(onlyUnique),
+                    minInputLength: 0,
+                    itemKey: 'id',
+                    itemChipLabel: item => item.nom,
+                    displayItemInList: item => displayItemInList(item, items),
+                    onSelectItem: (type: EtapeType | undefined) => {
+                      if (type) {
+                        etapeTypeSearch.value = ''
+                        possibleStatuts.value = items.filter(({ etapeTypeId }) => etapeTypeId === type.id).map(({ etapeStatutId }) => etapeStatutId)
+                        if (possibleStatuts.value.length === 1) {
+                          etapeStatutId.value = possibleStatuts.value[0]
+                        } else {
+                          etapeStatutId.value = null
                         }
-                      },
-                      onInput: (searchTerm: string) => (etapeTypeSearch.value = searchTerm),
-                    }}
-                  />
-                </div>
-              </div>
 
-              {(etapeTypeId.value === ETAPES_TYPES.demande && etapeStatutId.value === ETAPES_STATUTS.EN_CONSTRUCTION) || possibleStatuts.value.length === 0 ? null : (
+                        etapeTypeId.value = type.id
+                        props.onEtapeChange(etapeStatutId.value, etapeTypeId.value)
+                      }
+                    },
+                    onInput: (searchTerm: string) => (etapeTypeSearch.value = searchTerm),
+                  }}
+                />
+              </div>
+              {(etapeTypeId.value === ETAPES_TYPES.demande && etapeStatutId.value === ETAPES_STATUTS.EN_CONSTRUCTION) || !isNonEmptyArray(possibleStatuts.value) ? null : (
                 <SelectStatut
                   statutIds={possibleStatuts.value}
                   statutId={etapeStatutId.value}
@@ -167,14 +146,9 @@ export const TypeEdit = caminoDefineComponent<Props>(['etape', 'etapeDate', 'dem
                   }}
                 />
               )}
-            </>
-          ) : (
-            <div class="dsfr tablet-blobs">
-              <div class="tablet-blob-1-3"></div>
-              <div class="mb tablet-blob-2-3">
-                <Alert type="warning" title={noItemsText.value} description="Veuillez modifier la date pour pouvoir choisir une étape." />
-              </div>
             </div>
+          ) : (
+            <Alert type="warning" class="fr-mt-2w" title={noItemsText.value} description="Veuillez modifier la date pour pouvoir choisir une étape." />
           )}
         </>
       )}
diff --git a/packages/ui/src/components/journaux.stories_snapshots_Loading.html b/packages/ui/src/components/journaux.stories_snapshots_Loading.html
index 5ba9bbb2bfa0162ff7a9ff4f89863751941c4fa9..a19d90271bba51d2aa6f34a3647ead1f8c0969b9 100644
--- a/packages/ui/src/components/journaux.stories_snapshots_Loading.html
+++ b/packages/ui/src/components/journaux.stories_snapshots_Loading.html
@@ -145,7 +145,7 @@
         </table>
       </div>
     </div>
-    <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+    <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
       <!---->
       <div class="_spinner_3306d0"></div>
     </div>
diff --git a/packages/ui/src/components/journaux.stories_snapshots_WithError.html b/packages/ui/src/components/journaux.stories_snapshots_WithError.html
index 77fe60c4a0d40f045504bd0112bbc53629cca97f..f30daefe232b8ef28c5f3d4250400fb3ef247e5a 100644
--- a/packages/ui/src/components/journaux.stories_snapshots_WithError.html
+++ b/packages/ui/src/components/journaux.stories_snapshots_WithError.html
@@ -145,7 +145,7 @@
         </table>
       </div>
     </div>
-    <div class="" style="display: flex; justify-content: center;">
+    <div class=" undefined" style="display: flex; justify-content: center;">
       <div>
         <div class="_tooltip_4f6ea8">
           <h6 class="_tooltip-content_4f6ea8">erreur</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
diff --git a/packages/ui/src/components/meta.tsx b/packages/ui/src/components/meta.tsx
index c938d8bd128fd0481a02c8446a341c159322f3fd..cbd131a368049faed646878e575d220fa89a03e2 100644
--- a/packages/ui/src/components/meta.tsx
+++ b/packages/ui/src/components/meta.tsx
@@ -35,7 +35,8 @@ export const Meta = defineComponent(() => {
 
   const get = async () => {
     if (!canReadMetas(user)) {
-      await store.dispatch('pageError', user)
+      // TODO 2024-04-16 afficher une jolie alerte dans la page
+      console.error('impossible d’accéder à cette page')
     } else {
       await store.dispatch('meta/get', id.value)
     }
diff --git a/packages/ui/src/components/statistiques/granulats-marins.stories_snapshots_Loading.html b/packages/ui/src/components/statistiques/granulats-marins.stories_snapshots_Loading.html
index a2c1b3a839a61f59505dc64ff2a0a104340c7cbc..bbabbc0dd84b0c3cb1295a4da0928a5796a8277a 100644
--- a/packages/ui/src/components/statistiques/granulats-marins.stories_snapshots_Loading.html
+++ b/packages/ui/src/components/statistiques/granulats-marins.stories_snapshots_Loading.html
@@ -10,12 +10,12 @@
         <div class="tablet-blobs">
           <div class="tablet-blob-1-3">
             <p class="fr-display--xs _donnee-importante_65867c">
-            <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+            <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
               <!---->
               <div class="_spinner_3306d0"></div>
             </div>
             </p>
-            <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+            <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
               <!---->
               <div class="_spinner_3306d0"></div>
             </div>
@@ -23,7 +23,7 @@
           </div>
           <div class="tablet-blob-1-3">
             <p class="fr-display--xs _donnee-importante_65867c">
-            <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+            <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
               <!---->
               <div class="_spinner_3306d0"></div>
             </div>
@@ -33,7 +33,7 @@
           </div>
           <div class="tablet-blob-1-3">
             <p class="fr-display--xs _donnee-importante_65867c">
-            <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+            <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
               <!---->
               <div class="_spinner_3306d0"></div>
             </div>
@@ -48,12 +48,12 @@
         <div class="tablet-blobs">
           <div class="tablet-blob-1-3">
             <p class="fr-display--xs _donnee-importante_65867c">
-            <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+            <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
               <!---->
               <div class="_spinner_3306d0"></div>
             </div>
             </p>
-            <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+            <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
               <!---->
               <div class="_spinner_3306d0"></div>
             </div>
@@ -61,12 +61,12 @@
           </div>
           <div class="tablet-blob-1-3">
             <p class="fr-display--xs _donnee-importante_65867c">
-            <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+            <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
               <!---->
               <div class="_spinner_3306d0"></div>
             </div>
             </p>
-            <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+            <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
               <!---->
               <div class="_spinner_3306d0"></div>
             </div>
@@ -74,7 +74,7 @@
           </div>
           <div class="tablet-blob-1-3">
             <p class="fr-display--xs _donnee-importante_65867c">
-            <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+            <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
               <!---->
               <div class="_spinner_3306d0"></div>
             </div>
@@ -88,14 +88,14 @@
     <h2>Production annuelle</h2><span class="separator"></span>
     <p class="mb-xl">Données contenues dans la base de données Camino, stabilisées pour l’année n-1.</p>
     <div class="tablet-pt-s pb-s">
-      <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+      <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
         <!---->
         <div class="_spinner_3306d0"></div>
       </div>
     </div>
     <div class="line-neutral width-full mb-xl"></div>
     <h5>Sélectionner une année</h5>
-    <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+    <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
       <!---->
       <div class="_spinner_3306d0"></div>
     </div>
@@ -108,7 +108,7 @@
       <div class="tablet-float-blobs clearfix">
         <div class="tablet-float-blob-1-3 mb-xl mt">
           <p class="fr-display--xs _donnee-importante_65867c">
-          <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+          <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
             <!---->
             <div class="_spinner_3306d0"></div>
           </div>
@@ -116,13 +116,13 @@
           <p>Permis exclusifs de recherches octroyés l’an dernier</p>
         </div>
         <div class="tablet-float-blob-2-3 relative mb-xl">
-          <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+          <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
             <!---->
             <div class="_spinner_3306d0"></div>
           </div>
         </div>
       </div>
-      <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+      <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
         <!---->
         <div class="_spinner_3306d0"></div>
       </div>
@@ -131,7 +131,7 @@
       <div class="tablet-float-blobs clearfix">
         <div class="tablet-float-blob-1-3 mb-xl mt">
           <p class="fr-display--xs _donnee-importante_65867c">
-          <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+          <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
             <!---->
             <div class="_spinner_3306d0"></div>
           </div>
@@ -139,7 +139,7 @@
           <p>Concessions octroyées l’an dernier</p>
         </div>
         <div class="tablet-float-blob-2-3 relative mb-xl">
-          <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+          <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
             <!---->
             <div class="_spinner_3306d0"></div>
           </div>
@@ -150,7 +150,7 @@
       <div class="tablet-float-blobs clearfix">
         <div class="tablet-float-blob-1-3 mb-xl mt">
           <p class="fr-display--xs _donnee-importante_65867c">
-          <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+          <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
             <!---->
             <div class="_spinner_3306d0"></div>
           </div>
@@ -158,7 +158,7 @@
           <p>Concessions valides l’an dernier</p>
         </div>
         <div class="tablet-float-blob-2-3 relative mb-xl">
-          <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+          <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
             <!---->
             <div class="_spinner_3306d0"></div>
           </div>
diff --git a/packages/ui/src/components/statistiques/granulats-marins.stories_snapshots_WithError.html b/packages/ui/src/components/statistiques/granulats-marins.stories_snapshots_WithError.html
index 8e79792a9bbe9ab0998fc9698e16a2d9e21bbaa9..816811eb74a0cb109d60a42dcb85e90fe827ea84 100644
--- a/packages/ui/src/components/statistiques/granulats-marins.stories_snapshots_WithError.html
+++ b/packages/ui/src/components/statistiques/granulats-marins.stories_snapshots_WithError.html
@@ -10,7 +10,7 @@
         <div class="tablet-blobs">
           <div class="tablet-blob-1-3">
             <p class="fr-display--xs _donnee-importante_65867c">
-            <div class="" style="display: flex; justify-content: center;">
+            <div class=" undefined" style="display: flex; justify-content: center;">
               <div>
                 <div class="_tooltip_4f6ea8">
                   <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
@@ -21,7 +21,7 @@
               <!---->
             </div>
             </p>
-            <div class="" style="display: flex; justify-content: center;">
+            <div class=" undefined" style="display: flex; justify-content: center;">
               <div>
                 <div class="_tooltip_4f6ea8">
                   <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
@@ -35,7 +35,7 @@
           </div>
           <div class="tablet-blob-1-3">
             <p class="fr-display--xs _donnee-importante_65867c">
-            <div class="" style="display: flex; justify-content: center;">
+            <div class=" undefined" style="display: flex; justify-content: center;">
               <div>
                 <div class="_tooltip_4f6ea8">
                   <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
@@ -51,7 +51,7 @@
           </div>
           <div class="tablet-blob-1-3">
             <p class="fr-display--xs _donnee-importante_65867c">
-            <div class="" style="display: flex; justify-content: center;">
+            <div class=" undefined" style="display: flex; justify-content: center;">
               <div>
                 <div class="_tooltip_4f6ea8">
                   <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
@@ -72,7 +72,7 @@
         <div class="tablet-blobs">
           <div class="tablet-blob-1-3">
             <p class="fr-display--xs _donnee-importante_65867c">
-            <div class="" style="display: flex; justify-content: center;">
+            <div class=" undefined" style="display: flex; justify-content: center;">
               <div>
                 <div class="_tooltip_4f6ea8">
                   <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
@@ -83,7 +83,7 @@
               <!---->
             </div>
             </p>
-            <div class="" style="display: flex; justify-content: center;">
+            <div class=" undefined" style="display: flex; justify-content: center;">
               <div>
                 <div class="_tooltip_4f6ea8">
                   <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
@@ -97,7 +97,7 @@
           </div>
           <div class="tablet-blob-1-3">
             <p class="fr-display--xs _donnee-importante_65867c">
-            <div class="" style="display: flex; justify-content: center;">
+            <div class=" undefined" style="display: flex; justify-content: center;">
               <div>
                 <div class="_tooltip_4f6ea8">
                   <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
@@ -108,7 +108,7 @@
               <!---->
             </div>
             </p>
-            <div class="" style="display: flex; justify-content: center;">
+            <div class=" undefined" style="display: flex; justify-content: center;">
               <div>
                 <div class="_tooltip_4f6ea8">
                   <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
@@ -122,7 +122,7 @@
           </div>
           <div class="tablet-blob-1-3">
             <p class="fr-display--xs _donnee-importante_65867c">
-            <div class="" style="display: flex; justify-content: center;">
+            <div class=" undefined" style="display: flex; justify-content: center;">
               <div>
                 <div class="_tooltip_4f6ea8">
                   <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
@@ -142,7 +142,7 @@
     <h2>Production annuelle</h2><span class="separator"></span>
     <p class="mb-xl">Données contenues dans la base de données Camino, stabilisées pour l’année n-1.</p>
     <div class="tablet-pt-s pb-s">
-      <div class="" style="display: flex; justify-content: center;">
+      <div class=" undefined" style="display: flex; justify-content: center;">
         <div>
           <div class="_tooltip_4f6ea8">
             <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
@@ -155,7 +155,7 @@
     </div>
     <div class="line-neutral width-full mb-xl"></div>
     <h5>Sélectionner une année</h5>
-    <div class="" style="display: flex; justify-content: center;">
+    <div class=" undefined" style="display: flex; justify-content: center;">
       <div>
         <div class="_tooltip_4f6ea8">
           <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
@@ -174,7 +174,7 @@
       <div class="tablet-float-blobs clearfix">
         <div class="tablet-float-blob-1-3 mb-xl mt">
           <p class="fr-display--xs _donnee-importante_65867c">
-          <div class="" style="display: flex; justify-content: center;">
+          <div class=" undefined" style="display: flex; justify-content: center;">
             <div>
               <div class="_tooltip_4f6ea8">
                 <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
@@ -188,7 +188,7 @@
           <p>Permis exclusifs de recherches octroyés l’an dernier</p>
         </div>
         <div class="tablet-float-blob-2-3 relative mb-xl">
-          <div class="" style="display: flex; justify-content: center;">
+          <div class=" undefined" style="display: flex; justify-content: center;">
             <div>
               <div class="_tooltip_4f6ea8">
                 <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
@@ -200,7 +200,7 @@
           </div>
         </div>
       </div>
-      <div class="" style="display: flex; justify-content: center;">
+      <div class=" undefined" style="display: flex; justify-content: center;">
         <div>
           <div class="_tooltip_4f6ea8">
             <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
@@ -215,7 +215,7 @@
       <div class="tablet-float-blobs clearfix">
         <div class="tablet-float-blob-1-3 mb-xl mt">
           <p class="fr-display--xs _donnee-importante_65867c">
-          <div class="" style="display: flex; justify-content: center;">
+          <div class=" undefined" style="display: flex; justify-content: center;">
             <div>
               <div class="_tooltip_4f6ea8">
                 <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
@@ -229,7 +229,7 @@
           <p>Concessions octroyées l’an dernier</p>
         </div>
         <div class="tablet-float-blob-2-3 relative mb-xl">
-          <div class="" style="display: flex; justify-content: center;">
+          <div class=" undefined" style="display: flex; justify-content: center;">
             <div>
               <div class="_tooltip_4f6ea8">
                 <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
@@ -246,7 +246,7 @@
       <div class="tablet-float-blobs clearfix">
         <div class="tablet-float-blob-1-3 mb-xl mt">
           <p class="fr-display--xs _donnee-importante_65867c">
-          <div class="" style="display: flex; justify-content: center;">
+          <div class=" undefined" style="display: flex; justify-content: center;">
             <div>
               <div class="_tooltip_4f6ea8">
                 <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
@@ -260,7 +260,7 @@
           <p>Concessions valides l’an dernier</p>
         </div>
         <div class="tablet-float-blob-2-3 relative mb-xl">
-          <div class="" style="display: flex; justify-content: center;">
+          <div class=" undefined" style="display: flex; justify-content: center;">
             <div>
               <div class="_tooltip_4f6ea8">
                 <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
diff --git a/packages/ui/src/components/statistiques/guyane.stories_snapshots_Loading.html b/packages/ui/src/components/statistiques/guyane.stories_snapshots_Loading.html
index 5dc1a7ff99ded9d93894d143d023c2ecdfed86b2..2811afb106f681e86fcb329e64272fe680bea5f9 100644
--- a/packages/ui/src/components/statistiques/guyane.stories_snapshots_Loading.html
+++ b/packages/ui/src/components/statistiques/guyane.stories_snapshots_Loading.html
@@ -10,7 +10,7 @@
         <div class="tablet-blobs">
           <div class="tablet-blob-1-4">
             <p class="fr-display--xs _donnee-importante_65867c">
-            <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+            <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
               <!---->
               <div class="_spinner_3306d0"></div>
             </div>
@@ -20,7 +20,7 @@
           </div>
           <div class="tablet-blob-1-4">
             <p class="fr-display--xs _donnee-importante_65867c">
-            <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+            <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
               <!---->
               <div class="_spinner_3306d0"></div>
             </div>
@@ -30,7 +30,7 @@
           </div>
           <div class="tablet-blob-1-2">
             <p class="fr-display--xs _donnee-importante_65867c">
-            <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+            <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
               <!---->
               <div class="_spinner_3306d0"></div>
             </div>
@@ -45,7 +45,7 @@
         <div class="tablet-blobs">
           <div class="tablet-blob-1-4">
             <p class="fr-display--xs _donnee-importante_65867c">
-            <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+            <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
               <!---->
               <div class="_spinner_3306d0"></div>
             </div>
@@ -55,7 +55,7 @@
           </div>
           <div class="tablet-blob-1-4">
             <p class="fr-display--xs _donnee-importante_65867c">
-            <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+            <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
               <!---->
               <div class="_spinner_3306d0"></div>
             </div>
@@ -65,7 +65,7 @@
           </div>
           <div class="tablet-blob-1-2">
             <p class="fr-display--xs _donnee-importante_65867c">
-            <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+            <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
               <!---->
               <div class="_spinner_3306d0"></div>
             </div>
@@ -95,7 +95,7 @@
       </div>
     </div>
     <div class="line-neutral width-full mb"></div>
-    <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+    <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
       <!---->
       <div class="_spinner_3306d0"></div>
     </div>
@@ -106,7 +106,7 @@
       <div class="mb-xl">
         <h3>Autorisations de recherche</h3>
         <hr>
-        <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+        <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
           <!---->
           <div class="_spinner_3306d0"></div>
         </div>
@@ -114,7 +114,7 @@
       <div class="mb-xl">
         <h3>Permis de recherches</h3>
         <hr>
-        <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+        <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
           <!---->
           <div class="_spinner_3306d0"></div>
         </div>
@@ -122,7 +122,7 @@
       <div class="mb-xl">
         <h3>Autorisations d'exploitation</h3>
         <hr>
-        <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+        <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
           <!---->
           <div class="_spinner_3306d0"></div>
         </div>
@@ -130,7 +130,7 @@
       <div class="mb-xl">
         <h3>Concessions</h3>
         <hr>
-        <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+        <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
           <!---->
           <div class="_spinner_3306d0"></div>
         </div>
diff --git a/packages/ui/src/components/statistiques/guyane.stories_snapshots_WithError.html b/packages/ui/src/components/statistiques/guyane.stories_snapshots_WithError.html
index fcb10775e153d6ae642cdc6889404757d840463c..761074688ded7695df7e9c2df5f6130bd4c24be3 100644
--- a/packages/ui/src/components/statistiques/guyane.stories_snapshots_WithError.html
+++ b/packages/ui/src/components/statistiques/guyane.stories_snapshots_WithError.html
@@ -10,7 +10,7 @@
         <div class="tablet-blobs">
           <div class="tablet-blob-1-4">
             <p class="fr-display--xs _donnee-importante_65867c">
-            <div class="" style="display: flex; justify-content: center;">
+            <div class=" undefined" style="display: flex; justify-content: center;">
               <div>
                 <div class="_tooltip_4f6ea8">
                   <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
@@ -26,7 +26,7 @@
           </div>
           <div class="tablet-blob-1-4">
             <p class="fr-display--xs _donnee-importante_65867c">
-            <div class="" style="display: flex; justify-content: center;">
+            <div class=" undefined" style="display: flex; justify-content: center;">
               <div>
                 <div class="_tooltip_4f6ea8">
                   <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
@@ -42,7 +42,7 @@
           </div>
           <div class="tablet-blob-1-2">
             <p class="fr-display--xs _donnee-importante_65867c">
-            <div class="" style="display: flex; justify-content: center;">
+            <div class=" undefined" style="display: flex; justify-content: center;">
               <div>
                 <div class="_tooltip_4f6ea8">
                   <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
@@ -63,7 +63,7 @@
         <div class="tablet-blobs">
           <div class="tablet-blob-1-4">
             <p class="fr-display--xs _donnee-importante_65867c">
-            <div class="" style="display: flex; justify-content: center;">
+            <div class=" undefined" style="display: flex; justify-content: center;">
               <div>
                 <div class="_tooltip_4f6ea8">
                   <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
@@ -79,7 +79,7 @@
           </div>
           <div class="tablet-blob-1-4">
             <p class="fr-display--xs _donnee-importante_65867c">
-            <div class="" style="display: flex; justify-content: center;">
+            <div class=" undefined" style="display: flex; justify-content: center;">
               <div>
                 <div class="_tooltip_4f6ea8">
                   <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
@@ -95,7 +95,7 @@
           </div>
           <div class="tablet-blob-1-2">
             <p class="fr-display--xs _donnee-importante_65867c">
-            <div class="" style="display: flex; justify-content: center;">
+            <div class=" undefined" style="display: flex; justify-content: center;">
               <div>
                 <div class="_tooltip_4f6ea8">
                   <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
@@ -131,7 +131,7 @@
       </div>
     </div>
     <div class="line-neutral width-full mb"></div>
-    <div class="" style="display: flex; justify-content: center;">
+    <div class=" undefined" style="display: flex; justify-content: center;">
       <div>
         <div class="_tooltip_4f6ea8">
           <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
@@ -148,7 +148,7 @@
       <div class="mb-xl">
         <h3>Autorisations de recherche</h3>
         <hr>
-        <div class="" style="display: flex; justify-content: center;">
+        <div class=" undefined" style="display: flex; justify-content: center;">
           <div>
             <div class="_tooltip_4f6ea8">
               <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
@@ -162,7 +162,7 @@
       <div class="mb-xl">
         <h3>Permis de recherches</h3>
         <hr>
-        <div class="" style="display: flex; justify-content: center;">
+        <div class=" undefined" style="display: flex; justify-content: center;">
           <div>
             <div class="_tooltip_4f6ea8">
               <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
@@ -176,7 +176,7 @@
       <div class="mb-xl">
         <h3>Autorisations d'exploitation</h3>
         <hr>
-        <div class="" style="display: flex; justify-content: center;">
+        <div class=" undefined" style="display: flex; justify-content: center;">
           <div>
             <div class="_tooltip_4f6ea8">
               <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
@@ -190,7 +190,7 @@
       <div class="mb-xl">
         <h3>Concessions</h3>
         <hr>
-        <div class="" style="display: flex; justify-content: center;">
+        <div class=" undefined" style="display: flex; justify-content: center;">
           <div>
             <div class="_tooltip_4f6ea8">
               <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
diff --git a/packages/ui/src/components/statistiques/mineraux-metaux-metropole.stories_snapshots_Loading.html b/packages/ui/src/components/statistiques/mineraux-metaux-metropole.stories_snapshots_Loading.html
index 5a8b3d74cc73994772e79baeb859bdae169c3a0f..b708ce1cbfeb57a2ff699c57ecba46c53977c7d2 100644
--- a/packages/ui/src/components/statistiques/mineraux-metaux-metropole.stories_snapshots_Loading.html
+++ b/packages/ui/src/components/statistiques/mineraux-metaux-metropole.stories_snapshots_Loading.html
@@ -10,7 +10,7 @@
         <div class="tablet-blobs">
           <div class="tablet-blob-1-3">
             <p class="fr-display--xs _donnee-importante_65867c">
-            <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+            <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
               <!---->
               <div class="_spinner_3306d0"></div>
             </div>
@@ -22,7 +22,7 @@
           </div>
           <div class="tablet-blob-1-3">
             <p class="fr-display--xs _donnee-importante_65867c">
-            <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+            <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
               <!---->
               <div class="_spinner_3306d0"></div>
             </div>
@@ -32,7 +32,7 @@
           </div>
           <div class="tablet-blob-1-3">
             <p class="fr-display--xs _donnee-importante_65867c">
-            <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+            <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
               <!---->
               <div class="_spinner_3306d0"></div>
             </div>
@@ -47,7 +47,7 @@
         <div class="tablet-blobs">
           <div class="tablet-blob-1-3">
             <p class="fr-display--xs _donnee-importante_65867c">
-            <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+            <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
               <!---->
               <div class="_spinner_3306d0"></div>
             </div>
@@ -59,7 +59,7 @@
           </div>
           <div class="tablet-blob-1-3">
             <p class="fr-display--xs _donnee-importante_65867c">
-            <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+            <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
               <!---->
               <div class="_spinner_3306d0"></div>
             </div>
@@ -71,7 +71,7 @@
           </div>
           <div class="tablet-blob-1-3">
             <p class="fr-display--xs _donnee-importante_65867c">
-            <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+            <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
               <!---->
               <div class="_spinner_3306d0"></div>
             </div>
@@ -90,7 +90,7 @@
         <hr>
       </div>
       <div>
-        <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+        <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
           <!---->
           <div class="_spinner_3306d0"></div>
         </div>
@@ -102,7 +102,7 @@
         <div class="line-neutral mb"></div>
         <p>Sommes dûes par les opérateurs miniers exploitant de la bauxite au titre des redevances départementale et communale des mines, hors frais de gestion</p>
         <p class="fr-text--lead _donnee-importante_65867c">
-        <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+        <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
           <!---->
           <div class="_spinner_3306d0"></div>
         </div>
@@ -112,7 +112,7 @@
         <h3>Sels (sel de sodium, sel de potassium, sel gemme…)</h3>
         <hr>
       </div>
-      <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+      <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
         <!---->
         <div class="_spinner_3306d0"></div>
       </div>
@@ -123,7 +123,7 @@
         <div class="line-neutral mb"></div>
         <p>Sommes dûes par les opérateurs miniers exploitant des sels au titre des redevances départementale et communale des mines, hors frais de gestion</p>
         <p class="fr-text--lead _donnee-importante_65867c">
-        <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+        <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
           <!---->
           <div class="_spinner_3306d0"></div>
         </div>
@@ -141,7 +141,7 @@
     <div class="mb-xl">
       <h3>Permis Exclusif de Recherche (PER)</h3>
       <hr>
-      <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+      <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
         <!---->
         <div class="_spinner_3306d0"></div>
       </div>
@@ -149,7 +149,7 @@
     <div class="mb-xl">
       <h3>Concession</h3>
       <hr>
-      <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+      <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
         <!---->
         <div class="_spinner_3306d0"></div>
       </div>
diff --git a/packages/ui/src/components/statistiques/mineraux-metaux-metropole.stories_snapshots_WithError.html b/packages/ui/src/components/statistiques/mineraux-metaux-metropole.stories_snapshots_WithError.html
index be5052e9538df6b767b2c42720f1e3eaa5732797..618a38159c7cb85fbd0da5f5d3e14653facbf315 100644
--- a/packages/ui/src/components/statistiques/mineraux-metaux-metropole.stories_snapshots_WithError.html
+++ b/packages/ui/src/components/statistiques/mineraux-metaux-metropole.stories_snapshots_WithError.html
@@ -10,7 +10,7 @@
         <div class="tablet-blobs">
           <div class="tablet-blob-1-3">
             <p class="fr-display--xs _donnee-importante_65867c">
-            <div class="" style="display: flex; justify-content: center;">
+            <div class=" undefined" style="display: flex; justify-content: center;">
               <div>
                 <div class="_tooltip_4f6ea8">
                   <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
@@ -28,7 +28,7 @@
           </div>
           <div class="tablet-blob-1-3">
             <p class="fr-display--xs _donnee-importante_65867c">
-            <div class="" style="display: flex; justify-content: center;">
+            <div class=" undefined" style="display: flex; justify-content: center;">
               <div>
                 <div class="_tooltip_4f6ea8">
                   <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
@@ -44,7 +44,7 @@
           </div>
           <div class="tablet-blob-1-3">
             <p class="fr-display--xs _donnee-importante_65867c">
-            <div class="" style="display: flex; justify-content: center;">
+            <div class=" undefined" style="display: flex; justify-content: center;">
               <div>
                 <div class="_tooltip_4f6ea8">
                   <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
@@ -65,7 +65,7 @@
         <div class="tablet-blobs">
           <div class="tablet-blob-1-3">
             <p class="fr-display--xs _donnee-importante_65867c">
-            <div class="" style="display: flex; justify-content: center;">
+            <div class=" undefined" style="display: flex; justify-content: center;">
               <div>
                 <div class="_tooltip_4f6ea8">
                   <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
@@ -83,7 +83,7 @@
           </div>
           <div class="tablet-blob-1-3">
             <p class="fr-display--xs _donnee-importante_65867c">
-            <div class="" style="display: flex; justify-content: center;">
+            <div class=" undefined" style="display: flex; justify-content: center;">
               <div>
                 <div class="_tooltip_4f6ea8">
                   <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
@@ -101,7 +101,7 @@
           </div>
           <div class="tablet-blob-1-3">
             <p class="fr-display--xs _donnee-importante_65867c">
-            <div class="" style="display: flex; justify-content: center;">
+            <div class=" undefined" style="display: flex; justify-content: center;">
               <div>
                 <div class="_tooltip_4f6ea8">
                   <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
@@ -126,7 +126,7 @@
         <hr>
       </div>
       <div>
-        <div class="" style="display: flex; justify-content: center;">
+        <div class=" undefined" style="display: flex; justify-content: center;">
           <div>
             <div class="_tooltip_4f6ea8">
               <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
@@ -144,7 +144,7 @@
         <div class="line-neutral mb"></div>
         <p>Sommes dûes par les opérateurs miniers exploitant de la bauxite au titre des redevances départementale et communale des mines, hors frais de gestion</p>
         <p class="fr-text--lead _donnee-importante_65867c">
-        <div class="" style="display: flex; justify-content: center;">
+        <div class=" undefined" style="display: flex; justify-content: center;">
           <div>
             <div class="_tooltip_4f6ea8">
               <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
@@ -160,7 +160,7 @@
         <h3>Sels (sel de sodium, sel de potassium, sel gemme…)</h3>
         <hr>
       </div>
-      <div class="" style="display: flex; justify-content: center;">
+      <div class=" undefined" style="display: flex; justify-content: center;">
         <div>
           <div class="_tooltip_4f6ea8">
             <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
@@ -177,7 +177,7 @@
         <div class="line-neutral mb"></div>
         <p>Sommes dûes par les opérateurs miniers exploitant des sels au titre des redevances départementale et communale des mines, hors frais de gestion</p>
         <p class="fr-text--lead _donnee-importante_65867c">
-        <div class="" style="display: flex; justify-content: center;">
+        <div class=" undefined" style="display: flex; justify-content: center;">
           <div>
             <div class="_tooltip_4f6ea8">
               <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
@@ -201,7 +201,7 @@
     <div class="mb-xl">
       <h3>Permis Exclusif de Recherche (PER)</h3>
       <hr>
-      <div class="" style="display: flex; justify-content: center;">
+      <div class=" undefined" style="display: flex; justify-content: center;">
         <div>
           <div class="_tooltip_4f6ea8">
             <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
@@ -215,7 +215,7 @@
     <div class="mb-xl">
       <h3>Concession</h3>
       <hr>
-      <div class="" style="display: flex; justify-content: center;">
+      <div class=" undefined" style="display: flex; justify-content: center;">
         <div>
           <div class="_tooltip_4f6ea8">
             <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
diff --git a/packages/ui/src/components/titre-creation.stories_snapshots_Default.html b/packages/ui/src/components/titre-creation.stories_snapshots_Default.html
index 98f7f28397b08e22012d3dd0783aa6e616708e30..b76d0f475f27a9ae9f21afbacc734c77b6b60e68 100644
--- a/packages/ui/src/components/titre-creation.stories_snapshots_Default.html
+++ b/packages/ui/src/components/titre-creation.stories_snapshots_Default.html
@@ -12,7 +12,7 @@
     <!---->
     <!---->
     <!---->
-    <div style="display: flex; align-items: center;"><button class="fr-btn fr-btn--primary fr-btn--md fr-mr-1w" disabled="" title="Enregistrer" aria-label="Enregistrer" type="submit">Enregistrer</button>
+    <div style="display: flex; align-items: center;" class="fr-mt-3w"><button class="fr-btn fr-btn--primary fr-btn--md fr-mr-1w" disabled="" title="Enregistrer" aria-label="Enregistrer" type="submit">Enregistrer</button>
       <!---->
     </div>
   </form>
diff --git a/packages/ui/src/components/titre-creation.stories_snapshots_Full.html b/packages/ui/src/components/titre-creation.stories_snapshots_Full.html
index 30313042080b2188b31bc60672decba65bf291b8..79c32414435d4191dd856d958f8c1ee6b94be627 100644
--- a/packages/ui/src/components/titre-creation.stories_snapshots_Full.html
+++ b/packages/ui/src/components/titre-creation.stories_snapshots_Full.html
@@ -33,12 +33,12 @@
         <option value="px">permis d'exploitation</option>
         <option disabled="" hidden="" value="">Selectionnez une option</option>
       </select></div>
-    <div class="fr-input-group"><label class="fr-label" for="input_878">Nom du titre *
+    <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_878">Nom du titre *
         <!---->
       </label><input class="fr-input" name="input_878" id="input_878" required="" type="text">
       <!---->
     </div>
-    <div class="fr-input-group"><label class="fr-label fr-mb-1w" for="references">Références</label>
+    <div class="fr-input-group fr-mb-0 fr-mt-3w"><label class="fr-label fr-mb-1w" for="references">Références</label>
       <div class="fr-grid-row fr-grid-row--middle fr-mb-3v">
         <div class="fr-select-group fr-col fr-mb-0">
           <!----><select class="fr-select" id="select_967" aria-label="" name="select_967">
@@ -55,7 +55,7 @@
             <option disabled="" hidden="" value="">Selectionnez une option</option>
           </select>
         </div>
-        <div class="fr-input-group fr-col fr-ml-2v fr-mb-0">
+        <div class="fr-input-group fr-col fr-ml-2v fr-mb-0" style="margin-bottom: 0px;">
           <!----><input class="fr-input" name="input_25" id="input_25" type="text">
           <!---->
         </div><button class="fr-btn fr-btn--tertiary fr-btn--md fr-icon-delete-bin-line fr-ml-2v" title="Supprimer la référence 1" aria-label="Supprimer la référence 1" type="button">
@@ -63,13 +63,13 @@
         </button>
       </div><button class="fr-btn fr-btn--icon-right fr-icon-add-line fr-btn--tertiary fr-btn--md" title="Ajouter une référence" aria-label="Ajouter une référence" type="button">Ajouter une référence</button>
     </div>
-    <div class="fr-mb-3w"><label class="fr-label fr-mb-1w">Titre à l’origine de cette nouvelle demande</label>
+    <div class="fr-mt-3w"><label class="fr-label fr-mb-1w">Titre à l’origine de cette nouvelle demande</label>
       <div id="titre-link-typeahead_wrapper" class="_typeahead_8eddf1 dsfr">
         <div class="flex"><input id="titre-link-typeahead" type="text" name="titre-link-typeahead" class="_typeahead-input_8eddf1 fr-input" placeholder="Lier un titre" autocomplete="off"></div>
         <!---->
       </div>
     </div>
-    <div style="display: flex; align-items: center;"><button class="fr-btn fr-btn--primary fr-btn--md fr-mr-1w" title="Enregistrer" aria-label="Enregistrer" type="submit">Enregistrer</button>
+    <div style="display: flex; align-items: center;" class="fr-mt-3w"><button class="fr-btn fr-btn--primary fr-btn--md fr-mr-1w" title="Enregistrer" aria-label="Enregistrer" type="submit">Enregistrer</button>
       <!---->
     </div>
   </form>
diff --git a/packages/ui/src/components/titre-creation.stories_snapshots_NoEntreprise.html b/packages/ui/src/components/titre-creation.stories_snapshots_NoEntreprise.html
index f65108863c6d4d98cd6c259be1a3271e5f43339e..cb623da4ef826f04a5ac0af19d8eedc8a9455368 100644
--- a/packages/ui/src/components/titre-creation.stories_snapshots_NoEntreprise.html
+++ b/packages/ui/src/components/titre-creation.stories_snapshots_NoEntreprise.html
@@ -8,7 +8,7 @@
     <!---->
     <!---->
     <!---->
-    <div style="display: flex; align-items: center;"><button class="fr-btn fr-btn--primary fr-btn--md fr-mr-1w" disabled="" title="Enregistrer" aria-label="Enregistrer" type="submit">Enregistrer</button>
+    <div style="display: flex; align-items: center;" class="fr-mt-3w"><button class="fr-btn fr-btn--primary fr-btn--md fr-mr-1w" disabled="" title="Enregistrer" aria-label="Enregistrer" type="submit">Enregistrer</button>
       <!---->
     </div>
   </form>
diff --git a/packages/ui/src/components/titre-creation.stories_snapshots_OnlyOneEntreprise.html b/packages/ui/src/components/titre-creation.stories_snapshots_OnlyOneEntreprise.html
index 73426cb3a3aaf74b37f2fc39c67f8dddf6d6e0e7..b0bc70a6e54966f5deb54f577ddfa9b4264b5838 100644
--- a/packages/ui/src/components/titre-creation.stories_snapshots_OnlyOneEntreprise.html
+++ b/packages/ui/src/components/titre-creation.stories_snapshots_OnlyOneEntreprise.html
@@ -24,7 +24,7 @@
     <!---->
     <!---->
     <!---->
-    <div style="display: flex; align-items: center;"><button class="fr-btn fr-btn--primary fr-btn--md fr-mr-1w" disabled="" title="Enregistrer" aria-label="Enregistrer" type="submit">Enregistrer</button>
+    <div style="display: flex; align-items: center;" class="fr-mt-3w"><button class="fr-btn fr-btn--primary fr-btn--md fr-mr-1w" disabled="" title="Enregistrer" aria-label="Enregistrer" type="submit">Enregistrer</button>
       <!---->
     </div>
   </form>
diff --git a/packages/ui/src/components/titre-creation.stories_snapshots_OnlyOneEntrepriseUserEntreprise.html b/packages/ui/src/components/titre-creation.stories_snapshots_OnlyOneEntrepriseUserEntreprise.html
index 3160a2f0b4966b0ca9419e6621362cd8fffa3111..e3d7f67445664723d026f818dfb39e530f7a405d 100644
--- a/packages/ui/src/components/titre-creation.stories_snapshots_OnlyOneEntrepriseUserEntreprise.html
+++ b/packages/ui/src/components/titre-creation.stories_snapshots_OnlyOneEntrepriseUserEntreprise.html
@@ -23,7 +23,7 @@
     <!---->
     <!---->
     <!---->
-    <div style="display: flex; align-items: center;"><button class="fr-btn fr-btn--primary fr-btn--md fr-mr-1w" disabled="" title="Enregistrer" aria-label="Enregistrer" type="submit">Enregistrer</button>
+    <div style="display: flex; align-items: center;" class="fr-mt-3w"><button class="fr-btn fr-btn--primary fr-btn--md fr-mr-1w" disabled="" title="Enregistrer" aria-label="Enregistrer" type="submit">Enregistrer</button>
       <!---->
     </div>
   </form>
diff --git a/packages/ui/src/components/titre-creation.tsx b/packages/ui/src/components/titre-creation.tsx
index a6ff91f5bbbad1ff759cbb5f2bd6841cc26ab39b..ca0cda279e72e11de87630bac1ad7561e3663266 100644
--- a/packages/ui/src/components/titre-creation.tsx
+++ b/packages/ui/src/components/titre-creation.tsx
@@ -201,17 +201,17 @@ export const PureTitreCreation = defineComponent<Props>(props => {
         ) : null}
 
         {isNotNullNorUndefined(titreDemande.value.typeId) && !entrepriseOuBureauDEtudeCheck.value ? (
-          <TitreReferenceSelect initialValues={titreDemande.value.references ?? []} onUpdateReferences={onUpdateReferences} />
+          <TitreReferenceSelect class="fr-mt-3w" initialValues={titreDemande.value.references ?? []} onUpdateReferences={onUpdateReferences} />
         ) : null}
 
         {isNotNullNorUndefined(titreDemande.value.typeId) && isNotNullNorUndefined(linkConfig.value) ? (
-          <div class="fr-mb-3w">
+          <div class="fr-mt-3w">
             <label class="fr-label fr-mb-1w">Titre {linkConfig.value.count === 'multiple' ? 's' : ''} à l’origine de cette nouvelle demande</label>
             <TitresLink config={titreLinkConfig.value} loadLinkableTitres={loadLinkableTitresByTypeId.value} onSelectTitres={onSelectTitres} />
           </div>
         ) : null}
 
-        <div style={{ display: 'flex', alignItems: 'center' }}>
+        <div style={{ display: 'flex', alignItems: 'center' }} class="fr-mt-3w">
           <DsfrButton title="Enregistrer" onClick={save} disabled={!complete.value || savingTitre.value.status === 'LOADING'} type="submit" class="fr-mr-1w" />
           <LoadingElement data={savingTitre.value} renderItem={() => null} />
         </div>
diff --git a/packages/ui/src/components/titre.stories.tsx b/packages/ui/src/components/titre.stories.tsx
index 9dd9b337798fa85385fd2ecbda37a14bb0bc7341..e9b2712ddb7e93901378751defd59cd884a45d59 100644
--- a/packages/ui/src/components/titre.stories.tsx
+++ b/packages/ui/src/components/titre.stories.tsx
@@ -159,8 +159,6 @@ const titre: TitreGet = {
           etape_statut_id: EtapesTypesEtapesStatuts.demande.FAIT.etapeStatutId,
           date,
           ordre: 1,
-          decisions_annexes_contenu: {},
-          decisions_annexes_sections: [],
           fondamentale: {
             date_debut: null,
             duree: null,
@@ -218,7 +216,7 @@ const titre: TitreGet = {
             },
           },
           sections_with_values: [],
-          documents: [],
+          etape_documents: [],
           entreprises_documents: [],
         },
       ],
@@ -371,7 +369,7 @@ const chantePieApiClient: PropsApiClient = {
     getTitreAction(titreIdOrSlug)
 
     // prettier-ignore
-    const chantepieData = titreGetValidator.parse({"id":"Ju80kBYMoDstD5J6H8wqWRdo","nom":"Chantepie","slug":"m-cx-chantepie-1988","titre_type_id":"cxm","titre_statut_id":"val","titre_doublon":null,"references":[{"nom":"2013-0224-MI","referenceTypeId":"deb"}],"titre_last_modified_date":"2023-10-12","demarches":[{"id":"PpD4be1fwbWJ7TZCdwvZj0vQ","slug":"m-cx-chantepie-1988-oct01","description":null,"etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":600,"substances":["auru","arge","cuiv","ferx","plom","souf","zinc","scoc"],"titulaires":[{"id":"fr-632022711","nom":"ELF AQUITAINE PRODUCTION","operateur":false}],"amodiataires":null,"perimetre":{"geojson4326_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-0.10565832,48.148920934],[-0.115003634,48.139837998],[-0.099602309,48.120982819],[-0.08524026,48.121293005],[-0.061686458,48.148697133],[-0.10565832,48.148920934]]]]}},"geojson4326_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.105658320330431,48.1489209342693]},"properties":{"nom":"A","description":"Intersection de l'axe de la route départementale n° 103, joignant Rouez et Crissé et de la droite joignant l'intersection de l'axe de la rivière La Vègre avec la limite des communes de Sillé-le-Guillaume et de Rouez, d'une part, au sommet B défini ci-après"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.0616864580218711,48.1486971325525]},"properties":{"nom":"B","description":"Intersection de l'axe de la route départementale n° 304 allant de Sillé-le-Guillaume à Conlie et de l'axe de la route départementale n° 167 allant à Rouez"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.0852402595925762,48.1212930049111]},"properties":{"nom":"C","description":"Intersection de la droite joignant l'axe du clocher de Sillé-le-Guillaume et l'axe du clocher de Tennie, et de la droite joignant l'axe du clocher de Parennes et l'axe du clocher de Conlie"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.0996023094257926,48.1209828190687]},"properties":{"nom":"D","description":"Intersection de la droite joignant l'axe du clocher de Parennes et l'axe du clocher de Conlie et de la droite joignant l'axe du clocher de Rouez et l'axe du clocher de Bernay"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.115003633563279,48.1398379979624]},"properties":{"nom":"E","description":"Axe du clocher de Rouez"}}]},"geojson_origine_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-0.10565832,48.148920934],[-0.115003634,48.139837998],[-0.099602309,48.120982819],[-0.08524026,48.121293005],[-0.061686458,48.148697133],[-0.10565832,48.148920934]]]]}},"geojson4326_forages":null,"geojson_origine_forages":null,"geojson_origine_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.105658320330431,48.1489209342693]},"properties":{"nom":"A","description":"Intersection de l'axe de la route départementale n° 103, joignant Rouez et Crissé et de la droite joignant l'intersection de l'axe de la rivière La Vègre avec la limite des communes de Sillé-le-Guillaume et de Rouez, d'une part, au sommet B défini ci-après"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.0616864580218711,48.1486971325525]},"properties":{"nom":"B","description":"Intersection de l'axe de la route départementale n° 304 allant de Sillé-le-Guillaume à Conlie et de l'axe de la route départementale n° 167 allant à Rouez"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.0852402595925762,48.1212930049111]},"properties":{"nom":"C","description":"Intersection de la droite joignant l'axe du clocher de Sillé-le-Guillaume et l'axe du clocher de Tennie, et de la droite joignant l'axe du clocher de Parennes et l'axe du clocher de Conlie"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.0996023094257926,48.1209828190687]},"properties":{"nom":"D","description":"Intersection de la droite joignant l'axe du clocher de Parennes et l'axe du clocher de Conlie et de la droite joignant l'axe du clocher de Rouez et l'axe du clocher de Bernay"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.115003633563279,48.1398379979624]},"properties":{"nom":"E","description":"Axe du clocher de Rouez"}}]},"geojson_origine_geo_systeme_id":"4326","surface":8,"communes":[{"id":"72256","nom":"Rouez"},{"id":"72351","nom":"Tennie"}],"secteurs_maritimes":[],"sdom_zones":[],"forets":[]}},"etape_statut_id":"acc","date":"1988-09-01","id":"OxqtxQwW0B3AUIHFR7k32Ycl","ordre":2,"notes":null,"slug":"m-cx-chantepie-1988-oct01-dpu01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":"JORFTEXT000000681488"},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":"INDE8800659D"}]}],"entreprises_documents":[],"documents":[],"decisions_annexes_contenu":null,"decisions_annexes_sections":null},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":600,"substances":["auru","arge","cuiv","ferx","plom","souf","zinc","scoc"],"titulaires":[{"id":"fr-632022711","nom":"ELF AQUITAINE PRODUCTION","operateur":false}],"amodiataires":null,"perimetre":{"geojson4326_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-0.10565832,48.148920934],[-0.115003634,48.139837998],[-0.099602309,48.120982819],[-0.08524026,48.121293005],[-0.061686458,48.148697133],[-0.10565832,48.148920934]]]]}},"geojson4326_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.105658320330431,48.1489209342693]},"properties":{"nom":"A","description":"Intersection de l'axe de la route départementale n° 103, joignant Rouez et Crissé et de la droite joignant l'intersection de l'axe de la rivière La Vègre avec la limite des communes de Sillé-le-Guillaume et de Rouez, d'une part, au sommet B défini ci-après"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.0616864580218711,48.1486971325525]},"properties":{"nom":"B","description":"Intersection de l'axe de la route départementale n° 304 allant de Sillé-le-Guillaume à Conlie et de l'axe de la route départementale n° 167 allant à Rouez"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.0852402595925762,48.1212930049111]},"properties":{"nom":"C","description":"Intersection de la droite joignant l'axe du clocher de Sillé-le-Guillaume et l'axe du clocher de Tennie, et de la droite joignant l'axe du clocher de Parennes et l'axe du clocher de Conlie"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.0996023094257926,48.1209828190687]},"properties":{"nom":"D","description":"Intersection de la droite joignant l'axe du clocher de Parennes et l'axe du clocher de Conlie et de la droite joignant l'axe du clocher de Rouez et l'axe du clocher de Bernay"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.115003633563279,48.1398379979624]},"properties":{"nom":"E","description":"Axe du clocher de Rouez"}}]},"geojson_origine_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-0.10565832,48.148920934],[-0.115003634,48.139837998],[-0.099602309,48.120982819],[-0.08524026,48.121293005],[-0.061686458,48.148697133],[-0.10565832,48.148920934]]]]}},"geojson4326_forages":null,"geojson_origine_forages":null,"geojson_origine_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.105658320330431,48.1489209342693]},"properties":{"nom":"A","description":"Intersection de l'axe de la route départementale n° 103, joignant Rouez et Crissé et de la droite joignant l'intersection de l'axe de la rivière La Vègre avec la limite des communes de Sillé-le-Guillaume et de Rouez, d'une part, au sommet B défini ci-après"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.0616864580218711,48.1486971325525]},"properties":{"nom":"B","description":"Intersection de l'axe de la route départementale n° 304 allant de Sillé-le-Guillaume à Conlie et de l'axe de la route départementale n° 167 allant à Rouez"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.0852402595925762,48.1212930049111]},"properties":{"nom":"C","description":"Intersection de la droite joignant l'axe du clocher de Sillé-le-Guillaume et l'axe du clocher de Tennie, et de la droite joignant l'axe du clocher de Parennes et l'axe du clocher de Conlie"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.0996023094257926,48.1209828190687]},"properties":{"nom":"D","description":"Intersection de la droite joignant l'axe du clocher de Parennes et l'axe du clocher de Conlie et de la droite joignant l'axe du clocher de Rouez et l'axe du clocher de Bernay"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.115003633563279,48.1398379979624]},"properties":{"nom":"E","description":"Axe du clocher de Rouez"}}]},"geojson_origine_geo_systeme_id":"4326","surface":8,"communes":[{"id":"72256","nom":"Rouez"},{"id":"72351","nom":"Tennie"}],"secteurs_maritimes":[],"sdom_zones":[],"forets":[]}},"etape_statut_id":"acc","date":"1988-08-24","id":"XkNmBmjc6YYY6OEncdCAldnU","ordre":1,"notes":null,"slug":"m-cx-chantepie-1988-oct01-dex01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"documents":[],"decisions_annexes_contenu":null,"decisions_annexes_sections":null}],"demarche_type_id":"oct","demarche_statut_id":"acc","demarche_date_debut":"1988-09-01","demarche_date_fin":"2038-09-01","ordre":1},{"id":"mkPvJYXFO2InPppXamCRo2Cv","slug":"m-cx-chantepie-1988-mut01","description":null,"etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":[],"titulaires":[{"id":"fr-409160132","nom":"TOTALENERGIES EP FRANCE (TEPF)","operateur":false}],"amodiataires":null,"perimetre":null},"etape_statut_id":"acc","date":"2000-06-06","id":"lc3diJKRphb029ufvF73FlSn","ordre":2,"notes":null,"slug":"m-cx-chantepie-1988-mut01-dpu01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":"JORFTEXT000000765254"},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":"ECOI0000251A"}]}],"entreprises_documents":[],"documents":[],"decisions_annexes_contenu":null,"decisions_annexes_sections":null},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":[],"titulaires":[{"id":"fr-409160132","nom":"TOTALENERGIES EP FRANCE (TEPF)","operateur":false}],"amodiataires":null,"perimetre":null},"etape_statut_id":"acc","date":"2000-05-25","id":"2n1RaQcCxZMVta2Qfv1pUIRS","ordre":1,"notes":null,"slug":"m-cx-chantepie-1988-mut01-dex01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"documents":[],"decisions_annexes_contenu":null,"decisions_annexes_sections":null}],"demarche_type_id":"mut","demarche_statut_id":"acc","demarche_date_debut":null,"demarche_date_fin":null,"ordre":2}],"nb_activites_to_do":null})
+    const chantepieData = titreGetValidator.parse({"id":"Ju80kBYMoDstD5J6H8wqWRdo","nom":"Chantepie","slug":"m-cx-chantepie-1988","titre_type_id":"cxm","titre_statut_id":"val","titre_doublon":null,"references":[{"nom":"2013-0224-MI","referenceTypeId":"deb"}],"titre_last_modified_date":"2023-10-12","demarches":[{"id":"PpD4be1fwbWJ7TZCdwvZj0vQ","slug":"m-cx-chantepie-1988-oct01","description":null,"etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":600,"substances":["auru","arge","cuiv","ferx","plom","souf","zinc","scoc"],"titulaires":[{"id":"fr-632022711","nom":"ELF AQUITAINE PRODUCTION","operateur":false}],"amodiataires":null,"perimetre":{"geojson4326_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-0.10565832,48.148920934],[-0.115003634,48.139837998],[-0.099602309,48.120982819],[-0.08524026,48.121293005],[-0.061686458,48.148697133],[-0.10565832,48.148920934]]]]}},"geojson4326_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.105658320330431,48.1489209342693]},"properties":{"nom":"A","description":"Intersection de l'axe de la route départementale n° 103, joignant Rouez et Crissé et de la droite joignant l'intersection de l'axe de la rivière La Vègre avec la limite des communes de Sillé-le-Guillaume et de Rouez, d'une part, au sommet B défini ci-après"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.0616864580218711,48.1486971325525]},"properties":{"nom":"B","description":"Intersection de l'axe de la route départementale n° 304 allant de Sillé-le-Guillaume à Conlie et de l'axe de la route départementale n° 167 allant à Rouez"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.0852402595925762,48.1212930049111]},"properties":{"nom":"C","description":"Intersection de la droite joignant l'axe du clocher de Sillé-le-Guillaume et l'axe du clocher de Tennie, et de la droite joignant l'axe du clocher de Parennes et l'axe du clocher de Conlie"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.0996023094257926,48.1209828190687]},"properties":{"nom":"D","description":"Intersection de la droite joignant l'axe du clocher de Parennes et l'axe du clocher de Conlie et de la droite joignant l'axe du clocher de Rouez et l'axe du clocher de Bernay"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.115003633563279,48.1398379979624]},"properties":{"nom":"E","description":"Axe du clocher de Rouez"}}]},"geojson_origine_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-0.10565832,48.148920934],[-0.115003634,48.139837998],[-0.099602309,48.120982819],[-0.08524026,48.121293005],[-0.061686458,48.148697133],[-0.10565832,48.148920934]]]]}},"geojson4326_forages":null,"geojson_origine_forages":null,"geojson_origine_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.105658320330431,48.1489209342693]},"properties":{"nom":"A","description":"Intersection de l'axe de la route départementale n° 103, joignant Rouez et Crissé et de la droite joignant l'intersection de l'axe de la rivière La Vègre avec la limite des communes de Sillé-le-Guillaume et de Rouez, d'une part, au sommet B défini ci-après"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.0616864580218711,48.1486971325525]},"properties":{"nom":"B","description":"Intersection de l'axe de la route départementale n° 304 allant de Sillé-le-Guillaume à Conlie et de l'axe de la route départementale n° 167 allant à Rouez"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.0852402595925762,48.1212930049111]},"properties":{"nom":"C","description":"Intersection de la droite joignant l'axe du clocher de Sillé-le-Guillaume et l'axe du clocher de Tennie, et de la droite joignant l'axe du clocher de Parennes et l'axe du clocher de Conlie"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.0996023094257926,48.1209828190687]},"properties":{"nom":"D","description":"Intersection de la droite joignant l'axe du clocher de Parennes et l'axe du clocher de Conlie et de la droite joignant l'axe du clocher de Rouez et l'axe du clocher de Bernay"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.115003633563279,48.1398379979624]},"properties":{"nom":"E","description":"Axe du clocher de Rouez"}}]},"geojson_origine_geo_systeme_id":"4326","surface":8,"communes":[{"id":"72256","nom":"Rouez"},{"id":"72351","nom":"Tennie"}],"secteurs_maritimes":[],"sdom_zones":[],"forets":[]}},"etape_statut_id":"acc","date":"1988-09-01","id":"OxqtxQwW0B3AUIHFR7k32Ycl","ordre":2,"notes":null,"slug":"m-cx-chantepie-1988-oct01-dpu01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":"JORFTEXT000000681488"},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":"INDE8800659D"}]}],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":600,"substances":["auru","arge","cuiv","ferx","plom","souf","zinc","scoc"],"titulaires":[{"id":"fr-632022711","nom":"ELF AQUITAINE PRODUCTION","operateur":false}],"amodiataires":null,"perimetre":{"geojson4326_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-0.10565832,48.148920934],[-0.115003634,48.139837998],[-0.099602309,48.120982819],[-0.08524026,48.121293005],[-0.061686458,48.148697133],[-0.10565832,48.148920934]]]]}},"geojson4326_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.105658320330431,48.1489209342693]},"properties":{"nom":"A","description":"Intersection de l'axe de la route départementale n° 103, joignant Rouez et Crissé et de la droite joignant l'intersection de l'axe de la rivière La Vègre avec la limite des communes de Sillé-le-Guillaume et de Rouez, d'une part, au sommet B défini ci-après"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.0616864580218711,48.1486971325525]},"properties":{"nom":"B","description":"Intersection de l'axe de la route départementale n° 304 allant de Sillé-le-Guillaume à Conlie et de l'axe de la route départementale n° 167 allant à Rouez"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.0852402595925762,48.1212930049111]},"properties":{"nom":"C","description":"Intersection de la droite joignant l'axe du clocher de Sillé-le-Guillaume et l'axe du clocher de Tennie, et de la droite joignant l'axe du clocher de Parennes et l'axe du clocher de Conlie"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.0996023094257926,48.1209828190687]},"properties":{"nom":"D","description":"Intersection de la droite joignant l'axe du clocher de Parennes et l'axe du clocher de Conlie et de la droite joignant l'axe du clocher de Rouez et l'axe du clocher de Bernay"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.115003633563279,48.1398379979624]},"properties":{"nom":"E","description":"Axe du clocher de Rouez"}}]},"geojson_origine_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-0.10565832,48.148920934],[-0.115003634,48.139837998],[-0.099602309,48.120982819],[-0.08524026,48.121293005],[-0.061686458,48.148697133],[-0.10565832,48.148920934]]]]}},"geojson4326_forages":null,"geojson_origine_forages":null,"geojson_origine_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.105658320330431,48.1489209342693]},"properties":{"nom":"A","description":"Intersection de l'axe de la route départementale n° 103, joignant Rouez et Crissé et de la droite joignant l'intersection de l'axe de la rivière La Vègre avec la limite des communes de Sillé-le-Guillaume et de Rouez, d'une part, au sommet B défini ci-après"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.0616864580218711,48.1486971325525]},"properties":{"nom":"B","description":"Intersection de l'axe de la route départementale n° 304 allant de Sillé-le-Guillaume à Conlie et de l'axe de la route départementale n° 167 allant à Rouez"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.0852402595925762,48.1212930049111]},"properties":{"nom":"C","description":"Intersection de la droite joignant l'axe du clocher de Sillé-le-Guillaume et l'axe du clocher de Tennie, et de la droite joignant l'axe du clocher de Parennes et l'axe du clocher de Conlie"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.0996023094257926,48.1209828190687]},"properties":{"nom":"D","description":"Intersection de la droite joignant l'axe du clocher de Parennes et l'axe du clocher de Conlie et de la droite joignant l'axe du clocher de Rouez et l'axe du clocher de Bernay"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.115003633563279,48.1398379979624]},"properties":{"nom":"E","description":"Axe du clocher de Rouez"}}]},"geojson_origine_geo_systeme_id":"4326","surface":8,"communes":[{"id":"72256","nom":"Rouez"},{"id":"72351","nom":"Tennie"}],"secteurs_maritimes":[],"sdom_zones":[],"forets":[]}},"etape_statut_id":"acc","date":"1988-08-24","id":"XkNmBmjc6YYY6OEncdCAldnU","ordre":1,"notes":null,"slug":"m-cx-chantepie-1988-oct01-dex01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[]}],"demarche_type_id":"oct","demarche_statut_id":"acc","demarche_date_debut":"1988-09-01","demarche_date_fin":"2038-09-01","ordre":1},{"id":"mkPvJYXFO2InPppXamCRo2Cv","slug":"m-cx-chantepie-1988-mut01","description":null,"etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":[],"titulaires":[{"id":"fr-409160132","nom":"TOTALENERGIES EP FRANCE (TEPF)","operateur":false}],"amodiataires":null,"perimetre":null},"etape_statut_id":"acc","date":"2000-06-06","id":"lc3diJKRphb029ufvF73FlSn","ordre":2,"notes":null,"slug":"m-cx-chantepie-1988-mut01-dpu01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":"JORFTEXT000000765254"},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":"ECOI0000251A"}]}],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":[],"titulaires":[{"id":"fr-409160132","nom":"TOTALENERGIES EP FRANCE (TEPF)","operateur":false}],"amodiataires":null,"perimetre":null},"etape_statut_id":"acc","date":"2000-05-25","id":"2n1RaQcCxZMVta2Qfv1pUIRS","ordre":1,"notes":null,"slug":"m-cx-chantepie-1988-mut01-dex01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[]}],"demarche_type_id":"mut","demarche_statut_id":"acc","demarche_date_debut":null,"demarche_date_fin":null,"ordre":2}],"nb_activites_to_do":null})
     chantepieData.nom = 'Chantepie avec un titre assez long'
     chantepieData.nb_activites_to_do = 2
 
@@ -421,7 +419,7 @@ const criqueAdolpheApiClient: PropsApiClient = {
     getTitreAction(titreIdOrSlug)
 
     // prettier-ignore
-    const criqueAdolpheData = titreGetValidator.parse({"id":"tbFvGIDboAzxTb54GQyghTyc","nom":"Crique Adolphe","slug":"m-ar-crique-adolphe-2023","titre_type_id":"arm","titre_statut_id":"ech","titre_doublon":null,"references":[{"nom":"2022-032","referenceTypeId":"ptm"},{"nom":"AR 2022-027","referenceTypeId":"onf"}],"titre_last_modified_date":"2023-10-20","demarches":[{"id":"yAvBOMdHDsyES7phbS5hRKLA","slug":"m-ar-crique-adolphe-2023-oct01","description":null,"etapes":[{"etape_type_id":"sco","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":null,"titulaires":null,"amodiataires":null,"perimetre":null},"etape_statut_id":"fai","date":"2023-09-19","id":"5649942721fd9f3478381ae9","ordre":16,"notes":null,"slug":"m-ar-crique-adolphe-2023-oct01-sco01","sections_with_values":[{"id":"suivi","nom":"Suivi de la démarche","elements":[{"id":"signataire","nom":"Signataire ONF","description":"Prénom et nom du représentant légal du titulaire de l'ONF","optionnel":true,"type":"text","value":null},{"id":"titulaire","nom":"Signataire titulaire","description":"Prénom et nom du représentant légal du titulaire de l'autorisation","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"documents":[],"decisions_annexes_contenu":null,"decisions_annexes_sections":null},{"etape_type_id":"aca","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":null,"titulaires":null,"amodiataires":null,"perimetre":null},"etape_statut_id":"fav","date":"2023-01-11","id":"oXXG5ToIYbw8MvdYPX7sMMAP","ordre":12,"notes":null,"slug":"m-ar-crique-adolphe-2023-oct01-aca01","sections_with_values":[],"entreprises_documents":[],"documents":[],"decisions_annexes_contenu":null,"decisions_annexes_sections":null},{"etape_type_id":"sca","etape_statut_id":"fai","date":"2023-01-11","id":"WLXKWB9Fv17gm2gTJYIXnTyX","ordre":11,"notes":null,"slug":"m-ar-crique-adolphe-2023-oct01-sca01","sections_with_values":[],"entreprises_documents":[],"documents":[],"decisions_annexes_contenu":null,"decisions_annexes_sections":null},{"etape_type_id":"rde","etape_statut_id":"fav","date":"2022-12-29","id":"y0SCXGJ1OBYSthcWyojyOLZX","ordre":9,"notes":null,"slug":"m-ar-crique-adolphe-2023-oct01-rde01","sections_with_values":[{"id":"deal","nom":"DEAL","elements":[{"id":"numero-dossier-deal-eau","nom":"Numéro de dossier","description":"Numéro de dossier DEAL Service eau","optionnel":true,"type":"text","value":""},{"id":"numero-recepisse","nom":"Numéro de récépissé","description":"Numéro de récépissé émis par la DEAL Service eau","optionnel":true,"type":"text","value":"R03-2022-12-29-00005"}]}],"entreprises_documents":[],"documents":[],"decisions_annexes_contenu":null,"decisions_annexes_sections":null},{"etape_type_id":"mcr","etape_statut_id":"fav","date":"2022-12-05","id":"0vdB4jaJbpIpyUnIZkKPsmCm","ordre":7,"notes":null,"slug":"m-ar-crique-adolphe-2023-oct01-mcr01","sections_with_values":[],"entreprises_documents":[],"documents":[],"decisions_annexes_contenu":null,"decisions_annexes_sections":null},{"etape_type_id":"mfr","fondamentale":{"date_debut":null,"date_fin":null,"duree":4,"substances":["auru"],"titulaires":[{"id":"fr-794312231","nom":"SOCIETE MINIERE DE L OUEST (S.M.O)","operateur":false}],"amodiataires":null,"perimetre":{"geojson4326_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-53.581810139,3.830965486],[-53.581783064,3.821927822],[-53.572785591,3.821954938],[-53.572812572,3.830992667],[-53.581810139,3.830965486]]],[[[-53.600314085,3.822478099],[-53.598916453,3.81818315],[-53.581812057,3.823798548],[-53.58320965,3.828093576],[-53.600314085,3.822478099]]],[[[-53.583861926,3.850211446],[-53.592379712,3.834289122],[-53.588417036,3.832150192],[-53.579899144,3.848072512],[-53.583861926,3.850211446]]]]}},"geojson4326_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.58181013905019,3.8309654861273]},"properties":{"nom":"S1","description":"ARM1.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.57281257175149,3.8309926670647294]},"properties":{"nom":"S2","description":"ARM1.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.572785590706495,3.82195493825841]},"properties":{"nom":"S3","description":"ARM1.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.58178306390299,3.8219278216269807]},"properties":{"nom":"S4","description":"ARM1.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.60031408473134,3.8224780986447566]},"properties":{"nom":"S5","description":"ARM2.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.58320964990986,3.828093576227541]},"properties":{"nom":"S6","description":"ARM2.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.58181205656814,3.82379854768971]},"properties":{"nom":"S7","description":"ARM2.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.59891645305842,3.8181831495446303]},"properties":{"nom":"S8","description":"ARM2.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.583861926103765,3.8502114455117433]},"properties":{"nom":"S9","description":"ARM3.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.57989914401643,3.8480725119510217]},"properties":{"nom":"S10","description":"ARM3.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.588417035915334,3.8321501920354253]},"properties":{"nom":"S11","description":"ARM3.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.592379712320195,3.834289122043602]},"properties":{"nom":"S12","description":"ARM3.3"}}]},"geojson_origine_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-53.581810139,3.830965486],[-53.581783064,3.821927822],[-53.572785591,3.821954938],[-53.572812572,3.830992667],[-53.581810139,3.830965486]]],[[[-53.600314085,3.822478099],[-53.598916453,3.81818315],[-53.581812057,3.823798548],[-53.58320965,3.828093576],[-53.600314085,3.822478099]]],[[[-53.583861926,3.850211446],[-53.592379712,3.834289122],[-53.588417036,3.832150192],[-53.579899144,3.848072512],[-53.583861926,3.850211446]]]]}},"geojson4326_forages":null,"geojson_origine_forages":null,"geojson_origine_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.58181013905019,3.8309654861273]},"properties":{"nom":"S1","description":"ARM1.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.57281257175149,3.8309926670647294]},"properties":{"nom":"S2","description":"ARM1.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.572785590706495,3.82195493825841]},"properties":{"nom":"S3","description":"ARM1.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.58178306390299,3.8219278216269807]},"properties":{"nom":"S4","description":"ARM1.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.60031408473134,3.8224780986447566]},"properties":{"nom":"S5","description":"ARM2.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.58320964990986,3.828093576227541]},"properties":{"nom":"S6","description":"ARM2.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.58181205656814,3.82379854768971]},"properties":{"nom":"S7","description":"ARM2.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.59891645305842,3.8181831495446303]},"properties":{"nom":"S8","description":"ARM2.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.583861926103765,3.8502114455117433]},"properties":{"nom":"S9","description":"ARM3.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.57989914401643,3.8480725119510217]},"properties":{"nom":"S10","description":"ARM3.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.588417035915334,3.8321501920354253]},"properties":{"nom":"S11","description":"ARM3.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.592379712320195,3.834289122043602]},"properties":{"nom":"S12","description":"ARM3.3"}}]},"geojson_origine_geo_systeme_id":"4326","surface":3,"communes":[{"id":"97353","nom":"Maripasoula"}],"secteurs_maritimes":[],"sdom_zones":[],"forets":[]}},"etape_statut_id":"fai","date":"2022-11-08","id":"pwqOEAsAmaWi0o24QiVeVZ40","ordre":3,"notes":null,"slug":"m-ar-crique-adolphe-2023-oct01-mfr01","sections_with_values":[{"id":"arm","nom":"Caractéristiques ARM","elements":[{"id":"mecanise","nom":"Prospection mécanisée","description":"","type":"radio","value":true},{"id":"franchissements","nom":"Franchissements de cours d'eau","description":"Nombre de franchissements de cours d'eau","optionnel":true,"type":"integer","value":12}]}],"entreprises_documents":[],"documents":[],"decisions_annexes_contenu":null,"decisions_annexes_sections":null},{"etape_type_id":"mdp","etape_statut_id":"fai","date":"2022-11-08","id":"pF4UG6UrCOJmKjtgmtpwthTQ","ordre":4,"notes":null,"slug":"m-ar-crique-adolphe-2023-oct01-mdp01","sections_with_values":[],"entreprises_documents":[],"documents":[],"decisions_annexes_contenu":null,"decisions_annexes_sections":null},{"etape_type_id":"dae","etape_statut_id":"exe","date":"2022-09-26","id":"KA7tyvIdlqQmmVOuVjEl0Hdt","ordre":1,"notes":null,"slug":"m-ar-crique-adolphe-2023-oct01-dae01","sections_with_values":[{"id":"mea","nom":"Mission autorité environnementale","elements":[{"id":"arrete","nom":"Arrêté préfectoral","description":"Numéro de l'arrêté préfectoral portant décision dans le cadre de l’examen au cas par cas du projet d’autorisation de recherche minière","optionnel":true,"type":"text","value":"R03-2022-09-26-00002"}]}],"entreprises_documents":[],"documents":[],"decisions_annexes_contenu":null,"decisions_annexes_sections":null}],"demarche_type_id":"oct","demarche_statut_id":"acc","demarche_date_debut":"2023-09-19","demarche_date_fin":"2024-01-19","ordre":1}],"nb_activites_to_do":null})
+    const criqueAdolpheData = titreGetValidator.parse({"id":"tbFvGIDboAzxTb54GQyghTyc","nom":"Crique Adolphe","slug":"m-ar-crique-adolphe-2023","titre_type_id":"arm","titre_statut_id":"ech","titre_doublon":null,"references":[{"nom":"2022-032","referenceTypeId":"ptm"},{"nom":"AR 2022-027","referenceTypeId":"onf"}],"titre_last_modified_date":"2023-10-20","demarches":[{"id":"yAvBOMdHDsyES7phbS5hRKLA","slug":"m-ar-crique-adolphe-2023-oct01","description":null,"etapes":[{"etape_type_id":"sco","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":null,"titulaires":null,"amodiataires":null,"perimetre":null},"etape_statut_id":"fai","date":"2023-09-19","id":"5649942721fd9f3478381ae9","ordre":16,"notes":null,"slug":"m-ar-crique-adolphe-2023-oct01-sco01","sections_with_values":[{"id":"suivi","nom":"Suivi de la démarche","elements":[{"id":"signataire","nom":"Signataire ONF","description":"Prénom et nom du représentant légal du titulaire de l'ONF","optionnel":true,"type":"text","value":null},{"id":"titulaire","nom":"Signataire titulaire","description":"Prénom et nom du représentant légal du titulaire de l'autorisation","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"aca","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":null,"titulaires":null,"amodiataires":null,"perimetre":null},"etape_statut_id":"fav","date":"2023-01-11","id":"oXXG5ToIYbw8MvdYPX7sMMAP","ordre":12,"notes":null,"slug":"m-ar-crique-adolphe-2023-oct01-aca01","sections_with_values":[],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"sca","etape_statut_id":"fai","date":"2023-01-11","id":"WLXKWB9Fv17gm2gTJYIXnTyX","ordre":11,"notes":null,"slug":"m-ar-crique-adolphe-2023-oct01-sca01","sections_with_values":[],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"rde","etape_statut_id":"fav","date":"2022-12-29","id":"y0SCXGJ1OBYSthcWyojyOLZX","ordre":9,"notes":null,"slug":"m-ar-crique-adolphe-2023-oct01-rde01","sections_with_values":[{"id":"deal","nom":"DEAL","elements":[{"id":"numero-dossier-deal-eau","nom":"Numéro de dossier","description":"Numéro de dossier DEAL Service eau","optionnel":true,"type":"text","value":""},{"id":"numero-recepisse","nom":"Numéro de récépissé","description":"Numéro de récépissé émis par la DEAL Service eau","optionnel":true,"type":"text","value":"R03-2022-12-29-00005"}]}],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"mcr","etape_statut_id":"fav","date":"2022-12-05","id":"0vdB4jaJbpIpyUnIZkKPsmCm","ordre":7,"notes":null,"slug":"m-ar-crique-adolphe-2023-oct01-mcr01","sections_with_values":[],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"mfr","fondamentale":{"date_debut":null,"date_fin":null,"duree":4,"substances":["auru"],"titulaires":[{"id":"fr-794312231","nom":"SOCIETE MINIERE DE L OUEST (S.M.O)","operateur":false}],"amodiataires":null,"perimetre":{"geojson4326_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-53.581810139,3.830965486],[-53.581783064,3.821927822],[-53.572785591,3.821954938],[-53.572812572,3.830992667],[-53.581810139,3.830965486]]],[[[-53.600314085,3.822478099],[-53.598916453,3.81818315],[-53.581812057,3.823798548],[-53.58320965,3.828093576],[-53.600314085,3.822478099]]],[[[-53.583861926,3.850211446],[-53.592379712,3.834289122],[-53.588417036,3.832150192],[-53.579899144,3.848072512],[-53.583861926,3.850211446]]]]}},"geojson4326_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.58181013905019,3.8309654861273]},"properties":{"nom":"S1","description":"ARM1.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.57281257175149,3.8309926670647294]},"properties":{"nom":"S2","description":"ARM1.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.572785590706495,3.82195493825841]},"properties":{"nom":"S3","description":"ARM1.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.58178306390299,3.8219278216269807]},"properties":{"nom":"S4","description":"ARM1.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.60031408473134,3.8224780986447566]},"properties":{"nom":"S5","description":"ARM2.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.58320964990986,3.828093576227541]},"properties":{"nom":"S6","description":"ARM2.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.58181205656814,3.82379854768971]},"properties":{"nom":"S7","description":"ARM2.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.59891645305842,3.8181831495446303]},"properties":{"nom":"S8","description":"ARM2.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.583861926103765,3.8502114455117433]},"properties":{"nom":"S9","description":"ARM3.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.57989914401643,3.8480725119510217]},"properties":{"nom":"S10","description":"ARM3.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.588417035915334,3.8321501920354253]},"properties":{"nom":"S11","description":"ARM3.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.592379712320195,3.834289122043602]},"properties":{"nom":"S12","description":"ARM3.3"}}]},"geojson_origine_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-53.581810139,3.830965486],[-53.581783064,3.821927822],[-53.572785591,3.821954938],[-53.572812572,3.830992667],[-53.581810139,3.830965486]]],[[[-53.600314085,3.822478099],[-53.598916453,3.81818315],[-53.581812057,3.823798548],[-53.58320965,3.828093576],[-53.600314085,3.822478099]]],[[[-53.583861926,3.850211446],[-53.592379712,3.834289122],[-53.588417036,3.832150192],[-53.579899144,3.848072512],[-53.583861926,3.850211446]]]]}},"geojson4326_forages":null,"geojson_origine_forages":null,"geojson_origine_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.58181013905019,3.8309654861273]},"properties":{"nom":"S1","description":"ARM1.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.57281257175149,3.8309926670647294]},"properties":{"nom":"S2","description":"ARM1.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.572785590706495,3.82195493825841]},"properties":{"nom":"S3","description":"ARM1.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.58178306390299,3.8219278216269807]},"properties":{"nom":"S4","description":"ARM1.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.60031408473134,3.8224780986447566]},"properties":{"nom":"S5","description":"ARM2.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.58320964990986,3.828093576227541]},"properties":{"nom":"S6","description":"ARM2.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.58181205656814,3.82379854768971]},"properties":{"nom":"S7","description":"ARM2.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.59891645305842,3.8181831495446303]},"properties":{"nom":"S8","description":"ARM2.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.583861926103765,3.8502114455117433]},"properties":{"nom":"S9","description":"ARM3.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.57989914401643,3.8480725119510217]},"properties":{"nom":"S10","description":"ARM3.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.588417035915334,3.8321501920354253]},"properties":{"nom":"S11","description":"ARM3.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.592379712320195,3.834289122043602]},"properties":{"nom":"S12","description":"ARM3.3"}}]},"geojson_origine_geo_systeme_id":"4326","surface":3,"communes":[{"id":"97353","nom":"Maripasoula"}],"secteurs_maritimes":[],"sdom_zones":[],"forets":[]}},"etape_statut_id":"fai","date":"2022-11-08","id":"pwqOEAsAmaWi0o24QiVeVZ40","ordre":3,"notes":null,"slug":"m-ar-crique-adolphe-2023-oct01-mfr01","sections_with_values":[{"id":"arm","nom":"Caractéristiques ARM","elements":[{"id":"mecanise","nom":"Prospection mécanisée","description":"","type":"radio","value":true},{"id":"franchissements","nom":"Franchissements de cours d'eau","description":"Nombre de franchissements de cours d'eau","optionnel":true,"type":"integer","value":12}]}],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"mdp","etape_statut_id":"fai","date":"2022-11-08","id":"pF4UG6UrCOJmKjtgmtpwthTQ","ordre":4,"notes":null,"slug":"m-ar-crique-adolphe-2023-oct01-mdp01","sections_with_values":[],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"dae","etape_statut_id":"exe","date":"2022-09-26","id":"KA7tyvIdlqQmmVOuVjEl0Hdt","ordre":1,"notes":null,"slug":"m-ar-crique-adolphe-2023-oct01-dae01","sections_with_values":[{"id":"mea","nom":"Mission autorité environnementale","elements":[{"id":"arrete","nom":"Arrêté préfectoral","description":"Numéro de l'arrêté préfectoral portant décision dans le cadre de l’examen au cas par cas du projet d’autorisation de recherche minière","optionnel":true,"type":"text","value":"R03-2022-09-26-00002"}]}],"entreprises_documents":[],"etape_documents":[]}],"demarche_type_id":"oct","demarche_statut_id":"acc","demarche_date_debut":"2023-09-19","demarche_date_fin":"2024-01-19","ordre":1}],"nb_activites_to_do":null})
     criqueAdolpheData.nb_activites_to_do = 0
 
     return Promise.resolve(criqueAdolpheData)
@@ -446,7 +444,7 @@ const abattisKoticaApiClient: PropsApiClient = {
     getTitreAction(titreIdOrSlug)
 
     // prettier-ignore
-    const abattisData = titreGetValidator.parse({"id":"ooyCY2eGMXLunjmwPbBYyQcf","nom":"Abattis Kotika","slug":"m-ar-abattis-kotika-2006","titre_type_id":"arm","titre_statut_id":"ech","titre_doublon":null,"references":[{"nom":"AR2006060","referenceTypeId":"onf"},{"nom":"2006-061","referenceTypeId":"ptm"}],"titre_last_modified_date":null,"demarches":[{"id":"SjKhYLXdqcla1BaN3nmgQhPs","slug":"m-ar-abattis-kotika-2006-oct01","description":null,"etapes":[{"etape_type_id":"def","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":[],"titulaires":null,"amodiataires":null,"perimetre":null},"etape_statut_id":"acc","date":"2006-11-28","id":"Pw734o5mdB2K2AWaOKQ85Ydz","ordre":5,"notes":null,"slug":"m-ar-abattis-kotika-2006-oct01-def01","sections_with_values":[],"entreprises_documents":[],"documents":[],"decisions_annexes_contenu":null,"decisions_annexes_sections":null},{"etape_type_id":"sco","fondamentale":{"date_debut":null,"date_fin":"2007-03-27","duree":4,"substances":["auru"],"titulaires":[{"id":"fr-480857036","nom":"TOMANY","operateur":false}],"amodiataires":null,"perimetre":{"geojson4326_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-54.256565011,3.953104288],[-54.257194444,3.948468234],[-54.239271461,3.946452081],[-54.238766556,3.950762546],[-54.256565011,3.953104288]]],[[[-54.251541223,3.944796229],[-54.251001626,3.940173776],[-54.233048995,3.942095626],[-54.233561357,3.946673115],[-54.251541223,3.944796229]]]]}},"geojson4326_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-54.256565011133,3.95310428827045]},"properties":{"nom":"1","description":"a"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-54.2387665564076,3.95076254570704]},"properties":{"nom":"2","description":"b"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-54.2392714613677,3.9464520807474]},"properties":{"nom":"3","description":"c"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-54.2571944444789,3.94846823388004]},"properties":{"nom":"4","description":"d"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-54.251541223062,3.94479622927321]},"properties":{"nom":"1","description":"e"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-54.2335613570663,3.94667311503072]},"properties":{"nom":"2","description":"f"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-54.2330489949186,3.94209562569541]},"properties":{"nom":"3","description":"g"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-54.251001625524,3.94017377611083]},"properties":{"nom":"4","description":"h"}}]},"geojson_origine_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-54.256565011,3.953104288],[-54.257194444,3.948468234],[-54.239271461,3.946452081],[-54.238766556,3.950762546],[-54.256565011,3.953104288]]],[[[-54.251541223,3.944796229],[-54.251001626,3.940173776],[-54.233048995,3.942095626],[-54.233561357,3.946673115],[-54.251541223,3.944796229]]]]}},"geojson4326_forages":null,"geojson_origine_forages":null,"geojson_origine_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-54.256565011133,3.95310428827045]},"properties":{"nom":"1","description":"a"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-54.2387665564076,3.95076254570704]},"properties":{"nom":"2","description":"b"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-54.2392714613677,3.9464520807474]},"properties":{"nom":"3","description":"c"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-54.2571944444789,3.94846823388004]},"properties":{"nom":"4","description":"d"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-54.251541223062,3.94479622927321]},"properties":{"nom":"1","description":"e"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-54.2335613570663,3.94667311503072]},"properties":{"nom":"2","description":"f"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-54.2330489949186,3.94209562569541]},"properties":{"nom":"3","description":"g"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-54.251001625524,3.94017377611083]},"properties":{"nom":"4","description":"h"}}]},"geojson_origine_geo_systeme_id":"4326","surface":2,"communes":[{"id":"97362","nom":"Papaichton"}],"secteurs_maritimes":[],"sdom_zones":["0_potentielle","2"],"forets":[]}},"etape_statut_id":"fai","date":"2006-11-28","id":"1iF8kbcg0oGaEMAJxgUZYk8W","ordre":6,"notes":null,"slug":"m-ar-abattis-kotika-2006-oct01-sco01","sections_with_values":[{"id":"arm","nom":"Caractéristiques ARM","elements":[{"id":"mecanise","nom":"Prospection mécanisée","type":"radio","value":null}]},{"id":"suivi","nom":"Suivi de la démarche","elements":[{"id":"signataire","nom":"Signataire ONF","description":"Prénom et nom du représentant légal du titulaire de l'ONF","optionnel":true,"type":"text","value":"Michel Borderes"},{"id":"titulaire","nom":"Signataire titulaire","description":"Prénom et nom du représentant légal du titulaire de l'autorisation","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"documents":[],"decisions_annexes_contenu":null,"decisions_annexes_sections":null},{"etape_type_id":"men","etape_statut_id":"fai","date":"2006-10-16","id":"TMWQQo20x3j7BJ8Sboaq1B20","ordre":2,"notes":null,"slug":"m-ar-abattis-kotika-2006-oct01-men01","sections_with_values":[],"entreprises_documents":[],"documents":[],"decisions_annexes_contenu":null,"decisions_annexes_sections":null}],"demarche_type_id":"oct","demarche_statut_id":"acc","demarche_date_debut":"2006-11-28","demarche_date_fin":"2007-03-27","ordre":1}],"nb_activites_to_do":null})
+    const abattisData = titreGetValidator.parse({"id":"ooyCY2eGMXLunjmwPbBYyQcf","nom":"Abattis Kotika","slug":"m-ar-abattis-kotika-2006","titre_type_id":"arm","titre_statut_id":"ech","titre_doublon":null,"references":[{"nom":"AR2006060","referenceTypeId":"onf"},{"nom":"2006-061","referenceTypeId":"ptm"}],"titre_last_modified_date":null,"demarches":[{"id":"SjKhYLXdqcla1BaN3nmgQhPs","slug":"m-ar-abattis-kotika-2006-oct01","description":null,"etapes":[{"etape_type_id":"def","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":[],"titulaires":null,"amodiataires":null,"perimetre":null},"etape_statut_id":"acc","date":"2006-11-28","id":"Pw734o5mdB2K2AWaOKQ85Ydz","ordre":5,"notes":null,"slug":"m-ar-abattis-kotika-2006-oct01-def01","sections_with_values":[],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"sco","fondamentale":{"date_debut":null,"date_fin":"2007-03-27","duree":4,"substances":["auru"],"titulaires":[{"id":"fr-480857036","nom":"TOMANY","operateur":false}],"amodiataires":null,"perimetre":{"geojson4326_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-54.256565011,3.953104288],[-54.257194444,3.948468234],[-54.239271461,3.946452081],[-54.238766556,3.950762546],[-54.256565011,3.953104288]]],[[[-54.251541223,3.944796229],[-54.251001626,3.940173776],[-54.233048995,3.942095626],[-54.233561357,3.946673115],[-54.251541223,3.944796229]]]]}},"geojson4326_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-54.256565011133,3.95310428827045]},"properties":{"nom":"1","description":"a"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-54.2387665564076,3.95076254570704]},"properties":{"nom":"2","description":"b"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-54.2392714613677,3.9464520807474]},"properties":{"nom":"3","description":"c"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-54.2571944444789,3.94846823388004]},"properties":{"nom":"4","description":"d"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-54.251541223062,3.94479622927321]},"properties":{"nom":"1","description":"e"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-54.2335613570663,3.94667311503072]},"properties":{"nom":"2","description":"f"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-54.2330489949186,3.94209562569541]},"properties":{"nom":"3","description":"g"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-54.251001625524,3.94017377611083]},"properties":{"nom":"4","description":"h"}}]},"geojson_origine_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-54.256565011,3.953104288],[-54.257194444,3.948468234],[-54.239271461,3.946452081],[-54.238766556,3.950762546],[-54.256565011,3.953104288]]],[[[-54.251541223,3.944796229],[-54.251001626,3.940173776],[-54.233048995,3.942095626],[-54.233561357,3.946673115],[-54.251541223,3.944796229]]]]}},"geojson4326_forages":null,"geojson_origine_forages":null,"geojson_origine_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-54.256565011133,3.95310428827045]},"properties":{"nom":"1","description":"a"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-54.2387665564076,3.95076254570704]},"properties":{"nom":"2","description":"b"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-54.2392714613677,3.9464520807474]},"properties":{"nom":"3","description":"c"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-54.2571944444789,3.94846823388004]},"properties":{"nom":"4","description":"d"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-54.251541223062,3.94479622927321]},"properties":{"nom":"1","description":"e"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-54.2335613570663,3.94667311503072]},"properties":{"nom":"2","description":"f"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-54.2330489949186,3.94209562569541]},"properties":{"nom":"3","description":"g"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-54.251001625524,3.94017377611083]},"properties":{"nom":"4","description":"h"}}]},"geojson_origine_geo_systeme_id":"4326","surface":2,"communes":[{"id":"97362","nom":"Papaichton"}],"secteurs_maritimes":[],"sdom_zones":["0_potentielle","2"],"forets":[]}},"etape_statut_id":"fai","date":"2006-11-28","id":"1iF8kbcg0oGaEMAJxgUZYk8W","ordre":6,"notes":null,"slug":"m-ar-abattis-kotika-2006-oct01-sco01","sections_with_values":[{"id":"arm","nom":"Caractéristiques ARM","elements":[{"id":"mecanise","nom":"Prospection mécanisée","type":"radio","value":null}]},{"id":"suivi","nom":"Suivi de la démarche","elements":[{"id":"signataire","nom":"Signataire ONF","description":"Prénom et nom du représentant légal du titulaire de l'ONF","optionnel":true,"type":"text","value":"Michel Borderes"},{"id":"titulaire","nom":"Signataire titulaire","description":"Prénom et nom du représentant légal du titulaire de l'autorisation","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"men","etape_statut_id":"fai","date":"2006-10-16","id":"TMWQQo20x3j7BJ8Sboaq1B20","ordre":2,"notes":null,"slug":"m-ar-abattis-kotika-2006-oct01-men01","sections_with_values":[],"entreprises_documents":[],"etape_documents":[]}],"demarche_type_id":"oct","demarche_statut_id":"acc","demarche_date_debut":"2006-11-28","demarche_date_fin":"2007-03-27","ordre":1}],"nb_activites_to_do":null})
     abattisData.nb_activites_to_do = 0
 
     return Promise.resolve(abattisData)
@@ -471,15 +469,15 @@ const bonEspoirApiClient: PropsApiClient = {
     getTitreAction(titreIdOrSlug)
 
     // prettier-ignore
-    const bonEspoirData = titreGetValidator.parse({"id":"sJorD6pQomXTN7oRpyGwLijB","nom":"Bon Espoir","slug":"m-pr-bon-espoir-2001","titre_type_id":"prm","titre_statut_id":"ech","titre_doublon":null,"references":[{"nom":"21/2001","referenceTypeId":"dea"},{"nom":"2013-0033-MI","referenceTypeId":"deb"}],"titre_last_modified_date":"2023-11-30","demarches":[{"id":"ry8fHgRWiKEOE1x1ZANmajh8","slug":"m-pr-bon-espoir-2001-oct01","description":null,"etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":"2001-11-01","date_fin":null,"duree":60,"substances":["auru","scoc"],"titulaires":null,"amodiataires":null,"perimetre":{"geojson4326_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-53.957932101,5.077769388],[-53.957523215,4.987353337],[-53.86736267,4.98775355],[-53.867226527,4.956317348],[-53.777063114,4.956702765],[-53.776987892,4.938687225],[-53.569873008,4.939523155],[-53.570206958,5.025376089],[-53.759383912,5.02460196],[-53.759612886,5.078649124],[-53.957932101,5.077769388]]]]}},"geojson4326_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.9579321010744,5.07776938770113]},"properties":{"nom":"1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.7596128864516,5.07864912381548]},"properties":{"nom":"2","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.759383911755,5.02460196044417]},"properties":{"nom":"3","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.5702069576163,5.02537608911083]},"properties":{"nom":"4","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.5698730075868,4.93952315477954]},"properties":{"nom":"5","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.7769878916108,4.93868722476635]},"properties":{"nom":"6","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.7770631139658,4.95670276466037]},"properties":{"nom":"7","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.8672265271601,4.95631734759459]},"properties":{"nom":"8","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.8673626701318,4.98775355007457]},"properties":{"nom":"9","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.9575232150351,4.98735333700249]},"properties":{"nom":"10","description":null}}]},"geojson_origine_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-53.957932101,5.077769388],[-53.957523215,4.987353337],[-53.86736267,4.98775355],[-53.867226527,4.956317348],[-53.777063114,4.956702765],[-53.776987892,4.938687225],[-53.569873008,4.939523155],[-53.570206958,5.025376089],[-53.759383912,5.02460196],[-53.759612886,5.078649124],[-53.957932101,5.077769388]]]]}},"geojson4326_forages":null,"geojson_origine_forages":null,"geojson_origine_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.9579321010744,5.07776938770113]},"properties":{"nom":"1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.7596128864516,5.07864912381548]},"properties":{"nom":"2","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.759383911755,5.02460196044417]},"properties":{"nom":"3","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.5702069576163,5.02537608911083]},"properties":{"nom":"4","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.5698730075868,4.93952315477954]},"properties":{"nom":"5","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.7769878916108,4.93868722476635]},"properties":{"nom":"6","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.7770631139658,4.95670276466037]},"properties":{"nom":"7","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.8672265271601,4.95631734759459]},"properties":{"nom":"8","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.8673626701318,4.98775355007457]},"properties":{"nom":"9","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.9575232150351,4.98735333700249]},"properties":{"nom":"10","description":null}}]},"geojson_origine_geo_systeme_id":"4326","surface":465.5,"communes":[{"id":"97306","nom":"Mana"},{"id":"97311","nom":"Saint-Laurent-du-Maroni"}],"secteurs_maritimes":[],"sdom_zones":["0","2"],"forets":["LDD","MDF","PAUL"]}},"etape_statut_id":"acc","date":"2001-10-26","id":"CRVhvEIQAc319vUd8BfZoH5W","ordre":2,"notes":null,"slug":"m-pr-bon-espoir-2001-oct01-dpu01","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":3201430},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":"EUR"}]},{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":"JORFTEXT000000774145"},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":"ECOI0100462D"}]}],"entreprises_documents":[],"documents":[],"decisions_annexes_contenu":null,"decisions_annexes_sections":null},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":[],"titulaires":null,"amodiataires":null,"perimetre":null},"etape_statut_id":"acc","date":"2001-10-24","id":"Ce4K8goEZzjqXRJLL051jcpD","ordre":1,"notes":null,"slug":"m-pr-bon-espoir-2001-oct01-dex01","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":null},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":null}]},{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"documents":[{"id":"2001-10-24-dec-cdc61459","description":"Décret du 24 octobre 2001 accordant un permis de recherches A en Guyane","document_type_id":"dec","public_lecture":true,"entreprises_lecture":true}],"decisions_annexes_contenu":null,"decisions_annexes_sections":null}],"demarche_type_id":"oct","demarche_statut_id":"acc","demarche_date_debut":"2001-11-01","demarche_date_fin":"2006-11-01","ordre":1},{"id":"PnFewl8P4Zt5Vm49zXqyn7Ml","slug":"m-pr-bon-espoir-2001-pr101","description":null,"etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":["auru"],"titulaires":null,"amodiataires":null,"perimetre":null},"etape_statut_id":"acc","date":"2010-03-02","id":"qtn2a3DNPx258VZgSjqXGKf6","ordre":4,"notes":null,"slug":"m-pr-bon-espoir-2001-pr101-dpu02","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":560000},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":"EUR"}]},{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":"JORFTEXT000021889053"},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":"DEVO1003938A"}]}],"entreprises_documents":[],"documents":[],"decisions_annexes_contenu":null,"decisions_annexes_sections":null},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":[],"titulaires":null,"amodiataires":null,"perimetre":null},"etape_statut_id":"acc","date":"2010-02-17","id":"tjOMgkb83wksMc6DFuqrecbu","ordre":3,"notes":null,"slug":"m-pr-bon-espoir-2001-pr101-dex02","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":null},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":null}]},{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"documents":[{"id":"2010-02-17-arr-a26ea089","description":"Arrêté du 17 février 2010 modifiant l'arrêté du 6 mai 2009 prolongeant la validité du permis exclusif de recherches de mines d'or dit « Permis de Bon Espoir » et réduisant sa surface (Guyane)","document_type_id":"arr","public_lecture":true,"entreprises_lecture":true}],"decisions_annexes_contenu":null,"decisions_annexes_sections":null},{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":"2011-10-31","duree":null,"substances":["auru"],"titulaires":null,"amodiataires":null,"perimetre":{"geojson4326_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-53.957777778,5.076666667],[-53.9575,5.0325],[-53.894444444,5.000555556],[-53.820833333,4.979722222],[-53.713888889,4.963888889],[-53.732222222,5.023611111],[-53.876388889,5.022777778],[-53.957777778,5.076666667]]]]}},"geojson4326_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.9577777777778,5.07666666666667]},"properties":{"nom":"A","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.8763888888889,5.02277777777778]},"properties":{"nom":"B","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.7322222222222,5.02361111111111]},"properties":{"nom":"C","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.7138888888889,4.96388888888889]},"properties":{"nom":"D","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.8208333333333,4.97972222222222]},"properties":{"nom":"E","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.8944444444444,5.00055555555556]},"properties":{"nom":"F","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.9575,5.0325]},"properties":{"nom":"G","description":null}}]},"geojson_origine_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-53.957777778,5.076666667],[-53.9575,5.0325],[-53.894444444,5.000555556],[-53.820833333,4.979722222],[-53.713888889,4.963888889],[-53.732222222,5.023611111],[-53.876388889,5.022777778],[-53.957777778,5.076666667]]]]}},"geojson4326_forages":null,"geojson_origine_forages":null,"geojson_origine_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.9577777777778,5.07666666666667]},"properties":{"nom":"A","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.8763888888889,5.02277777777778]},"properties":{"nom":"B","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.7322222222222,5.02361111111111]},"properties":{"nom":"C","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.7138888888889,4.96388888888889]},"properties":{"nom":"D","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.8208333333333,4.97972222222222]},"properties":{"nom":"E","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.8944444444444,5.00055555555556]},"properties":{"nom":"F","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.9575,5.0325]},"properties":{"nom":"G","description":null}}]},"geojson_origine_geo_systeme_id":"4326","surface":122.275,"communes":[{"id":"97306","nom":"Mana"},{"id":"97311","nom":"Saint-Laurent-du-Maroni"}],"secteurs_maritimes":[],"sdom_zones":["0","2"],"forets":["LDD","PAUL"]}},"etape_statut_id":"acc","date":"2009-05-16","id":"07cbyPCYcOtKYkw4kOqg2Sed","ordre":2,"notes":null,"slug":"m-pr-bon-espoir-2001-pr101-dpu01","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":837000},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":"EUR"}]},{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":"JORFTEXT000020616467"},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":"DEVO0909004A"}]}],"entreprises_documents":[],"documents":[],"decisions_annexes_contenu":null,"decisions_annexes_sections":null},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":[],"titulaires":null,"amodiataires":null,"perimetre":null},"etape_statut_id":"acc","date":"2009-05-06","id":"orsPMmIfX4kSgVus0HTrBxAo","ordre":1,"notes":null,"slug":"m-pr-bon-espoir-2001-pr101-dex01","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":null},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":null}]},{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"documents":[{"id":"2009-05-06-arr-54f88e41","description":"Arrêté du 6 mai 2009 prolongeant la validité du permis exclusif de recherches de mines d'or dit « Permis Bon Espoir » et réduisant sa superficie (Guyane)","document_type_id":"arr","public_lecture":true,"entreprises_lecture":true}],"decisions_annexes_contenu":null,"decisions_annexes_sections":null}],"demarche_type_id":"pr1","demarche_statut_id":"acc","demarche_date_debut":"2006-11-01","demarche_date_fin":"2011-10-31","ordre":2},{"id":"EMFAv33wlGqMcjd6DwKzQBvr","slug":"m-pr-bon-espoir-2001-pr201","description":null,"etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":"2016-10-31","duree":60,"substances":["auru","scoc"],"titulaires":[{"id":"fr-401802863","nom":"ARMINA RESSOURCES MINIERES SARL","operateur":false}],"amodiataires":null,"perimetre":null},"etape_statut_id":"acc","date":"2015-08-15","id":"Qp5DRYEN3Nc9n4CIwEYW7evs","ordre":9,"notes":null,"slug":"m-pr-bon-espoir-2001-pr201-dpu01","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":1250000},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":"EUR"}]},{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":"JORFTEXT000031053068"},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":"EINL1518062A"}]}],"entreprises_documents":[],"documents":[],"decisions_annexes_contenu":null,"decisions_annexes_sections":null},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":60,"substances":["auru","scoc"],"titulaires":[{"id":"fr-401802863","nom":"ARMINA RESSOURCES MINIERES SARL","operateur":false}],"amodiataires":null,"perimetre":null},"etape_statut_id":"acc","date":"2015-08-03","id":"ABvgimvovFWeEhoMOrKi4wAy","ordre":8,"notes":null,"slug":"m-pr-bon-espoir-2001-pr201-dex01","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":null},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":null}]},{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"documents":[{"id":"2015-08-03-arm-8bf71a65","description":"Arrêté du 3 août 2015 prolongeant la durée de validité du permis exclusif de recherches de mines d'or et de substances connexes dit « Permis de Bon Espoir » attribué à la société Armina Ressources Minières dans le département de Guyane","document_type_id":"arm","public_lecture":true,"entreprises_lecture":true}],"decisions_annexes_contenu":null,"decisions_annexes_sections":null},{"etape_type_id":"mdp","etape_statut_id":"fai","date":"2011-06-30","id":"nLXaR7H78V43GB47ypDoqvKz","ordre":2,"notes":null,"slug":"m-pr-bon-espoir-2001-pr201-mdp01","sections_with_values":[],"entreprises_documents":[],"documents":[],"decisions_annexes_contenu":null,"decisions_annexes_sections":null},{"etape_type_id":"mfr","fondamentale":{"date_debut":null,"date_fin":null,"duree":60,"substances":["auru","arge","cuiv"],"titulaires":[{"id":"fr-401802863","nom":"ARMINA RESSOURCES MINIERES SARL","operateur":false}],"amodiataires":null,"perimetre":null},"etape_statut_id":"fai","date":"2011-06-29","id":"iV47juaOeL4EAUsOqiWN6gOO","ordre":1,"notes":null,"slug":"m-pr-bon-espoir-2001-pr201-mfr01","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":null},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":null}]}],"entreprises_documents":[],"documents":[],"decisions_annexes_contenu":null,"decisions_annexes_sections":null}],"demarche_type_id":"pr2","demarche_statut_id":"acc","demarche_date_debut":"2011-10-31","demarche_date_fin":"2016-10-31","ordre":3}],"nb_activites_to_do":null})
+    const bonEspoirData = titreGetValidator.parse({"id":"sJorD6pQomXTN7oRpyGwLijB","nom":"Bon Espoir","slug":"m-pr-bon-espoir-2001","titre_type_id":"prm","titre_statut_id":"ech","titre_doublon":null,"references":[{"nom":"21/2001","referenceTypeId":"dea"},{"nom":"2013-0033-MI","referenceTypeId":"deb"}],"titre_last_modified_date":"2023-11-30","demarches":[{"id":"ry8fHgRWiKEOE1x1ZANmajh8","slug":"m-pr-bon-espoir-2001-oct01","description":null,"etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":"2001-11-01","date_fin":null,"duree":60,"substances":["auru","scoc"],"titulaires":null,"amodiataires":null,"perimetre":{"geojson4326_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-53.957932101,5.077769388],[-53.957523215,4.987353337],[-53.86736267,4.98775355],[-53.867226527,4.956317348],[-53.777063114,4.956702765],[-53.776987892,4.938687225],[-53.569873008,4.939523155],[-53.570206958,5.025376089],[-53.759383912,5.02460196],[-53.759612886,5.078649124],[-53.957932101,5.077769388]]]]}},"geojson4326_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.9579321010744,5.07776938770113]},"properties":{"nom":"1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.7596128864516,5.07864912381548]},"properties":{"nom":"2","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.759383911755,5.02460196044417]},"properties":{"nom":"3","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.5702069576163,5.02537608911083]},"properties":{"nom":"4","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.5698730075868,4.93952315477954]},"properties":{"nom":"5","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.7769878916108,4.93868722476635]},"properties":{"nom":"6","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.7770631139658,4.95670276466037]},"properties":{"nom":"7","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.8672265271601,4.95631734759459]},"properties":{"nom":"8","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.8673626701318,4.98775355007457]},"properties":{"nom":"9","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.9575232150351,4.98735333700249]},"properties":{"nom":"10","description":null}}]},"geojson_origine_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-53.957932101,5.077769388],[-53.957523215,4.987353337],[-53.86736267,4.98775355],[-53.867226527,4.956317348],[-53.777063114,4.956702765],[-53.776987892,4.938687225],[-53.569873008,4.939523155],[-53.570206958,5.025376089],[-53.759383912,5.02460196],[-53.759612886,5.078649124],[-53.957932101,5.077769388]]]]}},"geojson4326_forages":null,"geojson_origine_forages":null,"geojson_origine_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.9579321010744,5.07776938770113]},"properties":{"nom":"1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.7596128864516,5.07864912381548]},"properties":{"nom":"2","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.759383911755,5.02460196044417]},"properties":{"nom":"3","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.5702069576163,5.02537608911083]},"properties":{"nom":"4","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.5698730075868,4.93952315477954]},"properties":{"nom":"5","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.7769878916108,4.93868722476635]},"properties":{"nom":"6","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.7770631139658,4.95670276466037]},"properties":{"nom":"7","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.8672265271601,4.95631734759459]},"properties":{"nom":"8","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.8673626701318,4.98775355007457]},"properties":{"nom":"9","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.9575232150351,4.98735333700249]},"properties":{"nom":"10","description":null}}]},"geojson_origine_geo_systeme_id":"4326","surface":465.5,"communes":[{"id":"97306","nom":"Mana"},{"id":"97311","nom":"Saint-Laurent-du-Maroni"}],"secteurs_maritimes":[],"sdom_zones":["0","2"],"forets":["LDD","MDF","PAUL"]}},"etape_statut_id":"acc","date":"2001-10-26","id":"CRVhvEIQAc319vUd8BfZoH5W","ordre":2,"notes":null,"slug":"m-pr-bon-espoir-2001-oct01-dpu01","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":3201430},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":"EUR"}]},{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":"JORFTEXT000000774145"},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":"ECOI0100462D"}]}],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":[],"titulaires":null,"amodiataires":null,"perimetre":null},"etape_statut_id":"acc","date":"2001-10-24","id":"Ce4K8goEZzjqXRJLL051jcpD","ordre":1,"notes":null,"slug":"m-pr-bon-espoir-2001-oct01-dex01","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":null},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":null}]},{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[{"id":"2001-10-24-dec-cdc61459","description":"Décret du 24 octobre 2001 accordant un permis de recherches A en Guyane","etape_document_type_id":"dec","public_lecture":true,"entreprises_lecture":true}]}],"demarche_type_id":"oct","demarche_statut_id":"acc","demarche_date_debut":"2001-11-01","demarche_date_fin":"2006-11-01","ordre":1},{"id":"PnFewl8P4Zt5Vm49zXqyn7Ml","slug":"m-pr-bon-espoir-2001-pr101","description":null,"etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":["auru"],"titulaires":null,"amodiataires":null,"perimetre":null},"etape_statut_id":"acc","date":"2010-03-02","id":"qtn2a3DNPx258VZgSjqXGKf6","ordre":4,"notes":null,"slug":"m-pr-bon-espoir-2001-pr101-dpu02","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":560000},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":"EUR"}]},{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":"JORFTEXT000021889053"},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":"DEVO1003938A"}]}],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":[],"titulaires":null,"amodiataires":null,"perimetre":null},"etape_statut_id":"acc","date":"2010-02-17","id":"tjOMgkb83wksMc6DFuqrecbu","ordre":3,"notes":null,"slug":"m-pr-bon-espoir-2001-pr101-dex02","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":null},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":null}]},{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[{"id":"2010-02-17-arr-a26ea089","description":"Arrêté du 17 février 2010 modifiant l'arrêté du 6 mai 2009 prolongeant la validité du permis exclusif de recherches de mines d'or dit « Permis de Bon Espoir » et réduisant sa surface (Guyane)","etape_document_type_id":"arr","public_lecture":true,"entreprises_lecture":true}]},{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":"2011-10-31","duree":null,"substances":["auru"],"titulaires":null,"amodiataires":null,"perimetre":{"geojson4326_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-53.957777778,5.076666667],[-53.9575,5.0325],[-53.894444444,5.000555556],[-53.820833333,4.979722222],[-53.713888889,4.963888889],[-53.732222222,5.023611111],[-53.876388889,5.022777778],[-53.957777778,5.076666667]]]]}},"geojson4326_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.9577777777778,5.07666666666667]},"properties":{"nom":"A","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.8763888888889,5.02277777777778]},"properties":{"nom":"B","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.7322222222222,5.02361111111111]},"properties":{"nom":"C","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.7138888888889,4.96388888888889]},"properties":{"nom":"D","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.8208333333333,4.97972222222222]},"properties":{"nom":"E","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.8944444444444,5.00055555555556]},"properties":{"nom":"F","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.9575,5.0325]},"properties":{"nom":"G","description":null}}]},"geojson_origine_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-53.957777778,5.076666667],[-53.9575,5.0325],[-53.894444444,5.000555556],[-53.820833333,4.979722222],[-53.713888889,4.963888889],[-53.732222222,5.023611111],[-53.876388889,5.022777778],[-53.957777778,5.076666667]]]]}},"geojson4326_forages":null,"geojson_origine_forages":null,"geojson_origine_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.9577777777778,5.07666666666667]},"properties":{"nom":"A","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.8763888888889,5.02277777777778]},"properties":{"nom":"B","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.7322222222222,5.02361111111111]},"properties":{"nom":"C","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.7138888888889,4.96388888888889]},"properties":{"nom":"D","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.8208333333333,4.97972222222222]},"properties":{"nom":"E","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.8944444444444,5.00055555555556]},"properties":{"nom":"F","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.9575,5.0325]},"properties":{"nom":"G","description":null}}]},"geojson_origine_geo_systeme_id":"4326","surface":122.275,"communes":[{"id":"97306","nom":"Mana"},{"id":"97311","nom":"Saint-Laurent-du-Maroni"}],"secteurs_maritimes":[],"sdom_zones":["0","2"],"forets":["LDD","PAUL"]}},"etape_statut_id":"acc","date":"2009-05-16","id":"07cbyPCYcOtKYkw4kOqg2Sed","ordre":2,"notes":null,"slug":"m-pr-bon-espoir-2001-pr101-dpu01","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":837000},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":"EUR"}]},{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":"JORFTEXT000020616467"},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":"DEVO0909004A"}]}],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":[],"titulaires":null,"amodiataires":null,"perimetre":null},"etape_statut_id":"acc","date":"2009-05-06","id":"orsPMmIfX4kSgVus0HTrBxAo","ordre":1,"notes":null,"slug":"m-pr-bon-espoir-2001-pr101-dex01","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":null},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":null}]},{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[{"id":"2009-05-06-arr-54f88e41","description":"Arrêté du 6 mai 2009 prolongeant la validité du permis exclusif de recherches de mines d'or dit « Permis Bon Espoir » et réduisant sa superficie (Guyane)","etape_document_type_id":"arr","public_lecture":true,"entreprises_lecture":true}]}],"demarche_type_id":"pr1","demarche_statut_id":"acc","demarche_date_debut":"2006-11-01","demarche_date_fin":"2011-10-31","ordre":2},{"id":"EMFAv33wlGqMcjd6DwKzQBvr","slug":"m-pr-bon-espoir-2001-pr201","description":null,"etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":"2016-10-31","duree":60,"substances":["auru","scoc"],"titulaires":[{"id":"fr-401802863","nom":"ARMINA RESSOURCES MINIERES SARL","operateur":false}],"amodiataires":null,"perimetre":null},"etape_statut_id":"acc","date":"2015-08-15","id":"Qp5DRYEN3Nc9n4CIwEYW7evs","ordre":9,"notes":null,"slug":"m-pr-bon-espoir-2001-pr201-dpu01","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":1250000},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":"EUR"}]},{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":"JORFTEXT000031053068"},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":"EINL1518062A"}]}],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":60,"substances":["auru","scoc"],"titulaires":[{"id":"fr-401802863","nom":"ARMINA RESSOURCES MINIERES SARL","operateur":false}],"amodiataires":null,"perimetre":null},"etape_statut_id":"acc","date":"2015-08-03","id":"ABvgimvovFWeEhoMOrKi4wAy","ordre":8,"notes":null,"slug":"m-pr-bon-espoir-2001-pr201-dex01","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":null},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":null}]},{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[{"id":"2015-08-03-arm-8bf71a65","description":"Arrêté du 3 août 2015 prolongeant la durée de validité du permis exclusif de recherches de mines d'or et de substances connexes dit « Permis de Bon Espoir » attribué à la société Armina Ressources Minières dans le département de Guyane","etape_document_type_id":"arm","public_lecture":true,"entreprises_lecture":true}]},{"etape_type_id":"mdp","etape_statut_id":"fai","date":"2011-06-30","id":"nLXaR7H78V43GB47ypDoqvKz","ordre":2,"notes":null,"slug":"m-pr-bon-espoir-2001-pr201-mdp01","sections_with_values":[],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"mfr","fondamentale":{"date_debut":null,"date_fin":null,"duree":60,"substances":["auru","arge","cuiv"],"titulaires":[{"id":"fr-401802863","nom":"ARMINA RESSOURCES MINIERES SARL","operateur":false}],"amodiataires":null,"perimetre":null},"etape_statut_id":"fai","date":"2011-06-29","id":"iV47juaOeL4EAUsOqiWN6gOO","ordre":1,"notes":null,"slug":"m-pr-bon-espoir-2001-pr201-mfr01","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":null},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":null}]}],"entreprises_documents":[],"etape_documents":[]}],"demarche_type_id":"pr2","demarche_statut_id":"acc","demarche_date_debut":"2011-10-31","demarche_date_fin":"2016-10-31","ordre":3}],"nb_activites_to_do":null})
     bonEspoirData.nb_activites_to_do = 0
     // prettier-ignore
-    bonEspoirData.demarches.push(demarcheGetValidator.parse({ "id": "idtravaux", "ordre": 4, "slug": "m-pr-bon-espoir-2001-dam01", "description": null, "etapes": [{"etape_type_id": "wpo", "ordre": 4,notes: null, "etape_statut_id": "acc","date": "2012-07-23",	"id": "idEtapeTravaux1","slug": "m-pr-bon-espoir-2001-dam01-wpo01","sections_with_values": [],"entreprises_documents": [],"documents": [{"id": "2012-07-23-apd-607c3aa8","description": "N°2012-SPR-DRMSS-1","document_type_id": "apd","public_lecture": false,"entreprises_lecture": false	}],"decisions_annexes_contenu": null,"decisions_annexes_sections": null},	{"etape_type_id": "wpp", "ordre": 3,notes: null,"etape_statut_id": "fai","date": "2011-05-04","id": "idEtapeTravaux2","slug": "m-pr-bon-espoir-2001-dam01-wpp01","sections_with_values": [],"entreprises_documents": [],"documents": [{"id": "id_Document","description": "","document_type_id": "apu","public_lecture": false,"entreprises_lecture": false	}],"decisions_annexes_contenu": null,"decisions_annexes_sections": null},	{"etape_type_id": "wfd", "ordre": 2,notes: null, "etape_statut_id": "fai","date": "2010-10-01","id": "idEtapeTravaux3","slug": "m-pr-bon-espoir-2001-dam01-wfd01","sections_with_values": [],"entreprises_documents": [],"documents": [],"decisions_annexes_contenu": null,"decisions_annexes_sections": null},	{"etape_type_id": "wre","ordre": 1,notes: null,"etape_statut_id": "fav","date": "2010-10-01","id": "idEtapeTravaux4","slug": "m-pr-bon-espoir-2001-dam01-wre01","sections_with_values": [],"entreprises_documents": [],"documents": [],"decisions_annexes_contenu": null,"decisions_annexes_sections": null}],"demarche_type_id": "dam","demarche_statut_id": "fpm","demarche_date_debut": null,"demarche_date_fin": null
+    bonEspoirData.demarches.push(demarcheGetValidator.parse({ "id": "idtravaux", "ordre": 4, "slug": "m-pr-bon-espoir-2001-dam01", "description": null, "etapes": [{"etape_type_id": "wpo", "ordre": 4,notes: null, "etape_statut_id": "acc","date": "2012-07-23",	"id": "idEtapeTravaux1","slug": "m-pr-bon-espoir-2001-dam01-wpo01","sections_with_values": [],"entreprises_documents": [],"etape_documents": [{"id": "2012-07-23-apd-607c3aa8","description": "N°2012-SPR-DRMSS-1","etape_document_type_id": "apd","public_lecture": false,"entreprises_lecture": false	}]},	{"etape_type_id": "wpp", "ordre": 3,notes: null,"etape_statut_id": "fai","date": "2011-05-04","id": "idEtapeTravaux2","slug": "m-pr-bon-espoir-2001-dam01-wpp01","sections_with_values": [],"entreprises_documents": [],"etape_documents": [{"id": "id_Document","description": "","etape_document_type_id": "apu","public_lecture": false,"entreprises_lecture": false	}]},	{"etape_type_id": "wfd", "ordre": 2,notes: null, "etape_statut_id": "fai","date": "2010-10-01","id": "idEtapeTravaux3","slug": "m-pr-bon-espoir-2001-dam01-wfd01","sections_with_values": [],"entreprises_documents": [],"etape_documents": []},	{"etape_type_id": "wre","ordre": 1,notes: null,"etape_statut_id": "fav","date": "2010-10-01","id": "idEtapeTravaux4","slug": "m-pr-bon-espoir-2001-dam01-wre01","sections_with_values": [],"entreprises_documents": [],"etape_documents": []}],"demarche_type_id": "dam","demarche_statut_id": "fpm","demarche_date_debut": null,"demarche_date_fin": null
 
 
   }))
     // prettier-ignore
-    bonEspoirData.demarches.push(demarcheGetValidator.parse({"id":"KxHulLhT5XtziPhZDWpFuyA9", "ordre": 5, "slug":"m-pr-bon-espoir-2001-vct01","description":null,"etapes":[{"etape_type_id":"mcr","etape_statut_id":"fav","date":"2017-08-07","id":"OOKaEetpmAhDX17hcLEFWTZ1","ordre":4,notes: null,"slug":"m-pr-bon-espoir-2001-vct01-mcr01","sections_with_values":[],"entreprises_documents":[],"documents":[],"decisions_annexes_contenu":null,"decisions_annexes_sections":null},{"etape_type_id":"mdp","etape_statut_id":"fai","date":"2016-11-07","id":"fNt0G9CmdMc6iIG9x239wZ5E","ordre":2,notes: null,"slug":"m-pr-bon-espoir-2001-vct01-mdp01","sections_with_values":[],"entreprises_documents":[],"documents":[],"decisions_annexes_contenu":null,"decisions_annexes_sections":null},{"etape_type_id":"mfr","fondamentale":{"date_debut":null,"date_fin":null,"duree":180,"substances":["auru","scoc"],"titulaires":[{"id":"fr-401802863","nom":"ARMINA RESSOURCES MINIERES SARL","operateur":false}],"amodiataires":null,"perimetre":{"geojson4326_points": null,"geojson4326_forages":null,"geojson_origine_forages":null,"geojson_origine_points": null, "geojson4326_perimetre":{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-53.95781742722346,5.076877972864504],[-53.95761604147164,5.032517695391918],[-53.894654620091046,5.000735152488521],[-53.82094960753945,4.97999409410299],[-53.71414492282594,4.963998224562106],[-53.73241245985785,5.023653513799631],[-53.87657715038456,5.023033474690702],[-53.95781742722346,5.076877972864504]]]]},"properties":null}, "geojson_origine_perimetre":{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-53.95781742722346,5.076877972864504],[-53.95761604147164,5.032517695391918],[-53.894654620091046,5.000735152488521],[-53.82094960753945,4.97999409410299],[-53.71414492282594,4.963998224562106],[-53.73241245985785,5.023653513799631],[-53.87657715038456,5.023033474690702],[-53.95781742722346,5.076877972864504]]]]},"properties":null},"geojson_origine_geo_systeme_id":"4326","surface":122.275,"communes":[{"id":"97311","nom":"Saint-Laurent-du-Maroni"},{"id":"97306","nom":"Mana"}],"secteurs_maritimes":[],"sdom_zones":["0","2"],"forets":["LDD","PAUL"]}},"etape_statut_id":"fai","date":"2016-10-28","id":"VqBn5DzAtcMQWFY0CIiO6X1A","ordre":1,notes: null,"slug":"m-pr-bon-espoir-2001-vct01-mfr01","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":null},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":null}]}],"entreprises_documents":[],"documents":[],"decisions_annexes_contenu":null,"decisions_annexes_sections":null}],"demarche_type_id":"vct","demarche_statut_id":"ins","demarche_date_debut":"2016-10-31","demarche_date_fin":null}))
+    bonEspoirData.demarches.push(demarcheGetValidator.parse({"id":"KxHulLhT5XtziPhZDWpFuyA9", "ordre": 5, "slug":"m-pr-bon-espoir-2001-vct01","description":null,"etapes":[{"etape_type_id":"mcr","etape_statut_id":"fav","date":"2017-08-07","id":"OOKaEetpmAhDX17hcLEFWTZ1","ordre":4,notes: null,"slug":"m-pr-bon-espoir-2001-vct01-mcr01","sections_with_values":[],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"mdp","etape_statut_id":"fai","date":"2016-11-07","id":"fNt0G9CmdMc6iIG9x239wZ5E","ordre":2,notes: null,"slug":"m-pr-bon-espoir-2001-vct01-mdp01","sections_with_values":[],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"mfr","fondamentale":{"date_debut":null,"date_fin":null,"duree":180,"substances":["auru","scoc"],"titulaires":[{"id":"fr-401802863","nom":"ARMINA RESSOURCES MINIERES SARL","operateur":false}],"amodiataires":null,"perimetre":{"geojson4326_points": null,"geojson4326_forages":null,"geojson_origine_forages":null,"geojson_origine_points": null, "geojson4326_perimetre":{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-53.95781742722346,5.076877972864504],[-53.95761604147164,5.032517695391918],[-53.894654620091046,5.000735152488521],[-53.82094960753945,4.97999409410299],[-53.71414492282594,4.963998224562106],[-53.73241245985785,5.023653513799631],[-53.87657715038456,5.023033474690702],[-53.95781742722346,5.076877972864504]]]]},"properties":null}, "geojson_origine_perimetre":{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-53.95781742722346,5.076877972864504],[-53.95761604147164,5.032517695391918],[-53.894654620091046,5.000735152488521],[-53.82094960753945,4.97999409410299],[-53.71414492282594,4.963998224562106],[-53.73241245985785,5.023653513799631],[-53.87657715038456,5.023033474690702],[-53.95781742722346,5.076877972864504]]]]},"properties":null},"geojson_origine_geo_systeme_id":"4326","surface":122.275,"communes":[{"id":"97311","nom":"Saint-Laurent-du-Maroni"},{"id":"97306","nom":"Mana"}],"secteurs_maritimes":[],"sdom_zones":["0","2"],"forets":["LDD","PAUL"]}},"etape_statut_id":"fai","date":"2016-10-28","id":"VqBn5DzAtcMQWFY0CIiO6X1A","ordre":1,notes: null,"slug":"m-pr-bon-espoir-2001-vct01-mfr01","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":null},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":null}]}],"entreprises_documents":[],"etape_documents":[]}],"demarche_type_id":"vct","demarche_statut_id":"ins","demarche_date_debut":"2016-10-31","demarche_date_fin":null}))
 
     return Promise.resolve(bonEspoirData)
   },
@@ -527,7 +525,7 @@ const basseManaApiClient: PropsApiClient = {
     getTitreAction(titreIdOrSlug)
 
     // prettier-ignore
-    const basseManaData = titreGetValidator.parse({"id":"ORKjSbwrb87xE53MsYClV8OF","nom":"Basse Mana","slug":"m-pr-basse-mana-2018","titre_type_id":"prm","titre_statut_id":"mod","titre_doublon":null,"references":[{"nom":"22/2018","referenceTypeId":"dea"},{"nom":"2016-0010-MI","referenceTypeId":"deb"}],"titre_last_modified_date":"2023-12-19","demarches":[{"id":"GnIerujOWqlS3U06Xcbc1Dr0","slug":"m-pr-basse-mana-2018-oct01","description":null,"etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":36,"substances":["tant","niob","lith","bery","etai","wolf","tita","auru"],"titulaires":[{"id":"fr-790856850","nom":"SUDMINE","operateur":true}],"amodiataires":null,"perimetre":{"geojson4326_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-53.69912524,5.291376757],[-53.735659753,5.24333287],[-53.684773658,5.232646225],[-53.664223513,5.237523538],[-53.655434468,5.250348173],[-53.640244916,5.250448761],[-53.63310533,5.269791199],[-53.665016693,5.273532076],[-53.69912524,5.291376757]]]]}},"geojson4326_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.699125239725,5.29137675727333]},"properties":{"nom":"A","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6650166925488,5.27353207619541]},"properties":{"nom":"B","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6331053301638,5.26979119871868]},"properties":{"nom":"C","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6402449164671,5.25044876137938]},"properties":{"nom":"D","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6554344678131,5.25034817283726]},"properties":{"nom":"E","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.664223513371,5.23752353831223]},"properties":{"nom":"F","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6847736578144,5.232646225266]},"properties":{"nom":"G","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.735659753333,5.24333287037071]},"properties":{"nom":"H","description":null}}]},"geojson_origine_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-53.69912524,5.291376757],[-53.735659753,5.24333287],[-53.684773658,5.232646225],[-53.664223513,5.237523538],[-53.655434468,5.250348173],[-53.640244916,5.250448761],[-53.63310533,5.269791199],[-53.665016693,5.273532076],[-53.69912524,5.291376757]]]]}},"geojson4326_forages":null,"geojson_origine_forages":null, "geojson_origine_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.699125239725,5.29137675727333]},"properties":{"nom":"A","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6650166925488,5.27353207619541]},"properties":{"nom":"B","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6331053301638,5.26979119871868]},"properties":{"nom":"C","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6402449164671,5.25044876137938]},"properties":{"nom":"D","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6554344678131,5.25034817283726]},"properties":{"nom":"E","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.664223513371,5.23752353831223]},"properties":{"nom":"F","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6847736578144,5.232646225266]},"properties":{"nom":"G","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.735659753333,5.24333287037071]},"properties":{"nom":"H","description":null}}]},"geojson_origine_geo_systeme_id":"4326","surface":48,"communes":[{"id":"97306","nom":"Mana"}],"secteurs_maritimes":[],"sdom_zones":["2"],"forets":["BSM"]}},"etape_statut_id":"acc","date":"2018-09-11","id":"ooH6ZbECJPcDPFsE0McnKvUm","ordre":9,"notes":null,"slug":"m-pr-basse-mana-2018-oct01-dpu01","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":150000},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":"EUR"}]},{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":"JORFTEXT000037382008"},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":"ECOL1816264A"}]}],"entreprises_documents":[],"documents":[],"decisions_annexes_contenu":null,"decisions_annexes_sections":null},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":36,"substances":["tant","niob","lith","bery","etai","wolf","tita","auru"],"titulaires":[{"id":"fr-790856850","nom":"SUDMINE","operateur":true}],"amodiataires":null,"perimetre":{"geojson4326_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-53.69912524,5.291376757],[-53.735659753,5.24333287],[-53.684773658,5.232646225],[-53.664223513,5.237523538],[-53.655434468,5.250348173],[-53.640244916,5.250448761],[-53.63310533,5.269791199],[-53.665016693,5.273532076],[-53.69912524,5.291376757]]]]}},"geojson4326_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.699125239725,5.29137675727333]},"properties":{"nom":"A","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6650166925488,5.27353207619541]},"properties":{"nom":"B","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6331053301638,5.26979119871868]},"properties":{"nom":"C","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6402449164671,5.25044876137938]},"properties":{"nom":"D","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6554344678131,5.25034817283726]},"properties":{"nom":"E","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.664223513371,5.23752353831223]},"properties":{"nom":"F","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6847736578144,5.232646225266]},"properties":{"nom":"G","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.735659753333,5.24333287037071]},"properties":{"nom":"H","description":null}}]},"geojson_origine_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-53.69912524,5.291376757],[-53.735659753,5.24333287],[-53.684773658,5.232646225],[-53.664223513,5.237523538],[-53.655434468,5.250348173],[-53.640244916,5.250448761],[-53.63310533,5.269791199],[-53.665016693,5.273532076],[-53.69912524,5.291376757]]]]}},"geojson4326_forages":null,"geojson_origine_forages":null,"geojson_origine_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.699125239725,5.29137675727333]},"properties":{"nom":"A","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6650166925488,5.27353207619541]},"properties":{"nom":"B","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6331053301638,5.26979119871868]},"properties":{"nom":"C","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6402449164671,5.25044876137938]},"properties":{"nom":"D","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6554344678131,5.25034817283726]},"properties":{"nom":"E","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.664223513371,5.23752353831223]},"properties":{"nom":"F","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6847736578144,5.232646225266]},"properties":{"nom":"G","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.735659753333,5.24333287037071]},"properties":{"nom":"H","description":null}}]},"geojson_origine_geo_systeme_id":"4326","surface":48,"communes":[{"id":"97306","nom":"Mana"}],"secteurs_maritimes":[],"sdom_zones":["2"],"forets":["BSM"]}},"etape_statut_id":"acc","date":"2018-08-31","id":"KJtV68vswF5ewUyF2jTuLGhS","ordre":8,"notes":null,"slug":"m-pr-basse-mana-2018-oct01-dex01","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":150000},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":"EUR"}]},{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":"JORFTEXT000037382008"},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":"ECOL1816264A"}]}],"entreprises_documents":[],"documents":[],"decisions_annexes_contenu":null,"decisions_annexes_sections":null},{"etape_type_id":"mdp","etape_statut_id":"fai","date":"2016-08-28","id":"qVJM9zS6hWyIr3My5OoubQA3","ordre":2,"notes":null,"slug":"m-pr-basse-mana-2018-oct01-mdp01","sections_with_values":[],"entreprises_documents":[],"documents":[],"decisions_annexes_contenu":null,"decisions_annexes_sections":null},{"etape_type_id":"mfr","fondamentale":{"date_debut":null,"date_fin":null,"duree":36,"substances":["tant","niob","scoc"],"titulaires":null,"amodiataires":null,"perimetre":null},"etape_statut_id":"fai","date":"2016-06-19","id":"abABihashClZP0lL3NUPELNV","ordre":1,"notes":null,"slug":"m-pr-basse-mana-2018-oct01-mfr01","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":null},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":null}]}],"entreprises_documents":[],"documents":[],"decisions_annexes_contenu":null,"decisions_annexes_sections":null}],"demarche_type_id":"oct","demarche_statut_id":"acc","demarche_date_debut":"2018-09-11","demarche_date_fin":"2021-09-11","ordre":1},{"id":"mZAUVvPyznbzpj3e3grjFmlJ","slug":"m-pr-basse-mana-2018-pr101","description":null,"etapes":[{"etape_type_id":"rpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":null,"titulaires":null,"amodiataires":null,"perimetre":null},"etape_statut_id":"fai","date":"2023-11-17","id":"f76c17ab21ca966988390d92","ordre":11,"notes":null,"slug":"m-pr-basse-mana-2018-pr101-rpu01","sections_with_values":[],"entreprises_documents":[],"documents":[],"decisions_annexes_contenu":null,"decisions_annexes_sections":null},{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":null,"titulaires":null,"amodiataires":null,"perimetre":null},"etape_statut_id":"acc","date":"2023-11-15","id":"71f6497117b21325d53d8e56","ordre":10,"notes":null,"slug":"m-pr-basse-mana-2018-pr101-dpu01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":"Texte 3 sur 160"}]}],"entreprises_documents":[],"documents":[{"id":"2023-11-15-pub-4d420801","description":"","document_type_id":"pub","public_lecture":true,"entreprises_lecture":true}],"decisions_annexes_contenu":null,"decisions_annexes_sections":null},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":30,"substances":null,"titulaires":null,"amodiataires":null,"perimetre":null},"etape_statut_id":"acc","date":"2023-11-07","id":"590f6dd2f808eeadf51b820e","ordre":9,"notes":null,"slug":"m-pr-basse-mana-2018-pr101-dex01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"documents":[],"decisions_annexes_contenu":null,"decisions_annexes_sections":null},{"etape_type_id":"ppc","etape_statut_id":"ter","date":"2023-04-14","id":"da4a6c74690a6d1ef01ddde2","ordre":6,"notes":null,"slug":"m-pr-basse-mana-2018-pr101-ppc01","sections_with_values":[],"entreprises_documents":[],"documents":[],"decisions_annexes_contenu":null,"decisions_annexes_sections":null},{"etape_type_id":"ppu","etape_statut_id":"fai","date":"2023-03-27","id":"M1mK0vhAHH5CTaUwq4cJzK49","ordre":5,"notes":null,"slug":"m-pr-basse-mana-2018-pr101-ppu01","sections_with_values":[{"id":"opdp","elements":[{"id":"lien","nom":"Lien public externe","description":"","optionnel":true,"type":"url","value":null}]}],"entreprises_documents":[],"documents":[],"decisions_annexes_contenu":null,"decisions_annexes_sections":null},{"etape_type_id":"mfr","fondamentale":{"date_debut":null,"date_fin":null,"duree":60,"substances":["tant","niob","lith","bery","etai","wolf","tita","auru"],"titulaires":[{"id":"fr-790856850","nom":"SUDMINE","operateur":false}],"amodiataires":null,"perimetre":{"geojson4326_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-53.699150462,5.291394409],[-53.735684972,5.243350526],[-53.684798879,5.232663884],[-53.664248736,5.237541197],[-53.655459692,5.250365831],[-53.640270141,5.25046642],[-53.633130556,5.269808856],[-53.665119187,5.29162312],[-53.699150462,5.291394409]]]]}},"geojson4326_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.699150462397206,5.291394409468797]},"properties":{"nom":"A","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.66511918689031,5.291623119512839]},"properties":{"nom":"B","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.633130556393525,5.269808855679936]},"properties":{"nom":"C","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.64027014144058,5.250466419912988]},"properties":{"nom":"D","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.65545969176547,5.250365830767107]},"properties":{"nom":"E","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.664248736219285,5.2375411971227654]},"properties":{"nom":"F","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.684798879087204,5.232663883719148]},"properties":{"nom":"G","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.73568497160258,5.2433505257409125]},"properties":{"nom":"H","description":null}}]},"geojson_origine_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-53.699150462,5.291394409],[-53.735684972,5.243350526],[-53.684798879,5.232663884],[-53.664248736,5.237541197],[-53.655459692,5.250365831],[-53.640270141,5.25046642],[-53.633130556,5.269808856],[-53.665119187,5.29162312],[-53.699150462,5.291394409]]]]}},"geojson4326_forages":null,"geojson_origine_forages":null,"geojson_origine_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.699150462397206,5.291394409468797]},"properties":{"nom":"A","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.66511918689031,5.291623119512839]},"properties":{"nom":"B","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.633130556393525,5.269808855679936]},"properties":{"nom":"C","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.64027014144058,5.250466419912988]},"properties":{"nom":"D","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.65545969176547,5.250365830767107]},"properties":{"nom":"E","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.664248736219285,5.2375411971227654]},"properties":{"nom":"F","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.684798879087204,5.232663883719148]},"properties":{"nom":"G","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.73568497160258,5.2433505257409125]},"properties":{"nom":"H","description":null}}]},"geojson_origine_geo_systeme_id":"4326","surface":0,"communes":[{"id":"97306","nom":"Mana"}],"secteurs_maritimes":[],"sdom_zones":["2"],"forets":["BSM"]}},"etape_statut_id":"fai","date":"2021-04-30","id":"NKW0jIKc5cPBIp2dwu2VceCG","ordre":1,"notes":null,"slug":"m-pr-basse-mana-2018-pr101-mfr01","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":null},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":null}]}],"entreprises_documents":[],"documents":[],"decisions_annexes_contenu":null,"decisions_annexes_sections":null},{"etape_type_id":"mdp","etape_statut_id":"fai","date":"2021-04-30","id":"wFb34sxGyHoRNOByPffQZyAF","ordre":2,"notes":null,"slug":"m-pr-basse-mana-2018-pr101-mdp01","sections_with_values":[],"entreprises_documents":[],"documents":[],"decisions_annexes_contenu":null,"decisions_annexes_sections":null}],"demarche_type_id":"pr1","demarche_statut_id":"acc","demarche_date_debut":"2021-09-11","demarche_date_fin":"2024-03-11","ordre":2},{"id":"5df48d3536a38dd1dab542d7","slug":"m-pr-basse-mana-2018-pr201","description":"","etapes":[{"etape_type_id":"mdp","etape_statut_id":"fai","date":"2023-10-30","id":"37a1752da216067fc73328f9","ordre":2,"notes":null,"slug":"m-pr-basse-mana-2018-pr201-mdp01","sections_with_values":[],"entreprises_documents":[],"documents":[],"decisions_annexes_contenu":null,"decisions_annexes_sections":null},{"etape_type_id":"mfr","fondamentale":{"date_debut":null,"date_fin":null,"duree":60,"substances":["tant","niob","lith","bery","etai","wolf","tita","auru"],"titulaires":null,"amodiataires":null,"perimetre":{"geojson4326_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-53.695977303,5.258026897],[-53.691661753,5.243894121],[-53.691207935,5.238962049],[-53.669472448,5.23643451],[-53.664266765,5.23754112],[-53.655468706,5.250365792],[-53.640270103,5.250457383],[-53.634220223,5.267391339],[-53.649339565,5.274005465],[-53.669437597,5.274805058],[-53.669882058,5.281761504],[-53.671594626,5.281690874],[-53.67432345,5.276844434],[-53.67742349,5.274481516],[-53.685231828,5.270616251],[-53.695977303,5.258026897]]]]}},"geojson4326_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.695977302723314,5.258026897118486]},"properties":{"nom":"A","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.68523182828244,5.270616251350751]},"properties":{"nom":"B","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.67742349010169,5.274481516415551]},"properties":{"nom":"C","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.67432345044184,5.276844434310086]},"properties":{"nom":"D","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.671594626284566,5.281690874443703]},"properties":{"nom":"E","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.66988205803166,5.281761503749559]},"properties":{"nom":"F","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.66943759690406,5.2748050575845875]},"properties":{"nom":"G","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.64933956522329,5.274005464773927]},"properties":{"nom":"H","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.63422022259896,5.267391338838475]},"properties":{"nom":"I","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.64027010339901,5.25045738302719]},"properties":{"nom":"J","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.655468706369525,5.250365792413383]},"properties":{"nom":"K","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.66426676493007,5.2375411203489115]},"properties":{"nom":"L","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.66947244758239,5.236434510036549]},"properties":{"nom":"M","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.691207934852734,5.238962048893827]},"properties":{"nom":"N","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.69166175320614,5.243894120712839]},"properties":{"nom":"O","description":null}}]},"geojson_origine_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-53.695977303,5.258026897],[-53.691661753,5.243894121],[-53.691207935,5.238962049],[-53.669472448,5.23643451],[-53.664266765,5.23754112],[-53.655468706,5.250365792],[-53.640270103,5.250457383],[-53.634220223,5.267391339],[-53.649339565,5.274005465],[-53.669437597,5.274805058],[-53.669882058,5.281761504],[-53.671594626,5.281690874],[-53.67432345,5.276844434],[-53.67742349,5.274481516],[-53.685231828,5.270616251],[-53.695977303,5.258026897]]]]}},"geojson4326_forages":null,"geojson_origine_forages":null,"geojson_origine_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.695977302723314,5.258026897118486]},"properties":{"nom":"A","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.68523182828244,5.270616251350751]},"properties":{"nom":"B","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.67742349010169,5.274481516415551]},"properties":{"nom":"C","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.67432345044184,5.276844434310086]},"properties":{"nom":"D","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.671594626284566,5.281690874443703]},"properties":{"nom":"E","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.66988205803166,5.281761503749559]},"properties":{"nom":"F","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.66943759690406,5.2748050575845875]},"properties":{"nom":"G","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.64933956522329,5.274005464773927]},"properties":{"nom":"H","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.63422022259896,5.267391338838475]},"properties":{"nom":"I","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.64027010339901,5.25045738302719]},"properties":{"nom":"J","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.655468706369525,5.250365792413383]},"properties":{"nom":"K","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.66426676493007,5.2375411203489115]},"properties":{"nom":"L","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.66947244758239,5.236434510036549]},"properties":{"nom":"M","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.691207934852734,5.238962048893827]},"properties":{"nom":"N","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.69166175320614,5.243894120712839]},"properties":{"nom":"O","description":null}}]},"geojson_origine_geo_systeme_id":"4326","surface":20.69,"communes":[{"id":"97306","nom":"Mana"}],"secteurs_maritimes":[],"sdom_zones":["2"],"forets":["BSM"]}},"etape_statut_id":"fai","date":"2023-10-30","id":"47a22a6ca44891d40e2f4149","ordre":1,"notes":null,"slug":"m-pr-basse-mana-2018-pr201-mfr01","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":null},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":null}]}],"entreprises_documents":[],"documents":[],"decisions_annexes_contenu":null,"decisions_annexes_sections":null}],"demarche_type_id":"pr2","demarche_statut_id":"dep","demarche_date_debut":"2024-03-11","demarche_date_fin":null,"ordre":3}],"nb_activites_to_do":null})
+    const basseManaData = titreGetValidator.parse({"id":"ORKjSbwrb87xE53MsYClV8OF","nom":"Basse Mana","slug":"m-pr-basse-mana-2018","titre_type_id":"prm","titre_statut_id":"mod","titre_doublon":null,"references":[{"nom":"22/2018","referenceTypeId":"dea"},{"nom":"2016-0010-MI","referenceTypeId":"deb"}],"titre_last_modified_date":"2023-12-19","demarches":[{"id":"GnIerujOWqlS3U06Xcbc1Dr0","slug":"m-pr-basse-mana-2018-oct01","description":null,"etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":36,"substances":["tant","niob","lith","bery","etai","wolf","tita","auru"],"titulaires":[{"id":"fr-790856850","nom":"SUDMINE","operateur":true}],"amodiataires":null,"perimetre":{"geojson4326_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-53.69912524,5.291376757],[-53.735659753,5.24333287],[-53.684773658,5.232646225],[-53.664223513,5.237523538],[-53.655434468,5.250348173],[-53.640244916,5.250448761],[-53.63310533,5.269791199],[-53.665016693,5.273532076],[-53.69912524,5.291376757]]]]}},"geojson4326_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.699125239725,5.29137675727333]},"properties":{"nom":"A","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6650166925488,5.27353207619541]},"properties":{"nom":"B","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6331053301638,5.26979119871868]},"properties":{"nom":"C","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6402449164671,5.25044876137938]},"properties":{"nom":"D","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6554344678131,5.25034817283726]},"properties":{"nom":"E","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.664223513371,5.23752353831223]},"properties":{"nom":"F","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6847736578144,5.232646225266]},"properties":{"nom":"G","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.735659753333,5.24333287037071]},"properties":{"nom":"H","description":null}}]},"geojson_origine_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-53.69912524,5.291376757],[-53.735659753,5.24333287],[-53.684773658,5.232646225],[-53.664223513,5.237523538],[-53.655434468,5.250348173],[-53.640244916,5.250448761],[-53.63310533,5.269791199],[-53.665016693,5.273532076],[-53.69912524,5.291376757]]]]}},"geojson4326_forages":null,"geojson_origine_forages":null, "geojson_origine_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.699125239725,5.29137675727333]},"properties":{"nom":"A","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6650166925488,5.27353207619541]},"properties":{"nom":"B","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6331053301638,5.26979119871868]},"properties":{"nom":"C","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6402449164671,5.25044876137938]},"properties":{"nom":"D","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6554344678131,5.25034817283726]},"properties":{"nom":"E","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.664223513371,5.23752353831223]},"properties":{"nom":"F","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6847736578144,5.232646225266]},"properties":{"nom":"G","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.735659753333,5.24333287037071]},"properties":{"nom":"H","description":null}}]},"geojson_origine_geo_systeme_id":"4326","surface":48,"communes":[{"id":"97306","nom":"Mana"}],"secteurs_maritimes":[],"sdom_zones":["2"],"forets":["BSM"]}},"etape_statut_id":"acc","date":"2018-09-11","id":"ooH6ZbECJPcDPFsE0McnKvUm","ordre":9,"notes":null,"slug":"m-pr-basse-mana-2018-oct01-dpu01","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":150000},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":"EUR"}]},{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":"JORFTEXT000037382008"},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":"ECOL1816264A"}]}],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":36,"substances":["tant","niob","lith","bery","etai","wolf","tita","auru"],"titulaires":[{"id":"fr-790856850","nom":"SUDMINE","operateur":true}],"amodiataires":null,"perimetre":{"geojson4326_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-53.69912524,5.291376757],[-53.735659753,5.24333287],[-53.684773658,5.232646225],[-53.664223513,5.237523538],[-53.655434468,5.250348173],[-53.640244916,5.250448761],[-53.63310533,5.269791199],[-53.665016693,5.273532076],[-53.69912524,5.291376757]]]]}},"geojson4326_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.699125239725,5.29137675727333]},"properties":{"nom":"A","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6650166925488,5.27353207619541]},"properties":{"nom":"B","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6331053301638,5.26979119871868]},"properties":{"nom":"C","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6402449164671,5.25044876137938]},"properties":{"nom":"D","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6554344678131,5.25034817283726]},"properties":{"nom":"E","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.664223513371,5.23752353831223]},"properties":{"nom":"F","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6847736578144,5.232646225266]},"properties":{"nom":"G","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.735659753333,5.24333287037071]},"properties":{"nom":"H","description":null}}]},"geojson_origine_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-53.69912524,5.291376757],[-53.735659753,5.24333287],[-53.684773658,5.232646225],[-53.664223513,5.237523538],[-53.655434468,5.250348173],[-53.640244916,5.250448761],[-53.63310533,5.269791199],[-53.665016693,5.273532076],[-53.69912524,5.291376757]]]]}},"geojson4326_forages":null,"geojson_origine_forages":null,"geojson_origine_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.699125239725,5.29137675727333]},"properties":{"nom":"A","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6650166925488,5.27353207619541]},"properties":{"nom":"B","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6331053301638,5.26979119871868]},"properties":{"nom":"C","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6402449164671,5.25044876137938]},"properties":{"nom":"D","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6554344678131,5.25034817283726]},"properties":{"nom":"E","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.664223513371,5.23752353831223]},"properties":{"nom":"F","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6847736578144,5.232646225266]},"properties":{"nom":"G","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.735659753333,5.24333287037071]},"properties":{"nom":"H","description":null}}]},"geojson_origine_geo_systeme_id":"4326","surface":48,"communes":[{"id":"97306","nom":"Mana"}],"secteurs_maritimes":[],"sdom_zones":["2"],"forets":["BSM"]}},"etape_statut_id":"acc","date":"2018-08-31","id":"KJtV68vswF5ewUyF2jTuLGhS","ordre":8,"notes":null,"slug":"m-pr-basse-mana-2018-oct01-dex01","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":150000},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":"EUR"}]},{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":"JORFTEXT000037382008"},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":"ECOL1816264A"}]}],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"mdp","etape_statut_id":"fai","date":"2016-08-28","id":"qVJM9zS6hWyIr3My5OoubQA3","ordre":2,"notes":null,"slug":"m-pr-basse-mana-2018-oct01-mdp01","sections_with_values":[],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"mfr","fondamentale":{"date_debut":null,"date_fin":null,"duree":36,"substances":["tant","niob","scoc"],"titulaires":null,"amodiataires":null,"perimetre":null},"etape_statut_id":"fai","date":"2016-06-19","id":"abABihashClZP0lL3NUPELNV","ordre":1,"notes":null,"slug":"m-pr-basse-mana-2018-oct01-mfr01","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":null},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":null}]}],"entreprises_documents":[],"etape_documents":[]}],"demarche_type_id":"oct","demarche_statut_id":"acc","demarche_date_debut":"2018-09-11","demarche_date_fin":"2021-09-11","ordre":1},{"id":"mZAUVvPyznbzpj3e3grjFmlJ","slug":"m-pr-basse-mana-2018-pr101","description":null,"etapes":[{"etape_type_id":"rpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":null,"titulaires":null,"amodiataires":null,"perimetre":null},"etape_statut_id":"fai","date":"2023-11-17","id":"f76c17ab21ca966988390d92","ordre":11,"notes":null,"slug":"m-pr-basse-mana-2018-pr101-rpu01","sections_with_values":[],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":null,"titulaires":null,"amodiataires":null,"perimetre":null},"etape_statut_id":"acc","date":"2023-11-15","id":"71f6497117b21325d53d8e56","ordre":10,"notes":null,"slug":"m-pr-basse-mana-2018-pr101-dpu01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":"Texte 3 sur 160"}]}],"entreprises_documents":[],"etape_documents":[{"id":"2023-11-15-pub-4d420801","description":"","etape_document_type_id":"pub","public_lecture":true,"entreprises_lecture":true}]},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":30,"substances":null,"titulaires":null,"amodiataires":null,"perimetre":null},"etape_statut_id":"acc","date":"2023-11-07","id":"590f6dd2f808eeadf51b820e","ordre":9,"notes":null,"slug":"m-pr-basse-mana-2018-pr101-dex01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"ppc","etape_statut_id":"ter","date":"2023-04-14","id":"da4a6c74690a6d1ef01ddde2","ordre":6,"notes":null,"slug":"m-pr-basse-mana-2018-pr101-ppc01","sections_with_values":[],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"ppu","etape_statut_id":"fai","date":"2023-03-27","id":"M1mK0vhAHH5CTaUwq4cJzK49","ordre":5,"notes":null,"slug":"m-pr-basse-mana-2018-pr101-ppu01","sections_with_values":[{"id":"opdp","elements":[{"id":"lien","nom":"Lien public externe","description":"","optionnel":true,"type":"url","value":null}]}],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"mfr","fondamentale":{"date_debut":null,"date_fin":null,"duree":60,"substances":["tant","niob","lith","bery","etai","wolf","tita","auru"],"titulaires":[{"id":"fr-790856850","nom":"SUDMINE","operateur":false}],"amodiataires":null,"perimetre":{"geojson4326_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-53.699150462,5.291394409],[-53.735684972,5.243350526],[-53.684798879,5.232663884],[-53.664248736,5.237541197],[-53.655459692,5.250365831],[-53.640270141,5.25046642],[-53.633130556,5.269808856],[-53.665119187,5.29162312],[-53.699150462,5.291394409]]]]}},"geojson4326_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.699150462397206,5.291394409468797]},"properties":{"nom":"A","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.66511918689031,5.291623119512839]},"properties":{"nom":"B","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.633130556393525,5.269808855679936]},"properties":{"nom":"C","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.64027014144058,5.250466419912988]},"properties":{"nom":"D","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.65545969176547,5.250365830767107]},"properties":{"nom":"E","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.664248736219285,5.2375411971227654]},"properties":{"nom":"F","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.684798879087204,5.232663883719148]},"properties":{"nom":"G","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.73568497160258,5.2433505257409125]},"properties":{"nom":"H","description":null}}]},"geojson_origine_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-53.699150462,5.291394409],[-53.735684972,5.243350526],[-53.684798879,5.232663884],[-53.664248736,5.237541197],[-53.655459692,5.250365831],[-53.640270141,5.25046642],[-53.633130556,5.269808856],[-53.665119187,5.29162312],[-53.699150462,5.291394409]]]]}},"geojson4326_forages":null,"geojson_origine_forages":null,"geojson_origine_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.699150462397206,5.291394409468797]},"properties":{"nom":"A","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.66511918689031,5.291623119512839]},"properties":{"nom":"B","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.633130556393525,5.269808855679936]},"properties":{"nom":"C","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.64027014144058,5.250466419912988]},"properties":{"nom":"D","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.65545969176547,5.250365830767107]},"properties":{"nom":"E","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.664248736219285,5.2375411971227654]},"properties":{"nom":"F","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.684798879087204,5.232663883719148]},"properties":{"nom":"G","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.73568497160258,5.2433505257409125]},"properties":{"nom":"H","description":null}}]},"geojson_origine_geo_systeme_id":"4326","surface":0,"communes":[{"id":"97306","nom":"Mana"}],"secteurs_maritimes":[],"sdom_zones":["2"],"forets":["BSM"]}},"etape_statut_id":"fai","date":"2021-04-30","id":"NKW0jIKc5cPBIp2dwu2VceCG","ordre":1,"notes":null,"slug":"m-pr-basse-mana-2018-pr101-mfr01","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":null},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":null}]}],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"mdp","etape_statut_id":"fai","date":"2021-04-30","id":"wFb34sxGyHoRNOByPffQZyAF","ordre":2,"notes":null,"slug":"m-pr-basse-mana-2018-pr101-mdp01","sections_with_values":[],"entreprises_documents":[],"etape_documents":[]}],"demarche_type_id":"pr1","demarche_statut_id":"acc","demarche_date_debut":"2021-09-11","demarche_date_fin":"2024-03-11","ordre":2},{"id":"5df48d3536a38dd1dab542d7","slug":"m-pr-basse-mana-2018-pr201","description":"","etapes":[{"etape_type_id":"mdp","etape_statut_id":"fai","date":"2023-10-30","id":"37a1752da216067fc73328f9","ordre":2,"notes":null,"slug":"m-pr-basse-mana-2018-pr201-mdp01","sections_with_values":[],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"mfr","fondamentale":{"date_debut":null,"date_fin":null,"duree":60,"substances":["tant","niob","lith","bery","etai","wolf","tita","auru"],"titulaires":null,"amodiataires":null,"perimetre":{"geojson4326_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-53.695977303,5.258026897],[-53.691661753,5.243894121],[-53.691207935,5.238962049],[-53.669472448,5.23643451],[-53.664266765,5.23754112],[-53.655468706,5.250365792],[-53.640270103,5.250457383],[-53.634220223,5.267391339],[-53.649339565,5.274005465],[-53.669437597,5.274805058],[-53.669882058,5.281761504],[-53.671594626,5.281690874],[-53.67432345,5.276844434],[-53.67742349,5.274481516],[-53.685231828,5.270616251],[-53.695977303,5.258026897]]]]}},"geojson4326_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.695977302723314,5.258026897118486]},"properties":{"nom":"A","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.68523182828244,5.270616251350751]},"properties":{"nom":"B","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.67742349010169,5.274481516415551]},"properties":{"nom":"C","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.67432345044184,5.276844434310086]},"properties":{"nom":"D","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.671594626284566,5.281690874443703]},"properties":{"nom":"E","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.66988205803166,5.281761503749559]},"properties":{"nom":"F","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.66943759690406,5.2748050575845875]},"properties":{"nom":"G","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.64933956522329,5.274005464773927]},"properties":{"nom":"H","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.63422022259896,5.267391338838475]},"properties":{"nom":"I","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.64027010339901,5.25045738302719]},"properties":{"nom":"J","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.655468706369525,5.250365792413383]},"properties":{"nom":"K","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.66426676493007,5.2375411203489115]},"properties":{"nom":"L","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.66947244758239,5.236434510036549]},"properties":{"nom":"M","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.691207934852734,5.238962048893827]},"properties":{"nom":"N","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.69166175320614,5.243894120712839]},"properties":{"nom":"O","description":null}}]},"geojson_origine_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-53.695977303,5.258026897],[-53.691661753,5.243894121],[-53.691207935,5.238962049],[-53.669472448,5.23643451],[-53.664266765,5.23754112],[-53.655468706,5.250365792],[-53.640270103,5.250457383],[-53.634220223,5.267391339],[-53.649339565,5.274005465],[-53.669437597,5.274805058],[-53.669882058,5.281761504],[-53.671594626,5.281690874],[-53.67432345,5.276844434],[-53.67742349,5.274481516],[-53.685231828,5.270616251],[-53.695977303,5.258026897]]]]}},"geojson4326_forages":null,"geojson_origine_forages":null,"geojson_origine_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.695977302723314,5.258026897118486]},"properties":{"nom":"A","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.68523182828244,5.270616251350751]},"properties":{"nom":"B","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.67742349010169,5.274481516415551]},"properties":{"nom":"C","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.67432345044184,5.276844434310086]},"properties":{"nom":"D","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.671594626284566,5.281690874443703]},"properties":{"nom":"E","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.66988205803166,5.281761503749559]},"properties":{"nom":"F","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.66943759690406,5.2748050575845875]},"properties":{"nom":"G","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.64933956522329,5.274005464773927]},"properties":{"nom":"H","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.63422022259896,5.267391338838475]},"properties":{"nom":"I","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.64027010339901,5.25045738302719]},"properties":{"nom":"J","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.655468706369525,5.250365792413383]},"properties":{"nom":"K","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.66426676493007,5.2375411203489115]},"properties":{"nom":"L","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.66947244758239,5.236434510036549]},"properties":{"nom":"M","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.691207934852734,5.238962048893827]},"properties":{"nom":"N","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.69166175320614,5.243894120712839]},"properties":{"nom":"O","description":null}}]},"geojson_origine_geo_systeme_id":"4326","surface":20.69,"communes":[{"id":"97306","nom":"Mana"}],"secteurs_maritimes":[],"sdom_zones":["2"],"forets":["BSM"]}},"etape_statut_id":"fai","date":"2023-10-30","id":"47a22a6ca44891d40e2f4149","ordre":1,"notes":null,"slug":"m-pr-basse-mana-2018-pr201-mfr01","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":null},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":null}]}],"entreprises_documents":[],"etape_documents":[]}],"demarche_type_id":"pr2","demarche_statut_id":"dep","demarche_date_debut":"2024-03-11","demarche_date_fin":null,"ordre":3}],"nb_activites_to_do":null})
 
     return Promise.resolve(basseManaData)
   },
@@ -661,7 +659,7 @@ const lenoncourtApiClient: PropsApiClient = {
     getTitreAction(titreIdOrSlug)
 
     // prettier-ignore
-    const lenoncourtData = titreGetValidator.parse({"id":"s7RvqvCAgKs4DxkQBYV93cVx","nom":"Lenoncourt","slug":"m-cx-lenoncourt-1968","titre_type_id":"cxm","titre_statut_id":"val","titre_doublon":null,"references":[{"nom":"2013-0275-MI","referenceTypeId":"deb"},{"nom":"54TM0153","referenceTypeId":"rnt"}],"titre_last_modified_date":"2024-03-05","demarches":[{"id":"ozYnUjy40eru81jUnXz5snv2","slug":"m-cx-lenoncourt-1968-oct01","description":null,"etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":["nacl"],"titulaires":null,"amodiataires":null,"perimetre":null},"etape_statut_id":"acc","date":"1968-01-24","id":"SG2zAN9QaKBN1hZKqKEgQGpI","ordre":2,"notes":null,"slug":"m-cx-lenoncourt-1968-oct01-dpu01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"documents":[{"id":"1968-01-24-dec-89a94bb2","description":"Décret du 13 janvier 1968 instituant la concession de mines de sels de sodium de Lenoncourt (Meurthe-et-Moselle) au profit de la société Les Soudières réunies - La Madeleine-Varangéville","document_type_id":"dec","public_lecture":true,"entreprises_lecture":true}],"decisions_annexes_contenu":null,"decisions_annexes_sections":null},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":[],"titulaires":null,"amodiataires":null,"perimetre":null},"etape_statut_id":"acc","date":"1968-01-13","id":"LM2Zk3PwAjrduc4EqmucOjeB","ordre":1,"notes":null,"slug":"m-cx-lenoncourt-1968-oct01-dex01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"documents":[{"id":"1968-01-13-dec-e7aaf97d","description":"Décret du 13 janvier 1968 instituant la concession de mines de sels de sodium de Lenoncourt (Meurthe-et-Moselle) au profit de la société Les Soudières réunies - La Madeleine-Varangéville","document_type_id":"dec","public_lecture":true,"entreprises_lecture":true}],"decisions_annexes_contenu":null,"decisions_annexes_sections":null}],"demarche_type_id":"oct","demarche_statut_id":"acc","demarche_date_debut":"1968-01-24","demarche_date_fin":"2024-03-01","ordre":1},{"id":"wM0cpipWSef9lDAHDurJxxhk","slug":"m-cx-lenoncourt-1968-mut01","description":null,"etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":["selg","selh"],"titulaires":null,"amodiataires":null,"perimetre":null},"etape_statut_id":"acc","date":"1970-11-19","id":"XScxzwDKFxmYtDnkJ7X7qZBi","ordre":2,"notes":null,"slug":"m-cx-lenoncourt-1968-mut01-dpu01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"documents":[{"id":"1970-11-19-dec-8a77b142","description":"Décret du 16 novembre 1970 autorisant la mutation de propriété de cinq concessions de mines de sel gemme et de sources salées au profit de la société Produits chimiques Pechlney-Saint-Gobaln.","document_type_id":"dec","public_lecture":true,"entreprises_lecture":true}],"decisions_annexes_contenu":null,"decisions_annexes_sections":null},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":[],"titulaires":[{"id":"fr-606320471","nom":"RHONE PROGIL SA","operateur":false}],"amodiataires":null,"perimetre":null},"etape_statut_id":"acc","date":"1970-11-16","id":"ejAqTpzBj82jgF0ShiwMRQmW","ordre":1,"notes":null,"slug":"m-cx-lenoncourt-1968-mut01-dex01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"documents":[{"id":"1970-11-16-dec-cb1f1321","description":"Décret du 16 novembre 1970 autorisant la mutation de propriété de cinq concessions de mines de sel gemme et de sources salées au profit de la société Produits chimiques Pechlney-Saint-Gobaln.","document_type_id":"dec","public_lecture":true,"entreprises_lecture":true}],"decisions_annexes_contenu":null,"decisions_annexes_sections":null}],"demarche_type_id":"mut","demarche_statut_id":"acc","demarche_date_debut":null,"demarche_date_fin":null,"ordre":2},{"id":"1UC2b0ORsm2ezCh6whHzbOKR","slug":"m-cx-lenoncourt-1968-mut02","description":null,"etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":["selg","selh"],"titulaires":null,"amodiataires":null,"perimetre":null},"etape_statut_id":"acc","date":"1975-11-27","id":"TjimKkEETzF0yGBG2m085on9","ordre":2,"notes":null,"slug":"m-cx-lenoncourt-1968-mut02-dpu01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"documents":[{"id":"1975-11-27-dec-b50a06f5","description":"Décret du 24 novembre 1975 autorisant la mutation de cinq concessions de mines de sel gemme et de sources salées au profit de la Compagnie industrielle et minière","document_type_id":"dec","public_lecture":true,"entreprises_lecture":true}],"decisions_annexes_contenu":null,"decisions_annexes_sections":null},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":[],"titulaires":[{"id":"fr-712025048","nom":"COMPAGNIE INDUSTRIELLE ET MINIERE (CIM)","operateur":false}],"amodiataires":null,"perimetre":null},"etape_statut_id":"acc","date":"1975-11-24","id":"aYO0zwBFBOZP7VN11JaJDhzI","ordre":1,"notes":null,"slug":"m-cx-lenoncourt-1968-mut02-dex01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"documents":[{"id":"1975-11-24-dec-0e88c2e9","description":"Décret du 24 novembre 1975 autorisant la mutation de cinq concessions de mines de sel gemme et de sources salées au profit de la Compagnie industrielle et minière","document_type_id":"dec","public_lecture":true,"entreprises_lecture":true}],"decisions_annexes_contenu":null,"decisions_annexes_sections":null}],"demarche_type_id":"mut","demarche_statut_id":"acc","demarche_date_debut":null,"demarche_date_fin":null,"ordre":3},{"id":"H5eANAZPKhY9eFQtCyLYjCvp","slug":"m-cx-lenoncourt-1968-exp01","description":null,"etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":["nacl"],"titulaires":[{"id":"fr-712025048","nom":"COMPAGNIE INDUSTRIELLE ET MINIERE (CIM)","operateur":false}],"amodiataires":null,"perimetre":{"geojson4326_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[6.275644095814427,48.6854960696669],[6.255874124806144,48.675237870291575],[6.295319143383101,48.66801114312286],[6.316241924966296,48.676189123934925],[6.315656943097024,48.680413137182065],[6.307671761547864,48.69027442550079],[6.302487495007789,48.68919858322589],[6.296317613859298,48.68917495187758],[6.290997693817669,48.68780534512822],[6.285653764289864,48.68913324659737],[6.281744418990354,48.68911774206666],[6.275644095814427,48.6854960696669]]]]}},"geojson4326_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[6.275644095814427,48.6854960696669]},"properties":{"nom":"A","description":"Point situé sur la ligne joignant les clochers de Saulxures-lès-Nancy et de Buissoncourt, à son intersection avec la limite des communes de Saulxures-lès-Nancy et de Lenoncourt, soit à environ 2040 mètres à l'Est-Sud-Est du clocher de Saulxures-lès-Nancy"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.281744418990354,48.68911774206666]},"properties":{"nom":"B1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.285653764289864,48.68913324659737]},"properties":{"nom":"C1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.290997693817669,48.68780534512822]},"properties":{"nom":"D1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.296317613859298,48.68917495187758]},"properties":{"nom":"E1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.302487495007789,48.68919858322589]},"properties":{"nom":"F1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.307671761547864,48.69027442550079]},"properties":{"nom":"G1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.315656943097024,48.680413137182065]},"properties":{"nom":"B","description":"Point situé sur la ligne joignant les clochers de Saulxures-lès-Nancy et de Buissoncourt, à son intersection avec la limite Ouest de la concession de Cercueil-Buissoncourt, soit à environ 2 150 mètres au Nord-Nord-Ouest du clocher de Buissoncourt"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.316241924966296,48.676189123934925]},"properties":{"nom":"C","description":"Borne commune aux concessions d'Art-sur-Meurthe et de Cercueil-Buissoncourt"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.295319143383101,48.66801114312286]},"properties":{"nom":"D","description":"Sommet A de la concession d'Art-sur-Meurthe:"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.255874124806144,48.675237870291575]},"properties":{"nom":"E","description":"Sommet M de la concession d'Art-sur•Meurthe:"}}]},"geojson_origine_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[889907.42,1117010.26],[890334.9,1117435.93],[890622.24,1117452.72],[891022.89,1117325.88],[891406.04,1117498.53],[891859.53,1117525.03],[892234.39,1117664.59],[892879.34,1116600.52],[892947.15,1116133.73],[891456.2,1115144.46],[888513.03,1115795.21],[889907.42,1117010.26]]]]}},"geojson_origine_points":{"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[889907.42,1117010.26]},"properties":{"nom":"A","description":"Point situé sur la ligne joignant les clochers de Saulxures-lès-Nancy et de Buissoncourt, à son intersection avec la limite des communes de Saulxures-lès-Nancy et de Lenoncourt, soit à environ 2040 mètres à l’Est-Sud-Est du clocher de Saulxures-lès-Nancy"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[890334.9,1117435.93]},"properties":{"nom":"B1"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[890622.24,1117452.72]},"properties":{"nom":"C1"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[891022.89,1117325.88]},"properties":{"nom":"D1"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[891406.04,1117498.53]},"properties":{"nom":"E1"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[891859.53,1117525.03]},"properties":{"nom":"F1"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[892234.39,1117664.59]},"properties":{"nom":"G1"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[892879.34,1116600.52]},"properties":{"nom":"B","description":"Point situé sur la ligne joignant les clochers de Saulxures-lès-Nancy et de Buissoncourt, à son intersection avec la limite Ouest de la concession de Cercueil-Buissoncourt, soit à environ 2 150 mètres au Nord-Nord-Ouest du clocher de Buissoncourt"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[892947.15,1116133.73]},"properties":{"nom":"C","description":"Borne commune aux concessions d’Art-sur-Meurthe et de Cercueil-Buissoncourt"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[891456.2,1115144.46]},"properties":{"nom":"D","description":"Sommet A de la concession d’Art-sur-Meurthe:"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[888513.03,1115795.21]},"properties":{"nom":"E","description":"Sommet M de la concession d’Art-sur•Meurthe:"}}]},"geojson_origine_geo_systeme_id":"27571","geojson4326_forages":null,"geojson_origine_forages":null,"surface":6.75,"communes":[{"id":"54495","nom":"Saulxures-lès-Nancy"},{"id":"54311","nom":"Lenoncourt"},{"id":"54025","nom":"Art-sur-Meurthe"},{"id":"54110","nom":"Cerville"}],"secteurs_maritimes":[],"sdom_zones":[],"forets":[]}},"etape_statut_id":"acc","date":"1981-09-13","id":"C6UHWZDSFnLbwuaeksXG1SEj","ordre":2,"notes":null,"slug":"m-cx-lenoncourt-1968-exp01-dpu01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":"N"},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"documents":[{"id":"1981-09-13-dec-8bf8fa4c","description":"Décret du 9 septembre 1981 portant extension de superficie de la concession des mines de sels de sodium de Lenoncourt (Meurthe-et-Moselle) et modifiant les conditions auxquelles est soumise ladite concession","document_type_id":"dec","public_lecture":true,"entreprises_lecture":true}],"decisions_annexes_contenu":null,"decisions_annexes_sections":null},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":[],"titulaires":null,"amodiataires":null,"perimetre":null},"etape_statut_id":"acc","date":"1981-09-09","id":"xHxKuYk5goClAaZr1hxGaCyr","ordre":1,"notes":null,"slug":"m-cx-lenoncourt-1968-exp01-dex01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"documents":[{"id":"1981-09-09-dec-72fead36","description":"Décret du 9 septembre 1981 portant extension de superficie de la concession des mines de sels de sodium de Lenoncourt (Meurthe-et-Moselle) et modifiant les conditions auxquelles est soumise ladite concession","document_type_id":"dec","public_lecture":true,"entreprises_lecture":true}],"decisions_annexes_contenu":null,"decisions_annexes_sections":null}],"demarche_type_id":"exp","demarche_statut_id":"acc","demarche_date_debut":null,"demarche_date_fin":null,"ordre":4},{"id":"W9IX7VanFA5iYxYAGulcA0CY","slug":"m-cx-lenoncourt-1968-mut03","description":null,"etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":["nacl"],"titulaires":[{"id":"fr-442993283","nom":"NOVACARB","operateur":false}],"amodiataires":null,"perimetre":null},"etape_statut_id":"acc","date":"2000-10-06","id":"wuYTEAQ5UUAUZxiowQIthgkg","ordre":2,"notes":null,"slug":"m-cx-lenoncourt-1968-mut03-dpu01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":"JORFTEXT000000208330"},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":"ECOI0000456A"}]}],"entreprises_documents":[],"documents":[],"decisions_annexes_contenu":null,"decisions_annexes_sections":null},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":[],"titulaires":null,"amodiataires":null,"perimetre":null},"etape_statut_id":"acc","date":"2000-09-26","id":"f2iSnn7XPrOXDIrbmYFKUiz1","ordre":1,"notes":null,"slug":"m-cx-lenoncourt-1968-mut03-dex01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"documents":[{"id":"2000-09-26-arr-39bb6a21","description":"Arrêté du 26 septembre 2000 autorisant la mutation de concessions de mines","document_type_id":"arr","public_lecture":true,"entreprises_lecture":true}],"decisions_annexes_contenu":null,"decisions_annexes_sections":null}],"demarche_type_id":"mut","demarche_statut_id":"acc","demarche_date_debut":null,"demarche_date_fin":null,"ordre":6},{"id":"md9yLbhZSOqdcOANAAyUPTur","slug":"m-cx-lenoncourt-1968-mut04","description":null,"etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":["nacl"],"titulaires":[{"id":"fr-642014526","nom":"RHODIA CHIMIE","operateur":false}],"amodiataires":null,"perimetre":null},"etape_statut_id":"acc","date":"2003-01-08","id":"yuMPprDNtN6mZzdmlVTDd25I","ordre":2,"notes":null,"slug":"m-cx-lenoncourt-1968-mut04-dpu01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":"JORFTEXT000000228627"},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":"INDI0200856A"}]}],"entreprises_documents":[],"documents":[],"decisions_annexes_contenu":null,"decisions_annexes_sections":null},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":[],"titulaires":null,"amodiataires":null,"perimetre":null},"etape_statut_id":"acc","date":"2002-12-24","id":"jZRW7aZo5DmTABnQCe35wVrh","ordre":1,"notes":null,"slug":"m-cx-lenoncourt-1968-mut04-dex01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"documents":[{"id":"2002-12-24-arr-55495ad0","description":"Arrêté du 24 décembre 2002 autorisant la mutation de concessions de mines","document_type_id":"arr","public_lecture":true,"entreprises_lecture":true}],"decisions_annexes_contenu":null,"decisions_annexes_sections":null}],"demarche_type_id":"mut","demarche_statut_id":"acc","demarche_date_debut":null,"demarche_date_fin":null,"ordre":7},{"id":"3W0rdHS1VqDSIQjZ1mLD8b9L","slug":"m-cx-lenoncourt-1968-mut05","description":null,"etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":["nacl"],"titulaires":[{"id":"fr-442993283","nom":"NOVACARB","operateur":false}],"amodiataires":null,"perimetre":null},"etape_statut_id":"acc","date":"2004-02-28","id":"isgwwZGJwv7UDuJvtxAaj3T4","ordre":2,"notes":null,"slug":"m-cx-lenoncourt-1968-mut05-dpu01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":"JORFTEXT000000434866"},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":"INDI0402498A"}]}],"entreprises_documents":[],"documents":[],"decisions_annexes_contenu":null,"decisions_annexes_sections":null},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":[],"titulaires":null,"amodiataires":null,"perimetre":null},"etape_statut_id":"acc","date":"2004-02-13","id":"Full4Vnptm6czWaJ4b6kZR6W","ordre":1,"notes":null,"slug":"m-cx-lenoncourt-1968-mut05-dex01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"documents":[{"id":"2004-02-13-arr-a26102de","description":"Arrêté du 13 février 2004 autorisant la mutation d'une concession de mines de sels de sodium","document_type_id":"arr","public_lecture":true,"entreprises_lecture":true}],"decisions_annexes_contenu":null,"decisions_annexes_sections":null}],"demarche_type_id":"mut","demarche_statut_id":"acc","demarche_date_debut":null,"demarche_date_fin":null,"ordre":8},{"id":"fA9NJsMZ78XyG402LUdm2Szi","slug":"m-cx-lenoncourt-1968-pro01","description":"prolongation et extension de périmètre","etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":null,"titulaires":null,"amodiataires":null,"perimetre":null},"etape_statut_id":"acc","date":"2024-03-01","id":"a0af6a2e56cd046cd72c71cf","ordre":20,"notes":null,"slug":"m-cx-lenoncourt-1968-pro01-dpu01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":"JORFTEXT000049219226"},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":"ECOL2320431D"}]}],"entreprises_documents":[],"documents":[],"decisions_annexes_contenu":null,"decisions_annexes_sections":null},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":null,"titulaires":null,"amodiataires":null,"perimetre":null},"etape_statut_id":"acc","date":"2024-02-29","id":"aa23dc021366330e04383eba","ordre":19,"notes":null,"slug":"m-cx-lenoncourt-1968-pro01-dex01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"documents":[{"id":"2024-02-29-dec-12df6369","description":"","document_type_id":"dec","public_lecture":true,"entreprises_lecture":true},{"id":"2024-02-29-dec-4bb7fd91","description":"","document_type_id":"dec","public_lecture":true,"entreprises_lecture":true}],"decisions_annexes_contenu":null,"decisions_annexes_sections":null},{"etape_type_id":"epc","etape_statut_id":"ter","date":"2021-06-02","id":"3JEmzfDaS6MZdQGthz69jydI","ordre":12,"notes":null,"slug":"m-cx-lenoncourt-1968-pro01-epc01","sections_with_values":[],"entreprises_documents":[],"documents":[],"decisions_annexes_contenu":null,"decisions_annexes_sections":null},{"etape_type_id":"ama","etape_statut_id":"def","date":"2021-06-01","id":"ryW6mbg2cC906CimQRgdVhvd","ordre":11,"notes":null,"slug":"m-cx-lenoncourt-1968-pro01-ama01","sections_with_values":[],"entreprises_documents":[],"documents":[],"decisions_annexes_contenu":null,"decisions_annexes_sections":null},{"etape_type_id":"epu","etape_statut_id":"fai","date":"2021-04-20","id":"d1PRxUd0F9JHQSziUQ3skOem","ordre":9,"notes":null,"slug":"m-cx-lenoncourt-1968-pro01-epu01","sections_with_values":[{"id":"odlep","elements":[{"id":"lien","nom":"Lien public externe","description":"","optionnel":true,"type":"url","value":null}]}],"entreprises_documents":[],"documents":[],"decisions_annexes_contenu":null,"decisions_annexes_sections":null},{"etape_type_id":"mcr","etape_statut_id":"fav","date":"2021-01-27","id":"pHf3m1Hygp8kz8d7G0j2TKgZ","ordre":4,"notes":null,"slug":"m-cx-lenoncourt-1968-pro01-mcr01","sections_with_values":[],"entreprises_documents":[],"documents":[],"decisions_annexes_contenu":null,"decisions_annexes_sections":null},{"etape_type_id":"mdp","etape_statut_id":"fai","date":"2020-08-04","id":"mQnOvtSGpc1T83bSvOOorVOa","ordre":2,"notes":null,"slug":"m-cx-lenoncourt-1968-pro01-mdp01","sections_with_values":[],"entreprises_documents":[],"documents":[],"decisions_annexes_contenu":null,"decisions_annexes_sections":null},{"etape_type_id":"mfr","fondamentale":{"date_debut":null,"date_fin":null,"duree":300,"substances":["nacl"],"titulaires":[{"id":"fr-442993283","nom":"NOVACARB","operateur":false}],"amodiataires":null,"perimetre":{"geojson4326_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[6.255869021711159,48.675202067410254],[6.263459497281365,48.6611397799328],[6.274477936823362,48.661530617274785],[6.29531036181682,48.66798716858568],[6.3162302722649795,48.67616624512283],[6.31565519531486,48.68038643555574],[6.307660371971501,48.69025022534333],[6.302480013569365,48.68917854238857],[6.2963188041374485,48.68915103738882],[6.290983811108587,48.68777705995633],[6.285642745098623,48.68911271820202],[6.281739260684181,48.68909422269382],[6.275638319504659,48.68547207905551],[6.255869021711159,48.675202067410254]]]]}},"geojson4326_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[6.255869021711159,48.675202067410254]},"properties":{"nom":"A","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.275638319504659,48.68547207905551]},"properties":{"nom":"B","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.281739260684181,48.68909422269382]},"properties":{"nom":"C","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.285642745098623,48.68911271820202]},"properties":{"nom":"D","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.290983811108587,48.68777705995633]},"properties":{"nom":"E","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2963188041374485,48.68915103738882]},"properties":{"nom":"F","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.302480013569365,48.68917854238857]},"properties":{"nom":"G","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.307660371971501,48.69025022534333]},"properties":{"nom":"H","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.31565519531486,48.68038643555574]},"properties":{"nom":"I","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.3162302722649795,48.67616624512283]},"properties":{"nom":"J","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.29531036181682,48.66798716858568]},"properties":{"nom":"K","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.274477936823362,48.661530617274785]},"properties":{"nom":"L","description":"Nouveau sommet « d’extension » défini par NOVACARB"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.263459497281365,48.6611397799328]},"properties":{"nom":"M","description":"Nouveau sommet « d’extension » défini par NOVACARB"}}]},"geojson_origine_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[939659,6846613],[941066,6847814],[941498,6848235],[941785,6848249],[942184,6848117],[942570,6848286],[943023,6848308],[943399,6848443],[944033,6847372],[944095,6846905],[942594,6845932],[941091,6845151],[940282,6845074],[939659,6846613]]]]}},"geojson_origine_points":{"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[939659,6846613]},"properties":{"nom":"A"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[941066,6847814]},"properties":{"nom":"B"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[941498,6848235]},"properties":{"nom":"C"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[941785,6848249]},"properties":{"nom":"D"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[942184,6848117]},"properties":{"nom":"E"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[942570,6848286]},"properties":{"nom":"F"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[943023,6848308]},"properties":{"nom":"G"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[943399,6848443]},"properties":{"nom":"H"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[944033,6847372]},"properties":{"nom":"I"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[944095,6846905]},"properties":{"nom":"J"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[942594,6845932]},"properties":{"nom":"K"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[941091,6845151]},"properties":{"nom":"L","description":"Nouveau sommet « d’extension » défini par NOVACARB"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[940282,6845074]},"properties":{"nom":"M","description":"Nouveau sommet « d’extension » défini par NOVACARB"}}]},"geojson_origine_geo_systeme_id":"2154","geojson4326_forages":null,"geojson_origine_forages":null,"surface":9.05,"communes":[{"id":"54495","nom":"Saulxures-lès-Nancy"},{"id":"54311","nom":"Lenoncourt"},{"id":"54025","nom":"Art-sur-Meurthe"},{"id":"54110","nom":"Cerville"}],"secteurs_maritimes":[],"sdom_zones":[],"forets":[]}},"etape_statut_id":"fai","date":"2020-07-06","id":"mh70cpBA8jOZWCEDJKupM4Rs","ordre":1,"notes":null,"slug":"m-cx-lenoncourt-1968-pro01-mfr01","sections_with_values":[],"entreprises_documents":[],"documents":[],"decisions_annexes_contenu":null,"decisions_annexes_sections":null}],"demarche_type_id":"pro","demarche_statut_id":"acc","demarche_date_debut":"2024-03-01","demarche_date_fin":"2049-03-01","ordre":11},{"id":"b7586ad241a658ae1eb42b08","slug":"m-cx-lenoncourt-1968-exp02","description":"","etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":null,"titulaires":null,"amodiataires":null,"perimetre":null},"etape_statut_id":"acc","date":"2024-03-01","id":"e48a19b86d090feadc67a893","ordre":2,"notes":null,"slug":"m-cx-lenoncourt-1968-exp02-dpu01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":"JORFTEXT000049219226"},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":"ECOL2320431D"}]}],"entreprises_documents":[],"documents":[],"decisions_annexes_contenu":null,"decisions_annexes_sections":null},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":["nacl"],"titulaires":[{"id":"fr-442993283","nom":"NOVACARB","operateur":false}],"amodiataires":null,"perimetre":{"geojson4326_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[6.2559,48.6752],[6.2756,48.6855],[6.2817,48.6891],[6.2856,48.6891],[6.291,48.6878],[6.2963,48.6892],[6.3025,48.6892],[6.3076,48.689],[6.3157,48.6804],[6.3162,48.6762],[6.2953,48.668],[6.2794,48.6631],[6.2614,48.6649],[6.2559,48.6752]]]]}},"geojson4326_points":{"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2559,48.6752]},"properties":{"nom":"E","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2756,48.6855]},"properties":{"nom":"A","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2817,48.6891]},"properties":{"nom":"B1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2856,48.6891]},"properties":{"nom":"C1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.291,48.6878]},"properties":{"nom":"D1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2963,48.6892]},"properties":{"nom":"E1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.3025,48.6892]},"properties":{"nom":"F1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.3076,48.689]},"properties":{"nom":"G1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.3157,48.6804]},"properties":{"nom":"B","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.3162,48.6762]},"properties":{"nom":"C","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2953,48.668]},"properties":{"nom":"D","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2794,48.6631]},"properties":{"nom":"Da","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2614,48.6649]},"properties":{"nom":"Db","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2559,48.6752]},"properties":{"nom":"E","description":null}}]},"geojson_origine_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[6.2559,48.6752],[6.2756,48.6855],[6.2817,48.6891],[6.2856,48.6891],[6.291,48.6878],[6.2963,48.6892],[6.3025,48.6892],[6.3076,48.689],[6.3157,48.6804],[6.3162,48.6762],[6.2953,48.668],[6.2794,48.6631],[6.2614,48.6649],[6.2559,48.6752]]]]}},"geojson_origine_points":{"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2559,48.6752]},"properties":{"nom":"E","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2756,48.6855]},"properties":{"nom":"A","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2817,48.6891]},"properties":{"nom":"B1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2856,48.6891]},"properties":{"nom":"C1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.291,48.6878]},"properties":{"nom":"D1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2963,48.6892]},"properties":{"nom":"E1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.3025,48.6892]},"properties":{"nom":"F1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.3076,48.689]},"properties":{"nom":"G1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.3157,48.6804]},"properties":{"nom":"B","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.3162,48.6762]},"properties":{"nom":"C","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2953,48.668]},"properties":{"nom":"D","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2794,48.6631]},"properties":{"nom":"Da","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2614,48.6649]},"properties":{"nom":"Db","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2559,48.6752]},"properties":{"nom":"E","description":null}}]},"geojson_origine_geo_systeme_id":"4326","geojson4326_forages":null,"geojson_origine_forages":null,"surface":8.65,"communes":[{"id":"54495","nom":"Saulxures-lès-Nancy"},{"id":"54311","nom":"Lenoncourt"},{"id":"54025","nom":"Art-sur-Meurthe"},{"id":"54110","nom":"Cerville"}],"secteurs_maritimes":[],"sdom_zones":[],"forets":[]}},"etape_statut_id":"acc","date":"2024-02-29","id":"c15f4ceaa62a6298a2f8e117","ordre":1,"notes":null,"slug":"m-cx-lenoncourt-1968-exp02-dex01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"documents":[{"id":"2024-02-29-dec-d9f1e868","description":"","document_type_id":"dec","public_lecture":true,"entreprises_lecture":true},{"id":"2024-02-29-dec-32312304","description":"","document_type_id":"dec","public_lecture":true,"entreprises_lecture":true}],"decisions_annexes_contenu":null,"decisions_annexes_sections":null}],"demarche_type_id":"exp","demarche_statut_id":"acc","demarche_date_debut":null,"demarche_date_fin":null,"ordre":12}],"nb_activites_to_do":null}
+    const lenoncourtData = titreGetValidator.parse({"id":"s7RvqvCAgKs4DxkQBYV93cVx","nom":"Lenoncourt","slug":"m-cx-lenoncourt-1968","titre_type_id":"cxm","titre_statut_id":"val","titre_doublon":null,"references":[{"nom":"2013-0275-MI","referenceTypeId":"deb"},{"nom":"54TM0153","referenceTypeId":"rnt"}],"titre_last_modified_date":"2024-03-05","demarches":[{"id":"ozYnUjy40eru81jUnXz5snv2","slug":"m-cx-lenoncourt-1968-oct01","description":null,"etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":["nacl"],"titulaires":null,"amodiataires":null,"perimetre":null},"etape_statut_id":"acc","date":"1968-01-24","id":"SG2zAN9QaKBN1hZKqKEgQGpI","ordre":2,"notes":null,"slug":"m-cx-lenoncourt-1968-oct01-dpu01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[{"id":"1968-01-24-dec-89a94bb2","description":"Décret du 13 janvier 1968 instituant la concession de mines de sels de sodium de Lenoncourt (Meurthe-et-Moselle) au profit de la société Les Soudières réunies - La Madeleine-Varangéville","etape_document_type_id":"dec","public_lecture":true,"entreprises_lecture":true}]},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":[],"titulaires":null,"amodiataires":null,"perimetre":null},"etape_statut_id":"acc","date":"1968-01-13","id":"LM2Zk3PwAjrduc4EqmucOjeB","ordre":1,"notes":null,"slug":"m-cx-lenoncourt-1968-oct01-dex01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[{"id":"1968-01-13-dec-e7aaf97d","description":"Décret du 13 janvier 1968 instituant la concession de mines de sels de sodium de Lenoncourt (Meurthe-et-Moselle) au profit de la société Les Soudières réunies - La Madeleine-Varangéville","etape_document_type_id":"dec","public_lecture":true,"entreprises_lecture":true}]}],"demarche_type_id":"oct","demarche_statut_id":"acc","demarche_date_debut":"1968-01-24","demarche_date_fin":"2024-03-01","ordre":1},{"id":"wM0cpipWSef9lDAHDurJxxhk","slug":"m-cx-lenoncourt-1968-mut01","description":null,"etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":["selg","selh"],"titulaires":null,"amodiataires":null,"perimetre":null},"etape_statut_id":"acc","date":"1970-11-19","id":"XScxzwDKFxmYtDnkJ7X7qZBi","ordre":2,"notes":null,"slug":"m-cx-lenoncourt-1968-mut01-dpu01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[{"id":"1970-11-19-dec-8a77b142","description":"Décret du 16 novembre 1970 autorisant la mutation de propriété de cinq concessions de mines de sel gemme et de sources salées au profit de la société Produits chimiques Pechlney-Saint-Gobaln.","etape_document_type_id":"dec","public_lecture":true,"entreprises_lecture":true}]},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":[],"titulaires":[{"id":"fr-606320471","nom":"RHONE PROGIL SA","operateur":false}],"amodiataires":null,"perimetre":null},"etape_statut_id":"acc","date":"1970-11-16","id":"ejAqTpzBj82jgF0ShiwMRQmW","ordre":1,"notes":null,"slug":"m-cx-lenoncourt-1968-mut01-dex01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[{"id":"1970-11-16-dec-cb1f1321","description":"Décret du 16 novembre 1970 autorisant la mutation de propriété de cinq concessions de mines de sel gemme et de sources salées au profit de la société Produits chimiques Pechlney-Saint-Gobaln.","etape_document_type_id":"dec","public_lecture":true,"entreprises_lecture":true}]}],"demarche_type_id":"mut","demarche_statut_id":"acc","demarche_date_debut":null,"demarche_date_fin":null,"ordre":2},{"id":"1UC2b0ORsm2ezCh6whHzbOKR","slug":"m-cx-lenoncourt-1968-mut02","description":null,"etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":["selg","selh"],"titulaires":null,"amodiataires":null,"perimetre":null},"etape_statut_id":"acc","date":"1975-11-27","id":"TjimKkEETzF0yGBG2m085on9","ordre":2,"notes":null,"slug":"m-cx-lenoncourt-1968-mut02-dpu01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[{"id":"1975-11-27-dec-b50a06f5","description":"Décret du 24 novembre 1975 autorisant la mutation de cinq concessions de mines de sel gemme et de sources salées au profit de la Compagnie industrielle et minière","etape_document_type_id":"dec","public_lecture":true,"entreprises_lecture":true}]},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":[],"titulaires":[{"id":"fr-712025048","nom":"COMPAGNIE INDUSTRIELLE ET MINIERE (CIM)","operateur":false}],"amodiataires":null,"perimetre":null},"etape_statut_id":"acc","date":"1975-11-24","id":"aYO0zwBFBOZP7VN11JaJDhzI","ordre":1,"notes":null,"slug":"m-cx-lenoncourt-1968-mut02-dex01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[{"id":"1975-11-24-dec-0e88c2e9","description":"Décret du 24 novembre 1975 autorisant la mutation de cinq concessions de mines de sel gemme et de sources salées au profit de la Compagnie industrielle et minière","etape_document_type_id":"dec","public_lecture":true,"entreprises_lecture":true}]}],"demarche_type_id":"mut","demarche_statut_id":"acc","demarche_date_debut":null,"demarche_date_fin":null,"ordre":3},{"id":"H5eANAZPKhY9eFQtCyLYjCvp","slug":"m-cx-lenoncourt-1968-exp01","description":null,"etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":["nacl"],"titulaires":[{"id":"fr-712025048","nom":"COMPAGNIE INDUSTRIELLE ET MINIERE (CIM)","operateur":false}],"amodiataires":null,"perimetre":{"geojson4326_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[6.275644095814427,48.6854960696669],[6.255874124806144,48.675237870291575],[6.295319143383101,48.66801114312286],[6.316241924966296,48.676189123934925],[6.315656943097024,48.680413137182065],[6.307671761547864,48.69027442550079],[6.302487495007789,48.68919858322589],[6.296317613859298,48.68917495187758],[6.290997693817669,48.68780534512822],[6.285653764289864,48.68913324659737],[6.281744418990354,48.68911774206666],[6.275644095814427,48.6854960696669]]]]}},"geojson4326_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[6.275644095814427,48.6854960696669]},"properties":{"nom":"A","description":"Point situé sur la ligne joignant les clochers de Saulxures-lès-Nancy et de Buissoncourt, à son intersection avec la limite des communes de Saulxures-lès-Nancy et de Lenoncourt, soit à environ 2040 mètres à l'Est-Sud-Est du clocher de Saulxures-lès-Nancy"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.281744418990354,48.68911774206666]},"properties":{"nom":"B1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.285653764289864,48.68913324659737]},"properties":{"nom":"C1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.290997693817669,48.68780534512822]},"properties":{"nom":"D1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.296317613859298,48.68917495187758]},"properties":{"nom":"E1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.302487495007789,48.68919858322589]},"properties":{"nom":"F1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.307671761547864,48.69027442550079]},"properties":{"nom":"G1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.315656943097024,48.680413137182065]},"properties":{"nom":"B","description":"Point situé sur la ligne joignant les clochers de Saulxures-lès-Nancy et de Buissoncourt, à son intersection avec la limite Ouest de la concession de Cercueil-Buissoncourt, soit à environ 2 150 mètres au Nord-Nord-Ouest du clocher de Buissoncourt"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.316241924966296,48.676189123934925]},"properties":{"nom":"C","description":"Borne commune aux concessions d'Art-sur-Meurthe et de Cercueil-Buissoncourt"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.295319143383101,48.66801114312286]},"properties":{"nom":"D","description":"Sommet A de la concession d'Art-sur-Meurthe:"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.255874124806144,48.675237870291575]},"properties":{"nom":"E","description":"Sommet M de la concession d'Art-sur•Meurthe:"}}]},"geojson_origine_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[889907.42,1117010.26],[890334.9,1117435.93],[890622.24,1117452.72],[891022.89,1117325.88],[891406.04,1117498.53],[891859.53,1117525.03],[892234.39,1117664.59],[892879.34,1116600.52],[892947.15,1116133.73],[891456.2,1115144.46],[888513.03,1115795.21],[889907.42,1117010.26]]]]}},"geojson_origine_points":{"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[889907.42,1117010.26]},"properties":{"nom":"A","description":"Point situé sur la ligne joignant les clochers de Saulxures-lès-Nancy et de Buissoncourt, à son intersection avec la limite des communes de Saulxures-lès-Nancy et de Lenoncourt, soit à environ 2040 mètres à l’Est-Sud-Est du clocher de Saulxures-lès-Nancy"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[890334.9,1117435.93]},"properties":{"nom":"B1"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[890622.24,1117452.72]},"properties":{"nom":"C1"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[891022.89,1117325.88]},"properties":{"nom":"D1"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[891406.04,1117498.53]},"properties":{"nom":"E1"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[891859.53,1117525.03]},"properties":{"nom":"F1"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[892234.39,1117664.59]},"properties":{"nom":"G1"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[892879.34,1116600.52]},"properties":{"nom":"B","description":"Point situé sur la ligne joignant les clochers de Saulxures-lès-Nancy et de Buissoncourt, à son intersection avec la limite Ouest de la concession de Cercueil-Buissoncourt, soit à environ 2 150 mètres au Nord-Nord-Ouest du clocher de Buissoncourt"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[892947.15,1116133.73]},"properties":{"nom":"C","description":"Borne commune aux concessions d’Art-sur-Meurthe et de Cercueil-Buissoncourt"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[891456.2,1115144.46]},"properties":{"nom":"D","description":"Sommet A de la concession d’Art-sur-Meurthe:"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[888513.03,1115795.21]},"properties":{"nom":"E","description":"Sommet M de la concession d’Art-sur•Meurthe:"}}]},"geojson_origine_geo_systeme_id":"27571","geojson4326_forages":null,"geojson_origine_forages":null,"surface":6.75,"communes":[{"id":"54495","nom":"Saulxures-lès-Nancy"},{"id":"54311","nom":"Lenoncourt"},{"id":"54025","nom":"Art-sur-Meurthe"},{"id":"54110","nom":"Cerville"}],"secteurs_maritimes":[],"sdom_zones":[],"forets":[]}},"etape_statut_id":"acc","date":"1981-09-13","id":"C6UHWZDSFnLbwuaeksXG1SEj","ordre":2,"notes":null,"slug":"m-cx-lenoncourt-1968-exp01-dpu01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":"N"},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[{"id":"1981-09-13-dec-8bf8fa4c","description":"Décret du 9 septembre 1981 portant extension de superficie de la concession des mines de sels de sodium de Lenoncourt (Meurthe-et-Moselle) et modifiant les conditions auxquelles est soumise ladite concession","etape_document_type_id":"dec","public_lecture":true,"entreprises_lecture":true}]},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":[],"titulaires":null,"amodiataires":null,"perimetre":null},"etape_statut_id":"acc","date":"1981-09-09","id":"xHxKuYk5goClAaZr1hxGaCyr","ordre":1,"notes":null,"slug":"m-cx-lenoncourt-1968-exp01-dex01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[{"id":"1981-09-09-dec-72fead36","description":"Décret du 9 septembre 1981 portant extension de superficie de la concession des mines de sels de sodium de Lenoncourt (Meurthe-et-Moselle) et modifiant les conditions auxquelles est soumise ladite concession","etape_document_type_id":"dec","public_lecture":true,"entreprises_lecture":true}]}],"demarche_type_id":"exp","demarche_statut_id":"acc","demarche_date_debut":null,"demarche_date_fin":null,"ordre":4},{"id":"W9IX7VanFA5iYxYAGulcA0CY","slug":"m-cx-lenoncourt-1968-mut03","description":null,"etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":["nacl"],"titulaires":[{"id":"fr-442993283","nom":"NOVACARB","operateur":false}],"amodiataires":null,"perimetre":null},"etape_statut_id":"acc","date":"2000-10-06","id":"wuYTEAQ5UUAUZxiowQIthgkg","ordre":2,"notes":null,"slug":"m-cx-lenoncourt-1968-mut03-dpu01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":"JORFTEXT000000208330"},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":"ECOI0000456A"}]}],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":[],"titulaires":null,"amodiataires":null,"perimetre":null},"etape_statut_id":"acc","date":"2000-09-26","id":"f2iSnn7XPrOXDIrbmYFKUiz1","ordre":1,"notes":null,"slug":"m-cx-lenoncourt-1968-mut03-dex01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[{"id":"2000-09-26-arr-39bb6a21","description":"Arrêté du 26 septembre 2000 autorisant la mutation de concessions de mines","etape_document_type_id":"arr","public_lecture":true,"entreprises_lecture":true}]}],"demarche_type_id":"mut","demarche_statut_id":"acc","demarche_date_debut":null,"demarche_date_fin":null,"ordre":6},{"id":"md9yLbhZSOqdcOANAAyUPTur","slug":"m-cx-lenoncourt-1968-mut04","description":null,"etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":["nacl"],"titulaires":[{"id":"fr-642014526","nom":"RHODIA CHIMIE","operateur":false}],"amodiataires":null,"perimetre":null},"etape_statut_id":"acc","date":"2003-01-08","id":"yuMPprDNtN6mZzdmlVTDd25I","ordre":2,"notes":null,"slug":"m-cx-lenoncourt-1968-mut04-dpu01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":"JORFTEXT000000228627"},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":"INDI0200856A"}]}],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":[],"titulaires":null,"amodiataires":null,"perimetre":null},"etape_statut_id":"acc","date":"2002-12-24","id":"jZRW7aZo5DmTABnQCe35wVrh","ordre":1,"notes":null,"slug":"m-cx-lenoncourt-1968-mut04-dex01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[{"id":"2002-12-24-arr-55495ad0","description":"Arrêté du 24 décembre 2002 autorisant la mutation de concessions de mines","etape_document_type_id":"arr","public_lecture":true,"entreprises_lecture":true}]}],"demarche_type_id":"mut","demarche_statut_id":"acc","demarche_date_debut":null,"demarche_date_fin":null,"ordre":7},{"id":"3W0rdHS1VqDSIQjZ1mLD8b9L","slug":"m-cx-lenoncourt-1968-mut05","description":null,"etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":["nacl"],"titulaires":[{"id":"fr-442993283","nom":"NOVACARB","operateur":false}],"amodiataires":null,"perimetre":null},"etape_statut_id":"acc","date":"2004-02-28","id":"isgwwZGJwv7UDuJvtxAaj3T4","ordre":2,"notes":null,"slug":"m-cx-lenoncourt-1968-mut05-dpu01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":"JORFTEXT000000434866"},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":"INDI0402498A"}]}],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":[],"titulaires":null,"amodiataires":null,"perimetre":null},"etape_statut_id":"acc","date":"2004-02-13","id":"Full4Vnptm6czWaJ4b6kZR6W","ordre":1,"notes":null,"slug":"m-cx-lenoncourt-1968-mut05-dex01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[{"id":"2004-02-13-arr-a26102de","description":"Arrêté du 13 février 2004 autorisant la mutation d'une concession de mines de sels de sodium","etape_document_type_id":"arr","public_lecture":true,"entreprises_lecture":true}]}],"demarche_type_id":"mut","demarche_statut_id":"acc","demarche_date_debut":null,"demarche_date_fin":null,"ordre":8},{"id":"fA9NJsMZ78XyG402LUdm2Szi","slug":"m-cx-lenoncourt-1968-pro01","description":"prolongation et extension de périmètre","etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":null,"titulaires":null,"amodiataires":null,"perimetre":null},"etape_statut_id":"acc","date":"2024-03-01","id":"a0af6a2e56cd046cd72c71cf","ordre":20,"notes":null,"slug":"m-cx-lenoncourt-1968-pro01-dpu01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":"JORFTEXT000049219226"},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":"ECOL2320431D"}]}],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":null,"titulaires":null,"amodiataires":null,"perimetre":null},"etape_statut_id":"acc","date":"2024-02-29","id":"aa23dc021366330e04383eba","ordre":19,"notes":null,"slug":"m-cx-lenoncourt-1968-pro01-dex01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[{"id":"2024-02-29-dec-12df6369","description":"","etape_document_type_id":"dec","public_lecture":true,"entreprises_lecture":true},{"id":"2024-02-29-dec-4bb7fd91","description":"","etape_document_type_id":"dec","public_lecture":true,"entreprises_lecture":true}]},{"etape_type_id":"epc","etape_statut_id":"ter","date":"2021-06-02","id":"3JEmzfDaS6MZdQGthz69jydI","ordre":12,"notes":null,"slug":"m-cx-lenoncourt-1968-pro01-epc01","sections_with_values":[],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"ama","etape_statut_id":"def","date":"2021-06-01","id":"ryW6mbg2cC906CimQRgdVhvd","ordre":11,"notes":null,"slug":"m-cx-lenoncourt-1968-pro01-ama01","sections_with_values":[],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"epu","etape_statut_id":"fai","date":"2021-04-20","id":"d1PRxUd0F9JHQSziUQ3skOem","ordre":9,"notes":null,"slug":"m-cx-lenoncourt-1968-pro01-epu01","sections_with_values":[{"id":"odlep","elements":[{"id":"lien","nom":"Lien public externe","description":"","optionnel":true,"type":"url","value":null}]}],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"mcr","etape_statut_id":"fav","date":"2021-01-27","id":"pHf3m1Hygp8kz8d7G0j2TKgZ","ordre":4,"notes":null,"slug":"m-cx-lenoncourt-1968-pro01-mcr01","sections_with_values":[],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"mdp","etape_statut_id":"fai","date":"2020-08-04","id":"mQnOvtSGpc1T83bSvOOorVOa","ordre":2,"notes":null,"slug":"m-cx-lenoncourt-1968-pro01-mdp01","sections_with_values":[],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"mfr","fondamentale":{"date_debut":null,"date_fin":null,"duree":300,"substances":["nacl"],"titulaires":[{"id":"fr-442993283","nom":"NOVACARB","operateur":false}],"amodiataires":null,"perimetre":{"geojson4326_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[6.255869021711159,48.675202067410254],[6.263459497281365,48.6611397799328],[6.274477936823362,48.661530617274785],[6.29531036181682,48.66798716858568],[6.3162302722649795,48.67616624512283],[6.31565519531486,48.68038643555574],[6.307660371971501,48.69025022534333],[6.302480013569365,48.68917854238857],[6.2963188041374485,48.68915103738882],[6.290983811108587,48.68777705995633],[6.285642745098623,48.68911271820202],[6.281739260684181,48.68909422269382],[6.275638319504659,48.68547207905551],[6.255869021711159,48.675202067410254]]]]}},"geojson4326_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[6.255869021711159,48.675202067410254]},"properties":{"nom":"A","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.275638319504659,48.68547207905551]},"properties":{"nom":"B","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.281739260684181,48.68909422269382]},"properties":{"nom":"C","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.285642745098623,48.68911271820202]},"properties":{"nom":"D","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.290983811108587,48.68777705995633]},"properties":{"nom":"E","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2963188041374485,48.68915103738882]},"properties":{"nom":"F","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.302480013569365,48.68917854238857]},"properties":{"nom":"G","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.307660371971501,48.69025022534333]},"properties":{"nom":"H","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.31565519531486,48.68038643555574]},"properties":{"nom":"I","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.3162302722649795,48.67616624512283]},"properties":{"nom":"J","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.29531036181682,48.66798716858568]},"properties":{"nom":"K","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.274477936823362,48.661530617274785]},"properties":{"nom":"L","description":"Nouveau sommet « d’extension » défini par NOVACARB"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.263459497281365,48.6611397799328]},"properties":{"nom":"M","description":"Nouveau sommet « d’extension » défini par NOVACARB"}}]},"geojson_origine_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[939659,6846613],[941066,6847814],[941498,6848235],[941785,6848249],[942184,6848117],[942570,6848286],[943023,6848308],[943399,6848443],[944033,6847372],[944095,6846905],[942594,6845932],[941091,6845151],[940282,6845074],[939659,6846613]]]]}},"geojson_origine_points":{"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[939659,6846613]},"properties":{"nom":"A"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[941066,6847814]},"properties":{"nom":"B"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[941498,6848235]},"properties":{"nom":"C"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[941785,6848249]},"properties":{"nom":"D"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[942184,6848117]},"properties":{"nom":"E"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[942570,6848286]},"properties":{"nom":"F"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[943023,6848308]},"properties":{"nom":"G"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[943399,6848443]},"properties":{"nom":"H"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[944033,6847372]},"properties":{"nom":"I"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[944095,6846905]},"properties":{"nom":"J"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[942594,6845932]},"properties":{"nom":"K"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[941091,6845151]},"properties":{"nom":"L","description":"Nouveau sommet « d’extension » défini par NOVACARB"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[940282,6845074]},"properties":{"nom":"M","description":"Nouveau sommet « d’extension » défini par NOVACARB"}}]},"geojson_origine_geo_systeme_id":"2154","geojson4326_forages":null,"geojson_origine_forages":null,"surface":9.05,"communes":[{"id":"54495","nom":"Saulxures-lès-Nancy"},{"id":"54311","nom":"Lenoncourt"},{"id":"54025","nom":"Art-sur-Meurthe"},{"id":"54110","nom":"Cerville"}],"secteurs_maritimes":[],"sdom_zones":[],"forets":[]}},"etape_statut_id":"fai","date":"2020-07-06","id":"mh70cpBA8jOZWCEDJKupM4Rs","ordre":1,"notes":null,"slug":"m-cx-lenoncourt-1968-pro01-mfr01","sections_with_values":[],"entreprises_documents":[],"etape_documents":[]}],"demarche_type_id":"pro","demarche_statut_id":"acc","demarche_date_debut":"2024-03-01","demarche_date_fin":"2049-03-01","ordre":11},{"id":"b7586ad241a658ae1eb42b08","slug":"m-cx-lenoncourt-1968-exp02","description":"","etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":null,"titulaires":null,"amodiataires":null,"perimetre":null},"etape_statut_id":"acc","date":"2024-03-01","id":"e48a19b86d090feadc67a893","ordre":2,"notes":null,"slug":"m-cx-lenoncourt-1968-exp02-dpu01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":"JORFTEXT000049219226"},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":"ECOL2320431D"}]}],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":["nacl"],"titulaires":[{"id":"fr-442993283","nom":"NOVACARB","operateur":false}],"amodiataires":null,"perimetre":{"geojson4326_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[6.2559,48.6752],[6.2756,48.6855],[6.2817,48.6891],[6.2856,48.6891],[6.291,48.6878],[6.2963,48.6892],[6.3025,48.6892],[6.3076,48.689],[6.3157,48.6804],[6.3162,48.6762],[6.2953,48.668],[6.2794,48.6631],[6.2614,48.6649],[6.2559,48.6752]]]]}},"geojson4326_points":{"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2559,48.6752]},"properties":{"nom":"E","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2756,48.6855]},"properties":{"nom":"A","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2817,48.6891]},"properties":{"nom":"B1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2856,48.6891]},"properties":{"nom":"C1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.291,48.6878]},"properties":{"nom":"D1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2963,48.6892]},"properties":{"nom":"E1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.3025,48.6892]},"properties":{"nom":"F1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.3076,48.689]},"properties":{"nom":"G1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.3157,48.6804]},"properties":{"nom":"B","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.3162,48.6762]},"properties":{"nom":"C","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2953,48.668]},"properties":{"nom":"D","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2794,48.6631]},"properties":{"nom":"Da","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2614,48.6649]},"properties":{"nom":"Db","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2559,48.6752]},"properties":{"nom":"E","description":null}}]},"geojson_origine_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[6.2559,48.6752],[6.2756,48.6855],[6.2817,48.6891],[6.2856,48.6891],[6.291,48.6878],[6.2963,48.6892],[6.3025,48.6892],[6.3076,48.689],[6.3157,48.6804],[6.3162,48.6762],[6.2953,48.668],[6.2794,48.6631],[6.2614,48.6649],[6.2559,48.6752]]]]}},"geojson_origine_points":{"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2559,48.6752]},"properties":{"nom":"E","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2756,48.6855]},"properties":{"nom":"A","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2817,48.6891]},"properties":{"nom":"B1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2856,48.6891]},"properties":{"nom":"C1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.291,48.6878]},"properties":{"nom":"D1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2963,48.6892]},"properties":{"nom":"E1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.3025,48.6892]},"properties":{"nom":"F1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.3076,48.689]},"properties":{"nom":"G1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.3157,48.6804]},"properties":{"nom":"B","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.3162,48.6762]},"properties":{"nom":"C","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2953,48.668]},"properties":{"nom":"D","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2794,48.6631]},"properties":{"nom":"Da","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2614,48.6649]},"properties":{"nom":"Db","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2559,48.6752]},"properties":{"nom":"E","description":null}}]},"geojson_origine_geo_systeme_id":"4326","geojson4326_forages":null,"geojson_origine_forages":null,"surface":8.65,"communes":[{"id":"54495","nom":"Saulxures-lès-Nancy"},{"id":"54311","nom":"Lenoncourt"},{"id":"54025","nom":"Art-sur-Meurthe"},{"id":"54110","nom":"Cerville"}],"secteurs_maritimes":[],"sdom_zones":[],"forets":[]}},"etape_statut_id":"acc","date":"2024-02-29","id":"c15f4ceaa62a6298a2f8e117","ordre":1,"notes":null,"slug":"m-cx-lenoncourt-1968-exp02-dex01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[{"id":"2024-02-29-dec-d9f1e868","description":"","etape_document_type_id":"dec","public_lecture":true,"entreprises_lecture":true},{"id":"2024-02-29-dec-32312304","description":"","etape_document_type_id":"dec","public_lecture":true,"entreprises_lecture":true}]}],"demarche_type_id":"exp","demarche_statut_id":"acc","demarche_date_debut":null,"demarche_date_fin":null,"ordre":12}],"nb_activites_to_do":null}
 )
 
     return Promise.resolve(lenoncourtData)
diff --git a/packages/ui/src/components/titre/demarche-api-client.ts b/packages/ui/src/components/titre/demarche-api-client.ts
index d8a4da2c7d603444b318f8126b8cafc0f228d4b6..97f0004b2da6f5e1b37a3b17ca446f8e380c3acf 100644
--- a/packages/ui/src/components/titre/demarche-api-client.ts
+++ b/packages/ui/src/components/titre/demarche-api-client.ts
@@ -13,6 +13,7 @@ import { EntrepriseId } from 'camino-common/src/entreprise'
 import { SubstanceLegaleId } from 'camino-common/src/static/substancesLegales'
 import { TitreTypeTypeId } from 'camino-common/src/static/titresTypesTypes'
 import { getWithJson } from '../../api/client-rest'
+import { DeepReadonly } from 'vue'
 
 interface InputDemarcheCreation {
   titreId: string
@@ -58,7 +59,7 @@ export interface DemarcheApiClient {
   createDemarche: (demarche: InputDemarcheCreation) => Promise<DemarcheSlug>
   updateDemarche: (demarche: InputDemarcheUpdation) => Promise<DemarcheSlug>
   deleteDemarche: (demarcheId: DemarcheId) => Promise<void>
-  getDemarcheByIdOrSlug: (demarcheIdOrSlug: DemarcheIdOrSlug) => Promise<GetDemarcheByIdOrSlugValidator>
+  getDemarcheByIdOrSlug: (demarcheIdOrSlug: DemarcheIdOrSlug) => Promise<DeepReadonly<GetDemarcheByIdOrSlugValidator>>
   getDemarches: (params: GetDemarchesParams) => Promise<{ elements: GetDemarchesDemarche[]; total: number }>
 }
 
diff --git a/packages/ui/src/components/titre/demarche-edit-popup.stories_snapshots_Create.html b/packages/ui/src/components/titre/demarche-edit-popup.stories_snapshots_Create.html
index d2ce9bdb26abd2d9a0ad94cceada9a19acc6e25c..9ed7ca749a95f9aa61a7d9009869e2551c93e322 100644
--- a/packages/ui/src/components/titre/demarche-edit-popup.stories_snapshots_Create.html
+++ b/packages/ui/src/components/titre/demarche-edit-popup.stories_snapshots_Create.html
@@ -16,7 +16,7 @@
                       <option value="ren">renonciation</option>
                       <option value="ret">retrait</option>
                     </select></div>
-                  <div class="fr-input-group"><label class="fr-label" for="input_271">Description
+                  <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_271">Description
                       <!---->
                       <!---->
                     </label><input class="fr-input" name="input_271" id="input_271" type="text">
diff --git a/packages/ui/src/components/titre/demarche-edit-popup.stories_snapshots_Edit.html b/packages/ui/src/components/titre/demarche-edit-popup.stories_snapshots_Edit.html
index ea31c769af415fea52d0c7665a9856f36855f4aa..7f5b453c7a11e66b30110f9a6308e364df7b84d3 100644
--- a/packages/ui/src/components/titre/demarche-edit-popup.stories_snapshots_Edit.html
+++ b/packages/ui/src/components/titre/demarche-edit-popup.stories_snapshots_Edit.html
@@ -16,7 +16,7 @@
                       <option value="ren">renonciation</option>
                       <option value="ret">retrait</option>
                     </select></div>
-                  <div class="fr-input-group"><label class="fr-label" for="input_271">Description
+                  <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_271">Description
                       <!---->
                       <!---->
                     </label><input class="fr-input" name="input_271" id="input_271" type="text">
diff --git a/packages/ui/src/components/titre/edit-popup.stories_snapshots_DefaultNoReference.html b/packages/ui/src/components/titre/edit-popup.stories_snapshots_DefaultNoReference.html
index 368ab90f0500b037d3af41198def6b7b8065cd5b..5441abbd7ad15c431cdfb837abda712d131f9efb 100644
--- a/packages/ui/src/components/titre/edit-popup.stories_snapshots_DefaultNoReference.html
+++ b/packages/ui/src/components/titre/edit-popup.stories_snapshots_DefaultNoReference.html
@@ -10,12 +10,12 @@
               <h1 id="monId-title" class="fr-modal__title"><span class="fr-icon-arrow-right-line fr-icon--lg" aria-hidden="true"></span>Modification du titre</h1>
               <div class="fr-container">
                 <form>
-                  <div class="fr-input-group"><label class="fr-label" for="titre_nom">Nom *
+                  <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="titre_nom">Nom *
                       <!---->
                     </label><input class="fr-input" name="titre_nom" id="titre_nom" required="" type="text">
                     <!---->
                   </div>
-                  <div class="fr-input-group"><label class="fr-label fr-mb-1w" for="references">Références</label><button class="fr-btn fr-btn--icon-right fr-icon-add-line fr-btn--tertiary fr-btn--md" title="Ajouter une référence" aria-label="Ajouter une référence" type="button">Ajouter une référence</button></div>
+                  <div class="fr-input-group fr-mb-0 fr-mt-3w"><label class="fr-label fr-mb-1w" for="references">Références</label><button class="fr-btn fr-btn--icon-right fr-icon-add-line fr-btn--tertiary fr-btn--md" title="Ajouter une référence" aria-label="Ajouter une référence" type="button">Ajouter une référence</button></div>
                 </form>
               </div>
             </div>
diff --git a/packages/ui/src/components/titre/edit-popup.stories_snapshots_OneReference.html b/packages/ui/src/components/titre/edit-popup.stories_snapshots_OneReference.html
index 4748ee2ba29e7faaa5436d4d474e12bdcac2f9c2..1ed94e4801c2242b568a6670b4a1436604c208d5 100644
--- a/packages/ui/src/components/titre/edit-popup.stories_snapshots_OneReference.html
+++ b/packages/ui/src/components/titre/edit-popup.stories_snapshots_OneReference.html
@@ -10,12 +10,12 @@
               <h1 id="monId-title" class="fr-modal__title"><span class="fr-icon-arrow-right-line fr-icon--lg" aria-hidden="true"></span>Modification du titre</h1>
               <div class="fr-container">
                 <form>
-                  <div class="fr-input-group"><label class="fr-label" for="titre_nom">Nom *
+                  <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="titre_nom">Nom *
                       <!---->
                     </label><input class="fr-input" name="titre_nom" id="titre_nom" required="" type="text">
                     <!---->
                   </div>
-                  <div class="fr-input-group"><label class="fr-label fr-mb-1w" for="references">Références</label>
+                  <div class="fr-input-group fr-mb-0 fr-mt-3w"><label class="fr-label fr-mb-1w" for="references">Références</label>
                     <div class="fr-grid-row fr-grid-row--middle fr-mb-3v">
                       <div class="fr-select-group fr-col fr-mb-0">
                         <!----><select class="fr-select" id="select_271" aria-label="" name="select_271">
@@ -32,7 +32,7 @@
                           <option disabled="" hidden="" value="">Selectionnez une option</option>
                         </select>
                       </div>
-                      <div class="fr-input-group fr-col fr-ml-2v fr-mb-0">
+                      <div class="fr-input-group fr-col fr-ml-2v fr-mb-0" style="margin-bottom: 0px;">
                         <!----><input class="fr-input" name="input_670" id="input_670" type="text">
                         <!---->
                       </div><button class="fr-btn fr-btn--tertiary fr-btn--md fr-icon-delete-bin-line fr-ml-2v" title="Supprimer la référence 1" aria-label="Supprimer la référence 1" type="button">
diff --git a/packages/ui/src/components/titre/edit-popup.tsx b/packages/ui/src/components/titre/edit-popup.tsx
index 2b3d0e32d1e1cfb476317a324a496257808733d7..134b31b72155abc66d166eae52d51369274f775a 100644
--- a/packages/ui/src/components/titre/edit-popup.tsx
+++ b/packages/ui/src/components/titre/edit-popup.tsx
@@ -28,7 +28,7 @@ export const EditPopup = caminoDefineComponent<Props>(['titre', 'close', 'apiCli
   const content = () => (
     <form>
       <DsfrInput id="titre_nom" legend={{ main: 'Nom' }} type={{ type: 'text' }} valueChanged={nomChange} initialValue={nom.value} required={true} />
-      <TitreReferenceSelect initialValues={props.titre.references} onUpdateReferences={onUpdateReferences} />
+      <TitreReferenceSelect class="fr-mt-3w" initialValues={props.titre.references} onUpdateReferences={onUpdateReferences} />
     </form>
   )
 
diff --git a/packages/ui/src/components/titre/titre-abonner-button.stories_snapshots_Loading.html b/packages/ui/src/components/titre/titre-abonner-button.stories_snapshots_Loading.html
index 0814b4046c62a04f11de1cf29d5a742e6da08098..6594af26495953ec894f7e2e34367c7a711f0598 100644
--- a/packages/ui/src/components/titre/titre-abonner-button.stories_snapshots_Loading.html
+++ b/packages/ui/src/components/titre/titre-abonner-button.stories_snapshots_Loading.html
@@ -1,5 +1,5 @@
 <div class="dsfr">
-  <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+  <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
     <!---->
     <div class="_spinner_3306d0"></div>
   </div>
diff --git a/packages/ui/src/components/titre/titre-abonner-button.stories_snapshots_WithError.html b/packages/ui/src/components/titre/titre-abonner-button.stories_snapshots_WithError.html
index af48239788c5a0d46ee551ec11f81fa9ef25209d..1250201be282da7e39dc5c057fc9b06b6fd93a68 100644
--- a/packages/ui/src/components/titre/titre-abonner-button.stories_snapshots_WithError.html
+++ b/packages/ui/src/components/titre/titre-abonner-button.stories_snapshots_WithError.html
@@ -1,5 +1,5 @@
 <div class="dsfr">
-  <div class="" style="display: flex; justify-content: center;">
+  <div class=" undefined" style="display: flex; justify-content: center;">
     <div>
       <div class="_tooltip_4f6ea8">
         <h6 class="_tooltip-content_4f6ea8">Une erreur est survenue</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
diff --git a/packages/ui/src/components/titre/titre-demarche.tsx b/packages/ui/src/components/titre/titre-demarche.tsx
index 8164ce50237c3aedc86f6d290c999ecf42f9f4e2..7c4a2aa55c4337b75ab7415aa33330893d53a510 100644
--- a/packages/ui/src/components/titre/titre-demarche.tsx
+++ b/packages/ui/src/components/titre/titre-demarche.tsx
@@ -215,6 +215,7 @@ export const TitreDemarche = defineComponent<Props>(props => {
                             demarche_type_id: demarche.value.demarche_type_id,
                             titulaires: titulaires.value ?? [],
                             sdom_zones: perimetre.value?.sdom_zones ?? [],
+                            etapes: demarche.value.etapes,
                           }}
                           apiClient={props.apiClient}
                           initTab={props.initTab}
diff --git a/packages/ui/src/components/titre/titres-link-form.stories_snapshots_TitreWithTitreLinksLoading.html b/packages/ui/src/components/titre/titres-link-form.stories_snapshots_TitreWithTitreLinksLoading.html
index d6ef86c3acd590ca75531a630034c61ff7936490..2a4172608234971d990ea6918470eb2a09954699 100644
--- a/packages/ui/src/components/titre/titres-link-form.stories_snapshots_TitreWithTitreLinksLoading.html
+++ b/packages/ui/src/components/titre/titres-link-form.stories_snapshots_TitreWithTitreLinksLoading.html
@@ -1,6 +1,6 @@
 <div class="dsfr">
   <div>
-    <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+    <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
       <!---->
       <div class="_spinner_3306d0"></div>
     </div>
diff --git a/packages/ui/src/components/titre/titres-link.stories_snapshots_Loading.html b/packages/ui/src/components/titre/titres-link.stories_snapshots_Loading.html
index 285c4a7bdef28476721ac63ae939fce06668ca8c..8c272183a5c1fdea2888f9a9bdd457f09e16f377 100644
--- a/packages/ui/src/components/titre/titres-link.stories_snapshots_Loading.html
+++ b/packages/ui/src/components/titre/titres-link.stories_snapshots_Loading.html
@@ -1,4 +1,4 @@
-<div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+<div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
   <!---->
   <div class="_spinner_3306d0"></div>
 </div>
\ No newline at end of file
diff --git a/packages/ui/src/components/titre/titres-link.stories_snapshots_WithError.html b/packages/ui/src/components/titre/titres-link.stories_snapshots_WithError.html
index dbea8c8791127e8ca010c1387357c43cac3242a8..27cc431d36f55ae40a1fbcc1d98dc7fff37f8c76 100644
--- a/packages/ui/src/components/titre/titres-link.stories_snapshots_WithError.html
+++ b/packages/ui/src/components/titre/titres-link.stories_snapshots_WithError.html
@@ -1,4 +1,4 @@
-<div class="" style="display: flex; justify-content: center;">
+<div class=" undefined" style="display: flex; justify-content: center;">
   <div>
     <div class="_tooltip_4f6ea8">
       <h6 class="_tooltip-content_4f6ea8">because reasons</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
diff --git a/packages/ui/src/components/utilisateur.stories_snapshots_Loading.html b/packages/ui/src/components/utilisateur.stories_snapshots_Loading.html
index 4a6c69cbd93a2561bb3d985436a263a44519af64..702efd78f3e19b81235c864df5eab2413206ff53 100644
--- a/packages/ui/src/components/utilisateur.stories_snapshots_Loading.html
+++ b/packages/ui/src/components/utilisateur.stories_snapshots_Loading.html
@@ -2,7 +2,7 @@
   <h5>Utilisateur</h5>
   <div class="flex">
     <h1>
-      <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+      <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
         <!---->
         <div class="_spinner_3306d0"></div>
       </div>
@@ -12,7 +12,7 @@
     <div class="accordion-header flex  border-b-s">
       <div class="py-s px-m"><span> Profil </span></div>
       <div class="overflow-hidden flex flex-end flex-right">
-        <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+        <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
           <!---->
           <div class="_spinner_3306d0"></div>
         </div>
@@ -25,7 +25,7 @@
           <div class="tablet-blob-1-4">
             <h5>Prénom</h5>
           </div>
-          <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+          <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
             <!---->
             <div class="_spinner_3306d0"></div>
           </div>
@@ -34,7 +34,7 @@
           <div class="tablet-blob-1-4">
             <h5>Nom</h5>
           </div>
-          <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+          <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
             <!---->
             <div class="_spinner_3306d0"></div>
           </div>
@@ -44,7 +44,7 @@
             <h5>Email</h5>
           </div>
           <div>
-            <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+            <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
               <!---->
               <div class="_spinner_3306d0"></div>
             </div>
@@ -54,7 +54,7 @@
           <div class="tablet-blob-1-4">
             <h5>Téléphone fixe</h5>
           </div>
-          <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+          <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
             <!---->
             <div class="_spinner_3306d0"></div>
           </div>
@@ -63,7 +63,7 @@
           <div class="tablet-blob-1-4">
             <h5>Téléphone mobile</h5>
           </div>
-          <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+          <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
             <!---->
             <div class="_spinner_3306d0"></div>
           </div>
@@ -73,7 +73,7 @@
             <h5>Rôles</h5>
           </div>
           <div class="tablet-blob-3-4 tablet-pt-s pb-s">
-            <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+            <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
               <!---->
               <div class="_spinner_3306d0"></div>
             </div>
@@ -85,7 +85,7 @@
           <div class="tablet-blob-1-4">
             <h5>Newsletter</h5>
           </div>
-          <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+          <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
             <!---->
             <div class="_spinner_3306d0"></div>
           </div>
diff --git a/packages/ui/src/components/utilisateur.stories_snapshots_error.html b/packages/ui/src/components/utilisateur.stories_snapshots_error.html
index dbf44319c8234df2d6cabef853db891d12a128cf..00f544e74372d4e59ff702e0d4d7d261396b7f6c 100644
--- a/packages/ui/src/components/utilisateur.stories_snapshots_error.html
+++ b/packages/ui/src/components/utilisateur.stories_snapshots_error.html
@@ -2,7 +2,7 @@
   <h5>Utilisateur</h5>
   <div class="flex">
     <h1>
-      <div class="" style="display: flex; justify-content: center;">
+      <div class=" undefined" style="display: flex; justify-content: center;">
         <div>
           <div class="_tooltip_4f6ea8">
             <h6 class="_tooltip-content_4f6ea8">Cassé</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
@@ -18,7 +18,7 @@
     <div class="accordion-header flex  border-b-s">
       <div class="py-s px-m"><span> Profil </span></div>
       <div class="overflow-hidden flex flex-end flex-right">
-        <div class="" style="display: flex; justify-content: center;">
+        <div class=" undefined" style="display: flex; justify-content: center;">
           <div>
             <div class="_tooltip_4f6ea8">
               <h6 class="_tooltip-content_4f6ea8">Cassé</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
@@ -37,7 +37,7 @@
           <div class="tablet-blob-1-4">
             <h5>Prénom</h5>
           </div>
-          <div class="" style="display: flex; justify-content: center;">
+          <div class=" undefined" style="display: flex; justify-content: center;">
             <div>
               <div class="_tooltip_4f6ea8">
                 <h6 class="_tooltip-content_4f6ea8">Cassé</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
@@ -52,7 +52,7 @@
           <div class="tablet-blob-1-4">
             <h5>Nom</h5>
           </div>
-          <div class="" style="display: flex; justify-content: center;">
+          <div class=" undefined" style="display: flex; justify-content: center;">
             <div>
               <div class="_tooltip_4f6ea8">
                 <h6 class="_tooltip-content_4f6ea8">Cassé</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
@@ -68,7 +68,7 @@
             <h5>Email</h5>
           </div>
           <div>
-            <div class="" style="display: flex; justify-content: center;">
+            <div class=" undefined" style="display: flex; justify-content: center;">
               <div>
                 <div class="_tooltip_4f6ea8">
                   <h6 class="_tooltip-content_4f6ea8">Cassé</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
@@ -84,7 +84,7 @@
           <div class="tablet-blob-1-4">
             <h5>Téléphone fixe</h5>
           </div>
-          <div class="" style="display: flex; justify-content: center;">
+          <div class=" undefined" style="display: flex; justify-content: center;">
             <div>
               <div class="_tooltip_4f6ea8">
                 <h6 class="_tooltip-content_4f6ea8">Cassé</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
@@ -99,7 +99,7 @@
           <div class="tablet-blob-1-4">
             <h5>Téléphone mobile</h5>
           </div>
-          <div class="" style="display: flex; justify-content: center;">
+          <div class=" undefined" style="display: flex; justify-content: center;">
             <div>
               <div class="_tooltip_4f6ea8">
                 <h6 class="_tooltip-content_4f6ea8">Cassé</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
@@ -115,7 +115,7 @@
             <h5>Rôles</h5>
           </div>
           <div class="tablet-blob-3-4 tablet-pt-s pb-s">
-            <div class="" style="display: flex; justify-content: center;">
+            <div class=" undefined" style="display: flex; justify-content: center;">
               <div>
                 <div class="_tooltip_4f6ea8">
                   <h6 class="_tooltip-content_4f6ea8">Cassé</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
diff --git a/packages/ui/src/components/utilisateur/permission-edit.stories_snapshots_Loading.html b/packages/ui/src/components/utilisateur/permission-edit.stories_snapshots_Loading.html
index 334e83d870655c48bb1ed55166fbf6c1135aea3c..f83cc0ac89abc7536936b9e318f1d76f8ca04ed5 100644
--- a/packages/ui/src/components/utilisateur/permission-edit.stories_snapshots_Loading.html
+++ b/packages/ui/src/components/utilisateur/permission-edit.stories_snapshots_Loading.html
@@ -3,7 +3,7 @@
     <h5>Rôles</h5>
   </div>
   <div class="tablet-blob-3-4 tablet-pt-s pb-s">
-    <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+    <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
       <!---->
       <div class="_spinner_3306d0"></div>
     </div>
diff --git a/packages/ui/src/components/utilisateurs.stories_snapshots_Loading.html b/packages/ui/src/components/utilisateurs.stories_snapshots_Loading.html
index 5117b5402309dd861bb6d669cd8063a56c042828..e7ba9fc4dfee65a1669d207c93eaee6612354faa 100644
--- a/packages/ui/src/components/utilisateurs.stories_snapshots_Loading.html
+++ b/packages/ui/src/components/utilisateurs.stories_snapshots_Loading.html
@@ -183,7 +183,7 @@
         </table>
       </div>
     </div>
-    <div class="_top-level_3306d0" style="display: flex; justify-content: center;">
+    <div class="_top-level_3306d0 undefined" style="display: flex; justify-content: center;">
       <!---->
       <div class="_spinner_3306d0"></div>
     </div>
diff --git a/packages/ui/src/components/utilisateurs.stories_snapshots_WithError.html b/packages/ui/src/components/utilisateurs.stories_snapshots_WithError.html
index 2feb93e9dbeb044a4db1af7732b7e5f0175fe708..bfdd6cf9eee667e5d41bd37f2d843f9427d95b2d 100644
--- a/packages/ui/src/components/utilisateurs.stories_snapshots_WithError.html
+++ b/packages/ui/src/components/utilisateurs.stories_snapshots_WithError.html
@@ -183,7 +183,7 @@
         </table>
       </div>
     </div>
-    <div class="" style="display: flex; justify-content: center;">
+    <div class=" undefined" style="display: flex; justify-content: center;">
       <div>
         <div class="_tooltip_4f6ea8">
           <h6 class="_tooltip-content_4f6ea8">Cassé</h6><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666">
diff --git a/packages/ui/src/index.ts b/packages/ui/src/index.ts
index ad68baeb1bb7bcb20d9ffe81958a97c6c50a310e..502814c6cc9683484b8f2faad9279e5fceafbac6 100644
--- a/packages/ui/src/index.ts
+++ b/packages/ui/src/index.ts
@@ -1,6 +1,5 @@
 import './styles/styles.css'
 import { createApp, ref } from 'vue'
-import { sync } from 'vuex-router-sync'
 import * as Sentry from '@sentry/vue'
 import { BrowserTracing } from '@sentry/browser'
 
@@ -60,14 +59,10 @@ const checkEventSource = () => {
 checkEventSource()
 Promise.resolve().then(async (): Promise<void> => {
   import('./styles/dsfr/dsfr.css')
-  sync(store, router)
   const [configFromJson, user, entreprises]: [CaminoConfig, User, Entreprise[]] = await Promise.all([getWithJson('/config', {}), getWithJson('/moi', {}), getWithJson('/rest/entreprises', {})])
   const app = createApp(App)
   app.provide(userKey, user)
   app.provide(entreprisesKey, ref(entreprises))
-  // TODO 2024-03-04 à supprimer quand on a plus etape-edition.vue
-  app.config.globalProperties.user = user
-  app.config.globalProperties.entreprises = entreprises
   if (isNotNullNorUndefined(configFromJson.CAMINO_STAGE)) {
     try {
       if (!configFromJson.SENTRY_DSN) throw new Error('dsn manquant')
diff --git a/packages/ui/src/router/index.ts b/packages/ui/src/router/index.ts
index bbab107250adf53cb9b1fd36fef8ea0991f47952..03cbc0ef88ee8023179a005731532b8dba2799dc 100644
--- a/packages/ui/src/router/index.ts
+++ b/packages/ui/src/router/index.ts
@@ -4,7 +4,7 @@ import store from '../store'
 import { Dashboard } from '../components/dashboard'
 import { DGTMStatsFull } from '../components/dashboard/dgtm-stats-full'
 import { Titres } from '../components/titres'
-import EtapeEdition from '../components/etape-edition.vue'
+import { EtapeEdition } from '../components/etape-edition'
 
 const TitreCreation = async () => {
   const { TitreCreation } = await import('../components/titre-creation')
@@ -489,12 +489,4 @@ router.beforeEach(async (to, from, next) => {
   next()
 })
 
-router.afterEach((to, from) => {
-  // si on enlève l’erreur dans le beforeEach, cela va enlever l’erreur et tenter d’afficher l’ancien composant qui va
-  // potentiellement regénérer une erreur. Il faut donc attendre que la route soit changée pour l’enlever.
-  if (store.state.error && to.name !== from.name) {
-    store.dispatch('errorRemove')
-  }
-})
-
 export default router
diff --git a/packages/ui/src/store/__mocks__/titre-etape.js b/packages/ui/src/store/__mocks__/titre-etape.js
deleted file mode 100644
index d2aab8d57a7467c90943bac387786f19419a71e9..0000000000000000000000000000000000000000
--- a/packages/ui/src/store/__mocks__/titre-etape.js
+++ /dev/null
@@ -1,118 +0,0 @@
-const titreEtapeMetas = {
-  substances: [],
-  entreprises: {
-    elements: [
-      { id: 'ent-1', nom: '1' },
-      { id: 'ent-2', nom: '2' },
-    ],
-  },
-  demarche: {
-    id: 'demarche-id',
-    typeId: 'oct',
-    titre: { nom: 'nom du titre', domaine: { id: 'm' } },
-  },
-}
-
-const titreEtapeMetasRes = {
-  entreprises: [
-    { id: 'ent-1', nom: '1' },
-    { id: 'ent-2', nom: '2' },
-  ],
-  demarche: {
-    id: 'demarche-id',
-    typeId: 'oct',
-    titre: { nom: 'nom du titre', domaine: { id: 'm' } },
-  },
-}
-
-const titreEtapeMetasRes2 = {
-  substances: [],
-  entreprises: [
-    { id: 'ent-1', nom: '1' },
-    { id: 'ent-2', nom: '2' },
-  ],
-  demarche: {
-    id: 'demarche-id',
-    typeId: 'oct',
-    titre: { nom: 'nom du titre', domaine: { id: 'm' } },
-  },
-}
-
-const titreEtapeEdited = {
-  id: 'etape-id',
-  titreDemarcheId: 'demarche-id',
-  date: '2020-01-01',
-  amodiataires: [],
-  titulaires: [],
-  contenu: {},
-  substances: [],
-  documents: [],
-}
-
-const titreEtapeHeritage1 = {
-  id: 'etape-id',
-  titreDemarcheId: 'demarche-id',
-  date: '2020-01-02',
-  statutId: '',
-  typeId: 'mfr',
-  dateDebut: undefined,
-  dateFin: undefined,
-  duree: undefined,
-  surface: undefined,
-  amodiataires: [],
-  titulaires: [],
-  substances: [],
-  contenu: {
-    sectionId1: { elementId1: 'valeur', elementId2: 'valeur' },
-    sectionId2: {},
-  },
-  heritageProps: {},
-  heritageContenu: {
-    sectionId1: {
-      elementId1: { etape: { id: 'etape-id' }, actif: true },
-      elementId2: { etape: { id: 'etape-id' }, actif: false },
-    },
-    sectionId2: {
-      elementId1: { etape: { id: 'etape-id' }, actif: true },
-    },
-  },
-}
-
-const titreEtapeHeritageRes1 = {
-  typeId: 'mfr',
-  heritageProps: {},
-  heritageContenu: {
-    sectionId1: {
-      elementId1: { etape: { id: 'etape-id' }, actif: true },
-      elementId2: { etape: { id: 'etape-id' }, actif: false },
-    },
-    sectionId2: {
-      elementId1: { etape: { id: 'etape-id' }, actif: true },
-    },
-    sectionId3: {},
-  },
-  contenu: {
-    sectionId1: { elementId1: 'valeur', elementId2: 'valeur' },
-  },
-}
-
-const titreEtapeHeritage2 = {
-  amodiataires: [],
-  date: '2020-01-01',
-  duree: undefined,
-  heritageProps: {},
-  statutId: '',
-  substances: [],
-  titreDemarcheId: 'demarche-id',
-  titulaires: [],
-  typeId: 'mfr',
-}
-
-const titreEtapeHeritageRes2 = {
-  typeId: 'mfr',
-  heritageProps: {},
-  heritageContenu: {},
-  contenu: {},
-}
-
-export { titreEtapeMetas, titreEtapeMetasRes, titreEtapeMetasRes2, titreEtapeEdited, titreEtapeHeritage1, titreEtapeHeritageRes1, titreEtapeHeritage2, titreEtapeHeritageRes2 }
diff --git a/packages/ui/src/store/document.js b/packages/ui/src/store/document.js
deleted file mode 100644
index 79b0b9d071821fa95680d4304b38c85a522dfe8e..0000000000000000000000000000000000000000
--- a/packages/ui/src/store/document.js
+++ /dev/null
@@ -1,119 +0,0 @@
-import { documentCreer, documentModifier, documentSupprimer } from '../api/documents'
-import { uploadCall } from '../api/_upload'
-
-const state = {}
-
-const actions = {
-  async upsert({ commit, dispatch }, { document, route, action }) {
-    try {
-      commit('popupMessagesRemove', null, { root: true })
-      commit('popupLoad', null, { root: true })
-
-      const isTemporary = document.id === document.typeId
-      if (isTemporary) {
-        delete document.id
-      }
-
-      // Il faut envoyer les données de "document" sans sa propriété "fichierNouveau"
-      // pour ne pas téléverser le fichier via GQL. Mais transformer "document" ici altère
-      // le rendu de la UI. Elle pointe vers la référence de "document.fichierNouveau"
-      // pour afficher le nom du fichier. On en crée donc une copie.
-      const documentToSend = Object.assign({}, document)
-      delete documentToSend.fichierNouveau
-
-      let uploadURL
-      let documentReturned
-
-      if (document.fichierNouveau) {
-        uploadURL = await uploadCall(document.fichierNouveau, progress => {
-          commit('fileLoad', { loaded: progress, total: 100 }, { root: true })
-        })
-      }
-
-      const nomTemporaire = uploadURL
-
-      const idOld = document.id
-      try {
-        if (!document.id) {
-          documentReturned = await documentCreer({
-            document: { ...documentToSend, nomTemporaire },
-          })
-        } else {
-          delete documentToSend.typeId
-          documentReturned = await documentModifier({
-            document: { ...documentToSend, nomTemporaire },
-          })
-        }
-
-        dispatch('messageAdd', { value: `le document a été mis à jour`, type: 'success' }, { root: true })
-
-        dispatch('refreshAfterUpsert', {
-          route,
-          idOld,
-          titreEtapeId: document.titreEtapeId,
-          document: documentReturned,
-          action,
-        })
-
-        // Ne ferme la popup automatiquement que si tout s'est passé sans erreur
-        commit('popupClose', null, { root: true })
-      } catch (e) {
-        commit('popupMessageAdd', { value: e, type: 'error' }, { root: true })
-      }
-    } catch (e) {
-      commit('popupMessageAdd', { value: e, type: 'error' }, { root: true })
-    } finally {
-      commit('fileLoad', { loaded: 0, total: 0 }, { root: true })
-    }
-  },
-
-  async refreshAfterUpsert({ dispatch }, { route, idOld, document, action }) {
-    if (route) {
-      await dispatch('reload', route, { root: true })
-    } else if (action) {
-      const params = { ...action.params, document }
-
-      if (idOld) {
-        params.idOld = idOld
-      }
-
-      await dispatch(action.name, params, { root: true })
-    }
-  },
-
-  async remove({ commit, dispatch }, { id, route }) {
-    try {
-      commit('popupMessagesRemove', null, { root: true })
-      commit('loadingAdd', 'documentRemove', { root: true })
-      if (route) {
-        commit('popupLoad', null, { root: true })
-      }
-
-      await documentSupprimer({ id })
-
-      if (route) {
-        commit('popupClose', null, { root: true })
-
-        dispatch('messageAdd', { value: `le document a été supprimé`, type: 'success' }, { root: true })
-        await dispatch('reload', route, { root: true })
-      }
-    } catch (e) {
-      commit('popupMessageAdd', { value: e, type: 'error' }, { root: true })
-    } finally {
-      commit('loadingRemove', 'documentRemove', { root: true })
-    }
-  },
-}
-
-const mutations = {
-  uploadProgress(state, progress) {
-    state.upload.progress = progress
-  },
-}
-
-export default {
-  namespaced: true,
-  state,
-  actions,
-  mutations,
-}
diff --git a/packages/ui/src/store/document.test.js b/packages/ui/src/store/document.test.js
deleted file mode 100644
index 667d21ad5962d788ba03ccdaa63a5452b63d176a..0000000000000000000000000000000000000000
--- a/packages/ui/src/store/document.test.js
+++ /dev/null
@@ -1,246 +0,0 @@
-import document from './document'
-import * as api from '../api/documents'
-import * as upload from '../api/_upload'
-import { createApp } from 'vue'
-import { createStore } from 'vuex'
-import { vi, describe, expect, beforeEach, test } from 'vitest'
-
-vi.mock('../api/documents', () => ({
-  documentCreer: vi.fn(),
-  documentModifier: vi.fn(),
-  documentSupprimer: vi.fn(),
-}))
-
-vi.mock('../api/_upload', () => ({
-  uploadCall: vi.fn(),
-}))
-
-console.info = vi.fn()
-
-describe('documents', () => {
-  let store
-  let actions
-  let mutations
-
-  beforeEach(() => {
-    vi.resetAllMocks()
-
-    document.state = {
-      preferences: { types: [] },
-    }
-
-    actions = {
-      pageError: vi.fn(),
-      apiError: vi.fn(),
-      reload: vi.fn(),
-      messageAdd: vi.fn(),
-      test: vi.fn(),
-    }
-
-    mutations = {
-      loadingAdd: vi.fn(),
-      loadingRemove: vi.fn(),
-      apiError: vi.fn(),
-      popupLoad: vi.fn(),
-      popupMessagesRemove: vi.fn(),
-      popupClose: vi.fn(),
-      popupMessageAdd: vi.fn(),
-      fileLoad: vi.fn(),
-    }
-
-    store = createStore({
-      actions,
-      mutations,
-      modules: {
-        document,
-        titre: {
-          namespaced: true,
-          mutations: { open: vi.fn() },
-        },
-      },
-    })
-
-    const app = createApp({})
-    app.use(store)
-  })
-
-  test('ajoute un document', async () => {
-    let document = {
-      nom: 'champs',
-      typeId: 1,
-      fichier: true,
-      fichierNouveau: new Blob(),
-      nomTemporaire: undefined,
-    }
-    const apiMock = api.documentCreer.mockResolvedValue({
-      nom: 'champs',
-    })
-
-    await store.dispatch('document/upsert', {
-      document,
-      route: { name: 'titre', id: 'titre-id', section: 'etapes' },
-    })
-    expect(upload.uploadCall).toHaveBeenCalled()
-    const sentDocument = { ...document }
-    delete sentDocument.fichierNouveau
-    expect(apiMock).toHaveBeenCalledWith({ document: sentDocument })
-
-    vi.resetAllMocks()
-
-    await store.dispatch('document/upsert', {
-      document,
-      route: 'something',
-    })
-    expect(upload.uploadCall).toHaveBeenCalled()
-    expect(apiMock).toHaveBeenCalledWith({ document: sentDocument })
-
-    vi.resetAllMocks()
-
-    document = {
-      nom: 'champs',
-      typeId: 1,
-      fichier: true,
-      nomTemporaire: undefined,
-    }
-    await store.dispatch('document/upsert', {
-      document,
-      route: { name: 'titre', id: 'titre-id', section: 'travaux' },
-    })
-    expect(upload.uploadCall).not.toHaveBeenCalled()
-    expect(apiMock).toHaveBeenCalledWith({ document })
-  })
-
-  test("retourne une erreur si l'API retourne une erreur lors de l'ajout d'un document", async () => {
-    api.documentCreer.mockRejectedValueOnce(() => new Error('erreur api'))
-    await store.dispatch('document/upsert', {
-      document: { nom: 'champs', fichierNouveau: new Blob() },
-    })
-
-    expect(upload.uploadCall).toHaveBeenCalled()
-    expect(mutations.popupMessageAdd).toHaveBeenCalled()
-  })
-
-  test('met à jour un document', async () => {
-    let document = {
-      nom: 'champs',
-      id: 14,
-      typeId: 1,
-      fichier: true,
-      fichierNouveau: new Blob(),
-      nomTemporaire: undefined,
-    }
-    const apiMock = api.documentModifier.mockResolvedValue({
-      id: 14,
-      nom: 'champs',
-    })
-
-    await store.dispatch('document/upsert', {
-      document,
-      route: { name: 'titre', id: 'titre-id', section: 'etapes' },
-    })
-    expect(upload.uploadCall).toHaveBeenCalled()
-    let sentDocument = { ...document }
-    delete sentDocument.fichierNouveau
-    delete sentDocument.typeId
-    expect(apiMock).toHaveBeenCalledWith({ document: sentDocument })
-
-    vi.resetAllMocks()
-
-    await store.dispatch('document/upsert', {
-      document,
-      route: 'something',
-    })
-    expect(upload.uploadCall).toHaveBeenCalled()
-    expect(apiMock).toHaveBeenCalledWith({ document: sentDocument })
-
-    vi.resetAllMocks()
-
-    document = {
-      nom: 'champs',
-      id: 14,
-      typeId: 1,
-      fichier: true,
-      nomTemporaire: undefined,
-    }
-    await store.dispatch('document/upsert', {
-      document,
-      route: { name: 'titre', id: 'titre-id', section: 'travaux' },
-    })
-    expect(upload.uploadCall).not.toHaveBeenCalled()
-    sentDocument = { ...document }
-    delete sentDocument.typeId
-    expect(apiMock).toHaveBeenCalledWith({ document: sentDocument })
-  })
-
-  test('ajoute un nouveau document si c’est un document temporaire', async () => {
-    const document = {
-      nom: 'champs',
-      typeId: 1,
-      fichier: true,
-      fichierNouveau: new Blob(),
-      nomTemporaire: undefined,
-    }
-    const apiMock = api.documentCreer.mockResolvedValue({
-      id: 14,
-      nom: 'champs',
-    })
-
-    await store.dispatch('document/upsert', {
-      document,
-      route: { name: 'titre', id: 'titre-id' },
-    })
-    expect(upload.uploadCall).toHaveBeenCalled()
-    const sentDocument = { ...document }
-    delete sentDocument.fichierNouveau
-    expect(apiMock).toHaveBeenCalledWith({ document: sentDocument })
-  })
-
-  test('applique une action au lieu d’être redirigé', async () => {
-    api.documentCreer.mockImplementationOnce(async () => {
-      await store.dispatch('document/refreshAfterUpsert', {
-        action: { name: 'test' },
-      })
-    })
-
-    await store.dispatch('document/upsert', {
-      document: { id: 14, nom: 'champs', typeId: 1 },
-      action: { name: 'test' },
-    })
-
-    expect(actions.test).toHaveBeenCalled()
-  })
-
-  test("retourne une erreur si l'API retourne une erreur lors de la mise à jour d'un document", async () => {
-    api.documentModifier.mockRejectedValue(new Error("erreur de l'api"))
-    await store.dispatch('document/upsert', {
-      document: { id: 14, nom: 'champs' },
-    })
-
-    expect(mutations.popupMessageAdd).toHaveBeenCalled()
-  })
-
-  test('supprime un document', async () => {
-    const apiMock = api.documentSupprimer.mockResolvedValue(true)
-    await store.dispatch('document/remove', {
-      id: 62,
-      route: { name: 'titre', id: 'titre-id' },
-    })
-
-    expect(apiMock).toHaveBeenCalledWith({ id: 62 })
-    expect(mutations.popupClose).toHaveBeenCalled()
-    await store.dispatch('document/remove', {
-      id: 62,
-    })
-
-    expect(apiMock).toHaveBeenCalledWith({ id: 62 })
-    expect(mutations.popupClose).toHaveBeenCalled()
-  })
-
-  test("retourne une erreur si l'API retourne une erreur lors de la suppression d'un document", async () => {
-    const apiMock = api.documentSupprimer.mockRejectedValue(new Error("erreur de l'api"))
-    await store.dispatch('document/remove', { id: 62 })
-
-    expect(apiMock).toHaveBeenCalledWith({ id: 62 })
-    expect(mutations.popupMessageAdd).toHaveBeenCalled()
-  })
-})
diff --git a/packages/ui/src/store/index.js b/packages/ui/src/store/index.js
index 4efbfcf4ffbef053f0c699509f9ee0c585b4d588..70b13e378bb67a61160b4a37ca7b9cf6db703fc2 100644
--- a/packages/ui/src/store/index.js
+++ b/packages/ui/src/store/index.js
@@ -1,78 +1,15 @@
-import { shallowRef } from 'vue'
 import { createStore } from 'vuex'
-import { saveAs } from 'file-saver'
-
-import router from '../router'
-import { urlQueryUpdate } from '../utils/url'
-
-import titreEtape from './titre-etape'
-import titreEtapeEdition from './titre-etape-edition'
-import document from './document'
 import meta from './meta'
 
 const modules = {
-  titreEtape,
-  titreEtapeEdition,
-  document,
   meta,
 }
 
 const state = {
-  config: {},
   messages: [],
-  popup: { component: null, props: null, messages: [], loading: false },
-  error: null,
-  menu: { component: null },
-  loading: [],
-  fileLoading: {
-    loaded: 0,
-    total: 0,
-  },
-}
-
-function isOnPristineLandingPage(query) {
-  return query.centre === '46.227103425310766,2.499999999999991' && query.vueId === 'carte' && Object.keys(query).length === 3
 }
 
 const actions = {
-  apiError({ commit }, error) {
-    if (error.message === 'aborted') return
-
-    const id = Date.now()
-
-    commit('messageAdd', {
-      id,
-      type: 'error',
-      value: `Erreur : ${error}`,
-    })
-
-    setTimeout(() => {
-      commit('messageRemove', id)
-    }, 4500)
-
-    console.error(error)
-  },
-
-  pageError({ user, commit, getters }) {
-    if (user !== null) {
-      commit('errorUpdate', {
-        type: 'error',
-        value: `Erreur: page introuvable`,
-      })
-    } else {
-      commit('errorUpdate', {
-        type: 'info',
-        value: `Vous n'avez pas accès à cette page, veuillez vous connecter.`,
-      })
-    }
-  },
-
-  errorRemove({ state, commit }) {
-    if (state.error) {
-      commit('errorUpdate', null)
-    }
-  },
-
   messageAdd({ commit }, message) {
     const id = Date.now()
     message.id = id
@@ -83,62 +20,6 @@ const actions = {
       commit('messageRemove', id)
     }, 4500)
   },
-
-  async reload({ dispatch, rootState }, { name, id }) {
-    if (!id) {
-      router.push({ name })
-    } else {
-      const idOld = rootState.route.params.id
-
-      if (id !== idOld) {
-        router.replace({ name, params: { id } })
-      } else {
-        await dispatch(`${name}/get`, id)
-      }
-    }
-  },
-
-  async downloadDocument({ dispatch }, document) {
-    if (document.fichierNouveau) {
-      saveAs(document.fichierNouveau)
-      dispatch('messageAdd', {
-        type: 'success',
-        value: `fichier téléchargé : ${document.fichierNouveau.name}`,
-      })
-    } else {
-      await dispatch('download', `/download/fichiers/${document.id}`)
-    }
-  },
-
-  async download({ dispatch, commit }, path) {
-    try {
-      saveAs(`/apiUrl${path}`)
-
-      dispatch('messageAdd', {
-        type: 'success',
-        value: `fichier téléchargé`,
-      })
-    } catch (e) {
-      dispatch('apiError', `téléchargement : ${path}, ${e}`)
-    } finally {
-      commit('loadingRemove', 'fileLoading')
-      commit('fileLoad', { loaded: 0, total: 0 })
-    }
-  },
-
-  async urlQueryUpdate({ rootState }, { params, definitions }) {
-    const { status, query } = urlQueryUpdate(params, rootState.route.query, definitions)
-
-    if (status === 'updated') {
-      await router.push({ query })
-    } else if (status === 'created') {
-      await router.replace({ query })
-    }
-
-    if (isOnPristineLandingPage(query)) {
-      history.replaceState({}, null, '/')
-    }
-  },
 }
 
 const mutations = {
@@ -150,54 +31,6 @@ const mutations = {
     const index = state.messages.findIndex(m => m.id === id)
     state.messages.splice(index, 1)
   },
-
-  popupOpen(state, { component, props }) {
-    state.popup.component = shallowRef(component)
-    state.popup.props = props
-    state.popup.messages = []
-  },
-
-  popupClose(state) {
-    state.popup.component = null
-    state.popup.props = null
-    state.popup.messages = []
-    state.popup.loading = false
-  },
-
-  errorUpdate(state, error) {
-    state.error = error
-  },
-
-  popupLoad(state) {
-    state.popup.loading = true
-  },
-
-  popupMessagesRemove(state) {
-    state.popup.messages = []
-    state.popup.loading = false
-  },
-
-  popupMessageAdd(state, message) {
-    state.popup.messages.push(message)
-    state.popup.loading = false
-  },
-
-  loadingAdd(state, name) {
-    state.loading.push(name)
-  },
-
-  loadingRemove(state, name) {
-    const index = state.loading.indexOf(name)
-
-    if (index > -1) {
-      state.loading.splice(index, 1)
-    }
-  },
-
-  fileLoad(state, { loaded, total }) {
-    state.fileLoading.loaded = loaded
-    state.fileLoading.total = total
-  },
 }
 
 export { actions, mutations }
diff --git a/packages/ui/src/store/index.test.js b/packages/ui/src/store/index.test.js
index 2af6a4e07d99937522cc3fae38680438337d2714..127118ed7e9859e555babbce9bc17fe3b16677ea 100644
--- a/packages/ui/src/store/index.test.js
+++ b/packages/ui/src/store/index.test.js
@@ -1,32 +1,10 @@
 import { actions, mutations } from './index'
 import { createApp } from 'vue'
 import { createStore } from 'vuex'
-import * as fileSaver from 'file-saver'
-import * as router from '../router'
 import { vi, describe, expect, beforeEach, test } from 'vitest'
 
-vi.mock('file-saver', () => ({ saveAs: vi.fn() }))
-vi.mock('./titre', () => ({ default: { titre: vi.fn() } }))
-vi.mock('./titre-creation', () => ({ default: { titreCreation: vi.fn() } }))
-vi.mock('./titre-etape', () => ({ default: { titreEtape: vi.fn() } }))
-vi.mock('./titre-etape-edition', () => ({ default: { titreEtape: vi.fn() } }))
-vi.mock('./document', () => ({ default: { document: vi.fn() } }))
-vi.mock('./titres-demarches', () => ({ default: { titresDemarches: vi.fn() } }))
-vi.mock('./utilisateur', () => ({ default: { utilisateur: vi.fn() } }))
-vi.mock('./administration', () => ({ default: { administration: vi.fn() } }))
-vi.mock('./user', () => ({ default: { user: vi.fn() } }))
-vi.mock('./titre-activite', () => ({ default: { titreActivite: vi.fn() } }))
-vi.mock('./statistiques', () => ({ default: { statistiques: vi.fn() } }))
-vi.mock('./definitions', () => ({ default: { definitions: vi.fn() } }))
 vi.mock('./meta', () => ({ default: { meta: vi.fn() } }))
 
-vi.mock('../router', () => ({
-  default: {
-    replace: vi.fn(),
-    push: vi.fn(),
-  },
-}))
-
 console.info = vi.fn()
 console.error = vi.fn()
 
@@ -45,25 +23,10 @@ describe("état général de l'application", () => {
           get: vi.fn(),
         },
       },
-      route: {
-        namespaced: true,
-        state: {
-          query: {},
-        },
-      },
     }
 
     state = {
-      config: {},
       messages: [],
-      popup: { component: null, props: null, messages: [], loading: false },
-      error: null,
-      loading: [],
-      loaded: false,
-      fileLoading: {
-        loaded: 0,
-        total: 0,
-      },
     }
 
     store = createStore({
@@ -86,12 +49,6 @@ describe("état général de l'application", () => {
     expect(state.messages).toEqual([message])
   })
 
-  test('met la popup en état de chargement', () => {
-    store.commit('popupLoad')
-
-    expect(state.popup.loading).toBe(true)
-  })
-
   test('supprime un message', () => {
     const message = { id: 42, message: 'message très important' }
     store.commit('messageAdd', message)
@@ -99,137 +56,6 @@ describe("état général de l'application", () => {
 
     expect(state.messages).toEqual([])
   })
-
-  test('ferme la pop-up', () => {
-    const component = 'open'
-    const props = 'open'
-    store.commit('popupOpen', { component, props })
-    store.commit('popupClose')
-
-    expect(state.popup).toMatchObject({
-      component: { _value: null },
-      props: null,
-      messages: [],
-      loading: false,
-    })
-  })
-
-  test('ajoute un message de la pop-up', () => {
-    const message = 'message très important'
-    store.commit('popupMessageAdd', message)
-
-    expect(state.popup.messages).toEqual([message])
-  })
-
-  test('supprime les messages de la pop-up', () => {
-    const message = 'message très important'
-    store.commit('popupMessageAdd', message)
-    store.commit('popupMessagesRemove')
-
-    expect(state.popup.messages).toEqual([])
-  })
-
-  test("trace si un appel à l'api est en cours", () => {
-    store.commit('loadingAdd', 'nom1')
-    store.commit('loadingAdd', 'nom2')
-    store.commit('loadingRemove', 'nom2')
-    store.commit('loadingRemove', 'nom3')
-
-    expect(state.loading).toEqual(['nom1'])
-  })
-
-  test("retourne une erreur de l'api", async () => {
-    Date.now = vi.fn(() => 1487076708000)
-    await store.dispatch('apiError', 'message')
-
-    expect(state.messages).toEqual([
-      {
-        id: 1487076708000,
-        type: 'error',
-        value: 'Erreur : message',
-      },
-    ])
-  })
-
-  test('retourne une erreur 404', async () => {
-    await store.dispatch('pageError', null)
-
-    expect(state.error).toEqual({
-      type: 'error',
-      value: `Erreur: page introuvable`,
-    })
-  })
-
-  test("ne supprime pas d'erreur s'il n'y en a pas", async () => {
-    await store.dispatch('errorRemove')
-
-    expect(state.error).toEqual(null)
-  })
-
-  test('supprime une erreur', async () => {
-    store.commit('errorUpdate', { id: 'erreur-test' })
-    await store.dispatch('errorRemove')
-
-    expect(state.error).toEqual(null)
-  })
-
-  test("recharge la page si l'id du titre n'a pas changé", async () => {
-    store.state.route.params = { id: 'titre-id' }
-    await store.dispatch('reload', { name: 'titre', id: 'titre-id' })
-
-    expect(modules.titre.actions.get).toHaveBeenCalled()
-  })
-
-  test("charge la nouvelle page si l'id du titre a changé", async () => {
-    store.state.route.params = { id: 'id-test' }
-    await store.dispatch('reload', { name: 'titre', id: 'titre-id-new' })
-    expect(router.default.replace).toHaveBeenCalled()
-  })
-
-  test("ne recharge pas la page si l'id n'a pas changé", async () => {
-    store.state.route.params = { id: 'id-test' }
-    await store.dispatch('reload', { name: 'titre', id: 'id-test' })
-
-    expect(router.default.replace).not.toHaveBeenCalled()
-    expect(modules.titre.actions.get).toHaveBeenCalled()
-  })
-
-  test("recharge la page si il n'y a pas d'id", async () => {
-    store.state.titre.element = { id: 'id-test', nom: 'marne' }
-    await store.dispatch('reload', { name: 'titres' })
-
-    expect(router.default.push).toHaveBeenCalled()
-  })
-
-  test("met à jour les paramètres d'url", async () => {
-    await store.dispatch('urlQueryUpdate', {
-      params: { typesIds: null },
-      definitions: [{ id: 'typesIds', type: 'strings', elements: [] }],
-    })
-
-    expect(router.default.push).not.toHaveBeenCalled()
-    expect(router.default.replace).not.toHaveBeenCalled()
-
-    await store.dispatch('urlQueryUpdate', {
-      params: { typesIds: ['pr', 'ar'] },
-      definitions: [{ id: 'typesIds', type: 'strings', elements: [] }],
-    })
-
-    expect(router.default.replace).toHaveBeenCalledWith({
-      query: { typesIds: 'pr,ar' },
-    })
-
-    store.state.route.query.typesIds = 'pr,ar'
-
-    await store.dispatch('urlQueryUpdate', {
-      params: { typesIds: ['cx'] },
-      definitions: [{ id: 'typesIds', type: 'strings', elements: [] }],
-    })
-
-    expect(router.default.push).toHaveBeenCalledWith({
-      query: { typesIds: 'cx' },
-    })
-  })
 })
 
 describe("état général de l'application", () => {
@@ -239,11 +65,6 @@ describe("état général de l'application", () => {
   beforeEach(() => {
     state = {
       messages: [],
-      loading: [],
-      fileLoading: {
-        loaded: 0,
-        total: 0,
-      },
     }
 
     localStorage.clear()
@@ -266,45 +87,4 @@ describe("état général de l'application", () => {
     // expect(setTimeout).toHaveBeenCalledWith(expect.any(Function), 4500)
     expect(messageRemoveMock).toHaveBeenCalled()
   })
-
-  test('télécharge un document du serveur', async () => {
-    const messageAddMock = vi.fn()
-    actions.messageAdd = messageAddMock
-    store = createStore({ state, actions, mutations })
-
-    await store.dispatch('downloadDocument', { id: 'toot' })
-
-    expect(fileSaver.saveAs).toHaveBeenCalledWith('/apiUrl/download/fichiers/toot')
-    expect(messageAddMock).toHaveBeenCalled()
-    expect(state.loading).toEqual([])
-  })
-
-  test('télécharge un nouveau document depuis le navigateur', async () => {
-    const messageAddMock = vi.fn()
-    actions.messageAdd = messageAddMock
-    store = createStore({ state, actions, mutations })
-
-    await store.dispatch('downloadDocument', {
-      fichierNouveau: { name: 'document-titre' },
-    })
-
-    expect(fileSaver.saveAs).toHaveBeenCalled()
-    expect(messageAddMock).toHaveBeenCalled()
-    expect(state.loading).toEqual([])
-  })
-
-  test('télécharge du contenu', async () => {
-    const messageAddMock = vi.fn()
-    actions.messageAdd = messageAddMock
-    store = createStore({ state, actions, mutations })
-
-    const section = 'titres'
-    const params = { typeIds: ['m', 'w'] }
-
-    await store.dispatch('download', `/${section}?${params}`)
-
-    expect(fileSaver.saveAs).toHaveBeenCalledWith(`/apiUrl/${section}?${params}`)
-    expect(messageAddMock).toHaveBeenCalled()
-    expect(state.loading).toEqual([])
-  })
 })
diff --git a/packages/ui/src/store/meta.js b/packages/ui/src/store/meta.js
index 1e9981ea03d1c4d10bc7976c771d996235a77a2b..fe5934bc22e94a04e904e494d608044401f5456b 100644
--- a/packages/ui/src/store/meta.js
+++ b/packages/ui/src/store/meta.js
@@ -6,15 +6,6 @@ const state = {
   elementsSelectedIndex: {},
 }
 
-const idsFind = (element, definition) =>
-  definition.ids
-    ? definition.ids.reduce((ids, id) => {
-        ids[id] = element[id]
-
-        return ids
-      }, {})
-    : { id: element.id }
-
 const getters = {
   elements: state => id => state.elementsIndex[id],
   elementSelected: state => id => state.elementsSelectedIndex[id],
@@ -23,8 +14,6 @@ const getters = {
 const actions = {
   async get({ dispatch, commit, state }, id) {
     try {
-      commit('loadingAdd', 'metaGet', { root: true })
-
       if (metasIndex[id]) {
         const definition = metasIndex[id]
         const elements = await definition.get()
@@ -39,9 +28,7 @@ const actions = {
         }
       }
     } catch (e) {
-      dispatch('apiError', e, { root: true })
-    } finally {
-      commit('loadingRemove', 'metaGet', { root: true })
+      console.error(e)
     }
   },
 
diff --git a/packages/ui/src/store/titre-etape-edition.js b/packages/ui/src/store/titre-etape-edition.js
deleted file mode 100644
index a699d8600243272187e33046fa216696d227402c..0000000000000000000000000000000000000000
--- a/packages/ui/src/store/titre-etape-edition.js
+++ /dev/null
@@ -1,233 +0,0 @@
-import { documentEtapeFormat, etapeEditFormat } from '../utils/titre-etape-edit'
-import { etapeSaveFormat } from '../utils/titre-etape-save'
-import { etapeHeritageBuild } from '../utils/titre-etape-heritage-build'
-
-import { etape, etapeCreer, etapeHeritage, etapeModifier, titreEtapeMetas } from '../api/titres-etapes'
-import { documentsRequiredAdd } from '../utils/documents'
-import { EtapesTypes } from 'camino-common/src/static/etapesTypes'
-import { getDocuments } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/documents'
-
-const state = {
-  element: null,
-  metas: {
-    demarche: null,
-    entreprises: [],
-    documentsTypes: [],
-    sdomZonesDocumentTypeIds: [],
-  },
-  heritageLoaded: false,
-  loaded: false,
-}
-
-const getters = {
-  etapeType(state) {
-    if (state.element?.typeId) {
-      return EtapesTypes[state.element.typeId]
-    }
-    return null
-  },
-
-  documentsTypes(state) {
-    if (!state.element.typeId) {
-      return []
-    }
-
-    const documentsTypes = getDocuments(state.metas.demarche.titre.typeId, state.metas.demarche.typeId, state.element.typeId)
-
-    // si la démarche est mécanisée il faut ajouter des documents obligatoires
-    if (state.element.contenu && state.element.contenu.arm) {
-      documentsTypes.filter(dt => ['doe', 'dep'].includes(dt.id)).forEach(dt => (dt.optionnel = !state.element.contenu.arm.mecanise))
-    }
-
-    if (state.metas.sdomZonesDocumentTypeIds?.length) {
-      documentsTypes.filter(dt => state.metas.sdomZonesDocumentTypeIds.includes(dt.id)).forEach(dt => (dt.optionnel = false))
-    }
-
-    return documentsTypes
-  },
-}
-
-const actions = {
-  async init({ commit, state, dispatch }, { titreDemarcheId, id, entreprises }) {
-    try {
-      commit('loadingAdd', 'titreEtapeInit', { root: true })
-
-      if (id) {
-        const newEtape = await etape({ id })
-
-        commit('set', etapeEditFormat(newEtape))
-
-        commit('heritageLoaded', true)
-
-        titreDemarcheId = state.element.titreDemarcheId
-      } else {
-        commit('set', etapeEditFormat({ titreDemarcheId }))
-      }
-
-      await dispatch('metasGet', { titreDemarcheId, entreprises })
-
-      if (id) {
-        await dispatch('dateUpdate', { date: state.element.date })
-      }
-
-      commit('load')
-    } catch (e) {
-      console.error(e)
-      dispatch('pageError', null, { root: true })
-    } finally {
-      commit('loadingRemove', 'titreEtapeInit', { root: true })
-    }
-  },
-
-  async metasGet({ commit, dispatch }, { titreDemarcheId, entreprises }) {
-    try {
-      commit('loadingAdd', 'titreEtapeMetasGet', { root: true })
-
-      const demarche = await titreEtapeMetas({
-        titreDemarcheId,
-      })
-
-      commit('metasSet', { demarche, entreprises })
-    } catch (e) {
-      console.error(e)
-
-      dispatch('pageError', null, { root: true })
-    } finally {
-      commit('loadingRemove', 'titreEtapeMetasGet', { root: true })
-    }
-  },
-
-  async dateUpdate({ commit }, { date }) {
-    commit('dateSet', date)
-  },
-
-  async heritageGet({ commit, state, dispatch }, { titreTypeId, demarcheTypeId, etapeTypeId }) {
-    try {
-      commit('loadingAdd', 'titreEtapeHeritageGet', { root: true })
-      commit('heritageLoaded', false)
-
-      const data = await etapeHeritage({
-        titreDemarcheId: state.metas.demarche.id,
-        date: state.element.date,
-        typeId: etapeTypeId,
-      })
-
-      const apiEtape = etapeEditFormat(data)
-      const newEtape = etapeHeritageBuild(state.element, apiEtape, titreTypeId, demarcheTypeId, etapeTypeId)
-
-      commit('heritageSet', { etape: newEtape })
-      await dispatch('documentInit', state.element.documents)
-
-      commit('heritageLoaded', true)
-    } catch (e) {
-      dispatch('apiError', e, { root: true })
-    } finally {
-      commit('loadingRemove', 'titreEtapeHeritageGet', {
-        root: true,
-      })
-    }
-  },
-
-  async documentInit({ state, getters, commit, rootGetters }, documents) {
-    if (!state.element.typeId) {
-      commit('documentsSet', [])
-    } else {
-      documents = documentsRequiredAdd(documents, getters.documentsTypes)
-
-      commit('documentsSet', documents)
-    }
-  },
-
-  async documentAdd({ state, dispatch }, { document, idOld }) {
-    document = documentEtapeFormat(document)
-    const documents = state.element.documents || []
-    if (idOld) {
-      const index = documents.findIndex(({ id }) => id === idOld)
-      documents[index] = document
-    } else {
-      documents.push(document)
-    }
-
-    await dispatch('documentInit', documents)
-  },
-
-  async documentRemove({ state, dispatch }, { id }) {
-    await dispatch(
-      'documentInit',
-      state.element.documents.filter(d => d.id !== id)
-    )
-  },
-
-  async upsert({ state, commit, dispatch }, { etape }) {
-    try {
-      commit('loadingAdd', 'titreEtapeUpdate', { root: true })
-
-      const etapeEditFormatted = etapeSaveFormat(etape)
-      etapeEditFormatted.titreDemarcheId = state.metas.demarche.id
-      let data
-      if (etapeEditFormatted.id) {
-        data = await etapeModifier({ etape: etapeEditFormatted })
-      } else {
-        data = await etapeCreer({ etape: etapeEditFormatted })
-      }
-
-      return data.id
-    } catch (e) {
-      dispatch('apiError', e, { root: true })
-    } finally {
-      commit('loadingRemove', 'titreEtapeUpdate', { root: true })
-    }
-  },
-}
-
-const mutations = {
-  load(state) {
-    state.loaded = true
-  },
-
-  set(state, etape) {
-    state.element = etape
-  },
-
-  dateSet(state, date) {
-    state.element.date = date
-  },
-
-  reset(state) {
-    state.element = null
-    state.metas = {
-      demarche: null,
-      entreprises: [],
-      documentsTypes: [],
-      sdomZonesDocumentTypeIds: [],
-    }
-    state.heritageLoaded = false
-    state.loaded = false
-  },
-
-  heritageSet(state, { etape }) {
-    state.element = etape
-  },
-
-  heritageLoaded(state, loaded) {
-    state.heritageLoaded = loaded
-  },
-
-  metasSet(state, data) {
-    Object.keys(data).forEach(id => {
-      state.metas[id] = data[id]
-    })
-  },
-
-  documentsSet(state, documents) {
-    state.element.documents = documents
-  },
-}
-
-export default {
-  namespaced: true,
-  state,
-  getters,
-  actions,
-  mutations,
-}
diff --git a/packages/ui/src/store/titre-etape-edition.test.js b/packages/ui/src/store/titre-etape-edition.test.js
deleted file mode 100644
index 763ca565c74623fa661161bc4df2a1e49275d19b..0000000000000000000000000000000000000000
--- a/packages/ui/src/store/titre-etape-edition.test.js
+++ /dev/null
@@ -1,277 +0,0 @@
-import titreEtapeEdition from './titre-etape-edition'
-import * as api from '../api/titres-etapes'
-import { createApp } from 'vue'
-import { createStore } from 'vuex'
-import { vi, describe, expect, beforeEach, test } from 'vitest'
-
-import {
-  titreEtapeMetas,
-  titreEtapeMetasRes,
-  titreEtapeMetasRes2,
-  titreEtapeEdited,
-  titreEtapeHeritage1,
-  titreEtapeHeritageRes1,
-  titreEtapeHeritageRes2,
-  titreEtapeHeritage2,
-} from './__mocks__/titre-etape'
-import { DOCUMENTS_TYPES_IDS } from 'camino-common/src/static/documentsTypes'
-import { ETAPES_TYPES } from 'camino-common/src/static/etapesTypes'
-import { DEMARCHES_TYPES_IDS } from 'camino-common/src/static/demarchesTypes'
-import { TITRES_TYPES_IDS } from 'camino-common/src/static/titresTypes'
-
-vi.mock('../api/titres-etapes', () => ({
-  etape: vi.fn(),
-  etapeHeritage: vi.fn(),
-  titreEtapeMetas: vi.fn(),
-  etapeCreer: vi.fn(),
-  etapeModifier: vi.fn(),
-}))
-
-console.info = vi.fn()
-
-describe('étapes', () => {
-  let store
-  let actions
-  let mutations
-
-  beforeEach(() => {
-    titreEtapeEdition.state = {
-      element: null,
-      metas: {
-        demarche: {},
-        entreprises: [],
-      },
-      heritageLoaded: false,
-      loaded: false,
-    }
-
-    actions = {
-      pageError: vi.fn(),
-      apiError: vi.fn(),
-      reload: vi.fn(),
-      messageAdd: vi.fn(),
-      dateUpdate: vi.fn(),
-    }
-
-    mutations = {
-      loadingAdd: vi.fn(),
-      loadingRemove: vi.fn(),
-      apiError: vi.fn(),
-      popupLoad: vi.fn(),
-      popupMessagesRemove: vi.fn(),
-      popupClose: vi.fn(),
-      popupMessageAdd: vi.fn(),
-    }
-
-    store = createStore({
-      actions,
-      mutations,
-      modules: {
-        titreEtapeEdition,
-        titre: { namespaced: true, mutations: { open: vi.fn() } },
-      },
-    })
-
-    const app = createApp({})
-    app.use(store)
-  })
-
-  test("retourne une erreur si l'api ne répond pas", async () => {
-    const apiMock = api.titreEtapeMetas.mockRejectedValue(new Error("erreur de l'api"))
-
-    await store.dispatch('titreEtapeEdition/init', { etape: {} })
-
-    expect(apiMock).toHaveBeenCalled()
-    expect(mutations.loadingRemove).toHaveBeenCalled()
-    expect(actions.pageError).toHaveBeenCalled()
-  })
-
-  test("récupère l'héritage d'une étape", async () => {
-    store.state.titreEtapeEdition.element = {
-      id: 'etape-id',
-      typeId: 'etape-type-id',
-      date: '2020-01-02',
-      titreDemarcheId: 'demarche-id',
-    }
-
-    store.state.titreEtapeEdition.metas.demarche = { id: 'demarche-id' }
-
-    const apiMock1 = api.etapeHeritage.mockResolvedValue(titreEtapeHeritageRes1)
-    await store.dispatch('titreEtapeEdition/heritageGet', {
-      typeId: 'etape-type-id',
-    })
-
-    expect(apiMock1).toHaveBeenCalled()
-    expect(store.state.titreEtapeEdition.element).toEqual(titreEtapeHeritage1)
-
-    const apiMock2 = api.etapeHeritage.mockResolvedValue(titreEtapeHeritageRes1)
-    await store.dispatch('titreEtapeEdition/heritageGet', {
-      typeId: 'etape-type-id',
-    })
-
-    expect(apiMock2).toHaveBeenCalled()
-    expect(store.state.titreEtapeEdition.element).toEqual(titreEtapeHeritage1)
-
-    store.state.titreEtapeEdition.element = {
-      date: '2020-01-01',
-      typeId: 'mfr',
-      titreDemarcheId: 'demarche-id',
-      heritageProps: {},
-    }
-
-    const apiMock3 = api.etapeHeritage.mockResolvedValue({
-      typeId: 'mcp',
-    })
-    await store.dispatch('titreEtapeEdition/heritageGet', {
-      typeId: 'etape-type-id',
-      titreDemarcheId: 'demarche-id',
-      date: '2020-01-02',
-    })
-
-    expect(apiMock3).toHaveBeenCalled()
-    expect(store.state.titreEtapeEdition.element).toEqual({
-      date: '2020-01-01',
-      statutId: '',
-      titreDemarcheId: 'demarche-id',
-      typeId: 'mcp',
-    })
-
-    const apiMock4 = api.etapeHeritage.mockResolvedValue(titreEtapeHeritageRes2)
-    await store.dispatch('titreEtapeEdition/heritageGet', {
-      typeId: 'mfr',
-      titreDemarcheId: 'demarche-id',
-      date: '2020-01-02',
-    })
-
-    expect(apiMock4).toHaveBeenCalled()
-    expect(store.state.titreEtapeEdition.element).toEqual(titreEtapeHeritage2)
-  })
-
-  test("retourne une erreur si l'API retourne une erreur lors de la récupération de l'héritage", async () => {
-    api.etapeHeritage.mockRejectedValue(new Error('erreur api'))
-    await store.dispatch('titreEtapeEdition/heritageGet', {
-      typeId: 'etape-type-id',
-      titreDemarcheId: 'demarche-id',
-      date: '2020-01-02',
-    })
-
-    expect(actions.apiError).toHaveBeenCalled()
-  })
-
-  test('créé une étape', async () => {
-    store.state.titreEtapeEdition.metas.demarche = { id: 'demarche-id' }
-    api.etapeCreer.mockResolvedValue({ id: 14, nom: 'champs', type: {} })
-    await store.dispatch('titreEtapeEdition/upsert', {
-      etape: {
-        nom: 'champs',
-        type: {},
-      },
-    })
-
-    store.commit('titreEtapeEdition/reset')
-
-    expect(store.state.titreEtapeEdition.element).toBeNull()
-  })
-
-  test("retourne une erreur si l'API retourne une erreur lors de la création d'une étape", async () => {
-    api.etapeCreer.mockRejectedValue(new Error('erreur api'))
-    await store.dispatch('titreEtapeEdition/upsert', {
-      nom: 'champs',
-    })
-
-    expect(actions.apiError).toHaveBeenCalled()
-  })
-
-  test('met à jour une étape', async () => {
-    store.state.titreEtapeEdition.metas.demarche = { id: 'demarche-id' }
-    api.etapeModifier.mockResolvedValue({ id: 14, nom: 'champs', type: {} })
-    await store.dispatch('titreEtapeEdition/upsert', {
-      etape: {
-        id: 14,
-        nom: 'champs',
-        type: {},
-      },
-    })
-  })
-
-  test("retourne une erreur si l'API retourne une erreur lors de la mise à jour d'une étape", async () => {
-    api.etapeModifier.mockRejectedValue(new Error("erreur de l'api"))
-    await store.dispatch('titreEtapeEdition/upsert', {
-      etape: {
-        id: 14,
-        nom: 'champs',
-      },
-    })
-
-    expect(actions.apiError).toHaveBeenCalled()
-  })
-
-  test('ajoute un nouveau document', async () => {
-    store.state.titreEtapeEdition.element = {
-      documents: [],
-      typeId: ETAPES_TYPES.decisionDeLadministration,
-    }
-
-    store.state.titreEtapeEdition.metas = {
-      demarche: {
-        typeId: DEMARCHES_TYPES_IDS.MutationPartielle,
-        titre: {
-          typeId: TITRES_TYPES_IDS.PERMIS_EXCLUSIF_DE_RECHERCHES_GEOTHERMIE,
-        },
-      },
-    }
-    await store.dispatch('titreEtapeEdition/documentAdd', {
-      document: { id: 'document-id', typeId: DOCUMENTS_TYPES_IDS.arrete },
-    })
-
-    expect(store.state.titreEtapeEdition.element.documents).toHaveLength(1)
-  })
-
-  test('remplace un document existant par un nouveau', async () => {
-    store.state.titreEtapeEdition.element = {
-      documents: [{ id: 'document-id1', typeId: DOCUMENTS_TYPES_IDS.arrete }],
-      typeId: ETAPES_TYPES.decisionDeLadministration,
-    }
-
-    store.state.titreEtapeEdition.metas = {
-      demarche: {
-        typeId: DEMARCHES_TYPES_IDS.MutationPartielle,
-        titre: {
-          typeId: TITRES_TYPES_IDS.PERMIS_EXCLUSIF_DE_RECHERCHES_GEOTHERMIE,
-        },
-      },
-    }
-    await store.dispatch('titreEtapeEdition/documentAdd', {
-      document: { id: 'document-id2', typeId: DOCUMENTS_TYPES_IDS.arrete },
-      idOld: 'document-id1',
-    })
-
-    expect(store.state.titreEtapeEdition.element.documents).toHaveLength(1)
-    expect(store.state.titreEtapeEdition.element.documents[0].id).toEqual('document-id2')
-  })
-
-  test('supprime un document', async () => {
-    store.state.titreEtapeEdition.element = {
-      documents: [
-        { id: 'document-id1', typeId: DOCUMENTS_TYPES_IDS.arrete },
-        { id: 'document-id2', typeId: DOCUMENTS_TYPES_IDS.arrete },
-      ],
-      typeId: ETAPES_TYPES.decisionDeLadministration,
-    }
-
-    store.state.titreEtapeEdition.metas = {
-      demarche: {
-        typeId: DEMARCHES_TYPES_IDS.MutationPartielle,
-        titre: {
-          typeId: TITRES_TYPES_IDS.PERMIS_EXCLUSIF_DE_RECHERCHES_GEOTHERMIE,
-        },
-      },
-    }
-    await store.dispatch('titreEtapeEdition/documentRemove', {
-      id: 'document-id2',
-    })
-
-    expect(store.state.titreEtapeEdition.element.documents).toHaveLength(1)
-    expect(store.state.titreEtapeEdition.element.documents[0].id).toEqual('document-id1')
-  })
-})
diff --git a/packages/ui/src/store/titre-etape.js b/packages/ui/src/store/titre-etape.js
deleted file mode 100644
index 7465e1f271968abd644c8c1df39cfc753b8017ea..0000000000000000000000000000000000000000
--- a/packages/ui/src/store/titre-etape.js
+++ /dev/null
@@ -1,39 +0,0 @@
-import { etapeDeposer } from '../api/titres-etapes'
-
-const stateInitial = {
-  element: null,
-}
-
-const state = JSON.parse(JSON.stringify(stateInitial))
-
-const actions = {
-  async depose({ commit, dispatch }, etapeId) {
-    try {
-      commit('popupMessagesRemove', null, { root: true })
-      commit('popupLoad', null, { root: true })
-      commit('loadingAdd', 'titreEtapeDepose', { root: true })
-
-      await etapeDeposer({ id: etapeId })
-
-      commit('popupClose', null, { root: true })
-      dispatch('messageAdd', { value: `la demande a été déposée`, type: 'success' }, { root: true })
-    } catch (e) {
-      commit('popupMessageAdd', { value: e, type: 'error' }, { root: true })
-    } finally {
-      commit('loadingRemove', 'titreEtapeDepose', { root: true })
-    }
-  },
-}
-
-const mutations = {
-  set(state, { etape }) {
-    state.element = etape
-  },
-}
-
-export default {
-  namespaced: true,
-  state,
-  actions,
-  mutations,
-}
diff --git a/packages/ui/src/store/titre-etape.test.js b/packages/ui/src/store/titre-etape.test.js
deleted file mode 100644
index 4f23f34ec16a1050f155990794bd2cb47cabaf1d..0000000000000000000000000000000000000000
--- a/packages/ui/src/store/titre-etape.test.js
+++ /dev/null
@@ -1,70 +0,0 @@
-import titreEtape from './titre-etape'
-import * as api from '../api/titres-etapes'
-import { createApp } from 'vue'
-import { createStore } from 'vuex'
-import { vi, describe, expect, beforeEach, test } from 'vitest'
-
-vi.mock('../api/titres-etapes', () => ({
-  etape: vi.fn(),
-  etapeDeposer: vi.fn(),
-}))
-
-console.info = vi.fn()
-
-describe('étapes', () => {
-  let store
-  let actions
-  let mutations
-
-  beforeEach(() => {
-    titreEtape.state = {
-      element: null,
-    }
-
-    actions = {
-      pageError: vi.fn(),
-      apiError: vi.fn(),
-      reload: vi.fn(),
-      messageAdd: vi.fn(),
-    }
-
-    mutations = {
-      loadingAdd: vi.fn(),
-      loadingRemove: vi.fn(),
-      apiError: vi.fn(),
-      popupLoad: vi.fn(),
-      fileLoad: vi.fn(),
-      popupMessagesRemove: vi.fn(),
-      popupClose: vi.fn(),
-      popupMessageAdd: vi.fn(),
-    }
-
-    store = createStore({
-      actions,
-      mutations,
-      modules: {
-        titreEtape,
-        titre: { namespaced: true, mutations: { open: vi.fn() } },
-      },
-    })
-
-    const app = createApp({})
-    app.use(store)
-  })
-
-  test('dépose une étape', async () => {
-    const apiMock = api.etapeDeposer.mockResolvedValue(14)
-    await store.dispatch('titreEtape/depose', 14)
-
-    expect(apiMock).toHaveBeenCalledWith({ id: 14 })
-    expect(mutations.popupClose).toHaveBeenCalled()
-  })
-
-  test("retourne une erreur si l'API retourne une erreur lors du dépot d'une étape", async () => {
-    const apiMock = api.etapeDeposer.mockRejectedValue(new Error("erreur de l'api"))
-    await store.dispatch('titreEtape/depose', 14)
-
-    expect(apiMock).toHaveBeenCalledWith({ id: 14 })
-    expect(mutations.popupMessageAdd).toHaveBeenCalled()
-  })
-})
diff --git a/packages/ui/src/typings/maplibre-gl.d.ts b/packages/ui/src/typings/maplibre-gl.d.ts
index 5fa4f848d5830a3a7141fcd56dda5d3264be0e1e..b95990bafe9ce45090e8785dca0165a069950215 100644
--- a/packages/ui/src/typings/maplibre-gl.d.ts
+++ b/packages/ui/src/typings/maplibre-gl.d.ts
@@ -1,9 +1,14 @@
 import * as maplibre from 'maplibre-gl'
+import { DeepReadonly } from 'vue'
 
 export class CaminoMapLibre extends maplibre.Map {
-  getSource(id: string): maplibre.GeoJSONSource
+  getSource(id: string): CaminoGeoJSONSource
 }
 
-declare module 'maplibre' {
-  export declare class CaminoMapLibre extends maplibre.Map {}
+export class CaminoLngLatBounds extends maplibre.LngLatBounds {
+  extend(obj: DeepReadonly<maplibre.LngLatLike | maplibre.LngLatBoundsLike>): this
+}
+
+export class CaminoGeoJSONSource extends maplibre.GeoJSONSource {
+  setData(data: string | DeepReadonly<maplibre.GeoJSON>): this
 }
diff --git a/packages/ui/src/typings/vuex.d.ts b/packages/ui/src/typings/vuex.d.ts
index c329851136d6bc175193ac040c4a2afbc59e241a..32c7f3cc159e8a3a3ded2e4f4707115faa5e6b7a 100644
--- a/packages/ui/src/typings/vuex.d.ts
+++ b/packages/ui/src/typings/vuex.d.ts
@@ -1,3 +1,4 @@
+import { DeepMutable, NonEmptyArray } from 'camino-common/src/typescript-tools'
 import { Store } from 'vuex'
 
 /* eslint-disable no-unused-vars */
@@ -20,4 +21,6 @@ declare global {
   interface Array<T> {
     includes<U>(_x: U & (T & U extends never ? never : unknown)): boolean
   }
+
+  declare function structuredClone<T>(value: T, transfer?: { transfer: ReadonlyArray<import('worker_threads').TransferListItem> }): DeepMutable<T>
 }
diff --git a/packages/ui/src/utils/contenu.js b/packages/ui/src/utils/contenu.js
deleted file mode 100644
index b485ec3aa73a021582a92ece237c6d29bbc14d88..0000000000000000000000000000000000000000
--- a/packages/ui/src/utils/contenu.js
+++ /dev/null
@@ -1,95 +0,0 @@
-import { dateFormat } from './index'
-import { numberFormat } from 'camino-common/src/number'
-import { getElementValeurs } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sections'
-
-const contenuBuild = (sections, elementContenu) =>
-  sections.reduce((contenu, section) => {
-    if (section) {
-      contenu[section.id] = (elementContenu && elementContenu[section.id]) || {}
-    }
-
-    return contenu
-  }, {})
-
-const elementContenuBuild = (sections, contenu) =>
-  sections.reduce((elementContenu, section) => {
-    if (Object.keys(contenu[section.id]).length) {
-      if (!elementContenu) {
-        elementContenu = {}
-      }
-      elementContenu[section.id] = contenu[section.id]
-    }
-
-    return elementContenu
-  }, null)
-
-const elementsCompleteCheck = (elements, sectionContenu, complete) =>
-  elements.reduce((sectionComplete, e) => {
-    if (!sectionComplete || !sectionContenu || e.optionnel || ['radio', 'checkbox'].includes(e.type)) return sectionComplete
-
-    let elementComplete = false
-
-    if (e.type === 'checkboxes') {
-      if (sectionContenu[e.id].length) {
-        elementComplete = true
-      }
-    } else {
-      elementComplete = sectionContenu[e.id] !== undefined && sectionContenu[e.id] !== null && sectionContenu[e.id] !== ''
-    }
-
-    return elementComplete
-  }, complete)
-
-const contenuCompleteCheck = (sections, contenu) =>
-  sections.reduce((complete, s) => {
-    if (!complete) return false
-
-    return elementsCompleteCheck(s.elements, contenu[s.id], complete)
-  }, true)
-
-/**
- * @deprecated voir la nouvelle méthode dans common/src/titres.ts
- */
-const valeurFind = (value, contenu) => {
-  const { id, type, options } = value
-  if (contenu[id] === undefined || contenu[id] === '') {
-    return '–'
-  }
-
-  if (['number', 'integer'].includes(type)) {
-    return numberFormat(contenu[id])
-  }
-
-  if (type === 'checkboxes') {
-    return contenu[id]
-      .map(id => {
-        const valeur = options.find(e => e.id === id)
-        return valeur ? valeur.nom : undefined
-      })
-      .filter(valeur => !!valeur)
-      .join(', ')
-  }
-
-  if (type === 'select') {
-    return getElementValeurs(value).find(v => v.id === contenu[id])?.nom ?? ''
-  }
-
-  if (type === 'date') {
-    return dateFormat(contenu[id])
-  }
-
-  if (contenu[id] === true) return 'Oui'
-  else if (contenu[id] === false) return 'Non'
-
-  return contenu[id]
-}
-
-const hasValeurCheck = (elementId, contenu) => {
-  const valeur = contenu && contenu[elementId]
-
-  if ((!Array.isArray(valeur) && (valeur || valeur === 0 || valeur === false)) || (Array.isArray(valeur) && valeur.length)) return true
-
-  return false
-}
-
-export { contenuBuild, elementContenuBuild, contenuCompleteCheck, elementsCompleteCheck, valeurFind, hasValeurCheck }
diff --git a/packages/ui/src/utils/documents.js b/packages/ui/src/utils/documents.js
deleted file mode 100644
index 7e3bc815794b35bb53344436d71b84be93058b90..0000000000000000000000000000000000000000
--- a/packages/ui/src/utils/documents.js
+++ /dev/null
@@ -1,38 +0,0 @@
-import { getCurrent } from 'camino-common/src/date'
-
-export const documentsRequiredAdd = (documents, documentsTypes) => {
-  // supprime tous les documents temporaires
-  documents = documents?.filter(d => d.id !== d.typeId)
-
-  // supprime les documents dont le documentType n'existe pas
-  const newDocuments =
-    documents?.filter(d => {
-      const documentsTypesIds = documentsTypes.map(({ id }) => id)
-      return documentsTypesIds.includes(d.typeId)
-    }) || []
-
-  // crée les documents dont le type est obligatoires si ils n'existent pas
-  documentsTypes?.forEach(documentType => {
-    if (!documentType.optionnel && !newDocuments.find(d => d.typeId === documentType.id)) {
-      newDocuments.push({
-        id: documentType.id,
-        typeId: documentType.id,
-        // TODO 2024-02-29 avant on mettait ça a true si l'utilisateur était un admin, pourquoi ?
-        entreprisesLecture: false,
-        publicLecture: false,
-        fichier: null,
-        fichierNouveau: null,
-        fichierTypeId: null,
-        date: getCurrent(),
-        suppression: false,
-      })
-    }
-  })
-
-  // on interdit la suppression des documents obligatoires et imcomplets
-  documents?.forEach(d => {
-    d.suppression = d.suppression && d.id !== d.typeId
-  })
-
-  return newDocuments
-}
diff --git a/packages/ui/src/utils/documents.test.js b/packages/ui/src/utils/documents.test.js
deleted file mode 100644
index d2bf3e620f2a980f80ecaff5aa2503111aa1501e..0000000000000000000000000000000000000000
--- a/packages/ui/src/utils/documents.test.js
+++ /dev/null
@@ -1,34 +0,0 @@
-import { documentsRequiredAdd } from './documents'
-import { getCurrent } from 'camino-common/src/date'
-import { describe, expect, test } from 'vitest'
-
-describe('documents', () => {
-  test('retourne un tableau vide si il n’y a aucun doc à ajouter', () => {
-    expect(documentsRequiredAdd(undefined, undefined)).toEqual([])
-  })
-
-  test('ajoute un document obligatoire manquant', () => {
-    expect(documentsRequiredAdd(undefined, [{ optionnel: false, id: 'aaa' }])).toEqual([
-      {
-        date: getCurrent(),
-        entreprisesLecture: false,
-        fichier: null,
-        fichierNouveau: null,
-        fichierTypeId: null,
-        id: 'aaa',
-        publicLecture: false,
-        suppression: false,
-        typeId: 'aaa',
-      },
-    ])
-  })
-
-  test('supprime le document avec un type inexistant', () => {
-    expect(documentsRequiredAdd([{ typeId: 'aaa', suppression: false }, { typeId: 'ddd' }], [{ optionnel: false, id: 'aaa' }])).toEqual([
-      {
-        typeId: 'aaa',
-        suppression: false,
-      },
-    ])
-  })
-})
diff --git a/packages/ui/src/utils/index.js b/packages/ui/src/utils/index.js
index d5d831ba275c41a09ea021c2c9c04f2ae5c5c484..a95c1b5f0998e8ef00863e338636df4692ae0bf6 100644
--- a/packages/ui/src/utils/index.js
+++ b/packages/ui/src/utils/index.js
@@ -33,28 +33,4 @@ const typenameOmit = (key, value) => (key === '__typename' ? undefined : value)
 
 const cloneAndClean = json => JSON.parse(JSON.stringify(json), typenameOmit)
 
-// récupère les paramètres depuis les préférences utilisateurs
-const paramsBuild = (apiParams, preferences) =>
-  apiParams.reduce((params, { id, type }) => {
-    let v = preferences[id]
-
-    if (type === 'strings' || type === 'objects') {
-      v = v && v.length ? v : null
-    } else if (type === 'number') {
-      v = v ? Number(v) : null
-    } else if (type === 'numbers') {
-      v = v && v.length ? v.map(Number) : null
-    } else {
-      v = v ? v.toString() : null
-    }
-
-    if (v) {
-      params[id] = v
-    }
-
-    return params
-  }, {})
-
-const cap = string => string[0].toUpperCase() + string.slice(1)
-
-export { dateFormat, textNumberFormat, textToNumberFormat, cloneAndClean, paramsBuild, cap }
+export { dateFormat, textNumberFormat, textToNumberFormat, cloneAndClean }
diff --git a/packages/ui/src/utils/index.test.js b/packages/ui/src/utils/index.test.js
index c50f2eb0962e5cbf30ed2c354af0a2a61f20c8ce..b7cc0e7d47c63ad67132089b1cbe8734b1bb50fe 100644
--- a/packages/ui/src/utils/index.test.js
+++ b/packages/ui/src/utils/index.test.js
@@ -1,4 +1,4 @@
-import { dateFormat, textNumberFormat, textToNumberFormat, cloneAndClean, paramsBuild } from './index'
+import { dateFormat, textNumberFormat, textToNumberFormat, cloneAndClean } from './index'
 import { describe, expect, test } from 'vitest'
 
 // dateFormat
@@ -48,37 +48,3 @@ describe('cloneAndClean', () => {
   test(`transforme un json en occultant les propriétés __typename`, () =>
     expect(cloneAndClean({ id: 'id', value: 'value', __typename: 'typename' })).toEqual({ id: 'id', value: 'value', __typename: undefined }))
 })
-
-describe('paramsBuild', () => {
-  const params = [
-    { id: 'page', type: 'number', min: 0 },
-    { id: 'intervalle', type: 'number', min: 10, max: 500 },
-    { id: 'colonne', type: 'string', elements: ['nom', 'type', 'abreviation'] },
-    { id: 'ordre', type: 'string', elements: ['asc', 'desc'] },
-    { id: 'typesIds', type: 'strings', elements: ['aaa', 'bbb'] },
-    { id: 'noms', type: 'string' },
-    { id: 'numbers', type: 'numbers' },
-  ]
-
-  const preferences = {
-    page: 1,
-    intervalle: 200,
-    ordre: 'asc',
-    colonne: 'type',
-    noms: 'one two',
-    typesIds: ['aaa'],
-    numbers: ['1', '2'],
-  }
-
-  test('formate les paramètres', () => {
-    expect(paramsBuild(params, preferences)).toEqual({
-      intervalle: 200,
-      ordre: 'asc',
-      page: 1,
-      colonne: 'type',
-      noms: 'one two',
-      typesIds: ['aaa'],
-      numbers: [1, 2],
-    })
-  })
-})
diff --git a/packages/ui/src/utils/titre-etape-edit.test.ts b/packages/ui/src/utils/titre-etape-edit.test.ts
deleted file mode 100644
index 92a97d245a07e986911654cc3a135ccc15d8338a..0000000000000000000000000000000000000000
--- a/packages/ui/src/utils/titre-etape-edit.test.ts
+++ /dev/null
@@ -1,65 +0,0 @@
-import { etapeEditFormat } from './titre-etape-edit'
-import { describe, expect, test } from 'vitest'
-import { newEntrepriseId } from 'camino-common/src/entreprise'
-import { etapeIdValidator } from 'camino-common/src/etape'
-
-// dateFormat
-describe('etapeEditFormat', () => {
-  test("formate une étape pour l'éditer", () => {
-    expect(
-      // @ts-ignore
-      etapeEditFormat({
-        id: etapeIdValidator.parse('etape-id'),
-      })
-    ).toEqual({
-      id: 'etape-id',
-      amodiataires: [],
-      titulaires: [],
-
-      substances: [],
-      contenu: {},
-      documents: [],
-    })
-
-    expect(
-      // @ts-ignore
-      etapeEditFormat({
-        id: etapeIdValidator.parse('etape-id'),
-        justificatifs: [{ id: 'toto', nom: 'name' }],
-      })
-    ).toEqual({
-      id: 'etape-id',
-      amodiataires: [],
-      titulaires: [],
-      substances: [],
-      contenu: {},
-      documents: [],
-      justificatifs: [{ id: 'toto', nom: 'name' }],
-    })
-
-    expect(
-      etapeEditFormat({
-        id: etapeIdValidator.parse('etape-id'),
-        typeId: 'aac',
-        // @ts-ignore
-        statutId: 'etape-statut-id',
-        duree: 240,
-        administrations: ['aut-97300-01'],
-        titulaires: [{ id: newEntrepriseId('titulaire-id'), operateur: false }],
-        contenu: { 'prop-id': 'prop-value' },
-        substances: ['auru'],
-        documents: [{ typeId: 'aac' }],
-      })
-    ).toEqual({
-      id: 'etape-id',
-      typeId: 'aac',
-      statutId: 'etape-statut-id',
-      duree: 240,
-      amodiataires: [],
-      titulaires: [{ id: 'titulaire-id', operateur: false }],
-      substances: ['auru'],
-      contenu: { 'prop-id': 'prop-value' },
-      documents: [{ fichierNouveau: null, typeId: 'aac' }],
-    })
-  })
-})
diff --git a/packages/ui/src/utils/titre-etape-edit.ts b/packages/ui/src/utils/titre-etape-edit.ts
deleted file mode 100644
index 22b94fa7877c6ac0d68469b9cfe203c7e67b1615..0000000000000000000000000000000000000000
--- a/packages/ui/src/utils/titre-etape-edit.ts
+++ /dev/null
@@ -1,48 +0,0 @@
-import { cloneAndClean } from './index'
-import { CaminoDocument, Etape } from 'camino-common/src/etape'
-
-type CaminoDocumentEdit = CaminoDocument & {
-  fichierNouveau: null
-}
-
-type EtapeEdit = Omit<Etape, 'administrations' | 'documents'> & { documents: CaminoDocument[] }
-export const etapeEditFormat = (etape: Etape): EtapeEdit => {
-  const newEtape: Etape = cloneAndClean(etape)
-
-  delete newEtape.administrations
-  const entreprisesPropIds = ['titulaires', 'amodiataires'] as const
-
-  entreprisesPropIds.forEach(propId => {
-    if (newEtape[propId]) {
-      newEtape[propId] = newEtape[propId].map(({ id, operateur }) => ({
-        id,
-        operateur,
-      }))
-    } else {
-      newEtape[propId] = []
-    }
-  })
-
-  if (!newEtape.substances) {
-    newEtape.substances = []
-  }
-
-  const newEtapePointEnhanced: EtapeEdit = newEtape as unknown as EtapeEdit
-
-  if (!newEtapePointEnhanced.contenu) {
-    newEtapePointEnhanced.contenu = {}
-  }
-
-  if (!newEtapePointEnhanced.documents) {
-    newEtapePointEnhanced.documents = []
-  } else {
-    newEtapePointEnhanced.documents = newEtapePointEnhanced.documents.map(documentEtapeFormat)
-  }
-
-  // @ts-ignore
-  return newEtapePointEnhanced
-}
-
-export const documentEtapeFormat = (document: CaminoDocument): CaminoDocumentEdit => {
-  return { ...document, fichierNouveau: null }
-}
diff --git a/packages/ui/src/utils/titre-etape-heritage-build.js b/packages/ui/src/utils/titre-etape-heritage-build.js
deleted file mode 100644
index 3995bf67ae7768a069646254bac536636f540f55..0000000000000000000000000000000000000000
--- a/packages/ui/src/utils/titre-etape-heritage-build.js
+++ /dev/null
@@ -1,93 +0,0 @@
-import { getDocuments } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/documents'
-import { getEntrepriseDocuments } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/entrepriseDocuments'
-
-export const etapeHeritageBuild = (stateEtape, apiEtape, titreTypeId, demarcheTypeId, etapeTypeId) => {
-  const newEtape = {
-    id: stateEtape.id,
-    date: stateEtape.date,
-    typeId: apiEtape.typeId,
-    statutId: '',
-    titreDemarcheId: stateEtape.titreDemarcheId,
-  }
-
-  if (stateEtape.documents) {
-    const documentsTypesIds = getDocuments(titreTypeId, demarcheTypeId, apiEtape.typeId)?.map(({ id }) => id)
-    newEtape.documents = stateEtape.documents.filter(document => documentsTypesIds?.includes(document.typeId))
-  }
-
-  if (etapeTypeId) {
-    const justificatifs = getEntrepriseDocuments(titreTypeId, demarcheTypeId, etapeTypeId)
-    if (justificatifs.length > 0) {
-      const justificatifsTypesIds = justificatifs.map(({ id }) => id)
-      // TODO 2023-08-09 : Encore utilisé dans etape/edit.vue ?
-      newEtape.justificatifs = stateEtape.justificatifs?.filter(justificatif => justificatifsTypesIds?.includes(justificatif.typeId)) ?? []
-    }
-  }
-
-  // si
-  // - on crée une nouvelle étape fondamentale
-  // - on change le type d'étape (non-fondamentale -> fondamentale)
-  // alors la nouvelle étape récupère les propriété de l'API
-  if (!stateEtape.heritageProps && apiEtape.heritageProps) {
-    newEtape.heritageProps = apiEtape.heritageProps
-    newEtape.duree = apiEtape.duree
-    newEtape.dateDebut = apiEtape.dateDebut
-    newEtape.dateFin = apiEtape.dateFin
-    newEtape.surface = apiEtape.surface
-    newEtape.titulaires = apiEtape.titulaires
-    newEtape.amodiataires = apiEtape.amodiataires
-    newEtape.substances = apiEtape.substances
-  }
-  // si on change le type d'étape (fondamentale -> fondamentale)
-  // alors on garde les propriétés actuelles
-  else if (stateEtape.heritageProps && apiEtape.heritageProps) {
-    newEtape.heritageProps = stateEtape.heritageProps
-    newEtape.duree = stateEtape.duree
-    newEtape.dateDebut = stateEtape.dateDebut
-    newEtape.dateFin = stateEtape.dateFin
-    newEtape.surface = stateEtape.surface
-    newEtape.titulaires = stateEtape.titulaires
-    newEtape.amodiataires = stateEtape.amodiataires
-    newEtape.substances = stateEtape.substances
-  }
-
-  if (apiEtape.heritageContenu && Object.keys(apiEtape.heritageContenu).length) {
-    Object.keys(apiEtape.heritageContenu).forEach(sectionId => {
-      if (Object.keys(apiEtape.heritageContenu[sectionId]).length) {
-        Object.keys(apiEtape.heritageContenu[sectionId]).forEach(elementId => {
-          if (!newEtape.contenu) {
-            newEtape.contenu = {}
-          }
-
-          if (!newEtape.contenu[sectionId]) {
-            newEtape.contenu[sectionId] = {}
-          }
-
-          if (!newEtape.heritageContenu) {
-            newEtape.heritageContenu = {}
-          }
-
-          if (!newEtape.heritageContenu[sectionId]) {
-            newEtape.heritageContenu[sectionId] = {}
-          }
-
-          if (stateEtape.heritageContenu && stateEtape.heritageContenu[sectionId] && stateEtape.heritageContenu[sectionId][elementId]) {
-            if (stateEtape.contenu && stateEtape.contenu[sectionId] && stateEtape.contenu[sectionId][elementId]) {
-              newEtape.contenu[sectionId][elementId] = stateEtape.contenu[sectionId][elementId]
-            }
-
-            newEtape.heritageContenu[sectionId][elementId] = stateEtape.heritageContenu[sectionId][elementId]
-          } else {
-            if (apiEtape.contenu[sectionId]) {
-              newEtape.contenu[sectionId][elementId] = apiEtape.contenu[sectionId][elementId]
-            }
-
-            newEtape.heritageContenu[sectionId][elementId] = apiEtape.heritageContenu[sectionId][elementId]
-          }
-        })
-      }
-    })
-  }
-
-  return newEtape
-}
diff --git a/packages/ui/src/utils/titre-etape-save.js b/packages/ui/src/utils/titre-etape-save.js
deleted file mode 100644
index 3291324ce033d1f7b97a75ff4be656d488f40fa7..0000000000000000000000000000000000000000
--- a/packages/ui/src/utils/titre-etape-save.js
+++ /dev/null
@@ -1,61 +0,0 @@
-export const etapeSaveFormat = etape => {
-  const decisionsAnnexesContenu = etape.decisionsAnnexesContenu
-  etape = JSON.parse(JSON.stringify(etape))
-  etape.decisionsAnnexesContenu = decisionsAnnexesContenu
-
-  etape.documentIds = etape.documents?.filter(d => d.id !== d.typeId).map(({ id }) => id)
-
-  delete etape.slug
-  delete etape.justificatifs
-  delete etape.documents
-
-  if (!etape.contenu || !Object.keys(etape.contenu).length) {
-    delete etape.contenu
-  }
-
-  if (!etape.decisionsAnnexesContenu || !Object.keys(etape.decisionsAnnexesContenu).length) {
-    delete etape.decisionsAnnexesContenu
-  }
-
-  delete etape.decisionsAnnexesSections
-
-  const props = ['date', 'dateDebut', 'dateFin', 'duree']
-
-  props.forEach(prop => {
-    if (etape[prop] === '') {
-      etape[prop] = null
-    }
-  })
-
-  delete etape.demarche
-  delete etape.surface
-  delete etape.geojson4326Forages
-
-  etape.substances = etape.substances?.filter(substanceId => !!substanceId)
-
-  const propsIds = ['titulaires', 'amodiataires', 'administrations']
-
-  // supprime les champs dont les ids sont vides
-  propsIds.forEach(propId => {
-    if (etape[propId]) {
-      etape[propId] = etape[propId].filter(({ id }) => id)
-    }
-  })
-
-  if (etape.heritageProps) {
-    Object.keys(etape.heritageProps).forEach(id => {
-      delete etape.heritageProps[id].etape
-    })
-  }
-
-  if (etape.heritageContenu) {
-    Object.keys(etape.heritageContenu).forEach(sectionId => {
-      Object.keys(etape.heritageContenu[sectionId]).forEach(elementId => {
-        delete etape.heritageContenu[sectionId][elementId].etape
-        delete etape.heritageContenu[sectionId][elementId].etapeId
-      })
-    })
-  }
-
-  return etape
-}
diff --git a/packages/ui/src/utils/titre-etape-save.test.js b/packages/ui/src/utils/titre-etape-save.test.js
deleted file mode 100644
index 19c876e802501985e44151fe7927e5495ffc711c..0000000000000000000000000000000000000000
--- a/packages/ui/src/utils/titre-etape-save.test.js
+++ /dev/null
@@ -1,90 +0,0 @@
-import { etapeSaveFormat } from './titre-etape-save'
-import { describe, expect, test } from 'vitest'
-
-// dateFormat
-describe('etapeSaveFormat', () => {
-  test("formate une étape pour l'enregistrer", () => {
-    expect(
-      etapeSaveFormat({
-        id: 'etape-id',
-        titreDemarcheId: 'demarche-id',
-        typeId: 'mfr',
-        statutId: '',
-        dateFin: '',
-        duree: null,
-        amodiataires: [],
-        titulaires: [],
-        substances: [],
-        contenu: {},
-      })
-    ).toEqual({
-      amodiataires: [],
-      duree: null,
-      dateFin: null,
-      id: 'etape-id',
-      statutId: '',
-      substances: [],
-      titreDemarcheId: 'demarche-id',
-      titulaires: [],
-      typeId: 'mfr',
-    })
-
-    expect(
-      etapeSaveFormat({
-        id: 'etape-id',
-        typeId: 'mfr',
-        titreDemarcheId: 'demarche-id',
-        statutId: '',
-        duree: 10,
-        amodiataires: [],
-        titulaires: [],
-        substances: [],
-        contenu: {},
-        heritageProps: { 'prop-id': { etape: {}, actif: true } },
-        heritageContenu: {
-          'section-id': { 'element-id': { etape: {}, actif: true } },
-        },
-      })
-    ).toEqual({
-      amodiataires: [],
-      duree: 10,
-      id: 'etape-id',
-      statutId: '',
-      substances: [],
-      titreDemarcheId: 'demarche-id',
-      titulaires: [],
-      heritageProps: { 'prop-id': { actif: true } },
-      heritageContenu: {
-        'section-id': { 'element-id': { actif: true } },
-      },
-      typeId: 'mfr',
-    })
-
-    expect(
-      etapeSaveFormat({
-        id: 'etape-id',
-        titreDemarcheId: 'demarche-id',
-        typeId: 'mfr',
-        statutId: 'etape-statut-id',
-        duree: 240,
-        amodiataires: [],
-        titulaires: [{ id: 'titulaire-id' }, { id: '' }],
-
-        substances: ['substance-id-1', undefined],
-        contenu: { 'prop-id': 'prop-value' },
-        documents: [{ id: 'tmp', typeId: 'tmp' }, { id: 'doc-id' }],
-      })
-    ).toEqual({
-      amodiataires: [],
-      contenu: { 'prop-id': 'prop-value' },
-      duree: 240,
-      id: 'etape-id',
-      statutId: 'etape-statut-id',
-      substances: ['substance-id-1'],
-      titreDemarcheId: 'demarche-id',
-      titulaires: [{ id: 'titulaire-id' }],
-      typeId: 'mfr',
-      documentIds: ['doc-id'],
-    })
-  })
-})
diff --git a/packages/ui/src/utils/url.js b/packages/ui/src/utils/url.js
deleted file mode 100644
index f4cc0974fb41122ba80a7fe0e9b274a1579c68b5..0000000000000000000000000000000000000000
--- a/packages/ui/src/utils/url.js
+++ /dev/null
@@ -1,177 +0,0 @@
-const valueClean = (value, definition) => {
-  if (definition.type === 'number') {
-    if (definition.max && value > definition.max) {
-      value = definition.max
-    } else if (definition.min && value < definition.min) {
-      value = definition.min
-    }
-
-    return value
-  }
-
-  if ((definition.type === 'strings' || definition.type === 'numbers') && definition.values) {
-    value = value
-      .reduce((acc, v) => {
-        if (definition.values.includes(v)) {
-          acc.push(v)
-        }
-
-        return acc
-      }, [])
-      .sort()
-
-    return value
-  }
-
-  if (definition.type === 'tuple') {
-    return !Number(value[0]) || !Number(value[1]) ? null : value.map(Number)
-  }
-
-  if (definition.type === 'string') {
-    return definition.values && !definition.values.includes(value) ? null : value
-  }
-
-  if (definition.type === 'objects') {
-    // TODO: retirer les valeurs incorrectes
-
-    return value.length ? value : null
-  }
-
-  return value
-}
-
-const valueParse = (id, value, definitions) => {
-  if (!value) return null
-
-  const definition = definitions.find(p => p.id === id)
-
-  if (!definition || !definition.type) {
-    return value
-  }
-
-  if (definition.type === 'number') {
-    value = Number(value)
-
-    return isNaN(value) ? null : value
-  }
-
-  if (definition.type === 'strings') {
-    if (typeof value !== 'string') return null
-
-    return value.split(',').sort()
-  }
-
-  if (definition.type === 'numbers') {
-    if (typeof value !== 'string') return null
-
-    return value
-      .split(',')
-      .map(v => Number(v))
-      .sort()
-  }
-
-  if (definition.type === 'string') {
-    return value
-  }
-
-  if (definition.type === 'tuple') {
-    if (typeof value !== 'string') return null
-
-    return value.split(',').slice(0, 2)
-  }
-
-  if (definition.type === 'objects') {
-    return JSON.parse(value)
-  }
-
-  return valueClean(value, definition)
-}
-
-const valueStringify = (id, value, definitions) => {
-  if (!value) return null
-
-  const definition = definitions.find(p => p.id === id)
-
-  if (definition.type === 'strings' || definition.type === 'tuple' || definition.type === 'numbers') {
-    return value.length ? value.join(',') : null
-  }
-
-  if (definition.type === 'number') {
-    return value.toString()
-  }
-
-  if (definition.type === 'objects') {
-    if (!value.length) return null
-
-    // entrée <=
-    // [{ b: 2, a: 2 }, { a: 2, b: 1 }, { a: 1, b: 2 }]
-    // sortie =>
-    // [{ a: 1, b: 2 }, { a: 2, b: 1 }, { a: 2, b: 2 }]
-
-    const values = value
-      .reduce((objects, object) => {
-        object = Object.keys(object)
-          .sort()
-          .reduce((o, k) => {
-            if (object[k] !== '') {
-              o[k] = object[k]
-            }
-
-            return o
-          }, {})
-
-        if (Object.keys(object).length) {
-          objects.push(JSON.stringify(object))
-        }
-
-        return objects
-      }, [])
-      .sort()
-
-    if (!values.length) return null
-
-    return `[${values.join(',')}]`
-  }
-
-  return value
-}
-
-const urlQueryParamsGet = (params, sourceQuery, definitions) =>
-  Object.keys(params).reduce((queryParams, id) => {
-    const queryString = sourceQuery[id] || null
-
-    if (queryString) {
-      const queryValue = valueParse(id, queryString, definitions)
-      const preferenceString = valueStringify(id, params[id], definitions)
-
-      if (queryString !== preferenceString) {
-        queryParams[id] = queryValue
-      }
-    }
-
-    return queryParams
-  }, {})
-
-const urlQueryUpdate = (params, sourceQuery, definitions) =>
-  Object.keys(params).reduce(
-    ({ query, status }, id) => {
-      const queryString = sourceQuery[id] || null
-      const preferenceString = valueStringify(id, params[id], definitions)
-
-      if (queryString !== preferenceString) {
-        status = queryString || status === 'updated' ? 'updated' : 'created'
-      }
-
-      if (preferenceString) {
-        query[id] = preferenceString
-      }
-
-      return { query, status }
-    },
-    {
-      query: {},
-      status: null,
-    }
-  )
-
-export { urlQueryParamsGet, urlQueryUpdate }
diff --git a/packages/ui/src/utils/url.test.js b/packages/ui/src/utils/url.test.js
deleted file mode 100644
index d8ec97f4e39e04e82644dcfcf8fbeee4db0d5f0c..0000000000000000000000000000000000000000
--- a/packages/ui/src/utils/url.test.js
+++ /dev/null
@@ -1,8 +0,0 @@
-import { urlQueryParamsGet } from './url.js'
-import { describe, expect, test } from 'vitest'
-
-describe('urlQueryParamsGet', () => {
-  test('récupère les paramètres de requête qui ont changé', () => {
-    expect(urlQueryParamsGet({ typesIds: ['cx', 'pr'] }, { typeIds: 'ar' }, [{ id: 'typeIds', type: 'strings', values: ['cx', 'pr', 'ar'] }])).toEqual({})
-  })
-})
diff --git a/packages/ui/src/utils/vue-tsx-utils.ts b/packages/ui/src/utils/vue-tsx-utils.ts
index 5dbf8de15008848b1f013ee26186a986b25320d2..2a47c6c466e67c03ad539bb610ba86c25724a33d 100644
--- a/packages/ui/src/utils/vue-tsx-utils.ts
+++ b/packages/ui/src/utils/vue-tsx-utils.ts
@@ -1,4 +1,4 @@
-import { DefineComponent, defineComponent, Ref, RenderFunction, SetupContext } from 'vue'
+import { DeepReadonly, DefineComponent, defineComponent, readonly, ref, Ref, RenderFunction, SetupContext } from 'vue'
 
 type PushFront<TailT extends any[], HeadT> = ((head: HeadT, ...tail: TailT) => void) extends (...arr: infer ArrT) => void ? ArrT : never
 
@@ -32,3 +32,12 @@ export const random = () => {
   const x = Math.sin(seed++) * 10000
   return x - Math.floor(x)
 }
+
+export function useState<T>(initialState: T): [Readonly<Ref<DeepReadonly<T>>>, (value: T) => void] {
+  const state = ref<T>(initialState) as Ref<T>
+  const setState = (newState: T) => {
+    state.value = newState
+  }
+
+  return [readonly(state), setState]
+}