From faede635bda43b08a7fc40712b91c1ae0ec015b1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fran=C3=A7ois=20Romain?= <francoisromain@gmail.com>
Date: Tue, 28 Jan 2020 14:10:15 +0100
Subject: [PATCH] refactor: convertit en typescript (#273)

---
 package-lock.json                             | 141 ++++++++----------
 package.json                                  |   3 +-
 ...ite-update.js => titre-activite-update.ts} |   2 +-
 ...js => titre-activite-updation-validate.ts} |   6 +-
 ...che-update.js => titre-demarche-update.ts} |   2 +-
 ...js => titre-demarche-updation-validate.ts} |   8 +-
 .../titre-document-updation-validate.js       |   7 -
 .../titre-document-updation-validate.ts       |  11 ++
 ...nts-calc.js => titre-etape-points-calc.ts} |  10 +-
 ...-etape-update.js => titre-etape-update.ts} |   5 +-
 ...te.js => titre-etape-updation-validate.ts} |  22 +--
 .../{titre-update.js => titre-update.ts}      |   2 +-
 ...validate.js => titre-updation-validate.ts} |   4 +-
 src/database/models/_format.ts                |   8 +-
 src/tools/geo-convert.ts                      |   5 +-
 src/tools/{index.test.js => index.test.ts}    |   0
 src/tools/{index.js => index.ts}              |  36 +++--
 src/types.ts                                  |  15 +-
 tsconfig.json                                 |   4 +-
 19 files changed, 156 insertions(+), 135 deletions(-)
 rename src/business/{titre-activite-update.js => titre-activite-update.ts} (90%)
 rename src/business/{titre-activite-updation-validate.js => titre-activite-updation-validate.ts} (71%)
 rename src/business/{titre-demarche-update.js => titre-demarche-update.ts} (98%)
 rename src/business/{titre-demarche-updation-validate.js => titre-demarche-updation-validate.ts} (57%)
 delete mode 100644 src/business/titre-document-updation-validate.js
 create mode 100644 src/business/titre-document-updation-validate.ts
 rename src/business/{titre-etape-points-calc.js => titre-etape-points-calc.ts} (74%)
 rename src/business/{titre-etape-update.js => titre-etape-update.ts} (98%)
 rename src/business/{titre-etape-updation-validate.js => titre-etape-updation-validate.ts} (82%)
 rename src/business/{titre-update.js => titre-update.ts} (98%)
 rename src/business/{titre-updation-validate.js => titre-updation-validate.ts} (80%)
 rename src/tools/{index.test.js => index.test.ts} (100%)
 rename src/tools/{index.js => index.ts} (59%)

diff --git a/package-lock.json b/package-lock.json
index f071bd777..85b617ae2 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1061,14 +1061,14 @@
       }
     },
     "@jest/types": {
-      "version": "24.9.0",
-      "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz",
-      "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==",
-      "dev": true,
+      "version": "25.1.0",
+      "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.1.0.tgz",
+      "integrity": "sha512-VpOtt7tCrgvamWZh1reVsGADujKigBUFTi19mlRjqEGsE8qH4r3s+skY33dNdXOwyZIvuftZ5tqdF1IgsMejMA==",
       "requires": {
         "@types/istanbul-lib-coverage": "^2.0.0",
         "@types/istanbul-reports": "^1.1.1",
-        "@types/yargs": "^13.0.0"
+        "@types/yargs": "^15.0.0",
+        "chalk": "^3.0.0"
       }
     },
     "@mapbox/geojson-area": {
@@ -1443,14 +1443,12 @@
     "@types/istanbul-lib-coverage": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz",
-      "integrity": "sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg==",
-      "dev": true
+      "integrity": "sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg=="
     },
     "@types/istanbul-lib-report": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
       "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==",
-      "dev": true,
       "requires": {
         "@types/istanbul-lib-coverage": "*"
       }
@@ -1459,19 +1457,17 @@
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz",
       "integrity": "sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA==",
-      "dev": true,
       "requires": {
         "@types/istanbul-lib-coverage": "*",
         "@types/istanbul-lib-report": "*"
       }
     },
     "@types/jest": {
-      "version": "24.9.1",
-      "resolved": "https://registry.npmjs.org/@types/jest/-/jest-24.9.1.tgz",
-      "integrity": "sha512-Fb38HkXSVA4L8fGKEZ6le5bB8r6MRWlOCZbVuWZcmOMSCd2wCYOwN1ibj8daIoV9naq7aaOZjrLCoCMptKU/4Q==",
-      "dev": true,
+      "version": "25.1.0",
+      "resolved": "https://registry.npmjs.org/@types/jest/-/jest-25.1.0.tgz",
+      "integrity": "sha512-MYX8LpNQboef1NDZQTchM5poL8WITRVG/4/1XLK/Xsamjptsvgb8ELTRoXixBARi+a81mMT4n2hooqaydEOE9A==",
       "requires": {
-        "jest-diff": "^24.3.0"
+        "jest-diff": "^25.1.0"
       }
     },
     "@types/json-schema": {
@@ -1532,6 +1528,14 @@
         "@types/node": "*"
       }
     },
+    "@types/nodemailer": {
+      "version": "6.4.0",
+      "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.4.0.tgz",
+      "integrity": "sha512-KY7bFWB0MahRZvVW4CuW83qcCDny59pJJ0MQ5ifvfcjNwPlIT0vW4uARO4u1gtkYnWdhSvURegecY/tzcukJcA==",
+      "requires": {
+        "@types/node": "*"
+      }
+    },
     "@types/proj4": {
       "version": "2.5.0",
       "resolved": "https://registry.npmjs.org/@types/proj4/-/proj4-2.5.0.tgz",
@@ -1572,10 +1576,9 @@
       "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ=="
     },
     "@types/yargs": {
-      "version": "13.0.6",
-      "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.6.tgz",
-      "integrity": "sha512-IkltIncDQWv6fcAvnHtJ6KtkmY/vtR3bViOaCzpj/A3yNhlfZAgxNe6AEQD1cQrkYD+YsKVo08DSxvNKEsD7BA==",
-      "dev": true,
+      "version": "15.0.2",
+      "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.2.tgz",
+      "integrity": "sha512-hFkuAp58M2xOc1QgJhkFrLMnqa8KWTFRTnzrI1zlEcOfg3DZ0eH3aPAo/N6QlVVu8E4KS4xD1jtEG3rdQYFmIg==",
       "requires": {
         "@types/yargs-parser": "*"
       }
@@ -1583,8 +1586,7 @@
     "@types/yargs-parser": {
       "version": "15.0.0",
       "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz",
-      "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==",
-      "dev": true
+      "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw=="
     },
     "@typescript-eslint/experimental-utils": {
       "version": "2.17.0",
@@ -4100,10 +4102,9 @@
       "dev": true
     },
     "diff-sequences": {
-      "version": "24.9.0",
-      "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz",
-      "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==",
-      "dev": true
+      "version": "25.1.0",
+      "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.1.0.tgz",
+      "integrity": "sha512-nFIfVk5B/NStCsJ+zaPO4vYuLjlzQ6uFvPxzYyHlejNZ/UGa7G/n7peOXVrVNvRuyfstt+mZQYGpjxg9Z6N8Kw=="
     },
     "dir-glob": {
       "version": "2.0.0",
@@ -8342,37 +8343,14 @@
       }
     },
     "jest-diff": {
-      "version": "24.9.0",
-      "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz",
-      "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==",
-      "dev": true,
+      "version": "25.1.0",
+      "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.1.0.tgz",
+      "integrity": "sha512-nepXgajT+h017APJTreSieh4zCqnSHEJ1iT8HDlewu630lSJ4Kjjr9KNzm+kzGwwcpsDE6Snx1GJGzzsefaEHw==",
       "requires": {
-        "chalk": "^2.0.1",
-        "diff-sequences": "^24.9.0",
-        "jest-get-type": "^24.9.0",
-        "pretty-format": "^24.9.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "3.2.1",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-          "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^1.9.0"
-          }
-        },
-        "chalk": {
-          "version": "2.4.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^3.2.1",
-            "escape-string-regexp": "^1.0.5",
-            "supports-color": "^5.3.0"
-          }
-        }
+        "chalk": "^3.0.0",
+        "diff-sequences": "^25.1.0",
+        "jest-get-type": "^25.1.0",
+        "pretty-format": "^25.1.0"
       }
     },
     "jest-docblock": {
@@ -8659,10 +8637,9 @@
       }
     },
     "jest-get-type": {
-      "version": "24.9.0",
-      "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz",
-      "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==",
-      "dev": true
+      "version": "25.1.0",
+      "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.1.0.tgz",
+      "integrity": "sha512-yWkBnT+5tMr8ANB6V+OjmrIJufHtCAqI5ic2H40v+tRqxDmE0PGnIiTyvRWFOMtmVHYpwRqyazDbTnhpjsGvLw=="
     },
     "jest-haste-map": {
       "version": "25.1.0",
@@ -12733,31 +12710,42 @@
       }
     },
     "pretty-format": {
-      "version": "24.9.0",
-      "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz",
-      "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==",
-      "dev": true,
+      "version": "25.1.0",
+      "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.1.0.tgz",
+      "integrity": "sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ==",
       "requires": {
-        "@jest/types": "^24.9.0",
-        "ansi-regex": "^4.0.0",
-        "ansi-styles": "^3.2.0",
-        "react-is": "^16.8.4"
+        "@jest/types": "^25.1.0",
+        "ansi-regex": "^5.0.0",
+        "ansi-styles": "^4.0.0",
+        "react-is": "^16.12.0"
       },
       "dependencies": {
         "ansi-regex": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
-          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
-          "dev": true
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+          "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
         },
         "ansi-styles": {
-          "version": "3.2.1",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-          "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-          "dev": true,
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
           "requires": {
-            "color-convert": "^1.9.0"
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "requires": {
+            "color-name": "~1.1.4"
           }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
         }
       }
     },
@@ -12938,8 +12926,7 @@
     "react-is": {
       "version": "16.12.0",
       "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz",
-      "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==",
-      "dev": true
+      "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q=="
     },
     "read-package-json-fast": {
       "version": "1.1.1",
diff --git a/package.json b/package.json
index ee1d61c2f..c3d6c530e 100644
--- a/package.json
+++ b/package.json
@@ -67,9 +67,11 @@
     "@types/express-jwt": "0.0.42",
     "@types/geojson": "^7946.0.7",
     "@types/graphql-upload": "^8.0.3",
+    "@types/jest": "^25.1.0",
     "@types/jsonwebtoken": "^8.3.7",
     "@types/node": "^13.5.0",
     "@types/node-fetch": "^2.5.4",
+    "@types/nodemailer": "^6.4.0",
     "@types/proj4": "^2.5.0",
     "bcryptjs": "^2.4.3",
     "camelcase": "^5.3.1",
@@ -109,7 +111,6 @@
     "typescript": "^3.7.5"
   },
   "devDependencies": {
-    "@types/jest": "^24.9.1",
     "@typescript-eslint/parser": "^2.17.0",
     "codecov": "^3.6.2",
     "commitizen": "^4.0.3",
diff --git a/src/business/titre-activite-update.js b/src/business/titre-activite-update.ts
similarity index 90%
rename from src/business/titre-activite-update.js
rename to src/business/titre-activite-update.ts
index 8e54522b0..66b3c3778 100644
--- a/src/business/titre-activite-update.js
+++ b/src/business/titre-activite-update.ts
@@ -2,7 +2,7 @@ import { titreActiviteGet } from '../database/queries/titres-activites'
 import { titreGet } from '../database/queries/titres'
 import titresPropsActivitesUpdate from './processes/titres-props-activites-update'
 
-const titreActiviteUpdate = async titreActiviteId => {
+const titreActiviteUpdate = async (titreActiviteId: string) => {
   const activite = await titreActiviteGet(titreActiviteId)
   const titre = await titreGet(activite.titreId)
 
diff --git a/src/business/titre-activite-updation-validate.js b/src/business/titre-activite-updation-validate.ts
similarity index 71%
rename from src/business/titre-activite-updation-validate.js
rename to src/business/titre-activite-updation-validate.ts
index b9aadbc5d..70ba05dfb 100644
--- a/src/business/titre-activite-updation-validate.js
+++ b/src/business/titre-activite-updation-validate.ts
@@ -1,8 +1,10 @@
+import { ITitresActivitesContenu, IActivitesTypesSection } from '../types'
+
 import titreActiviteNumbersCheck from './utils/titre-activite-numbers-check'
 
 const titreActiviteUpdationValidate = (
-  titreActviteContenu,
-  activiteTypeSections
+  titreActviteContenu: ITitresActivitesContenu,
+  activiteTypeSections: IActivitesTypesSection[]
 ) => {
   const errors = []
   // les champs number ne peuvent avoir une durée négative
diff --git a/src/business/titre-demarche-update.js b/src/business/titre-demarche-update.ts
similarity index 98%
rename from src/business/titre-demarche-update.js
rename to src/business/titre-demarche-update.ts
index 9b8f9ecb9..5f38a6cec 100644
--- a/src/business/titre-demarche-update.js
+++ b/src/business/titre-demarche-update.ts
@@ -13,7 +13,7 @@ import { titreIdsUpdate } from './processes/titres-ids-update'
 
 import { titreActivitesRowUpdate } from '../tools/export/titre-activites'
 
-const titreDemarcheUpdate = async titreId => {
+const titreDemarcheUpdate = async (titreId: string) => {
   try {
     let titre = await titreGet(titreId, {
       graph: 'demarches(orderDesc).[etapes(orderDesc)]'
diff --git a/src/business/titre-demarche-updation-validate.js b/src/business/titre-demarche-updation-validate.ts
similarity index 57%
rename from src/business/titre-demarche-updation-validate.js
rename to src/business/titre-demarche-updation-validate.ts
index 90663b86b..c77375dd8 100644
--- a/src/business/titre-demarche-updation-validate.js
+++ b/src/business/titre-demarche-updation-validate.ts
@@ -1,5 +1,9 @@
-const titreDemarcheUpdationValidate = async titreDemarcheNew => {
-  const errors = []
+import { ITitresDemarches } from '../types'
+
+const titreDemarcheUpdationValidate = async (
+  titreDemarcheNew: ITitresDemarches
+) => {
+  const errors = [] as string[]
   // vérifie
   // - si le statut de la démarche est possible sur ce type de démarche
   // - si la démarche contient des étapes qui ne sont pas recevables
diff --git a/src/business/titre-document-updation-validate.js b/src/business/titre-document-updation-validate.js
deleted file mode 100644
index b865ae9b3..000000000
--- a/src/business/titre-document-updation-validate.js
+++ /dev/null
@@ -1,7 +0,0 @@
-const titreDocumentUpdationValidate = async titreDocument => {
-  const errors = []
-
-  return errors
-}
-
-export default titreDocumentUpdationValidate
diff --git a/src/business/titre-document-updation-validate.ts b/src/business/titre-document-updation-validate.ts
new file mode 100644
index 000000000..3b57285be
--- /dev/null
+++ b/src/business/titre-document-updation-validate.ts
@@ -0,0 +1,11 @@
+import { ITitresDocuments } from '../types'
+
+const titreDocumentUpdationValidate = async (
+  titreDocument: ITitresDocuments
+) => {
+  const errors = [] as string[]
+
+  return errors
+}
+
+export default titreDocumentUpdationValidate
diff --git a/src/business/titre-etape-points-calc.js b/src/business/titre-etape-points-calc.ts
similarity index 74%
rename from src/business/titre-etape-points-calc.js
rename to src/business/titre-etape-points-calc.ts
index be8f76f58..63f02a8db 100644
--- a/src/business/titre-etape-points-calc.js
+++ b/src/business/titre-etape-points-calc.ts
@@ -1,7 +1,8 @@
+import { ITitresPoints, ITitresPointsReferences, ICoordonnees } from '../types'
 import geoConvert from '../tools/geo-convert'
 import { geoSystemeGet } from '../database/queries/metas'
 
-const titreEtapePointsCalc = async titrePoints => {
+const titreEtapePointsCalc = async (titrePoints: ITitresPoints[]) => {
   const uniteRatio = await uniteRatioFind(pointReferenceFind(titrePoints))
 
   return titrePoints.map(point => {
@@ -11,19 +12,18 @@ const titreEtapePointsCalc = async titrePoints => {
     point.coordonnees = geoConvert(reference.geoSystemeId, {
       x: reference.coordonnees.x * uniteRatio,
       y: reference.coordonnees.y * uniteRatio
-    })
+    }) as ICoordonnees
 
     return point
   })
 }
 
-const pointReferenceFind = points =>
-  points.length &&
+const pointReferenceFind = (points: ITitresPoints[]) =>
   points[0].references &&
   points[0].references.length &&
   (points[0].references.find(r => r.opposable) || points[0].references[0])
 
-const uniteRatioFind = async pointReference => {
+const uniteRatioFind = async (pointReference: ITitresPointsReferences | 0) => {
   if (!pointReference || !pointReference.geoSystemeId) {
     return 1
   }
diff --git a/src/business/titre-etape-update.js b/src/business/titre-etape-update.ts
similarity index 98%
rename from src/business/titre-etape-update.js
rename to src/business/titre-etape-update.ts
index 46c909f78..20d9dbe2f 100644
--- a/src/business/titre-etape-update.js
+++ b/src/business/titre-etape-update.ts
@@ -23,7 +23,10 @@ import { titreIdsUpdate } from './processes/titres-ids-update'
 
 import { titreActivitesRowUpdate } from '../tools/export/titre-activites'
 
-const titreEtapeUpdate = async (titreEtapeId, titreDemarcheId) => {
+const titreEtapeUpdate = async (
+  titreEtapeId: string,
+  titreDemarcheId: string
+) => {
   try {
     // 1.
     console.log('ordre des étapes…')
diff --git a/src/business/titre-etape-updation-validate.js b/src/business/titre-etape-updation-validate.ts
similarity index 82%
rename from src/business/titre-etape-updation-validate.js
rename to src/business/titre-etape-updation-validate.ts
index 52c83b552..01577e937 100644
--- a/src/business/titre-etape-updation-validate.js
+++ b/src/business/titre-etape-updation-validate.ts
@@ -1,3 +1,5 @@
+import { ITitresEtapes } from '../types'
+
 import { titreGet } from '../database/queries/titres'
 import { titreDemarcheGet } from '../database/queries/titres-demarches'
 import titreEtapeTypeAndStatusCheck from './utils/titre-etape-type-and-status-check'
@@ -5,20 +7,16 @@ import titreEtapeDateCheck from './utils/titre-etape-date-check'
 import titreEtapePointsCheck from './utils/titre-etape-points-check'
 import titreEtapeNumbersCheck from './utils/titre-etape-numbers-check'
 
-const titreEtapeUpdationValidate = async titreEtape => {
+const titreEtapeUpdationValidate = async (titreEtape: ITitresEtapes) => {
   const titreDemarche = await titreDemarcheGet(titreEtape.titreDemarcheId)
 
   const titre = await titreGet(titreDemarche.titreId)
 
-  const etapeType = titreDemarche.type.etapesTypes.find(
-    et => et.id === titreEtape.typeId
-  )
-
   const errors = []
 
   // 1. le type d'étape correspond à la démarche et au type de titre
 
-  const error = titreEtapeTypeAndStatusCheck(titreEtape, titreDemarche, titre)
+  const error = titreEtapeTypeAndStatusCheck(titreEtape, titreDemarche)
 
   if (error) {
     errors.push(error)
@@ -43,11 +41,15 @@ const titreEtapeUpdationValidate = async titreEtape => {
   }
 
   // 4. les champs number ne peuvent avoir une durée négative
+  const etapeType = titreDemarche.type.etapesTypes.find(
+    et => et.id === titreEtape.typeId
+  )
+  if (etapeType && etapeType.sections) {
+    const errorNumbers = titreEtapeNumbersCheck(titreEtape, etapeType.sections)
 
-  const errorNumbers = titreEtapeNumbersCheck(titreEtape, etapeType.sections)
-
-  if (errorNumbers) {
-    errors.push(errorNumbers)
+    if (errorNumbers) {
+      errors.push(errorNumbers)
+    }
   }
 
   return errors
diff --git a/src/business/titre-update.js b/src/business/titre-update.ts
similarity index 98%
rename from src/business/titre-update.js
rename to src/business/titre-update.ts
index ca51c2e07..49de1a9ca 100644
--- a/src/business/titre-update.js
+++ b/src/business/titre-update.ts
@@ -9,7 +9,7 @@ import { titreActivitesRowUpdate } from '../tools/export/titre-activites'
 import { titreIdsUpdate } from './processes/titres-ids-update'
 import { activitesTypesGet } from '../database/queries/metas'
 
-const titreUpdate = async titreId => {
+const titreUpdate = async (titreId: string) => {
   try {
     let titre = await titreGet(titreId, {
       graph: 'administrationsGestionnaires'
diff --git a/src/business/titre-updation-validate.js b/src/business/titre-updation-validate.ts
similarity index 80%
rename from src/business/titre-updation-validate.js
rename to src/business/titre-updation-validate.ts
index 8060ebee5..dae35a18c 100644
--- a/src/business/titre-updation-validate.js
+++ b/src/business/titre-updation-validate.ts
@@ -1,4 +1,6 @@
-const titreUpdationValidate = async (titreNew, titreOld) => {
+import { ITitres } from '../types'
+
+const titreUpdationValidate = async (titreNew: ITitres, titreOld: ITitres) => {
   // vérifie
   // - si un titre contient des démarches qui ne sont pas recevables
   const errors = []
diff --git a/src/database/models/_format.ts b/src/database/models/_format.ts
index 398abbbb1..6543d68b2 100644
--- a/src/database/models/_format.ts
+++ b/src/database/models/_format.ts
@@ -73,19 +73,19 @@ const paysFormat = (communes: ICommunes[]) => {
   }, [])
 
   // trie par ordre alphabétique
-  pays.sort((a, b) => (a.nom > b.nom ? 1 : a.nom < b.nom ? -1 : 0))
+  pays.sort((a, b) => a.nom.localeCompare(b.nom, 'fr'))
   pays.forEach(p => {
     if (!p.regions) return
 
-    p.regions.sort((a, b) => (a.nom > b.nom ? 1 : -1))
+    p.regions.sort((a, b) => a.nom.localeCompare(b.nom, 'fr'))
     p.regions.forEach(r => {
       if (!r.departements) return
 
-      r.departements.sort((a, b) => (a.nom > b.nom ? 1 : -1))
+      r.departements.sort((a, b) => a.nom.localeCompare(b.nom, 'fr'))
       r.departements.forEach(d => {
         if (!d.communes) return
 
-        d.communes.sort((a, b) => (a.nom > b.nom ? 1 : -1))
+        d.communes.sort((a, b) => a.nom.localeCompare(b.nom, 'fr'))
       })
     })
   })
diff --git a/src/tools/geo-convert.ts b/src/tools/geo-convert.ts
index c54314351..08a7f45f0 100644
--- a/src/tools/geo-convert.ts
+++ b/src/tools/geo-convert.ts
@@ -13,9 +13,8 @@ const geoConvertInit = async () => {
   )
 }
 
-const geoConvert = (epsgId: string, coords: proj4.TemplateCoordinates) => {
-  return proj4(`EPSG:${epsgId}`, 'EPSG:4326', coords)
-}
+const geoConvert = (epsgId: string, coords: proj4.TemplateCoordinates) =>
+  proj4(`EPSG:${epsgId}`, 'EPSG:4326', coords)
 
 export default geoConvert
 
diff --git a/src/tools/index.test.js b/src/tools/index.test.ts
similarity index 100%
rename from src/tools/index.test.js
rename to src/tools/index.test.ts
diff --git a/src/tools/index.js b/src/tools/index.ts
similarity index 59%
rename from src/tools/index.js
rename to src/tools/index.ts
index d934a5522..6892fde10 100644
--- a/src/tools/index.js
+++ b/src/tools/index.ts
@@ -1,7 +1,11 @@
-const dupRemove = (key, ...arrays) =>
+interface Index {
+  [id: string]: any
+}
+
+const dupRemove = (key: string, ...arrays: Index[][]) =>
   arrays.reduce(
     (result, array) =>
-      array.reduce((res, el) => {
+      array.reduce((res: Index[], el) => {
         if (!res.find(e => !el[key] || e[key] === el[key])) {
           res.push(el)
         }
@@ -11,14 +15,14 @@ const dupRemove = (key, ...arrays) =>
     []
   )
 
-const dupFind = (key, ...arrays) =>
+const dupFind = (key: string, ...arrays: Index[][]) =>
   arrays.reduce(
-    (result, array) =>
+    (result: Index[], array) =>
       result.filter(el => array.find(e => e[key] && e[key] === el[key])),
-    arrays.pop()
+    arrays.pop() as Index[]
   )
 
-const objectsDiffer = (a, b) => {
+const objectsDiffer = (a: Index | any, b: Index | any): boolean => {
   if (typeof a !== 'object' && typeof b !== 'object') {
     return a !== b
   }
@@ -27,7 +31,7 @@ const objectsDiffer = (a, b) => {
     Object.keys(a).find(k => {
       if (a[k] && b[k]) {
         if (Array.isArray(a[k]) && Array.isArray(b[k])) {
-          return a[k].find((a, i) => objectsDiffer(a, b[k][i]))
+          return a[k].find((ak: any, i: number) => objectsDiffer(ak, b[k][i]))
         }
 
         if (typeof a[k] === 'object' && typeof b[k] === 'object' && a[k]) {
@@ -40,19 +44,25 @@ const objectsDiffer = (a, b) => {
   )
 }
 
-const objConditionMatch = (condition, obj, keys = null) => {
+// TODO: définir une interface IConditions
+
+const objConditionMatch = (
+  condition: any,
+  obj: Index,
+  keys: string[] | null = null
+) => {
   // si les conditions sont testées plusieurs fois, (dans une boucle par ex)
   // alors les clés de l'objet de condition peuvent être passées optionnellement
   // pour ne pas les recalculer à chaque fois
   const conditionKeys = keys || Object.keys(condition)
 
+  // si la condition est multiple (tableau)
+  // teste si l'objet contient au moins une des valeurs
+  // sinon, teste la valeur exacte
   return conditionKeys.every(k =>
-    // si la condition est multiple (tableau)
     Array.isArray(condition[k])
-      ? // teste si l'objet contient au moins une des valeurs
-        condition[k].includes(obj[k])
-      : // sinon, teste la valeur exacte
-        condition[k] === obj[k]
+      ? condition[k].includes(obj[k])
+      : condition[k] === obj[k]
   )
 }
 
diff --git a/src/types.ts b/src/types.ts
index 6b073c319..6b461de89 100644
--- a/src/types.ts
+++ b/src/types.ts
@@ -90,7 +90,7 @@ interface IDemarchesTypes {
   titulaires?: boolean
   renouvelable?: boolean
   exception?: boolean
-  etapesTypes?: IEtapesTypes[]
+  etapesTypes: IEtapesTypes[]
 }
 
 interface IDepartements {
@@ -179,6 +179,7 @@ interface IGeoSystemes {
   nom: string
   ordre: number
   uniteId?: string
+  unite: IUnites
   zone?: string
 }
 
@@ -299,6 +300,10 @@ interface ISubstances {
   substanceLegale: ISubstancesLegales
 }
 
+interface ITitresActivitesContenu {
+  [id: string]: string | number | string[]
+}
+
 interface ITitresActivites {
   id: string
   titreId: string
@@ -306,8 +311,7 @@ interface ITitresActivites {
   utilisateurId?: string
   utilisateur: IUtilisateurs
   dateSaisie?: string
-  // TODO: créer une interfaceIActiviteContenu
-  contenu?: any
+  contenu?: ITitresActivitesContenu
   activiteTypeId: string
   activiteType: IActivitesTypes
   activiteStatutId: string
@@ -339,10 +343,10 @@ interface ITitresDemarches {
   id: string
   titreId: string
   typeId: string
+  type: IDemarchesTypes
   statutId?: string
   ordre?: number
   annulationTitreDemarcheId?: string
-  type: IDemarchesTypes
   statut?: IDemarchesStatuts
   titreType: ITypes
   etapes?: ITitresEtapes[]
@@ -544,10 +548,12 @@ interface IUtilisateurs {
 export {
   IActivitesStatuts,
   IActivitesTypes,
+  IActivitesTypesSection,
   IAdministrationsTypes,
   IAdministrations,
   IAnnees,
   ICommunes,
+  ICoordonnees,
   IDemarchesStatuts,
   IDemarchesTypes,
   IDepartements,
@@ -578,6 +584,7 @@ export {
   ISubstancesLegales,
   ISubstances,
   ITitresActivites,
+  ITitresActivitesContenu,
   ITitresAdministrationsGestionnaires,
   ITitresAdministrationsLocales,
   ITitresCommunes,
diff --git a/tsconfig.json b/tsconfig.json
index b979c72e9..1c3ae6032 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -16,8 +16,8 @@
     "strictNullChecks": true,
     "sourceMap": true,
     "target": "ES2017",
-    "types": ["node", "geojson", "node-fetch"]
+    "types": ["node", "jest"]
   },
-  "exclude": ["node_modules"],
+  "exclude": ["node_modules", "**/*.spec.ts", "**/*.test.ts"],
   "include": ["src/**/*"]
 }
-- 
GitLab