From 3a71b42c1fbf57a28b889f36e816c424e18fc4a5 Mon Sep 17 00:00:00 2001 From: Michal Feher Date: Wed, 12 Apr 2023 18:00:13 +0200 Subject: [PATCH 1/5] no message --- be/app/Http/Controllers/SubTaskController.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/be/app/Http/Controllers/SubTaskController.php b/be/app/Http/Controllers/SubTaskController.php index db981e5..4167e48 100644 --- a/be/app/Http/Controllers/SubTaskController.php +++ b/be/app/Http/Controllers/SubTaskController.php @@ -55,7 +55,7 @@ class SubTaskController extends Controller $subtasks = SubTask::whereHas('mastertask', function ($query) use ($parameters) { $query->where('team_id', $parameters['team_id']); })->whereHas('timeblocks', function ($query) use ($parameters) { - $query->where('start', '>=', $parameters['start']); + $query->where('start', '>', $parameters['start']); $query->where('end', '<=', $parameters['end']); })->get(); @@ -65,7 +65,7 @@ class SubTaskController extends Controller } else if (isset($parameters['user_id'])) { $subtasks = SubTask::where('user_id', $parameters['user_id'])->whereHas('timeblocks', function ($query) use ($parameters) { - $query->where('start', '>=', $parameters['start']); + $query->where('start', '>', $parameters['start']); $query->where('end', '<=', $parameters['end']); })->get(); From 8a774dd4fa6eb1e156363e190795c7ed1b7d5b1d Mon Sep 17 00:00:00 2001 From: Michal Feher Date: Wed, 12 Apr 2023 18:00:53 +0200 Subject: [PATCH 2/5] email notifications --- be/app/Events/SubTaskDeleted.php | 39 ++++++++++++ .../SendDeletedSubTaskNotification.php | 35 +++++++++++ .../SendEditedMasterTaskNotification.php | 22 +++++-- .../SendNewSubTaskEmailNotification.php | 35 +++++++++++ be/app/Mail/MasterTaskReopened.php | 62 +++++++++++++++++++ be/app/Mail/NewTask.php | 2 +- be/app/Mail/SubTaskDeleted.php | 62 +++++++++++++++++++ be/app/Observers/SubTaskObserver.php | 3 +- be/app/Providers/EventServiceProvider.php | 9 ++- .../task/master_task_reopened.blade.php | 1 + .../emails/task/sub_task_created.blade.php | 1 + .../emails/task/sub_task_deleted.blade.php | 1 + 12 files changed, 263 insertions(+), 9 deletions(-) create mode 100644 be/app/Events/SubTaskDeleted.php create mode 100644 be/app/Listeners/SendDeletedSubTaskNotification.php create mode 100644 be/app/Listeners/SendNewSubTaskEmailNotification.php create mode 100644 be/app/Mail/MasterTaskReopened.php create mode 100644 be/app/Mail/SubTaskDeleted.php create mode 100644 be/resources/views/emails/task/master_task_reopened.blade.php create mode 100644 be/resources/views/emails/task/sub_task_created.blade.php create mode 100644 be/resources/views/emails/task/sub_task_deleted.blade.php diff --git a/be/app/Events/SubTaskDeleted.php b/be/app/Events/SubTaskDeleted.php new file mode 100644 index 0000000..7b749c9 --- /dev/null +++ b/be/app/Events/SubTaskDeleted.php @@ -0,0 +1,39 @@ +subtask = $subtask; + } + + /** + * Get the channels the event should broadcast on. + * + * @return \Illuminate\Broadcasting\Channel|array + */ + public function broadcastOn() + { + return new PrivateChannel('channel-name'); + } +} diff --git a/be/app/Listeners/SendDeletedSubTaskNotification.php b/be/app/Listeners/SendDeletedSubTaskNotification.php new file mode 100644 index 0000000..129d87b --- /dev/null +++ b/be/app/Listeners/SendDeletedSubTaskNotification.php @@ -0,0 +1,35 @@ +subtask->user->email; + $receiversArray[] = \App\Models\User::find($event->subtask->created_by)->email; + + Mail::to( $receiversArray )->send( new \App\Mail\SubTaskDeleted( $event->subtask ) ); + } +} diff --git a/be/app/Listeners/SendEditedMasterTaskNotification.php b/be/app/Listeners/SendEditedMasterTaskNotification.php index ef66494..a33b846 100644 --- a/be/app/Listeners/SendEditedMasterTaskNotification.php +++ b/be/app/Listeners/SendEditedMasterTaskNotification.php @@ -4,10 +4,9 @@ namespace App\Listeners; use App\Events\MasterTaskEdited; use Illuminate\Contracts\Queue\ShouldQueue; -use Illuminate\Queue\InteractsWithQueue; use Illuminate\Support\Facades\Mail; -class SendEditedMasterTaskNotification +class SendEditedMasterTaskNotification implements ShouldQueue { /** * Create the event listener. @@ -29,11 +28,22 @@ class SendEditedMasterTaskNotification { $difference = []; + $editedMasterTaskArray = $event->mastertask->toArray(); + $originalMasterTaskArray = $event->originalMastertask; + + // unset key from array + unset($editedMasterTaskArray['created_at']); + unset($editedMasterTaskArray['updated_at']); + unset($editedMasterTaskArray['subtasks']); + + unset($originalMasterTaskArray['created_at']); + unset($originalMasterTaskArray['updated_at']); + // get the difference between $mastertask and $originalMastertask - $modelDiff = array_diff($event->mastertask->toArray(), $event->originalMastertask); + $modelDiff = array_diff_assoc($editedMasterTaskArray, $originalMasterTaskArray); foreach ( $modelDiff as $key => $diff ) { - if (in_array($key, ['created_at', 'updated_at', 'status'])) { + if (in_array($key, ['status'])) { continue; } @@ -41,7 +51,9 @@ class SendEditedMasterTaskNotification if ($key == 'is_finished' && $diff == 0) { foreach ( $event->mastertask->subtasks as $subtask ) { // Mail::to( $subtask->user->email )->send( new \App\Mail\MasterTaskEdited( $event->mastertask, $difference ) ); - Mail::to( 'feher@studiotem.com' )->send( new \App\Mail\MasterTaskEdited( $event->mastertask, $difference ) ); + Mail::to( 'feher@studiotem.com' )->send( new \App\Mail\MasterTaskReopened( $event->mastertask ) ); + + return; } } diff --git a/be/app/Listeners/SendNewSubTaskEmailNotification.php b/be/app/Listeners/SendNewSubTaskEmailNotification.php new file mode 100644 index 0000000..31524ab --- /dev/null +++ b/be/app/Listeners/SendNewSubTaskEmailNotification.php @@ -0,0 +1,35 @@ +subtask->user->email )->send( new NewTask( $event->subtask ) ); + Mail::to( 'feher@studiotem.com' )->send( new NewTask( $event->subtask ) ); + } +} diff --git a/be/app/Mail/MasterTaskReopened.php b/be/app/Mail/MasterTaskReopened.php new file mode 100644 index 0000000..0efe114 --- /dev/null +++ b/be/app/Mail/MasterTaskReopened.php @@ -0,0 +1,62 @@ +mastertask = $mastertask; + } + + /** + * Get the message envelope. + * + * @return \Illuminate\Mail\Mailables\Envelope + */ + public function envelope() + { + return new Envelope( + subject: 'Master Task ' . $this->mastertask->title . ' was reopened', + ); + } + + /** + * Get the message content definition. + * + * @return \Illuminate\Mail\Mailables\Content + */ + public function content() + { + return new Content( + view: 'emails.task.master_task_reopened', + ); + } + + /** + * Get the attachments for the message. + * + * @return array + */ + public function attachments() + { + return []; + } +} diff --git a/be/app/Mail/NewTask.php b/be/app/Mail/NewTask.php index 0bf04a0..c4c412c 100644 --- a/be/app/Mail/NewTask.php +++ b/be/app/Mail/NewTask.php @@ -46,7 +46,7 @@ class NewTask extends Mailable public function content() { return new Content( - view: 'emails.task.new_task_created', + view: 'emails.task.sub_task_created', ); } diff --git a/be/app/Mail/SubTaskDeleted.php b/be/app/Mail/SubTaskDeleted.php new file mode 100644 index 0000000..46487f4 --- /dev/null +++ b/be/app/Mail/SubTaskDeleted.php @@ -0,0 +1,62 @@ +subtask = $subtask; + } + + /** + * Get the message envelope. + * + * @return \Illuminate\Mail\Mailables\Envelope + */ + public function envelope() + { + return new Envelope( + subject: 'Sub Task ' . $this->subtask->mastertask->title . ' was deleted', + ); + } + + /** + * Get the message content definition. + * + * @return \Illuminate\Mail\Mailables\Content + */ + public function content() + { + return new Content( + view: 'emails.task.sub_task_deleted', + ); + } + + /** + * Get the attachments for the message. + * + * @return array + */ + public function attachments() + { + return []; + } +} diff --git a/be/app/Observers/SubTaskObserver.php b/be/app/Observers/SubTaskObserver.php index 9c84ff0..b16da2e 100644 --- a/be/app/Observers/SubTaskObserver.php +++ b/be/app/Observers/SubTaskObserver.php @@ -3,6 +3,7 @@ namespace App\Observers; use App\Events\SubTaskCreated; +use App\Events\SubTaskDeleted; use App\Models\SubTask; class SubTaskObserver @@ -46,7 +47,7 @@ class SubTaskObserver */ public function deleted(SubTask $subTask) { - // + SubTaskDeleted::dispatch($subTask); } /** diff --git a/be/app/Providers/EventServiceProvider.php b/be/app/Providers/EventServiceProvider.php index 8ab9100..113684f 100644 --- a/be/app/Providers/EventServiceProvider.php +++ b/be/app/Providers/EventServiceProvider.php @@ -4,8 +4,10 @@ namespace App\Providers; use App\Events\MasterTaskEdited; use App\Events\SubTaskCreated; +use App\Events\SubTaskDeleted; +use App\Listeners\SendDeletedSubTaskNotification; use App\Listeners\SendEditedMasterTaskNotification; -use App\Listeners\SendNewTaskEmailNotification; +use App\Listeners\SendNewSubTaskEmailNotification; use App\Models\MasterTask; use App\Models\SubTask; use App\Observers\MasterTaskObserver; @@ -27,9 +29,12 @@ class EventServiceProvider extends ServiceProvider SendEmailVerificationNotification::class, ], SubTaskCreated::class => [ - SendNewTaskEmailNotification::class, + SendNewSubTaskEmailNotification::class, //LogEvent::class, ], + SubTaskDeleted::class => [ + SendDeletedSubTaskNotification::class + ], MasterTaskEdited::class => [ SendEditedMasterTaskNotification::class ], diff --git a/be/resources/views/emails/task/master_task_reopened.blade.php b/be/resources/views/emails/task/master_task_reopened.blade.php new file mode 100644 index 0000000..27c794c --- /dev/null +++ b/be/resources/views/emails/task/master_task_reopened.blade.php @@ -0,0 +1 @@ +Master Task {{$mastertask->title}} was reopened.

diff --git a/be/resources/views/emails/task/sub_task_created.blade.php b/be/resources/views/emails/task/sub_task_created.blade.php new file mode 100644 index 0000000..dd2f5c3 --- /dev/null +++ b/be/resources/views/emails/task/sub_task_created.blade.php @@ -0,0 +1 @@ +New task created: {{ $subtask->mastertask->title }} diff --git a/be/resources/views/emails/task/sub_task_deleted.blade.php b/be/resources/views/emails/task/sub_task_deleted.blade.php new file mode 100644 index 0000000..d2bd471 --- /dev/null +++ b/be/resources/views/emails/task/sub_task_deleted.blade.php @@ -0,0 +1 @@ +Sub Task {{$subtask->mastertask->title}} was deleted.

From aa37b6be0b7cea201e8fde73c6a9be50912353aa Mon Sep 17 00:00:00 2001 From: Michal Feher Date: Wed, 12 Apr 2023 18:01:26 +0200 Subject: [PATCH 3/5] no message --- .../SendNewTaskEmailNotification.php | 35 ------------------- .../emails/task/new_task_created.blade.php | 1 - 2 files changed, 36 deletions(-) delete mode 100644 be/app/Listeners/SendNewTaskEmailNotification.php delete mode 100644 be/resources/views/emails/task/new_task_created.blade.php diff --git a/be/app/Listeners/SendNewTaskEmailNotification.php b/be/app/Listeners/SendNewTaskEmailNotification.php deleted file mode 100644 index 9c173e8..0000000 --- a/be/app/Listeners/SendNewTaskEmailNotification.php +++ /dev/null @@ -1,35 +0,0 @@ -subtask->user->email )->send( new NewTask( $event->subtask ) ); - Mail::to( 'feher@studiotem.com' )->send( new NewTask( $event->subtask ) ); - } -} diff --git a/be/resources/views/emails/task/new_task_created.blade.php b/be/resources/views/emails/task/new_task_created.blade.php deleted file mode 100644 index dd2f5c3..0000000 --- a/be/resources/views/emails/task/new_task_created.blade.php +++ /dev/null @@ -1 +0,0 @@ -New task created: {{ $subtask->mastertask->title }} From c3bf06a9b0c4d43f28451e1726b3583a1d9cbb9f Mon Sep 17 00:00:00 2001 From: Michal Feher Date: Thu, 13 Apr 2023 10:34:13 +0200 Subject: [PATCH 4/5] karat timesheet sync fix --- be/app/Services/Karat/Api.php | 4 +++- be/app/Services/Karat/KaratService.php | 5 ++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/be/app/Services/Karat/Api.php b/be/app/Services/Karat/Api.php index dce8a46..7419e19 100644 --- a/be/app/Services/Karat/Api.php +++ b/be/app/Services/Karat/Api.php @@ -68,9 +68,11 @@ class Api public static function setTimesheet($timesheet) { + echo 'Setting timesheet for project ' . $timesheet->subtask->mastertask->project->code . PHP_EOL; + $body = [ 'command' => 'TM_SET_vykaz', - 'zakazka' => $timesheet->subtask->project->code, + 'zakazka' => $timesheet->subtask->mastertask->project->code, 'zdroj' => $timesheet->user->code, 'hodin' => $timesheet->time, 'datum' => $timesheet->created_at->format('Y-m-d'), diff --git a/be/app/Services/Karat/KaratService.php b/be/app/Services/Karat/KaratService.php index b2b5e49..f34b04c 100644 --- a/be/app/Services/Karat/KaratService.php +++ b/be/app/Services/Karat/KaratService.php @@ -134,6 +134,9 @@ class KaratService $notSyncedTimesheets = Timesheet::whereNull('synced_to_karat')->get(); $notSyncedTimesheets->each(function ($timesheet) { + if (!$timesheet->subtask || !$timesheet->subtask->mastertask->project) + return false; + $this->syncTimesheet($timesheet); }); } @@ -141,7 +144,7 @@ class KaratService private function syncTimesheet(Timesheet $timesheet) { $this->api->setTimesheet($timesheet); - $timesheet->synced_to_karat = true; + $timesheet->synced_to_karat = Carbon::now(); $timesheet->save(); } From e1a8a3fe1afa8a61ae529bbe194a12cf37f1f0c9 Mon Sep 17 00:00:00 2001 From: Michal Feher Date: Thu, 13 Apr 2023 11:26:06 +0200 Subject: [PATCH 5/5] subtask edited email notification --- be/app/Events/SubTaskEdited.php | 41 +++++++++++ be/app/Http/Controllers/SubTaskController.php | 1 + .../SendEditedSubTaskNotification.php | 70 +++++++++++++++++++ be/app/Mail/SubTaskEdited.php | 64 +++++++++++++++++ be/app/Observers/SubTaskObserver.php | 3 + be/app/Providers/EventServiceProvider.php | 5 ++ ..._04_13_085734_add_edited_by_to_subtask.php | 32 +++++++++ .../emails/task/sub_task_edited.blade.php | 6 ++ 8 files changed, 222 insertions(+) create mode 100644 be/app/Events/SubTaskEdited.php create mode 100644 be/app/Listeners/SendEditedSubTaskNotification.php create mode 100644 be/app/Mail/SubTaskEdited.php create mode 100644 be/database/migrations/2023_04_13_085734_add_edited_by_to_subtask.php create mode 100644 be/resources/views/emails/task/sub_task_edited.blade.php diff --git a/be/app/Events/SubTaskEdited.php b/be/app/Events/SubTaskEdited.php new file mode 100644 index 0000000..cfeebb1 --- /dev/null +++ b/be/app/Events/SubTaskEdited.php @@ -0,0 +1,41 @@ +subtask = $subtask; + $this->originalSubtask = $originalSubtask; + } + + /** + * Get the channels the event should broadcast on. + * + * @return \Illuminate\Broadcasting\Channel|array + */ + public function broadcastOn() + { + return new PrivateChannel('channel-name'); + } +} diff --git a/be/app/Http/Controllers/SubTaskController.php b/be/app/Http/Controllers/SubTaskController.php index 4167e48..74f4ef6 100644 --- a/be/app/Http/Controllers/SubTaskController.php +++ b/be/app/Http/Controllers/SubTaskController.php @@ -222,6 +222,7 @@ class SubTaskController extends Controller $data['data'] = $request->all()['data']; $data['data']['user_id'] = $request->all()['data']['employee_id']; $data['data']['estimated_time'] = $request->all()['data']['duration']; + $data['data']['updated_by'] = User::getUserIdFromBearerToken($request->bearerToken()); $request->merge($data); diff --git a/be/app/Listeners/SendEditedSubTaskNotification.php b/be/app/Listeners/SendEditedSubTaskNotification.php new file mode 100644 index 0000000..c8f0c18 --- /dev/null +++ b/be/app/Listeners/SendEditedSubTaskNotification.php @@ -0,0 +1,70 @@ +subtask->updated_by == $event->subtask->user_id) { + return; + } + + $difference = []; + + $editedSubTaskArray = $event->subtask->toArray(); + $originalSubTaskArray = $event->originalSubtask; + + // unset key from array + unset($editedSubTaskArray['created_at']); + unset($editedSubTaskArray['updated_at']); + unset($editedSubTaskArray['timesheets']); + unset($editedSubTaskArray['timeblocks']); + + unset($originalSubTaskArray['created_at']); + unset($originalSubTaskArray['updated_at']); + unset($originalSubTaskArray['timesheets']); + unset($originalSubTaskArray['timeblocks']); + + // get the difference between $subtask and $originalSubtask + $modelDiff = array_diff_assoc($editedSubTaskArray, $originalSubTaskArray); + + foreach ( $modelDiff as $key => $diff ) { + if (in_array($key, ['status', 'tracked_time'])) { + continue; + } + + $difference[$key] = $diff; + } + + if (empty($difference)) { + return; + } + + // Mail::to( $subtask->user->email )->send( new \App\Mail\SubTaskEdited( $event->subtask, $difference ) ); + Mail::to( 'feher@studiotem.com' )->send( new \App\Mail\SubTaskEdited( $event->subtask, $difference ) ); + + } +} diff --git a/be/app/Mail/SubTaskEdited.php b/be/app/Mail/SubTaskEdited.php new file mode 100644 index 0000000..22f3de4 --- /dev/null +++ b/be/app/Mail/SubTaskEdited.php @@ -0,0 +1,64 @@ +subtask = $subtask; + $this->difference = $difference; + } + + /** + * Get the message envelope. + * + * @return \Illuminate\Mail\Mailables\Envelope + */ + public function envelope() + { + return new Envelope( + subject: 'Sub Task Edited', + ); + } + + /** + * Get the message content definition. + * + * @return \Illuminate\Mail\Mailables\Content + */ + public function content() + { + return new Content( + view: 'emails.task.sub_task_edited', + ); + } + + /** + * Get the attachments for the message. + * + * @return array + */ + public function attachments() + { + return []; + } +} diff --git a/be/app/Observers/SubTaskObserver.php b/be/app/Observers/SubTaskObserver.php index b16da2e..be329b3 100644 --- a/be/app/Observers/SubTaskObserver.php +++ b/be/app/Observers/SubTaskObserver.php @@ -4,6 +4,7 @@ namespace App\Observers; use App\Events\SubTaskCreated; use App\Events\SubTaskDeleted; +use App\Events\SubTaskEdited; use App\Models\SubTask; class SubTaskObserver @@ -25,6 +26,8 @@ class SubTaskObserver $subTask->created_by = $subTask->getOriginal('created_by'); $subTask->tracked_time = $subTask->timesheets->sum('time'); + + SubTaskEdited::dispatch($subTask, $subTask->getOriginal()); } /** diff --git a/be/app/Providers/EventServiceProvider.php b/be/app/Providers/EventServiceProvider.php index 113684f..01d400a 100644 --- a/be/app/Providers/EventServiceProvider.php +++ b/be/app/Providers/EventServiceProvider.php @@ -5,8 +5,10 @@ namespace App\Providers; use App\Events\MasterTaskEdited; use App\Events\SubTaskCreated; use App\Events\SubTaskDeleted; +use App\Events\SubTaskEdited; use App\Listeners\SendDeletedSubTaskNotification; use App\Listeners\SendEditedMasterTaskNotification; +use App\Listeners\SendEditedSubTaskNotification; use App\Listeners\SendNewSubTaskEmailNotification; use App\Models\MasterTask; use App\Models\SubTask; @@ -35,6 +37,9 @@ class EventServiceProvider extends ServiceProvider SubTaskDeleted::class => [ SendDeletedSubTaskNotification::class ], + SubTaskEdited::class => [ + SendEditedSubTaskNotification::class + ], MasterTaskEdited::class => [ SendEditedMasterTaskNotification::class ], diff --git a/be/database/migrations/2023_04_13_085734_add_edited_by_to_subtask.php b/be/database/migrations/2023_04_13_085734_add_edited_by_to_subtask.php new file mode 100644 index 0000000..0dfa1d2 --- /dev/null +++ b/be/database/migrations/2023_04_13_085734_add_edited_by_to_subtask.php @@ -0,0 +1,32 @@ +foreignIdFor( \App\Models\User::class, 'updated_by')->after('updated_at')->nullable()->default(null); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('subtask', function (Blueprint $table) { + // + }); + } +}; diff --git a/be/resources/views/emails/task/sub_task_edited.blade.php b/be/resources/views/emails/task/sub_task_edited.blade.php new file mode 100644 index 0000000..f6d8f5e --- /dev/null +++ b/be/resources/views/emails/task/sub_task_edited.blade.php @@ -0,0 +1,6 @@ +Sub Task edited.

+ +Edited fields:

+@foreach($difference as $key => $diff) + {{ $key }}: {{ $diff }}
+@endforeach