Browse Source

Merge pull request #45 from nafiesl/birthday-list

Add Birthday List Feature, resolves #41
pull/60/head
Nafies Luthfi 6 years ago
committed by GitHub
parent
commit
287b7eb158
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      .travis.yml
  2. 30
      app/Http/Controllers/BirthdayController.php
  3. 27
      app/User.php
  4. 9
      resources/lang/en/birthday.php
  5. 9
      resources/lang/id/birthday.php
  6. 46
      resources/views/birthdays/index.blade.php
  7. 11
      resources/views/layouts/partials/nav.blade.php
  8. 17
      routes/api.php
  9. 2
      routes/web.php
  10. 4
      tests/Feature/ChangePasswordTest.php
  11. 47
      tests/Unit/UserTest.php

2
.travis.yml

@ -6,7 +6,7 @@ php:
before_script:
- travis_retry composer self-update
- travis_retry composer install --prefer-source --no-interaction
- travis_retry composer require php-coveralls/php-coveralls
- COMPOSER_MEMORY_LIMIT=-1 travis_retry composer require php-coveralls/php-coveralls
- cp .env.example .env
- php artisan key:generate
- php artisan storage:link

30
app/Http/Controllers/BirthdayController.php

@ -0,0 +1,30 @@
<?php
namespace App\Http\Controllers;
use App\User;
use Illuminate\Support\Facades\DB;
class BirthdayController extends Controller
{
public function index()
{
$users = $this->getUpcomingBirthdays();
return view('birthdays.index', compact('users'));
}
private function getUpcomingBirthdays()
{
$birthdayDateRaw = "concat(YEAR(CURDATE()), '-', RIGHT(dob, 5)) as birthday_date";
$userBirthdayQuery = User::whereNotNull('dob')
->select('users.name', 'users.dob', 'users.id as user_id', DB::raw($birthdayDateRaw))
->orderBy('birthday_date', 'asc')
->havingBetween('birthday_date', [today()->format('Y-m-d'), today()->addDays(60)->format('Y-m-d')]);
$users = $userBirthdayQuery->get();
return $users;
}
}

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/en/birthday.php

@ -0,0 +1,9 @@
<?php
return [
'birthday' => 'Birhtday',
'upcoming' => 'Upcoming birthdays',
'remaining' => ':count days',
'age_years' => ':age years',
'days' => 'days',
];

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

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

@ -19,13 +19,14 @@
<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 -->
<ul class="nav navbar-nav navbar-right">
<!-- Authentication Links -->
<?php $mark = (preg_match('/\?/', url()->current())) ? '&' : '?'; ?>
<?php $mark = (preg_match('/\?/', url()->current())) ? '&' : '?';?>
<li><a href="{{ url(url()->current() . $mark . 'lang=en') }}">en</a></li>
<li><a href="{{ url(url()->current() . $mark . 'lang=id') }}">id</a></li>
@if (Auth::guest())
@ -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();

17
routes/api.php

@ -1,18 +1 @@
<?php
use Illuminate\Http\Request;
/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| is assigned the "api" middleware group. Enjoy building your API!
|
*/
Route::middleware('auth:api')->get('/user', function (Request $request) {
return $request->user();
});

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
*/

4
tests/Feature/ChangePasswordTest.php

@ -1,9 +1,9 @@
<?php
namespace Tests\Feature\Auth;
namespace Tests\Feature;
use Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class ChangePasswordTest extends TestCase
{

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