From eaaa83406d34f787e03fbce313ca071d6d389a10 Mon Sep 17 00:00:00 2001 From: Constantin Graf Date: Tue, 29 Oct 2024 18:04:46 +0100 Subject: [PATCH] Fixed timezones in detailed export reports --- .../Controllers/Api/V1/TimeEntryController.php | 6 ++++-- .../ReportExport/TimeEntriesDetailedCsvExport.php | 14 ++++++++++++-- .../ReportExport/TimeEntriesDetailedExport.php | 11 +++++++---- 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/app/Http/Controllers/Api/V1/TimeEntryController.php b/app/Http/Controllers/Api/V1/TimeEntryController.php index a109532c..6f83a782 100644 --- a/app/Http/Controllers/Api/V1/TimeEntryController.php +++ b/app/Http/Controllers/Api/V1/TimeEntryController.php @@ -177,6 +177,8 @@ class TimeEntryController extends Controller if ($format === ExportFormat::PDF && ! $this->canAccessPremiumFeatures($organization)) { throw new FeatureIsNotAvailableInFreePlanApiException; } + $user = $this->user(); + $timezone = $user->timezone; $timeEntriesQuery = $this->getTimeEntriesQuery($organization, $request, $member); $timeEntriesQuery->with([ @@ -190,7 +192,7 @@ class TimeEntryController extends Controller $folderPath = 'exports'; $path = $folderPath.'/'.$filename; if ($format === ExportFormat::CSV) { - $export = new TimeEntriesDetailedCsvExport(config('filesystems.private'), $folderPath, $filename, $timeEntriesQuery, 1000); + $export = new TimeEntriesDetailedCsvExport(config('filesystems.private'), $folderPath, $filename, $timeEntriesQuery, 1000, $timezone); $export->export(); } elseif ($format === ExportFormat::PDF) { if (config('services.gotenberg.url') === null) { @@ -224,7 +226,7 @@ class TimeEntryController extends Controller ->putFileAs($folderPath, new File($tempFolder->path($filenameTemp)), $filename); } else { Excel::store( - new TimeEntriesDetailedExport($timeEntriesQuery, $format), + new TimeEntriesDetailedExport($timeEntriesQuery, $format, $timezone), $path, config('filesystems.private'), $format->getExportPackageType(), diff --git a/app/Service/ReportExport/TimeEntriesDetailedCsvExport.php b/app/Service/ReportExport/TimeEntriesDetailedCsvExport.php index 5a9cdf14..8534d4c8 100644 --- a/app/Service/ReportExport/TimeEntriesDetailedCsvExport.php +++ b/app/Service/ReportExport/TimeEntriesDetailedCsvExport.php @@ -6,6 +6,7 @@ namespace App\Service\ReportExport; use App\Models\TimeEntry; use App\Service\IntervalService; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Model; /** @@ -29,6 +30,15 @@ class TimeEntriesDetailedCsvExport extends CsvExport protected const string CARBON_FORMAT = 'Y-m-d H:i:s'; + private string $timezone; + + public function __construct(string $disk, string $folderPath, string $filename, Builder $builder, int $chunk, string $timezone) + { + parent::__construct($disk, $folderPath, $filename, $builder, $chunk); + + $this->timezone = $timezone; + } + /** * @param TimeEntry $model */ @@ -43,8 +53,8 @@ class TimeEntriesDetailedCsvExport extends CsvExport 'Project' => $model->project?->name, 'Client' => $model->client?->name, 'User' => $model->user->name, - 'Start' => $model->start, - 'End' => $model->end, + 'Start' => $model->start->timezone($this->timezone), + 'End' => $model->end->timezone($this->timezone), 'Duration' => $duration !== null ? $interval->format($model->getDuration()) : null, 'Duration (decimal)' => $duration?->totalHours, 'Billable' => $model->billable ? 'Yes' : 'No', diff --git a/app/Service/ReportExport/TimeEntriesDetailedExport.php b/app/Service/ReportExport/TimeEntriesDetailedExport.php index 8126faed..77682244 100644 --- a/app/Service/ReportExport/TimeEntriesDetailedExport.php +++ b/app/Service/ReportExport/TimeEntriesDetailedExport.php @@ -35,13 +35,16 @@ class TimeEntriesDetailedExport implements FromQuery, ShouldAutoSize, WithColumn private ExportFormat $exportFormat; + private string $timezone; + /** * @param Builder $builder */ - public function __construct(Builder $builder, ExportFormat $exportFormat) + public function __construct(Builder $builder, ExportFormat $exportFormat, string $timezone) { $this->builder = $builder; $this->exportFormat = $exportFormat; + $this->timezone = $timezone; } /** @@ -121,7 +124,7 @@ class TimeEntriesDetailedExport implements FromQuery, ShouldAutoSize, WithColumn $model->client?->name, $model->user->name, Date::dateTimeToExcel($model->start), - $model->end !== null ? Date::dateTimeToExcel($model->end) : null, + $model->end !== null ? Date::dateTimeToExcel($model->end->timezone($this->timezone)) : null, $duration !== null ? $interval->format($duration) : null, $duration?->totalHours, $model->billable ? 'Yes' : 'No', @@ -134,8 +137,8 @@ class TimeEntriesDetailedExport implements FromQuery, ShouldAutoSize, WithColumn $model->project?->name, $model->client?->name, $model->user->name, - $model->start->format('Y-m-d H:i:s'), - $model->end?->format('Y-m-d H:i:s'), + $model->start->timezone($this->timezone)->format('Y-m-d H:i:s'), + $model->end?->timezone($this->timezone)?->format('Y-m-d H:i:s'), $duration !== null ? (int) floor($duration->totalHours).':'.$duration->format('%I:%S') : null, $duration?->totalHours, $model->billable ? 'Yes' : 'No',