diff --git a/YKWIM/__init__.py b/YKWIM/__init__.py
index acf485aecab25b8ade564683366bd0cbeeb92035..fabb8663fec58db3851bd294eeb18ee968188df6 100644
--- a/YKWIM/__init__.py
+++ b/YKWIM/__init__.py
@@ -1,6 +1,6 @@
 from flask import Flask
 
 app = Flask(__name__)
-app.config.from_object("config.ProductionConfig")
+app.config.from_object("config.DevelopmentConfig")
 
 from YKWIM import views
\ No newline at end of file
diff --git a/YKWIM/generateJSON.py b/YKWIM/generateJSON.py
index e43efaf21ac434fcd4f2a62d1cc32c8851e5b645..309fae1c9ec9470e19f4b7865545f18139de059f 100644
--- a/YKWIM/generateJSON.py
+++ b/YKWIM/generateJSON.py
@@ -22,7 +22,7 @@ def generateJSON(file, path=app.config["UPLOAD_FOLDER"]):
 
     #attributes sheet parsing
     list=[]
-    classe=book["Attributs"][1][0] #à valider 
+    classe=book["Attributs"][1][0] 
     index= list_of_all_values.index(classe)
     for attr in filter(lambda value:True if value[1]!='' else False,book["Attributs"][1:]): 
         if (classe != attr[0] and attr[0]!=''):
@@ -66,7 +66,7 @@ def generateJSON(file, path=app.config["UPLOAD_FOLDER"]):
 
     #enumeration values sheet parsing
     list=[]
-    enumeration=book["Valeurs d'énumération"][1][0] #à valider 
+    enumeration=book["Valeurs d'énumération"][1][0]
     index= list_of_all_values.index(enumeration)
     for enum in filter(lambda value:True if value[1]!='' else False,book["Valeurs d'énumération"][1:]): 
         if (enumeration != enum[0] and enum[0]!=''):
diff --git a/YKWIM/static/doc/notice.pdf b/YKWIM/static/doc/notice.pdf
index 54828cacb331c6a9b66d45fbb62dcf7361e718b1..02a3686a2f1aabd81b18465e5d48831aca7241cc 100644
Binary files a/YKWIM/static/doc/notice.pdf and b/YKWIM/static/doc/notice.pdf differ
diff --git a/YKWIM/static/doc/template.ods b/YKWIM/static/doc/template.ods
index 65ddd906c22950a48178ee84da67db105db6eef0..11afa63577899710183d1513bb8bff65f4ff6480 100644
Binary files a/YKWIM/static/doc/template.ods and b/YKWIM/static/doc/template.ods differ
diff --git a/YKWIM/templates/index.html b/YKWIM/templates/index.html
index a00b63902a4dff19046d0ea5158f803057dc2384..d1f1447fea27b982b0301acb689008b00c8ccdf6 100644
--- a/YKWIM/templates/index.html
+++ b/YKWIM/templates/index.html
@@ -77,16 +77,26 @@
                         <div class="row py-3">
                             <button type="submit" class="offset-4 btn btn-primary col-8" aria-disabled="disabled">Convertir</button>
                         </div>
+                        {% if error_template %}
+                                <div class="row py-3">
+                                    <div class="alert alert-warning alert-dismissible fade show" role="alert">
+                                        <span>{{error_template}}</span>
+                                        <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
+                                      </div>
+                                </div>
+                        {% endif %}
                     </form>
                 </div>
                 
                 <!--UML class diagram-->
+                {% if uml_image %}
                 <div class="container py-3">
                     <div class="row justify-content-center">
-                        <p class="col-6 border">remarques</p>
-                        <img src="{{uml_image}}" class="col-6 border" alt="UML class diagram">
+                        <p class="col-6 border">Données RDF</p>
+                        <img src="{{url_for('getDocumentLink',document_link=uml_image)}}" class="col-6 border" alt="UML class diagram">
                     </div>
                 </div>
+                {% endif %}
             </div>
 
             <div class="tab-pane" id="pills-config" role="tabpanel" aria-labelledby="pills-config-tab">
diff --git a/YKWIM/tests/template_test.ods b/YKWIM/tests/template_test.ods
new file mode 100644
index 0000000000000000000000000000000000000000..5ccc6bb736f93c5a5934148d12e628c93cd76db2
Binary files /dev/null and b/YKWIM/tests/template_test.ods differ
diff --git a/YKWIM/validateTemplate.py b/YKWIM/validateTemplate.py
new file mode 100644
index 0000000000000000000000000000000000000000..b91597515e85213463bbcae2d34f43d474efb735
--- /dev/null
+++ b/YKWIM/validateTemplate.py
@@ -0,0 +1,72 @@
+import pyexcel as p
+
+def validateTemplate(file):
+    
+    book=p.get_book_dict(file_name=file)
+    
+    #------------------------
+    #classes sheet validation
+    #------------------------
+
+    #0. La feuille classe doit contenir au moins une classe
+    if (book["Classes"][1][0]=='') : return "La feuille classe doit contenir au moins une classe"
+
+    #1. Chaque classe doit avoir un lien de référence ou une définition
+    for cl in filter(lambda value:True if value[0]!='' else False, book["Classes"][1:]): 
+        if (cl[1]=='' and cl[2]==''): return f"La classe {cl[0]} doit avoir un lien de référence ou une définition" 
+
+    #------------------------
+    #attributes sheet validation
+    #------------------------
+
+    #0. Le nom de la classe du 1er attribut est obligatoire
+    if (book["Attributs"][1][0]=='') : return "Le nom de la classe du 1er attribut est obligatoire"
+
+    list=[]
+    classe=book["Attributs"][1][0] 
+        
+    #1. Tous les champs doivent être remplis. Le choix existe uniquement entre lien de référence et définition.
+    for attr in filter(lambda value:True if value[1]!='' else False,book["Attributs"][1:]):
+        if (attr[4]==''): return f"L'attribut {attr[1]} doit avoir une source"
+        if (attr[5]==''): return f"Le champs \"Identifiant\" n'est pas précisé pour l'attribut {attr[1]}"
+        if (attr[2]=='' and attr[3]==''): return f"L'attribut {attr[1]} doit avoir un lien de référence ou une définition"
+        
+        #2. Chaque classe doit avoir au minimum un identifiant
+        if (classe != attr[0] and attr[0]!=''):# si on passe à une autre classe, vérifier que la classe d'avant a un identifiant
+            if ("oui" not in list) : return f"la classe {classe} n'a pas d'identifiant"
+            classe=attr[0]
+            list=[]
+        list.append(attr[5])
+
+    # vérifier l'identifiant de la dernière classe
+    if ("oui" not in list) : return f"la classe {classe} n'a pas d'identifiant"
+    
+    #------------------------
+    #associations sheet validation
+    #------------------------
+
+    #0. Chaque association doit avoir un lien de référence ou une définition
+    for ass in filter(lambda value:True if value[2]!='' else False,book["Associations"][1:]):
+        if (ass[3]=='' and ass[4]==''): return f"L'association {ass[2]} doit avoir un lien de référence ou une définition" 
+
+    #------------------------
+    #enumerations sheet validation
+    #------------------------
+
+    #0. Chaque énumération doit avoir un lien de référence ou une définition
+    for enum in filter(lambda value:True if value[0]!='' else False, book["Énumérations"][1:]): 
+        if (enum[1]=='' and enum[2]==''): return f"L'énumération {enum[0]} doit avoir un lien de référence ou une définition" 
+        enum_exit=True #une énumération existe dans le diagramme UML
+    
+    #------------------------
+    #enumeration values sheet validation
+    #------------------------
+
+    if enum_exit :
+        
+        #0. Le nom de l'énumération de la 1ère valeur est obligatoire
+        if (book["Valeurs d'énumération"][1][0]=='') : return "Le nom de l'énumération de la 1ère valeur est obligatoire"
+
+        #1. Chaque valeur d'énumération doit avoir un lien de référence ou une définition
+        for enum in filter(lambda value:True if value[1]!='' else False,book["Valeurs d'énumération"][1:]):
+            if (enum[2]=='' and enum[3]==''): return f"La valeur d'énumération {enum[1]} doit avoir un lien de référence ou une définition"
\ No newline at end of file
diff --git a/YKWIM/views.py b/YKWIM/views.py
index 5ae09ab07d1cb48a9871241ea541717de4754614..8a9470cda25407fcf5abc7bb2fe8e1dbb10ff292 100644
--- a/YKWIM/views.py
+++ b/YKWIM/views.py
@@ -1,5 +1,5 @@
-from YKWIM import app, plantUML2Image as pl
-from flask import render_template, request, url_for, send_from_directory, redirect
+from YKWIM import app, plantUML2Image as pl, validateTemplate as val
+from flask import render_template, request, send_from_directory, flash
 from werkzeug.utils import secure_filename
 import os
 
@@ -9,8 +9,12 @@ def index():
         datasetURL=request.form["datasetURL"]
         file = request.files["templateFile"]
         file.save(os.path.join(app.config['UPLOAD_FOLDER'],secure_filename(file.filename)))
-        uml_image = pl.plantUML2Image(app.config['UPLOAD_FOLDER']+secure_filename(file.filename),"svg")
-        return render_template("index.html", uml_image=url_for('getDocumentLink',document_link=uml_image))
+        error_template = val.validateTemplate(app.config['UPLOAD_FOLDER']+secure_filename(file.filename))
+        if error_template == None :
+            uml_image = pl.plantUML2Image(app.config['UPLOAD_FOLDER']+secure_filename(file.filename),"svg")
+            return render_template("index.html", uml_image=uml_image)
+        else: 
+            return render_template("index.html", error_template=error_template)
     else:            
         return render_template("index.html")