diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index cfda8496..a68b2b49 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -3,6 +3,7 @@ namespace App\Console; use App\Console\Commands\SetupDevEnvironment; +use App\Services\Oasis\OasisService; use App\Services\SchedulerService; use Illuminate\Console\Scheduling\Schedule; use Illuminate\Foundation\Console\Kernel as ConsoleKernel; @@ -26,11 +27,11 @@ class Kernel extends ConsoleKernel */ protected function schedule(Schedule $schedule) { - $scheduler = app()->make(SchedulerService::class); + $scheduler = resolve(SchedulerService::class); $schedule->call(function () use ($scheduler) { $scheduler->delete_expired_shared_links(); - })->everyMinute(); + })->everyTenMinutes(); $schedule->call(function () use ($scheduler) { $scheduler->delete_old_zips(); @@ -40,8 +41,13 @@ class Kernel extends ConsoleKernel } })->everySixHours(); + // Oasis Drive + $schedule->call(function () { + resolve(OasisService::class)->order_reminder(); + })->hourly(); + // Run queue jobs every minute - $schedule->command('queue:work --tries=3') + $schedule->command('queue:work --stop-when-empty') ->everyMinute() ->withoutOverlapping(); } diff --git a/app/Notifications/Oasis/ReminderForPaymentRequiredNotification.php b/app/Notifications/Oasis/ReminderForPaymentRequiredNotification.php new file mode 100644 index 00000000..674ad4e8 --- /dev/null +++ b/app/Notifications/Oasis/ReminderForPaymentRequiredNotification.php @@ -0,0 +1,76 @@ +order = $order; + $this->plan = $plan; + } + + /** + * Get the notification's delivery channels. + * + * @param mixed $notifiable + * @return array + */ + public function via($notifiable) + { + return ['mail']; + } + + /** + * Get the mail representation of the notification. + * + * @param mixed $notifiable + * @return \Illuminate\Notifications\Messages\MailMessage + */ + public function toMail($notifiable) + { + $url = url("/platba/{$this->order['id']}"); + + $name = $this->plan['product']['name']; + $price = Cashier::formatAmount($this->plan['plan']['amount']); + $storage = format_gigabytes($this->plan['product']['metadata']['capacity']); + + return (new MailMessage) + ->subject('🏝 Potvrzeni Objednavky - OasisDrive') + ->greeting('Vážený zákazníku,') + ->line('Děkujeme za Vaši objednávku služby Oasis Drive pro bezpečné uložení Vašich firemních dokumentů.') + ->line("Vámi vybraný tarif: $name - $storage za $price") + ->line('Připomínáme dokončení aktivace služby a blížící se konec platnosti registračního odkazu:') + ->action('Pro aktivaci klikněte zde', $url) + ->line('Po dokončení registrace v odkazu Vám bude služba automaticky aktivována a lze ji ihned využívat.') + ->line('S pozdravem a přáním hezkého dne') + ->salutation('Tým Oasis Drive'); + } + + /** + * Get the array representation of the notification. + * + * @param mixed $notifiable + * @return array + */ + public function toArray($notifiable) + { + return [ + // + ]; + } +} diff --git a/app/Services/Oasis/OasisService.php b/app/Services/Oasis/OasisService.php new file mode 100644 index 00000000..cdb65e10 --- /dev/null +++ b/app/Services/Oasis/OasisService.php @@ -0,0 +1,40 @@ +get() + ->each(function ($request) { + + // Get diffInHours + $diff = Carbon::parse($request->created_at) + ->diffInHours(Carbon::now()); + + // Delete if file is in local storage more than 24 hours + if ($diff >= 8) { + + $plan = resolve(StripeService::class) + ->getPlan($request->requested_plan); + + $request->user->notify(new ReminderForPaymentRequiredNotification( + $request, $plan + )); + } + }); + } +} \ No newline at end of file diff --git a/tests/Feature/Oasis/OasisSubscriptionTest.php b/tests/Feature/Oasis/OasisSubscriptionTest.php index e3dad7f9..99207908 100644 --- a/tests/Feature/Oasis/OasisSubscriptionTest.php +++ b/tests/Feature/Oasis/OasisSubscriptionTest.php @@ -2,10 +2,14 @@ namespace Tests\Feature\Oasis; +use App\Models\Oasis\SubscriptionRequest; use App\Models\User; +use App\Notifications\Oasis\ReminderForPaymentRequiredNotification; +use App\Services\Oasis\OasisService; +use Carbon\Carbon; use Cartalyst\Stripe\Stripe; use Illuminate\Foundation\Testing\DatabaseMigrations; -use Laravel\Cashier\Subscription; +use Notification; use Tests\TestCase; class OasisSubscriptionTest extends TestCase @@ -166,4 +170,33 @@ class OasisSubscriptionTest extends TestCase 'status' => 'logged' ]); } + + /** + * @test + */ + public function it_send_email_reminder_to_activate_new_order() + { + Notification::fake(); + + $user = User::factory(User::class) + ->create(['role' => 'user']); + + SubscriptionRequest::unguard(); + + $user + ->subscriptionRequest() + ->create([ + 'requested_plan' => 'virtualni-sanon-basic', + 'creator' => 'john@doe.com', + 'status' => 'requested', + 'created_at' => Carbon::now()->subHours(8), + ]); + + resolve(OasisService::class) + ->order_reminder(); + + Notification::assertSentTo( + $user, ReminderForPaymentRequiredNotification::class + ); + } }