diff --git a/models/hr_expense.py b/models/hr_expense.py
index ce70418194a9e8b851dc0b22a9573c4367345b01..a8db537bc0e5709aad2ac2e4532527f8c635e3af 100644
--- a/models/hr_expense.py
+++ b/models/hr_expense.py
@@ -2,6 +2,7 @@
 # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
 
 from odoo import api, models, fields
+from odoo.exceptions import UserError
 
 
 class AdefpatHrExpense(models.Model):
@@ -9,6 +10,21 @@ class AdefpatHrExpense(models.Model):
 
     proof_file = fields.Char("Justificatif")
 
+    # ------------------------------------------------------
+    # Override ORM
+    # ------------------------------------------------------
+    @api.multi
+    def unlink(self):
+        for espense in self:
+            if espense.proof_file:
+                raise UserError(
+                    "Un document est attaché à cette note de frais, "
+                    "veuillez le supprimer avant de supprimer la note de frais.")
+        return super(AdefpatHrExpense, self).unlink()
+
+    # ------------------------------------------------------
+    # Button Function
+    # ------------------------------------------------------
     @api.multi
     def get_content_details_url(self):
         # TODO: Refaire la fonction sans le type CMIS Folder
@@ -28,6 +44,18 @@ class AdefpatHrExpense(models.Model):
                     'target': 'new',
                 }
 
+    def delete_file(self):
+        backend = self.env['cmis.backend'].search([], limit=1)
+        try:
+            file = backend.get_cmis_repository().getObject(
+                self.proof_file
+            )
+            file.delete()
+            self.proof_file = False
+        except Exception as e:
+            self.proof_file = False
+            # raise UserError(json.loads(e.details).get('message'))
+
     # ------------------------------------------------------
     # Common Function
     # ------------------------------------------------------
@@ -39,6 +67,6 @@ class AdefpatHrExpense(models.Model):
         return {
             'cmis:secondaryObjectTypeIds': ['P:adefpat:justificatif'],
             'adefpat:justificatifDate': fields.Datetime.to_datetime(self.date).isoformat(),
-            'adefpat:justificatifTypeConvention': self.type_convention_id.name,
+            'adefpat:justificatifTypeConvention': self.type_convention_id.name if self.type_convention_id.name else '',
             'adefpat:justificatifUtilisateurs': self.employee_id.user_id.login
         }
diff --git a/models/hr_timesheet.py b/models/hr_timesheet.py
index 87e10a3cc728011a52c8fa756c3b2e25cefb33c8..35e3ba19e4e9989d8b4f2f887c9d2970707947b7 100644
--- a/models/hr_timesheet.py
+++ b/models/hr_timesheet.py
@@ -4,6 +4,7 @@
 from datetime import date
 
 from odoo import api, models, fields
+from odoo.exceptions import UserError
 
 
 class AdefpatAccountAnalyticLine(models.Model):
@@ -11,6 +12,21 @@ class AdefpatAccountAnalyticLine(models.Model):
 
     proof_file = fields.Char("Justificatif")
 
+    # ------------------------------------------------------
+    # Override ORM
+    # ------------------------------------------------------
+    @api.multi
+    def unlink(self):
+        for line in self:
+            if line.proof_file:
+                raise UserError(
+                    "Un document est attaché à cette ligne, "
+                    "veuillez le supprimer avant de supprimer la ligne.")
+        return super(AdefpatAccountAnalyticLine, self).unlink()
+
+    # ------------------------------------------------------
+    # Button Function
+    # ------------------------------------------------------
     @api.multi
     def get_content_details_url(self):
         # TODO: Refaire la fonction sans le type CMIS Folder
@@ -30,7 +46,19 @@ class AdefpatAccountAnalyticLine(models.Model):
                     'target': 'new',
                 }
 
-                # ------------------------------------------------------
+    def delete_file(self):
+        backend = self.env['cmis.backend'].search([], limit=1)
+        try:
+            file = backend.get_cmis_repository().getObject(
+                self.proof_file
+            )
+            file.delete()
+            self.proof_file = False
+        except:
+            self.proof_file = False
+            # raise UserError("Le fichier est introuvable sur Alfresco")
+
+    # ------------------------------------------------------
     # Common Function
     # ------------------------------------------------------
     def get_file_properties(self):
diff --git a/views/adefpat_list_type_doc_views.xml b/views/adefpat_list_type_doc_views.xml
index 7724e44802fd6b0a4054c4c378d722404561c2ee..597db3728bb490cb1a3708fed4ad537cb7809aac 100644
--- a/views/adefpat_list_type_doc_views.xml
+++ b/views/adefpat_list_type_doc_views.xml
@@ -62,9 +62,10 @@
           <field name="arch" type="xml">
             <tree string="Documents" editable="top">
               <field name="name"/>
-              <field name="parent_id"/>
+              <field name="parent_id" options="{ 'no_create': 1 }"/>
               <field name="path"/>
               <field name="specifique"/>
+              <field name="model_id" attrs="{'required': [('specifique', '=', True)]}"/>
             </tree>
           </field>
         </record>
diff --git a/views/hr_expense_views.xml b/views/hr_expense_views.xml
index 4c02d69ffa4b3f1bd263c92bbed0ecdef76ce4ba..524d265f7abcd5c416e638ac0d1438c64ac7686b 100644
--- a/views/hr_expense_views.xml
+++ b/views/hr_expense_views.xml
@@ -16,6 +16,10 @@
                           type="action"
                           class="oe_highlight"
                           attrs="{'invisible': [('proof_file', '!=', False)]}"/>
+                    <button name="delete_file"
+                          string="Supprimer le justificatif"
+                          type="object"
+                          attrs="{'invisible': [('proof_file', '=', False)]}"/>
                     <field name="proof_file" invisible="1"/>
 		    <button name="get_content_details_url"
                           string="Voir le justificatif"
diff --git a/views/hr_timesheet_views.xml b/views/hr_timesheet_views.xml
index 45abcf62deba734a83cd24305ad5650ebb9eb4ac..6305fad85cd894d0a0c9a83ca293e1d39fd89d15 100644
--- a/views/hr_timesheet_views.xml
+++ b/views/hr_timesheet_views.xml
@@ -13,14 +13,21 @@
               <field name="unit_amount" position="after">
                   <field name="proof_file" invisible="1"/>
                   <button name="%(adefpat_alfodoo.upload_file_wizard_action)d"
-                          string="Charger un doc"
+                          string="Justif de présence"
                           type="action"
                           class="btn-outline-info btn-sm"
-                          attrs="{'invisible': ['|',('proof_file', '!=', False),('id', '=', False)]}"
+                          attrs="{'invisible': [('proof_file', '!=', False)]}"
+                  />
+                  <button icon="fa-times"
+                          name="delete_file"
+                          string="Supprimer le fichier"
+                          class="text-danger"
+                          type="object"
+                          attrs="{'invisible': [('proof_file', '=', False)]}"
                   />
                   <button icon="/adefpat_alfodoo/static/src/img/alfresco-logo-16.png"
                           name="get_content_details_url"
-                          string="voir"
+                          string="Voir le fichier dans Alfresco"
                           type="object"
                           attrs="{'invisible': [('proof_file', '=', False)]}"
                   />
diff --git a/views/project_task_views.xml b/views/project_task_views.xml
index 6f21da2b33378abb3b415a1d075c578d6819a0a1..f0517151e3eb03d915214165b4270962bf92a8ca 100644
--- a/views/project_task_views.xml
+++ b/views/project_task_views.xml
@@ -14,7 +14,7 @@
                 <!-- Ajoute l'onglet Documents dans la vue projet -->
                 <xpath expr="//notebook" position="inside">
                     <page string="Documents" groups="base.group_user">
-                        <field name="task_cmis_folder"
+                        <field name="cmis_folder"
                                canCreateFolder="0"
                                canCreateDocument="0"
                                canImportNewVersion="0"
diff --git a/wizard/upload_file_wizard.py b/wizard/upload_file_wizard.py
index 03dc1a3247b2fceb77bba5096f3d5c0d9c97f953..ebdcf7280b7fbd366e54656d3059a5b407744388 100644
--- a/wizard/upload_file_wizard.py
+++ b/wizard/upload_file_wizard.py
@@ -3,6 +3,7 @@
 
 import mimetypes
 import base64
+import json
 
 from odoo import api, fields, models
 from odoo.exceptions import UserError
@@ -45,19 +46,23 @@ class UploadFileWizard(models.TransientModel):
 
         # Upload File
         backend = self.env['cmis.backend'].search([], limit=1)
-        # TODO: voir si le champ est vide et soit mettre à jour soit cherger
-        #  traiter les 2 types de modèle (timesheet & expense)
         repo = backend.get_cmis_repository().getObject(proof_folder)
 
         if not obj.proof_file:
-            file = repo.createDocument(
-                name=self.filename,
-                properties=obj.get_file_properties(),
-                contentFile=base64.b64decode(self.file),
-                contentType=content_type
-            )
-            file_id = file.getProperties().get('cmis:objectId')
-            obj.proof_file = file.getObjectId()
+            try:
+                filename = (fields.Date.to_string(obj.date).replace('-', '') +
+                            '-' + str(obj.id) + ' - ' +
+                            obj.employee_id.user_id.name + ' - ' + self.filename)
+                file = repo.createDocument(
+                    name=filename,
+                    properties=obj.get_file_properties(),
+                    contentFile=base64.b64decode(self.file),
+                    contentType=content_type
+                )
+                file_id = file.getProperties().get('cmis:objectId')
+                obj.proof_file = file.getObjectId()
+            except Exception as e:
+                raise UserError(json.loads(e.details).get('message'))
 
         # TODO: Mettre à jour le champ avec le NodeRef