├── .gitignore ├── flows ├── Default.csml ├── test_001.csml ├── test_000.csml ├── test_002.csml ├── test_003.csml ├── test_011.csml ├── test_012.csml ├── test_013.csml ├── test_004.csml ├── test_010.csml ├── test_006.csml ├── test_005.csml ├── test_008.csml ├── test_009.csml ├── test_007.csml ├── responses_20200330.csml ├── responses_20200510.csml ├── diag_20200330_algo.csml ├── diag_20200510_algo.csml ├── diag_20200510.csml └── diag_20200330.csml ├── functions ├── datetime.zip └── norm_units.zip ├── LICENSE ├── README.md └── bot.json /.gitignore: -------------------------------------------------------------------------------- 1 | **/.DS_Store 2 | TODO.md 3 | IDEAS.md -------------------------------------------------------------------------------- /flows/Default.csml: -------------------------------------------------------------------------------- 1 | start: 2 | goto flow diag_20200510 -------------------------------------------------------------------------------- /functions/datetime.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CSML-by-Clevy/covidbot-autodiagnostic/HEAD/functions/datetime.zip -------------------------------------------------------------------------------- /functions/norm_units.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CSML-by-Clevy/covidbot-autodiagnostic/HEAD/functions/norm_units.zip -------------------------------------------------------------------------------- /flows/test_001.csml: -------------------------------------------------------------------------------- 1 | start: 2 | if (done == true) { 3 | remember done = false 4 | goto end 5 | } 6 | remember done = true 7 | // 3.2. Tout patient avec au moins un facteur de gravité majeur 8 | // Reponse : Appelez le 15. 9 | // FIN5 10 | 11 | remember fever = 0 12 | remember temp = 37 13 | remember cough = false 14 | remember agueusia_anosmia = false 15 | remember sore_throat_aches = false 16 | remember diarrhea = false 17 | remember tiredness = false 18 | remember tiredness_details = false 19 | remember feeding_day = false 20 | remember breathlessness = true 21 | remember age = 45 22 | remember size = 183 23 | remember weight = 83 24 | remember heart_disease = 0 25 | remember diabetes = false 26 | remember cancer = false 27 | remember breathing_disease = false 28 | remember kidney_disease = false 29 | remember liver_disease = false 30 | remember pregnant = 0 31 | remember immunosuppressant_disease = 0 32 | remember immunosuppressant_drug = 0 33 | remember postal_code = "92400" 34 | goto flow diag_20200510_algo -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 CSML 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /flows/test_000.csml: -------------------------------------------------------------------------------- 1 | start: 2 | if (done == true) { 3 | remember done = false 4 | goto end 5 | } 6 | remember done = true 7 | 8 | // 3.1 9 | // Patient de moins de 15 ans 10 | // FIN1 11 | // Réponse : Prenez contact avec votre médecin généraliste au moindre doute. 12 | // Cette application n’est pour l’instant pas adaptée aux personnes de moins de 15 ans. En cas d’urgence, appeler le 15. 13 | 14 | remember fever = 0 15 | remember temp = 37 16 | remember cough = false 17 | remember agueusia_anosmia = false 18 | remember sore_throat_aches = false 19 | remember diarrhea = false 20 | remember tiredness = false 21 | remember tiredness_details = false 22 | remember feeding_day = false 23 | remember breathlessness = false 24 | remember age = 14 25 | remember size = 183 26 | remember weight = 83 27 | remember heart_disease = 0 28 | remember diabetes = false 29 | remember cancer = false 30 | remember breathing_disease = false 31 | remember kidney_disease = false 32 | remember liver_disease = false 33 | remember pregnant = 0 34 | remember immunosuppressant_disease = 0 35 | remember immunosuppressant_drug = 0 36 | remember postal_code = "92400" 37 | goto flow diag_20200510_algo -------------------------------------------------------------------------------- /flows/test_002.csml: -------------------------------------------------------------------------------- 1 | start: 2 | if (done == true) { 3 | remember done = false 4 | goto end 5 | } 6 | remember done = true 7 | // Tout patient avec fièvre et toux : 8 | // Tout patient sans facteur pronostique : 9 | // Reponse : Votre situation peut relever d’un COVID 19. 10 | // Demandez une téléconsultation ou un médecin généraliste ou une visite à domicile (SOS médecins, etc.) 11 | // FIN6 12 | 13 | remember fever = 1 14 | remember temp = 38 15 | remember cough = true 16 | remember agueusia_anosmia = false 17 | remember sore_throat_aches = false 18 | remember diarrhea = false 19 | remember tiredness = false 20 | remember tiredness_details = false 21 | remember feeding_day = false 22 | remember breathlessness = false 23 | remember age = 45 24 | remember size = 183 25 | remember weight = 83 26 | remember heart_disease = 0 27 | remember diabetes = false 28 | remember cancer = false 29 | remember breathing_disease = false 30 | remember kidney_disease = false 31 | remember liver_disease = false 32 | remember pregnant = 0 33 | remember immunosuppressant_disease = 0 34 | remember immunosuppressant_drug = 0 35 | remember postal_code = "92400" 36 | goto flow diag_20200510_algo -------------------------------------------------------------------------------- /flows/test_003.csml: -------------------------------------------------------------------------------- 1 | start: 2 | if (done == true) { 3 | remember done = false 4 | goto end 5 | } 6 | remember done = true 7 | // Tout patient avec fièvre et toux : 8 | // Tout patient avec un facteur pronostique ou plus 9 | // Si 0 ou 1 facteurs de gravité mineurs 10 | // Reponse : Votre situation peut relever d’un COVID 19. 11 | // Demandez une téléconsultation ou un médecin généraliste ou une visite à domicile (SOS médecins, etc.) 12 | // FIN6 13 | 14 | remember fever = 1 15 | remember temp = 38 16 | remember cough = true 17 | remember agueusia_anosmia = false 18 | remember sore_throat_aches = false 19 | remember diarrhea = false 20 | remember tiredness = false 21 | remember tiredness_details = false 22 | remember feeding_day = false 23 | remember breathlessness = false 24 | remember age = 45 25 | remember size = 183 26 | remember weight = 83 27 | remember heart_disease = 0 28 | remember diabetes = false 29 | remember cancer = true 30 | remember breathing_disease = false 31 | remember kidney_disease = false 32 | remember liver_disease = false 33 | remember pregnant = 0 34 | remember immunosuppressant_disease = 0 35 | remember immunosuppressant_drug = 0 36 | remember postal_code = "92400" 37 | goto flow diag_20200510_algo -------------------------------------------------------------------------------- /flows/test_011.csml: -------------------------------------------------------------------------------- 1 | start: 2 | if (done == true) { 3 | remember done = false 4 | goto end 5 | } 6 | remember done = true 7 | // 3.5 Tout patient sans fièvre avec un seul symptôme parmi toux, douleurs, anosmie 8 | // Au moins un facteur pronostique 9 | // Reponse : Votre situation peut relever d’un COVID 19. Un avis médical est recommandé. 10 | // Au moindre doute, appelez le 15. Nous vous conseillons de rester à votre domicile. 11 | // FIN7 12 | 13 | remember fever = 0 14 | remember temp = 37 15 | remember cough = true 16 | remember agueusia_anosmia = false 17 | remember sore_throat_aches = false 18 | remember diarrhea = false 19 | remember tiredness = false 20 | remember tiredness_details = false 21 | remember feeding_day = false 22 | remember breathlessness = false 23 | remember age = 45 24 | remember size = 183 25 | remember weight = 83 26 | remember heart_disease = 0 27 | remember diabetes = false 28 | remember cancer = true 29 | remember breathing_disease = false 30 | remember kidney_disease = false 31 | remember liver_disease = false 32 | remember pregnant = false 33 | remember immunosuppressant_disease = 0 34 | remember immunosuppressant_drug = 0 35 | remember postal_code = "92400" 36 | goto flow diag_20200510_algo -------------------------------------------------------------------------------- /flows/test_012.csml: -------------------------------------------------------------------------------- 1 | start: 2 | if (done == true) { 3 | remember done = false 4 | goto end 5 | } 6 | remember done = true 7 | // 3.5 Tout patient sans fièvre avec un seul symptôme parmi toux, douleurs, anosmie 8 | // Pas de facteur pronostique 9 | // Reponse : Votre situation peut relever d’un COVID 19 qu’il faut surveiller. 10 | // Si de nouveaux symptômes apparaissent, refaites le test ou consultez votre médecin. Nous vous conseillons de rester à votre domicile. 11 | // FIN2 12 | 13 | remember fever = 0 14 | remember temp = 37 15 | remember cough = true 16 | remember agueusia_anosmia = false 17 | remember sore_throat_aches = false 18 | remember diarrhea = false 19 | remember tiredness = false 20 | remember tiredness_details = false 21 | remember feeding_day = false 22 | remember breathlessness = false 23 | remember age = 45 24 | remember size = 183 25 | remember weight = 83 26 | remember heart_disease = 0 27 | remember diabetes = false 28 | remember cancer = false 29 | remember breathing_disease = false 30 | remember kidney_disease = false 31 | remember liver_disease = false 32 | remember pregnant = 0 33 | remember immunosuppressant_disease = 0 34 | remember immunosuppressant_drug = 0 35 | remember postal_code = "92400" 36 | goto flow diag_20200510_algo -------------------------------------------------------------------------------- /flows/test_013.csml: -------------------------------------------------------------------------------- 1 | start: 2 | if (done == true) { 3 | remember done = false 4 | goto end 5 | } 6 | remember done = true 7 | // 3.6 Tout patient sans fièvre ni aucun autre symptôme 8 | // Reponse :Votre situation ne relève probablement pas du COVID 19. 9 | // N’hésitez pas à contacter votre médecin en cas de doute. 10 | // Vous pouvez refaire le test en cas de nouveau symptôme pour réévaluer la situation. Pour toute information concernant le COVID 19, composer le 0 800 130 000. 11 | // FIN8 12 | 13 | remember fever = 0 14 | remember temp = 37 15 | remember cough = false 16 | remember agueusia_anosmia = false 17 | remember sore_throat_aches = false 18 | remember diarrhea = false 19 | remember tiredness = false 20 | remember tiredness_details = false 21 | remember feeding_day = false 22 | remember breathlessness = false 23 | remember age = 45 24 | remember size = 183 25 | remember weight = 83 26 | remember heart_disease = 0 27 | remember diabetes = false 28 | remember cancer = false 29 | remember breathing_disease = false 30 | remember kidney_disease = false 31 | remember liver_disease = false 32 | remember pregnant = 0 33 | remember immunosuppressant_disease = 0 34 | remember immunosuppressant_drug = 0 35 | remember postal_code = "92400" 36 | goto flow diag_20200510_algo -------------------------------------------------------------------------------- /flows/test_004.csml: -------------------------------------------------------------------------------- 1 | start: 2 | if (done == true) { 3 | remember done = false 4 | goto end 5 | } 6 | remember done = true 7 | // Tout patient avec fièvre et toux : 8 | // Tout patient avec un facteur pronostique ou plus 9 | // Avec au moins deux facteurs de gravité mineurs 10 | // Reponse :Votre situation peut relever d’un COVID 19. 11 | // Demandez une téléconsultation ou un médecin généraliste ou une visite à domicile. 12 | // Si vous n'arrivez pas à obtenir de consultation, appelez le 15. 13 | // FIN4 14 | 15 | remember fever = 1 16 | remember temp = 39 17 | remember cough = true 18 | remember agueusia_anosmia = false 19 | remember sore_throat_aches = false 20 | remember diarrhea = false 21 | remember tiredness = false 22 | remember tiredness_details = true 23 | remember feeding_day = false 24 | remember breathlessness = false 25 | remember age = 45 26 | remember size = 183 27 | remember weight = 83 28 | remember heart_disease = 0 29 | remember diabetes = false 30 | remember cancer = true 31 | remember breathing_disease = false 32 | remember kidney_disease = false 33 | remember liver_disease = false 34 | remember pregnant = 0 35 | remember immunosuppressant_disease = 0 36 | remember immunosuppressant_drug = 0 37 | remember postal_code = "92400" 38 | goto flow diag_20200510_algo -------------------------------------------------------------------------------- /flows/test_010.csml: -------------------------------------------------------------------------------- 1 | start: 2 | if (done == true) { 3 | remember done = false 4 | goto end 5 | } 6 | remember done = true 7 | // 3.4 Tout patient avec fièvre ou (sans fièvre et avec (diarrhée ou (toux et douleurs) ou (toux et anosmie)) 8 | // Tout patient avec un facteur pronostique ou plus 9 | // Si au moins deux facteurs de gravité mineur 10 | // Reponse : Votre situation peut relever d’un COVID 19. 11 | // Demandez une téléconsultation ou un médecin généraliste ou une visite à domicile. Si vous n'arrivez pas à obtenir de consultation, appelez le 15.. 12 | // FIN4 13 | 14 | remember fever = 0 15 | remember temp = 35 16 | remember cough = true 17 | remember agueusia_anosmia = true 18 | remember sore_throat_aches = false 19 | remember diarrhea = false 20 | remember tiredness = false 21 | remember tiredness_details = true 22 | remember feeding_day = false 23 | remember breathlessness = false 24 | remember age = 45 25 | remember size = 183 26 | remember weight = 83 27 | remember heart_disease = 0 28 | remember diabetes = false 29 | remember cancer = true 30 | remember breathing_disease = false 31 | remember kidney_disease = false 32 | remember liver_disease = false 33 | remember pregnant = false 34 | remember immunosuppressant_disease = 0 35 | remember immunosuppressant_drug = 0 36 | remember postal_code = "92400" 37 | goto flow diag_20200510_algo -------------------------------------------------------------------------------- /flows/test_006.csml: -------------------------------------------------------------------------------- 1 | start: 2 | if (done == true) { 3 | remember done = false 4 | goto end 5 | } 6 | remember done = true 7 | // 3.4 Tout patient avec fièvre ou (sans fièvre et avec (diarrhée ou (toux et douleurs) ou (toux et anosmie)) 8 | // Tout patient sans facteur pronostique 9 | // Si pas de facteur de gravité mineur 10 | // Si moins de 50 ans 11 | // Reponse : Votre situation peut relever d’un COVID 19 qu’il faut surveiller. 12 | // Si de nouveaux symptômes apparaissent, refaites le test ou consultez votre médecin. 13 | // Nous vous conseillons de rester à votre domicile. 14 | // FIN2 15 | 16 | remember fever = 0 17 | remember temp = 37 18 | remember cough = true 19 | remember agueusia_anosmia = true 20 | remember sore_throat_aches = false 21 | remember diarrhea = false 22 | remember tiredness = false 23 | remember tiredness_details = false 24 | remember feeding_day = false 25 | remember breathlessness = false 26 | remember age = 45 27 | remember size = 183 28 | remember weight = 83 29 | remember heart_disease = 0 30 | remember diabetes = false 31 | remember cancer = false 32 | remember breathing_disease = false 33 | remember kidney_disease = false 34 | remember liver_disease = false 35 | remember pregnant = 0 36 | remember immunosuppressant_disease = 0 37 | remember immunosuppressant_drug = 0 38 | remember postal_code = "92400" 39 | goto flow diag_20200510_algo -------------------------------------------------------------------------------- /flows/test_005.csml: -------------------------------------------------------------------------------- 1 | start: 2 | if (done == true) { 3 | remember done = false 4 | goto end 5 | } 6 | remember done = true 7 | // 3.4 Tout patient avec fièvre ou (sans fièvre et avec (diarrhée ou (toux et douleurs) ou (toux et anosmie)) 8 | // Tout patient sans facteur pronostique 9 | // Si pas de facteur de gravité mineur 10 | // Si moins de 50 ans 11 | // Reponse : Votre situation peut relever d’un COVID 19 qu’il faut surveiller. 12 | // Si de nouveaux symptômes apparaissent, refaites le test ou consultez votre médecin. 13 | // Nous vous conseillons de rester à votre domicile. 14 | // FIN2 15 | 16 | remember fever = false 17 | remember temp = 37 18 | remember cough = true 19 | remember agueusia_anosmia = true 20 | remember sore_throat_aches = false 21 | remember diarrhea = false 22 | remember tiredness = false 23 | remember tiredness_details = false 24 | remember feeding_day = false 25 | remember breathlessness = false 26 | remember age = 45 27 | remember size = 183 28 | remember weight = 83 29 | remember heart_disease = false 30 | remember diabetes = false 31 | remember cancer = false 32 | remember breathing_disease = false 33 | remember kidney_disease = false 34 | remember liver_disease = false 35 | remember pregnant = 0 36 | remember immunosuppressant_disease = false 37 | remember immunosuppressant_drug = false 38 | remember postal_code = "92400" 39 | goto flow diag_20200510_algo -------------------------------------------------------------------------------- /flows/test_008.csml: -------------------------------------------------------------------------------- 1 | start: 2 | if (done == true) { 3 | remember done = false 4 | goto end 5 | } 6 | remember done = true 7 | // 3.4 Tout patient avec fièvre ou (sans fièvre et avec (diarrhée ou (toux et douleurs) ou (toux et anosmie)) 8 | // Tout patient sans facteur pronostique 9 | // Sinon (1 ou plusieurs facteurs de gravité mineurs) 10 | // Reponse : Votre situation peut relever d’un COVID 19. 11 | // Demandez une téléconsultation ou un médecin généraliste ou une visite à domicile. 12 | // Appelez le 15 si une gêne respiratoire ou des difficultés importantes pour vous alimenter ou boire apparaissent pendant plus de 24 heures. 13 | // FIN3 14 | 15 | remember fever = 0 16 | remember temp = 37 17 | remember cough = true 18 | remember agueusia_anosmia = true 19 | remember sore_throat_aches = false 20 | remember diarrhea = false 21 | remember tiredness = false 22 | remember tiredness_details = true 23 | remember feeding_day = false 24 | remember breathlessness = false 25 | remember age = 45 26 | remember size = 183 27 | remember weight = 83 28 | remember heart_disease = 0 29 | remember diabetes = false 30 | remember cancer = false 31 | remember breathing_disease = false 32 | remember kidney_disease = false 33 | remember liver_disease = false 34 | remember pregnant = false 35 | remember immunosuppressant_disease = 0 36 | remember immunosuppressant_drug = 0 37 | remember postal_code = "92400" 38 | goto flow diag_20200510_algo -------------------------------------------------------------------------------- /flows/test_009.csml: -------------------------------------------------------------------------------- 1 | start: 2 | if (done == true) { 3 | remember done = false 4 | goto end 5 | } 6 | remember done = true 7 | // 3.4 Tout patient avec fièvre ou (sans fièvre et avec (diarrhée ou (toux et douleurs) ou (toux et anosmie)) 8 | // Tout patient avec un facteur pronostique ou plus 9 | // Si zéro ou un facteur de gravité mineur 10 | // Reponse :Votre situation peut relever d’un COVID 19. 11 | // Demandez une téléconsultation ou un médecin généraliste ou une visite à domicile. 12 | // Appelez le 15 si une gêne respiratoire ou des difficultés importantes pour vous alimenter ou boire apparaissent pendant plus de 24 heures. 13 | // FIN3 14 | 15 | remember fever = 0 16 | remember temp = 37 17 | remember cough = true 18 | remember agueusia_anosmia = true 19 | remember sore_throat_aches = false 20 | remember diarrhea = false 21 | remember tiredness = false 22 | remember tiredness_details = false 23 | remember feeding_day = false 24 | remember breathlessness = false 25 | remember age = 45 26 | remember size = 183 27 | remember weight = 83 28 | remember heart_disease = 0 29 | remember diabetes = false 30 | remember cancer = true 31 | remember breathing_disease = false 32 | remember kidney_disease = false 33 | remember liver_disease = false 34 | remember pregnant = false 35 | remember immunosuppressant_disease = 0 36 | remember immunosuppressant_drug = 0 37 | remember postal_code = "92400" 38 | goto flow diag_20200510_algo -------------------------------------------------------------------------------- /flows/test_007.csml: -------------------------------------------------------------------------------- 1 | start: 2 | if (done == true) { 3 | remember done = false 4 | goto end 5 | } 6 | remember done = true 7 | // 3.4 Tout patient avec fièvre ou (sans fièvre et avec (diarrhée ou (toux et douleurs) ou (toux et anosmie)) 8 | // Tout patient sans facteur pronostique 9 | // Si pas de facteur de gravité mineur 10 | // Si plus de 50 ans 11 | // Reponse : Votre situation peut relever d’un COVID 19. 12 | // Demandez une téléconsultation ou un médecin généraliste ou une visite à domicile. 13 | // Appelez le 15 si une gêne respiratoire ou des difficultés importantes pour vous alimenter ou boire apparaissent pendant plus de 24 heures. 14 | // FIN3 15 | 16 | remember fever = 0 17 | remember temp = 37 18 | remember cough = true 19 | remember agueusia_anosmia = true 20 | remember sore_throat_aches = false 21 | remember diarrhea = false 22 | remember tiredness = false 23 | remember tiredness_details = false 24 | remember feeding_day = false 25 | remember breathlessness = false 26 | remember age = 55 27 | remember size = 183 28 | remember weight = 83 29 | remember heart_disease = 0 30 | remember diabetes = false 31 | remember cancer = false 32 | remember breathing_disease = false 33 | remember kidney_disease = false 34 | remember liver_disease = false 35 | remember pregnant = false 36 | remember immunosuppressant_disease = 0 37 | remember immunosuppressant_drug = 0 38 | remember postal_code = "92400" 39 | goto flow diag_20200510_algo -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Covidbot - Auto diagnotic 2 | 3 | Bot d'information sur le coronavirus réalisé avec le langage open-source CSML - https://www.csml.dev. 4 | 5 | Visitez https://covidbot.clevy.io pour l'essayer ! 6 | 7 | ## Installation 8 | 9 | - Allez sur le site https://studio.csml.dev/auth/register et créez un compte (ou identifiez-vous). 10 | - Importez ce bot 11 | - Modifiez-le comme vous le souhaitez et mettez-le gratuitement à disposition du public sur Messenger, Workplace Chat, Slack, applications mobiles, intranet... 12 | 13 | ## A propos de ce bot 14 | 15 | Ce bot a été réalisé à partir de l'algorithme élaboré en lien avec l’Institut Pasteur et l’Assistance publique des Hôpitaux de Paris. Son contenu a été validé par le Ministère des Solidarités et de la Santé. 16 | 17 | L'algorithme d'orientation est mis à jour sur les recommandations en vigueur au 30/03/2020. Le Chatbot diagnostic n’est pas un dispositif médical, il ne délivre pas d’avis médical. Projet solidaire d'urgence, financé par l’Alliance Digitale contre le COVID-19 : @maladiecovid19 et par Clevy. 18 | 19 | La version officielle et à jour de l'algorithme est diponible ici : https://esante.gouv.fr/algorithme-orientation 20 | 21 | Il a été développé par les équipes de [Clevy](https://www.clevy.io), leader français des chatbots d'entreprise. Son code est rendu accessible à tous dans sa totalité. Vous pouvez télécharger et modifier ce code selon vos souhaits. 22 | 23 | Si vous souhaitez être assistés dans la modification de ce bot pour vos propres besoins (information locale, entreprise, associations), vous pouvez nous contacter sur contact@clevy.io. 24 | 25 | ## IMPORTANT 26 | 27 | Ce bot ne constitue pas un avis médical. 28 | Si vous présentez des symptomes, un numéro vert répond à vos questions sur le Coronavirus COVID-19 en permanence, 24h/24 et 7j/7 : 0 800 130 000. 29 | -------------------------------------------------------------------------------- /bot.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "b5478fd0-dbba-43bd-a6f9-d4d0c4101ed6", 3 | "name": "poepoe", 4 | "description": null, 5 | "default_flow": "Default", 6 | "tags": [], 7 | "flows": [ 8 | { 9 | "name": "Default", 10 | "description": "Default custom flow", 11 | "commands": [], 12 | "tags": [] 13 | }, 14 | { 15 | "name": "diag_20200510", 16 | "commands": [], 17 | "tags": [] 18 | }, 19 | { 20 | "name": "diag_20200510_algo", 21 | "commands": [], 22 | "tags": [] 23 | }, 24 | { 25 | "name": "responses_20200510", 26 | "commands": [], 27 | "tags": [] 28 | }, 29 | { 30 | "name": "test_000", 31 | "commands": [], 32 | "tags": [] 33 | }, 34 | { 35 | "name": "test_001", 36 | "commands": [], 37 | "tags": [] 38 | }, 39 | { 40 | "name": "test_002", 41 | "commands": [], 42 | "tags": [] 43 | }, 44 | { 45 | "name": "test_003", 46 | "commands": [], 47 | "tags": [] 48 | }, 49 | { 50 | "name": "test_004", 51 | "commands": [], 52 | "tags": [] 53 | }, 54 | { 55 | "name": "test_005", 56 | "commands": [], 57 | "tags": [] 58 | }, 59 | { 60 | "name": "test_006", 61 | "commands": [], 62 | "tags": [] 63 | }, 64 | { 65 | "name": "test_007", 66 | "commands": [], 67 | "tags": [] 68 | }, 69 | { 70 | "name": "test_008", 71 | "commands": [], 72 | "tags": [] 73 | }, 74 | { 75 | "name": "test_009", 76 | "commands": [], 77 | "tags": [] 78 | }, 79 | { 80 | "name": "test_010", 81 | "commands": [], 82 | "tags": [] 83 | }, 84 | { 85 | "name": "test_011", 86 | "commands": [], 87 | "tags": [] 88 | }, 89 | { 90 | "name": "test_012", 91 | "commands": [], 92 | "tags": [] 93 | }, 94 | { 95 | "name": "test_013", 96 | "commands": [], 97 | "tags": [] 98 | } 99 | ], 100 | "functions": [ 101 | { 102 | "name": "datetime", 103 | "description": null, 104 | "args": [ 105 | "method=\"now\"" 106 | ], 107 | "import_url": null, 108 | "runtime": "nodejs12.x", 109 | "handler": "index.handler", 110 | "environment": {}, 111 | "app_id": null, 112 | "version": null 113 | }, 114 | { 115 | "name": "norm_units", 116 | "description": null, 117 | "args": [], 118 | "import_url": null, 119 | "runtime": "nodejs10.x", 120 | "handler": "index.handler", 121 | "environment": {}, 122 | "app_id": null, 123 | "version": null 124 | } 125 | ], 126 | "apps": [] 127 | } -------------------------------------------------------------------------------- /flows/responses_20200330.csml: -------------------------------------------------------------------------------- 1 | start: 2 | remember responses_20200510 = { 3 | "FIN1": { 4 | "name": "orientation_moins_de_15_ans", 5 | "content": [ 6 | "Prenez contact avec votre médecin généraliste au moindre doute 👨‍⚕️👩‍⚕️. Cette application n’est pour l’instant pas adaptée aux personnes de moins de 15 ans. En cas d’urgence, **appelez le 15** 📞." 7 | ] 8 | }, 9 | "FIN2": { 10 | "name": "orientation_domicile_surveillance_1", 11 | "content": [ 12 | "⚠️ **Votre situation peut relever d’un COVID 19 qu’il faut surveiller.**", 13 | Typing(2000), 14 | "Si de nouveaux symptômes apparaissent, **refaites le test ou consultez votre médecin**. Nous vous conseillons de rester à votre domicile 🏡." 15 | ] 16 | }, 17 | "FIN3": { 18 | "name": "orientation_consultation_surveillance_1", 19 | "content": [ 20 | "⚠️ **Votre situation peut relever d’un COVID 19.**", 21 | Typing(2000), 22 | "Demandez une **téléconsultation ou un médecin généraliste ou une visite à domicile. 👨‍⚕️👩‍⚕️**", 23 | Typing(2000), 24 | "📞 **Appelez le 15** si une gêne respiratoire ou des difficultés importantes pour vous alimenter ou boire apparaissent pendant plus de 24 heures." 25 | ] 26 | }, 27 | "FIN4": { 28 | "name": "orientation_consultation_surveillance_2", 29 | "content": [ 30 | "⚠️ **Votre situation peut relever d’un COVID 19.**", 31 | Typing(2000), 32 | "Demandez une **téléconsultation ou un médecin généraliste ou une visite à domicile. 👨‍⚕️👩‍⚕️**", 33 | Typing(2000), 34 | "Si vous n’arrivez pas à obtenir de consultation, **appelez le 15** 📞.", 35 | Url("https://maladiecoronavirus.fr/teleconsultation", text="Services de Téléconsultation") 36 | ] 37 | }, 38 | "FIN5": { 39 | "name": "orientation_SAMU", 40 | "content": [ 41 | "🚨 **Appelez le 15, vos symptômes ou antécédents nécessitent un avis rapide**.", 42 | ] 43 | }, 44 | "FIN6": { 45 | "name": "orientation_consultation_surveillance_3", 46 | "content": [ 47 | "⚠️ **Votre situation peut relever d’un COVID 19.**", 48 | Typing(2000), 49 | "Demandez une téléconsultation ou un médecin généraliste ou une visite à domicile (SOS médecins, etc.).", 50 | Url("https://maladiecoronavirus.fr/teleconsultation", text="Services de Téléconsultation"), 51 | Url("https://maladiecoronavirus.fr/permanences", text="Permanences de soins ambulatoires par région (PDSA)") 52 | ] 53 | }, 54 | "FIN7": { 55 | "name": "orientation_consultation_surveillance_4", 56 | "content": [ 57 | "⚠️ Votre situation peut relever d’un COVID 19 qu’il faut surveiller.", 58 | Typing(2000), 59 | "Un avis médical est recommandé. Au moindre doute, appelez le 15. Nous vous conseillons de rester à votre domicile🏡." 60 | ] 61 | }, 62 | "FIN8": { 63 | "name": "orientation_surveillance", 64 | "content": [ 65 | "**Votre situation ne relève probablement pas du Covid-19** ✅ . N’hésitez pas à contacter votre médecin 👨‍⚕️ en cas de doute. Vous pouvez refaire le test en cas de nouveau symptôme pour réévaluer la situation 👨‍⚕️. ", 66 | "Pour toute information concernant le COVID 19, composer le 0 800 130 000." 67 | ] 68 | }, 69 | "ERR": { 70 | "name": "N/A", 71 | "content": [ 72 | "Malheureusement, **nous n'avons pas assez de donnée pour que l'on puisse vous orienter**. Prenez contact avec votre médecin généraliste au moindre doute 👨‍⚕️👩‍⚕️. En cas d’urgence, appeler le 15. 📞" 73 | ] 74 | }, 75 | "FINAL": { 76 | "name": "FINAL", 77 | "content": [ 78 | "Pour vous protéger et protéger les autres, dans la mesure du possible, **restez chez vous** et **limitez les contacts avec d'autres personnes.**", 79 | Typing(2000), 80 | Url("https://covid19-medicaments.com", text="Pour vérifier si un médicament pourrait présenter un risque potentiel d'aggraver vos symptômes"), 81 | Url("https://www.gouvernement.fr/info-coronavirus", text="Vous avez des questions additionnelles, appelez le 0800 130 000, ou suivez l'actualité sur : ") 82 | ] 83 | } 84 | } 85 | 86 | goto end -------------------------------------------------------------------------------- /flows/responses_20200510.csml: -------------------------------------------------------------------------------- 1 | start: 2 | remember responses_20200510 = { 3 | "FIN1": { 4 | "name": "less_15", 5 | "content": [ 6 | "Prenez contact avec votre médecin généraliste au moindre doute 👨‍⚕️👩‍⚕️. Cette application n’est pour l’instant pas adaptée aux personnes de moins de 15 ans. En cas d’urgence, **appelez le 15** 📞." 7 | ] 8 | }, 9 | "FIN2": { 10 | "name": "orientation_domicile_surveillance_1", 11 | "content": [ 12 | "⚠️ **Votre situation peut relever d’un COVID 19.**", 13 | Typing(2000), 14 | "Demandez une téléconsultation ou un médecin généraliste ou une visite à domicile (SOS médecins, etc.)." 15 | ] 16 | }, 17 | "FIN3": { 18 | "name": "consultation_surveillance_1", 19 | "content": [ 20 | "⚠️ **Votre situation peut relever d’un COVID 19.**", 21 | Typing(2000), 22 | "Demandez une **téléconsultation ou un médecin généraliste ou une visite à domicile. 👨‍⚕️👩‍⚕️**", 23 | Typing(2000), 24 | "📞 **Appelez le 15** si une gêne respiratoire ou des difficultés importantes pour vous alimenter ou boire apparaissent pendant plus de 24 heures.", 25 | Typing(2000), 26 | "En attendant et pour casser les chaînes de transmission, nous vous conseillons de vous isoler et de respecter les gestes barrières pour protéger vos proches." 27 | ] 28 | }, 29 | "FIN4": { 30 | "name": "consultation_surveillance_2", 31 | "content": [ 32 | "⚠️ **Votre situation peut relever d’un COVID 19.**", 33 | Typing(2000), 34 | "Demandez une **téléconsultation ou un médecin généraliste ou une visite à domicile. 👨‍⚕️👩‍⚕️**", 35 | Typing(2000), 36 | "Si vous n’arrivez pas à obtenir de consultation, **appelez le 15** 📞.", 37 | Url("https://maladiecoronavirus.fr/teleconsultation", text="Services de Téléconsultation"), 38 | Typing(2000), 39 | "En attendant et pour casser les chaînes de transmission, nous vous conseillons de vous isoler et de respecter les gestes barrières pour protéger vos proches." 40 | ] 41 | }, 42 | "FIN5": { 43 | "name": "SAMU", 44 | "content": [ 45 | "🚨 **Appelez le 15, vos symptômes ou antécédents nécessitent un avis rapide**.", 46 | ] 47 | }, 48 | "FIN6": { 49 | "name": "consultation_surveillance_3", 50 | "content": [ 51 | "⚠️ **Votre situation peut relever d’un COVID 19.**", 52 | Typing(2000), 53 | "Demandez une téléconsultation ou un médecin généraliste ou une visite à domicile (SOS médecins, etc.).", 54 | Url("https://maladiecoronavirus.fr/teleconsultation", text="Services de Téléconsultation"), 55 | Url("https://maladiecoronavirus.fr/permanences", text="Permanences de soins ambulatoires par région (PDSA)"), 56 | Typing(2000), 57 | "En attendant et pour casser les chaînes de transmission, nous vous conseillons de vous isoler et de respecter les gestes barrières pour protéger vos proches." 58 | ] 59 | }, 60 | "FIN7": { 61 | "name": "consultation_surveillance_4", 62 | "content": [ 63 | "⚠️ **Votre situation peut relever d’un COVID 19**.", 64 | Typing(2000), 65 | "Demandez une téléconsultation ou un médecin généraliste. Au moindre doute, appelez le 15.", 66 | Typing(2000), 67 | "En attendant et pour casser les chaînes de transmission, nous vous conseillons de vous isoler et de respecter les gestes barrières pour protéger vos proches." 68 | ] 69 | }, 70 | "FIN8": { 71 | "name": "surveillance", 72 | "content": [ 73 | "**Votre situation ne relève probablement pas du Covid-19** ✅ .", 74 | "N’hésitez pas à contacter votre médecin 👨‍⚕️ en cas de doute. Vous pouvez refaire le test en cas de nouveau symptôme pour réévaluer la situation 👨‍⚕️. ", 75 | "Pour toute information concernant le COVID 19, composer le 0 800 130 000." 76 | ] 77 | }, 78 | "ERR": { 79 | "name": "N/A", 80 | "content": [ 81 | "Malheureusement, **nous n'avons pas assez de donnée pour que l'on puisse vous orienter**. Prenez contact avec votre médecin généraliste au moindre doute 👨‍⚕️👩‍⚕️. En cas d’urgence, appeler le 15. 📞" 82 | ] 83 | }, 84 | "FINAL": { 85 | "name": "FINAL", 86 | "content": [ 87 | "Restez chez vous au maximum en attendant que les symptômes disparaissent. Prenez votre température deux fois par jour. Rappel des mesures d’hygiène. Un dispositif national grand public de soutien psychologique au bénéfice des personnes qui en auraient besoin est accessible via le numéro vert : 0 800 130 000.", 88 | Url("https://www.gouvernement.fr/info-coronavirus", text="Vous avez des questions additionnelles, appelez le 0800 130 000, ou suivez l'actualité sur : ") 89 | ] 90 | } 91 | } 92 | 93 | goto end -------------------------------------------------------------------------------- /flows/diag_20200330_algo.csml: -------------------------------------------------------------------------------- 1 | start: 2 | goto checkResponses 3 | 4 | checkResponses: 5 | if (!responses_20200510) goto flow responses_20200510 6 | goto algo 7 | 8 | algo: 9 | 10 | ////////////////////////////////////////////////////////////// 11 | // Initialisation et calculs des variables /////////////////// 12 | ////////////////////////////////////////////////////////////// 13 | remember algo_version = "2020-03-30" 14 | remember form_version = "2020-04-08" 15 | if (starting_ts && ending_ts) { 16 | remember date = starting_ts.iso 17 | remember duration = ending_ts.unix.to_float() / 1000 - starting_ts.unix.to_float() / 1000 18 | } 19 | 20 | // Calcul des variables de l'algo 21 | // -- age range 22 | if (age < 15) remember age_range = "inf_15" 23 | else if (age >= 15 && age <= 49) remember age_range = "from_15_to_49" 24 | else if (age >= 50 && age <= 69) remember age_range = "from_50_to_69" 25 | else if (age >= 70) remember age_range = "sup_70" 26 | else remember age_range = "N/A" 27 | // -- température 28 | // -- -- calcul de la categorie 29 | if (temp > 0 && temp < 35.5) remember temperature_cat = "inf_35.5" 30 | else if (temp >= 35.5 && temp <= 37.7) remember temperature_cat = "35.5-37.7" 31 | else if (temp > 37.7 && temp < 39) remember temperature_cat = "37.8-38.9" 32 | else if (temp >= 39) remember temperature_cat = "sup_39" 33 | else remember temperature_cat = "NSP" 34 | // -- -- calcul fievre 35 | if (fever == 999 || (fever == 1 && (temperature_cat == "inf_35.5" || temperature_cat == "sup_39" || temperature_cat == "NSP"))) { 36 | remember fever_algo = true 37 | } else remember fever_algo = false 38 | // -- IMC 39 | do sizem = size.to_float() / 100 40 | do sizem2 = sizem.pow(2) 41 | remember imc = weight.to_float() / sizem2 42 | // -- Maladie cardiaque (algo) 43 | if (heart_disease == 1 || heart_disease == 999) remember heart_disease_algo = true 44 | else remember heart_disease_algo = false 45 | // -- Maladie défenses immunitaires (algo) 46 | if (immunosuppressant_disease == 1) remember immunosuppressant_disease_algo = true 47 | else remember immunosuppressant_disease_algo = false 48 | // -- Traitement immunodépresseur (algo) 49 | if (immunosuppressant_drug == 1) remember immunosuppressant_drug_algo = true 50 | else remember immunosuppressant_drug_algo = false 51 | 52 | // Facteurs de gravité mineurs 53 | do fgmineurs = 0 54 | if (temp >= 39) do fgmineurs = fgmineurs + 1 55 | if (temp <= 35.4 && temp > 0) do fgmineurs = fgmineurs + 1 56 | if (tiredness_details == true) do fgmineurs = fgmineurs + 1 57 | 58 | // Facteurs de gravité majeurs 59 | do fgmajeurs = 0 60 | if (breathlessness == true) do fgmajeurs = fgmajeurs + 1 61 | if (feeding_day == true) do fgmajeurs = fgmajeurs + 1 62 | 63 | do hasNoPronosticFactors = (imc <= 30 && 64 | heart_disease_algo == false && 65 | diabetes == false && 66 | cancer == false && 67 | breathing_disease == false && 68 | kidney_disease == false && 69 | liver_disease == false && 70 | pregnant != 1 && 71 | immunosuppressant_disease_algo != true && 72 | immunosuppressant_drug_algo != true) 73 | 74 | ////////////////////////////////////////////////////////////// 75 | // CALCULS DES NIVEAUX DE SYMPTOMES ////////////////////////// 76 | ////////////////////////////////////////////////////////////// 77 | 78 | // Patients avec aucun symptome 79 | if (fever_algo == false && 80 | cough == false && 81 | sore_throat_aches == false && 82 | diarrhea == false && 83 | tiredness == false && 84 | feeding_day == false && 85 | breathlessness == false 86 | ) do symptomsLevel = 0 87 | 88 | // Tout patient sans fièvre avec un seul symptôme parmi toux, douleurs, anosmie 89 | if (fever_algo == false && 90 | (cough == true && sore_throat_aches == false && agueusia_anosmia == false) || 91 | (cough == false && sore_throat_aches == true && agueusia_anosmia == false) || 92 | (cough == false && sore_throat_aches == false && agueusia_anosmia == true)) { 93 | do symptomsLevel = 1 94 | } 95 | 96 | // Tout patient avec 97 | // - fièvre 98 | // - ou sans fièvre et avec 99 | // ---- diarrhée 100 | // ---- ou toux et douleurs 101 | // ---- ou toux et anosmie 102 | if (fever_algo == true || 103 | (cough == true && sore_throat_aches == true) || 104 | (cough == true && agueusia_anosmia == true) || 105 | (diarrhea == true) 106 | ) do symptomsLevel = 2 107 | 108 | // Tout patient avec fièvre et toux : 109 | if (temp > 37.7 && cough == true) do symptomsLevel = 3 110 | 111 | 112 | 113 | ////////////////////////////////////////////////////////////// 114 | // CALCULS CAS UNIQUES /////////////////////////////////////// 115 | // SELON SYMPTOMES & FACTEURS GRAVITÉ //////////////////////// 116 | ////////////////////////////////////////////////////////////// 117 | 118 | if (age < 15) { 119 | // say "FIN1" 120 | remember orientation = responses_20200510.FIN1.name 121 | foreach (message) in responses_20200510.FIN1.content { 122 | say message 123 | } 124 | goto final 125 | } 126 | 127 | // Tout patient avec au moins un facteur de gravité majeur 128 | if (fgmajeurs > 0) { 129 | // say "FIN5" 130 | remember orientation = responses_20200510.FIN5.name 131 | foreach (message) in responses_20200510.FIN5.content { 132 | say message 133 | } 134 | goto final 135 | 136 | } 137 | 138 | // Tout patient avec fièvre et toux : 139 | if (symptomsLevel == 3) { 140 | // Tout patient sans facteur pronostique 141 | if (hasNoPronosticFactors == true) { 142 | // say "FIN6" 143 | remember orientation = responses_20200510.FIN6.name 144 | foreach (message) in responses_20200510.FIN6.content { 145 | say message 146 | } 147 | goto final 148 | } 149 | // Tout patient avec un facteur pronostique ou plus 150 | if (hasNoPronosticFactors == false) { 151 | // Si un ou deux facteurs de gravité mineurs 152 | if (fgmineurs <= 1) { 153 | // say "FIN6" 154 | remember orientation = responses_20200510.FIN6.name 155 | foreach (message) in responses_20200510.FIN6.content { 156 | say message 157 | } 158 | goto final 159 | } 160 | // Avec au moins deux facteurs de gravité mineurs 161 | if (fgmineurs > 1) { 162 | // say "FIN4" 163 | remember orientation = responses_20200510.FIN4.name 164 | foreach (message) in responses_20200510.FIN4.content { 165 | say message 166 | } 167 | goto final 168 | } 169 | } 170 | } 171 | 172 | // SI fièvre OU (pas de fièvre et (diarrhée OU (toux ET douleurs) OU (toux ET anosmie)) 173 | if (symptomsLevel == 2) { 174 | // Tout patient sans facteur pronostique 175 | if (hasNoPronosticFactors == true) { 176 | // Si pas de facteur de gravité mineur 177 | if (fgmineurs == 0) { 178 | // Si moins de 50 ans 179 | if (age < 50) { 180 | // say "FIN2" 181 | remember orientation = responses_20200510.FIN2.name 182 | foreach (message) in responses_20200510.FIN2.content { 183 | say message 184 | } 185 | goto final 186 | } else { 187 | // say "FIN3a" 188 | remember orientation = responses_20200510.FIN3.name 189 | foreach (message) in responses_20200510.FIN3.content { 190 | say message 191 | } 192 | goto final 193 | } 194 | } 195 | // Sinon (1 ou plusieurs facteurs de gravité mineurs) 196 | else if (fgmineurs >= 1) { 197 | // say "FIN3b" 198 | remember orientation = responses_20200510.FIN3.name 199 | foreach (message) in responses_20200510.FIN3.content { 200 | say message 201 | } 202 | goto final 203 | } 204 | } 205 | // Tout patient avec un facteur pronostique ou plus 206 | if (hasNoPronosticFactors == false) { 207 | // Si zéro ou un facteur de gravité mineur 208 | if (fgmineurs < 2) { 209 | // say "FIN3c" 210 | remember orientation = responses_20200510.FIN3.name 211 | foreach (message) in responses_20200510.FIN3.content { 212 | say message 213 | } 214 | goto final 215 | } 216 | // Au moins deux facteurs de gravité mineurs 217 | if (fgmineurs >= 2) { 218 | // say "FIN4" 219 | remember orientation = responses_20200510.FIN4.name 220 | foreach (message) in responses_20200510.FIN4.content { 221 | say message 222 | } 223 | goto final 224 | } 225 | } 226 | } 227 | 228 | // Tout patient sans fièvre avec un seul symptôme parmi toux, douleurs, anosmie 229 | if (symptomsLevel == 1) { 230 | // Au moins un facteur pronostique 231 | if (hasNoPronosticFactors == true) { 232 | // say "FIN2" 233 | remember orientation = responses_20200510.FIN2.name 234 | foreach (message) in responses_20200510.FIN2.content { 235 | say message 236 | } 237 | goto final 238 | } else { 239 | // say "FIN7" 240 | remember orientation = responses_20200510.FIN7.name 241 | foreach (message) in responses_20200510.FIN7.content { 242 | say message 243 | } 244 | goto final 245 | } 246 | } 247 | 248 | // Patients avec aucun symptome 249 | if (symptomsLevel == 0) { 250 | // say "FIN8" 251 | remember orientation = responses_20200510.FIN8.name 252 | foreach (message) in responses_20200510.FIN8.content { 253 | say message 254 | } 255 | goto final 256 | } 257 | 258 | // Cette phrase est appelée lorsque le cas n'est pas couvert par l'algorithme 259 | foreach (message) in responses_20200510.ERR.content { 260 | say message 261 | } 262 | goto final 263 | 264 | final: 265 | // say "Restez chez vous au maximum en attendant que les symptômes disparaissent. Prenez votre température deux fois par jour. Rappel des mesures d’hygiène." 266 | foreach (message) in responses_20200510.FINAL.content { 267 | say message 268 | } 269 | 270 | // Liste des variables connues en fin d'algo 271 | /*say "algo_version : {{algo_version}}" 272 | say "form_version : {{form_version}}" 273 | say "date : {{date}}" 274 | say "postal_code : {{postal_code}}" 275 | say "orientation : {{orientation}}" 276 | say "duration : {{duration}}" 277 | say "imc : {{imc}}" 278 | say "temperature_cat : {{temperature_cat}}" 279 | say "fever_algo : {{fever_algo}}" 280 | say "heart_disease_algo : {{heart_disease_algo}}" 281 | say "fever : {{fever}}" 282 | say "temp : {{temp}}" 283 | say "cough : {{cough}}" 284 | say "agueusia_anosmia : {{agueusia_anosmia}}" 285 | say "sore_throat_aches : {{sore_throat_aches}}" 286 | say "diarrhea : {{diarrhea}}" 287 | say "tiredness : {{tiredness}}" 288 | say "tiredness_details : {{tiredness_details}}" 289 | say "feeding_day : {{feeding_day}}" 290 | say "breathlessness : {{breathlessness}}" 291 | say "age : {{age}}" 292 | say "age_range : {{age_range}}" 293 | say "size : {{size}}" 294 | say "weight : {{weight}}" 295 | say "heart_disease : {{heart_disease}}" 296 | say "diabetes : {{diabetes}}" 297 | say "cancer : {{cancer}}" 298 | say "breathing_disease : {{breathing_disease}}" 299 | say "kidney_disease : {{kidney_disease}}" 300 | say "liver_disease : {{liver_disease}}" 301 | say "pregnant : {{pregnant}}" 302 | say "immunosuppressant_disease : {{immunosuppressant_disease}}" 303 | say "immunosuppressant_drug : {{immunosuppressant_drug}}" 304 | say "immunosuppressant_drug_algo : {{immunosuppressant_drug_algo}}" 305 | say "immunosuppressant_disease_algo : {{immunosuppressant_disease_algo}}" 306 | */ 307 | 308 | goto end 309 | -------------------------------------------------------------------------------- /flows/diag_20200510_algo.csml: -------------------------------------------------------------------------------- 1 | start: 2 | goto checkResponses 3 | 4 | checkResponses: 5 | if (!responses_20200510) goto flow responses_20200510 6 | goto algo 7 | 8 | algo: 9 | 10 | ////////////////////////////////////////////////////////////// 11 | // Initialisation et calculs des variables /////////////////// 12 | ////////////////////////////////////////////////////////////// 13 | remember algo_version = "2020-05-10" 14 | remember form_version = "2020-05-16" 15 | if (starting_ts && ending_ts) { 16 | remember date = starting_ts.iso 17 | remember duration = ending_ts.unix.to_float() / 1000 - starting_ts.unix.to_float() / 1000 18 | } 19 | 20 | // Calcul des variables de l'algo 21 | // -- age range 22 | if (age < 15) remember age_range = "inf_15" 23 | else if (age >= 15 && age <= 49) remember age_range = "from_15_to_49" 24 | else if (age >= 50 && age <= 64) remember age_range = "from_50_to_64" 25 | else if (age >= 65) remember age_range = "sup_65" 26 | else remember age_range = "N/A" 27 | // -- température 28 | // -- -- calcul de la categorie 29 | if (temp > 0 && temp < 35.5) remember temperature_cat = "inf_35.5" 30 | else if (temp >= 35.5 && temp <= 37.7) remember temperature_cat = "35.5-37.7" 31 | else if (temp > 37.7 && temp < 39) remember temperature_cat = "37.8-38.9" 32 | else if (temp >= 39) remember temperature_cat = "sup_39" 33 | else remember temperature_cat = "NSP" 34 | // -- -- calcul fievre 35 | if (fever == 999 || (fever == 1 && (temperature_cat == "inf_35.5" || temperature_cat == "sup_39" || temperature_cat == "NSP"))) { 36 | remember fever_algo = true 37 | } else remember fever_algo = false 38 | // -- IMC 39 | do sizem = size.to_float() / 100 40 | do sizem2 = sizem.pow(2) 41 | remember imc = weight.to_float() / sizem2 42 | // -- Maladie cardiaque (algo) 43 | if (heart_disease == 1 || heart_disease == 999) remember heart_disease_algo = true 44 | else remember heart_disease_algo = false 45 | // -- Maladie défenses immunitaires (algo) 46 | if (immunosuppressant_disease == 1) remember immunosuppressant_disease_algo = true 47 | else remember immunosuppressant_disease_algo = false 48 | // -- Traitement immunodépresseur (algo) 49 | if (immunosuppressant_drug == 1) remember immunosuppressant_drug_algo = true 50 | else remember immunosuppressant_drug_algo = false 51 | 52 | // Facteurs de gravité mineurs 53 | do fgmineurs = 0 54 | if (temp >= 39) do fgmineurs = fgmineurs + 1 55 | if (temp <= 35.4 && temp > 0) do fgmineurs = fgmineurs + 1 56 | if (tiredness_details == true) do fgmineurs = fgmineurs + 1 57 | 58 | // Facteurs de gravité majeurs 59 | do fgmajeurs = 0 60 | if (breathlessness == true) do fgmajeurs = fgmajeurs + 1 61 | if (feeding_day == true) do fgmajeurs = fgmajeurs + 1 62 | 63 | do hasNoPronosticFactors = (imc < 30 && 64 | heart_disease_algo == false && 65 | diabetes == false && 66 | cancer == false && 67 | breathing_disease == false && 68 | kidney_disease == false && 69 | liver_disease == false && 70 | pregnant != 1 && 71 | immunosuppressant_disease_algo != true && 72 | immunosuppressant_drug_algo != true && 73 | age < 65) 74 | 75 | ////////////////////////////////////////////////////////////// 76 | // CALCULS DES NIVEAUX DE SYMPTOMES ////////////////////////// 77 | ////////////////////////////////////////////////////////////// 78 | 79 | // Patients avec aucun symptome 80 | if (fever_algo == false && 81 | cough == false && 82 | sore_throat_aches == false && 83 | diarrhea == false && 84 | tiredness == false && 85 | feeding_day == false && 86 | breathlessness == false 87 | ) do symptomsLevel = 0 88 | 89 | // Tout patient sans fièvre avec un seul symptôme parmi toux, douleurs, anosmie 90 | if (fever_algo == false && 91 | (cough == true && sore_throat_aches == false && agueusia_anosmia == false) || 92 | (cough == false && sore_throat_aches == true && agueusia_anosmia == false) || 93 | (cough == false && sore_throat_aches == false && agueusia_anosmia == true)) { 94 | do symptomsLevel = 1 95 | } 96 | 97 | // Tout patient avec 98 | // - fièvre 99 | // - ou sans fièvre et avec 100 | // ---- diarrhée 101 | // ---- ou toux et douleurs 102 | // ---- ou toux et anosmie 103 | if (fever_algo == true || 104 | (cough == true && sore_throat_aches == true) || 105 | (cough == true && agueusia_anosmia == true) || 106 | (sore_throat_aches == true && agueusia_anosmia == true) || 107 | (diarrhea == true) 108 | ) do symptomsLevel = 2 109 | 110 | // Tout patient avec fièvre et toux : 111 | if (fever_algo == true && cough == true) do symptomsLevel = 3 112 | 113 | 114 | 115 | ////////////////////////////////////////////////////////////// 116 | // CALCULS CAS UNIQUES /////////////////////////////////////// 117 | // SELON SYMPTOMES & FACTEURS GRAVITÉ //////////////////////// 118 | ////////////////////////////////////////////////////////////// 119 | 120 | if (age < 15) { 121 | // say "FIN1" 122 | remember orientation = responses_20200510.FIN1.name 123 | foreach (message) in responses_20200510.FIN1.content { 124 | say message 125 | } 126 | goto final 127 | } 128 | 129 | // Tout patient avec au moins un facteur de gravité majeur 130 | if (fgmajeurs > 0) { 131 | // say "FIN5" 132 | remember orientation = responses_20200510.FIN5.name 133 | foreach (message) in responses_20200510.FIN5.content { 134 | say message 135 | } 136 | goto final 137 | 138 | } 139 | 140 | // Tout patient avec fièvre et toux : 141 | if (symptomsLevel == 3) { 142 | // Tout patient sans facteur pronostique 143 | if (hasNoPronosticFactors == true) { 144 | // say "FIN6" 145 | remember orientation = responses_20200510.FIN6.name 146 | foreach (message) in responses_20200510.FIN6.content { 147 | say message 148 | } 149 | goto final 150 | } 151 | // Tout patient avec un facteur pronostique ou plus 152 | if (hasNoPronosticFactors == false) { 153 | // Si un ou deux facteurs de gravité mineurs 154 | if (fgmineurs <= 1) { 155 | // say "FIN6" 156 | remember orientation = responses_20200510.FIN6.name 157 | foreach (message) in responses_20200510.FIN6.content { 158 | say message 159 | } 160 | goto final 161 | } 162 | // Avec au moins deux facteurs de gravité mineurs 163 | if (fgmineurs > 1) { 164 | // say "FIN4" 165 | remember orientation = responses_20200510.FIN4.name 166 | foreach (message) in responses_20200510.FIN4.content { 167 | say message 168 | } 169 | goto final 170 | } 171 | } 172 | } 173 | 174 | // SI fièvre OU (pas de fièvre et (diarrhée OU (toux ET douleurs) OU (toux ET anosmie)) 175 | if (symptomsLevel == 2) { 176 | // Tout patient sans facteur pronostique 177 | if (hasNoPronosticFactors == true) { 178 | // Si pas de facteur de gravité mineur 179 | if (fgmineurs == 0) { 180 | // Si moins de 50 ans 181 | if (age < 50) { 182 | // say "FIN6" 183 | remember orientation = responses_20200510.FIN6.name 184 | foreach (message) in responses_20200510.FIN6.content { 185 | say message 186 | } 187 | goto final 188 | } else { 189 | // say "FIN3a" 190 | remember orientation = responses_20200510.FIN3.name 191 | foreach (message) in responses_20200510.FIN3.content { 192 | say message 193 | } 194 | goto final 195 | } 196 | } 197 | // Sinon (1 ou plusieurs facteurs de gravité mineurs) 198 | else if (fgmineurs >= 1) { 199 | // say "FIN3b" 200 | remember orientation = responses_20200510.FIN3.name 201 | foreach (message) in responses_20200510.FIN3.content { 202 | say message 203 | } 204 | goto final 205 | } 206 | } 207 | // Tout patient avec un facteur pronostique ou plus 208 | if (hasNoPronosticFactors == false) { 209 | // Si zéro ou un facteur de gravité mineur 210 | if (fgmineurs < 2) { 211 | // say "FIN3c" 212 | remember orientation = responses_20200510.FIN3.name 213 | foreach (message) in responses_20200510.FIN3.content { 214 | say message 215 | } 216 | goto final 217 | } 218 | // Au moins deux facteurs de gravité mineurs 219 | if (fgmineurs >= 2) { 220 | // say "FIN4" 221 | remember orientation = responses_20200510.FIN4.name 222 | foreach (message) in responses_20200510.FIN4.content { 223 | say message 224 | } 225 | goto final 226 | } 227 | } 228 | } 229 | 230 | // Tout patient sans fièvre avec un seul symptôme parmi toux, douleurs, anosmie 231 | if (symptomsLevel == 1) { 232 | // Au moins un facteur pronostique 233 | if (hasNoPronosticFactors == true) { 234 | // say "FIN6" 235 | remember orientation = responses_20200510.FIN6.name 236 | foreach (message) in responses_20200510.FIN6.content { 237 | say message 238 | } 239 | goto final 240 | } else { 241 | // say "FIN7" 242 | remember orientation = responses_20200510.FIN7.name 243 | foreach (message) in responses_20200510.FIN7.content { 244 | say message 245 | } 246 | goto final 247 | } 248 | } 249 | 250 | // Patients avec aucun symptome 251 | if (symptomsLevel == 0) { 252 | // say "FIN8" 253 | remember orientation = responses_20200510.FIN8.name 254 | foreach (message) in responses_20200510.FIN8.content { 255 | say message 256 | } 257 | goto final 258 | } 259 | 260 | // Cette phrase est appelée lorsque le cas n'est pas couvert par l'algorithme 261 | foreach (message) in responses_20200510.ERR.content { 262 | say message 263 | } 264 | goto final 265 | 266 | final: 267 | // say "Restez chez vous au maximum en attendant que les symptômes disparaissent. Prenez votre température deux fois par jour. Rappel des mesures d’hygiène." 268 | foreach (message) in responses_20200510.FINAL.content { 269 | say message 270 | } 271 | 272 | // Liste des variables connues en fin d'algo 273 | /*say "algo_version : {{algo_version}}" 274 | say "form_version : {{form_version}}" 275 | say "date : {{date}}" 276 | say "postal_code : {{postal_code}}" 277 | say "orientation : {{orientation}}" 278 | say "duration : {{duration}}" 279 | say "imc : {{imc}}" 280 | say "temperature_cat : {{temperature_cat}}" 281 | say "fever_algo : {{fever_algo}}" 282 | say "heart_disease_algo : {{heart_disease_algo}}" 283 | say "fever : {{fever}}" 284 | say "temp : {{temp}}" 285 | say "cough : {{cough}}" 286 | say "agueusia_anosmia : {{agueusia_anosmia}}" 287 | say "sore_throat_aches : {{sore_throat_aches}}" 288 | say "diarrhea : {{diarrhea}}" 289 | say "tiredness : {{tiredness}}" 290 | say "tiredness_details : {{tiredness_details}}" 291 | say "feeding_day : {{feeding_day}}" 292 | say "breathlessness : {{breathlessness}}" 293 | say "age : {{age}}" 294 | say "age_range : {{age_range}}" 295 | say "size : {{size}}" 296 | say "weight : {{weight}}" 297 | say "heart_disease : {{heart_disease}}" 298 | say "diabetes : {{diabetes}}" 299 | say "cancer : {{cancer}}" 300 | say "breathing_disease : {{breathing_disease}}" 301 | say "kidney_disease : {{kidney_disease}}" 302 | say "liver_disease : {{liver_disease}}" 303 | say "pregnant : {{pregnant}}" 304 | say "immunosuppressant_disease : {{immunosuppressant_disease}}" 305 | say "immunosuppressant_drug : {{immunosuppressant_drug}}" 306 | say "immunosuppressant_drug_algo : {{immunosuppressant_drug_algo}}" 307 | say "immunosuppressant_disease_algo : {{immunosuppressant_disease_algo}}" 308 | */ 309 | 310 | goto end 311 | -------------------------------------------------------------------------------- /flows/diag_20200510.csml: -------------------------------------------------------------------------------- 1 | start: 2 | say "Bienvenue sur le test **d'autodiagnostic COVID-19**, réalisé en partenariat avec **l'Institut Pasteur**, **l'AP-HP** et le **Ministère de la santé**." 3 | say Typing(2000) 4 | say "⚠️ Attention, ce site d’information **n’est pas un dispositif médical**, il ne délivre pas d’avis médical." 5 | say Typing(2000) 6 | say "**Avant de commencer, veuillez lire le préambule à l'utilisation du service :**" 7 | say Url("https://bit.ly/préambule") 8 | say Typing(2000) 9 | say Question( 10 | "**« Je reconnais avoir lu le préambule et souhaite démarrer le test »**", 11 | buttons=[ 12 | Button("Oui", accepts=["oui", "yes", "Yes", "Ouais", "ouais"]) as btnyes, 13 | Button("Non", accepts=["non", "no", "Nope", "nope", "No", "Pas du tout"]) as btnno 14 | ] 15 | ) 16 | hold 17 | if (event match btnyes) { 18 | say "Allons-y." 19 | say Typing (2000) 20 | remember starting_ts = Fn("datetime", method="now") 21 | goto q1 22 | } else { 23 | say Question( 24 | "C'est noté. Bonne journée ! 🙂", 25 | buttons=[Button("Recommencer")] 26 | ) 27 | hold 28 | goto start 29 | } 30 | goto end 31 | 32 | 33 | q1: 34 | say Question( 35 | "**1/21** : Pensez-vous avoir eu de la fièvre ces derniers jours (frissons, sueurs) ?", 36 | buttons=[ 37 | Button("Oui", accepts=["oui", "yes", "Yes", "Ouais", "ouais"]) as btnyes, 38 | Button("Non", accepts=["non", "no", "Nope", "nope", "No", "Pas du tout"]) as btnno, 39 | Button("Ne sait pas", accepts=["ne sait pas", "ne sais pas", "Ne sais pas", "Je ne sais pas", "je ne sais pas", "ne sais pas"]) as btnnsp 40 | ]) 41 | hold 42 | if (event match btnyes) { 43 | remember fever = 1 44 | goto q1bis 45 | } else if (event match btnnsp) { 46 | remember fever = 999 47 | goto q2 48 | } else if (event match btnno) { 49 | remember fever = 0 50 | remember temp = 0 51 | goto q2 52 | } else { 53 | say "Veuillez s'il vous plaît cliquer sur un des boutons." 54 | goto q1 55 | } 56 | 57 | q1bis: 58 | say "**1bis/21** : Quelle est votre température corporelle (ex: 38) ?" 59 | hold 60 | do Fn("norm_units", string=event) as parsedTemp 61 | if (!parsedTemp) { 62 | say "Veuillez saisir une température valide." 63 | goto q1bis 64 | } 65 | if (parsedTemp.is_number() && parsedTemp >= 34 && parsedTemp <= 42) { 66 | remember temp = parsedTemp 67 | goto q2 68 | } else { 69 | say "Veuillez saisir une température valide, entre 34 et 42 degrés." 70 | goto q1bis 71 | } 72 | 73 | q2: 74 | say Question( 75 | "**2/21** : Avez-vous **une toux ou une augmentation de votre toux** habituelle ces derniers jours ?", 76 | buttons=[ 77 | Button("Oui", accepts=["oui", "yes", "Yes", "Ouais", "ouais"]) as btnyes, 78 | Button("Non", accepts=["non", "no", "Nope", "nope", "No", "Pas du tout"]) as btnno 79 | ]) 80 | hold 81 | if (event match btnyes) { 82 | remember cough = true 83 | goto q3 84 | } else if (event match btnno) { 85 | remember cough = false 86 | goto q3 87 | } else { 88 | say "Veuillez s'il vous plaît cliquer sur un des boutons." 89 | goto q2 90 | } 91 | 92 | q3: 93 | say Question( 94 | "**3/21** : Ces derniers jours, avez-vous noté une **forte diminution ou perte de votre goût ou de votre odorat** ?", 95 | buttons=[ 96 | Button("Oui", accepts=["oui", "yes", "Yes", "Ouais", "ouais"]) as btnyes, 97 | Button("Non", accepts=["non", "no", "Nope", "nope", "No", "Pas du tout"]) as btnno 98 | ]) 99 | hold 100 | if (event match btnyes) { 101 | remember agueusia_anosmia = true 102 | goto q4 103 | } else if (event match btnno) { 104 | remember agueusia_anosmia = false 105 | goto q4 106 | } else { 107 | say "Veuillez s'il vous plaît cliquer sur un des boutons" 108 | goto q3 109 | } 110 | 111 | 112 | q4: 113 | say Question( 114 | "**4/21** : Avez-vous un **mal de gorge** ou des **douleurs musculaires** ou des **courbatures** inhabituelles ces derniers jours ?", 115 | buttons=[ 116 | Button("Oui", accepts=["oui", "yes", "Yes", "Ouais", "ouais"]) as btnyes, 117 | Button("Non", accepts=["non", "no", "Nope", "nope", "No", "Pas du tout"]) as btnno 118 | ]) 119 | hold 120 | if (event match btnyes) { 121 | remember sore_throat_aches = true 122 | goto q5 123 | } else if (event match btnno) { 124 | remember sore_throat_aches = false 125 | goto q5 126 | } else { 127 | say "Veuillez s'il vous plaît cliquer sur un des boutons" 128 | goto q4 129 | } 130 | 131 | q5: 132 | say Question( 133 | "**5/21** : Ces dernières 24 heures, avez-vous de la **diarrhée** ? Avec au moins 3 selles molles.", 134 | buttons=[ 135 | Button("Oui", accepts=["oui", "yes", "Yes", "Ouais", "ouais"]) as btnyes, 136 | Button("Non", accepts=["non", "no", "Nope", "nope", "No", "Pas du tout"]) as btnno 137 | ]) 138 | hold 139 | if (event match btnyes) { 140 | remember diarrhea = true 141 | goto q6 142 | } else if (event match btnno) { 143 | remember diarrhea = false 144 | goto q6 145 | } else { 146 | say "Veuillez s'il vous plaît cliquer sur un des boutons" 147 | goto q5 148 | } 149 | 150 | q6: 151 | say Question( 152 | "**6/21** : Ces derniers jours, avez-vous une **fatigue inhabituelle** ?", 153 | buttons=[ 154 | Button("Oui", accepts=["oui", "yes", "Yes", "Ouais", "ouais"]) as btnyes, 155 | Button("Non", accepts=["non", "no", "Nope", "nope", "No", "Pas du tout"]) as btnno 156 | ]) 157 | hold 158 | if (event match btnyes) { 159 | remember tiredness = true 160 | goto q6bis 161 | } else if (event match btnno) { 162 | remember tiredness = false 163 | remember tiredness_details = false 164 | goto q7 165 | } else { 166 | say "Veuillez s'il vous plaît cliquer sur un des boutons" 167 | goto q6 168 | } 169 | 170 | q6bis: 171 | say Question( 172 | "**6bis/21** : Cette fatigue vous oblige-t-elle à vous reposer plus de la moitié de la journée ?", 173 | buttons=[ 174 | Button("Oui", accepts=["oui", "yes", "Yes", "Ouais", "ouais"]) as btnyes, 175 | Button("Non", accepts=["non", "no", "Nope", "nope", "No", "Pas du tout"]) as btnno 176 | ]) 177 | hold 178 | if (event match btnyes) { 179 | remember tiredness_details = true 180 | goto q7 181 | } else if (event match btnno) { 182 | remember tiredness_details = false 183 | goto q7 184 | } else { 185 | say "Veuillez s'il vous plaît cliquer sur un des boutons" 186 | goto q6bis 187 | } 188 | 189 | q7: 190 | say Question( 191 | "**7/21** : Êtes vous dans l'impossibilité de vous alimenter ou de boire **DEPUIS 24 HEURES OU PLUS** ?", 192 | buttons=[ 193 | Button("Oui", accepts=["oui", "yes", "Yes", "Ouais", "ouais"]) as btnyes, 194 | Button("Non", accepts=["non", "no", "Nope", "nope", "No", "Pas du tout"]) as btnno 195 | ]) 196 | hold 197 | if (event match btnyes) { 198 | remember feeding_day = true 199 | goto q8 200 | } else if (event match btnno) { 201 | remember feeding_day = false 202 | goto q8 203 | } else { 204 | say "Veuillez s'il vous plaît cliquer sur un des boutons" 205 | goto q7 206 | } 207 | 208 | q8: 209 | say Question( 210 | "**8/21** : Dans les dernières 24 heures, avez-vous noté un **manque de souffle INHABITUEL** lorsque vous parlez ou faites un petit effort ?", 211 | buttons=[ 212 | Button("Oui", accepts=["oui", "yes", "Yes", "Ouais", "ouais"]) as btnyes, 213 | Button("Non", accepts=["non", "no", "Nope", "nope", "No", "Pas du tout"]) as btnno 214 | ]) 215 | hold 216 | if (event match btnyes) { 217 | remember breathlessness = true 218 | goto q9 219 | } else if (event match btnno) { 220 | remember breathlessness = false 221 | goto q9 222 | } else { 223 | say "Veuillez s'il vous plaît cliquer sur un des boutons" 224 | goto q8 225 | } 226 | 227 | q9: 228 | say "**9/21** : Quel est votre âge ? Ceci, afin de calculer un facteur de risque spécifique (ex: 28)." 229 | hold 230 | do Fn("norm_units", string=event) as parsedAge 231 | if (!parsedAge) { 232 | say "Veuillez saisir un age valide." 233 | goto q9 234 | } 235 | if (parsedAge.is_number() && parsedAge > 15 && parsedAge <= 110) { 236 | remember age = parsedAge 237 | goto q10 238 | } else if (parsedAge <= 15 && parsedAge >= 0) { 239 | say "Cette application n’est pas faite pour les personnes de moins de 15 ans. Prenez contact avec votre médecin généraliste au moindre doute. En cas d’urgence, appelez le 15." 240 | goto end 241 | } else { 242 | say "Veuillez saisir un age valide." 243 | goto q9 244 | } 245 | 246 | q10: 247 | say "**10/21** : Quel est votre **taille** en centimètres (ex: 175) ? Afin de calculer l’indice de masse corporelle qui est un facteur influençant le risque de complications de l’infection." 248 | hold 249 | do Fn("norm_units", string=event) as parsedSize 250 | if (!parsedSize) { 251 | say "Veuillez saisir une taille valide, entre 80 et 250 cm." 252 | goto q10 253 | } 254 | if (parsedSize < 10) do normSize = parsedSize * 100 255 | else do normSize = parsedSize 256 | if (normSize.is_number() && normSize >= 80 && normSize <= 250) { 257 | remember size = normSize 258 | goto q11 259 | } else { 260 | say "Veuillez saisir une taille valide, entre 80 et 250 cm." 261 | goto q10 262 | } 263 | 264 | q11: 265 | say "**11/21** : Quel est votre **poids** en kilogrammes (ex: 84) ? Afin de calculer l’indice de masse corporelle qui est un facteur influençant le risque de complications de l’infection. " 266 | hold 267 | do Fn("norm_units", string=event) as parsedWeight 268 | if (!parsedWeight) { 269 | say "Veuillez saisir un poids valide, entre 20 et 250 kg." 270 | goto q11 271 | } 272 | if (parsedWeight.is_number() && parsedWeight >= 20 && parsedWeight <= 250) { 273 | remember weight = parsedWeight 274 | goto q12 275 | } else { 276 | say "Veuillez saisir un poids valide, entre 20 et 250 kg." 277 | goto q11 278 | } 279 | 280 | q12: 281 | say Question( 282 | "**12/21** : Avez-vous de **l’hypertension artérielle** mal équilibrée ? Ou avez-vous une **maladie cardiaque ou vasculaire** ? Ou prenez-vous un **traitement à visée cardiologique** ?", 283 | buttons=[ 284 | Button("Oui", accepts=["oui", "yes", "Yes", "Ouais", "ouais"]) as btnyes, 285 | Button("Non", accepts=["non", "no", "Nope", "nope", "No", "Pas du tout"]) as btnno, 286 | Button("Ne sait pas", accepts=["ne sait pas", "ne sais pas", "Ne sais pas", "Je ne sais pas", "je ne sais pas", "ne sais pas"]) as btnnsp 287 | ]) 288 | hold 289 | if (event match btnyes) { 290 | remember heart_disease = 1 291 | goto q13 292 | } else if (event match btnno) { 293 | remember heart_disease = 0 294 | goto q13 295 | } else if (event match btnnsp) { 296 | remember heart_disease = 999 297 | goto q13 298 | } else { 299 | say "Veuillez s'il vous plaît cliquer sur un des boutons" 300 | goto q12 301 | } 302 | 303 | q13: 304 | say Question( 305 | "**13/21** : Êtes-vous diabétique ?", 306 | buttons=[ 307 | Button("Oui", accepts=["oui", "yes", "Yes", "Ouais", "ouais"]) as btnyes, 308 | Button("Non", accepts=["non", "no", "Nope", "nope", "No", "Pas du tout"]) as btnno 309 | ]) 310 | hold 311 | if (event match btnyes) { 312 | remember diabetes = true 313 | goto q14 314 | } else if (event match btnno) { 315 | remember diabetes = false 316 | goto q14 317 | } else { 318 | say "Veuillez s'il vous plaît cliquer sur un des boutons" 319 | goto q13 320 | } 321 | 322 | q14: 323 | say Question( 324 | "**14/21** : Avez-vous ou avez-vous eu un **cancer** dans les 3 dernières années ?", 325 | buttons=[ 326 | Button("Oui", accepts=["oui", "yes", "Yes", "Ouais", "ouais"]) as btnyes, 327 | Button("Non", accepts=["non", "no", "Nope", "nope", "No", "Pas du tout"]) as btnno 328 | ]) 329 | hold 330 | if (event match btnyes) { 331 | remember cancer = true 332 | goto q15 333 | } else if (event match btnno) { 334 | remember cancer = false 335 | goto q15 336 | } else { 337 | say "Veuillez s'il vous plaît cliquer sur un des boutons" 338 | goto q14 339 | } 340 | 341 | q15: 342 | say Question( 343 | "**15/21** : Avez-vous une **maladie respiratoire** ? Ou êtes-vous **suivi par un pneumologue** ?", 344 | buttons=[ 345 | Button("Oui", accepts=["oui", "yes", "Yes", "Ouais", "ouais"]) as btnyes, 346 | Button("Non", accepts=["non", "no", "Nope", "nope", "No", "Pas du tout"]) as btnno 347 | ]) 348 | hold 349 | if (event match btnyes) { 350 | remember breathing_disease = true 351 | goto q16 352 | } else if (event match btnno) { 353 | remember breathing_disease = false 354 | goto q16 355 | } else { 356 | say "Veuillez s'il vous plaît cliquer sur un des boutons" 357 | goto q15 358 | } 359 | 360 | q16: 361 | say Question( 362 | "**16/21** : Avez-vous une **insuffisance rénale chronique dialysée** ?", 363 | buttons=[ 364 | Button("Oui", accepts=["oui", "yes", "Yes", "Ouais", "ouais"]) as btnyes, 365 | Button("Non", accepts=["non", "no", "Nope", "nope", "No", "Pas du tout"]) as btnno 366 | ]) 367 | hold 368 | if (event match btnyes) { 369 | remember kidney_disease = true 370 | goto q17 371 | } else if (event match btnno) { 372 | remember kidney_disease = false 373 | goto q17 374 | } else { 375 | say "Veuillez s'il vous plaît cliquer sur un des boutons" 376 | goto q16 377 | } 378 | 379 | q17: 380 | say Question( 381 | "**17/21** : Avez-vous une **maladie chronique du foie** ?", 382 | buttons=[ 383 | Button("Oui", accepts=["oui", "yes", "Yes", "Ouais", "ouais"]) as btnyes, 384 | Button("Non", accepts=["non", "no", "Nope", "nope", "No", "Pas du tout"]) as btnno 385 | ]) 386 | hold 387 | if (event match btnyes) { 388 | remember liver_disease = true 389 | goto q18 390 | } else if (event match btnno) { 391 | remember liver_disease = false 392 | goto q18 393 | } else { 394 | say "Veuillez s'il vous plaît cliquer sur un des boutons" 395 | goto q17 396 | } 397 | 398 | q18: 399 | say Question( 400 | "**18/21** : Êtes-vous **enceinte** ?", 401 | buttons=[ 402 | Button("Oui", accepts=["oui", "yes", "Yes", "Ouais", "ouais"]) as btnyes, 403 | Button("Non", accepts=["non", "no", "Nope", "nope", "No", "Pas du tout"]) as btnno, 404 | Button("Non applicable", accepts=["non applicable", "Pas applicable", "na", "n/a", "N/A", "NA"]) as btnna 405 | ]) 406 | hold 407 | if (event match btnyes) { 408 | remember pregnant = 1 409 | goto q19 410 | } else if (event match btnno) { 411 | remember pregnant = 0 412 | goto q19 413 | } else if (event match btnna) { 414 | remember pregnant = 888 415 | goto q19 416 | } else { 417 | say "Veuillez s'il vous plaît cliquer sur un des boutons" 418 | goto q18 419 | } 420 | 421 | q19: 422 | say Question( 423 | "**19/21** : Avez-vous une maladie connue pour diminuer vos défenses immunitaires ?", 424 | buttons=[ 425 | Button("Oui", accepts=["oui", "yes", "Yes", "Ouais", "ouais"]) as btnyes, 426 | Button("Non", accepts=["non", "no", "Nope", "nope", "No", "Pas du tout"]) as btnno, 427 | Button("Ne sait pas", accepts=["ne sait pas", "ne sais pas", "Ne sais pas", "Je ne sais pas", "je ne sais pas", "ne sais pas"]) as btnnsp 428 | ]) 429 | hold 430 | if (event match btnyes) { 431 | remember immunosuppressant_disease = 1 432 | goto q20 433 | } else if (event match btnno) { 434 | remember immunosuppressant_disease = 0 435 | goto q20 436 | } else if (event match btnnsp) { 437 | remember immunosuppressant_disease = 999 438 | goto q20 439 | } else { 440 | say "Veuillez s'il vous plaît cliquer sur un des boutons" 441 | goto q19 442 | } 443 | 444 | q20: 445 | say Question( 446 | "**20/21** : Prenez-vous un **traitement immunosuppresseur** ? C’est un traitement qui diminue vos défenses contre les infections. Voici quelques exemples : corticoïdes, méthotrexate, ciclosporine, tacrolimus, azathioprine, cyclophosphamide (liste non exhaustive).", 447 | buttons=[ 448 | Button("Oui", accepts=["oui", "yes", "Yes", "Ouais", "ouais"]) as btnyes, 449 | Button("Non", accepts=["non", "no", "Nope", "nope", "No", "Pas du tout"]) as btnno, 450 | Button("Ne sait pas", accepts=["ne sait pas", "ne sais pas", "Ne sais pas", "Je ne sais pas", "je ne sais pas", "ne sais pas"]) as btnnsp 451 | ]) 452 | hold 453 | if (event match btnyes) { 454 | remember immunosuppressant_drug = 1 455 | goto q21 456 | } else if (event match btnno) { 457 | remember immunosuppressant_drug = 0 458 | goto q21 459 | } else if (event match btnnsp) { 460 | remember immunosuppressant_drug = 999 461 | goto q21 462 | } else { 463 | say "Veuillez s'il vous plaît cliquer sur un des boutons" 464 | goto q20 465 | } 466 | 467 | q21: 468 | say Question( 469 | "**21/21** : Quel est votre code postal ?", 470 | buttons = [ 471 | Button("Je ne suis pas en France", 472 | accepts=[ 473 | "Pas en France", 474 | "pas en france", 475 | "Pas en france", 476 | "pas en France" 477 | ] 478 | ) as btnhorsfr 479 | ]) 480 | hold 481 | if (event match btnhorsfr) { 482 | remember postal_code = "horsFR" 483 | } else { 484 | remember postal_code = event 485 | } 486 | remember ending_ts = Fn("datetime", method="now") 487 | goto flow diag_20200510_algo 488 | -------------------------------------------------------------------------------- /flows/diag_20200330.csml: -------------------------------------------------------------------------------- 1 | start: 2 | say "Bienvenue sur le test **d'autodiagnostic COVID-19**, réalisé en partenariat avec **l'Institut Pasteur**, **l'AP-HP** et le **Ministère de la santé**." 3 | say Typing(2000) 4 | say "⚠️ Attention, ce site d’information **n’est pas un dispositif médical**, il ne délivre pas d’avis médical." 5 | say Typing(2000) 6 | say "**Avant de commencer, veuillez lire le préambule à l'utilisation du service :**" 7 | say Url("https://bit.ly/préambule") 8 | say Typing(2000) 9 | say Question( 10 | "**« Je reconnais avoir lu le préambule et souhaite démarrer le test »**", 11 | buttons=[ 12 | Button("Oui", accepts=["oui", "yes", "Yes", "Ouais", "ouais"]) as btnyes, 13 | Button("Non", accepts=["non", "no", "Nope", "nope", "No", "Pas du tout"]) as btnno 14 | ] 15 | ) 16 | hold 17 | if (event match btnyes) { 18 | say "Allons-y." 19 | say Typing (2000) 20 | remember starting_ts = Fn("datetime", method="now") 21 | goto q1 22 | } else { 23 | say Question( 24 | "C'est noté. Bonne journée ! 🙂", 25 | buttons=[Button("Recommencer")] 26 | ) 27 | hold 28 | goto start 29 | } 30 | goto end 31 | 32 | 33 | q1: 34 | say Question( 35 | "**1/21** : Pensez-vous avoir eu de la fièvre ces derniers jours (frissons, sueurs) ?", 36 | buttons=[ 37 | Button("Oui", accepts=["oui", "yes", "Yes", "Ouais", "ouais"]) as btnyes, 38 | Button("Non", accepts=["non", "no", "Nope", "nope", "No", "Pas du tout"]) as btnno, 39 | Button("Ne sait pas", accepts=["ne sait pas", "ne sais pas", "Ne sais pas", "Je ne sais pas", "je ne sais pas", "ne sais pas"]) as btnnsp 40 | ]) 41 | hold 42 | if (event match btnyes) { 43 | remember fever = 1 44 | goto q1bis 45 | } else if (event match btnnsp) { 46 | remember fever = 999 47 | goto q2 48 | } else if (event match btnno) { 49 | remember fever = 0 50 | remember temp = 0 51 | goto q2 52 | } else { 53 | say "Veuillez s'il vous plait cliquer sur un des boutons." 54 | goto q1 55 | } 56 | 57 | q1bis: 58 | say "**1bis/21** : Quelle est votre température corporelle (ex: 38) ?" 59 | hold 60 | do Fn("norm_units", string=event) as parsedTemp 61 | if (!parsedTemp) { 62 | say "Veuillez saisir une température valide." 63 | goto q1bis 64 | } 65 | if (parsedTemp.is_number() && parsedTemp >= 34 && parsedTemp <= 42) { 66 | remember temp = parsedTemp 67 | goto q2 68 | } else { 69 | say "Veuillez saisir une température valide, entre 34 et 42 degrés." 70 | goto q1bis 71 | } 72 | 73 | q2: 74 | say Question( 75 | "**2/21** : Avez-vous **une toux ou une augmentation de votre toux** habituelle ces derniers jours ?", 76 | buttons=[ 77 | Button("Oui", accepts=["oui", "yes", "Yes", "Ouais", "ouais"]) as btnyes, 78 | Button("Non", accepts=["non", "no", "Nope", "nope", "No", "Pas du tout"]) as btnno 79 | ]) 80 | hold 81 | if (event match btnyes) { 82 | remember cough = true 83 | goto q3 84 | } else if (event match btnno) { 85 | remember cough = false 86 | goto q3 87 | } else { 88 | say "Veuillez s'il vous plait cliquer sur un des boutons." 89 | goto q2 90 | } 91 | 92 | q3: 93 | say Question( 94 | "**3/21** : Ces derniers jours, avez-vous noté une **forte diminution ou perte de votre goût ou de votre odorat** ?", 95 | buttons=[ 96 | Button("Oui", accepts=["oui", "yes", "Yes", "Ouais", "ouais"]) as btnyes, 97 | Button("Non", accepts=["non", "no", "Nope", "nope", "No", "Pas du tout"]) as btnno 98 | ]) 99 | hold 100 | if (event match btnyes) { 101 | remember agueusia_anosmia = true 102 | goto q4 103 | } else if (event match btnno) { 104 | remember agueusia_anosmia = false 105 | goto q4 106 | } else { 107 | say "Veuillez s'il vous plait cliquer sur un des boutons" 108 | goto q3 109 | } 110 | 111 | 112 | q4: 113 | say Question( 114 | "**4/21** : Avez-vous un **mal de gorge** ou des **douleurs musculaires** ou des **courbatures** inhabituelles ces derniers jours ?", 115 | buttons=[ 116 | Button("Oui", accepts=["oui", "yes", "Yes", "Ouais", "ouais"]) as btnyes, 117 | Button("Non", accepts=["non", "no", "Nope", "nope", "No", "Pas du tout"]) as btnno 118 | ]) 119 | hold 120 | if (event match btnyes) { 121 | remember sore_throat_aches = true 122 | goto q5 123 | } else if (event match btnno) { 124 | remember sore_throat_aches = false 125 | goto q5 126 | } else { 127 | say "Veuillez s'il vous plait cliquer sur un des boutons" 128 | goto q4 129 | } 130 | 131 | q5: 132 | say Question( 133 | "**5/21** : Ces dernières 24 heures, avez-vous de la **diarrhée** ? Avec au moins 3 selles molles.", 134 | buttons=[ 135 | Button("Oui", accepts=["oui", "yes", "Yes", "Ouais", "ouais"]) as btnyes, 136 | Button("Non", accepts=["non", "no", "Nope", "nope", "No", "Pas du tout"]) as btnno 137 | ]) 138 | hold 139 | if (event match btnyes) { 140 | remember diarrhea = true 141 | goto q6 142 | } else if (event match btnno) { 143 | remember diarrhea = false 144 | goto q6 145 | } else { 146 | say "Veuillez s'il vous plait cliquer sur un des boutons" 147 | goto q5 148 | } 149 | 150 | q6: 151 | say Question( 152 | "**6/21** : Ces derniers jours, avez-vous une **fatigue inhabituelle** ?", 153 | buttons=[ 154 | Button("Oui", accepts=["oui", "yes", "Yes", "Ouais", "ouais"]) as btnyes, 155 | Button("Non", accepts=["non", "no", "Nope", "nope", "No", "Pas du tout"]) as btnno 156 | ]) 157 | hold 158 | if (event match btnyes) { 159 | remember tiredness = true 160 | goto q6bis 161 | } else if (event match btnno) { 162 | remember tiredness = false 163 | remember tiredness_details = false 164 | goto q7 165 | } else { 166 | say "Veuillez s'il vous plait cliquer sur un des boutons" 167 | goto q6 168 | } 169 | 170 | q6bis: 171 | say Question( 172 | "**6bis/21** : Cette fatigue vous oblige-t-elle à vous reposer plus de la moitié de la journée ?", 173 | buttons=[ 174 | Button("Oui", accepts=["oui", "yes", "Yes", "Ouais", "ouais"]) as btnyes, 175 | Button("Non", accepts=["non", "no", "Nope", "nope", "No", "Pas du tout"]) as btnno 176 | ]) 177 | hold 178 | if (event match btnyes) { 179 | remember tiredness_details = true 180 | goto q7 181 | } else if (event match btnno) { 182 | remember tiredness_details = false 183 | goto q7 184 | } else { 185 | say "Veuillez s'il vous plait cliquer sur un des boutons" 186 | goto q6bis 187 | } 188 | 189 | q7: 190 | say Question( 191 | "**7/21** : Êtes vous dans l'impossibilité de vous alimenter ou de boire **DEPUIS 24 HEURES OU PLUS** ?", 192 | buttons=[ 193 | Button("Oui", accepts=["oui", "yes", "Yes", "Ouais", "ouais"]) as btnyes, 194 | Button("Non", accepts=["non", "no", "Nope", "nope", "No", "Pas du tout"]) as btnno 195 | ]) 196 | hold 197 | if (event match btnyes) { 198 | remember feeding_day = true 199 | goto q8 200 | } else if (event match btnno) { 201 | remember feeding_day = false 202 | goto q8 203 | } else { 204 | say "Veuillez s'il vous plait cliquer sur un des boutons" 205 | goto q7 206 | } 207 | 208 | q8: 209 | say Question( 210 | "**8/21** : Dans les dernières 24 heures, avez-vous noté un **manque de souffle INHABITUEL** lorsque vous parlez ou faites un petit effort ?", 211 | buttons=[ 212 | Button("Oui", accepts=["oui", "yes", "Yes", "Ouais", "ouais"]) as btnyes, 213 | Button("Non", accepts=["non", "no", "Nope", "nope", "No", "Pas du tout"]) as btnno 214 | ]) 215 | hold 216 | if (event match btnyes) { 217 | remember breathlessness = true 218 | goto q9 219 | } else if (event match btnno) { 220 | remember breathlessness = false 221 | goto q9 222 | } else { 223 | say "Veuillez s'il vous plait cliquer sur un des boutons" 224 | goto q8 225 | } 226 | 227 | q9: 228 | say "**9/21** : Quel est votre âge ? Ceci, afin de calculer un facteur de risque spécifique (ex: 28)." 229 | hold 230 | do Fn("norm_units", string=event) as parsedAge 231 | if (!parsedAge) { 232 | say "Veuillez saisir un age valide." 233 | goto q9 234 | } 235 | if (parsedAge.is_number() && parsedAge > 15 && parsedAge <= 110) { 236 | remember age = parsedAge 237 | goto q10 238 | } else if (parsedAge <= 15 && parsedAge >= 0) { 239 | say "En l'absence de recommandations connues pour les affections pédiatriques (de moins de 15 ans), il faut rechercher un avis médical pour tout symptôme sur les enfants. Si l'état de santé du patient semble inquiétant, appelez le 15." 240 | goto end 241 | } else if (parsedAge >= 100 && parsedAge <= 110) { 242 | say "Au-delà d'un certain âge, nous ne sommes pas en mesure de fournir des recommendations fiables, il faut rechercher un avis médical pour tout symptôme. Si l'état de santé du patient semble inquiétant, appelez le 15." 243 | goto end 244 | } else { 245 | say "Veuillez saisir un age valide." 246 | goto q9 247 | } 248 | 249 | q10: 250 | say "**10/21** : Quel est votre **taille** en centimetres (ex: 175) ? Afin de calculer l’indice de masse corporelle qui est un facteur influençant le risque de complications de l’infection." 251 | hold 252 | do Fn("norm_units", string=event) as parsedSize 253 | if (!parsedSize) { 254 | say "Veuillez saisir une taille valide, entre 80 et 250 cm." 255 | goto q10 256 | } 257 | if (parsedSize < 10) do normSize = parsedSize * 100 258 | else do normSize = parsedSize 259 | if (normSize.is_number() && normSize >= 80 && normSize <= 250) { 260 | remember size = normSize 261 | goto q11 262 | } else { 263 | say "Veuillez saisir une taille valide, entre 80 et 250 cm." 264 | goto q10 265 | } 266 | 267 | q11: 268 | say "**11/21** : Quel est votre **poids** en kilogrammes (ex: 84) ? Afin de calculer l’indice de masse corporelle qui est un facteur influençant le risque de complications de l’infection. " 269 | hold 270 | do Fn("norm_units", string=event) as parsedWeight 271 | if (!parsedWeight) { 272 | say "Veuillez saisir un poids valide, entre 20 et 250 kg." 273 | goto q11 274 | } 275 | if (parsedWeight.is_number() && parsedWeight >= 20 && parsedWeight <= 250) { 276 | remember weight = parsedWeight 277 | goto q12 278 | } else { 279 | say "Veuillez saisir un poids valide, entre 20 et 250 kg." 280 | goto q11 281 | } 282 | 283 | q12: 284 | say Question( 285 | "**12/21** : Avez-vous de **l’hypertension artérielle** mal équilibrée ? Ou avez-vous une **maladie cardiaque ou vasculaire** ? Ou prenez-vous un **traitement à visée cardiologique** ?", 286 | buttons=[ 287 | Button("Oui", accepts=["oui", "yes", "Yes", "Ouais", "ouais"]) as btnyes, 288 | Button("Non", accepts=["non", "no", "Nope", "nope", "No", "Pas du tout"]) as btnno, 289 | Button("Ne sait pas", accepts=["ne sait pas", "ne sais pas", "Ne sais pas", "Je ne sais pas", "je ne sais pas", "ne sais pas"]) as btnnsp 290 | ]) 291 | hold 292 | if (event match btnyes) { 293 | remember heart_disease = 1 294 | goto q13 295 | } else if (event match btnno) { 296 | remember heart_disease = 0 297 | goto q13 298 | } else if (event match btnnsp) { 299 | remember heart_disease = 999 300 | goto q13 301 | } else { 302 | say "Veuillez s'il vous plait cliquer sur un des boutons" 303 | goto q12 304 | } 305 | 306 | q13: 307 | say Question( 308 | "**13/21** : Êtes-vous diabétique ?", 309 | buttons=[ 310 | Button("Oui", accepts=["oui", "yes", "Yes", "Ouais", "ouais"]) as btnyes, 311 | Button("Non", accepts=["non", "no", "Nope", "nope", "No", "Pas du tout"]) as btnno 312 | ]) 313 | hold 314 | if (event match btnyes) { 315 | remember diabetes = true 316 | goto q14 317 | } else if (event match btnno) { 318 | remember diabetes = false 319 | goto q14 320 | } else { 321 | say "Veuillez s'il vous plait cliquer sur un des boutons" 322 | goto q13 323 | } 324 | 325 | q14: 326 | say Question( 327 | "**14/21** : Avez-vous ou avez-vous eu un **cancer** dans les 3 dernières années ?", 328 | buttons=[ 329 | Button("Oui", accepts=["oui", "yes", "Yes", "Ouais", "ouais"]) as btnyes, 330 | Button("Non", accepts=["non", "no", "Nope", "nope", "No", "Pas du tout"]) as btnno 331 | ]) 332 | hold 333 | if (event match btnyes) { 334 | remember cancer = true 335 | goto q15 336 | } else if (event match btnno) { 337 | remember cancer = false 338 | goto q15 339 | } else { 340 | say "Veuillez s'il vous plait cliquer sur un des boutons" 341 | goto q14 342 | } 343 | 344 | q15: 345 | say Question( 346 | "**15/21** : Avez-vous une **maladie respiratoire** ? Ou êtes-vous **suivi par un pneumologue** ?", 347 | buttons=[ 348 | Button("Oui", accepts=["oui", "yes", "Yes", "Ouais", "ouais"]) as btnyes, 349 | Button("Non", accepts=["non", "no", "Nope", "nope", "No", "Pas du tout"]) as btnno 350 | ]) 351 | hold 352 | if (event match btnyes) { 353 | remember breathing_disease = true 354 | goto q16 355 | } else if (event match btnno) { 356 | remember breathing_disease = false 357 | goto q16 358 | } else { 359 | say "Veuillez s'il vous plait cliquer sur un des boutons" 360 | goto q15 361 | } 362 | 363 | q16: 364 | say Question( 365 | "**16/21** : Avez-vous une **insuffisance rénale chronique dialysée** ?", 366 | buttons=[ 367 | Button("Oui", accepts=["oui", "yes", "Yes", "Ouais", "ouais"]) as btnyes, 368 | Button("Non", accepts=["non", "no", "Nope", "nope", "No", "Pas du tout"]) as btnno 369 | ]) 370 | hold 371 | if (event match btnyes) { 372 | remember kidney_disease = true 373 | goto q17 374 | } else if (event match btnno) { 375 | remember kidney_disease = false 376 | goto q17 377 | } else { 378 | say "Veuillez s'il vous plait cliquer sur un des boutons" 379 | goto q16 380 | } 381 | 382 | q17: 383 | say Question( 384 | "**17/21** : Avez-vous une **maladie chronique du foie** ?", 385 | buttons=[ 386 | Button("Oui", accepts=["oui", "yes", "Yes", "Ouais", "ouais"]) as btnyes, 387 | Button("Non", accepts=["non", "no", "Nope", "nope", "No", "Pas du tout"]) as btnno 388 | ]) 389 | hold 390 | if (event match btnyes) { 391 | remember liver_disease = true 392 | goto q18 393 | } else if (event match btnno) { 394 | remember liver_disease = false 395 | goto q18 396 | } else { 397 | say "Veuillez s'il vous plait cliquer sur un des boutons" 398 | goto q17 399 | } 400 | 401 | q18: 402 | say Question( 403 | "**18/21** : Êtes-vous **enceinte** ?", 404 | buttons=[ 405 | Button("Oui", accepts=["oui", "yes", "Yes", "Ouais", "ouais"]) as btnyes, 406 | Button("Non", accepts=["non", "no", "Nope", "nope", "No", "Pas du tout"]) as btnno, 407 | Button("Non applicable", accepts=["non applicable", "Pas applicable", "na", "n/a", "N/A", "NA"]) as btnna 408 | ]) 409 | hold 410 | if (event match btnyes) { 411 | remember pregnant = 1 412 | goto q19 413 | } else if (event match btnno) { 414 | remember pregnant = 0 415 | goto q19 416 | } else if (event match btnna) { 417 | remember pregnant = 888 418 | goto q19 419 | } else { 420 | say "Veuillez s'il vous plait cliquer sur un des boutons" 421 | goto q18 422 | } 423 | 424 | q19: 425 | say Question( 426 | "**19/21** : Avez-vous une maladie connue pour diminuer vos défenses immunitaires ?", 427 | buttons=[ 428 | Button("Oui", accepts=["oui", "yes", "Yes", "Ouais", "ouais"]) as btnyes, 429 | Button("Non", accepts=["non", "no", "Nope", "nope", "No", "Pas du tout"]) as btnno, 430 | Button("Ne sait pas", accepts=["ne sait pas", "ne sais pas", "Ne sais pas", "Je ne sais pas", "je ne sais pas", "ne sais pas"]) as btnnsp 431 | ]) 432 | hold 433 | if (event match btnyes) { 434 | remember immunosuppressant_disease = 1 435 | goto q20 436 | } else if (event match btnno) { 437 | remember immunosuppressant_disease = 0 438 | goto q20 439 | } else if (event match btnnsp) { 440 | remember immunosuppressant_disease = 999 441 | goto q20 442 | } else { 443 | say "Veuillez s'il vous plait cliquer sur un des boutons" 444 | goto q19 445 | } 446 | 447 | q20: 448 | say Question( 449 | "**20/21** : Prenez-vous un **traitement immunosuppresseur** ? C’est un traitement qui diminue vos défenses contre les infections. Voici quelques exemples : corticoïdes, méthotrexate, ciclosporine, tacrolimus, azathioprine, cyclophosphamide (liste non exhaustive).", 450 | buttons=[ 451 | Button("Oui", accepts=["oui", "yes", "Yes", "Ouais", "ouais"]) as btnyes, 452 | Button("Non", accepts=["non", "no", "Nope", "nope", "No", "Pas du tout"]) as btnno, 453 | Button("Ne sait pas", accepts=["ne sait pas", "ne sais pas", "Ne sais pas", "Je ne sais pas", "je ne sais pas", "ne sais pas"]) as btnnsp 454 | ]) 455 | hold 456 | if (event match btnyes) { 457 | remember immunosuppressant_drug = 1 458 | goto q21 459 | } else if (event match btnno) { 460 | remember immunosuppressant_drug = 0 461 | goto q21 462 | } else if (event match btnnsp) { 463 | remember immunosuppressant_drug = 999 464 | goto q21 465 | } else { 466 | say "Veuillez s'il vous plait cliquer sur un des boutons" 467 | goto q20 468 | } 469 | 470 | q21: 471 | say Question( 472 | "**21/21** : Quel est votre code postal ?", 473 | buttons = [ 474 | Button("Je ne suis pas en France", 475 | accepts=[ 476 | "Pas en France", 477 | "pas en france", 478 | "Pas en france", 479 | "pas en France" 480 | ] 481 | ) as btnhorsfr 482 | ]) 483 | hold 484 | if (event match btnhorsfr) { 485 | remember postal_code = "horsFR" 486 | } else { 487 | remember postal_code = event 488 | } 489 | remember ending_ts = Fn("datetime", method="now") 490 | goto flow diag_20200510_algo 491 | --------------------------------------------------------------------------------