Browse Source

Add upcoming birthday feature

pull/45/head
Nafies Luthfi 6 years ago
parent
commit
fdcbcfda9d
  1. 29
      app/Http/Controllers/BirthdayController.php
  2. 27
      app/User.php
  3. 9
      resources/lang/id/birthday.php
  4. 46
      resources/views/birthdays/index.blade.php
  5. 9
      resources/views/layouts/partials/nav.blade.php
  6. 2
      routes/web.php
  7. 47
      tests/Unit/UserTest.php

29
app/Http/Controllers/BirthdayController.php

@ -0,0 +1,29 @@
<?php
namespace App\Http\Controllers;
use App\User;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
class BirthdayController extends Controller
{
public function index()
{
$userBirthdayQuery = User::whereNotNull('dob')
->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'));
}
}

27
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 '<div title="'.$this->age_detail.'">'.$this->age.' '.trans_choice('user.age_years', $this->age).'</div>';
}
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);
}
}
}

9
resources/lang/id/birthday.php

@ -0,0 +1,9 @@
<?php
return [
'birthday' => 'Ulang Tahun',
'upcoming' => 'Ulang tahun akan datang',
'remaining' => ':count hari',
'age_years' => ':age tahun',
'days' => 'Hari',
];

46
resources/views/birthdays/index.blade.php

@ -0,0 +1,46 @@
@extends('layouts.app')
@section('title', __('user.upcoming_birthday'))
@section('content')
<div class="row">
<div class="col-md-8 col-md-offset-2">
<div class="panel panel-default text-center">
<div class="panel-heading text-left">
<h3 class="panel-title">{{ __('birthday.upcoming') }}</h3>
</div>
<table class="table table-condensed">
<thead>
<tr>
<td>#</td>
<td class="text-left">{{ __('user.name') }}</td>
<td>{{ __('birthday.birthday') }}</td>
<td>{{ __('user.age') }}</td>
</tr>
</thead>
<tbody>
@php
$no = 1;
@endphp
@forelse($users as $key => $user)
<tr>
<td>{{ $no++ }}</td>
<td class="text-left">{{ $user->name }}</td>
<td>
{{ $user->birthday->format('j M') }}
({{ __('birthday.remaining', ['count' => $user->birthday_remaining]) }})
</td>
<td>{{ __('birthday.age_years', ['age' => $user->age]) }}</td>
</tr>
@empty
<tr>
<td colspan="4">{{ __('user.no_upcoming_birthday', ['days' => 60]) }}</td>
</tr>
@endforelse
</tbody>
</table>
</div>
</div>
</div>
@endsection

9
resources/views/layouts/partials/nav.blade.php

@ -19,7 +19,8 @@
<div class="collapse navbar-collapse" id="app-navbar-collapse">
<!-- Left Side Of Navbar -->
<ul class="nav navbar-nav">
<li><a href="{{ route('users.search') }}">{{ trans('app.search_your_family') }}</a></li>
<li><a href="{{ route('users.search') }}">{{ __('app.search_your_family') }}</a></li>
<li><a href="{{ route('birthdays.index') }}">{{ __('birthday.birthday') }}</a></li>
</ul>
<!-- Right Side Of Navbar -->
@ -38,9 +39,9 @@
</a>
<ul class="dropdown-menu" role="menu">
<li><a href="{{ route('backups.index') }}">{{ trans('backup.list') }}</a></li>
<li><a href="{{ route('profile') }}">{{ trans('app.my_profile') }}</a></li>
<li><a href="{{ route('password.change') }}">{{ trans('auth.change_password') }}</a></li>
<li><a href="{{ route('backups.index') }}">{{ __('backup.list') }}</a></li>
<li><a href="{{ route('profile') }}">{{ __('app.my_profile') }}</a></li>
<li><a href="{{ route('password.change') }}">{{ __('auth.change_password') }}</a></li>
<li>
<a href="{{ route('logout') }}"
onclick="event.preventDefault();

2
routes/web.php

@ -40,6 +40,8 @@ Route::delete('users/{user}', 'UsersController@destroy')->name('users.destroy');
Route::get('users/{user}/marriages', 'UserMarriagesController@index')->name('users.marriages');
Route::get('birthdays', 'BirthdayController@index')->name('birthdays.index');
/**
* Couple/Marriages Routes
*/

47
tests/Unit/UserTest.php

@ -2,12 +2,12 @@
namespace Tests\Unit;
use App\User;
use App\Couple;
use App\User;
use Carbon\Carbon;
use Tests\TestCase;
use Illuminate\Support\Collection;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Collection;
use Tests\TestCase;
class UserTest extends TestCase
{
@ -225,4 +225,45 @@ class UserTest extends TestCase
Carbon::setTestNow();
}
/** @test */
public function a_user_has_birthday_attribute()
{
$dateOfBirth = '1990-01-01';
$customer = factory(User::class)->create(['dob' => $dateOfBirth]);
$birthdayDate = date('Y').substr($dateOfBirth, 4);
$birthdayDateClass = Carbon::parse($birthdayDate);
if (Carbon::parse(date('Y-m-d').' 00:00:00')->gt($birthdayDateClass)) {
$currentYearBirthday = $birthdayDateClass->addYear();
} else {
$currentYearBirthday = $birthdayDateClass;
}
$this->assertEquals($currentYearBirthday, $customer->birthday);
}
/** @test */
public function a_user_has_birthday_remaining_attribute()
{
$dateOfBirth = '1990-01-01';
$customer = factory(User::class)->create(['dob' => $dateOfBirth]);
$birthdayDate = date('Y').substr($dateOfBirth, 4);
$birthdayDateClass = Carbon::parse($birthdayDate);
if (Carbon::now()->gt($birthdayDateClass)) {
$currentYearBirthday = $birthdayDateClass->addYear()->format('Y-m-d');
} else {
$currentYearBirthday = $birthdayDateClass->format('Y-m-d');
}
$this->assertEquals(
Carbon::now()->diffInDays($birthdayDateClass, false),
$customer->birthday_remaining
);
}
}
Loading…
Cancel
Save