google calendar improvements

This commit is contained in:
Adrian Hopek 2022-03-17 12:59:42 +01:00
parent afb1a5e9ff
commit ed3cab29b3
6 changed files with 104 additions and 23 deletions

View File

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

View File

@ -6,6 +6,7 @@ namespace Toby\Eloquent\Models;
use Database\Factories\VacationRequestFactory; use Database\Factories\VacationRequestFactory;
use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Casts\AsCollection;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsTo;
@ -29,6 +30,7 @@ use Toby\Domain\States\VacationRequest\VacationRequestState;
* @property YearPeriod $yearPeriod * @property YearPeriod $yearPeriod
* @property Collection $activities * @property Collection $activities
* @property Collection $vacations * @property Collection $vacations
* @property Collection $event_ids
* @property Carbon $created_at * @property Carbon $created_at
* @property Carbon $updated_at * @property Carbon $updated_at
*/ */
@ -44,6 +46,7 @@ class VacationRequest extends Model
"state" => VacationRequestState::class, "state" => VacationRequestState::class,
"from" => "date", "from" => "date",
"to" => "date", "to" => "date",
"event_ids" => AsCollection::class,
]; ];
public function user(): BelongsTo public function user(): BelongsTo

View File

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

View File

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

View File

@ -0,0 +1,23 @@
<?php
declare(strict_types=1);
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class() extends Migration {
public function up(): void
{
Schema::table("vacations", function (Blueprint $table): void {
$table->dropColumn("event_id");
});
}
public function down(): void
{
Schema::table("vacations", function (Blueprint $table): void {
$table->string("event_id")->nullable();
});
}
};

View File

@ -0,0 +1,23 @@
<?php
declare(strict_types=1);
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class() extends Migration {
public function up(): void
{
Schema::table("vacation_requests", function (Blueprint $table): void {
$table->json("event_ids")->nullable();
});
}
public function down(): void
{
Schema::table("vacation_requests", function (Blueprint $table): void {
$table->dropColumn("event_ids");
});
}
};