Skip to content

Commit c41dce8

Browse files
authored
Merge pull request #24 from eporsche/manage_time_trackings_for_other_user
added functionality to manage time trackings of other location members
2 parents 8380377 + a8b5621 commit c41dce8

26 files changed

+548
-284
lines changed

app/Actions/AddTimeTracking.php

+20-7
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,20 @@
22

33
namespace App\Actions;
44

5+
use DB;
56
use Carbon\Carbon;
7+
use App\Models\User;
8+
use App\Models\Location;
69
use Carbon\CarbonPeriod;
710
use Illuminate\Support\Arr;
11+
use App\Models\TimeTracking;
812
use App\Formatter\DateFormatter;
13+
use Laravel\Jetstream\Jetstream;
914
use App\Facades\PeriodCalculator;
1015
use App\Contracts\AddsTimeTrackings;
16+
use Illuminate\Support\Facades\Gate;
1117
use Illuminate\Support\Facades\Validator;
1218
use Illuminate\Validation\ValidationException;
13-
use DB;
1419

1520
class AddTimeTracking implements AddsTimeTrackings
1621
{
@@ -21,8 +26,14 @@ public function __construct(DateFormatter $dateFormatter)
2126
$this->dateFormatter = $dateFormatter;
2227
}
2328

24-
public function add($employee, array $data, array $pauseTimes)
29+
public function add(User $user, Location $location, int $managingTimeTrackingForId, array $data, array $pauseTimes)
2530
{
31+
Gate::forUser($user)->authorize('addTimeTracking', [
32+
TimeTracking::class,
33+
$managingTimeTrackingForId,
34+
$location
35+
]);
36+
2637
Validator::make($data,[
2738
'starts_at' => ['required', $this->dateFormatter->dateTimeFormatRule() ],
2839
'ends_at' => ['required', $this->dateFormatter->dateTimeFormatRule() , 'after_or_equal:starts_at'],
@@ -32,19 +43,21 @@ public function add($employee, array $data, array $pauseTimes)
3243
$startsAt = $this->dateFormatter->timeStrToCarbon($data['starts_at']);
3344
$endsAt = $this->dateFormatter->timeStrToCarbon($data['ends_at']);
3445

35-
$this->ensureDateIsNotBeforeEmploymentDate($employee, $startsAt);
46+
$addingTimeTrackingFor = Jetstream::findUserByIdOrFail($managingTimeTrackingForId);
47+
48+
$this->ensureDateIsNotBeforeEmploymentDate($addingTimeTrackingFor, $startsAt);
3649
$this->ensureDateIsNotTooFarInTheFuture($endsAt);
37-
$this->ensureGivenTimeIsNotOverlappingWithExisting($employee, $startsAt, $endsAt);
50+
$this->ensureGivenTimeIsNotOverlappingWithExisting($addingTimeTrackingFor, $startsAt, $endsAt);
3851

3952
$this->validatePauseTimes(
4053
PeriodCalculator::fromTimesArray($pauseTimes),
4154
$startsAt,
4255
$endsAt
4356
);
4457

45-
DB::transaction(function () use ($employee, $startsAt, $endsAt, $data, $pauseTimes) {
46-
$trackedTime = $employee->timeTrackings()->create(array_merge([
47-
'location_id' => $employee->currentLocation->id,
58+
DB::transaction(function () use ($addingTimeTrackingFor, $startsAt, $endsAt, $data, $pauseTimes, $location) {
59+
$trackedTime = $addingTimeTrackingFor->timeTrackings()->create(array_merge([
60+
'location_id' => $location->id,
4861
'starts_at' => $startsAt,
4962
'ends_at' => $endsAt,
5063

app/Actions/ApproveAbscence.php

+3-1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use Carbon\CarbonPeriod;
1111
use App\Jobs\SendAbsenceApproved;
1212
use App\Contracts\ApprovesAbsence;
13+
use Illuminate\Support\Facades\Gate;
1314
use Illuminate\Support\Facades\Validator;
1415
use App\AbsenceCalendar\AbsenceCalculator;
1516
use Daybreak\Caldav\Jobs\CreateCaldavEvent;
@@ -29,6 +30,8 @@ class ApproveAbscence implements ApprovesAbsence
2930
*/
3031
public function approve(User $user, Location $location, $absenceId)
3132
{
33+
Gate::check('approveAbsence', [App\Model\Absence::class, $location]);
34+
3235
Validator::make([
3336
'absence_id' => $absenceId
3437
], [
@@ -57,7 +60,6 @@ public function bookVacationDays($absence)
5760

5861
//TODO: distribute absence days between available vacation entitlements
5962
$currentVacationEntitlement = $absence->employee->currentVacationEntitlement();
60-
6163
if (!isset($currentVacationEntitlement) || !$currentVacationEntitlement->hasEnoughUnusedVacationDays($absence->vacation_days)) {
6264
throw ValidationException::withMessages([
6365
'error' => [__('Sorry, there is no fitting vacation entitlement for this absence.')],

app/Actions/RemoveTimeTracking.php

+13-2
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,23 @@
33
namespace App\Actions;
44

55
use App\Models\User;
6+
use App\Models\Location;
7+
use Illuminate\Support\Facades\Gate;
68
use App\Contracts\RemovesTimeTracking;
79

810
class RemoveTimeTracking implements RemovesTimeTracking
911
{
10-
public function remove(User $user, $timeTrackingId)
12+
public function remove(User $user, Location $location, int $removeTimeTrackingForId, $timeTrackingId)
1113
{
12-
$user->currentLocation->timeTrackings()->whereKey($timeTrackingId)->delete();
14+
tap($location->timeTrackings()->whereKey($timeTrackingId)->first(), function ($timeTracking) use ($user, $location) {
15+
16+
Gate::forUser($user)->authorize('removeAbsence', [
17+
TimeTracking::class,
18+
$timeTracking,
19+
$location
20+
]);
21+
22+
$timeTracking->delete();
23+
});
1324
}
1425
}

app/Actions/UpdateTimeTracking.php

+20-10
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,13 @@
55
use DB;
66
use Carbon\Carbon;
77
use App\Models\User;
8+
use App\Models\Location;
89
use Carbon\CarbonPeriod;
910
use Illuminate\Support\Arr;
1011
use App\Formatter\DateFormatter;
12+
use Laravel\Jetstream\Jetstream;
1113
use App\Facades\PeriodCalculator;
14+
use Illuminate\Support\Facades\Gate;
1215
use App\Contracts\UpdatesTimeTracking;
1316
use Illuminate\Support\Facades\Validator;
1417
use Illuminate\Validation\ValidationException;
@@ -22,8 +25,14 @@ public function __construct(DateFormatter $dateFormatter)
2225
$this->dateFormatter = $dateFormatter;
2326
}
2427

25-
public function update(User $employee, $timeTrackingId, array $data, array $pauseTimes)
28+
public function update(User $user, Location $location, int $managingTimeTrackingForId, int $timeTrackingId, array $data, array $pauseTimes)
2629
{
30+
Gate::forUser($user)->authorize('updateTimeTracking', [
31+
TimeTracking::class,
32+
$managingTimeTrackingForId,
33+
$location
34+
]);
35+
2736
Validator::make(array_merge($data, [
2837
'time_tracking_id' => $timeTrackingId
2938
]),[
@@ -37,20 +46,21 @@ public function update(User $employee, $timeTrackingId, array $data, array $paus
3746
$startsAt = $this->dateFormatter->timeStrToCarbon($data['starts_at']);
3847
$endsAt = $this->dateFormatter->timeStrToCarbon($data['ends_at']);
3948

40-
$this->ensureDateIsNotBeforeEmploymentDate($employee, $startsAt);
49+
$this->ensureDateIsNotBeforeEmploymentDate($user, $startsAt);
4150
$this->ensureDateIsNotTooFarInTheFuture($endsAt);
42-
$this->ensureGivenTimeIsNotOverlappingWithExisting($employee, $startsAt, $endsAt, $timeTrackingId);
51+
$this->ensureGivenTimeIsNotOverlappingWithExisting($user, $startsAt, $endsAt, $timeTrackingId);
4352

4453
$this->validatePauseTimes(
4554
PeriodCalculator::fromTimesArray($pauseTimes),
4655
$startsAt,
4756
$endsAt
4857
);
4958

50-
$trackedTime = $employee->currentLocation->timeTrackings()->whereKey($timeTrackingId)->first();
59+
$trackedTime = $location->timeTrackings()->whereKey($timeTrackingId)->first();
5160

52-
DB::transaction(function () use ($trackedTime, $startsAt, $endsAt, $data, $pauseTimes) {
61+
DB::transaction(function () use ($trackedTime, $startsAt, $endsAt, $data, $pauseTimes, $managingTimeTrackingForId) {
5362
$trackedTime->update(array_merge([
63+
'user_id' => $managingTimeTrackingForId,
5464
'starts_at' => $startsAt,
5565
'ends_at' => $endsAt,
5666
], Arr::except($data, ['starts_at','ends_at','time_tracking_id'])));
@@ -85,19 +95,19 @@ protected function ensureDateIsNotTooFarInTheFuture($endsAt)
8595
}
8696
}
8797

88-
protected function ensureDateIsNotBeforeEmploymentDate($employee, $startsAt)
98+
protected function ensureDateIsNotBeforeEmploymentDate($user, $startsAt)
8999
{
90-
if ($employee->date_of_employment) {
91-
if ($startsAt->isBefore($employee->date_of_employment)) {
100+
if ($user->date_of_employment) {
101+
if ($startsAt->isBefore($user->date_of_employment)) {
92102
throw ValidationException::withMessages([
93103
'date' => [ __('Date should not before employment date.') ],
94104
])->errorBag('addTimeTracking');
95105
}
96106
}
97107
}
98108

99-
protected function ensureGivenTimeIsNotOverlappingWithExisting($employee, $startsAt, $endsAt, $timeTrackingId) {
100-
if ($employee->timeTrackings()->where(function ($query) use ($startsAt, $endsAt, $timeTrackingId) {
109+
protected function ensureGivenTimeIsNotOverlappingWithExisting($user, $startsAt, $endsAt, $timeTrackingId) {
110+
if ($user->timeTrackings()->where(function ($query) use ($startsAt, $endsAt, $timeTrackingId) {
101111
$query->whereBetween('starts_at', [$startsAt, $endsAt])
102112
->orWhereBetween('ends_at', [$startsAt, $endsAt])
103113
->orWhere(function ($query) use ($startsAt, $endsAt) {

app/Contracts/AddsTimeTrackings.php

+4-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@
22

33
namespace App\Contracts;
44

5+
use App\Models\User;
6+
use App\Models\Location;
7+
58
interface AddsTimeTrackings
69
{
7-
public function add($employee, array $array, array $pauseTimes);
10+
public function add(User $user, Location $location, int $managingTimeTrackingForId, array $array, array $pauseTimes);
811
}

app/Contracts/RemovesTimeTracking.php

+2-1
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@
33
namespace App\Contracts;
44

55
use App\Models\User;
6+
use App\Models\Location;
67

78
interface RemovesTimeTracking
89
{
9-
public function remove(User $employee, $timeTrackingId);
10+
public function remove(User $user, Location $location, int $removeTimeTrackingForId, $timeTrackingId);
1011
}

app/Contracts/UpdatesTimeTracking.php

+2-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace App\Contracts;
44

55
use App\Models\User;
6+
use App\Models\Location;
67

78
interface UpdatesTimeTracking
89
{
@@ -15,5 +16,5 @@ interface UpdatesTimeTracking
1516
* @param array $pauseTimes
1617
* @return void
1718
*/
18-
public function update(User $user, $timeTrackingId, array $input, array $pauseTimes);
19+
public function update(User $user, Location $location, int $manageTimeTrackingForId, int $timeTrackingId, array $input, array $pauseTimes);
1920
}

app/Http/Controllers/TimeTrackingController.php

+1-3
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@ class TimeTrackingController extends Controller
1313
*/
1414
public function index(Request $request)
1515
{
16-
return view('time_trackings.index', [
17-
'employee' => $request->user()
18-
]);
16+
return view('time_trackings.index');
1917
}
2018
}

app/Http/Livewire/AbsenceManager.php app/Http/Livewire/Absence/AbsenceManager.php

+1-9
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,18 @@
11
<?php
22

3-
namespace App\Http\Livewire;
3+
namespace App\Http\Livewire\Absence;
44

55
use Carbon\Carbon;
6-
use App\Models\User;
76
use Livewire\Component;
87
use Carbon\CarbonPeriod;
98
use App\Models\AbsenceType;
109
use Livewire\WithPagination;
1110
use App\Contracts\AddsAbsences;
1211
use App\Formatter\DateFormatter;
13-
use Laravel\Jetstream\Jetstream;
1412
use App\Contracts\RemovesAbsence;
1513
use App\Contracts\ApprovesAbsence;
16-
use Illuminate\Support\Facades\Auth;
1714
use App\AbsenceCalendar\AbsenceCalculator;
1815
use App\AbsenceCalendar\EmployeeAbsenceCalendar;
19-
use App\Daybreak;
2016
use App\Traits\HasUser;
2117

2218
class AbsenceManager extends Component
@@ -32,17 +28,13 @@ class AbsenceManager extends Component
3228
public $hours;
3329
public $minutes;
3430

35-
public $location;
36-
3731
/**
3832
* The user that is currently having its absence managed.
3933
*
4034
* @var mixed
4135
*/
4236
public $managingAbsenceForId;
4337

44-
public $locationMembers;
45-
4638
public $startDate;
4739
public $startHours = 9;
4840
public $startMinutes = 0;

0 commit comments

Comments
 (0)