]> _ Git - ccv-email.git/commitdiff
Wait #4244 @14
authorStephen Cameron <stephen@cubedesigners.com>
Thu, 22 Apr 2021 22:57:31 +0000 (00:57 +0200)
committerStephen Cameron <stephen@cubedesigners.com>
Thu, 22 Apr 2021 22:57:31 +0000 (00:57 +0200)
25 files changed:
app/Http/Controllers/EmailConsultationUnnecessaryController.php [new file with mode: 0644]
app/Http/Controllers/EmailController.php
app/Http/Controllers/EmailDiagnosisController.php [new file with mode: 0644]
app/Http/Controllers/EmailDossierIncompleteController.php [new file with mode: 0644]
app/Http/Controllers/EmailMissingImageryController.php [new file with mode: 0644]
app/Mail/Diagnosis.php
app/Mail/Shared.php [new file with mode: 0644]
composer.json
composer.lock
resources/views/components/quill.blade.php [new file with mode: 0644]
resources/views/components/trim.blade.php [new file with mode: 0644]
resources/views/consultation-unnecessary/message.html [new file with mode: 0644]
resources/views/diagnosis/email.blade.php
resources/views/diagnosis/form.blade.php
resources/views/diagnosis/message.html [new file with mode: 0644]
resources/views/dossier-incomplete/message.html [new file with mode: 0644]
resources/views/home.blade.php [new file with mode: 0644]
resources/views/layouts/app.blade.php
resources/views/layouts/email-wrapper.blade.php
resources/views/missing-imagery/message.html [new file with mode: 0644]
resources/views/shared/email-footer.blade.php [new file with mode: 0644]
resources/views/shared/email-header.blade.php [new file with mode: 0644]
resources/views/shared/email.blade.php [new file with mode: 0644]
resources/views/shared/form.blade.php [new file with mode: 0644]
routes/web.php

diff --git a/app/Http/Controllers/EmailConsultationUnnecessaryController.php b/app/Http/Controllers/EmailConsultationUnnecessaryController.php
new file mode 100644 (file)
index 0000000..86f6a4d
--- /dev/null
@@ -0,0 +1,80 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Mail;
+use App\Mail\Shared;
+
+class EmailConsultationUnnecessaryController extends EmailController
+{
+    public $snippets;
+    public $title;
+
+    public function __construct() {
+
+        $this->title = "Consultation inutile";
+
+        $this->snippets = [
+
+            "Symptômes trop récents" =>
+                "Vos symptômes sont trop récents pour une consultation chirurgicale. Il faudra passer une IRM s’ils persistent au-delà de 6 semaines ou si vous ressentez une perte de force dans le membre.",
+
+            "Discopathie trop peu évoluée" =>
+                "La lésion de discopathie est encore trop peu évoluée pour envisager une chirurgie de remplacement discale. Un centre de rééducation type école du dos serait plus adapté à ce stade.",
+
+            "Parcours pas complet" =>
+                "Votre parcours de soin n’est pas complet, car vous n’avez pas encore effectué de kinésithérapie, indispensable avant de prendre un avis chirurgical pour un problème de lombalgie.",
+
+            "Absence de douleurs membres" =>
+                "En l’absence de douleurs irradiant dans un des membres, il n’y a pas lieu d’envisager un traitement chirurgical de votre hernie discale.",
+
+            "Scoliose angulation limite" =>
+                "Votre fille a une scoliose avec une angulation qui reste en dessous de la limite à partir de laquelle une chirurgie est recommandée. Elle pourra faire encore une dernière radiographie de contrôle dans 1 an, mais à priori sa scoliose ne devrait plus évoluer beaucoup.",
+
+            "Infiltration foraminale" =>
+                "Selon la tolérance de vos douleurs, vous pouvez commencer par une infiltration foraminale sous scanner que votre médecin pourrait vous prescrire. La chirurgie peut être indiquée si les douleurs persistent au-delà de 2 mois d’évolution.",
+
+        ];
+    }
+
+    public function index(Request $request) {
+
+        $page_title = $this->title;
+        $editable_message = $this->getEditableMessage('views/consultation-unnecessary/message.html');
+        $snippets = $this->snippets;
+        $name = $request->get('name');
+        $email = $request->get('email');
+        $message = $request->get('message');
+        $action = $request->get('action');
+
+        if ($name && $email && $message) {
+
+            $message_html = $this->renderQuill($message);
+
+            $message_html = $this->replaceTokens($message_html, [
+                'NOM' => $name,
+            ]);
+
+            // Data used by views and mailable object
+            $data = compact('name', 'email', 'message_html');
+
+            if ($action === 'send') {
+
+                try {
+                    Mail::to($email)->send(new Shared($data));
+                    return redirect('/consultation-unnecessary')->with('message', 'Message envoyé avec succès !');
+
+                } catch (\Swift_TransportException $STe) {
+                    $title = "Erreur lors de l'envoi de l'e-mail";
+                    $details = $STe->getMessage();
+                    return view('error', compact('title', 'details'));
+                }
+            }
+
+            return view('shared.email', ['layout' => 'layouts.preview', 'post_data' => $request->post()] + $data);
+        }
+
+        return view('shared.form', compact('page_title', 'editable_message', 'snippets'));
+    }
+}
index 5bba605debcc10bccf05ec62dd2e04e28edcdcaa..8a81b942f89a112695198f26af9e6dff640ee27e 100644 (file)
@@ -2,82 +2,37 @@
 
 namespace App\Http\Controllers;
 
-use Illuminate\Http\Request;
-use Illuminate\Support\Facades\Mail;
-use App\Mail\Diagnosis;
+use DBlackborough\Quill;
 
 class EmailController extends Controller
 {
-    public $surgeons;
-    public $pathologies;
+    public function getEditableMessage($name, $convert_line_breaks = true) {
 
-    public function __construct() {
+        $content = file_get_contents(resource_path($name));
 
-        $this->surgeons = [
-            'Guilhaume GENESTE' => [
-                'profile' => 'https://www.ccv-montpellier.fr/la-clinique/lequipe/dr-guilhaume-geneste/',
-                'bookings' => 'https://www.doctolib.fr/chirurgien-orthopediste/castelnau-le-lez/guilhaume-geneste',
-                'e-consultation' => 'https://www.consulib.com/home?showSearch=true&specialties_doctor=Guilhaume%20GENESTE&when=true&doctor=5e6fa162811d5599a6c54d96',
-            ],
-            'Grégory EDGARD-ROSA' => [
-                'profile' => 'https://www.ccv-montpellier.fr/la-clinique/lequipe/dr-gregory-edgard-rosa/',
-                'bookings' => 'https://www.doctolib.fr/chirurgien-orthopediste/castelnau-le-lez/gregory-edgard-rosa',
-                'e-consultation' => 'https://www.consulib.com/home?showSearch=true&specialties_doctor=Gr%C3%A9gory%20Edgard-Rosa&when=true&doctor=5e306e4e0d359a1ab793d3e8',
-            ],
-            'Martin GRAU ORTIZ' => [
-                'profile' => 'https://www.ccv-montpellier.fr/la-clinique/lequipe/dr-martin-grau-ortiz/',
-                'bookings' => 'https://www.doctolib.fr/chirurgien-orthopediste/castelnau-le-lez/martin-grau-ortiz',
-                'e-consultation' => 'https://www.consulib.com/home?showSearch=true&specialties_doctor=Martin%20Grau-Ortiz&when=true&doctor=5e70cddc90de0faef245adcc',
-            ],
-            'Caroline HIRSCH' => [
-                'profile' => 'https://www.ccv-montpellier.fr/la-clinique/lequipe/dr-caroline-hirsh/',
-                'bookings' => 'https://www.doctolib.fr/chirurgien-orthopediste/castelnau-le-lez/caroline-hirsch-castelnau-le-lez',
-                'e-consultation' => 'https://www.consulib.com/home?showSearch=true&specialties_doctor=caroline%20hirsch&when=true&doctor=5e6f7aff811d5599a69e4b61',
-            ],
-        ];
+        if (!$convert_line_breaks) return $content;
 
-        $this->pathologies = [
-            'Canal lombaire étroit' => 'https://www.ccv-montpellier.fr/wp-content/uploads/2020/04/Canal_lombaire_etroit.pdf',
-            'Discopathie lombaire' => 'https://www.ccv-montpellier.fr/wp-content/uploads/2020/04/Discopathie_lombaire.pdf',
-            'Hernie discale cervicale' => 'https://www.ccv-montpellier.fr/wp-content/uploads/2020/04/Hernie_discale_cervicale.pdf',
-            'Hernie discale' => 'https://www.ccv-montpellier.fr/wp-content/uploads/2020/04/Hernie_discale.pdf',
-            'Scoliose de l’adolescence' => 'https://www.ccv-montpellier.fr/wp-content/uploads/2020/04/Scoliose_adolescence.pdf',
-            'Scoliose du vieillissement' => 'https://www.ccv-montpellier.fr/wp-content/uploads/2020/04/Scoliose_vieillissement.pdf',
-            'Spondylolisthesis' => 'https://www.ccv-montpellier.fr/wp-content/uploads/2020/04/Spondylolisthesis.pdf',
-            'Tassement vertébral' => 'https://www.ccv-montpellier.fr/wp-content/uploads/2020/04/Tassement_vertebral.pdf',
-        ];
+        // Instead of using nl2br(), we do a proper find and *replace* of line breaks
+        // If we don't do this, Quill ends up with extra spaces at the start of lines
+        return str_replace(["\r\n", "\r", "\n"], "<br>", $content);
     }
 
-    public function diagnosis(Request $request) {
-
-        $surgeons = $this->surgeons;
-        $pathologies = $this->pathologies;
-        $dr = $request->get('dr');
-        $pathology = $request->get('pathology');
-        $name = $request->get('name');
-        $email = $request->get('email');
-        $action = $request->get('action');
-
-        if ($dr && $pathology && $name && $email) {
-
-            $data = compact('dr', 'pathology', 'name', 'email', 'surgeons', 'pathologies');
-
-            if ($action === 'send') {
-
-                try {
-                    Mail::to($email)->send(new Diagnosis($data));
-                    return redirect('/diagnosis')->with('message', 'Message envoyé avec succès !');
+    public function renderQuill($quill_JSON) {
+        try {
+            $quill = new Quill\Render($quill_JSON, 'HTML');
+            return $quill->render();
+        } catch (\Exception $e) {
+            echo $e->getMessage();
+        }
+        return false;
+    }
 
-                } catch (\Swift_TransportException $STe) {
-                    $title = "Erreur lors de l'envoi de l'e-mail";
-                    $details = $STe->getMessage();
-                    return view('error', compact('title', 'details'));
-                }
-            }
+    public function replaceTokens($content, $replacements) {
 
-            return view('diagnosis.email', ['layout' => 'layouts.preview', 'post_data' => $request->post()] + $data);
+        foreach ($replacements as $token => $replacement) {
+            $content = str_replace("{{ $token }}", $replacement, $content);
         }
 
-        return view('diagnosis.form', compact('surgeons', 'pathologies'));
+        return $content;
     }
 }
diff --git a/app/Http/Controllers/EmailDiagnosisController.php b/app/Http/Controllers/EmailDiagnosisController.php
new file mode 100644 (file)
index 0000000..3e8c0df
--- /dev/null
@@ -0,0 +1,114 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Mail;
+use App\Mail\Diagnosis;
+
+class EmailDiagnosisController extends EmailController
+{
+    public $surgeons;
+    public $pathologies;
+    public $snippets;
+
+    public function __construct() {
+
+        $this->surgeons = [
+            'Guilhaume GENESTE' => [
+                'profile' => 'https://www.ccv-montpellier.fr/la-clinique/lequipe/dr-guilhaume-geneste/',
+                'bookings' => 'https://www.doctolib.fr/chirurgien-orthopediste/castelnau-le-lez/guilhaume-geneste',
+                'e-consultation' => 'https://www.consulib.com/home?showSearch=true&specialties_doctor=Guilhaume%20GENESTE&when=true&doctor=5e6fa162811d5599a6c54d96',
+            ],
+            'Grégory EDGARD-ROSA' => [
+                'profile' => 'https://www.ccv-montpellier.fr/la-clinique/lequipe/dr-gregory-edgard-rosa/',
+                'bookings' => 'https://www.doctolib.fr/chirurgien-orthopediste/castelnau-le-lez/gregory-edgard-rosa',
+                'e-consultation' => 'https://www.consulib.com/home?showSearch=true&specialties_doctor=Gr%C3%A9gory%20Edgard-Rosa&when=true&doctor=5e306e4e0d359a1ab793d3e8',
+            ],
+            'Martin GRAU ORTIZ' => [
+                'profile' => 'https://www.ccv-montpellier.fr/la-clinique/lequipe/dr-martin-grau-ortiz/',
+                'bookings' => 'https://www.doctolib.fr/chirurgien-orthopediste/castelnau-le-lez/martin-grau-ortiz',
+                'e-consultation' => 'https://www.consulib.com/home?showSearch=true&specialties_doctor=Martin%20Grau-Ortiz&when=true&doctor=5e70cddc90de0faef245adcc',
+            ],
+            'Caroline HIRSCH' => [
+                'profile' => 'https://www.ccv-montpellier.fr/la-clinique/lequipe/dr-caroline-hirsh/',
+                'bookings' => 'https://www.doctolib.fr/chirurgien-orthopediste/castelnau-le-lez/caroline-hirsch-castelnau-le-lez',
+                'e-consultation' => 'https://www.consulib.com/home?showSearch=true&specialties_doctor=caroline%20hirsch&when=true&doctor=5e6f7aff811d5599a69e4b61',
+            ],
+        ];
+
+        $this->pathologies = [
+            'Canal lombaire étroit' => 'https://www.ccv-montpellier.fr/wp-content/uploads/2020/04/Canal_lombaire_etroit.pdf',
+            'Discopathie lombaire' => 'https://www.ccv-montpellier.fr/wp-content/uploads/2020/04/Discopathie_lombaire.pdf',
+            'Hernie discale cervicale' => 'https://www.ccv-montpellier.fr/wp-content/uploads/2020/04/Hernie_discale_cervicale.pdf',
+            'Hernie discale' => 'https://www.ccv-montpellier.fr/wp-content/uploads/2020/04/Hernie_discale.pdf',
+            'Scoliose de l’adolescence' => 'https://www.ccv-montpellier.fr/wp-content/uploads/2020/04/Scoliose_adolescence.pdf',
+            'Scoliose du vieillissement' => 'https://www.ccv-montpellier.fr/wp-content/uploads/2020/04/Scoliose_vieillissement.pdf',
+            'Spondylolisthesis' => 'https://www.ccv-montpellier.fr/wp-content/uploads/2020/04/Spondylolisthesis.pdf',
+            'Tassement vertébral' => 'https://www.ccv-montpellier.fr/wp-content/uploads/2020/04/Tassement_vertebral.pdf',
+        ];
+
+        $this->snippets = [
+            "Complément scanner" => "Un complément d’imagerie par un scanner lombaire de moins de 12 mois va être utile pour déterminer le choix de l’implant de remplacement discal. Muni de celui-ci, vous pourrez vous rapprocher de notre secrétariat pour l’envoi des images et prendre ainsi RDV en consultation.",
+
+            "Complément IRM" => "Un complément d’imagerie par une IRM lombaire de moins de 12 mois va être utile pour discuter la qualité de l’indication opératoire, qui n’est pas systématique dans ce type de cas. Muni de celle-ci, vous pourrez vous rapprocher de notre secrétariat pour l’envoi des images et prendre ainsi RDV en consultation.",
+
+            "Bonne indication de prothèse" => "Le fait que cette discopathie soit à la fois très évoluée, très inflammatoire et unique, en fait une très bonne indication de prothèse discale. Un scanner lombaire sera néanmoins nécessaire pour confirmer l’indication opératoire et le choix de l’implant.",
+
+            "Aucune indication chirurgicale formelle" => "Votre dossier est néanmoins complexe, car vos discopathies sont multiples. 
Il n'y a donc chez vous aucune indication chirurgicale formelle, mais une possibilité de discuter un geste chirurgical non obligatoire.",
+
+            "Lésions discales légères" => "Votre dossier nécessite une discussion subtile car vos lésions discales sont assez légères alors que vos symptômes semblent être importants. La décision de pose de prothèse discale ne sera donc pas systématique. ",
+
+            "Ablation hernie ou remplacement discal" => "Typiquement, il existe une discussion chez vous entre réaliser à nouveau à l’ablation de votre hernie discale, ou bien procéder à une chirurgie de remplacement discal pour un traitement plus global de votre pathologie.",
+
+            "Évaluation chirurgicale de situation" => "La hernie est assez volumineuse, et vos douleurs résistent au traitement médical. Il y a donc une indication à une évaluation chirurgicale de votre situation.",
+        ];
+    }
+
+    public function index(Request $request) {
+
+        $surgeons = $this->surgeons;
+        $pathologies = $this->pathologies;
+        $editable_message = $this->getEditableMessage('views/diagnosis/message.html');
+        $snippets = $this->snippets;
+        $dr = $request->get('dr');
+        $pathology = $request->get('pathology');
+        $name = $request->get('name');
+        $email = $request->get('email');
+        $message = $request->get('message');
+        $action = $request->get('action');
+
+        if ($dr && $pathology && $name && $email && $message) {
+
+            $message_html = $this->renderQuill($message);
+
+            $message_html = $this->replaceTokens($message_html, [
+                'NOM' => $name,
+                'DOCTEUR' => $dr,
+                'DOCTEUR_LIEN' => $this->surgeons[$dr]['profile'],
+                'PATHOLOGIE' => $pathology,
+                'PATHOLOGIE_LIEN' => $this->pathologies[$pathology],
+            ]);
+
+            // Data used by views and mailable object
+            $data = compact('dr', 'pathology', 'name', 'email', 'message_html', 'surgeons', 'pathologies');
+
+            if ($action === 'send') {
+
+                try {
+                    Mail::to($email)->send(new Diagnosis($data));
+                    return redirect('/diagnosis')->with('message', 'Message envoyé avec succès !');
+
+                } catch (\Swift_TransportException $STe) {
+                    $title = "Erreur lors de l'envoi de l'e-mail";
+                    $details = $STe->getMessage();
+                    return view('error', compact('title', 'details'));
+                }
+            }
+
+            return view('diagnosis.email', ['layout' => 'layouts.preview', 'post_data' => $request->post()] + $data);
+        }
+
+        return view('diagnosis.form', compact('surgeons', 'pathologies', 'editable_message', 'snippets'));
+    }
+}
diff --git a/app/Http/Controllers/EmailDossierIncompleteController.php b/app/Http/Controllers/EmailDossierIncompleteController.php
new file mode 100644 (file)
index 0000000..65ac8d1
--- /dev/null
@@ -0,0 +1,65 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Mail;
+use App\Mail\Shared;
+
+class EmailDossierIncompleteController extends EmailController
+{
+    public $snippets;
+    public $title;
+
+    public function __construct() {
+
+        $this->title = "Dossier incomplet";
+
+        $this->snippets = [
+
+            "IRM lombaire plus complète" =>
+                "Une IRM lombaire plus complète, idéalement réalisée directement à la clinique du Parc avant votre rdv chirurgical.",
+
+        ];
+    }
+
+    public function index(Request $request) {
+
+        $page_title = $this->title;
+        $editable_message = $this->getEditableMessage('views/dossier-incomplete/message.html', false);
+        $snippets = $this->snippets;
+        $name = $request->get('name');
+        $email = $request->get('email');
+        $message = $request->get('message');
+        $action = $request->get('action');
+
+        if ($name && $email && $message) {
+
+            $message_html = $this->renderQuill($message);
+
+            $message_html = $this->replaceTokens($message_html, [
+                'NOM' => $name,
+            ]);
+
+            // Data used by views and mailable object
+            $data = compact('name', 'email', 'message_html');
+
+            if ($action === 'send') {
+
+                try {
+                    Mail::to($email)->send(new Shared($data));
+                    return redirect('/dossier-incomplete')->with('message', 'Message envoyé avec succès !');
+
+                } catch (\Swift_TransportException $STe) {
+                    $title = "Erreur lors de l'envoi de l'e-mail";
+                    $details = $STe->getMessage();
+                    return view('error', compact('title', 'details'));
+                }
+            }
+
+            return view('shared.email', ['layout' => 'layouts.preview', 'post_data' => $request->post()] + $data);
+        }
+
+        return view('shared.form', compact('page_title', 'editable_message', 'snippets'));
+    }
+}
diff --git a/app/Http/Controllers/EmailMissingImageryController.php b/app/Http/Controllers/EmailMissingImageryController.php
new file mode 100644 (file)
index 0000000..73d1cef
--- /dev/null
@@ -0,0 +1,79 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Mail;
+use App\Mail\Shared;
+
+class EmailMissingImageryController extends EmailController
+{
+    public $snippets;
+    public $title;
+
+    public function __construct() {
+
+        $this->title = "Bug transfert d’imagerie";
+
+        $this->snippets = [
+
+            "Sans imagerie" =>
+                "Sans imagerie nous ne pouvons malheureusement pas étudier votre dossier. Peut-être pourriez-vous essayer de remplir à nouveau un formulaire en transférant vos images depuis le CD ou en nous communiquant éventuellement un lien pour visualiser votre imagerie en ligne. Vous pouvez également prendre contact auprès de notre secrétariat pour obtenir de l’aide dans vos démarches.",
+
+            "Lien internet incorrect" =>
+                "Le lien internet vers le site d’imagerie médicale en ligne que vous nous avez fourni pour consulter votre imagerie semble incorrect et ne nous a pas permis de visualiser les images.<br><br>Pourriez-vous vérifier vos informations et soumettre à nouveau votre formulaire de demande de diagnostic ? Vous pouvez également vous rapprocher de votre cabinet de radiologie pour corriger une éventuelle erreur.",
+
+            "Compte rendu sans images" =>
+                "Le lien internet que vous nous avez fourni permet uniquement de consulter votre compte-rendu et ne permet pas de visualiser les images. Veuillez vous rapprocher de votre cabinet de radiologie pour obtenir les codes permettant de visualiser ces images et nous soumettre à nouveau votre formulaire.",
+
+            "Identifiants incorrects" =>
+                "Les mots de passe et identifiant que vous nous avez fourni pour consulter votre imagerie semblent incorrects et ne nous ont pas permis de visualiser vos examens.<br><br>Pourriez-vous vérifier vos informations et soumettre à nouveau votre formulaire de demande de diagnostic ? Vous pouvez également vous rapprocher de votre cabinet de radiologie pour corriger une éventuelle erreur.",
+
+            "Échec transfert mobile" =>
+                "Le transfert de vos images à partir de votre mobile n’a pas fonctionné. Peut-être pourriez-vous essayer de remplir à nouveau un formulaire en transférant vos images depuis le CD ou en nous communiquant éventuellement un lien pour visualiser votre imagerie en ligne, ou à défaut transférer vos images en retour ce cet email. Vous pouvez également prendre contact auprès de notre secrétariat pour obtenir de l’aide dans vos démarches.",
+
+            "Échec transfert CD" =>
+                "Le transfert de vos images à partir de votre CD d'imagerie n’a pas fonctionné. Peut-être pourriez-vous essayer de remplir à nouveau un formulaire ou de prendre contact avec notre secrétariat pour obtenir de l’aide dans vos démarches.",
+        ];
+    }
+
+    public function index(Request $request) {
+
+        $page_title = $this->title;
+        $editable_message = $this->getEditableMessage('views/missing-imagery/message.html');
+        $snippets = $this->snippets;
+        $name = $request->get('name');
+        $email = $request->get('email');
+        $message = $request->get('message');
+        $action = $request->get('action');
+
+        if ($name && $email && $message) {
+
+            $message_html = $this->renderQuill($message);
+
+            $message_html = $this->replaceTokens($message_html, [
+                'NOM' => $name,
+            ]);
+
+            // Data used by views and mailable object
+            $data = compact('name', 'email', 'message_html');
+
+            if ($action === 'send') {
+
+                try {
+                    Mail::to($email)->send(new Shared($data));
+                    return redirect('/missing-imagery')->with('message', 'Message envoyé avec succès !');
+
+                } catch (\Swift_TransportException $STe) {
+                    $title = "Erreur lors de l'envoi de l'e-mail";
+                    $details = $STe->getMessage();
+                    return view('error', compact('title', 'details'));
+                }
+            }
+
+            return view('shared.email', ['layout' => 'layouts.preview', 'post_data' => $request->post()] + $data);
+        }
+
+        return view('shared.form', compact('page_title', 'editable_message', 'snippets'));
+    }
+}
index df7d0b5eeb27919ae6b4c91bf9ba80d0c169f819..d428bd60fa7bcb8367b644a0a9d2eb36499efc75 100644 (file)
@@ -30,16 +30,20 @@ class Diagnosis extends Mailable
      */
     public function build()
     {
-        $subject = 'Votre E-Diagnostic';
+        $subject = 'Votre E-diagnostic - CCV Montpellier';
 
         return $this->view('diagnosis.email')
-            ->subject($subject)->with([
-                'dr' => $this->data['dr'],
-                'pathology' => $this->data['pathology'],
-                'name' => $this->data['name'],
-                'email' => $this->data['email'],
-                'surgeons' => $this->data['surgeons'],
-                'pathologies' => $this->data['pathologies']
-            ]);
+                    ->with([
+                        'dr' => $this->data['dr'],
+                        'pathology' => $this->data['pathology'],
+                        'name' => $this->data['name'],
+                        'email' => $this->data['email'],
+                        'surgeons' => $this->data['surgeons'],
+                        'pathologies' => $this->data['pathologies'],
+                        'message_html' => $this->data['message_html'],
+                        // NOTE: can't use view variable named $message because it causes an exception
+                        // See: https://stackoverflow.com/a/46605365
+                    ])
+                    ->subject($subject);
     }
 }
diff --git a/app/Mail/Shared.php b/app/Mail/Shared.php
new file mode 100644 (file)
index 0000000..cbfeb8d
--- /dev/null
@@ -0,0 +1,45 @@
+<?php
+
+namespace App\Mail;
+
+use Illuminate\Bus\Queueable;
+use Illuminate\Contracts\Queue\ShouldQueue;
+use Illuminate\Mail\Mailable;
+use Illuminate\Queue\SerializesModels;
+
+class Shared extends Mailable
+{
+    use Queueable, SerializesModels;
+
+    public $data;
+
+    /**
+     * Create a new message instance.
+     *
+     * @return void
+     */
+    public function __construct($data)
+    {
+        $this->data = $data;
+    }
+
+    /**
+     * Build the message.
+     *
+     * @return $this
+     */
+    public function build()
+    {
+        $subject = 'Votre E-diagnostic - CCV Montpellier';
+
+        return $this->view('shared.email')
+                    ->with([
+                        'name' => $this->data['name'],
+                        'email' => $this->data['email'],
+                        'message_html' => $this->data['message_html'],
+                        // NOTE: can't use view variable named $message because it causes an exception
+                        // See: https://stackoverflow.com/a/46605365
+                    ])
+                    ->subject($subject);
+    }
+}
index def61d393f3a705c94fd24bf7e62ae6c7f5e7d1c..dd3f21908278f0197947c7577f7e57dd1a13e803 100644 (file)
@@ -9,6 +9,7 @@
     "license": "MIT",
     "require": {
         "php": "^7.3|^8.0",
+        "deanblackborough/php-quill-renderer": "^3.18",
         "fideloper/proxy": "^4.4",
         "fruitcake/laravel-cors": "^2.0",
         "guzzlehttp/guzzle": "^7.0.1",
index b44da9c61246893976ed7a25aa493ff6e8a336a6..db7fb06346f60f837049f89536805ff5b9b6b418 100644 (file)
@@ -4,7 +4,7 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
         "This file is @generated automatically"
     ],
-    "content-hash": "cb237b1fa6422b85262f95e568ec5de5",
+    "content-hash": "84ad18c202f157faf15ff67ab59bcab6",
     "packages": [
         {
             "name": "asm89/stack-cors",
             ],
             "time": "2021-01-20T22:51:39+00:00"
         },
+        {
+            "name": "deanblackborough/php-quill-renderer",
+            "version": "v3.18.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/deanblackborough/php-quill-renderer.git",
+                "reference": "11d3c7c0105a09ca007fc51925373ef5da168a9d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/deanblackborough/php-quill-renderer/zipball/11d3c7c0105a09ca007fc51925373ef5da168a9d",
+                "reference": "11d3c7c0105a09ca007fc51925373ef5da168a9d",
+                "shasum": ""
+            },
+            "require": {
+                "ext-json": "*",
+                "php": "^7.1"
+            },
+            "require-dev": {
+                "php-coveralls/php-coveralls": "^2",
+                "phpunit/phpunit": "^7"
+            },
+            "suggest": {
+                "php": "^7.2"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "DBlackborough\\Quill\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Dean Blackborough",
+                    "email": "dean@g3d-development.com"
+                }
+            ],
+            "description": "Render quill insert deltas to HTML, Markdown and GitHub flavoured Markdown",
+            "homepage": "http://www.transmute-coffee.com/php-quill-renderer.php",
+            "keywords": [
+                "delta",
+                "html",
+                "markdown",
+                "parse",
+                "php",
+                "quill",
+                "quilljs",
+                "renderer"
+            ],
+            "support": {
+                "issues": "https://github.com/deanblackborough/php-quill-renderer/issues",
+                "source": "https://github.com/deanblackborough/php-quill-renderer/tree/v3.18.1"
+            },
+            "time": "2019-12-10T22:44:21+00:00"
+        },
         {
             "name": "dnoegel/php-xdg-base-dir",
             "version": "v0.1.1",
diff --git a/resources/views/components/quill.blade.php b/resources/views/components/quill.blade.php
new file mode 100644 (file)
index 0000000..e0a7e44
--- /dev/null
@@ -0,0 +1,97 @@
+{{-- Quill JS Editor --}}
+
+@props([
+    'field_name' => 'message',
+    'snippets' => [],
+])
+
+<div class="w-full mt-2 bg-white" id="{{ $field_name }}">{{ $slot }}</div>
+<textarea name="{{ $field_name }}" class="hidden">{{-- Populated by form submit listener + used to repopulate editor. Can't have any whitespace here --}}</textarea>
+
+@push('head')
+    <link href="https://cdn.quilljs.com/1.3.6/quill.snow.css" rel="stylesheet">
+    <style>
+        .ql-toolbar.ql-snow {
+            background-color: #d9dde0;
+        }
+
+        .ql-snow .ql-picker.ql-expanded .ql-picker-label::before {
+            color: #777;
+        }
+
+        .ql-snow.ql-toolbar button:hover, .ql-snow .ql-toolbar button:hover, .ql-snow.ql-toolbar button:focus, .ql-snow .ql-toolbar button:focus, .ql-snow.ql-toolbar button.ql-active, .ql-snow .ql-toolbar button.ql-active, .ql-snow.ql-toolbar .ql-picker-label:hover, .ql-snow .ql-toolbar .ql-picker-label:hover, .ql-snow.ql-toolbar .ql-picker-label.ql-active, .ql-snow .ql-toolbar .ql-picker-label.ql-active, .ql-snow.ql-toolbar .ql-picker-item:hover, .ql-snow .ql-toolbar .ql-picker-item:hover, .ql-snow.ql-toolbar .ql-picker-item.ql-selected, .ql-snow .ql-toolbar .ql-picker-item.ql-selected {
+            color: #ff078b;
+        }
+
+        .ql-snow.ql-toolbar button:hover .ql-stroke, .ql-snow .ql-toolbar button:hover .ql-stroke, .ql-snow.ql-toolbar button:focus .ql-stroke, .ql-snow .ql-toolbar button:focus .ql-stroke, .ql-snow.ql-toolbar button.ql-active .ql-stroke, .ql-snow .ql-toolbar button.ql-active .ql-stroke, .ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke, .ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke, .ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke, .ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke, .ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke, .ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke, .ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke, .ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke, .ql-snow.ql-toolbar button:hover .ql-stroke-miter, .ql-snow .ql-toolbar button:hover .ql-stroke-miter, .ql-snow.ql-toolbar button:focus .ql-stroke-miter, .ql-snow .ql-toolbar button:focus .ql-stroke-miter, .ql-snow.ql-toolbar button.ql-active .ql-stroke-miter, .ql-snow .ql-toolbar button.ql-active .ql-stroke-miter, .ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke-miter, .ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke-miter, .ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter, .ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter, .ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke-miter, .ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke-miter, .ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter, .ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter {
+            stroke: #ff078b;
+        }
+
+        .ql-editor a, .ql-snow a {
+            color: #ff078b;
+        }
+    </style>
+@endpush
+
+@push('scripts')
+    <script src="https://cdn.quilljs.com/1.3.6/quill.js"></script>
+    {{-- Quill Toolbar library: https://github.com/T-vK/DynamicQuillTools --}}
+    <script src="https://cdn.jsdelivr.net/gh/T-vK/DynamicQuillTools@master/DynamicQuillTools.js"></script>
+    <script>
+
+        let quill = new Quill('#message', {
+            theme: 'snow',
+            modules: {
+                toolbar: [['bold', 'italic', 'underline'], ['link']]
+            }
+        });
+
+        // Quill would normally reset any changes in the editor after going to the preview and then returning
+        // via the back button. However, we can re-use the saved JSON that is set when submitting the form to
+        // repopulate the editor.
+        setTimeout(function() {
+            let backup = document.querySelector('textarea[name={{ $field_name }}]');
+            if (backup && backup.value !== '') {
+                quill.setContents(JSON.parse(backup.value));
+            }
+        }, 10);
+
+        const snippets = {
+            @foreach ($snippets as $title => $value)
+            '{{ $title }}': "{!! $value !!}",
+            @endforeach
+        };
+
+        const snippetsDropDown = new QuillToolbarDropDown({
+            label: "+ Ajouter un texte prédéfini",
+            rememberSelection: false
+        });
+
+        snippetsDropDown.setItems(snippets);
+
+        snippetsDropDown.onSelect = function(label, value, quill) {
+
+            const selection = quill.selection.savedRange;
+
+            // TODO: improve the insertion of snippets so they have a good amount of space around them
+            let html = (selection.index === 0) ? `${value}<br /><br /><br />` : `<br />${value}<br /><br />`;
+
+            quill.deleteText(selection.index, selection.length); // Replace any highlighted text
+            console.log('res', quill.clipboard.dangerouslyPasteHTML(selection.index, html));
+            quill.setSelection(selection.index + value.length + 1)
+        };
+
+        snippetsDropDown.attach(quill);
+
+        //=== Handle form submit and get Quill data
+        let form = document.querySelector('form');
+        form.onsubmit = function() {
+            // Populate hidden message field with Quill data
+            let message = document.querySelector('textarea[name={{ $field_name }}]');
+            message.value = JSON.stringify(quill.getContents());
+
+            return true;
+        }
+
+    </script>
+@endpush
diff --git a/resources/views/components/trim.blade.php b/resources/views/components/trim.blade.php
new file mode 100644 (file)
index 0000000..4442898
--- /dev/null
@@ -0,0 +1,7 @@
+{{-- Trim whitespace around input --}}
+@php
+    $lines = explode(PHP_EOL, $slot);
+    $lines = array_map('trim', $lines);
+@endphp
+
+{{ implode(PHP_EOL, $lines) }}
diff --git a/resources/views/consultation-unnecessary/message.html b/resources/views/consultation-unnecessary/message.html
new file mode 100644 (file)
index 0000000..de6bd80
--- /dev/null
@@ -0,0 +1,19 @@
+Bonjour {{ NOM }},
+
+Merci d’avoir sollicité le CCV Montpellier pour obtenir votre E-Diagnostic sur vos problèmes de dos. Vous exprimez ainsi votre confiance dans l’avis de nos spécialistes, et nous vous en sommes reconnaissants.
+
+Le formulaire que vous avez rempli ainsi que la visualisation de votre imagerie médicale, nous a permis d’évaluer la sévérité de vos symptômes, le degré de gravité de vos lésions et la qualité de votre parcours de soins, indispensable avant toute décision chirurgicale.
+
+Conformément aux informations que vous nous avez transmis, il ressort de votre dossier qu’il n’y a pas lieu d’envisager pour le moment une consultation chirurgicale avec nos spécialistes du CCV.

+
+<strong>Votre parcours de soin n’est pas complet, car vous n’avez pas encore effectué de kinésithérapie, indispensable avant de prendre un avis chirurgical pour un problème de lombalgie.</strong>
+
+Cette étude préliminaire gratuite a pour but de faire éviter le déplacement et le coût d’une consultation inutile à des personnes dont les conditions sont manifestement trop loin d’être réunies, pour qu’une discussion sur une éventuelle intervention chirurgicale soit justifiée.
+
+L’avis médical qui vous est ainsi rendu, ne constitue pas un acte médical et ne peut donc se substituer à une véritable consultation médicale.
+
+Nous vous conseillons vivement de faire réévaluer vos symptômes par votre médecin traitant, qui pourra préciser son diagnostic sur votre pathologie au terme de son examen et, le cas échéant, soit vous prescrire des soins plus adaptés, soit requérir tout de même un avis spécialiste.
+
+Si cette demande d’avis spécialisée est prescrite par lui, vous pourrez bien sûr, munie de son courrier, prendre rendez-vous avec un de nos chirurgiens, soit par téléphone, soit par internet en suivant directement ce lien : <a href="https://www.doctolib.fr/cabinet-medical/castelnau-le-lez/ccv-montpellier" target="_blank">Rendez-vous au CCV</a>
+
+Nous restons biensur à votre disposition si votre pathologie évolue dans l’avenir. N’hésitez pas alors, à nous solliciter à nouveau.

index 782229e452555e75a57abb6045201cb525ada0cd..8ec38c18363b9bc6ae28daa0010fc11fa7b5c6ed 100644 (file)
@@ -1,67 +1,14 @@
 @extends($layout ?? 'layouts.email-wrapper')
 
-@push('head')
-    <style>
-        body {
-            font-family: sans-serif;
-        }
-        a {
-            color: #ff078b;
-            text-decoration: underline;
-        }
-
-        img {
-            display: inline;
-        }
-
-        .text-sm {
-            font-size: 13px;
-        }
-
-        .text-xs {
-            font-size: 10px;
-        }
-    </style>
-@endpush
-
 @section('content')
 
     @parent
 
-    {{-- HEADER --}}
-    <table role="presentation" width="100%">
-        <tr>
-            <td style="padding:10px 10px 20px 10px;text-align:center;">
-                <a href="https://www.ccv-montpellier.fr/">
-                    <img src="{{ url('assets/CCV_logo.png') }}" alt="CCV Montpellier" width="200" style="max-width:200px;width:100%;height:auto;" />
-                </a>
-                <x-spacer height="32px" />
-                <img src="{{ url('assets/CCV_slogan.png') }}" alt="Trouvons ensemble la solution chirurgicale à votre problème de dos" width="540" style="max-width:540px;width:100%;height:auto;" />
-                <br><br>
-
-                <x-divider />
-            </td>
-        </tr>
-    </table>
-
     {{-- Body Intro --}}
     <table role="presentation" width="100%">
         <tr>
-            <td class="text-sm" style="padding:10px 10px 20px 10px;">
-                Bonjour {{ $name }},<br>
-                <br>
-                Merci d’avoir sollicité le CCV Montpellier pour obtenir votre E-Diagnostic sur vos problèmes de dos.<br>
-                <br>
-                Vous exprimez ainsi votre confiance dans l’avis de nos spécialistes, et nous vous en sommes reconnaissants.<br>
-                <br>
-                L’étude préliminaire de vos informations médicales par l’équipe du CCV Montpellier, a permis de diagnostiquer une pathologie
-                de&nbsp;<b>{{ $pathology }}</b>&nbsp;qui pourrait être prise en charge par un de nos spécialistes.<br>
-                <br>
-                Vous trouverez&nbsp;<a href="{{ $pathologies[$pathology] }}">ici</a>, une fiche résumant cette pathologie et les possibilités de traitements.<br>
-                <br>
-                Le Docteur&nbsp;<a href="{{ $surgeons[$dr]['profile'] }}">{{ $dr }}</a>&nbsp;chirurgien spécialisé dans la pathologie vertébrale, pourra vous recevoir en consultation pour une étude complète de votre dossier.<br>
-                <br>
-                Pour prendre rendez-vous, veuillez choisir votre mode de consultation :
+            <td class="quill text-sm" style="padding:10px 10px 20px 10px;">
+                {!! $message_html !!}
             </td>
         </tr>
     </table>
 
     </x-columns>
 
-    <table role="presentation" width="100%">
-        <tr>
-            <td class="text-sm" style="padding:10px 10px 20px 10px;">
-                Bien cordialement,
-                <br><br>
-                <b>L’équipe du CCV MONTPELLIER</b>
-            </td>
-        </tr>
-    </table>
-
-    <x-divider />
-    <x-spacer height="30px" />
-
-    {{-- Social icons --}}
-    <table role="presentation" width="100%">
-        <tr>
-            <td align="center">
-                <table width="100%" border="0" style="max-width:490px">
-                    <tr>
-                        <td width="33%" valign="middle" align="center"><a href="https://www.instagram.com/ccv_montpellier/"><img src="{{ url('assets/instagram.png') }}" alt="Instagram CCV" moz-do-not-send="true" width="27" vspace="0" hspace="0" height="27" border="0" align="middle"></a></td>
-                        <td width="33%" valign="middle" align="center"><a href="https://www.youtube.com/channel/UC3DJtYRhJ-WJo165H3TyjKQ"><img src="{{ url('assets/youtube.png') }}" alt="YouTube CCV" moz-do-not-send="true" width="37" vspace="0" hspace="0" height="26" border="0" align="middle"></a></td>
-                        <td width="33%" valign="middle" align="center"><a href="http://www.sosdos-montpellier.fr/"><img src="{{ url('assets/SOS_DOS.png') }}" alt="SOS DOS" moz-do-not-send="true" width="47" vspace="0" hspace="0" height="28" border="0" align="middle"></a></td>
-                    </tr>
-                </table>
-            </td>
-        </tr>
-    </table>
-
-    <x-spacer height="30px" />
-    <x-divider />
-    <x-spacer height="20px" />
-
-    <div style="font-size:13px;text-align:center;">
-        <a href="https://goo.gl/maps/xsQwUZt35rPTtqaFA" style="color:#2e2c40;text-decoration: underline;">
-            Clinique du Parc<br>
-            50 Rue Emile Combes<br>
-            34170 Castelnau-le-Lez
-        </a>
-        <br><br>
-        <a href="tel:0467331363" style="color:#2e2c40;text-decoration: underline;">
-            04 67 33 13 63
-        </a>
-        <br><br>
-        <a href="mailto:ccv@ccv-montpellier.fr" style="color:#2e2c40;text-decoration: underline;">
-            ccv@ccv-montpellier.fr
-        </a>
-    </div>
-
-    <x-spacer height="20px" />
-    <x-divider />
-    <x-spacer height="40px" />
-
-    {{-- Tarifs --}}
-    <table width="100%" cellspacing="0" cellpadding="20" border="0" bgcolor="#f6f5f5" align="center">
-        <tr>
-            <td>
-                <h3 style="font-size: 19px;margin: 0 0 1em 0;">Tarifs des consultations du CCV MONTPELLIER</h3>
-                <table width="100%" cellspacing="0" cellpadding="15" border="0" align="center" class="text-sm">
-                    <tbody>
-                    <tr>
-                        <td width="85%" valign="middle" bgcolor="#ffffff"><b>Étude préliminaire de votre dossier</b>&nbsp;(Demande d'avis médical en ligne) :<br></td>
-                        <td valign="middle" bgcolor="#ffffff" align="right"><b>Gratuit</b><br></td>
-                    </tr>
-                    <tr>
-                        <td width="85%" valign="middle" align="left"><b>Consultation médicale au CCV (Clinique du Parc) :</b><br><span class="text-xs">(Base de Remboursement SS : 50€ pour un avis spécialiste ponctuel , 23€ pour une consultation de suivi. Prise en charge mutuelle pour le reste à charge).</span><br></td>
-                        <td valign="middle" align="right"><b>80€</b><br></td>
-                    </tr>
-                    <tr>
-                        <td width="85%" valign="middle" bgcolor="#ffffff" align="left"><b>Téléconsultation médicale en ligne (Vidéo consultation) :</b><br><span class="text-xs">Incluant une étude approfondie de votre dossier et la rédaction d’un rapport médical (Base de Remboursement SS : 50€ pour un avis spécialiste ponctuel. Prise en charge mutuelle pour le reste à charge).</span><br></td>
-                        <td valign="middle" bgcolor="#ffffff" align="right"><b>100€</b><br></td>
-                    </tr>
-                    <tr>
-                        <td width="85%" valign="middle"><b>Séjour médical personnalisé :</b><br><span class="text-xs">Incluant frais d’hospitalisation, transport, hébergement et prestations personnalisées à la clinique.</span><br></td>
-                        <td valign="middle" align="right"><b>Sur devis</b><br></td>
-                    </tr>
-                    <tr>
-                        <td width="85%" valign="middle" bgcolor="#ffffff"><b>Interventions pour patients français</b><br><span class="text-xs">Pour les patients français affiliés à la Sécurité Sociale, seuls les dépassements d’honoraires seront à régler. Leurs montants vous seront communiqués sur simple demande.</span><br></td>
-                        <td valign="middle" bgcolor="#ffffff" align="right"><b>Sur devis</b><br></td>
-                    </tr>
-                    </tbody>
-                </table>
-            </td>
-        </tr>
-        <tr>
-            <td>
-                <h3 style="font-size: 19px;margin: 0 0 1em 0;"><b>Vous ne connaissez pas encore le service ma E-Consultation du CCV MONTPELLIER ?</b></h3>
-                <div class="text-sm">
-                    La téléconsultation vidéo vous permet d’expliquer en détail votre histoire médicale, de préciser vos symptômes et vos attentes dans la prise en charge de votre pathologie. Toutes vos questions pourront être abordées pendant cet entretien.<br>Les échanges avec votre chirurgien lui permettront de préciser son diagnostic, de vous expliquer l’origine de vos douleurs et de vous détailler un programme de soins, avec ses bénéfices, ses risques, ses taux de réussite et ses échecs.&nbsp;
-                    <br>
-                    <br>
-                    Ce programme de soins ne conduira pas systématiquement à une proposition de chirurgie, puisque l’intervention reste le dernier recours dans la plupart des pathologies du dos.
-                    <br>
-                    <br>Si toutefois, une chirurgie devait être réalisée au CCV MONTPELLIER, notre plateforme e-medecine pourra se charger de l’organisation complète de votre voyage médical.&nbsp;<a href="https://www.ccv-montpellier.fr/notre-offre-de-voyage-medical/">En savoir plus</a>&nbsp;<br>
-                    <br>
-                    Besoin d’aide ? D’information complémentaire ? Nos secrétaires médicales se feront un plaisir d’échanger avec vous du lundi au vendredi de 9h00 à 18h00.&nbsp;<a moz-do-not-send="true" href="https://www.ccv-montpellier.fr/contact/">Pour être rappelé par le secrétariat médical du CCV Montpellier, cliquez-ici.</a>
-                </div>
-            </td>
-        </tr>
-    </table>
-
 @endsection
index 35e051b82629b06e2b2968f1b4b682faa722fe57..52204cca2c72e1417bc330c91275d635b94ce047 100644 (file)
@@ -2,7 +2,9 @@
 
 @section('content')
 
-    <h1 class="text-xl font-bold mb-4">E-mail de diagnostic</h1>
+    <a href="/"><img src="/assets/CCV_logo.png" alt="CCV Montpellier"></a>
+
+    <h1 class="text-xl font-bold my-4">E-mail de diagnostic</h1>
 
     @if (session('message'))
         <div class="py-2 px-6 border mb-6 bg-green-100 border-green-400 rounded">
@@ -10,7 +12,7 @@
         </div>
     @endif
 
-    <form action="{{ $_SERVER['REQUEST_URI'] }}" method="post" class="max-w-xl mx-6 sm:mx-auto p-6 bg-gray-200 rounded-lg">
+    <form action="{{ $_SERVER['REQUEST_URI'] }}" method="post" class="max-w-3xl mx-6 sm:mx-auto p-6 bg-gray-200 rounded-lg">
 
         @csrf
 
 
         </div>
 
+        <label class="mt-6 mb-2 block text-grey-darker text-sm font-bold" for="message">
+            Message
+        </label>
+
+        <x-quill :snippets="$snippets">{!! $editable_message !!}</x-quill>
+
         <input type="submit" value="Aperçu &rarr;" class="block mt-6 ml-auto bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-8 rounded cursor-pointer">
     </form>
 
diff --git a/resources/views/diagnosis/message.html b/resources/views/diagnosis/message.html
new file mode 100644 (file)
index 0000000..cd4738f
--- /dev/null
@@ -0,0 +1,13 @@
+Bonjour {{ NOM }},
+
+Merci d’avoir sollicité le CCV Montpellier pour obtenir votre E-Diagnostic sur vos problèmes de dos.
+
+Vous exprimez ainsi votre confiance dans l’avis de nos spécialistes, et nous vous en sommes reconnaissants.
+
+L’étude préliminaire de vos informations médicales par l’équipe du CCV Montpellier, a permis de diagnostiquer une pathologie de&nbsp;<b>{{ PATHOLOGIE }}</b>&nbsp;qui pourrait être prise en charge par un de nos spécialistes.
+
+Vous trouverez&nbsp;<a href="{{ PATHOLOGIE_LIEN }}">ici</a>, une fiche résumant cette pathologie et les possibilités de traitements.
+
+Le Docteur&nbsp;<a href="{{ DOCTEUR_LIEN }}">{{ DOCTEUR }}</a>&nbsp;chirurgien spécialisé dans la pathologie vertébrale, pourra vous recevoir en consultation pour une étude complète de votre dossier.
+
+Pour prendre rendez-vous, veuillez choisir votre mode de consultation :
diff --git a/resources/views/dossier-incomplete/message.html b/resources/views/dossier-incomplete/message.html
new file mode 100644 (file)
index 0000000..63a0de7
--- /dev/null
@@ -0,0 +1,25 @@
+Bonjour {{ NOM }},
+
+<br><br>Merci d’avoir sollicité le CCV Montpellier pour l’étude préliminaire de votre dossier médical et d’avoir exprimé ainsi votre confiance dans l’avis de nos spécialistes.
+
+<br><br>Votre dossier est malheureusement incomplet et votre chirurgien requiert un complément d’information pour porter son diagnostic.
+
+<br><br>Voici, le complément de bilan préconisé par nos spécialistes et indispensable à l’étude de votre cas :
+
+<br><br><ul>
+    <li><strong>Une IRM lombaire
</strong></li>
+    <li><strong>Une IRM cervicale
</strong></li>
+    <li><strong>Un scanner lombaire
</strong></li>
+    <li><strong>Un scanner cervical</strong></li>
+    <li><strong>Des radiographies du rachis lombaire
</strong></li>
+    <li><strong>Des radiographies du rachis cervical
</strong></li>
+    <li><strong>Des radiographies du rachis en totalité</strong></li>
+</ul>
+
+<br>Vous pouvez prendre avis auprès de votre médecin traitant pour évaluer la pertinence du complément d’imagerie ainsi préconisée par nos spécialistes, et lui en demander la prescription.
+
+<br><br>Si vous souhaitez faire vos examens directement à la clinique du Parc, vous pouvez également prendre contact auprès de notre secrétariat, afin qu’il fasse la prescription de l’imagerie préconisée dans cet email et organise le rendez-vous de radiologie et celui avec votre chirurgien dans la foulée.
+
+<br><br>L’avis médical qui vous est ainsi rendu, ne constitue pas un acte médical et ne peut donc se substituer à une véritable consultation médicale.
+
+<br><br>Besoin d’aide ? D’information complémentaire ? Nos secrétaires médicales se feront un plaisir d’échanger avec vous du lundi au vendredi de 9h00 à 18h00. <a href="https://www.ccv-montpellier.fr/contact/" target="_blank">Pour être rappelé par le secrétariat médical du CCV Montpellier, cliquez-ici</a>.
diff --git a/resources/views/home.blade.php b/resources/views/home.blade.php
new file mode 100644 (file)
index 0000000..67d8395
--- /dev/null
@@ -0,0 +1,31 @@
+@extends('layouts.app')
+
+@push('head')
+    <style>
+        a {
+            color: #fff;
+            opacity: 0.7;
+        }
+        a:hover {
+            color: #71d3df;
+            opacity: 1;
+        }
+    </style>
+@endpush
+
+@section('content')
+
+    <img src="/assets/CCV_logo.png" alt="CCV Montpellier">
+
+    <h1 class="text-xl font-bold my-6">Choisissez un modèle de réponse</h1>
+
+    <div class="mx-6 sm:mx-auto py-8 px-10 sm:px-20 text-gray-400 rounded-lg text-lg sm:text-2xl" style="background: #2e2c40">
+        <ol class="list-decimal leading-loose">
+            <li><a class="ml-3" href="/missing-imagery">Bug transfert d’imagerie</a></li>
+            <li><a class="ml-3" href="/dossier-incomplete">Dossier incomplet</a></li>
+            <li><a class="ml-3" href="/diagnosis">Réponse positive</a></li>
+            <li><a class="ml-3" href="/consultation-unnecessary">Consultation inutile</a></li>
+        </ol>
+    <div>
+
+@endsection
index 95e74ebe3d1690eff6cbca793fe8542542342e5d..e0924eccd50abd7d7c7a4b93a32610047d2b84a7 100644 (file)
@@ -8,7 +8,8 @@
     <link href="https://unpkg.com/@tailwindcss/forms/dist/forms.min.css" rel="stylesheet">
     @stack('head')
 </head>
-<body class="min-h-screen flex flex-col justify-center items-center">
+<body class="min-h-screen flex flex-col justify-center items-center py-6">
     @yield('content')
+    @stack('scripts')
 </body>
 </html>
index d6c6245621b4dff8631d190acacf4d0c274d1d7f..76765363a0b23a5cb61d42109b3ee2ebce352439 100644 (file)
         </xml>
     </noscript>
     <![endif]-->
+
     @stack('head')
+
+    <style>
+        body {
+            font-family: sans-serif;
+        }
+        a {
+            color: #ff078b;
+            text-decoration: underline;
+        }
+
+        img {
+            display: inline;
+        }
+
+        .text-sm {
+            font-size: 13px;
+        }
+
+        .text-xs {
+            font-size: 10px;
+        }
+
+        .quill p:not(:last-child) {
+            margin-bottom: 1.5em;
+        }
+    </style>
+
 </head>
 <body style="margin:0;padding:0;word-spacing:normal;background-color:#ffffff;">
 
@@ -42,7 +70,9 @@
                 <![endif]-->
 
                 <div class="outer" style="width:96%;max-width:700px;margin:20px auto;">
+                    @include('shared/email-header')
                     @yield('content')
+                    @include('shared/email-footer')
                 </div>
 
                 <!--[if mso]>
diff --git a/resources/views/missing-imagery/message.html b/resources/views/missing-imagery/message.html
new file mode 100644 (file)
index 0000000..80f0667
--- /dev/null
@@ -0,0 +1,11 @@
+Bonjour {{ NOM }},
+
+Merci d’avoir sollicité le CCV Montpellier pour l’étude préliminaire de votre dossier médical et d’avoir exprimé ainsi votre confiance dans l’avis de nos spécialistes.
+
+Votre dossier est malheureusement incomplet et votre chirurgien requiert un complément d’information pour porter son diagnostic.
+
+<strong><em>
Le lien internet vers le site d’imagerie médicale en ligne que vous nous avez fourni pour consulter votre imagerie, semble incorrect et ne nous ont pas permis de visualiser les images.</em></strong>
+
+<strong><em>Pourriez-vous vérifier vos informations et soumettre à nouveau votre formulaire de demande de diagnostic ? Vous pouvez également vous rapprocher de votre cabinet de radiologie pour corriger une éventuelle erreur.

</em></strong>
+
+Besoin d’aide ? D’information complémentaire ? Nos secrétaires médicales se feront un plaisir d’échanger avec vous du lundi au vendredi de 9h00 à 18h00. <a href="https://www.ccv-montpellier.fr/contact/" target="_blank">Pour être rappelé par le secrétariat médical du CCV Montpellier, cliquez-ici
</a>
.
diff --git a/resources/views/shared/email-footer.blade.php b/resources/views/shared/email-footer.blade.php
new file mode 100644 (file)
index 0000000..4dae236
--- /dev/null
@@ -0,0 +1,100 @@
+{{-- Sign off --}}
+<table role="presentation" width="100%">
+    <tr>
+        <td class="text-sm" style="padding:10px 10px 20px 10px;">
+            Bien cordialement,
+            <br><br>
+            <b>L’équipe du CCV MONTPELLIER</b>
+        </td>
+    </tr>
+</table>
+
+<x-divider />
+<x-spacer height="30px" />
+
+{{-- Social icons --}}
+<table role="presentation" width="100%">
+    <tr>
+        <td align="center">
+            <table width="100%" border="0" style="max-width:490px">
+                <tr>
+                    <td width="33%" valign="middle" align="center"><a href="https://www.instagram.com/ccv_montpellier/"><img src="{{ url('assets/instagram.png') }}" alt="Instagram CCV" moz-do-not-send="true" width="27" vspace="0" hspace="0" height="27" border="0" align="middle"></a></td>
+                    <td width="33%" valign="middle" align="center"><a href="https://www.youtube.com/channel/UC3DJtYRhJ-WJo165H3TyjKQ"><img src="{{ url('assets/youtube.png') }}" alt="YouTube CCV" moz-do-not-send="true" width="37" vspace="0" hspace="0" height="26" border="0" align="middle"></a></td>
+                    <td width="33%" valign="middle" align="center"><a href="http://www.sosdos-montpellier.fr/"><img src="{{ url('assets/SOS_DOS.png') }}" alt="SOS DOS" moz-do-not-send="true" width="47" vspace="0" hspace="0" height="28" border="0" align="middle"></a></td>
+                </tr>
+            </table>
+        </td>
+    </tr>
+</table>
+
+<x-spacer height="30px" />
+<x-divider />
+<x-spacer height="20px" />
+
+<div style="font-size:13px;text-align:center;">
+    <a href="https://goo.gl/maps/xsQwUZt35rPTtqaFA" style="color:#2e2c40;text-decoration: underline;">
+        Clinique du Parc<br>
+        50 Rue Emile Combes<br>
+        34170 Castelnau-le-Lez
+    </a>
+    <br><br>
+    <a href="tel:0467331363" style="color:#2e2c40;text-decoration: underline;">
+        04 67 33 13 63
+    </a>
+    <br><br>
+    <a href="mailto:ccv@ccv-montpellier.fr" style="color:#2e2c40;text-decoration: underline;">
+        ccv@ccv-montpellier.fr
+    </a>
+</div>
+
+<x-spacer height="20px" />
+<x-divider />
+<x-spacer height="40px" />
+
+{{-- Tarifs --}}
+<table width="100%" cellspacing="0" cellpadding="20" border="0" bgcolor="#f6f5f5" align="center">
+    <tr>
+        <td>
+            <h3 style="font-size: 19px;margin: 0 0 1em 0;">Tarifs des consultations du CCV MONTPELLIER</h3>
+            <table width="100%" cellspacing="0" cellpadding="15" border="0" align="center" class="text-sm">
+                <tbody>
+                <tr>
+                    <td width="85%" valign="middle" bgcolor="#ffffff"><b>Étude préliminaire de votre dossier</b>&nbsp;(Demande d'avis médical en ligne) :<br></td>
+                    <td valign="middle" bgcolor="#ffffff" align="right"><b>Gratuit</b><br></td>
+                </tr>
+                <tr>
+                    <td width="85%" valign="middle" align="left"><b>Consultation médicale au CCV (Clinique du Parc) :</b><br><span class="text-xs">(Base de Remboursement SS : 50€ pour un avis spécialiste ponctuel , 23€ pour une consultation de suivi. Prise en charge mutuelle pour le reste à charge).</span><br></td>
+                    <td valign="middle" align="right"><b>80€</b><br></td>
+                </tr>
+                <tr>
+                    <td width="85%" valign="middle" bgcolor="#ffffff" align="left"><b>Téléconsultation médicale en ligne (Vidéo consultation) :</b><br><span class="text-xs">Incluant une étude approfondie de votre dossier et la rédaction d’un rapport médical (Base de Remboursement SS : 50€ pour un avis spécialiste ponctuel. Prise en charge mutuelle pour le reste à charge).</span><br></td>
+                    <td valign="middle" bgcolor="#ffffff" align="right"><b>100€</b><br></td>
+                </tr>
+                <tr>
+                    <td width="85%" valign="middle"><b>Séjour médical personnalisé :</b><br><span class="text-xs">Incluant frais d’hospitalisation, transport, hébergement et prestations personnalisées à la clinique.</span><br></td>
+                    <td valign="middle" align="right"><b>Sur devis</b><br></td>
+                </tr>
+                <tr>
+                    <td width="85%" valign="middle" bgcolor="#ffffff"><b>Interventions pour patients français</b><br><span class="text-xs">Pour les patients français affiliés à la Sécurité Sociale, seuls les dépassements d’honoraires seront à régler. Leurs montants vous seront communiqués sur simple demande.</span><br></td>
+                    <td valign="middle" bgcolor="#ffffff" align="right"><b>Sur devis</b><br></td>
+                </tr>
+                </tbody>
+            </table>
+        </td>
+    </tr>
+    <tr>
+        <td>
+            <h3 style="font-size: 19px;margin: 0 0 1em 0;"><b>Vous ne connaissez pas encore le service ma E-Consultation du CCV MONTPELLIER ?</b></h3>
+            <div class="text-sm">
+                La téléconsultation vidéo vous permet d’expliquer en détail votre histoire médicale, de préciser vos symptômes et vos attentes dans la prise en charge de votre pathologie. Toutes vos questions pourront être abordées pendant cet entretien.<br>Les échanges avec votre chirurgien lui permettront de préciser son diagnostic, de vous expliquer l’origine de vos douleurs et de vous détailler un programme de soins, avec ses bénéfices, ses risques, ses taux de réussite et ses échecs.&nbsp;
+                <br>
+                <br>
+                Ce programme de soins ne conduira pas systématiquement à une proposition de chirurgie, puisque l’intervention reste le dernier recours dans la plupart des pathologies du dos.
+                <br>
+                <br>Si toutefois, une chirurgie devait être réalisée au CCV MONTPELLIER, notre plateforme e-medecine pourra se charger de l’organisation complète de votre voyage médical.&nbsp;<a href="https://www.ccv-montpellier.fr/notre-offre-de-voyage-medical/">En savoir plus</a>&nbsp;<br>
+                <br>
+                Besoin d’aide ? D’information complémentaire ? Nos secrétaires médicales se feront un plaisir d’échanger avec vous du lundi au vendredi de 9h00 à 18h00.&nbsp;<a moz-do-not-send="true" href="https://www.ccv-montpellier.fr/contact/">Pour être rappelé par le secrétariat médical du CCV Montpellier, cliquez-ici.</a>
+            </div>
+        </td>
+    </tr>
+</table>
diff --git a/resources/views/shared/email-header.blade.php b/resources/views/shared/email-header.blade.php
new file mode 100644 (file)
index 0000000..650a2ff
--- /dev/null
@@ -0,0 +1,15 @@
+{{-- HEADER --}}
+<table role="presentation" width="100%">
+    <tr>
+        <td style="padding:10px 10px 20px 10px;text-align:center;">
+            <a href="https://www.ccv-montpellier.fr/">
+                <img src="{{ url('assets/CCV_logo.png') }}" alt="CCV Montpellier" width="200" style="max-width:200px;width:100%;height:auto;" />
+            </a>
+            <x-spacer height="32px" />
+            <img src="{{ url('assets/CCV_slogan.png') }}" alt="Trouvons ensemble la solution chirurgicale à votre problème de dos" width="540" style="max-width:540px;width:100%;height:auto;" />
+            <br><br>
+
+            <x-divider />
+        </td>
+    </tr>
+</table>
diff --git a/resources/views/shared/email.blade.php b/resources/views/shared/email.blade.php
new file mode 100644 (file)
index 0000000..7ba7f63
--- /dev/null
@@ -0,0 +1,16 @@
+@extends($layout ?? 'layouts.email-wrapper')
+
+@section('content')
+
+    @parent
+
+    {{-- Body Intro --}}
+    <table role="presentation" width="100%">
+        <tr>
+            <td class="quill text-sm" style="padding:10px 10px 20px 10px;">
+                {!! $message_html !!}
+            </td>
+        </tr>
+    </table>
+
+@endsection
diff --git a/resources/views/shared/form.blade.php b/resources/views/shared/form.blade.php
new file mode 100644 (file)
index 0000000..61d4099
--- /dev/null
@@ -0,0 +1,42 @@
+@extends('layouts.app')
+
+@section('content')
+
+    <a href="/"><img src="/assets/CCV_logo.png" alt="CCV Montpellier"></a>
+
+    <h1 class="text-xl font-bold my-6">{{ $page_title }}</h1>
+
+    @if (session('message'))
+        <div class="py-2 px-6 border mb-6 bg-green-100 border-green-400 rounded">
+            {{ session('message') }}
+        </div>
+    @endif
+
+    <form action="{{ $_SERVER['REQUEST_URI'] }}" method="post" class="max-w-3xl mx-6 sm:mx-auto p-6 bg-gray-200 rounded-lg">
+
+        @csrf
+
+        <div class="grid grid-cols-1 sm:grid-cols-2 gap-6">
+
+            <label class="block text-grey-darker text-sm font-bold" for="name">
+                Nom du patient
+                <input type="text" name="name" id="name" class="w-full mt-2" required>
+            </label>
+
+            <label class="block text-grey-darker text-sm font-bold" for="email">
+                Adresse e-mail
+                <input type="email" name="email" id="email" class="w-full mt-2" required>
+            </label>
+
+        </div>
+
+        <label class="mt-6 mb-2 block text-grey-darker text-sm font-bold" for="message">
+            Message
+        </label>
+
+        <x-quill :snippets="$snippets">{!! $editable_message !!}</x-quill>
+
+        <input type="submit" value="Aperçu &rarr;" class="block mt-6 ml-auto bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-8 rounded cursor-pointer">
+    </form>
+
+@endsection
index 0cf4f03e51b4fc3c227d16b5e322459f33fab5f5..d8b32453b3446643299c50c7b40d0697a91f09e4 100644 (file)
@@ -2,6 +2,10 @@
 
 use Illuminate\Support\Facades\Route;
 use App\Http\Controllers\EmailController;
+use App\Http\Controllers\EmailDiagnosisController;
+use App\Http\Controllers\EmailMissingImageryController;
+use App\Http\Controllers\EmailDossierIncompleteController;
+use App\Http\Controllers\EmailConsultationUnnecessaryController;
 
 /*
 |--------------------------------------------------------------------------
@@ -16,11 +20,14 @@ use App\Http\Controllers\EmailController;
 
 // Apply basic auth middleware to all routes
 Route::middleware(['auth.basic'])->group(function() {
-    Route::redirect('/', '/diagnosis');
-    Route::match(['get', 'post'], '/diagnosis', [EmailController::class, 'diagnosis']);
+    Route::view('/', 'home');
+    Route::match(['get', 'post'], '/missing-imagery', [EmailMissingImageryController::class, 'index']);
+    Route::match(['get', 'post'], '/dossier-incomplete', [EmailDossierIncompleteController::class, 'index']);
+    Route::match(['get', 'post'], '/diagnosis', [EmailDiagnosisController::class, 'index']);
+    Route::match(['get', 'post'], '/consultation-unnecessary', [EmailConsultationUnnecessaryController::class, 'index']);
 });
 
-Route::redirect('/template', '/diagnosis');
+Route::redirect('/template', '/');
 
 // Quick way to test the email output without sending mail
 Route::get('/test', function()  {