From 8febaa074fba2e50ca55f0dccffbc1b896882b45 Mon Sep 17 00:00:00 2001 From: Louis Jeckel Date: Tue, 22 Sep 2020 12:50:05 +0200 Subject: [PATCH] new trial ending emails --- app/Console/Kernel.php | 3 +- app/Jobs/CheckForTrialExpirationDates.php | 124 ++++++++++++++++++++++ app/Notifications/TrialExpired.php | 67 ++++++++++++ app/Notifications/TrialExpiresSoon.php | 68 ++++++++++++ app/Nova/PdfFile.php | 104 ------------------ app/Nova/SearchableText.php | 85 --------------- app/Nova/TrackedLink.php | 97 ----------------- app/User.php | 8 +- 8 files changed, 265 insertions(+), 291 deletions(-) create mode 100644 app/Jobs/CheckForTrialExpirationDates.php create mode 100644 app/Notifications/TrialExpired.php create mode 100644 app/Notifications/TrialExpiresSoon.php delete mode 100644 app/Nova/PdfFile.php delete mode 100644 app/Nova/SearchableText.php delete mode 100644 app/Nova/TrackedLink.php diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index 69914e9..fbb7f2d 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -2,6 +2,7 @@ namespace App\Console; +use App\Jobs\CheckForTrialExpirationDates; use Illuminate\Console\Scheduling\Schedule; use Illuminate\Foundation\Console\Kernel as ConsoleKernel; @@ -24,7 +25,7 @@ class Kernel extends ConsoleKernel */ protected function schedule(Schedule $schedule) { - // $schedule->command('inspire')->hourly(); + $schedule->job(new CheckForTrialExpirationDates)->dailyAt('13:00'); } /** diff --git a/app/Jobs/CheckForTrialExpirationDates.php b/app/Jobs/CheckForTrialExpirationDates.php new file mode 100644 index 0000000..96d345a --- /dev/null +++ b/app/Jobs/CheckForTrialExpirationDates.php @@ -0,0 +1,124 @@ +map(fn(User $user) => $user->notify(new TrialExpiresSoon)); + + self::getLastEditionTodayProfiles()->map(fn(User $user) => $user->notify(new TrialExpired)); + } + + + /** + * @return \Illuminate\Support\Collection + * Returns profiles that only have 2 numbers left to receive + */ + public static function getExpiresSoonProfiles() + { + /** + * @var array + * keys : today, values: next day of week that trial expires. + * Example. If today is sunday 07/01, profiles expiring + * next tuesday and thursday should be notified with the "2 editions left" notification + * That's for PSQ en Mon, Tue, Thu, Fri w/ trial ending at end of day. + */ + $dm2_map = [ + 1 => [4], + 2 => [], + 3 => [5,6,7], + 4 => [1], + 5 => [], + 6 => [], + 7 => [2, 3], + ]; + + return self::getProfilesFromMap($dm2_map); + + + } + + + /** + * @return \Illuminate\Support\Collection + * + * Returns profiles that expire today + */ + public static function getLastEditionTodayProfiles() + { + $dd_map = [ + 1 => [1], + 2 => [2, 3], + 3 => [], + 4 => [4], + 5 => [5,6,7], + 6 => [], + 7 => [], + ]; + + return self::getProfilesFromMap($dd_map); + } + + + /** + * @param $map + * @return \Illuminate\Support\Collection + */ + protected static function getProfilesFromMap($map) + { + $currentDayOfWeek = now()->dayOfWeekIso; + $datesToSearch = collect(array_map(function($dayOfWeek) use ($currentDayOfWeek){ + $addDays = $dayOfWeek < $currentDayOfWeek ? + 7 + $dayOfWeek - $currentDayOfWeek : + $dayOfWeek - $currentDayOfWeek; + return now()->addDays($addDays)->startOfDay(); + + }, $map[$currentDayOfWeek])); + + + return $datesToSearch->flatMap(function(Carbon $date) { + return User::query() + ->whereDate('discover_ends_at', $date) + ->orWhereDate('trial_ends_at', $date) + ->get(); + }); + + } + +} diff --git a/app/Notifications/TrialExpired.php b/app/Notifications/TrialExpired.php new file mode 100644 index 0000000..1e29e52 --- /dev/null +++ b/app/Notifications/TrialExpired.php @@ -0,0 +1,67 @@ +addTag('trial-expired') + ->subject("Votre période découverte est arrivée à son terme !") + ->greeting('Cher Lecteur,') + ->line("Au cours des deux dernières semaines, vous avez reçu gratuitement les éditions de **Prescription Santé Quotidien** dans le cadre de notre offre Découverte.") + ->line("Malheureusement, cette offre, non reconductible, arrive est arrivée à son terme aujourd’hui et l'édition transmise ce matin est donc la dernière. **Vous pouvez dès maintenant nous contacter en cliquant sur le bouton ci-dessous** pour nous préciser le cadre d’un éventuel abonnement, et ce afin de ne pas rater une seule de nos éditions.") + ->action("Nous contacter", route('contact.index')) + ->line("Nous vous répondrons sous 24 heures et vous pourrez ainsi faire un choix éclairé.") + ->line("En espérant vous compter bientôt parmi nos abonnés") + ->salutation("LE RÉDACTEUR EN CHEF, OLIVIER ROBICHON"); + } + + /** + * Get the array representation of the notification. + * + * @param mixed $notifiable + * @return array + */ + public function toArray($notifiable) + { + return [ + // + ]; + } +} diff --git a/app/Notifications/TrialExpiresSoon.php b/app/Notifications/TrialExpiresSoon.php new file mode 100644 index 0000000..209a9a8 --- /dev/null +++ b/app/Notifications/TrialExpiresSoon.php @@ -0,0 +1,68 @@ +addTag('trial-expires-soon') + ->subject("Votre période découverte expire bientôt !") + ->greeting('Cher Lecteur,') + ->line("Depuis quelques jours vous recevez gratuitement les éditions de **Prescription Santé Quotidien** dans le cadre de notre offre Découverte.") + ->line("Nous espérons que vous appréciez ce média différent à destination des acteurs industriels de la santé et de leurs partenaires.") + ->line("**Dans 48 heures cette offre, non reconductible, arrivera à son terme.** Vous pouvez dès maintenant **nous contacter en cliquant sur le bouton ci-dessous** pour nous préciser le cadre d’un éventuel abonnement, et ce afin de ne pas rater une seule de nos éditions.") + ->action("Nous contacter", route('contact.index')) + ->line("Nous vous répondrons sous 24 heures et vous pourrez ainsi faire un choix éclairé.") + ->line("En espérant vous compter bientôt parmi nos abonnés") + ->salutation("LE RÉDACTEUR EN CHEF, OLIVIER ROBICHON"); + } + + /** + * Get the array representation of the notification. + * + * @param mixed $notifiable + * @return array + */ + public function toArray($notifiable) + { + return [ + // + ]; + } +} diff --git a/app/Nova/PdfFile.php b/app/Nova/PdfFile.php deleted file mode 100644 index f982191..0000000 --- a/app/Nova/PdfFile.php +++ /dev/null @@ -1,104 +0,0 @@ -sortable(), - Text::make('Titre', 'title'), - Text::make('Slug')->readonly(), - Boolean::make('Gratuit', 'free'), - Text::make('Lien', function(){ - return "Prévisualiser"; - })->asHtml()->readonly(), - Number::make('Nombre de visualisations', 'accessCount')->readonly(), - - - ]; - } - - /** - * Get the cards available for the request. - * - * @param \Illuminate\Http\Request $request - * @return array - */ - public function cards(Request $request) - { - return []; - } - - /** - * Get the filters available for the resource. - * - * @param \Illuminate\Http\Request $request - * @return array - */ - public function filters(Request $request) - { - return []; - } - - /** - * Get the lenses available for the resource. - * - * @param \Illuminate\Http\Request $request - * @return array - */ - public function lenses(Request $request) - { - return []; - } - - /** - * Get the actions available for the resource. - * - * @param \Illuminate\Http\Request $request - * @return array - */ - public function actions(Request $request) - { - return []; - } -} diff --git a/app/Nova/SearchableText.php b/app/Nova/SearchableText.php deleted file mode 100644 index 8fa5121..0000000 --- a/app/Nova/SearchableText.php +++ /dev/null @@ -1,85 +0,0 @@ -sortable(), - ]; - } - - /** - * Get the cards available for the request. - * - * @param \Illuminate\Http\Request $request - * @return array - */ - public function cards(Request $request) - { - return []; - } - - /** - * Get the filters available for the resource. - * - * @param \Illuminate\Http\Request $request - * @return array - */ - public function filters(Request $request) - { - return []; - } - - /** - * Get the lenses available for the resource. - * - * @param \Illuminate\Http\Request $request - * @return array - */ - public function lenses(Request $request) - { - return []; - } - - /** - * Get the actions available for the resource. - * - * @param \Illuminate\Http\Request $request - * @return array - */ - public function actions(Request $request) - { - return []; - } -} diff --git a/app/Nova/TrackedLink.php b/app/Nova/TrackedLink.php deleted file mode 100644 index a90593a..0000000 --- a/app/Nova/TrackedLink.php +++ /dev/null @@ -1,97 +0,0 @@ -hideFromIndex(), - Text::make('Target')->hideFromIndex(), - Number::make('Clicks'), - - ]; - } - - /** - * Get the cards available for the request. - * - * @param \Illuminate\Http\Request $request - * @return array - */ - public function cards(Request $request) - { - return []; - } - - /** - * Get the filters available for the resource. - * - * @param \Illuminate\Http\Request $request - * @return array - */ - public function filters(Request $request) - { - return []; - } - - /** - * Get the lenses available for the resource. - * - * @param \Illuminate\Http\Request $request - * @return array - */ - public function lenses(Request $request) - { - return []; - } - - /** - * Get the actions available for the resource. - * - * @param \Illuminate\Http\Request $request - * @return array - */ - public function actions(Request $request) - { - return []; - } -} diff --git a/app/User.php b/app/User.php index 21df16f..77f342e 100644 --- a/app/User.php +++ b/app/User.php @@ -98,11 +98,11 @@ class User extends Authenticatable implements MustVerifyEmail /** * Trial duration in days */ - public const TRIAL_DURATION_DAYS = 14; + public const TRIAL_DURATION_DAYS = 15; /** * Discover duration in days */ - public const DISCOVER_DURATION_DAYS = 14; + public const DISCOVER_DURATION_DAYS = 15; /** * Possible Statuses @@ -246,7 +246,7 @@ class User extends Authenticatable implements MustVerifyEmail */ public function startTrial(): void { - $this->trial_ends_at = now()->addDays(self::TRIAL_DURATION_DAYS); + $this->trial_ends_at = now()->addDays(self::TRIAL_DURATION_DAYS)->endOfDay(); $this->save(); } @@ -255,7 +255,7 @@ class User extends Authenticatable implements MustVerifyEmail */ public function startDiscover(): void { - $this->discover_ends_at = now()->addDays(self::DISCOVER_DURATION_DAYS); + $this->discover_ends_at = now()->addDays(self::DISCOVER_DURATION_DAYS)->endOfDay(); $this->type = self::TYPE_DISCOVER; $this->save(); } -- 2.39.5