#85 - google calendar improvements (#86)

* google calendar improvements

* fix

* change vacation request name

* #85 - google calendar improvements

* #85 - fix

* #85 - fix

* #85 - fix
This commit is contained in:
Adrian Hopek
2022-03-18 08:11:34 +01:00
committed by GitHub
parent afb1a5e9ff
commit 8c1819aa01
13 changed files with 120 additions and 71 deletions

View File

@@ -6,10 +6,8 @@ namespace Toby\Architecture\Providers;
use Illuminate\Support\ServiceProvider;
use Toby\Eloquent\Models\User;
use Toby\Eloquent\Models\VacationRequest;
use Toby\Eloquent\Models\YearPeriod;
use Toby\Eloquent\Observers\UserObserver;
use Toby\Eloquent\Observers\VacationRequestObserver;
use Toby\Eloquent\Observers\YearPeriodObserver;
class ObserverServiceProvider extends ServiceProvider
@@ -18,6 +16,5 @@ class ObserverServiceProvider extends ServiceProvider
{
User::observe(UserObserver::class);
YearPeriod::observe(YearPeriodObserver::class);
VacationRequest::observe(VacationRequestObserver::class);
}
}

View File

@@ -12,7 +12,6 @@ use Illuminate\Support\Carbon;
/**
* @property int $id
* @property Carbon $date
* @property string $event_id
* @property User $user
* @property VacationRequest $vacationRequest
* @property YearPeriod $yearPeriod

View File

@@ -6,6 +6,7 @@ namespace Toby\Eloquent\Models;
use Database\Factories\VacationRequestFactory;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Casts\AsCollection;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
@@ -18,6 +19,7 @@ use Toby\Domain\States\VacationRequest\VacationRequestState;
/**
* @property int $id
* @property string $name
* @property VacationType $type
* @property VacationRequestState $state
* @property Carbon $from
@@ -29,6 +31,7 @@ use Toby\Domain\States\VacationRequest\VacationRequestState;
* @property YearPeriod $yearPeriod
* @property Collection $activities
* @property Collection $vacations
* @property Collection $event_ids
* @property Carbon $created_at
* @property Carbon $updated_at
*/
@@ -44,6 +47,7 @@ class VacationRequest extends Model
"state" => VacationRequestState::class,
"from" => "date",
"to" => "date",
"event_ids" => AsCollection::class,
];
public function user(): BelongsTo
@@ -87,6 +91,11 @@ class VacationRequest extends Model
->where("to", ">=", $vacationRequest->from);
}
public function getNameAttribute(): string
{
return "{$this->id}/{$this->yearPeriod->year}";
}
public function hasFlowSkipped(): bool
{
return $this->flow_skipped;

View File

@@ -1,28 +0,0 @@
<?php
declare(strict_types=1);
namespace Toby\Eloquent\Observers;
use Illuminate\Contracts\Auth\Factory as Auth;
use Illuminate\Contracts\Events\Dispatcher;
use Toby\Eloquent\Models\VacationRequest;
class VacationRequestObserver
{
public function __construct(
protected Auth $auth,
protected Dispatcher $dispatcher,
) {}
public function creating(VacationRequest $vacationRequest): void
{
$year = $vacationRequest->from->year;
$vacationRequestNumber = $vacationRequest->user->vacationRequests()
->whereYear("from", $year)
->count() + 1;
$vacationRequest->name = "{$vacationRequestNumber}/${year}";
}
}

View File

@@ -8,7 +8,6 @@ use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Spatie\GoogleCalendar\Event;
use Toby\Eloquent\Models\Vacation;
use Toby\Eloquent\Models\VacationRequest;
class ClearVacationRequestDaysInGoogleCalendar implements ShouldQueue
@@ -22,17 +21,16 @@ class ClearVacationRequestDaysInGoogleCalendar implements ShouldQueue
public function handle(): void
{
$vacations = $this->vacationRequest->vacations()
->whereNotNull("event_id")
->get();
foreach ($this->vacationRequest->event_ids as $eventId) {
$calendarEvent = Event::find($eventId);
/** @var Vacation $vacation */
foreach ($vacations as $vacation) {
Event::find($vacation->event_id)->delete();
$vacation->update([
"event_id" => null,
]);
if ($calendarEvent->googleEvent->getStatus() !== "cancelled") {
$calendarEvent->delete();
}
}
$this->vacationRequest->update([
"event_ids" => null,
]);
}
}

View File

@@ -7,8 +7,9 @@ namespace Toby\Infrastructure\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Support\Carbon;
use Illuminate\Support\Collection;
use Spatie\GoogleCalendar\Event;
use Toby\Eloquent\Models\Vacation;
use Toby\Eloquent\Models\VacationRequest;
class SendVacationRequestDaysToGoogleCalendar implements ShouldQueue
@@ -22,21 +23,57 @@ class SendVacationRequestDaysToGoogleCalendar implements ShouldQueue
public function handle(): void
{
$vacations = $this->vacationRequest->vacations()
->whereNull("event_id")
->get();
$days = $this->vacationRequest
->vacations()
->orderBy("date")
->pluck("date");
$this->vacationRequest->event_ids = new Collection();
$ranges = $this->prepareRanges($days);
foreach ($ranges as $range) {
$text = "{$this->vacationRequest->type->label()} - {$this->vacationRequest->user->fullName} [{$this->vacationRequest->name}]";
/** @var Vacation $vacation */
foreach ($vacations as $vacation) {
$event = Event::create([
"name" => "{$this->vacationRequest->type->label()} - {$this->vacationRequest->user->fullName}",
"startDate" => $vacation->date,
"endDate" => $vacation->date,
"name" => $text,
"startDate" => Carbon::create($range["from"]),
"endDate" => Carbon::create($range["to"])->addDay(),
]);
$vacation->update([
"event_id" => $event->id,
]);
$this->vacationRequest->event_ids->add($event->id);
}
$this->vacationRequest->save();
}
protected function prepareRanges(Collection $days): array
{
$ranges = [];
$index = 0;
$first = $days->shift();
$ranges[$index] = [
"from" => $first,
"to" => $first,
];
foreach ($days as $day) {
if ($day->diffInDays($ranges[$index]["to"]) > 1) {
$index++;
$ranges[$index] = [
"from" => $day,
"to" => $day,
];
continue;
}
if ($day->isAfter($ranges[$index]["to"])) {
$ranges[$index]["to"] = $day;
}
}
return $ranges;
}
}