Giter VIP home page Giter VIP logo

covidrea's People

Contributors

anthonytournier avatar bdahon avatar karim-ammor avatar rleger avatar samo9789 avatar tcarpentier avatar

Stargazers

 avatar  avatar  avatar

Watchers

 avatar  avatar

covidrea's Issues

Fix cancel button

I would like the cancel button on the views/service/edit.blade page
to go back to a previous page.. not a specific url depending on where you're coming from

Stackoverflowed it and found window.location...
ok
but it submits the form (default behaviour), so inserted preventDefault()

anyway it's not working :)

Amélioration fiche établissement

Plusieurs suggestion d'amélioration sur la fiche d'un établissement :

  1. Afficher le numéro de téléphone tout en haut de la page, en plus gros, et via 1 link tel: pour qu'il soit utilisable directement sur un mobile
  2. Les chiffres pourraient être affiché plus gros
  3. Possible de ré-afficher la distance qui nous sépare de l'établissement en question ?
  4. Lorsqu'il n'y a qu'un lit disponible, il est écris "1 disponibles" (même chose sur totales)
  5. Est-ce que le e de totales est souhaitable ?
  6. Rendre l'adresse cliquable pour envoyer sur Google map ?

Créer les liens de relation pour le systeme de notifications

J'ai crée un webhook (routes/api) entre mailgun et nous ce qui fait que on sait si le mail a été reçuu, ouvert etc..

j'ai crée un modele pour Invite -> InviteNotification et un pour Prospect -> ProspectNotification
il faudrait écrire les liens qui nous permettent de voir depuis un Prospect (ou un Invite) les mails reçus ou pas.. ceux qui ont échoué etc. pour que l'on puisse nous agir et les renvoyer..

Il faudra aussi a terme une petite UI qui nous permette de visualiser tout ca (uniquement pour les superadmin..) PR précédente.
On pourrait avoir un AdminController avec un middleware a l'entrée qui nous donne acces a une section..

Pour l'UI comme dit précédemment j'ai des modèles donc ne pas hésiter a me dire ce dont vous avez besoin pour que j'en envoi.

NB : pour mémoire prospect est la liste initiale des directeurs que l'on va inviter. Invite est la liste des futurs utliisateurs qu'ils vont inviter a leur tour

Tests

Je vais détailler (plus tard) mais je pense qu'il est très important d'écrire quelques test (unit et feature) avant la mise en production

Nombre de places, Nombre de places disponibles et bientôt disponibles limités à 100 max

J'imagine qu'il n'y a pas beaucoup d'hopitaux avec un si grand nombre de lits en réanimation, donc 100 parait-être un bon chiffre, mais est-ce voulu ?

Sur mobile, si je rentre un chiffre plus grand ( exemple 101 ) et que je clique sur "Enregister", je n'ai pas de message d'erreur. Il faut que je change le focus sur un autre champ pour voir le champ précédent en erreur.

Sur un ordinateur, j'ai bien un message d'erreur m'indiquant de renseigner une valeur inférieure à 100

Processus d'invitation des utilisateurs par les chefs d'établissement

Il s'agit du mode d'entrée dans le système

Pour mémoire voici le processus d'invitation complet à nous rejoindre :

  1. nous allons remplir la table "etablissement" avec une BD existante, créer les utilisateurs correspondants et les lier à la table établissement. Nous aurons donc pour chaque établissement un utilisateur référent (etablissement.user_id).

  2. Envoyer un mail d'invitation a ces utilisateurs référents (chefs d'établissement) en leur demandant de 1. créer les services de leur établissement et 2. inviter leurs utilisateurs à nous rejoindre. Dans ce mail ils auront un lien vers la page "invite/{token}". (token étant la colonne token de la table user).

  3. ensuite les utilisateurs cliquent sur le lien qui leur a été envoyé et terminent leur inscription

Important : ce sont les utilisateurs qui sélectionneront (et pourront modifier dans leur profil) dans quel service ils travaillent lors de leur inscription (et pas le chef d'établissement).

Problématique :

L'étape 2) n'est pas complète, actuellement il y a une page (invite/{token}) qui permet d'inviter les utilisateurs mais rien pour créer les services avant de les inviter.. donc pas fonctionnel en l'état

Ce qu'il nous faut :

Il faut permettre aux chefs d'établissement de créer un ou plusieurs services avec les champs suivants par service (nom, place_totales, place_disponible, place_bientot_disponible, contact (tel)).
les champs "gravité" et "type" sont abandonnés pour l'instant, a suivre si jamais..
Les 3 champs de place doivent pouvoir être remplis ou laissé vides (0) à ce stade.

Idéalement il faudrait qu'il n'y ait pas de JS non plus pour avoir une version entièrement "web classique". Meme si c'est un peu frustrant j'en conviens.

**Ma vision d'une solution : **

Une section au dessus de celle crée actuellement dans invite/{token} qui permette d'ajouter et supprimer des services qui seront préinitialisés avec un nombre de place (en précisant pour l'utilisateur qu'il n'était pas impératif d'entrer les nombres de place a ce stade) En effet il n'est pas certain que le chef d'établissement ait toutes ces infos et ca pourrait le rebuter a poursuivre.

Donc une liste avec dans chaque ligne

"Service" "place totale" "place dispo" "place bientot dispo" "bouton supprimer"
"Service" "place totale" "place dispo" "place bientot dispo" "bouton supprimer"
"Service" "place totale" "place dispo" "place bientot dispo" "bouton supprimer"
----
ligne avec des <input> pour les champs avec un bouton "+" a la fin de la ligne

Section du dessous comme actuellement, les champs pour inviter les utilisateurs pour cet établissement.

Il faudrait qu'il ne soit pas possible de soumettre le formulaire d'envoi de mail aux praticiens tant que au moins un service n'est pas saisi.

Possibilité de gains de performance sur la home

Sur la home, pour afficher les chiffres, on fait 4 requêtes MySQL :

  1. La 1ère pour récupérer les IDs des établissements qui sont dans le radius sélectionnés
  2. 3 autres pour récupérer les totaux des lits

En terme de performance, et lorsque le serveur sera chargé, il est possible que le dashboard rame à cause de ça.

Plusieurs possibilités pour essayer d'y remédier :

  1. Tout faire en une seule requête (cela nécessitera de coder quelque chose de spécifique dans le model je suppose)
  2. Mettre en cache la 1ère requête et invalider ce cache dès qu'un établissement est ajouter/modifier/supprimer et ne faire qu'une seule requête pour récupérer les 3 totaux (devraient être rapide car select sur la clé primaire)
  3. On peut aussi mettre en cache les totaux, mais ça pourrait être contre productif car le cache serait invalidé très souvent...

[Performance] Probème N+1 sur la page etablissements

La page qui liste les établissement présente un gros problème de requête n+1. Pour chaque établissement dans la page, plusieurs requêtes sont exécutées depuis le render de la page

Voici ce que l'on a quand on loggue toutes les requêtes sur cette page.
image

On voit donc qu'on peut dépasser les 20 requêtes juste pour afficher 10 éléments.
Il faut retravailler le controller pour qu'il crée un value object plutôt que de renvoyer le modèle directement.

Licence AGPL V3 ?

Afin d'être clair avec les développeurs contribuants au repository ainsi qu'aux éventuels futurs partenaires (pour qui, ce point sera décisif), je pense qu'il est nécessaire que le projet se déclare sous licence AGPL V3, qui indiquera que le code est open-source à but non commercial.

Si ok pour toi @rleger, je peux m'en occuper.

Améliorations page "Etablissements"

  1. Ajouter une recherche sur la liste pour le nom ?
  2. Que se passe-t-il lorsqu'un établissement n'a pas de lits disponibles, il disaparait de a liste où on le voit avec 0 lits dispo ? Idéalement, il faudrait laisser la possibilité à l'utilisateur de choisir d'afficher ou non
  3. En mobile, on ne voit pas a pagination 1,2,3... mais next et previous qui ne fonctionne pas (et qu'il faudrait traduire si c'est à garder)
  4. Lorsqu'on va sur la fiche d'un établissement, il faudrait rajouter un bouton retour à la liste (un simple history.back() devrait faire l'affaire)

Modification établissements / création services

Je n'ai pas encore développé les fonctionnalités de ces routes qui sont destinés a l'administrateur de l'établissement (qui est etablissement.user_id)


// Gestion des établissements
Route::get('user/{user}/etablissement/', 'UserEtablissementController@index')->name('user.etablissement.index');
Route::get('user/{user}/etablissement/{etablissement}/edit', 'UserEtablissementController@edit')->name('user.etablissement.edit');
Route::patch('user/{user}/etablissement/{etablissement}/update', 'UserEtablissementController@update')->name('user.etablissement.update');


Il s'agit de permettre à un utilisateur de modifier les données d'un établissement (nom, type). Les autres champs = l'adresse, long et lat ne doivent pas changer donc inutile de se compliquer la vie.

Il faut surtout que cet utilisateur puisse CRUD des services qui sont liés à cet établissement sur cette page.

Concrètement dans cette crise, de nouveaux services vont être affectés par les établissements, ce sera l'administrateur de l'établissement qui pourra interagir.

Il faut qu'il reste toujours au minimum 1 service et donc ne pas autoriser la suppression du dernier service par exemple.

L'idée initiale est de ne pas utiliser de JS a ce stade. (dans un 2eme temps il pourrait être question de faire une api et une SPA mais nous n'en sommes pas la).

Permettre d'importer des emails au format "nom" <[email protected]>

Lors de l'importation des mails, le format attendu est mail1, mail2 ou séparé par un ;
Il faudrait que les directeurs puissent copier/coller depuis les mails de leur messagerie qui en général sortent des choses type "nom" [email protected]
On pourrait d'ailleurs ajouter une colone NOM a la table invite (sans le rendre obligatoire) et préremplir le champ s'il n'est pas vide dans la vue finalize.blade.

L'importation des mails est dans InviteController @process.

Bonus extraire tout ca dans une class
Bonus write unit tests for that

(désolé pour ce code affreux.. mais dans l'urgence :) )

Améliorations par rapport à l"utilisateur

  1. Ajouter la possibilité de modifier son adresse email (avec process de validation via l'ancienne et la nouvelle adresse ?)
  2. Ajouter la possibilité de modifier son mot de passe
  3. La page de réinitialisation de mot de passe permet de changer l'adresse email, pourquoi ?
  4. La page de réinitialisation mets dans les value des password l'adresse email, ils devraient être vide
  5. Le message d'erreur lors du missmatch de mot de passe devrait être "Le champ de confirmation du mot de passe ne correspond pas." (le du est manquant)
  6. Après avoir utiliser un lien de réinitialisation de mot de passe, l'indication que le jeton est invalide devrait être fait avant d'afficher le formulaire.

Partenariats

Ticket provenant du Slack et proposé par Joffrey P. :

vu avec Vincent Bailly : ajout d’une bande de logos “soutiens / participations” sur la home (pour l’instant, HHB / CCI / SC) ?

Envoi du mail aux chefs d'établissement les invitant à entrer la liste d'uilisateurs

Une fois que la table établissement sera saisie nous pourrons commencer a inviter les chefs d'établissements (etablissement.user_id) par email.

Il faudrait écrire ce job (la faire avec un job permet de le mettre en Queue plus facilement),

Si pas familier il existe une commande :

php artisan make:job Nomdujob

Ce job va envoyer un email aux chefs d'établissement les invitant a nous rejoindre en cliquant sur un lien (/invite/{token}). Je vais demander a Vincent de faire le mail si possible.
Pour le mail en lui meme on utilise le template Markdown qui nous simplifie la vie
https://laravel.com/docs/7.x/mail#generating-markdown-mailables

Il faudra aussi un tracking des mails et communications envoyés (pourquoi pas un modèle Notification (ManyToMany) avec type {email, sms..}, timestamps, title: {invitation_initiale, relance_invitation_1, .... })
comme ca lorsqu'on ouvrira a d'autres région on ne renverra pas le mail a ceux qui l'ont déjà eut.

Amélioration "mettre à jour mes lits"

  1. Pourquoi ne pas faire 1 seul et unique formulaire plutôt que 1 formulaire pour chaque service ?
  2. Sur l'affichage de multiples formulaire, tous les champs ont les mêmes IDs, ce qui a pour effet que tous les labels renvoient vers les input du 1er formulaire.
  3. Le bouton annuler devrait être un simple "reset" plutôt qu'un lien qui rafraîchit la page
  4. Idéalement, l'enregistrement devrait se faire en Ajax afin de de ne pas remonter en haut de la page
  5. Pourquoi les champ ont un max à 100 ?
  6. Je pense que le service devrait être affiché plus gros, en mobile c'est un peu étrange
  7. Lorsqu'on quitte la page en ayant modifier un champ mais sans enregistrer, il faudrait afficher 1 alerte à l'utilisateur (beforeunload)
  8. Peut-être réafficher la date et heure de dernière mise à jour à côté de chaque service ?

Mettre en place un système de notification quand un lit est diponible

Quand un établissement enregistre une disponibilité de lits, nous pourrions notifier les établissements dans un rayon X kms. Cela éviterait aux personnes en recherche de lits d'avoir à aller en permanence sur l'application pour connaître les disponibilités.
Peut-être que la fonctionalité existe déjà mais je ne l'ai pas vue. On peut imaginer une notification par mail ou sms.

Test montée en charge Homepage

Dans le cas d'une couverture médiatique nationale, il faut que le site tienne la charge, notamment la homepage.
Est-on prêt à absorber un "effet capital" du nom de la célébre émission qui crash régulièrement tous les sites de startup présentés.

Afficher les établissement correspond au rayon sur le tableau de bord ?

  1. Aller sur le tableau de bord
  2. On voit afficher des chiffres de lits dans le rayon sélectionné
  3. Lorsqu'on clique, on arrive sur la liste des établissements sans limitation de rayon

Je peux comprendre à la limite d'afficher tous les établissements, ils sont ordonnés par distance.

Mais pourquoi ne pas afficher la liste filtrée directement en dessous des chiffres du dashboard ?

Cartographie Google Map

Ajouter à la page Lit disponible une carte sur laquelle apparaissent les établissements avec le nombre de lits totaux, disponibles et bientot disponibles.

On affiche en vert ceux qui ont encore des lits et rouge ceux qui n'en ont plus. En orange ceux qui n'ont plus de lit dispo mais simplement des lits bientot dispo.

En cliquant sur le "pin" on sera redirigé vers la page de l'établissement (/etablissement/{etablissement_id})

Installer tracker stats

Google analytics ou autre, permettra d'avoir des stats de connexion notamment géographique (anticipation de demande par région ?)

si on essaye d'accéder à /home en étant un utilisateur admin sans établissement et sans service

Si l'utilisateur est admin sans être admin d'un hopital ou sans etre un utilisateur régulier avec des services alors erreur car pas d'établissement de référence

il faut qu'un admin non rattaché puisse accéder.. meme si on doit lui masquer le tableau de bord.. ou encore mieux lui donner une version non géoloc.

[2020-04-01 18:56:35] local.ERROR: Trying to get property 'lat' of non-object {"userId":87,"exception":"[object] (ErrorException(code: 0): Trying to get property 'lat' of non-object at /Users/romainleger/Sites/covidrea/app/Http/Controllers/HomeController.php:42)
[stacktrace]
#0 /Users/romainleger/Sites/covidrea/app/Http/Controllers/HomeController.php(42): Illuminate\\Foundation\\Bootstrap\\HandleExceptions->handleError(8, 'Trying to get p...', '/Users/romainle...', 42, Array)

Faille de sécurité : je peux modifier les lits d'un service que je ne gère pas

Lors de mon inscription, je n'ai demandé que 3 services sur les 10 de l'établissement existant.

Lorsque je suis connecté et que je clique sur "Modifier mes lits disponibles", j'atterris sur la page
https://covid-moi-un-lit.com/user/120/service
où je vois mes services et la possibilité de modifier les chiffres.

En modifiant l'URL pour être
https://covid-moi-un-lit.com/user/119/service
Les services affichés ne sont pas les mêmes (mais du même établissement).
Les 2 premiers que je vois sont des services auxquels j'ai accès, mais pas le dernier.

J'ai testé, j'ai pu modifier les chiffres de cet autre service.

Plusieurs choses :

  1. Modifier pour ne pas avoir d'ID dans l'URL et se baser uniquement sur l'utilisateur connecté
  2. Existe-t-il un log des modifications effectuées pour savoir qui a modifié quoi ?

Nous permettre d'inviter (en tant qu'admin) des utilisateurs pour un établissemnet

Initialement le systeme a été prévu pour que ce soit les chefs d'établissement qui
1- recoivent une invit
2- se connecte
3- crée l'établissement et les services
4- lance des invitations aux utilisateurs finaux

on voudrait pouvoir nous meme faire l'ensemble depuis une console superadmin

1- choisir un étab (dropdown(?) qui contienne le nom de la clinique et la ville) pour l'instant ca suffit. A changer quand il y aura +
2- choir un des service de cet établissement, si y'en a pas alors il faut les créer (comme dans user/etablissement/edit.blade)
3- accéder a l'invitation (comme dans invite.blade)

Attention :

  • Voir ce qu'il se passe si on crée l'établissement et que le directeur clique alors sur le mail d'invitation pour le créer a son tour... comment concilier les 2.. quite a modifier la procédure d'inscription "nous avons trouvé un établisement simiaire, est-ce le votre.."..

L'utilisateur est déconnecté lorsqu'il essaie d'accéder à la page de mise à jour des lits et qu'il n'est pas référent d'au moins un service

Steps to reproduce:

  • log as a user with no service related (SELECT COUNT(*) FROM services WHERE user_id = ... should return 0)
  • click on "Mettre à jour mes lits"
  • you will be disconnected and redirected to the login page

--> It is due to the middleware app/Http/Middleware/CheckUserHasAHospital.php registered in app/Http/Controllers/UserServiceController.php

User should not be disconnected, the page should be displayed with an error message.

Créer une page revue de presse

v1 : rapide avec liste des articles
-> Date article
-> Nom du média (les echos, macommune, ..)
-> Titre article
-> Lien vers article
v2 : idem mais administrable en BO

Place un lien dans le footer vers la page créée

Donner un statut superuser a certains utils

Certains utils (comme moi et vincent par ex) vont avoir besoin de fonctions d'administrateur.
Nous n'avons a ce stade pas besoin d'un systeme complexe de role mais juste un champ role dans la table utile et peut être un scope dans User model

on fera les modifs sur la BD inutile de prévoir ca en UI

Favicon

Créer et installer un favicon

Email de confirmation

Quand on invite des utilisateurs (table invite) depuis la console du directeur d'établissmeent, une fois les invitations parties, on lui dit qu'on va lui envoyer un mail de confirmation (au directeur)

-> il faudrait créer un mail rapide disant quelquechose comme :
Nous avons envoyé un email aux utilisateurs suivants (adresses email) pour les inviter à nous rejoindre

Refactor RecordMailGunWebhook (job)

Awful thing I wrote very quickly. Refactoring would be most welcome.

One thing in particular from a practical standpoint I keep getting exceptions from old emails I openned after having cleared the DB of the corresponding prospect (or invite) record.. this is annoying. If the firstOrCreate fails we should log one line with the failure and not the whole exception (my slack is going to go crazy otherwise).

Thanks !

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.