From fdcbcfda9ddbc0446f3f79ee6d83d54b4d7061f8 Mon Sep 17 00:00:00 2001 From: Nafies Luthfi Date: Sat, 29 Feb 2020 23:25:05 +0800 Subject: [PATCH] Add upcoming birthday feature --- app/Http/Controllers/BirthdayController.php | 29 ++++++++++++++++ app/User.php | 27 +++++++++++++-- resources/lang/id/birthday.php | 9 +++++ resources/views/birthdays/index.blade.php | 46 +++++++++++++++++++++++++ resources/views/layouts/partials/nav.blade.php | 11 +++--- routes/web.php | 2 ++ tests/Unit/UserTest.php | 47 ++++++++++++++++++++++++-- 7 files changed, 161 insertions(+), 10 deletions(-) create mode 100644 app/Http/Controllers/BirthdayController.php create mode 100644 resources/lang/id/birthday.php create mode 100644 resources/views/birthdays/index.blade.php diff --git a/app/Http/Controllers/BirthdayController.php b/app/Http/Controllers/BirthdayController.php new file mode 100644 index 0000000..361e2a8 --- /dev/null +++ b/app/Http/Controllers/BirthdayController.php @@ -0,0 +1,29 @@ +select('users.name', + 'users.dob', + 'users.id as user_id' + ); + + $currentMonth = Carbon::now()->format('m'); + $nextMonth = Carbon::now()->addMonth()->format('m'); + $userBirthdayQuery->whereIn(DB::raw("month(dob)"), [$currentMonth, $nextMonth]); + + $users = $userBirthdayQuery->get()->filter(function ($user) { + return $user->birthday_remaining < 60 && $user->birthday_remaining >= 0; + })->sortBy('birthday_remaining'); + + return view('birthdays.index', compact('users', 'currentMonth', 'nextMonth')); + } +} diff --git a/app/User.php b/app/User.php index cd98314..a9dd05a 100644 --- a/app/User.php +++ b/app/User.php @@ -3,9 +3,9 @@ namespace App; use Carbon\Carbon; -use Ramsey\Uuid\Uuid; -use Illuminate\Notifications\Notifiable; use Illuminate\Foundation\Auth\User as Authenticatable; +use Illuminate\Notifications\Notifiable; +use Ramsey\Uuid\Uuid; class User extends Authenticatable { @@ -284,4 +284,27 @@ class User extends Authenticatable { return '
'.$this->age.' '.trans_choice('user.age_years', $this->age).'
'; } + + public function getBirthdayAttribute() + { + if (!$this->dob) { + return; + } + + $birthdayDate = date('Y').substr($this->dob, 4); + $birthdayDateClass = Carbon::parse($birthdayDate); + + if (Carbon::parse(date('Y-m-d').' 00:00:00')->gt($birthdayDateClass)) { + return $birthdayDateClass->addYear(); + } + + return $birthdayDateClass; + } + + public function getBirthdayRemainingAttribute() + { + if ($this->dob) { + return Carbon::now()->diffInDays($this->birthday, false); + } + } } diff --git a/resources/lang/id/birthday.php b/resources/lang/id/birthday.php new file mode 100644 index 0000000..7a446a6 --- /dev/null +++ b/resources/lang/id/birthday.php @@ -0,0 +1,9 @@ + 'Ulang Tahun', + 'upcoming' => 'Ulang tahun akan datang', + 'remaining' => ':count hari', + 'age_years' => ':age tahun', + 'days' => 'Hari', +]; diff --git a/resources/views/birthdays/index.blade.php b/resources/views/birthdays/index.blade.php new file mode 100644 index 0000000..713df35 --- /dev/null +++ b/resources/views/birthdays/index.blade.php @@ -0,0 +1,46 @@ +@extends('layouts.app') + +@section('title', __('user.upcoming_birthday')) + +@section('content') + +
+
+
+
+

{{ __('birthday.upcoming') }}

+
+ + + + + + + + + + + @php + $no = 1; + @endphp + @forelse($users as $key => $user) + + + + + + + @empty + + + + @endforelse + +
#{{ __('user.name') }}{{ __('birthday.birthday') }}{{ __('user.age') }}
{{ $no++ }}{{ $user->name }} + {{ $user->birthday->format('j M') }} + ({{ __('birthday.remaining', ['count' => $user->birthday_remaining]) }}) + {{ __('birthday.age_years', ['age' => $user->age]) }}
{{ __('user.no_upcoming_birthday', ['days' => 60]) }}
+
+
+
+@endsection diff --git a/resources/views/layouts/partials/nav.blade.php b/resources/views/layouts/partials/nav.blade.php index dbd2c12..00a14f3 100644 --- a/resources/views/layouts/partials/nav.blade.php +++ b/resources/views/layouts/partials/nav.blade.php @@ -19,13 +19,14 @@