Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions app/Enums/LeaveType.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php declare (strict_types = 1);

namespace App\Enums;

use BenSampo\Enum\Enum;

/**
* @method static static annual()
* @method static static comp()
* @method static static personal()
* @method static static offical()
* @method static static marriage()
* @method static static funeral()
* @method static static menstrul()
* @method static static maternity()
* @method static static paternity()
*/
final class LeaveType extends Enum
{
const annual = '特休';
const comp = '補休';
const personal = '事假';
const offical = '公假';
const marriage = '婚假';
const funeral = '喪假';
const menstrul = '生理假';
const maternity = '產假';
const paternity = '陪產假';
}
6 changes: 6 additions & 0 deletions app/Http/Controllers/LeaveController.php
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@ public function store(LeavePostRequest $request)

public function destroy(Request $request, $id)
{
$leave = $this->LeaveRepository->getById($id);
$this->authorize('delete_leave', $leave);

$status = $this->LeaveRepository->delete($id);

throw_if(!$status, new PostException);
Expand All @@ -46,6 +49,9 @@ public function destroy(Request $request, $id)

public function update(LeavePostRequest $request, $id)
{
$leave = $this->LeaveRepository->getById($id);
$this->authorize('update_leave', $leave);

$formData = $request->safe()->only(['member_id', 'type', 'start', 'end', 'description', 'hours', 'approval']);

$status = $this->LeaveRepository->update($id, $formData);
Expand Down
61 changes: 5 additions & 56 deletions app/Http/Requests/LeavePostRequest.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,20 @@
namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Auth;
use \App\Repositories\HolidayRepository;
use \App\Rules\GreaterThanToday;
use \App\Services\CalendarService;

class LeavePostRequest extends FormRequest
{
private $holidayRepository;
private $calendarService;

public function __construct(HolidayRepository $holidayRepository, )
public function __construct(HolidayRepository $holidayRepository, CalendarService $calendarService, )
{
$this->HolidayRepository = $holidayRepository;
$this->CalendarService = $calendarService;
}
/**
* Determine if the user is authorized to make this request.
Expand All @@ -34,7 +36,7 @@ protected function prepareForValidation()
$start = $this->input('start-date') . ' ' . $startTime;
$end = $this->input('end-date') . ' ' . $endTime;

$hours = $this->countHours($start, $end);
$hours = $this->CalendarService->countHours($start, $end);

$this->merge([
'approval' => 0,
Expand Down Expand Up @@ -75,57 +77,4 @@ public function messages()
];
}

private function countHours($stratDatetime, $endDateTime): int
{
$today = Carbon::now()->format('Y-m-d');
$startTime = Carbon::parse($stratDatetime)->format('H:i:s');
$endTime = Carbon::parse($endDateTime)->format('H:i:s');

$holidays = $this->HolidayRepository->getByPeriod($stratDatetime, $endDateTime)->keyBy('date');

$range = [];
$period = Carbon::parse($stratDatetime)->daysUntil($endDateTime);

foreach ($period as $date) {
$date = $date->format('Y-m-d');
if (!$holidays->has($date)) {
array_push($range, $date);
}
}
$afternoon = Carbon::parse($today . ' ' . '13:00:00');
$startTime = Carbon::parse($today . ' ' . $startTime);
$endTime = Carbon::parse($today . ' ' . $endTime);
$days = 0;
$lastIndex = (count($range)) - 1;

foreach ($range as $index => $date) {

if ($index == 0) {
$isStartFromMorning = ($afternoon->copy()->diffInHours($startTime->copy(), false)) < 0;

if ($lastIndex == 0) {
$isEndAfternoon = ($afternoon->copy()->diffInHours($endTime->copy(), false)) > 0;
$days += $isEndAfternoon ? 1 : 0.5;
continue;
}

$days += $isStartFromMorning ? 1 : 0.5;
continue;
}

if ($index == $lastIndex) {
if ($startTime->copy()->format('H:i:s') == $endTime->copy()->format('H:i:s') && $endTime->copy()->format('H:i:s') == '09:00:00') {
$days += 0;
continue;
}
$isEndAfternoon = ($afternoon->copy()->diffInHours($endTime->copy(), false)) > 0;
$days += $isEndAfternoon ? 1 : 0.5;
continue;
}

$days += 1;
}

return $days * 24;
}
}
94 changes: 94 additions & 0 deletions app/Policies/LeavePolicy.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
<?php

namespace App\Policies;

use App\Models\Leave;
use App\Models\Member;
use Illuminate\Auth\Access\HandlesAuthorization;

class LeavePolicy
{
use HandlesAuthorization;

/**
* Determine whether the user can view any models.
*
* @param \App\Models\Member $member
* @return \Illuminate\Auth\Access\Response|bool
*/
public function viewAny(Member $member)
{
//
}

/**
* Determine whether the user can view the model.
*
* @param \App\Models\Member $member
* @param \App\Models\Leave $leave
* @return \Illuminate\Auth\Access\Response|bool
*/
public function view(Member $member, Leave $leave)
{
//
}

/**
* Determine whether the user can create models.
*
* @param \App\Models\Member $member
* @return \Illuminate\Auth\Access\Response|bool
*/
public function create(Member $member)
{
//
}

/**
* Determine whether the user can update the model.
*
* @param \App\Models\Member $member
* @param \App\Models\Leave $leave
* @return \Illuminate\Auth\Access\Response|bool
*/
public function update(Member $member, Leave $leave)
{
return $member->id === $leave->member_id;
}

/**
* Determine whether the user can delete the model.
*
* @param \App\Models\Member $member
* @param \App\Models\Leave $leave
* @return \Illuminate\Auth\Access\Response|bool
*/
public function delete(Member $member, Leave $leave)
{
return $member->id === $leave->member_id;
}

/**
* Determine whether the user can restore the model.
*
* @param \App\Models\Member $member
* @param \App\Models\Leave $leave
* @return \Illuminate\Auth\Access\Response|bool
*/
public function restore(Member $member, Leave $leave)
{
//
}

/**
* Determine whether the user can permanently delete the model.
*
* @param \App\Models\Member $member
* @param \App\Models\Leave $leave
* @return \Illuminate\Auth\Access\Response|bool
*/
public function forceDelete(Member $member, Leave $leave)
{
//
}
}
5 changes: 4 additions & 1 deletion app/Providers/AppServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

namespace App\Providers;

use App\Policies\LeavePolicy;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
Expand All @@ -23,6 +25,7 @@ public function register()
*/
public function boot()
{
//
Gate::define('update_leave', [LeavePolicy::class, 'update']);
Gate::define('delete_leave', [LeavePolicy::class, 'delete']);
}
}
7 changes: 6 additions & 1 deletion app/Repositories/HolidayRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,13 @@

class HolidayRepository
{
public function getByPeriod($start, $end)
public function getByPeriod(string $start, string $end)
{
return Holiday::where('date', '>=', $start)->where('date', '<=', $end)->get();
}

public function getDayoffByPeriod(string $start, string $end)
{
return Holiday::where('date', '>=', $start)->where('date', '<=', $end)->where('dayoff', '=', 1)->get();
}
}
11 changes: 8 additions & 3 deletions app/Repositories/LeaveRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,17 +14,22 @@ public function create(array $params)
return $result;
}

public function getByPeriod($start, $end)
public function getById(int $id)
{
return Leave::find($id);
}

public function getByPeriod(string $start, string $end)
{
return Leave::with('member')->where('start', '>=', $start)->where('start', '<=', $end)->get();
}

public function delete($id)
public function delete(int $id)
{
return Leave::find($id)->delete();
}

public function update($id, array $params)
public function update(int $id, array $params)
{
return Leave::find($id)->update($params);
}
Expand Down
4 changes: 2 additions & 2 deletions app/Services/AccountService.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public function __construct(MemberRepository $memberRepository)
$this->MemberRepository = $memberRepository;
}

public function login($credentials)
public function login(array $credentials)
{
$status = Auth::attempt($credentials);

Expand All @@ -27,7 +27,7 @@ public function login($credentials)
return redirect('/');
}

public function register($formData)
public function register(array $formData)
{
$status = $this->MemberRepository->create($formData);

Expand Down
Loading