From 1980a867ff5e61f0eed174cc6277240c279829b4 Mon Sep 17 00:00:00 2001 From: guillaume91 Date: Tue, 18 Jun 2024 12:06:32 +0200 Subject: [PATCH 01/15] [DB] updated year and week value to end_date and offset --- laravel_app/app/Models/ProjectMosaic.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/laravel_app/app/Models/ProjectMosaic.php b/laravel_app/app/Models/ProjectMosaic.php index 33cdece..b16dd9a 100644 --- a/laravel_app/app/Models/ProjectMosaic.php +++ b/laravel_app/app/Models/ProjectMosaic.php @@ -11,11 +11,16 @@ class ProjectMosaic extends Model use HasFactory; use \App\Traits\HasStatus; + protected $casts = [ + 'end_date' => 'datetime', + ]; + protected $fillable = [ 'name', 'path', 'week', 'year', + 'end_date', 'status' ]; From 0750e762a478a16e0c1d0459321860e6b3557b31 Mon Sep 17 00:00:00 2001 From: guillaume91 Date: Tue, 18 Jun 2024 12:06:44 +0200 Subject: [PATCH 02/15] [DB] updated year and week value to end_date and offset --- ...d_date_and_offset_project_mosaic_table.php | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 laravel_app/database/migrations/2024_06_18_082255_update_year_and_week_columns_to_end_date_and_offset_project_mosaic_table.php diff --git a/laravel_app/database/migrations/2024_06_18_082255_update_year_and_week_columns_to_end_date_and_offset_project_mosaic_table.php b/laravel_app/database/migrations/2024_06_18_082255_update_year_and_week_columns_to_end_date_and_offset_project_mosaic_table.php new file mode 100644 index 0000000..c1df568 --- /dev/null +++ b/laravel_app/database/migrations/2024_06_18_082255_update_year_and_week_columns_to_end_date_and_offset_project_mosaic_table.php @@ -0,0 +1,58 @@ +date('end_date')->nullable(); + $table->integer('offset')->default(7); + }); + ProjectMosaic::all()->each(function (ProjectMosaic $project_mosaic) { + $end_date = Carbon::parse(sprintf('%s-W%02d',$project_mosaic->year,$project_mosaic->week))->addDay(Carbon::THURSDAY); + logger(''); + $project_mosaic->update(['end_date' => $end_date]); + }); + Schema::table('project_mosaics', function (Blueprint $table) { + $table->dropColumn('week'); + $table->dropColumn('year'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('project_mosaics', function (Blueprint $table) { + // Add back year and week columns + $table->integer('year'); + $table->integer('week'); + }); + + // Extract year and week from end_date (assuming logic applied in up() is reversible) + ProjectMosaic::all()->each(function (ProjectMosaic $project_mosaic) { + if (!$project_mosaic->end_date) { + return; // Skip if end_date is null + } + $project_mosaic->update(['year' => $project_mosaic->end_date->format('Y'), 'week' => $project_mosaic->end_date->format('W')]); + }); + + Schema::table('project_mosaics', function (Blueprint $table) { + // Drop end_date and offset columns + $table->dropColumn('end_date'); + $table->dropColumn('offset'); + }); + } + +}; From 318ea276424801099c011a24a96f9343b0792482 Mon Sep 17 00:00:00 2001 From: guillaume91 Date: Tue, 18 Jun 2024 12:06:32 +0200 Subject: [PATCH 03/15] [DB] updated year and week value to end_date and offset --- laravel_app/app/Models/ProjectMosaic.php | 5 ++ ...d_date_and_offset_project_mosaic_table.php | 58 +++++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 laravel_app/database/migrations/2024_06_18_082255_update_year_and_week_columns_to_end_date_and_offset_project_mosaic_table.php diff --git a/laravel_app/app/Models/ProjectMosaic.php b/laravel_app/app/Models/ProjectMosaic.php index 33cdece..b16dd9a 100644 --- a/laravel_app/app/Models/ProjectMosaic.php +++ b/laravel_app/app/Models/ProjectMosaic.php @@ -11,11 +11,16 @@ class ProjectMosaic extends Model use HasFactory; use \App\Traits\HasStatus; + protected $casts = [ + 'end_date' => 'datetime', + ]; + protected $fillable = [ 'name', 'path', 'week', 'year', + 'end_date', 'status' ]; diff --git a/laravel_app/database/migrations/2024_06_18_082255_update_year_and_week_columns_to_end_date_and_offset_project_mosaic_table.php b/laravel_app/database/migrations/2024_06_18_082255_update_year_and_week_columns_to_end_date_and_offset_project_mosaic_table.php new file mode 100644 index 0000000..c1df568 --- /dev/null +++ b/laravel_app/database/migrations/2024_06_18_082255_update_year_and_week_columns_to_end_date_and_offset_project_mosaic_table.php @@ -0,0 +1,58 @@ +date('end_date')->nullable(); + $table->integer('offset')->default(7); + }); + ProjectMosaic::all()->each(function (ProjectMosaic $project_mosaic) { + $end_date = Carbon::parse(sprintf('%s-W%02d',$project_mosaic->year,$project_mosaic->week))->addDay(Carbon::THURSDAY); + logger(''); + $project_mosaic->update(['end_date' => $end_date]); + }); + Schema::table('project_mosaics', function (Blueprint $table) { + $table->dropColumn('week'); + $table->dropColumn('year'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('project_mosaics', function (Blueprint $table) { + // Add back year and week columns + $table->integer('year'); + $table->integer('week'); + }); + + // Extract year and week from end_date (assuming logic applied in up() is reversible) + ProjectMosaic::all()->each(function (ProjectMosaic $project_mosaic) { + if (!$project_mosaic->end_date) { + return; // Skip if end_date is null + } + $project_mosaic->update(['year' => $project_mosaic->end_date->format('Y'), 'week' => $project_mosaic->end_date->format('W')]); + }); + + Schema::table('project_mosaics', function (Blueprint $table) { + // Drop end_date and offset columns + $table->dropColumn('end_date'); + $table->dropColumn('offset'); + }); + } + +}; From 1317c203906dc808639a7a96312e6bec8457f262 Mon Sep 17 00:00:00 2001 From: guillaume91 Date: Tue, 18 Jun 2024 15:17:57 +0200 Subject: [PATCH 04/15] Changed GetMosaicFor and all the functions call inside --- laravel_app/app/Jobs/NullJob.php | 8 +-- .../app/Jobs/ProjectMosiacGeneratorJob.php | 59 +++++++++++++++---- laravel_app/app/Models/Project.php | 40 ++++++++++--- laravel_app/app/Models/ProjectMosaic.php | 11 ++++ ...d_date_and_offset_project_mosaic_table.php | 1 - 5 files changed, 93 insertions(+), 26 deletions(-) diff --git a/laravel_app/app/Jobs/NullJob.php b/laravel_app/app/Jobs/NullJob.php index 2039a26..a231cc9 100644 --- a/laravel_app/app/Jobs/NullJob.php +++ b/laravel_app/app/Jobs/NullJob.php @@ -2,18 +2,12 @@ namespace App\Jobs; -use App\Models\Project; -use App\Models\ProjectDownload; -use App\Models\ProjectMosaic; -use App\Models\ProjectReport; use Illuminate\Bus\Batchable; use Illuminate\Bus\Queueable; -use Illuminate\Contracts\Queue\ShouldBeUnique; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels; -use Symfony\Component\Process\Process; class NullJob implements ShouldQueue { @@ -25,7 +19,7 @@ class NullJob implements ShouldQueue */ public function __construct() { -logger('NullJob construct called'); + logger('NullJob construct called'); } /** diff --git a/laravel_app/app/Jobs/ProjectMosiacGeneratorJob.php b/laravel_app/app/Jobs/ProjectMosiacGeneratorJob.php index ff182a6..0b1507b 100644 --- a/laravel_app/app/Jobs/ProjectMosiacGeneratorJob.php +++ b/laravel_app/app/Jobs/ProjectMosiacGeneratorJob.php @@ -8,6 +8,7 @@ use App\Models\ProjectDownload; use App\Models\ProjectMosaic; use App\Models\ProjectReport; +use Carbon\Carbon; use Illuminate\Bus\Batchable; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldBeUnique; @@ -18,6 +19,9 @@ use Illuminate\Queue\SerializesModels; use Symfony\Component\Process\Process; +/** + * + */ class ProjectMosiacGeneratorJob implements ShouldQueue { use Batchable, Dispatchable, InteractsWithQueue, Queueable, SerializesModels; @@ -41,6 +45,8 @@ public function handle(): void { $weeksAgo = ProjectReport::weeksAgoForYearAndWeek($this->mosaic->year, $this->mosaic->week); + //TODO change to end_date and offset + $projectFolder = base_path('../'); $command = [ @@ -74,28 +80,59 @@ public function handle(): void } } - public static function handleFor(Project $project, $year, $startWeekNumber) +// public static function handleFor(Project $project, $year, $startWeekNumber) +// { +// logger("ProjectMosiacGeneratorJob::handleFor(week $startWeekNumber, year $year)"); +// if ($project->hasInvalidMosaicFor($year, $startWeekNumber)) { +// logger("ProjecMosaicGeneratorJob::handleFor(week $startWeekNumber, year $year): InvalidMosaic."); +// return new NullJob(); +// } +// +// $mosaic = $project->mosaics()->updateOrCreate( +// [ +// 'year' => $year, +// 'week' => $startWeekNumber, +// ], +// [ +// 'name' => sprintf('Week %d, %d', $startWeekNumber, $year), +// 'path' => sprintf('%s/%s/%s', +// $project->download_path, +// 'mosaics', +// ProjectMosaic::getFilenameForYearAndWeek($year, $startWeekNumber) +// ), +// 'year' => $year, +// 'week' => $startWeekNumber, +// ]); +// return new self($mosaic); +// } + + /** + * Check if the project has a mosaic for given period. + */ + public static function handleFor(Project $project,Carbon $endDate, int $offset): NullJob|ProjectMosiacGeneratorJob { - logger("ProjectMosiacGeneratorJob::handleFor(week $startWeekNumber, year $year)"); - if ($project->hasInvalidMosaicFor($year, $startWeekNumber)) { - logger("ProjecMosaicGeneratorJob::handleFor(week $startWeekNumber, year $year): InvalidMosaic."); + logger("ProjectMosiacGeneratorJob::handleFor($endDate, $offset)"); + if ($project->hasInvalidMosaicFor($endDate,$offset)) { + logger("ProjecMosaicGeneratorJob::handleFor(end_date: $endDate, offset: $offset): InvalidMosaic."); return new NullJob(); } - + /** + * @var ProjectMosaic $mosaic + */ $mosaic = $project->mosaics()->updateOrCreate( [ - 'year' => $year, - 'week' => $startWeekNumber, + 'end_date' => $endDate, + 'offset' => $offset, ], [ - 'name' => sprintf('Week %d, %d', $startWeekNumber, $year), + 'name' => sprintf('Period %s - %s', $endDate->format('Y-m-d'), $endDate->copy()->subDays($offset)->format('Y-m-d')), 'path' => sprintf('%s/%s/%s', $project->download_path, 'mosaics', - ProjectMosaic::getFilenameForYearAndWeek($year, $startWeekNumber) + ProjectMosaic::getFilenameByPeriod($endDate,$offset) ), - 'year' => $year, - 'week' => $startWeekNumber, + 'end_date' => $endDate->format('Y-m-d'), + 'offset' => $offset, ]); return new self($mosaic); } diff --git a/laravel_app/app/Models/Project.php b/laravel_app/app/Models/Project.php index a2c719e..7767904 100644 --- a/laravel_app/app/Models/Project.php +++ b/laravel_app/app/Models/Project.php @@ -269,11 +269,33 @@ public function shouldSchedule(): bool return false; } - public function hasInvalidMosaicFor($year, $week): bool +// TODO remove function when it's done +// public function hasInvalidMosaicFor($year, $week): bool +// { +// +// $dayOfWeekIso = Carbon::parse($this->mail_day)->dayOfWeekIso; +// $min_updated_at_date = now() +// ->setISODate($year, $week) +// ->startOfWeek() +// ->addDays($dayOfWeekIso - 1) +// ->format('Y-m-d'); +// +// return $this->mosaics() +// ->where('updated_at', '>=', $min_updated_at_date) +// ->statusSuccess() +// ->where(['year' => $year, 'week' => $week]) +// ->exists(); +// +// } + + public function hasInvalidMosaicFor(Carbon $endDate,int $offset): bool { + // parameters : $ + // check if the mail day happens the day before mosaic -> good + + //TODO use end_date and offset $dayOfWeekIso = Carbon::parse($this->mail_day)->dayOfWeekIso; - $min_updated_at_date = now() - ->setISODate($year, $week) + $min_updated_at_date = $endDate ->startOfWeek() ->addDays($dayOfWeekIso - 1) ->format('Y-m-d'); @@ -281,7 +303,7 @@ public function hasInvalidMosaicFor($year, $week): bool return $this->mosaics() ->where('updated_at', '>=', $min_updated_at_date) ->statusSuccess() - ->where(['year' => $year, 'week' => $week]) + ->where(['end_date' => $endDate, 'offset' => $offset]) ->exists(); } @@ -332,11 +354,15 @@ public function getFileDownloadsFor($year, $startWeekNumber):array ->toArray(); } - public function getMosaicsFor($year, $startWeekNumber) + public function getMosaicsFor(Carbon $endDate, $offset= 7) { - logger(sprintf('in Get Mosaics for year %s week %d', $year, $startWeekNumber)); + logger(sprintf('in Get Mosaics for Period %s with %d offset', $endDate->format('Y-m-d'),$offset)); return collect(range(0, 3)) - ->map(fn($weekDiff) => ProjectMosiacGeneratorJob::handleFor($this, $year, $startWeekNumber - $weekDiff)) + ->map(function ($periodDiff) use ($endDate, $offset) { + $periodEndDate = $endDate->copy()->subDays($offset*$periodDiff); +// $periodStartDate = $periodEndDate->copy()->subDays($offset-1); + return ProjectMosiacGeneratorJob::handleFor($this, $periodEndDate, $offset); + }) ->filter() ->toArray(); } diff --git a/laravel_app/app/Models/ProjectMosaic.php b/laravel_app/app/Models/ProjectMosaic.php index b16dd9a..a55527d 100644 --- a/laravel_app/app/Models/ProjectMosaic.php +++ b/laravel_app/app/Models/ProjectMosaic.php @@ -3,6 +3,7 @@ namespace App\Models; use App\Events\ProjectMosaicStatus; +use Carbon\Carbon; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; @@ -29,11 +30,21 @@ public static function getFilenameForYearAndWeek($year, $startWeekNumber) return sprintf('week_%02d_%d.tif', $startWeekNumber, $year); } + public static function getFilenameByPeriod(Carbon $endDate,int $offset) + { + return sprintf('Period_%s_%s.tif', $endDate->format('Y-m-d'), $endDate->copy()->subDays($offset)->format('Y-m-d')); + } + public function project() { return $this->belongsTo(Project::class); } + public function getStartDateAttribute() + { + return $this->end_date->subDay($this->offset); + } + protected static function booted(): void { parent::booted(); diff --git a/laravel_app/database/migrations/2024_06_18_082255_update_year_and_week_columns_to_end_date_and_offset_project_mosaic_table.php b/laravel_app/database/migrations/2024_06_18_082255_update_year_and_week_columns_to_end_date_and_offset_project_mosaic_table.php index c1df568..9192d2d 100644 --- a/laravel_app/database/migrations/2024_06_18_082255_update_year_and_week_columns_to_end_date_and_offset_project_mosaic_table.php +++ b/laravel_app/database/migrations/2024_06_18_082255_update_year_and_week_columns_to_end_date_and_offset_project_mosaic_table.php @@ -20,7 +20,6 @@ public function up(): void }); ProjectMosaic::all()->each(function (ProjectMosaic $project_mosaic) { $end_date = Carbon::parse(sprintf('%s-W%02d',$project_mosaic->year,$project_mosaic->week))->addDay(Carbon::THURSDAY); - logger(''); $project_mosaic->update(['end_date' => $end_date]); }); Schema::table('project_mosaics', function (Blueprint $table) { From 51532287585801ed137ab40b4156e2ce071c3f4b Mon Sep 17 00:00:00 2001 From: guillaume91 Date: Tue, 18 Jun 2024 16:31:35 +0200 Subject: [PATCH 05/15] Changed GetFileDownloadsFor and all the functions called inside --- laravel_app/app/Models/Project.php | 10 ++++------ laravel_app/tests/Unit/Models/ProjectTest.php | 4 ++-- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/laravel_app/app/Models/Project.php b/laravel_app/app/Models/Project.php index 7767904..f9f5452 100644 --- a/laravel_app/app/Models/Project.php +++ b/laravel_app/app/Models/Project.php @@ -319,7 +319,7 @@ public function scheduleReport($year = null, $week = null) $year = $year ?? now()->year; $week = $week ?? now()->weekOfYear; - + // TODO change to period Bus::chain([ Bus::batch($this->getFileDownloadsFor($year, $week)), Bus::batch($this->getMosaicsFor($year, $week)), @@ -341,12 +341,10 @@ public function getReportFor($year, $week, $sendMail = false) return (new ProjectReportGeneratorJob($report, $sendMail)); } - public function getFileDownloadsFor($year, $startWeekNumber):array + public function getFileDownloadsFor(Carbon $endDate, $offset):array { - $endOfRange = now()->setISODate($year, $startWeekNumber)->endOfWeek(); - $startOfRange = (clone $endOfRange)->subWeeks(3)->startOfWeek(); - - $dateRange = CarbonPeriod::create($startOfRange, $endOfRange); + $startOfRange = (clone $endDate)->subdays(4*$offset-1); + $dateRange = CarbonPeriod::create($startOfRange, $endDate); return collect($dateRange) ->map(fn($date) => ProjectDownloadTiffJob::handleForDate($this, $date)) diff --git a/laravel_app/tests/Unit/Models/ProjectTest.php b/laravel_app/tests/Unit/Models/ProjectTest.php index 5734ecb..567c9c3 100644 --- a/laravel_app/tests/Unit/Models/ProjectTest.php +++ b/laravel_app/tests/Unit/Models/ProjectTest.php @@ -162,8 +162,8 @@ public function when_getFileDownloadsFor_is_called_it_returns_a_collection_of_se 'download_path' => 'project_download_path', ]); - $downloads = $project->getFileDownloadsFor(2023, 22); - $this->assertCount(4 * 7, $downloads); + $downloads = $project->getFileDownloadsFor(new Carbon('2024-06-18'),20); + $this->assertCount(60, $downloads); collect($downloads)->each(fn($job) => $this->assertInstanceOf(ProjectDownloadTiffJob::class, $job)); } From 2867288eef55b1483cf5fd0b2d1255eb8f7a7aa7 Mon Sep 17 00:00:00 2001 From: guillaume91 Date: Tue, 18 Jun 2024 16:44:18 +0200 Subject: [PATCH 06/15] [DB] Migration that updates the values year and week to end_date and offset --- laravel_app/app/Models/ProjectReport.php | 15 ++--- ..._date_and_offset_project_reports_table.php | 57 +++++++++++++++++++ 2 files changed, 61 insertions(+), 11 deletions(-) create mode 100644 laravel_app/database/migrations/2024_06_18_082255_update_year_and_week_columns_to_end_date_and_offset_project_reports_table.php diff --git a/laravel_app/app/Models/ProjectReport.php b/laravel_app/app/Models/ProjectReport.php index 45f950b..1fde684 100644 --- a/laravel_app/app/Models/ProjectReport.php +++ b/laravel_app/app/Models/ProjectReport.php @@ -15,7 +15,8 @@ class ProjectReport extends Model { use HasStatus; - protected $fillable = ['name', 'path', 'week', 'year','status']; + protected $casts = [ 'end_date' => 'datetime']; + protected $fillable = ['name', 'path', 'week', 'year','status', 'end_date']; @@ -24,19 +25,10 @@ public function project() return $this->belongsTo(Project::class); } - public function weeksAgo() - { - return $this->weeksAgoForYearAndWeek($this->year, $this->week); - } - - public static function weeksAgoForYearAndWeek($year, $week) - { - return (now()->week - now()->setISODate($year, $week)->week); - } public function getFileName() { - return 'week_'.$this->week.'_'.$this->year; + return 'Period_'.$this->end_date->copy()->subDays($this->offset).'_'.$this->end_date; } public function getFullPathName() @@ -46,6 +38,7 @@ public function getFullPathName() public function getReportDate() { + // TODO remove year and week return self::getReportDateForYearAndWeek( $this->project, $this->year, diff --git a/laravel_app/database/migrations/2024_06_18_082255_update_year_and_week_columns_to_end_date_and_offset_project_reports_table.php b/laravel_app/database/migrations/2024_06_18_082255_update_year_and_week_columns_to_end_date_and_offset_project_reports_table.php new file mode 100644 index 0000000..e08ba4d --- /dev/null +++ b/laravel_app/database/migrations/2024_06_18_082255_update_year_and_week_columns_to_end_date_and_offset_project_reports_table.php @@ -0,0 +1,57 @@ +date('end_date')->nullable(); + $table->integer('offset')->default(7); + }); + ProjectReport::all()->each(function (ProjectReport $project_report) { + $end_date = Carbon::parse(sprintf('%s-W%02d',$project_report->year,$project_report->week))->addDay(Carbon::THURSDAY); + $project_report->update(['end_date' => $end_date]); + }); + Schema::table('project_reports', function (Blueprint $table) { + $table->dropColumn('week'); + $table->dropColumn('year'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('project_reports', function (Blueprint $table) { + // Add back year and week columns + $table->integer('year'); + $table->integer('week'); + }); + + // Extract year and week from end_date (assuming logic applied in up() is reversible) + ProjectReport::all()->each(function (ProjectReport $project_report) { + if (!$project_report->end_date) { + return; // Skip if end_date is null + } + $project_report->update(['year' => $project_report->end_date->format('Y'), 'week' => $project_report->end_date->format('W')]); + }); + + Schema::table('project_reports', function (Blueprint $table) { + // Drop end_date and offset columns + $table->dropColumn('end_date'); + $table->dropColumn('offset'); + }); + } + +}; From 944b968998b7b5312ec3320f5b0e6ee3426e309a Mon Sep 17 00:00:00 2001 From: guillaume91 Date: Tue, 18 Jun 2024 17:03:38 +0200 Subject: [PATCH 07/15] wip --- .../app/Jobs/ProjectReportGeneratorJob.php | 1 + laravel_app/app/Models/Project.php | 56 ++++++------------- laravel_app/app/Models/ProjectReport.php | 10 +++- 3 files changed, 26 insertions(+), 41 deletions(-) diff --git a/laravel_app/app/Jobs/ProjectReportGeneratorJob.php b/laravel_app/app/Jobs/ProjectReportGeneratorJob.php index 849e0ff..e297a93 100644 --- a/laravel_app/app/Jobs/ProjectReportGeneratorJob.php +++ b/laravel_app/app/Jobs/ProjectReportGeneratorJob.php @@ -35,6 +35,7 @@ public function __construct(ProjectReport $projectReport, $sendMail = false) */ public function handle() { + // TODO check the changements due to migration $this->projectReport->weeksAgo(); $projectFolder = base_path('../'); diff --git a/laravel_app/app/Models/Project.php b/laravel_app/app/Models/Project.php index f9f5452..5ca7f55 100644 --- a/laravel_app/app/Models/Project.php +++ b/laravel_app/app/Models/Project.php @@ -13,6 +13,7 @@ use Illuminate\Support\Facades\Bus; use Illuminate\Support\Facades\Storage; use Illuminate\Support\Str; +use function Livewire\off; class Project extends Model { @@ -258,6 +259,7 @@ public function startDownload(Carbon $date) public function schedule() { + //TODO check the ranges. $this->scheduleReport(); } @@ -269,31 +271,11 @@ public function shouldSchedule(): bool return false; } -// TODO remove function when it's done -// public function hasInvalidMosaicFor($year, $week): bool -// { -// -// $dayOfWeekIso = Carbon::parse($this->mail_day)->dayOfWeekIso; -// $min_updated_at_date = now() -// ->setISODate($year, $week) -// ->startOfWeek() -// ->addDays($dayOfWeekIso - 1) -// ->format('Y-m-d'); -// -// return $this->mosaics() -// ->where('updated_at', '>=', $min_updated_at_date) -// ->statusSuccess() -// ->where(['year' => $year, 'week' => $week]) -// ->exists(); -// -// } public function hasInvalidMosaicFor(Carbon $endDate,int $offset): bool { // parameters : $ // check if the mail day happens the day before mosaic -> good - - //TODO use end_date and offset $dayOfWeekIso = Carbon::parse($this->mail_day)->dayOfWeekIso; $min_updated_at_date = $endDate ->startOfWeek() @@ -308,34 +290,32 @@ public function hasInvalidMosaicFor(Carbon $endDate,int $offset): bool } - public function scheduleReport($year = null, $week = null) + public function scheduleReport(?Carbon $endDate = null, ?int $offset = null) { - // if year, week is in the future set year and week to null; - if (now()->year < $year || (now()->year === $year && now()->weekOfYear < $week)) { - $year = null; - $week = null; - logger('year and week is in the future default to now'); + if($endDate->isFuture() || $endDate->isToday() || $offset <= 0){ + logger('EndDate is today or in the future.'); + $endDate = null; + $offset = null; } - $year = $year ?? now()->year; - $week = $week ?? now()->weekOfYear; - // TODO change to period + $endDate = $year ?? Carbon::yesterday(); + $offset = $week ?? 1; Bus::chain([ - Bus::batch($this->getFileDownloadsFor($year, $week)), - Bus::batch($this->getMosaicsFor($year, $week)), - Bus::batch([$this->getReportFor($year, $week,true)]), + Bus::batch($this->getFileDownloadsFor($endDate, $offset)), + Bus::batch($this->getMosaicsFor($endDate, $offset)), + Bus::batch([$this->getReportFor($endDate, $offset,true)]), ]) ->dispatch(); return "done"; } - public function getReportFor($year, $week, $sendMail = false) + public function getReportFor(Carbon $endDate, $offset, $sendMail = false): ProjectReportGeneratorJob { $report = $this->reports()->create([ - 'name' => 'Report for week '.$week.' of '.$year, - 'week' => $week, - 'year' => $year, - 'path' => 'reports/week_'.$week.'_'.$year.'.docx', + 'name' => 'Report of the '.$endDate->format('d-m-Y').' from the past '.$offset.' days', + 'end_date' => $endDate, + 'offset' => $offset, + 'path' => 'reports/'.ProjectReport::getFileName($endDate,$offset).'.docx', ]); return (new ProjectReportGeneratorJob($report, $sendMail)); @@ -352,7 +332,7 @@ public function getFileDownloadsFor(Carbon $endDate, $offset):array ->toArray(); } - public function getMosaicsFor(Carbon $endDate, $offset= 7) + public function getMosaicsFor(Carbon $endDate, $offset= 7): array { logger(sprintf('in Get Mosaics for Period %s with %d offset', $endDate->format('Y-m-d'),$offset)); return collect(range(0, 3)) diff --git a/laravel_app/app/Models/ProjectReport.php b/laravel_app/app/Models/ProjectReport.php index 1fde684..58ce43f 100644 --- a/laravel_app/app/Models/ProjectReport.php +++ b/laravel_app/app/Models/ProjectReport.php @@ -6,10 +6,10 @@ use App\Jobs\ProjectDownloadTiffJob; use App\Jobs\ProjectMosiacGeneratorJob; use App\Traits\HasStatus; +use Carbon\Carbon; use Carbon\CarbonPeriod; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; -use Illuminate\Support\Carbon; use Illuminate\Support\Facades\File; class ProjectReport extends Model @@ -26,10 +26,14 @@ public function project() } - public function getFileName() + public function getFileNameAttribute() { - return 'Period_'.$this->end_date->copy()->subDays($this->offset).'_'.$this->end_date; + return static::getFileName($this->end_date,$this->offset); } + public static function getFileName(Carbon $endDate, int $offset): string + { + return 'Period_'.$endDate->copy()->subDays($offset).'_'.$endDate; +} public function getFullPathName() { From 76d4babd9853bc9f0e9ac7eda4e87bf795f798e6 Mon Sep 17 00:00:00 2001 From: guillaume91 Date: Wed, 19 Jun 2024 11:16:27 +0200 Subject: [PATCH 08/15] [Done] Changed all the model in order to use EndDate and Offset. Pass ProjectTests. --- laravel_app/app/Models/Project.php | 36 ++++---------- laravel_app/app/Models/ProjectMosaic.php | 6 +-- laravel_app/app/Models/ProjectReport.php | 2 +- .../tests/Unit/Models/ProjectMosaicTest.php | 9 ++-- laravel_app/tests/Unit/Models/ProjectTest.php | 49 +++++++++---------- 5 files changed, 41 insertions(+), 61 deletions(-) diff --git a/laravel_app/app/Models/Project.php b/laravel_app/app/Models/Project.php index 5ca7f55..24ea500 100644 --- a/laravel_app/app/Models/Project.php +++ b/laravel_app/app/Models/Project.php @@ -75,13 +75,7 @@ public function getMosaicPath() public function getMosaicList(): Collection { return collect(Storage::files($this->getMosaicPath())) - ->filter(fn($file) => Str::endsWith($file, '.tif')) - ->sortByDesc(function ($file) { - $parts = explode('_', str_replace('.tif', '', $file)); - $week = $parts[1]; - $year = $parts[2]; - return $year.sprintf('%02d', $week); - }) + ->filter(fn($filename) => Str::endsWith($filename, '.tif')) ->values(); } @@ -136,10 +130,10 @@ public function allMosaicsPresent(Carbon $endDate): bool { // end date is in the future if ($endDate->isFuture()) { - throw new \Exception('Mosaic can be generated for the future. Change the end date.'); + throw new \Exception('Mosaic can\'t be generated for the future. Change the end date.'); } - $mosaicsNotPresentInFilesystem = $this->getMosaicFilenameListByEndDate($endDate) + $mosaicsNotPresentInFilesystem = collect($this->getMosaicFilenameListByEndDate($endDate)) ->filter(function ($filename) { return !$this->getMosaicList()->contains(function ($mosaicFilename) use ($filename) { // TODO check the value of the week leading 0 @@ -156,21 +150,11 @@ public function allMosaicsPresent(Carbon $endDate): bool throw new \Exception($message); } - public static function getMosaicFilenameListByEndDate(Carbon $endDate): Collection + public static function getMosaicFilenameListByEndDate(Carbon $endDate, int $offset=7): \Generator { - $result = collect([]); for ($i = 0; $i < 4; $i++) { - $week = $endDate->weekOfYear; - $year = $endDate->year; - if ($week === 53) { - $year--; - } - - $result->add(sprintf('week_%02d_%04d.tif', $week, $year)); - - $endDate = $endDate->subWeek(); + yield(ProjectMosaic::getFilenameByPeriod($endDate->copy()->subDays($offset*$i),$offset)); } - return $result; } public function getMosiacList() @@ -298,8 +282,8 @@ public function scheduleReport(?Carbon $endDate = null, ?int $offset = null) $offset = null; } - $endDate = $year ?? Carbon::yesterday(); - $offset = $week ?? 1; + $endDate ??= Carbon::yesterday(); + $offset ??= 7; Bus::chain([ Bus::batch($this->getFileDownloadsFor($endDate, $offset)), Bus::batch($this->getMosaicsFor($endDate, $offset)), @@ -309,7 +293,7 @@ public function scheduleReport(?Carbon $endDate = null, ?int $offset = null) return "done"; } - public function getReportFor(Carbon $endDate, $offset, $sendMail = false): ProjectReportGeneratorJob + public function getReportFor(Carbon $endDate, int $offset = 7, $sendMail = false): ProjectReportGeneratorJob { $report = $this->reports()->create([ 'name' => 'Report of the '.$endDate->format('d-m-Y').' from the past '.$offset.' days', @@ -321,7 +305,7 @@ public function getReportFor(Carbon $endDate, $offset, $sendMail = false): Proje return (new ProjectReportGeneratorJob($report, $sendMail)); } - public function getFileDownloadsFor(Carbon $endDate, $offset):array + public function getFileDownloadsFor(Carbon $endDate, int $offset=7):array { $startOfRange = (clone $endDate)->subdays(4*$offset-1); $dateRange = CarbonPeriod::create($startOfRange, $endDate); @@ -332,7 +316,7 @@ public function getFileDownloadsFor(Carbon $endDate, $offset):array ->toArray(); } - public function getMosaicsFor(Carbon $endDate, $offset= 7): array + public function getMosaicsFor(Carbon $endDate, int $offset= 7): array { logger(sprintf('in Get Mosaics for Period %s with %d offset', $endDate->format('Y-m-d'),$offset)); return collect(range(0, 3)) diff --git a/laravel_app/app/Models/ProjectMosaic.php b/laravel_app/app/Models/ProjectMosaic.php index a55527d..8398811 100644 --- a/laravel_app/app/Models/ProjectMosaic.php +++ b/laravel_app/app/Models/ProjectMosaic.php @@ -25,14 +25,10 @@ class ProjectMosaic extends Model 'status' ]; - public static function getFilenameForYearAndWeek($year, $startWeekNumber) - { - return sprintf('week_%02d_%d.tif', $startWeekNumber, $year); - } public static function getFilenameByPeriod(Carbon $endDate,int $offset) { - return sprintf('Period_%s_%s.tif', $endDate->format('Y-m-d'), $endDate->copy()->subDays($offset)->format('Y-m-d')); + return sprintf('period_%s_%s.tif',(clone $endDate)->subdays($offset-1)->format('Y-m-d'),$endDate->format('Y-m-d')); } public function project() diff --git a/laravel_app/app/Models/ProjectReport.php b/laravel_app/app/Models/ProjectReport.php index 58ce43f..5aeb0f4 100644 --- a/laravel_app/app/Models/ProjectReport.php +++ b/laravel_app/app/Models/ProjectReport.php @@ -32,7 +32,7 @@ public function getFileNameAttribute() } public static function getFileName(Carbon $endDate, int $offset): string { - return 'Period_'.$endDate->copy()->subDays($offset).'_'.$endDate; + return 'period_'.$endDate->copy()->subDays($offset).'_'.$endDate; } public function getFullPathName() diff --git a/laravel_app/tests/Unit/Models/ProjectMosaicTest.php b/laravel_app/tests/Unit/Models/ProjectMosaicTest.php index 7789b2e..7d7222d 100644 --- a/laravel_app/tests/Unit/Models/ProjectMosaicTest.php +++ b/laravel_app/tests/Unit/Models/ProjectMosaicTest.php @@ -24,19 +24,20 @@ class ProjectMosaicTest extends TestCase * @test * @dataProvider filenameProvider * */ - public function it_should_return_the_correct_attachment_path($year,$week, $expected) + public function it_should_return_the_correct_attachment_path($endDate,$offset, $expected) { $this->assertEquals( $expected, - ProjectMosaic::getFilenameForYearAndWeek($year, $week) + ProjectMosaic::getFilenameByPeriod($endDate,$offset) + ); } public static function filenameProvider(){ return [ - [2022, 1, 'week_01_2022.tif'], - [2022, 10, 'week_10_2022.tif'], + [new Carbon('2022-01-01'), 10, 'period_2021-12-22_2022-01-01.tif'], + [new Carbon('2022-10-25'),7, 'period_2022-10-18_2022-10-25.tif'], ]; } diff --git a/laravel_app/tests/Unit/Models/ProjectTest.php b/laravel_app/tests/Unit/Models/ProjectTest.php index 567c9c3..ba1bf44 100644 --- a/laravel_app/tests/Unit/Models/ProjectTest.php +++ b/laravel_app/tests/Unit/Models/ProjectTest.php @@ -80,10 +80,9 @@ public function when_not_all_mosaics_are_present_it_should_return_an_exception() $this->seed(); $this->expectException(\Exception::class); - $this->expectExceptionMessage('Missing mosaics: week_52_2022.tif, week_51_2021.tif, week_50_2021.tif, week_49_2021.tif'); + $this->expectExceptionMessage('Missing mosaics: period_2021-12-26_2022-01-01.tif, period_2021-12-19_2021-12-25.tif, period_2021-12-12_2021-12-18.tif, period_2021-12-05_2021-12-11.tif'); $project = Project::find(1); $lastDate = Carbon::parse('2022-01-01'); - //$lastDate->getWeekOfYear(); $project->allMosaicsPresent($lastDate); } @@ -92,13 +91,13 @@ public function when_all_mosaics_are_present_it_should_return_true() { // TODO CHeck with Martin the Leading Zero test $project = Mockery::mock(Project::class)->makePartial(); - $lastDate = Carbon::parse('2021-01-22'); + $lastDate = Carbon::parse('2022-01-01'); $project->shouldReceive('getMosaicList')->andReturn( collect([ - "chemba/weekly_mosaic/week_53_2020.tif", - "chemba/weekly_mosaic/week_03_2021.tif", - "chemba/weekly_mosaic/week_02_2021.tif", - "chemba/weekly_mosaic/week_01_2021.tif", + "chemba/weekly_mosaic/period_2021-12-26_2022-01-01.tif", + "chemba/weekly_mosaic/period_2021-12-19_2021-12-25.tif", + "chemba/weekly_mosaic/period_2021-12-12_2021-12-18.tif", + "chemba/weekly_mosaic/period_2021-12-05_2021-12-11.tif", ])); $this->assertTrue($project->allMosaicsPresent($lastDate)); @@ -108,16 +107,14 @@ public function when_all_mosaics_are_present_it_should_return_true() public function when_not_mosaics_are_present_it_should_throw_an_exception_listing_the_missing_mosiacs() { $this->expectException(\Exception::class); - $this->expectExceptionMessage('Missing mosaics: week_53_2020.tif'); + $this->expectExceptionMessage('Missing mosaics: period_2020-12-05_2020-12-11.tif'); $project = Mockery::mock(Project::class)->makePartial(); $lastDate = Carbon::parse('2021-01-01'); $project->shouldReceive('getMosaicList')->andReturn( collect([ - "chemba/weekly_mosaic/week_52_2020.tif", - "chemba/weekly_mosaic/week_51_2020.tif", - "chemba/weekly_mosaic/week_50_2020.tif", - "chemba/weekly_mosaic/week_49_2021.tif", - "chemba/weekly_mosaic/week_48_2021.tif", + "chemba/weekly_mosaic/period_2020-12-26_2021-01-01.tif", + "chemba/weekly_mosaic/period_2020-12-19_2020-12-25.tif", + "chemba/weekly_mosaic/period_2020-12-12_2020-12-18.tif", ])); $project->allMosaicsPresent($lastDate); @@ -127,7 +124,7 @@ public function when_not_mosaics_are_present_it_should_throw_an_exception_listin public function when_all_mosaics_are_present_is_called_with_future_date_it_should_throw_an_expection() { $this->expectException(\Exception::class); - $this->expectExceptionMessage('Mosaic can be generated for the future. Change the end date.'); + $this->expectExceptionMessage('Mosaic can\'t be generated for the future. Change the end date.'); $this->seed(); $project = Project::find(1); Carbon::setTestNow(Carbon::parse('2020-01-01')); @@ -143,14 +140,14 @@ public function getMosiacFileListByEndDate_should_return_four_filenames() /* @var Project $project */ $project = Project::find(1); $lastDate = Carbon::parse('2021-01-01'); - $list = $project::getMosaicFilenameListByEndDate($lastDate); + $list = iterator_to_array($project::getMosaicFilenameListByEndDate($lastDate)); $this->assertCount(4, $list); $this->assertEquals([ - "week_53_2020.tif", - "week_52_2020.tif", - "week_51_2020.tif", - "week_50_2020.tif", - ], $list->toArray()); + "period_2020-12-26_2021-01-01.tif", + "period_2020-12-19_2020-12-25.tif", + "period_2020-12-12_2020-12-18.tif", + "period_2020-12-05_2020-12-11.tif", + ], $list); } /** @test */ @@ -162,8 +159,8 @@ public function when_getFileDownloadsFor_is_called_it_returns_a_collection_of_se 'download_path' => 'project_download_path', ]); - $downloads = $project->getFileDownloadsFor(new Carbon('2024-06-18'),20); - $this->assertCount(60, $downloads); + $downloads = $project->getFileDownloadsFor(new Carbon('2024-06-18'),7); + $this->assertCount(28, $downloads); collect($downloads)->each(fn($job) => $this->assertInstanceOf(ProjectDownloadTiffJob::class, $job)); } @@ -176,7 +173,7 @@ public function when_getMosaicsFor_is_called_it_returns_a_collection_of_seven_do 'download_path' => 'project_download_path', ]); - $mosaics = $project->getMosaicsFor(2023, 2); + $mosaics = $project->getMosaicsFor(new Carbon('2023-01-01')); $this->assertCount(4, $mosaics); collect($mosaics)->each(fn($job) => $this->assertInstanceOf(ProjectMosiacGeneratorJob::class, $job)); } @@ -190,7 +187,7 @@ public function when_getReport_is_called_it_returns_a_jobs() 'download_path' => 'project_download_path', ]); - $job = $project->getReportFor(2023, 2); + $job = $project->getReportFor(new Carbon('2023-01-01')); $this->assertInstanceOf(ProjectReportGeneratorJob::class, $job); } @@ -198,15 +195,17 @@ public function when_getReport_is_called_it_returns_a_jobs() /** @test */ public function it_can_create_a_chain_of_batches_that_result_in_a_report() { + /* @var Project $project*/ $project = Project::create([ 'name' => 'project_name', 'download_path' => 'project_download_path', ]); Bus::fake(); - $project->scheduleReport(2023, 50); + $project->scheduleReport(new Carbon('2023-01-01'),7); Bus::assertChained([ Bus::chainedBatch(function (PendingBatch $batch) { + $batch; return $batch->jobs->count() === 28; }), Bus::chainedBatch(function (PendingBatch $batch) { From ecc1a9a47bad5068a4c52e9ebe57fd944dee55f7 Mon Sep 17 00:00:00 2001 From: guillaume91 Date: Wed, 19 Jun 2024 14:10:32 +0200 Subject: [PATCH 09/15] [Done] Updated classes with a range instead of week - year --- .../app/Livewire/Projects/Tabs/Mosaic.php | 38 +++++++++---------- laravel_app/app/Models/ProjectMosaic.php | 3 +- .../app/Rules/AllMosaicsPresentRule.php | 3 +- .../components/mosaic-create-modal.blade.php | 12 +++--- .../livewire/projects/tabs/mosaic.blade.php | 19 ++++++++-- 5 files changed, 43 insertions(+), 32 deletions(-) diff --git a/laravel_app/app/Livewire/Projects/Tabs/Mosaic.php b/laravel_app/app/Livewire/Projects/Tabs/Mosaic.php index b4b56df..a0cfd65 100644 --- a/laravel_app/app/Livewire/Projects/Tabs/Mosaic.php +++ b/laravel_app/app/Livewire/Projects/Tabs/Mosaic.php @@ -4,6 +4,7 @@ use App\Jobs\ProjectMosiacGeneratorJob; use App\Models\Project; +use Carbon\Carbon; use Livewire\Component; use Livewire\WithPagination; @@ -14,8 +15,8 @@ class Mosaic extends Component public Project $project; public $formData = [ - 'week' => '', - 'year' => '', + 'end_date' => '', + 'offset' => '7', ]; public $showCreateModal = false; @@ -27,18 +28,19 @@ class Mosaic extends Component public function mount(Project $project) { $this->path = $project->download_path; + $this->formData['end_date'] = Carbon::yesterday()->toDateString(); } public function saveMosaic() { $this->validate([ - 'formData.year' => 'required', - 'formData.week' => 'required', + 'formData.end_date' => ['required','date','before:today'], + 'formData.offset' => 'required|integer|min:1|max:1000', ]); $mosaic = $this->project->mosaics()->updateOrCreate([ - 'name' => sprintf('Week %s, %s', $this->formData['week'], $this->formData['year']), - 'year' => $this->formData['year'], - 'week' => $this->formData['week'], + 'name' => sprintf('', $this->formData['end_date'], $this->formData['offset']), + 'offset' => $this->formData['offset'], + 'end_date' => $this->formData['end_date'], ], [ 'path' => $this->project->getMosaicPath(), ]); @@ -55,24 +57,20 @@ public function openCreateMosiacsModal() public function getDateRangeProperty() { - if (empty($this->formData['week']) || strlen($this->formData['year']) !== 4) { - return 'Invalid week or year'; + if (!$this->formData['end_date'] || !$this->formData['offset']) { + return 'Please give a correct date or offset'; } - $begin = now() - ->setISODate($this->formData['year'], $this->formData['week']) - ->startOfWeek(); - $end = now() - ->setISODate($this->formData['year'], $this->formData['week']) - ->endOfWeek(); - return $begin->format('Y-m-d').' - '.$end->format('Y-m-d'); + $start = (new Carbon($this->formData['end_date']))->subDays($this->formData['offset']-1); + $end = new Carbon($this->formData['end_date']); + return 'from '.$start->format('Y-m-d').' to '.$end->format('Y-m-d'); } private function applySearch($query) { return $query->when($this->search !== '', function ($q){ $q->where('name', 'like', '%'.$this->search.'%') - ->orWhere('year', 'like', '%' . $this->search . '%') - ->orWhere('week', 'like', '%' . $this->search . '%'); + ->orWhere('offset', 'like', '%' . $this->search . '%') + ->orWhere('end_date', 'like', '%' . $this->search . '%'); }); } @@ -86,8 +84,8 @@ public function update($property) public function render() { $query = $this->project->mosaics() - ->orderBy('year', 'desc') - ->orderBy('week', 'desc'); + ->orderBy('offset', 'desc') + ->orderBy('end_date', 'desc'); $query = $this->applySearch($query); $mosaics = $query->paginate(10, pageName: 'mosaicPage'); diff --git a/laravel_app/app/Models/ProjectMosaic.php b/laravel_app/app/Models/ProjectMosaic.php index 8398811..3c100b9 100644 --- a/laravel_app/app/Models/ProjectMosaic.php +++ b/laravel_app/app/Models/ProjectMosaic.php @@ -22,13 +22,14 @@ class ProjectMosaic extends Model 'week', 'year', 'end_date', + 'offset', 'status' ]; public static function getFilenameByPeriod(Carbon $endDate,int $offset) { - return sprintf('period_%s_%s.tif',(clone $endDate)->subdays($offset-1)->format('Y-m-d'),$endDate->format('Y-m-d')); + return sprintf('period_%s_%s.tif',(clone $endDate)->subdays($offset)->format('Y-m-d'),$endDate->format('Y-m-d')); } public function project() diff --git a/laravel_app/app/Rules/AllMosaicsPresentRule.php b/laravel_app/app/Rules/AllMosaicsPresentRule.php index f70c6cf..7a7e3d0 100644 --- a/laravel_app/app/Rules/AllMosaicsPresentRule.php +++ b/laravel_app/app/Rules/AllMosaicsPresentRule.php @@ -28,7 +28,8 @@ public function passes($attribute, $value) } return $project->allMosaicsPresent( - ProjectReport::getReportDateForYearAndWeek($project, $value['year'], $value['week']) + // TODO change with end_date. + $value['end_date'] ); } catch (\Exception $e) { $this->errorMessage = $e->getMessage(); diff --git a/laravel_app/resources/views/components/mosaic-create-modal.blade.php b/laravel_app/resources/views/components/mosaic-create-modal.blade.php index fd318e5..3de1e8a 100644 --- a/laravel_app/resources/views/components/mosaic-create-modal.blade.php +++ b/laravel_app/resources/views/components/mosaic-create-modal.blade.php @@ -17,13 +17,13 @@
- - - + + +
- - - + + +
diff --git a/laravel_app/resources/views/livewire/projects/tabs/mosaic.blade.php b/laravel_app/resources/views/livewire/projects/tabs/mosaic.blade.php index 422aa52..47a205b 100644 --- a/laravel_app/resources/views/livewire/projects/tabs/mosaic.blade.php +++ b/laravel_app/resources/views/livewire/projects/tabs/mosaic.blade.php @@ -22,10 +22,16 @@ class="justify-center rounded-md bg-indigo-600 px-3 py-2 text-sm font-semibold t - Name + {{__('Name')}} - Year-Week + {{__('Start')}} + + + {{__('End')}} + + + {{__('Range (days)')}} @@ -38,7 +44,13 @@ class="px-3 py-3.5 text-right text-sm font-semibold text-gray-900 sm:pr-8 lg:pr- {{ $mosaic->name }} - {{ $mosaic->year }}-{{ $mosaic->week}} + {{ $mosaic->end_date->copy()->subDays($mosaic->offset)->format('Y-m-d') }} + + + {{ $mosaic->end_date->format('Y-m-d') }} + + + {{ $mosaic->offset }} @@ -52,7 +64,6 @@ class="px-3 py-3.5 text-right text-sm font-semibold text-gray-900 sm:pr-8 lg:pr-
Results: {{ \Illuminate\Support\Number::format($mosaics->total()) }}
- {{ $mosaics->links('livewire.pagination') }}
From 9e5eda027752fea91925e9542ede38d337755a1e Mon Sep 17 00:00:00 2001 From: guillaume91 Date: Wed, 19 Jun 2024 14:21:28 +0200 Subject: [PATCH 10/15] [fix] Mosaic name was not set in db. --- laravel_app/app/Livewire/Projects/Tabs/Mosaic.php | 3 ++- laravel_app/app/Models/ProjectMosaic.php | 5 +++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/laravel_app/app/Livewire/Projects/Tabs/Mosaic.php b/laravel_app/app/Livewire/Projects/Tabs/Mosaic.php index a0cfd65..1b6cfc1 100644 --- a/laravel_app/app/Livewire/Projects/Tabs/Mosaic.php +++ b/laravel_app/app/Livewire/Projects/Tabs/Mosaic.php @@ -4,6 +4,7 @@ use App\Jobs\ProjectMosiacGeneratorJob; use App\Models\Project; +use App\Models\ProjectMosaic; use Carbon\Carbon; use Livewire\Component; use Livewire\WithPagination; @@ -38,7 +39,7 @@ public function saveMosaic() ]); $mosaic = $this->project->mosaics()->updateOrCreate([ - 'name' => sprintf('', $this->formData['end_date'], $this->formData['offset']), + 'name' => ProjectMosaic::projectMosaicNameFormat(new Carbon($this->formData['end_date']),(int) $this->formData['offset']), 'offset' => $this->formData['offset'], 'end_date' => $this->formData['end_date'], ], [ diff --git a/laravel_app/app/Models/ProjectMosaic.php b/laravel_app/app/Models/ProjectMosaic.php index 3c100b9..db2298f 100644 --- a/laravel_app/app/Models/ProjectMosaic.php +++ b/laravel_app/app/Models/ProjectMosaic.php @@ -32,6 +32,11 @@ public static function getFilenameByPeriod(Carbon $endDate,int $offset) return sprintf('period_%s_%s.tif',(clone $endDate)->subdays($offset)->format('Y-m-d'),$endDate->format('Y-m-d')); } + public static function projectMosaicNameFormat(Carbon $endDate,int $offset):string + { + return 'Period '.$endDate->copy()->subDays($offset)->toDateString().' - '.$endDate->toDateString(); + } + public function project() { return $this->belongsTo(Project::class); From 0c1b247154aeb0bf19844438419d502a970ceae6 Mon Sep 17 00:00:00 2001 From: guillaume91 Date: Wed, 19 Jun 2024 15:49:52 +0200 Subject: [PATCH 11/15] Added Geographic icons with font-gis --- laravel_app/package-lock.json | 69 ++++++++++++++++++++++++++ laravel_app/package.json | 1 + laravel_app/public/build/manifest.json | 22 +++++++- laravel_app/resources/css/app.css | 1 + 4 files changed, 92 insertions(+), 1 deletion(-) diff --git a/laravel_app/package-lock.json b/laravel_app/package-lock.json index 998aab3..031a168 100644 --- a/laravel_app/package-lock.json +++ b/laravel_app/package-lock.json @@ -15,6 +15,7 @@ "@tailwindcss/aspect-ratio": "^0.4.2", "alpinejs": "^3.13.3", "flatpickr": "^4.6.13", + "font-gis": "^1.0.5", "leaflet": "^1.9.4", "tailwindcss": "^3.3.3" }, @@ -972,6 +973,14 @@ } } }, + "node_modules/font-gis": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/font-gis/-/font-gis-1.0.5.tgz", + "integrity": "sha512-f3DRjxYydpH1ZhmXeFaOgOEYm8Y0UOrrkPCAr+Aqomd0x/iBSqXWvwMwKIrCgWAQuH5cSbD1wCN1OKg0nDuh0w==", + "dependencies": { + "vinyl-paths": "^3.0.1" + } + }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -1533,6 +1542,19 @@ "pify": "^2.3.0" } }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -1607,6 +1629,25 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/source-map-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", @@ -1615,6 +1656,14 @@ "node": ">=0.10.0" } }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/sucrase": { "version": "3.34.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", @@ -1707,6 +1756,15 @@ "node": ">=0.8" } }, + "node_modules/through2": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", + "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "2 || 3" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -1764,6 +1822,17 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, + "node_modules/vinyl-paths": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/vinyl-paths/-/vinyl-paths-3.0.1.tgz", + "integrity": "sha512-fpjimhur1emSbJSvy5dJjDklCFEh2LvQRSHPzMQlYFjPrdFMHAyzSe1fiLzykoqg9X2tqH8evhsOUDNT55a0sw==", + "dependencies": { + "through2": "^3.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/vite": { "version": "4.4.11", "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.11.tgz", diff --git a/laravel_app/package.json b/laravel_app/package.json index 3197909..dc525ca 100644 --- a/laravel_app/package.json +++ b/laravel_app/package.json @@ -29,6 +29,7 @@ "@tailwindcss/aspect-ratio": "^0.4.2", "alpinejs": "^3.13.3", "flatpickr": "^4.6.13", + "font-gis": "^1.0.5", "leaflet": "^1.9.4", "tailwindcss": "^3.3.3" } diff --git a/laravel_app/public/build/manifest.json b/laravel_app/public/build/manifest.json index 32752e5..9580c0b 100644 --- a/laravel_app/public/build/manifest.json +++ b/laravel_app/public/build/manifest.json @@ -31,6 +31,26 @@ "file": "assets/fa-v4compatibility-c7a869fa.woff2", "src": "node_modules/@fortawesome/fontawesome-free/webfonts/fa-v4compatibility.woff2" }, + "node_modules/font-gis/fonts/font-gis.eot": { + "file": "assets/font-gis-610051e8.eot", + "src": "node_modules/font-gis/fonts/font-gis.eot" + }, + "node_modules/font-gis/fonts/font-gis.svg": { + "file": "assets/font-gis-53ba1b01.svg", + "src": "node_modules/font-gis/fonts/font-gis.svg" + }, + "node_modules/font-gis/fonts/font-gis.ttf": { + "file": "assets/font-gis-6f1751d4.ttf", + "src": "node_modules/font-gis/fonts/font-gis.ttf" + }, + "node_modules/font-gis/fonts/font-gis.woff": { + "file": "assets/font-gis-602a6e7d.woff", + "src": "node_modules/font-gis/fonts/font-gis.woff" + }, + "node_modules/font-gis/fonts/font-gis.woff2": { + "file": "assets/font-gis-ddd2dfd2.woff2", + "src": "node_modules/font-gis/fonts/font-gis.woff2" + }, "node_modules/leaflet/dist/images/layers-2x.png": { "file": "assets/layers-2x-066daca8.png", "src": "node_modules/leaflet/dist/images/layers-2x.png" @@ -44,7 +64,7 @@ "src": "node_modules/leaflet/dist/images/marker-icon.png" }, "resources/css/app.css": { - "file": "assets/app-8a7f891e.css", + "file": "assets/app-95381d80.css", "isEntry": true, "src": "resources/css/app.css" }, diff --git a/laravel_app/resources/css/app.css b/laravel_app/resources/css/app.css index c909f99..dd5aebf 100644 --- a/laravel_app/resources/css/app.css +++ b/laravel_app/resources/css/app.css @@ -3,6 +3,7 @@ @import '@fortawesome/fontawesome-free/css/all.css'; @import "@dasundev/livewire-dropzone-styles"; @import "leaflet/dist/leaflet.css"; +@import 'font-gis/css/font-gis.css'; @tailwind base; @tailwind components; @tailwind utilities; From 64fcacb013c7d0860cecb248edc45799cac40fea Mon Sep 17 00:00:00 2001 From: guillaume91 Date: Wed, 19 Jun 2024 15:51:46 +0200 Subject: [PATCH 12/15] [Done] Same changements as with the mosaic, use a range now. --- .../app/Jobs/ProjectReportGeneratorJob.php | 2 +- .../app/Livewire/Projects/Tabs/Report.php | 50 +++++++------- laravel_app/app/Models/ProjectReport.php | 28 +++----- .../report-manager-properties-modal.blade.php | 12 ++-- .../livewire/projects/tabs/report.blade.php | 1 + .../tests/Unit/Models/ProjectReportTest.php | 68 +++++++++---------- 6 files changed, 80 insertions(+), 81 deletions(-) diff --git a/laravel_app/app/Jobs/ProjectReportGeneratorJob.php b/laravel_app/app/Jobs/ProjectReportGeneratorJob.php index e297a93..731ff88 100644 --- a/laravel_app/app/Jobs/ProjectReportGeneratorJob.php +++ b/laravel_app/app/Jobs/ProjectReportGeneratorJob.php @@ -36,7 +36,7 @@ public function __construct(ProjectReport $projectReport, $sendMail = false) public function handle() { // TODO check the changements due to migration - $this->projectReport->weeksAgo(); + //$this->projectReport->weeksAgo(); $projectFolder = base_path('../'); diff --git a/laravel_app/app/Livewire/Projects/Tabs/Report.php b/laravel_app/app/Livewire/Projects/Tabs/Report.php index eec0786..907563f 100644 --- a/laravel_app/app/Livewire/Projects/Tabs/Report.php +++ b/laravel_app/app/Livewire/Projects/Tabs/Report.php @@ -6,6 +6,7 @@ use App\Models\Project; use App\Models\ProjectReport; use App\Rules\AllMosaicsPresentRule; +use Carbon\Carbon; use Livewire\Attributes\Reactive; use Livewire\Component; use Livewire\WithPagination; @@ -14,7 +15,10 @@ class Report extends Component { use WithPagination; - public $formData = []; + public $formData = [ + 'end_date' => '', + 'offset' => 7 + ]; public Project $project; public $search = ""; @@ -22,6 +26,11 @@ class Report extends Component public $showReportModal = false; + public function mount() + { + $this->formData['end_date'] = Carbon::yesterday()->toDateString(); + } + public function openCreateReportModal() { $this->resetFormData(); @@ -29,24 +38,24 @@ public function openCreateReportModal() } private function resetFormData() { - $this->formData['week'] = now()->weekOfYear; - $this->formData['year'] = now()->year; + $this->formData['end_date'] = Carbon::yesterday()->toDateString(); + $this->formData['offset'] = 7; } public function saveProjectReport() { $this->validate([ - 'formData.week' => ['required', 'integer', 'min:1', 'max:53'], - 'formData.year' => 'required|integer|min:2020|max:'.now()->addYear()->year, + 'formData.end_date' => ['required','date','before:today'], + 'formData.offset' => 'required|integer|min:1|max:1000', 'formData' => [new AllMosaicsPresentRule($this->project->id)], ]); $newReport = Project::find($this->project->id) ->reports()->create([ - 'name' => 'Report for week '.$this->formData['week'].' of '.$this->formData['year'], - 'week' => $this->formData['week'], - 'year' => $this->formData['year'], - 'path' => 'reports/week_'.$this->formData['week'].'_'.$this->formData['year'].'.docx', + 'name' => ProjectReport::projectReportNameFormat(new Carbon($this->formData['end_date']),(int) $this->formData['offset']), + 'end_date' => $this->formData['end_date'], + 'offset' => $this->formData['offset'], + 'path' => 'reports/'.ProjectReport::getFileName($this->formData['end_date'],$this->formData['offset']).'.docx', ]); ProjectReportGeneratorJob::dispatch($newReport); @@ -58,17 +67,12 @@ public function saveProjectReport() public function getDateRangeProperty() { - if (empty($this->formData['week']) || strlen($this->formData['year']) !== 4) { - return 'Invalid week or year'; + if (!$this->formData['end_date'] || !$this->formData['offset']) { + return 'Please give a correct date or offset'; } - // @TODO dit moet gecorrigeerd voor de project settings; - $begin = now() - ->setISODate($this->formData['year'], $this->formData['week']) - ->startOfWeek(); - $end = now() - ->setISODate($this->formData['year'], $this->formData['week']) - ->endOfWeek(); - return $begin->format('Y-m-d').' - '.$end->format('Y-m-d'); + $start = (new Carbon($this->formData['end_date']))->subDays($this->formData['offset']-1); + $end = new Carbon($this->formData['end_date']); + return 'from '.$start->format('Y-m-d').' to '.$end->format('Y-m-d'); } public function deleteReport(ProjectReport $report) @@ -81,8 +85,8 @@ private function applySearch($query) { return $query->when($this->search !== '', function ($q){ $q->where('name', 'like', '%'.$this->search.'%') - ->orWhere('year', 'like', '%'.$this->search.'%') - ->orWhere('week', 'like', '%'.$this->search.'%'); + ->orWhere('end_date', 'like', '%'.$this->search.'%') + ->orWhere('offset', 'like', '%'.$this->search.'%'); }); } @@ -92,8 +96,8 @@ public function render() $query = Project::find($this->project->id) ->reports() ->with('project') - ->orderBy('year', 'desc') - ->orderBy('week', 'desc'); + ->orderBy('end_date', 'desc') + ->orderBy('offset', 'desc'); $query = $this->applySearch($query); $reports = $query->paginate(10, pageName: 'reportPage'); diff --git a/laravel_app/app/Models/ProjectReport.php b/laravel_app/app/Models/ProjectReport.php index 5aeb0f4..1292268 100644 --- a/laravel_app/app/Models/ProjectReport.php +++ b/laravel_app/app/Models/ProjectReport.php @@ -3,12 +3,8 @@ namespace App\Models; use App\Events\ProjectReportStatus; -use App\Jobs\ProjectDownloadTiffJob; -use App\Jobs\ProjectMosiacGeneratorJob; use App\Traits\HasStatus; use Carbon\Carbon; -use Carbon\CarbonPeriod; -use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Facades\File; @@ -16,38 +12,36 @@ class ProjectReport extends Model { use HasStatus; protected $casts = [ 'end_date' => 'datetime']; - protected $fillable = ['name', 'path', 'week', 'year','status', 'end_date']; - - - + protected $fillable = ['name', 'path', 'week', 'year','status', 'end_date','offset']; public function project() { return $this->belongsTo(Project::class); } - public function getFileNameAttribute() + public function getFileNameAttribute(): string { return static::getFileName($this->end_date,$this->offset); } public static function getFileName(Carbon $endDate, int $offset): string { - return 'period_'.$endDate->copy()->subDays($offset).'_'.$endDate; -} + return 'period_'.$endDate->copy()->subDays($offset).'_'.$endDate; + } + + public static function projectReportNameFormat(Carbon $endDate,int $offset):string + { + return 'Report from '.$endDate->copy()->subDays($offset)->toDateString().' to '.$endDate->toDateString(); + } public function getFullPathName() { return storage_path('app/'.$this->project->download_path.'/'.$this->path); } - public function getReportDate() + public function getReportDate():string { // TODO remove year and week - return self::getReportDateForYearAndWeek( - $this->project, - $this->year, - $this->week - )->toDateString(); + return $this->end_date->format('Y-m-d'); } public static function getReportDateForYearAndWeek(Project $project, $year, $week) diff --git a/laravel_app/resources/views/components/report-manager-properties-modal.blade.php b/laravel_app/resources/views/components/report-manager-properties-modal.blade.php index e58283d..0dc619b 100644 --- a/laravel_app/resources/views/components/report-manager-properties-modal.blade.php +++ b/laravel_app/resources/views/components/report-manager-properties-modal.blade.php @@ -16,13 +16,13 @@
- - - + + +
- - - + + +
diff --git a/laravel_app/resources/views/livewire/projects/tabs/report.blade.php b/laravel_app/resources/views/livewire/projects/tabs/report.blade.php index 7720189..458e042 100644 --- a/laravel_app/resources/views/livewire/projects/tabs/report.blade.php +++ b/laravel_app/resources/views/livewire/projects/tabs/report.blade.php @@ -52,6 +52,7 @@ class="py-3.5 pl-4 pr-3 text-left text-sm font-semibold text-gray-900 sm:pl-6 lg
+ diff --git a/laravel_app/tests/Unit/Models/ProjectReportTest.php b/laravel_app/tests/Unit/Models/ProjectReportTest.php index 8088b04..2c2c57a 100644 --- a/laravel_app/tests/Unit/Models/ProjectReportTest.php +++ b/laravel_app/tests/Unit/Models/ProjectReportTest.php @@ -21,28 +21,28 @@ protected function setUp(): void parent::setUp(); // TODO: Change the autogenerated stub } - /** - * @test - * @dataProvider weeksAgoProvider - */ - public function it_can_calculatore_weeksAgo($year, $week, $expected) - { - Carbon::setTestNow(Carbon::now()->setISODate('2021', '41')); - $projectReport = ProjectReport::make([ - 'year' => $year, - 'week' => $week, - ]); - $this->assertEquals($expected, $projectReport->weeksAgo()); - } - - public static function weeksAgoProvider() - { - return [ - '1 week ago' => [2021, 40, 1], - '2 weeks ago' => [2021, 39, 2], - '3 weeks ago' => [2021, 38, 3], - ]; - } +// /** +// * @test +// * @dataProvider weeksAgoProvider +// */ +// public function it_can_calculatore_weeksAgo($endDate, $offset, $expected) +// { +// Carbon::setTestNow(Carbon::now()->setISODate('2021', '41')); +// $projectReport = ProjectReport::make([ +// 'end_date' => $endDate, +// 'offset' => $offset, +// ]); +// $this->assertEquals($expected, $projectReport->weeksAgo()); +// } +// +// public static function weeksAgoProvider() +// { +// return [ +// '1 week ago' => [2021, 40, 1], +// '2 weeks ago' => [2021, 39, 2], +// '3 weeks ago' => [2021, 38, 3], +// ]; +// } /** * @test @@ -55,8 +55,8 @@ public function it_can_get_the_full_path_name() ]); $projectReport = $project->reports()->create([ 'name' => 'name', - 'year' => 2021, - 'week' => 41, + 'end_date' => new Carbon('2021-01-01'), + 'offset' => 10, 'path' => 'path/doc.pdf', ]); $projectReport->setStatusSuccess(); @@ -67,7 +67,7 @@ public function it_can_get_the_full_path_name() * @test * @dataProvider reportDateProvider */ - public function it_can_return_the_reportDate($expected, $mail_day, $week, $year) + public function it_can_return_the_reportDate($expected, $mail_day, $endDate, $offset) { $project = Project::create([ 'name' => 'project_name', @@ -76,8 +76,8 @@ public function it_can_return_the_reportDate($expected, $mail_day, $week, $year) ]); $projectReport = $project->reports()->create([ 'name' => 'name', - 'year' => $year, - 'week' => $week, + 'end_date' => $endDate, + 'offset' => $offset, 'path' => 'path/doc.pdf', ]); $projectReport->setStatusSuccess(); @@ -88,13 +88,13 @@ public function it_can_return_the_reportDate($expected, $mail_day, $week, $year) public static function reportDateProvider() { return [ - 'monday' => ['2023-12-10', 'monday', 50, 2023], - 'tuesday' => ['2023-12-11', 'tuesday', 50, 2023], - 'wednesday' => ['2023-12-12', 'wednesday', 50, 2023], - 'thursday' => ['2023-12-13', 'thursday', 50, 2023], - 'friday' => ['2023-12-14', 'friday', 50, 2023], - 'saturday' => ['2023-12-15', 'saturday', 50, 2023], - 'sunday' => ['2023-12-16', 'sunday', 50, 2023], + 'monday' => ['2023-12-10', 'monday',new Carbon('2023-12-10'),10 ], + 'tuesday' => ['2023-12-11', 'tuesday',new Carbon('2023-12-11'),10 ], + 'wednesday' => ['2023-12-12', 'wednesday',new Carbon('2023-12-12'),10 ], + 'thursday' => ['2023-12-13', 'thursday',new Carbon('2023-12-13'),10 ], + 'friday' => ['2023-12-14', 'friday',new Carbon('2023-12-14'),10 ], + 'saturday' => ['2023-12-15', 'saturday',new Carbon('2023-12-15'),10 ], + 'sunday' => ['2023-12-16', 'sunday',new Carbon('2023-12-16'),10 ], ]; } From 85ee4724ee4b15b06f77db4f6f644e2ff0a69a44 Mon Sep 17 00:00:00 2001 From: guillaume91 Date: Wed, 19 Jun 2024 15:52:10 +0200 Subject: [PATCH 13/15] wip process --- .../app/Jobs/ProjectMosiacGeneratorJob.php | 49 +++++++++++++++---- .../app/Rules/AllMosaicsPresentRule.php | 6 +-- 2 files changed, 42 insertions(+), 13 deletions(-) diff --git a/laravel_app/app/Jobs/ProjectMosiacGeneratorJob.php b/laravel_app/app/Jobs/ProjectMosiacGeneratorJob.php index 0b1507b..26a15ce 100644 --- a/laravel_app/app/Jobs/ProjectMosiacGeneratorJob.php +++ b/laravel_app/app/Jobs/ProjectMosiacGeneratorJob.php @@ -2,22 +2,19 @@ namespace App\Jobs; -use App\Enums\Status; -use App\Livewire\Projects\Tabs\Mosaic; use App\Models\Project; -use App\Models\ProjectDownload; use App\Models\ProjectMosaic; -use App\Models\ProjectReport; use Carbon\Carbon; use Illuminate\Bus\Batchable; use Illuminate\Bus\Queueable; -use Illuminate\Contracts\Queue\ShouldBeUnique; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Process\Exceptions\ProcessFailedException; +use Illuminate\Process\Exceptions\ProcessTimedOutException; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels; use Symfony\Component\Process\Process; +use Illuminate\Support\Facades\Process as ProcessNew; /** * @@ -41,9 +38,9 @@ public function __construct(ProjectMosaic $mosaic) /** * Execute the job. */ - public function handle(): void + public function handleNew(): void { - $weeksAgo = ProjectReport::weeksAgoForYearAndWeek($this->mosaic->year, $this->mosaic->week); + //$weeksAgo = ProjectReport::weeksAgoForYearAndWeek($this->mosaic->year, $this->mosaic->week); //TODO change to end_date and offset @@ -51,7 +48,8 @@ public function handle(): void $command = [ sprintf('%sbuild_mosaic.sh', $projectFolder), - sprintf('--weeks_ago=%s', $weeksAgo), + sprintf('--end_date=%s', $this->mosaic->end_date), + sprintf('--offset=%s', $this->mosaic->offset), sprintf('--data_dir=%s', $this->mosaic->project->download_path), ]; @@ -62,7 +60,6 @@ public function handle(): void $process->setEnv(['PATH' => $currentPath.':/usr/local/Cellar/pandoc/3.1.8/bin/pandoc']); // $process->setTimeout(36000); // stel een geschikte timeout in $process->start(); - try { $myOutput = []; $process->wait(function ($type, $buffer) use (&$myOutput) { @@ -80,6 +77,40 @@ public function handle(): void } } + /** + * Execute the job. + */ + public function handle(): void + { + //$weeksAgo = ProjectReport::weeksAgoForYearAndWeek($this->mosaic->year, $this->mosaic->week); + + + $projectFolder = base_path('../'); + + $command = [ + sprintf('%sbuild_mosaic.sh', $projectFolder), + sprintf('--end_date=%s', $this->mosaic->end_date), + sprintf('--offset=%s', $this->mosaic->offset), + sprintf('--data_dir=%s', $this->mosaic->project->download_path), + ]; + $currentPath = '/usr/bin:/usr/gnu/bin:/usr/local/bin:/bin:/usr/bin/Users/mfolkerts/anaconda3/bin:/Library/Apple/usr/bin'; + + try{ + $process = ProcessNew::timeout(220) + ->env(['PATH' => $currentPath . ':/usr/local/Cellar/pandoc/3.1.8/bin/pandoc']) + ->start($command, function (string $type, string $output ) { + logger($output); + }); + $results = $process->wait(); + if($results->successful()){ + $this->mosaic->setStatusSuccess(); + } + }catch(\RuntimeException|ProcessTimedOutException|ProcessFailedException $e){ + echo $e->getMessage(); + $this->mosaic->setStatusFailed(); + } + } + // public static function handleFor(Project $project, $year, $startWeekNumber) // { // logger("ProjectMosiacGeneratorJob::handleFor(week $startWeekNumber, year $year)"); diff --git a/laravel_app/app/Rules/AllMosaicsPresentRule.php b/laravel_app/app/Rules/AllMosaicsPresentRule.php index 7a7e3d0..efbfa3f 100644 --- a/laravel_app/app/Rules/AllMosaicsPresentRule.php +++ b/laravel_app/app/Rules/AllMosaicsPresentRule.php @@ -5,6 +5,7 @@ use Illuminate\Contracts\Validation\Rule; use App\Models\Project; use App\Models\ProjectReport; +use Carbon\Carbon; class AllMosaicsPresentRule implements Rule { @@ -27,10 +28,7 @@ public function passes($attribute, $value) return false; } - return $project->allMosaicsPresent( - // TODO change with end_date. - $value['end_date'] - ); + return $project->allMosaicsPresent(new Carbon($value['end_date'])); } catch (\Exception $e) { $this->errorMessage = $e->getMessage(); return false; From c8f79846b4aa75100b46b0af035ccf59406a614f Mon Sep 17 00:00:00 2001 From: guillaume91 Date: Wed, 19 Jun 2024 15:53:32 +0200 Subject: [PATCH 14/15] Revert "Added Geographic icons with font-gis" This reverts commit 6e7abd90107de62090075d8df1410c88394ae2f5. --- laravel_app/package-lock.json | 69 -------------------------- laravel_app/package.json | 1 - laravel_app/public/build/manifest.json | 22 +------- laravel_app/resources/css/app.css | 1 - 4 files changed, 1 insertion(+), 92 deletions(-) diff --git a/laravel_app/package-lock.json b/laravel_app/package-lock.json index 031a168..998aab3 100644 --- a/laravel_app/package-lock.json +++ b/laravel_app/package-lock.json @@ -15,7 +15,6 @@ "@tailwindcss/aspect-ratio": "^0.4.2", "alpinejs": "^3.13.3", "flatpickr": "^4.6.13", - "font-gis": "^1.0.5", "leaflet": "^1.9.4", "tailwindcss": "^3.3.3" }, @@ -973,14 +972,6 @@ } } }, - "node_modules/font-gis": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/font-gis/-/font-gis-1.0.5.tgz", - "integrity": "sha512-f3DRjxYydpH1ZhmXeFaOgOEYm8Y0UOrrkPCAr+Aqomd0x/iBSqXWvwMwKIrCgWAQuH5cSbD1wCN1OKg0nDuh0w==", - "dependencies": { - "vinyl-paths": "^3.0.1" - } - }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -1542,19 +1533,6 @@ "pify": "^2.3.0" } }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -1629,25 +1607,6 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/source-map-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", @@ -1656,14 +1615,6 @@ "node": ">=0.10.0" } }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, "node_modules/sucrase": { "version": "3.34.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", @@ -1756,15 +1707,6 @@ "node": ">=0.8" } }, - "node_modules/through2": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", - "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "2 || 3" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -1822,17 +1764,6 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, - "node_modules/vinyl-paths": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/vinyl-paths/-/vinyl-paths-3.0.1.tgz", - "integrity": "sha512-fpjimhur1emSbJSvy5dJjDklCFEh2LvQRSHPzMQlYFjPrdFMHAyzSe1fiLzykoqg9X2tqH8evhsOUDNT55a0sw==", - "dependencies": { - "through2": "^3.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/vite": { "version": "4.4.11", "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.11.tgz", diff --git a/laravel_app/package.json b/laravel_app/package.json index dc525ca..3197909 100644 --- a/laravel_app/package.json +++ b/laravel_app/package.json @@ -29,7 +29,6 @@ "@tailwindcss/aspect-ratio": "^0.4.2", "alpinejs": "^3.13.3", "flatpickr": "^4.6.13", - "font-gis": "^1.0.5", "leaflet": "^1.9.4", "tailwindcss": "^3.3.3" } diff --git a/laravel_app/public/build/manifest.json b/laravel_app/public/build/manifest.json index 9580c0b..32752e5 100644 --- a/laravel_app/public/build/manifest.json +++ b/laravel_app/public/build/manifest.json @@ -31,26 +31,6 @@ "file": "assets/fa-v4compatibility-c7a869fa.woff2", "src": "node_modules/@fortawesome/fontawesome-free/webfonts/fa-v4compatibility.woff2" }, - "node_modules/font-gis/fonts/font-gis.eot": { - "file": "assets/font-gis-610051e8.eot", - "src": "node_modules/font-gis/fonts/font-gis.eot" - }, - "node_modules/font-gis/fonts/font-gis.svg": { - "file": "assets/font-gis-53ba1b01.svg", - "src": "node_modules/font-gis/fonts/font-gis.svg" - }, - "node_modules/font-gis/fonts/font-gis.ttf": { - "file": "assets/font-gis-6f1751d4.ttf", - "src": "node_modules/font-gis/fonts/font-gis.ttf" - }, - "node_modules/font-gis/fonts/font-gis.woff": { - "file": "assets/font-gis-602a6e7d.woff", - "src": "node_modules/font-gis/fonts/font-gis.woff" - }, - "node_modules/font-gis/fonts/font-gis.woff2": { - "file": "assets/font-gis-ddd2dfd2.woff2", - "src": "node_modules/font-gis/fonts/font-gis.woff2" - }, "node_modules/leaflet/dist/images/layers-2x.png": { "file": "assets/layers-2x-066daca8.png", "src": "node_modules/leaflet/dist/images/layers-2x.png" @@ -64,7 +44,7 @@ "src": "node_modules/leaflet/dist/images/marker-icon.png" }, "resources/css/app.css": { - "file": "assets/app-95381d80.css", + "file": "assets/app-8a7f891e.css", "isEntry": true, "src": "resources/css/app.css" }, diff --git a/laravel_app/resources/css/app.css b/laravel_app/resources/css/app.css index dd5aebf..c909f99 100644 --- a/laravel_app/resources/css/app.css +++ b/laravel_app/resources/css/app.css @@ -3,7 +3,6 @@ @import '@fortawesome/fontawesome-free/css/all.css'; @import "@dasundev/livewire-dropzone-styles"; @import "leaflet/dist/leaflet.css"; -@import 'font-gis/css/font-gis.css'; @tailwind base; @tailwind components; @tailwind utilities; From 69233b58fe1bbbef3aed99d9f8b3f8d02e658f7e Mon Sep 17 00:00:00 2001 From: guillaume91 Date: Thu, 20 Jun 2024 14:59:59 +0200 Subject: [PATCH 15/15] [done] Download button when the mosaics are missing in reports tab. --- .../app/Livewire/Projects/Tabs/Report.php | 10 ++++++++++ laravel_app/app/Models/Project.php | 19 +++++++++++-------- .../app/Rules/AllMosaicsPresentRule.php | 1 - .../report-manager-properties-modal.blade.php | 12 ++++++------ .../livewire/projects/report-row.blade.php | 5 ----- 5 files changed, 27 insertions(+), 20 deletions(-) diff --git a/laravel_app/app/Livewire/Projects/Tabs/Report.php b/laravel_app/app/Livewire/Projects/Tabs/Report.php index 907563f..3d20812 100644 --- a/laravel_app/app/Livewire/Projects/Tabs/Report.php +++ b/laravel_app/app/Livewire/Projects/Tabs/Report.php @@ -2,11 +2,14 @@ namespace App\Livewire\Projects\Tabs; +use App\Jobs\ProjectMosiacGeneratorJob; use App\Jobs\ProjectReportGeneratorJob; use App\Models\Project; +use App\Models\ProjectMosaic; use App\Models\ProjectReport; use App\Rules\AllMosaicsPresentRule; use Carbon\Carbon; +use Illuminate\Support\Str; use Livewire\Attributes\Reactive; use Livewire\Component; use Livewire\WithPagination; @@ -105,4 +108,11 @@ public function render() return view('livewire.projects.tabs.report') ->with(compact('reports')); } + + public function getMissingMosaicsInFileSystem(Carbon $endDate,int $offset = 7) + { + $this->project->getMosaicsFor($endDate,$offset); + return redirect()->route('project.show',[$this->project->name,'mosaics']); + + } } diff --git a/laravel_app/app/Models/Project.php b/laravel_app/app/Models/Project.php index 24ea500..8e3eb53 100644 --- a/laravel_app/app/Models/Project.php +++ b/laravel_app/app/Models/Project.php @@ -132,14 +132,7 @@ public function allMosaicsPresent(Carbon $endDate): bool if ($endDate->isFuture()) { throw new \Exception('Mosaic can\'t be generated for the future. Change the end date.'); } - - $mosaicsNotPresentInFilesystem = collect($this->getMosaicFilenameListByEndDate($endDate)) - ->filter(function ($filename) { - return !$this->getMosaicList()->contains(function ($mosaicFilename) use ($filename) { -// TODO check the value of the week leading 0 - return Str::endsWith($mosaicFilename, substr($filename, -16)); - }); - }); + $mosaicsNotPresentInFilesystem = $this->getMissingMosaicsInFileSystem($endDate); if ($mosaicsNotPresentInFilesystem->count() === 0) { return true; } @@ -150,6 +143,16 @@ public function allMosaicsPresent(Carbon $endDate): bool throw new \Exception($message); } + public function getMissingMosaicsInFileSystem(Carbon $endDate) + { + return collect($this->getMosaicFilenameListByEndDate($endDate)) + ->filter(function ($filename) { + return !$this->getMosaicList()->contains(function ($mosaicFilename) use ($filename) { + return Str::endsWith($mosaicFilename, substr($filename, -16)); + }); + }); + } + public static function getMosaicFilenameListByEndDate(Carbon $endDate, int $offset=7): \Generator { for ($i = 0; $i < 4; $i++) { diff --git a/laravel_app/app/Rules/AllMosaicsPresentRule.php b/laravel_app/app/Rules/AllMosaicsPresentRule.php index efbfa3f..be0e779 100644 --- a/laravel_app/app/Rules/AllMosaicsPresentRule.php +++ b/laravel_app/app/Rules/AllMosaicsPresentRule.php @@ -4,7 +4,6 @@ use Illuminate\Contracts\Validation\Rule; use App\Models\Project; -use App\Models\ProjectReport; use Carbon\Carbon; class AllMosaicsPresentRule implements Rule diff --git a/laravel_app/resources/views/components/report-manager-properties-modal.blade.php b/laravel_app/resources/views/components/report-manager-properties-modal.blade.php index 0dc619b..3fb323d 100644 --- a/laravel_app/resources/views/components/report-manager-properties-modal.blade.php +++ b/laravel_app/resources/views/components/report-manager-properties-modal.blade.php @@ -1,9 +1,3 @@ -@props([ - 'formData', - /** @var \App\Livewire\Projects\ProjectManager */ - 'reportManager' -]) - @@ -34,7 +28,13 @@ {{ __('Saved.') }} + @error('formData') + Download missing Mosaics + @enderror {{ $report->name }} -{{-- @if($report->status == \App\Enums\Status::Pending)--}} -{{-- --}} -{{-- @else--}} -{{-- --}} -{{-- @endif--}}